mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-21 19:29:35 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2bd9d7845c | ||
|
|
5f196e1298 | ||
|
|
81312645f0 | ||
|
|
d768f89f52 | ||
|
|
b6f9d53a29 | ||
|
|
bf17450131 |
@@ -74,9 +74,6 @@ $config['tabs'] =
|
||||
],
|
||||
],
|
||||
],
|
||||
'hiddenFields' => [
|
||||
'uhrzeit'
|
||||
]
|
||||
],
|
||||
'exemptions' => [
|
||||
//if true, Anrechnungen can be added and edited in tab Anrechnungen
|
||||
|
||||
@@ -315,7 +315,6 @@ class Abschlusspruefung extends FHCAPI_Controller
|
||||
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
|
||||
'datum' => $formData['datum'], //TODO(Manu) check if minute format like FAS
|
||||
'sponsion' => $formData['sponsion'],
|
||||
'uhrzeit' => $formData['uhrzeit'],
|
||||
'pruefer1' => $formData['pruefer1'],
|
||||
'pruefer2' => $formData['pruefer2'],
|
||||
'pruefer3' => $formData['pruefer3'],
|
||||
@@ -388,7 +387,6 @@ class Abschlusspruefung extends FHCAPI_Controller
|
||||
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
|
||||
'datum' => $datum,
|
||||
'sponsion' => $sponsion,
|
||||
'uhrzeit' => $formData['uhrzeit'],
|
||||
'pruefer1' => $pruefer1,
|
||||
'pruefer2' => $pruefer2,
|
||||
'pruefer3' => $pruefer3,
|
||||
|
||||
@@ -184,17 +184,10 @@ class Grades extends FHCAPI_Controller
|
||||
{
|
||||
$this->load->library('form_validation');
|
||||
|
||||
// a Note without Punkte clears old Punkte, else Note and Punkte contradict
|
||||
$punkte = $this->input->post('punkte');
|
||||
if (!(defined('CIS_GESAMTNOTE_PUNKTE') && CIS_GESAMTNOTE_PUNKTE) || trim((string) $punkte) === '')
|
||||
$punkte = null;
|
||||
|
||||
$this->form_validation->set_rules("lehrveranstaltung_id", $this->p->t('lehre', 'lehrveranstaltung'), "required|integer");
|
||||
$this->form_validation->set_rules("student_uid", $this->p->t('person', 'student'), "required");
|
||||
$this->form_validation->set_rules("studiensemester_kurzbz", $this->p->t('lehre', 'studiensemester'), "required");
|
||||
// with Punkte the Notenschluessel gives the Note
|
||||
$this->form_validation->set_rules('note', $this->p->t('lehre', 'note'), $punkte === null ? 'required|numeric' : 'numeric');
|
||||
$this->form_validation->set_rules('punkte', $this->p->t('stv', 'grades_points'), 'numeric|greater_than_equal_to[0]|less_than[10000]');
|
||||
$this->form_validation->set_rules('note', $this->p->t('lehre', 'note'), 'required|numeric');
|
||||
|
||||
if (!$this->form_validation->run())
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
@@ -213,16 +206,6 @@ class Grades extends FHCAPI_Controller
|
||||
|
||||
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
|
||||
|
||||
// the Notenschluessel of the LV decides the Note for the Punkte
|
||||
if ($punkte !== null) {
|
||||
$this->load->model('education/Notenschluesselaufteilung_model', 'NotenschluesselaufteilungModel');
|
||||
$note = $this->getDataOrTerminateWithError(
|
||||
$this->NotenschluesselaufteilungModel->getNote($punkte, $lehrveranstaltung_id, $studiensemester_kurzbz)
|
||||
);
|
||||
if ($note === null)
|
||||
$this->terminateWithValidationErrors(['punkte' => $this->p->t('stv', 'grades_error_noGradeForPoints')]);
|
||||
}
|
||||
|
||||
$result = $this->ZeugnisnoteModel->load([
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'student_uid' => $student_uid,
|
||||
@@ -237,7 +220,6 @@ class Grades extends FHCAPI_Controller
|
||||
'lehrveranstaltung_id' => $lehrveranstaltung_id
|
||||
], [
|
||||
'note' => $note,
|
||||
'punkte' => $punkte,
|
||||
'benotungsdatum' => $now,
|
||||
'updateamum' => $now,
|
||||
'updatevon' => $authUID
|
||||
@@ -248,7 +230,6 @@ class Grades extends FHCAPI_Controller
|
||||
'student_uid' => $student_uid,
|
||||
'lehrveranstaltung_id' => $lehrveranstaltung_id,
|
||||
'note' => $note,
|
||||
'punkte' => $punkte,
|
||||
'benotungsdatum' => $now,
|
||||
'insertamum' => $now,
|
||||
'insertvon' => $authUID
|
||||
@@ -256,8 +237,7 @@ class Grades extends FHCAPI_Controller
|
||||
}
|
||||
$this->getDataOrTerminateWithError($result);
|
||||
|
||||
// the client shows the Note that the server saved
|
||||
$this->terminateWithSuccess(['note' => $note, 'punkte' => $punkte]);
|
||||
$this->terminateWithSuccess(true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -26,13 +26,8 @@ class Notenschluesselzuordnung_model extends DB_Model
|
||||
|
||||
$this->db->where("lehrveranstaltung_id", $lehrveranstaltung_id);
|
||||
if ($studiensemester_kurzbz) {
|
||||
// without the group the OR matches each row without a semester, of any LV
|
||||
$this->db->group_start();
|
||||
$this->db->where("studiensemester_kurzbz", $studiensemester_kurzbz);
|
||||
$this->db->or_where("studiensemester_kurzbz", null);
|
||||
$this->db->group_end();
|
||||
// the row of the semester before the row without a semester (NULLS LAST)
|
||||
$this->addOrder("studiensemester_kurzbz", "ASC");
|
||||
} else {
|
||||
$this->db->where("studiensemester_kurzbz", null);
|
||||
}
|
||||
@@ -70,12 +65,7 @@ class Notenschluesselzuordnung_model extends DB_Model
|
||||
$this->addLimit(1);
|
||||
|
||||
if ($studiensemester_kurzbz) {
|
||||
// IN ('X', NULL) never matches NULL
|
||||
$this->db->group_start();
|
||||
$this->db->where("studiensemester_kurzbz", $studiensemester_kurzbz);
|
||||
$this->db->or_where("studiensemester_kurzbz", null);
|
||||
$this->db->group_end();
|
||||
$this->addOrder("studiensemester_kurzbz", "ASC");
|
||||
$this->db->where_in("studiensemester_kurzbz", [$studiensemester_kurzbz, null]);
|
||||
$result = $this->load();
|
||||
} else {
|
||||
$result = $this->loadWhere([
|
||||
|
||||
@@ -52,7 +52,7 @@ export default {
|
||||
url: url
|
||||
};
|
||||
},
|
||||
updateCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note, punkte = null, lehrveranstaltung_bezeichnung}) {
|
||||
updateCertificate({lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note, lehrveranstaltung_bezeichnung}) {
|
||||
return {
|
||||
method: 'post',
|
||||
url: 'api/frontend/v1/stv/grades/updateCertificate',
|
||||
@@ -60,8 +60,7 @@ export default {
|
||||
lehrveranstaltung_id,
|
||||
student_uid,
|
||||
studiensemester_kurzbz,
|
||||
note,
|
||||
punkte
|
||||
note
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
@@ -22,7 +22,7 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
pickerWidgets() {
|
||||
return this.widgets.filter(widget => widget.allowed);
|
||||
return this.widgets.filter(widget => widget.allowed).map(widget => ({ ...widget, permitted: true }));
|
||||
},
|
||||
sizeLimits() {
|
||||
return Object.fromEntries(this.widgets.map(({ setup, widget_id: type }) => {
|
||||
|
||||
@@ -6,10 +6,16 @@ export default {
|
||||
BsModal,
|
||||
WidgetIcon,
|
||||
},
|
||||
props: [
|
||||
"widgets",
|
||||
"hiddenWidgets"
|
||||
],
|
||||
props: {
|
||||
widgets: {
|
||||
type: [ Array, null ],
|
||||
required: true
|
||||
},
|
||||
hiddenWidgets: {
|
||||
type: Array,
|
||||
default: []
|
||||
}
|
||||
},
|
||||
data: () => ({
|
||||
callbacks: {}
|
||||
}),
|
||||
|
||||
+4
-23
@@ -56,8 +56,7 @@ export default {
|
||||
anmerkung: null,
|
||||
protokoll: null,
|
||||
note: null,
|
||||
link: null,
|
||||
uhrzeit: null
|
||||
link: null
|
||||
},
|
||||
statusNew: true,
|
||||
arrTypen: [],
|
||||
@@ -311,7 +310,6 @@ export default {
|
||||
|
||||
this.formData.pruefungstyp_kurzbz = data.pruefungstyp_kurzbz;
|
||||
this.formData.datum = data.datum;
|
||||
this.formData.uhrzeit = data.uhrzeit;
|
||||
this.formData.sponsion = data.sponsion;
|
||||
this.formData.akadgrad_id = data.akadgrad_id;
|
||||
this.formData.pruefungsantritt_kurzbz = data.pruefungsantritt_kurzbz;
|
||||
@@ -413,7 +411,6 @@ export default {
|
||||
pruefer3_label: this.selectedPruefer3?.label || null,
|
||||
akadgrad_id: this.formData.akadgrad_id,
|
||||
datum: this.formData.datum,
|
||||
uhrzeit: this.formData.uhrzeit || null,
|
||||
sponsion: this.formData.sponsion
|
||||
};
|
||||
localStorage.setItem(STORAGE_KEY, JSON.stringify(stored));
|
||||
@@ -530,7 +527,6 @@ export default {
|
||||
this.formData.abschlussbeurteilung_kurzbz = null;
|
||||
this.formData.datum = null;
|
||||
this.formData.sponsion = null;
|
||||
this.formData.uhrzeit = null;
|
||||
this.formData.pruefer1 = null;
|
||||
this.formData.pruefer2 = null;
|
||||
this.formData.pruefer3 = null;
|
||||
@@ -624,7 +620,7 @@ export default {
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.$api
|
||||
@@ -719,6 +715,7 @@ export default {
|
||||
</template>
|
||||
|
||||
<form-form ref="formFinalExam" @submit.prevent>
|
||||
|
||||
<legend>{{this.$p.t('global','details')}}</legend>
|
||||
<p v-if="statusNew">[{{$p.t('ui', 'neu')}}]</p>
|
||||
|
||||
@@ -919,22 +916,6 @@ export default {
|
||||
</form-input>
|
||||
</div>
|
||||
|
||||
<div v-if="!config.hiddenFields?.includes('uhrzeit')" class="row mb-3">
|
||||
<form-input
|
||||
container-class="col-6 stv-details-uhrzeit"
|
||||
:label="$p.t('global', 'uhrzeit')"
|
||||
type="DatePicker"
|
||||
v-model="formData.uhrzeit"
|
||||
model-type="HH:mm:ss"
|
||||
time-picker
|
||||
text-input
|
||||
name="uhrzeit"
|
||||
:teleport="true"
|
||||
:cancel-text="$p.t('ui', 'abbrechen')"
|
||||
:select-text="$p.t('ui', 'ok')"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<form-input
|
||||
container-class="col-6 stv-details-abschlusspruefung-sponsion"
|
||||
@@ -998,7 +979,7 @@ export default {
|
||||
:cisRoot="cisRoot"
|
||||
@linkGenerated="printDocument"
|
||||
></abschlusspruefung-dropdown>
|
||||
</Teleport>
|
||||
</Teleport>
|
||||
</div>
|
||||
`
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import {CoreFilterCmpt} from "../../../../filter/Filter.js";
|
||||
import ZeugnisActions from './Zeugnis/Actions.js';
|
||||
import ZeugnisDocuments from './Zeugnis/Documents.js';
|
||||
import { debounce } from '../../../../../helpers/debounce.js';
|
||||
|
||||
export default {
|
||||
name: 'Zeugnis',
|
||||
@@ -100,7 +99,7 @@ export default {
|
||||
return;
|
||||
|
||||
// get row data
|
||||
const {lehrveranstaltung_id, uid: student_uid, studiensemester_kurzbz, _punkte: punkte = null} = cell.getData();
|
||||
const {lehrveranstaltung_id, uid: student_uid, studiensemester_kurzbz} = cell.getData();
|
||||
|
||||
listPromise
|
||||
// get bezeichnung
|
||||
@@ -112,7 +111,6 @@ export default {
|
||||
student_uid,
|
||||
studiensemester_kurzbz,
|
||||
note,
|
||||
punkte,
|
||||
note_bezeichnung
|
||||
}))
|
||||
// send to backend
|
||||
@@ -122,7 +120,7 @@ export default {
|
||||
.then(list => list.find(el => el.value == note))
|
||||
.then(found => found?.label)
|
||||
// update other fields in row
|
||||
.then(note_bezeichnung => cell.getRow().update({note_bezeichnung, punkte, _punkte: null}))
|
||||
.then(note_bezeichnung => cell.getRow().update({note_bezeichnung}))
|
||||
.then(() => cell.getRow().reformat())
|
||||
// cleanup
|
||||
.then(cell.clearEdited)
|
||||
@@ -136,16 +134,13 @@ export default {
|
||||
if (this.config.usePoints) {
|
||||
gradeField.editorParams = {
|
||||
valuesLookup: (cell, filterTerm) => {
|
||||
// the last typed Punkte go with the selected Note; a decimal comma counts as a point
|
||||
const punkte = filterTerm ? filterTerm.replace(',', '.') : null;
|
||||
cell.getData()._punkte = punkte;
|
||||
if (punkte) {
|
||||
if (filterTerm) {
|
||||
return this.$api
|
||||
.call(
|
||||
this.endpoint.getGradeFromPoints(
|
||||
punkte,
|
||||
filterTerm,
|
||||
cell.getData().lehrveranstaltung_id,
|
||||
cell.getData().studiensemester_kurzbz
|
||||
this.currentSemester
|
||||
),
|
||||
{ errorHandling: false }
|
||||
)
|
||||
@@ -179,124 +174,6 @@ export default {
|
||||
gradeField.headerFiler = this.optionalTabulatorOptions?.headerFilter?.note || this.optionalTabulatorOptions?.note || false
|
||||
}
|
||||
|
||||
let punkteField = {
|
||||
field: 'punkte',
|
||||
title: this.$p.t('stv/grades_points'),
|
||||
visible: !!this.config.usePoints,
|
||||
// numeric(8,4) arrives as "45.5000"
|
||||
formatter: cell => (cell.getValue() ?? '') === '' ? '' : String(Number(cell.getValue()))
|
||||
};
|
||||
if (this.config.usePoints && ['both', 'inline'].includes(this.config.edit)) {
|
||||
// saves the Punkte of one row; the server derives the Note, the row shows what it saved
|
||||
const savePunkte = (row, punkte, before) => {
|
||||
const data = row.getData();
|
||||
const saveId = data._punkteSaveId = (data._punkteSaveId || 0) + 1;
|
||||
const { lehrveranstaltung_id, uid: student_uid, studiensemester_kurzbz, lehrveranstaltung_bezeichnung } = data;
|
||||
|
||||
this.$api
|
||||
.call(
|
||||
// without Punkte the Note before the edit stays; a preview of a shorter input must not stick
|
||||
this.endpoint.updateCertificate({ lehrveranstaltung_id, student_uid, studiensemester_kurzbz, note: punkte === null ? before.note : data.note, punkte }),
|
||||
{ errorHeader: lehrveranstaltung_bezeichnung }
|
||||
)
|
||||
.then(result => listPromise.then(list => ({
|
||||
...result.data,
|
||||
note_bezeichnung: list.find(el => el.value == result.data.note)?.label
|
||||
})))
|
||||
.then(saved => {
|
||||
// a later save of the same row wins
|
||||
if (row.getData()._punkteSaveId !== saveId)
|
||||
return;
|
||||
// update, not reformat: a reformat destroys an editor that is open in this row again
|
||||
row.update(saved);
|
||||
this.$fhcAlert.alertSuccess(this.$p.t('stv/grades_updated'));
|
||||
})
|
||||
.catch(err => {
|
||||
if (row.getData()._punkteSaveId === saveId)
|
||||
row.update(before);
|
||||
this.$fhcAlert.handleFormValidation(err);
|
||||
});
|
||||
};
|
||||
|
||||
// the Note of the Notenschluessel shows while typing; Enter, Tab and a click elsewhere save
|
||||
punkteField.editor = (cell, onRendered, success, cancel) => {
|
||||
const row = cell.getRow();
|
||||
const { note, note_bezeichnung, punkte } = row.getData();
|
||||
|
||||
const input = document.createElement('input');
|
||||
input.type = 'text';
|
||||
input.inputMode = 'decimal';
|
||||
input.style.cssText = 'width: 100%; height: 100%; box-sizing: border-box; padding: 4px;';
|
||||
|
||||
// cellEditCancelled reads this state when Tabulator closes the editor itself
|
||||
const editor = row.getData()._punkteEditor = {
|
||||
open: true,
|
||||
initial: punkteField.formatter(cell),
|
||||
before: { note, note_bezeichnung, punkte },
|
||||
value: () => input.value.trim().replace(',', '.'),
|
||||
save: () => savePunkte(row, editor.value() === '' ? null : editor.value(), editor.before)
|
||||
};
|
||||
input.value = editor.initial;
|
||||
|
||||
const showNote = debounce(() => {
|
||||
if (!editor.open)
|
||||
return;
|
||||
if (editor.value() === '')
|
||||
return row.update({ note, note_bezeichnung });
|
||||
const { lehrveranstaltung_id, studiensemester_kurzbz } = row.getData();
|
||||
this.$api
|
||||
.call(this.endpoint.getGradeFromPoints(editor.value(), lehrveranstaltung_id, studiensemester_kurzbz), { errorHandling: false })
|
||||
.then(result => listPromise.then(list => list.find(el => el.value == result.data)))
|
||||
.then(found => editor.open && found && row.update({ note: found.value, note_bezeichnung: found.label }))
|
||||
.catch(() => {});
|
||||
}, 500);
|
||||
|
||||
const finish = save => {
|
||||
if (!editor.open)
|
||||
return;
|
||||
editor.open = false;
|
||||
if (save && editor.value() !== editor.initial) {
|
||||
success(editor.value());
|
||||
return editor.save();
|
||||
}
|
||||
cancel();
|
||||
row.update({ note, note_bezeichnung });
|
||||
};
|
||||
input.addEventListener('input', showNote);
|
||||
input.addEventListener('blur', () => finish(true));
|
||||
input.addEventListener('keydown', evt => {
|
||||
if (evt.key === 'Enter')
|
||||
finish(true);
|
||||
if (evt.key === 'Escape')
|
||||
finish(false);
|
||||
// like the Tabulator editors: else the table keybindings scroll and close the editor
|
||||
if (evt.key === 'Home' || evt.key === 'End')
|
||||
evt.stopPropagation();
|
||||
});
|
||||
onRendered(() => {
|
||||
input.focus();
|
||||
input.select();
|
||||
});
|
||||
return input;
|
||||
};
|
||||
// Tabulator closes an open editor itself when another edit starts; the typed Punkte still count
|
||||
punkteField.cellEditCancelled = cell => {
|
||||
const editor = cell.getData()._punkteEditor;
|
||||
if (!editor?.open)
|
||||
return;
|
||||
editor.open = false;
|
||||
if (editor.value() === editor.initial)
|
||||
return cell.getRow().update({ note: editor.before.note, note_bezeichnung: editor.before.note_bezeichnung });
|
||||
cell.getRow().update({ punkte: editor.value() });
|
||||
editor.save();
|
||||
};
|
||||
// one click opens the editor; without it the first click only selects the row
|
||||
punkteField.cellClick = (evt, cell) => {
|
||||
if (!cell.getElement().classList.contains('tabulator-editing'))
|
||||
cell.edit();
|
||||
};
|
||||
}
|
||||
|
||||
const columns = [
|
||||
{ field: 'zeugnis', title: this.$p.t('stv/grades_zeugnis'), formatter: 'tickCross' },
|
||||
{ field: 'lehrveranstaltung_bezeichnung', title: this.$p.t('lehre/lehrveranstaltung') },
|
||||
@@ -344,7 +221,7 @@ export default {
|
||||
{ field: 'ects_lv', title: this.$p.t('lehre/ects'), visible: false },
|
||||
{ field: 'lehrform', title: this.$p.t('lehre/lehrform'), visible: false },
|
||||
{ field: 'kurzbz', title: this.$p.t('lehre/kurzbz'), visible: false },
|
||||
punkteField,
|
||||
{ field: 'punkte', title: this.$p.t('stv/grades_points'), visible: false },
|
||||
{ field: 'lehrveranstaltung_bezeichnung_english', title: this.$p.t('stv/grades_lehrveranstaltung_bezeichnung_english'), visible: false },
|
||||
{ field: 'uid', title: this.$p.t('person/uid'), visible: false },
|
||||
{ field: 'vorname', title: this.$p.t('person/vorname'), visible: false },
|
||||
|
||||
@@ -32,8 +32,7 @@ export default {
|
||||
return {
|
||||
grades: [],
|
||||
suggestions: null,
|
||||
currentPoints: '',
|
||||
lastPoints: null
|
||||
currentPoints: ''
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -69,15 +68,14 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
convertPoints({evt, query}) {
|
||||
this.lastPoints = query ? query.replace(',', '.') : null;
|
||||
if (!query) {
|
||||
return this.suggestions = this.grades;
|
||||
}
|
||||
this.$refs.points
|
||||
.call(ApiStvGrades.getGradeFromPoints(
|
||||
this.lastPoints,
|
||||
query,
|
||||
this.selected.find(Boolean)?.lehrveranstaltung_id,
|
||||
this.selected.find(Boolean)?.studiensemester_kurzbz
|
||||
this.currentSemester
|
||||
))
|
||||
.then(result => {
|
||||
if (result.data === null) {
|
||||
@@ -92,7 +90,7 @@ export default {
|
||||
if (this.selected)
|
||||
this.selected.forEach(grade => grade.note = note);
|
||||
this.currentPoints = '';
|
||||
this.selectedData.forEach(data => this.$emit('setGrade', {...data, note, punkte: this.lastPoints}));
|
||||
this.current = note;
|
||||
},
|
||||
deleteGrades() {
|
||||
this.selectedData.forEach(data => this.$emit('deleteGrade', data));
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
function loadCss(path) {
|
||||
if (!document.head) {
|
||||
return new Promise((resolve, reject) => {
|
||||
window.addEventListener('load', () => loadCss(path).then(resolve).catch(reject));
|
||||
});
|
||||
}
|
||||
if (path.match(/^\/[^\/]/))
|
||||
path = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/\/$/, "") + path;
|
||||
|
||||
if (document.querySelector('link[href="' + path + '"]'))
|
||||
return Promise.resolve();
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const link = document.createElement('link');
|
||||
link.rel = 'stylesheet';
|
||||
link.type = 'text/css';
|
||||
|
||||
link.onload = resolve;
|
||||
link.onerror = reject;
|
||||
|
||||
link.href = path;
|
||||
|
||||
document.head.append(link);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
export {
|
||||
loadCss,
|
||||
};
|
||||
|
||||
export default {
|
||||
loadCss,
|
||||
};
|
||||
@@ -62,3 +62,7 @@ function splitWordsInCamelCase(string) {
|
||||
splitWords.push(string.slice(lastUpperCaseLetterIndex));
|
||||
return splitWords;
|
||||
}
|
||||
|
||||
export function isString(str) {
|
||||
return typeof str === 'string' || str instanceof String;
|
||||
}
|
||||
|
||||
+162
-20
@@ -2153,6 +2153,46 @@ $phrases = array(
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'aborted_by_user',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Abbruch durch Benutzer',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Aborted by the user',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'no_preview_available',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Keine Vorschau verfügbar',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'No preview available',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'anrechnung',
|
||||
@@ -42493,26 +42533,6 @@ In the list:
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'stv',
|
||||
'phrase' => 'grades_error_noGradeForPoints',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Der Notenschlüssel der Lehrveranstaltung ergibt für diese Punkte keine Note',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'The grading key of the course gives no grade for these points',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
// groups
|
||||
array(
|
||||
'app' => 'core',
|
||||
@@ -67390,6 +67410,128 @@ I have been informed that I am under no obligation to consent to the transmissio
|
||||
)
|
||||
),
|
||||
// ### Phrases Dashboard Studstatus Widget END
|
||||
// ### Phrases Dashboard OpenProject Widget START
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_login',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'In OpenProject anmelden',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Login to OpenProject',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_title_listWpOpen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Offene WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Open WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_title_listWpOverdue',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Überfällige WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Overdue WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_title_listWpNew',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Neue WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'New WorkPackages',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_title_listMentioned',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Erwähnungen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Mentions',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'dashboard',
|
||||
'phrase' => 'widget_openproject_select_endpoint',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Anzeigen:',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Show:',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
// ### Phrases Dashboard OpenProject Widget END
|
||||
//******************* CORE/reservierung
|
||||
array(
|
||||
'app' => 'core',
|
||||
|
||||
Reference in New Issue
Block a user