diff --git a/application/controllers/api/frontend/v1/stv/Favorites.php b/application/controllers/api/frontend/v1/stv/Favorites.php
index ca8b62da6..951eb01a4 100644
--- a/application/controllers/api/frontend/v1/stv/Favorites.php
+++ b/application/controllers/api/frontend/v1/stv/Favorites.php
@@ -60,17 +60,6 @@ class Favorites extends FHCAPI_Controller
$favorites = $this->input->post('favorites');
- $removed = [];
- while (strlen($favorites) > 64) {
- $favObj = json_decode($favorites);
- if (!$favObj->list)
- break;
- $removed[] = array_shift($favObj->list);
- $favorites = json_encode($favObj);
- }
- if ($removed)
- $this->addMeta('removed', $removed);
-
$result = $this->VariableModel->setVariable(getAuthUID(), 'stv_favorites', $favorites);
$this->getDataOrTerminateWithError($result);
diff --git a/application/controllers/api/frontend/v1/stv/Kontakt.php b/application/controllers/api/frontend/v1/stv/Kontakt.php
index 9b713b5f9..3a8268775 100644
--- a/application/controllers/api/frontend/v1/stv/Kontakt.php
+++ b/application/controllers/api/frontend/v1/stv/Kontakt.php
@@ -434,7 +434,10 @@ class Kontakt extends FHCAPI_Controller
$this->FirmaModel->addJoin('public.tbl_firma f', 'ON (f.firma_id = st.firma_id)', 'LEFT');
$this->KontakttypModel->addJoin('public.tbl_kontakttyp kt', 'ON (public.tbl_kontakt.kontakttyp = kt.kontakttyp)');
$result = $this->KontaktModel->loadWhere(
- array('person_id' => $person_id)
+ array(
+ 'person_id' => $person_id,
+ 'public.tbl_kontakt.kontakttyp !=' => 'hidden'
+ )
);
if (isError($result))
@@ -442,20 +445,18 @@ class Kontakt extends FHCAPI_Controller
$this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
}
$this->terminateWithSuccess((getData($result) ?: []));
+
}
public function getKontakttypen()
{
$this->load->model('person/Kontakttyp_model', 'KontakttypModel');
+ $this->KontakttypModel->addOrder('beschreibung', 'ASC');
+ $result = $this->KontakttypModel->loadWhere(array('kontakttyp !=' => 'hidden'));
- $result = $this->KontakttypModel->load();
- if (isError($result)) {
- $this->terminateWithError(getError($result), self::ERROR_TYPE_GENERAL);
- }
- else
- {
- $this->terminateWithSuccess(getData($result) ?: []);
- }
+ $data = $this->getDataOrTerminateWithError($result);
+
+ $this->terminateWithSuccess($data);
}
public function loadContact()
diff --git a/application/controllers/api/frontend/v1/stv/Prestudent.php b/application/controllers/api/frontend/v1/stv/Prestudent.php
index 4d0aa5fe1..7dc607d1a 100644
--- a/application/controllers/api/frontend/v1/stv/Prestudent.php
+++ b/application/controllers/api/frontend/v1/stv/Prestudent.php
@@ -138,13 +138,24 @@ class Prestudent extends FHCAPI_Controller
{
$val = $this->input->post($prop, true);
- if ($val !== null || $prop === 'foerderrelevant') {
+ if ($val !== null) {
+ if(in_array($prop, ['dual', 'bismelden', 'foerderrelevant']))
+ {
+ $val = boolval($val);
+ }
+ elseif (
+ $val === ''
+ && in_array($prop, ['zgvnation', 'zgvmanation', 'zgvdoktornation', 'berufstaetigkeit_code', 'ausbildungcode'])
+ )
+ {
+ $val = null;
+ }
$update_prestudent[$prop] = $val;
}
// allowed to be null, but has to be in postparameter
if (
- in_array($prop, ['zgvdatum', 'zgvmadatum', 'zgvdoktordatum', 'zgv_code', 'zgvmas_code', 'zgvdoktor_code'])
+ in_array($prop, ['foerderrelevant', 'zgvdatum', 'zgvmadatum', 'zgvdoktordatum', 'zgv_code', 'zgvmas_code', 'zgvdoktor_code'])
&& !isset($update_prestudent[$prop])
&& array_key_exists($prop, $_POST)
)
diff --git a/application/controllers/api/frontend/v1/stv/Status.php b/application/controllers/api/frontend/v1/stv/Status.php
index 740ec4c8e..1889c1595 100644
--- a/application/controllers/api/frontend/v1/stv/Status.php
+++ b/application/controllers/api/frontend/v1/stv/Status.php
@@ -286,11 +286,11 @@ class Status extends FHCAPI_Controller
]);
$this->form_validation->set_rules('_default', '', [
- ['meldestichtag_not_exceeded', function () use ($datum, $isBerechtigtNoStudstatusCheck) {
+ ['meldestichtag_not_exceeded', function () use ($datum_string, $isBerechtigtNoStudstatusCheck) {
if ($isBerechtigtNoStudstatusCheck)
return true; // Skip if access right says so
- $result = $this->prestudentstatuschecklib->checkIfMeldestichtagErreicht($datum);
+ $result = $this->prestudentstatuschecklib->checkIfMeldestichtagErreicht($datum_string);
return !$this->getDataOrTerminateWithError($result);
}],
@@ -733,8 +733,9 @@ class Status extends FHCAPI_Controller
);
$result = $this->prestudentstatuschecklib->checkIfMeldestichtagErreicht($oldstatus->datum);
+ $isMeldestichtagErreicht = $this->getDataOrTerminateWithError($result);
- if (!$this->getDataOrTerminateWithError($result))
+ if ($isMeldestichtagErreicht)
$this->terminateWithError(
$this->p->t('lehre', 'error_dataVorMeldestichtag'),
self::ERROR_TYPE_GENERAL,
diff --git a/application/controllers/api/frontend/v1/stv/Student.php b/application/controllers/api/frontend/v1/stv/Student.php
index 0cfd82c36..f2845572f 100644
--- a/application/controllers/api/frontend/v1/stv/Student.php
+++ b/application/controllers/api/frontend/v1/stv/Student.php
@@ -276,7 +276,17 @@ class Student extends FHCAPI_Controller
$update_person = array();
foreach ($array_allowed_props_person as $prop) {
$val = $this->input->post($prop);
- if ($val !== null) {
+ if ($val === null)
+ {
+ continue;
+ }
+ if($prop == 'foto')
+ {
+ $fotoval = ($val == '') ? null : str_replace('data:image/jpeg;base64,', '', $val);
+ $update_person[$prop] = $fotoval;
+ }
+ else
+ {
$update_person[$prop] = $val;
}
}
diff --git a/application/libraries/ProfilLib.php b/application/libraries/ProfilLib.php
index 50b8bc264..6e93a0943 100644
--- a/application/libraries/ProfilLib.php
+++ b/application/libraries/ProfilLib.php
@@ -214,7 +214,7 @@ class ProfilLib{
* @param integer $uid the userID used to get the kontakt information
* @return array all the kontakt information corresponding to a userID
*/
- private function getKontaktInfo($pid)
+ private function getKontaktInfo($pid, $includehidden=false)
{
$this->ci->load->model("person/Kontakt_model","KontaktModel");
$this->ci->KontaktModel->addSelect(['kontakttyp', 'kontakt_id', 'kontakt', 'tbl_kontakt.anmerkung', 'tbl_kontakt.zustellung']);
@@ -222,7 +222,13 @@ class ProfilLib{
$this->ci->KontaktModel->addJoin('public.tbl_firma', 'firma_id', 'LEFT');
$this->ci->KontaktModel->addOrder('kontakttyp, kontakt, tbl_kontakt.updateamum, tbl_kontakt.insertamum');
- $kontakte_res = $this->ci->KontaktModel->loadWhere(['person_id' => $pid]);
+ $params = array('person_id' => $pid);
+ if(!$includehidden)
+ {
+ $params['kontakttyp <>'] = 'hidden';
+ }
+
+ $kontakte_res = $this->ci->KontaktModel->loadWhere($params);
if(isError($kontakte_res)){
return error(getData($kontakte_res));
}
diff --git a/public/js/components/Cis/Cms/Content.js b/public/js/components/Cis/Cms/Content.js
index 470a0fa62..355add08a 100644
--- a/public/js/components/Cis/Cms/Content.js
+++ b/public/js/components/Cis/Cms/Content.js
@@ -2,6 +2,8 @@ import raum_contentmittitel from './Content_types/Raum_contentmittitel.js'
import general from './Content_types/General.js'
import BsConfirm from "../../Bootstrap/Confirm.js";
import news_content from './Content_types/News_content.js';
+import iframe_content from './Content_types/Iframe_content.js';
+
import ApiCms from '../../../api/factory/cms.js';
export default {
@@ -24,42 +26,23 @@ export default {
raum_contentmittitel,
news_content,
general,
+ iframe_content
},
data() {
return {
+ content_type: null,
content: null,
content_id_internal: this.content_id
};
},
methods: {
fetchContent(){
- return this.$api
+ this.$api
.call(ApiCms.content(this.content_id_internal, this.version, this.sprache, this.sichtbar))
.then(res => {
- this.content = res.data.content;
- this.content_type = res.data.type;
-
- document.querySelectorAll("#cms [data-confirm]").forEach((el) => {
- el.addEventListener("click", (evt) => {
- evt.preventDefault();
- BsConfirm.popup(el.dataset.confirm)
- .then(() => {
- Axios.get(el.href)
- .then((res) => {
- // TODO(chris): check for success then show message and/or reload
- location = location;
- })
- .catch((err) => console.error("ERROR:", err));
- })
- .catch(() => {
- });
- });
- });
- document.querySelectorAll("#cms [data-href]").forEach((el) => {
- el.href = el.dataset.href.replace(
- /^ROOT\//,
- FHC_JS_DATA_STORAGE_OBJECT.app_root
- );
+ this.$nextTick(function() {
+ this.content = res.data.content;
+ this.content_type = res.data.type;
});
});
}
@@ -83,6 +66,8 @@ export default {
return "raum_contentmittitel";
case "news":
return "news_content";
+ case "iframe":
+ return "iframe_content";
default:
return "general";
};
@@ -91,8 +76,6 @@ export default {
created() {
this.fetchContent();
},
- mounted() {
- },
template: /*html*/ `
diff --git a/public/js/components/Cis/Cms/Content_types/Iframe_content.js b/public/js/components/Cis/Cms/Content_types/Iframe_content.js
new file mode 100644
index 000000000..568cfaf03
--- /dev/null
+++ b/public/js/components/Cis/Cms/Content_types/Iframe_content.js
@@ -0,0 +1,31 @@
+import { replaceRelativeLegacyLink } from "../../../../helpers/LegacyLinkReplaceHelper.js";
+
+export default {
+ name: "iframe_content",
+ props: {
+ content: { type: String, required: true }
+ },
+ computed: {
+ srcUrl() {
+ const parser = new DOMParser()
+ const doc = parser.parseFromString(`
${this.content}
`, "text/html");
+ const iframe = doc.querySelector("iframe[src]");
+
+ if (!iframe)
+ return "";
+
+ let url = iframe.getAttribute("src") || "";
+ return replaceRelativeLegacyLink(url);
+ }
+ },
+ template: `
+
+
+
Keine URL gefunden.
+
+ `
+};
diff --git a/public/js/components/DetailHeader/DetailHeader.js b/public/js/components/DetailHeader/DetailHeader.js
index 5c1573753..1088e3f63 100644
--- a/public/js/components/DetailHeader/DetailHeader.js
+++ b/public/js/components/DetailHeader/DetailHeader.js
@@ -102,6 +102,13 @@ export default {
redirectToLeitung(){
this.$emit('redirectToLeitung', {
person_id: this.leitungData.person_id});
+ },
+ getFotoSrc(foto) {
+ if(foto === null) {
+ return FHC_JS_DATA_STORAGE_OBJECT.app_root + 'skin/images/profilbild_dummy.jpg';
+ } else {
+ return 'data:image/jpeg;base64,' + foto;
+ }
}
},
template: `
@@ -116,7 +123,7 @@ export default {
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Contact.js b/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Contact.js
index e429e5933..1ff34dc79 100644
--- a/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Contact.js
+++ b/public/js/components/Stv/Studentenverwaltung/Details/Kontakt/Contact.js
@@ -300,8 +300,7 @@ export default{
this.$api
.call(ApiStvContact.getTypes())
.then(result => {
- //this.kontakttypen = result.data;
- this.kontakttypen = result.data.filter(item => item.kontakttyp !== 'hidden');
+ this.kontakttypen = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
@@ -326,7 +325,7 @@ export default{
v-model="contactData.kontakttyp">
>
-
+
@@ -455,4 +454,4 @@ export default{
>
`
-};
\ No newline at end of file
+};
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js b/public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js
index 3fa43e624..dc645dadc 100644
--- a/public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js
+++ b/public/js/components/Stv/Studentenverwaltung/Details/Prestudent.js
@@ -318,6 +318,7 @@ export default {
name="zgvnation"
>
+
@@ -380,6 +381,7 @@ export default {
name="zgvmanation"
>
+
@@ -443,6 +445,7 @@ export default {
name="zgvdoktornation"
>
+
@@ -504,6 +507,7 @@ export default {
v-model="data.berufstaetigkeit_code"
name="berufstaetigkeit_code"
>
+
+
diff --git a/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js b/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js
index edbd3b6ea..8b0252be8 100644
--- a/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js
+++ b/public/js/components/Stv/Studentenverwaltung/Details/Status/Modal.js
@@ -205,7 +205,7 @@ export default{
];*/
},
template: `
-
+
{{ $p.t('lehre', statusNew ? 'status_new' : 'status_edit', prestudent) }}
diff --git a/public/js/components/Stv/Studentenverwaltung/Verband.js b/public/js/components/Stv/Studentenverwaltung/Verband.js
index ccd555714..072e0e952 100644
--- a/public/js/components/Stv/Studentenverwaltung/Verband.js
+++ b/public/js/components/Stv/Studentenverwaltung/Verband.js
@@ -112,26 +112,14 @@ export default {
return cp;
},
- async filterFav() {
+ filterFav() {
this.favorites.on = !this.favorites.on;
this.$api
.call(this.endpoint.favorites.set(
JSON.stringify(this.favorites)
- ))
- .then(result => {
- if (result.meta?.removed) {
- this.favorites.list = this.favorites.list
- .filter(fav => !result.meta.removed.includes(fav));
- const items = result.meta.removed.map(
- rem => this.nodes.find(
- node => node.data.link == rem
- ).label
- ).join(',\n');
- this.$fhcAlert.alertWarning(this.$p.t('stv/warn_removed_favs', { items }));
- }
- });
+ ));
},
- async markFav(key) {
+ markFav(key) {
let index = this.favorites.list.indexOf(key.data.link + '');
if (index != -1) {
@@ -143,19 +131,7 @@ export default {
this.$api
.call(this.endpoint.favorites.set(
JSON.stringify(this.favorites)
- ))
- .then(result => {
- if (result.meta?.removed) {
- this.favorites.list = this.favorites.list
- .filter(fav => !result.meta.removed.includes(fav));
- const items = "\n" + result.meta.removed.map(
- rem => this.nodes.find(
- node => node.data.link == rem
- ).label
- ).join(",\n");
- this.$fhcAlert.alertWarning(this.$p.t('stv/warn_removed_favs', { items }));
- }
- });
+ ));
},
unsetFavFocus(e) {
if (e.target.dataset?.linkFavAdd !== undefined) {
diff --git a/system/FHComplete-3.3.sql b/system/FHComplete-3.3.sql
index 170066a1e..18c9c2c3d 100644
--- a/system/FHComplete-3.3.sql
+++ b/system/FHComplete-3.3.sql
@@ -9755,7 +9755,7 @@ COMMENT ON TABLE public.tbl_tag IS 'Orders and Company Tags';
CREATE TABLE public.tbl_variable (
name character varying(64) NOT NULL,
uid character varying(32) NOT NULL,
- wert character varying(64)
+ wert text
);
diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php
index 4b52b04c4..71031dbf3 100644
--- a/system/dbupdate_3.4.php
+++ b/system/dbupdate_3.4.php
@@ -77,6 +77,8 @@ require_once('dbupdate_3.4/55614_perm_verwaltetoe.php');
require_once('dbupdate_3.4/25999_C4_dashboard.php');
require_once('dbupdate_3.4/61730_Dashboard_Anpassungen.php');
require_once('dbupdate_3.4/40128_search.php');
+require_once('dbupdate_3.4/63394_Variablenbeschraenkung.php');
+require_once('dbupdate_3.4/63436_cis4_iframe_component.php');
require_once('dbupdate_3.4/60882_lehrfaecherverteilung_favorites.php');
require_once('dbupdate_3.4/66982_berufsschule.php');
diff --git a/system/dbupdate_3.4/63394_Variablenbeschraenkung.php b/system/dbupdate_3.4/63394_Variablenbeschraenkung.php
new file mode 100644
index 000000000..f6a75b5ef
--- /dev/null
+++ b/system/dbupdate_3.4/63394_Variablenbeschraenkung.php
@@ -0,0 +1,28 @@
+db_query("
+ SELECT data_type
+ FROM information_schema.columns
+ WHERE table_schema = 'public'
+ AND table_name = 'tbl_variable'
+ AND column_name = 'wert';
+")) {
+ if ($db->db_num_rows($result) == 1)
+ {
+ $data_type = $db->db_fetch_row($result)[0];
+
+ if (strtolower($data_type) != 'text')
+ {
+ $qry = "ALTER TABLE public.tbl_variable
+ ALTER COLUMN wert
+ TYPE TEXT;";
+
+ if (!$db->db_query($qry))
+ echo 'public.tbl_variable '.$db->db_last_error().'
';
+ else
+ echo 'public.tbl_variable: Change type of "wert" to TEXT
';
+ }
+ }
+}
diff --git a/system/dbupdate_3.4/63436_cis4_iframe_component.php b/system/dbupdate_3.4/63436_cis4_iframe_component.php
new file mode 100644
index 000000000..a5b3bbf7c
--- /dev/null
+++ b/system/dbupdate_3.4/63436_cis4_iframe_component.php
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+EOD;
+
+$xslt_xhtml= <<
+
+
+
+
+
+
+
+ Keine URL im Inhalt gefunden.
+
+
+
+
+EOD;
+
+$xslt_xhtml_c4= <<
+
+
+
+
+
+
+
+ Keine URL im Inhalt gefunden.
+
+
+
+
+EOD;
+
+
+if ($result = @$db->db_query("SELECT * FROM campus.tbl_template WHERE template_kurzbz='iframe'"))
+{
+ if ($db->db_num_rows($result) == 0)
+ {
+ $sql= <<db_query($sql))
+ {
+ echo 'campus.tbl_template: ' . $db->db_last_error() . '
';
+ }
+ else
+ {
+ echo ' campus.tbl_template: Template "iframe" hinzugefügt.
';
+ }
+
+ }
+}
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index 008ad8a8d..cd76ab267 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -30686,6 +30686,26 @@ array(
)
)
),
+ array(
+ 'app' => 'anwesenheiten',
+ 'category' => 'global',
+ 'phrase' => 'jetztStarten',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Jetzt Starten',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Start Now',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'anwesenheiten',
'category' => 'global',
@@ -38420,26 +38440,6 @@ array(
)
)
),
- array(
- 'app' => 'core',
- 'category' => 'stv',
- 'phrase' => 'warn_removed_favs',
- 'insertvon' => 'system',
- 'phrases' => array(
- array(
- 'sprache' => 'German',
- 'text' => 'Zu viele Favoriten! Die folgenden Einträge wurden entfernt: {items}',
- 'description' => '',
- 'insertvon' => 'system'
- ),
- array(
- 'sprache' => 'English',
- 'text' => 'Too many favorites! The following entries were removed: {items}',
- 'description' => '',
- 'insertvon' => 'system'
- )
- )
- ),
array(
'app' => 'core',
'category' => 'stv',
@@ -42556,6 +42556,26 @@ array(
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'abgabetool',
+ 'phrase' => 'c4abgabeStgSpezifischeRichtlinienBeachten',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => "Bitte beachten Sie gegebenenfalls existierende studiengangsspezifische Richtlinien und informieren Sie sich diesbezüglich. Vielen Dank.",
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'Please note any existing program-specific guidelines and inform yourself about them. Thank you.',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
array(
'app' => 'core',
'category' => 'abgabetool',