diff --git a/public/js/components/RoomManager/RoomManagerOverview.js b/public/js/components/RoomManager/RoomManagerOverview.js
index 56623008e..043e3b17b 100644
--- a/public/js/components/RoomManager/RoomManagerOverview.js
+++ b/public/js/components/RoomManager/RoomManagerOverview.js
@@ -6,8 +6,7 @@ import { CoreFilterCmpt } from "../filter/Filter.js";
import CoreForm from "../Form/Form.js";
import FormInput from "../Form/Input.js";
import RoomFormModal from "./RoomFormModal.js";
-
-import ApiCms from "../../../js/api/factory/cms.js";
+import RoomTypeFormModal from "./RoomTypeFormModal.js";
export default {
name: "RoomManagerOverview",
@@ -16,18 +15,12 @@ export default {
CoreForm,
FormInput,
RoomFormModal,
+ RoomTypeFormModal,
},
watch: {
filterData: {
handler(newValue) {
- this.$refs.roomManagerOverviewTable.tabulator.setData("/", {
- organizationalUnitShortCode: newValue.organizationalUnit?.value,
- locationId: newValue.locationId,
- buildingComponent: newValue.buildingComponent,
- isForTrainingProgram: newValue.isForTrainingProgram,
- isReservationNeeded: newValue.isReservationNeeded,
- isActive: newValue.isActive,
- });
+ this.reloadTableData();
},
deep: true,
},
@@ -48,7 +41,9 @@ export default {
filteredOrganizationalUnits: [],
buildingComponents: ["A", "B", "C", "D", "E", "F"],
isRoomFormModalVisible: false,
+ isRoomTypeFormModalVisible: false,
editedRoomShortCode: null,
+ editedRoomForRoomTypeManagement: null,
};
},
computed: {
@@ -70,54 +65,101 @@ export default {
ajaxResponse: (url, params, response) => response.data,
persistenceID: "core_class_schedule_validity_periods",
selectableRows: true,
+ index: "ort_kurzbz",
columns: [
{
- title: this.$capitalize(this.$p.t("gruppenmanagement", "kurzbezeichnung")),
+ title: this.$capitalize(
+ this.$p.t("gruppenmanagement", "kurzbezeichnung"),
+ ),
field: "ort_kurzbz",
+ headerFilter: true,
+ width: 150,
},
{
- title: this.$capitalize(this.$p.t("gruppenmanagement", "bezeichnung")),
- field: "bezeichnun",
+ title: this.$capitalize(
+ this.$p.t("gruppenmanagement", "bezeichnung"),
+ ),
+ field: "bezeichnung",
+ headerFilter: true,
+ width: 200,
},
{
title: this.$capitalize(this.$p.t("ui", "planbezeichnung")),
field: "planbezeichnung",
+ headerFilter: true,
+ width: 200,
},
{
title: this.$capitalize(this.$p.t("ui", "maxPersons")),
field: "max_person",
+ headerFilter: true,
+ width: 100,
},
{
title: this.$capitalize(this.$p.t("ui", "arbeitsplaetze")),
field: "arbeitsplaetze",
+ headerFilter: true,
+ width: 100,
},
{
title: this.$capitalize(this.$p.t("ui", "quadratmeter")),
field: "m2",
+ headerFilter: true,
+ width: 100
},
{
title: this.$capitalize(this.$p.t("lehre", "organisationseinheit")),
- field: "oe_kurzbz",
+ field: "org_bezeichnung",
+ headerFilter: true,
+ width: 200,
},
{
title: this.$capitalize(this.$p.t("ui", "lehre")),
field: "lehre",
+ headerFilter: true,
+ formatter: "tickCross",
+ hozAlign: "center",
+ formatterParams: {
+ tickElement: '
',
+ crossElement: '
',
+ },
},
{
title: this.$capitalize(this.$p.t("ui", "reservieren")),
field: "reservieren",
+ headerFilter: true,
+ formatter: "tickCross",
+ hozAlign: "center",
+ formatterParams: {
+ tickElement: '
',
+ crossElement: '
',
+ },
},
{
title: this.$capitalize(this.$p.t("gruppenmanagement", "aktiv")),
field: "aktiv",
+ headerFilter: true,
+ formatter: "tickCross",
+ hozAlign: "center",
+ formatterParams: {
+ tickElement: '
',
+ crossElement: '
',
+ },
},
{
title: this.$capitalize(this.$p.t("ui", "kosten")),
field: "kosten",
+ headerFilter: true,
},
{
title: this.$capitalize(this.$p.t("ui", "stockwerk")),
field: "stockwerk",
+ headerFilter: true,
+ },
+ {
+ title: this.$capitalize(this.$p.t("ui", "parentRoom")),
+ field: "pr_ort_kurzbz",
+ headerFilter: true,
},
{
title: this.$capitalize(this.$p.t("global", "actions")),
@@ -133,14 +175,18 @@ export default {
button = document.createElement("button");
button.className = "btn btn-outline-secondary btn-action";
button.innerHTML = '
';
- button.title = this.$p.t(
- "ui",
- "btn_editRoom",
- );
+ button.title = this.$p.t("ui", "btn_editRoom");
button.addEventListener("click", (event) =>
- this.editRoom(
- cell.getData().ort_kurzbz,
- ),
+ this.editRoom(cell.getData().ort_kurzbz),
+ );
+ container.append(button);
+
+ button = document.createElement("button");
+ button.className = "btn btn-outline-secondary btn-action";
+ button.innerHTML = '
';
+ button.title = this.$p.t("ui", "btn_editRoomType");
+ button.addEventListener("click", (event) =>
+ this.editRoomType(cell.getData().ort_kurzbz),
);
container.append(button);
@@ -148,22 +194,14 @@ export default {
button.className =
"btn btn-outline-secondary btn-action bg-danger";
button.innerHTML = '
';
- button.title = this.$p.t(
- "ui",
- "btn_deleteRoom",
- );
+ button.title = this.$p.t("ui", "btn_deleteRoom");
button.addEventListener("click", () => {
let isDeletionConfirmed = confirm(
- this.$p.t(
- "ui",
- "deleteRoomConfirmation",
- ),
+ this.$p.t("ui", "deleteRoomConfirmation"),
);
if (!isDeletionConfirmed) return;
- this.deleteRoom(
- cell.getData().ort_kurzbz
- );
+ this.deleteRoom(cell.getData().ort_kurzbz);
});
container.append(button);
@@ -172,6 +210,7 @@ export default {
frozen: true,
},
],
+ layout: "fitColumns",
};
return options;
},
@@ -181,6 +220,29 @@ export default {
event: "renderComplete",
handler: async () => {},
},
+ {
+ event: "cellClick",
+ handler: async (e, cell) => {
+ let updateableFieldsByClick = ["lehre", "reservieren", "aktiv"];
+ for (let field of updateableFieldsByClick) {
+ if (cell.getField() === field) {
+ let updatedValue = !cell.getValue();
+ this.$refs.roomManagerOverviewTable.tabulator.updateData([
+ {
+ ort_kurzbz: cell.getData().ort_kurzbz,
+ [field]: updatedValue,
+ },
+ ]);
+ this.partialRoomUpdate(
+ cell.getData().ort_kurzbz,
+ field,
+ updatedValue,
+ );
+ this.$refs.roomManagerOverviewTable.tabulator.replaceData("/");
+ }
+ }
+ },
+ },
];
return events;
},
@@ -208,11 +270,11 @@ export default {
]);
}
- return (this.filteredOrganizationalUnits = [defaultItem].concat(
- this.dropdownParsedOrganizationalUnits.filter((unit) => {
+ return (this.filteredOrganizationalUnits = [defaultItem]
+ .concat(this.dropdownParsedOrganizationalUnits)
+ .filter((unit) => {
return unit.label.toLowerCase().includes(query);
- }),
- ));
+ }));
},
showRoomFormModal() {
this.isRoomFormModalVisible = true;
@@ -225,27 +287,57 @@ export default {
.call(ApiRoom.deleteRoom(roomShortCode))
.then((response) => {
if (response.meta.status === "success") {
- this.$refs.roomManagerOverviewTable.reloadTable();
- alert(this.$p.t("ui", "roomDeletedSuccessfully"));
+ this.reloadTableData();
+ this.$fhcAlert.alertSuccess(
+ this.$p.t("ui", "roomDeletedSuccessfully"),
+ );
} else {
console.error("Error deleting room:", response.meta.message);
- alert(this.$p.t("ui", "errorDeletingRoom"));
+ this.reloadTableData();
+ this.$fhcAlert.alertError(this.$p.t("ui", "errorDeletingRoom"));
}
})
.catch((error) => {
console.error("Error deleting room:", error);
- alert(this.$p.t("ui", "errorDeletingRoom"));
+ this.$fhcAlert.alertError(this.$p.t("ui", "errorDeletingRoom"));
});
- }
+ },
+ showRoomTypeFormModal() {
+ this.isRoomTypeFormModalVisible = true;
+ },
+ editRoomType(roomShortCode) {
+ this.editedRoomForRoomTypeManagement = roomShortCode;
+ },
+ async reloadTableData() {
+ this.$refs.roomManagerOverviewTable.tabulator.replaceData("/", {
+ organizationalUnitShortCode: this.filterData.organizationalUnit?.value,
+ locationId: this.filterData.locationId,
+ buildingComponent: this.filterData.buildingComponent,
+ isForTrainingProgram: this.filterData.isForTrainingProgram,
+ isReservationNeeded: this.filterData.isReservationNeeded,
+ isActive: this.filterData.isActive,
+ });
+ },
+ handleRoomUpdated() {
+ this.editedRoomShortCode = null;
+ this.reloadTableData();
+ },
+ async partialRoomUpdate(roomShortCode, attribute, value) {
+ let response = await this.$api.call(
+ ApiRoom.updateRoom(roomShortCode, {
+ [attribute]: value,
+ }),
+ );
+ if (response.meta.status === "success") {
+ this.$fhcAlert.alertSuccess(this.$p.t("ui", "successUpdate"));
+ this.reloadTableData();
+ } else {
+ console.error("Error updating room:", response.meta.message);
+ this.$fhcAlert.alertError(this.$p.t("ui", "errorUpdatingRoom"));
+ }
+ },
},
async created() {
- let getContent = await this.$api.call(ApiCms.content(7601));
- if (getContent.meta.status === "success") {
- console.log;
- } else {
- console.error("Error fetching locations:", getContent.meta.message);
- }
-
let getLocationsResponse = await this.$api.call(
ApiLocation.getLocationsByCompanyType("Intern"),
);
@@ -274,7 +366,14 @@ export default {
},
mounted() {
this.$p
- .loadCategory(["global", "lehre", "ui", "gruppenmanagement", "core", "person"])
+ .loadCategory([
+ "global",
+ "lehre",
+ "ui",
+ "gruppenmanagement",
+ "core",
+ "person",
+ ])
.then(() => {
this.phrasesLoaded = true;
});
@@ -300,12 +399,12 @@ export default {
{ filterData.organizationalUnit = option.value; }"
dropdown
forceSelection
type="autocomplete"
@@ -382,8 +481,13 @@ export default {
:isVisible="isRoomFormModalVisible"
:editedRoomShortCode="editedRoomShortCode"
@hideBsModal="() => { isRoomFormModalVisible = false; editedRoomShortCode = null; }"
- @roomCreated="() => { $refs.roomManagerOverviewTable.reloadTable(); editedRoomShortCode = null; }"
- @roomUpdated="() => { $refs.roomManagerOverviewTable.reloadTable(); editedRoomShortCode = null; }"
+ @roomCreated="handleRoomUpdated"
+ @roomUpdated="handleRoomUpdated"
+ />
+ { isRoomTypeFormModalVisible = false; editedRoomForRoomTypeManagement = null; }"
/>
`,
diff --git a/public/js/components/RoomManager/RoomTypeFormModal.js b/public/js/components/RoomManager/RoomTypeFormModal.js
new file mode 100644
index 000000000..b0954536b
--- /dev/null
+++ b/public/js/components/RoomManager/RoomTypeFormModal.js
@@ -0,0 +1,353 @@
+import ApiRoom from "../../../js/api/factory/ort.js";
+import ApiRoomType from "../../../js/api/factory/roomType.js";
+import ApiRoomToRoomType from "../../../js/api/factory/roomToRoomType.js";
+
+import { CoreFilterCmpt } from "../filter/Filter.js";
+
+import BsModal from "../Bootstrap/Modal.js";
+import CoreForm from "../Form/Form.js";
+import FormInput from "../Form/Input.js";
+
+export default {
+ name: "RoomTypeFormModal",
+ components: {
+ BsModal,
+ CoreForm,
+ FormInput,
+ CoreFilterCmpt,
+ },
+ props: {
+ isVisible: {
+ type: Boolean,
+ required: true,
+ },
+ editedRoomShortCode: {
+ type: String,
+ default: null,
+ },
+ },
+ emits: [
+ "hideBsModal",
+ "roomTypeCreated",
+ "roomToRoomTypeCreated",
+ "roomToRoomTypeDeleted",
+ ],
+ watch: {
+ isVisible(newValue) {
+ if (newValue) {
+ this.$refs.roomTypeFormModal.show();
+ } else {
+ this.$refs.roomTypeFormModal.hide();
+ }
+ },
+ async editedRoomShortCode(newValue) {
+ if (newValue) {
+ await this.$refs.roomTypesTable.reloadTable();
+ this.$refs.roomTypeFormModal.show();
+ } else {
+ this.resetRoomTypeForm();
+ }
+ },
+ },
+ data: () => {
+ return {
+ phrasesLoaded: false,
+ isEditInProgress: false,
+ editedRoom: null,
+ isRoomTypeFormVisible: false,
+ roomTypeFormData: {
+ aktiv: true,
+ },
+ roomToRoomTypeFormData: {},
+ roomTypes: [],
+ filteredRoomTypes: [],
+ };
+ },
+ computed: {
+ tabulatorOptions() {
+ const options = {
+ ajaxURL: "dummy",
+ ajaxRequestFunc: async () =>
+ this.$api.call(
+ ApiRoomToRoomType.getRoomToRoomTypeRelationsByRoomShortCode(
+ this.editedRoomShortCode,
+ ),
+ ),
+ ajaxResponse: (url, params, response) => response.data,
+ persistenceID: "core_class_schedule_validity_periods",
+ selectableRows: true,
+ columns: [
+ {
+ title: this.$capitalize(this.$p.t("ui", "roomType")),
+ field: "raumtyp_kurzbz",
+ },
+ {
+ title: this.$capitalize(this.$p.t("ui", "hierarchy")),
+ field: "hierarchie",
+ },
+ {
+ title: this.$capitalize(this.$p.t("gruppenmanagement", "beschreibung")),
+ field: "raumtyp_beschreibung",
+ },
+ {
+ title: this.$capitalize(this.$p.t("global", "actions")),
+ field: "actions",
+ minWidth: 150,
+ maxWidth: 150,
+ formatter: (cell, formatterParams, onRendered) => {
+ let container = document.createElement("div");
+ container.className = "d-flex gap-2";
+
+ let button = document.createElement("button");
+
+ button = document.createElement("button");
+ button.className =
+ "btn btn-outline-secondary btn-action bg-danger";
+ button.innerHTML = '';
+ button.title = this.$p.t(
+ "ui",
+ "btn_deleteRoomToRoomTypeRelation",
+ );
+ button.addEventListener("click", () => {
+ let isDeletionConfirmed = confirm(
+ this.$p.t("ui", "deleteRoomToRoomTypeRelationConfirmation"),
+ );
+ if (!isDeletionConfirmed) return;
+
+ this.deleteRoomToRoomTypeRelation(
+ cell.getData().ort_kurzbz,
+ cell.getData().raumtyp_kurzbz,
+ );
+ });
+ container.append(button);
+
+ return container;
+ },
+ frozen: true,
+ },
+ ],
+ };
+ return options;
+ },
+ tabulatorEvents() {
+ const events = [
+ {
+ event: "renderComplete",
+ handler: async () => {},
+ },
+ ];
+ return events;
+ },
+ dropdownParsedRoomTypes() {
+ return this.roomTypes.map((roomType) => {
+ return {
+ label: `${roomType.raumtyp_kurzbz} - ${roomType.beschreibung}`,
+ value: roomType.raumtyp_kurzbz,
+ };
+ });
+ },
+ },
+ methods: {
+ filterRoomTypes(event) {
+ let defaultItem = {
+ label: "----------",
+ value: null,
+ };
+
+ const query = event.query.toLowerCase();
+ if (!query) {
+ return (this.filteredRoomTypes = [
+ defaultItem,
+ ...this.dropdownParsedRoomTypes,
+ ]);
+ }
+
+ return (this.filteredRoomTypes = [defaultItem]
+ .concat(this.dropdownParsedRoomTypes)
+ .filter((roomType) => {
+ return roomType.label?.toLowerCase().includes(query);
+ }));
+ },
+ createRoomType() {
+ return this.$refs.roomTypeForm
+ .call(
+ ApiRoomType.createRoomType({
+ kurzbezeichnung: this.roomTypeFormData.shortCode,
+ beschreibung: this.roomTypeFormData.description,
+ }),
+ )
+ .then((response) => {
+ this.$fhcAlert.alertSuccess(this.$p.t("ui", "successSave"));
+ this.$emit("roomTypeCreated");
+ this.resetRoomTypeForm();
+ this.isRoomTypeFormVisible = false;
+ this.fetchRoomTypes();
+ });
+ },
+ createRoomToRoomTypeRelation() {
+ return this.$refs.roomToRoomTypeForm
+ .call(
+ ApiRoomToRoomType.createRoomToRoomTypeRelation(
+ this.editedRoomShortCode,
+ this.roomToRoomTypeFormData.roomType?.value,
+ this.roomToRoomTypeFormData.hierarchy,
+ ),
+ )
+ .then((response) => {
+ this.$fhcAlert.alertSuccess(this.$p.t("ui", "successSave"));
+ this.$emit("roomToRoomTypeCreated");
+ this.resetRoomTypeForm();
+ this.$refs.roomTypesTable.tabulator.replaceData("/");
+ });
+ },
+ deleteRoomToRoomTypeRelation(roomShortCode, roomTypeShortCode) {
+ return this.$api
+ .call(
+ ApiRoomToRoomType.deleteRoomToRoomTypeRelation(
+ roomShortCode,
+ roomTypeShortCode,
+ ),
+ )
+ .then((response) => {
+ this.$fhcAlert.alertSuccess(this.$p.t("ui", "successDelete"));
+ this.$emit("roomToRoomTypeDeleted");
+ this.resetRoomTypeForm();
+ this.$refs.roomTypesTable.tabulator.replaceData("/");
+ });
+ },
+ hideRoomTypeFormModal() {
+ this.$refs.roomTypeFormModal.hide();
+ this.$emit("hideBsModal");
+ this.resetRoomTypeForm();
+ },
+ resetRoomTypeForm() {
+ this.$refs.roomTypeForm?.clearValidation();
+
+ this.isEditInProgress = false;
+ this.isRoomTypeFormVisible = false;
+
+ this.editedRoom = null;
+ this.roomTypeFormData = {
+ aktiv: true,
+ };
+ },
+ async fetchRoomTypes() {
+ let getRoomTypesResponse = await this.$api.call(
+ ApiRoomType.getAllRoomTypes(),
+ );
+ if (getRoomTypesResponse.meta.status === "success") {
+ this.roomTypes = getRoomTypesResponse.data;
+ } else {
+ console.error(
+ "Error fetching room types:",
+ getRoomTypesResponse.meta.message,
+ );
+ }
+ },
+ },
+ async created() {
+ this.fetchRoomTypes();
+
+ this.$p
+ .loadCategory(["global", "lehre", "ui", "gruppenmanagement", "core", "person"])
+ .then(() => {
+ this.phrasesLoaded = true;
+ });
+ },
+ template: /* html */ `
+ { $emit('hideBsModal'); resetRoomTypeForm(); }" class="modal-lg">
+
+ {{$capitalize($p.t('ui', 'assignRoomTypeToRoomModalTitle'))}}
+
+
+
+
+
+
+
{{$capitalize($p.t('ui', 'createRoomTypeFormTitle'))}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{$capitalize($p.t('ui', 'assignedRoomTypesTitle'))}}
+
+
+
+
+
+
+ `,
+};
diff --git a/system/dbupdate_3.4.php b/system/dbupdate_3.4.php
index 8b6af9f2d..dd11ec76c 100644
--- a/system/dbupdate_3.4.php
+++ b/system/dbupdate_3.4.php
@@ -94,7 +94,7 @@ require_once('dbupdate_3.4/71399_dashboard_update_widget_paths.php');
require_once('dbupdate_3.4/71645_studvw_messagetab_ladezeit.php');
require_once('dbupdate_3.4/71566_studienordnungsdokument_neuer_organisationseinheitstyp_programm.php');
require_once('dbupdate_3.4/70376_lohnguide.php');
-
+require_once('dbupdate_3.4/76663_tempus_rekursive_raum_struktur.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo 'Pruefe Tabellen und Attribute!
';
diff --git a/system/dbupdate_3.4/76663_tempus_rekursive_raum_struktur.php b/system/dbupdate_3.4/76663_tempus_rekursive_raum_struktur.php
new file mode 100644
index 000000000..3b0f440b4
--- /dev/null
+++ b/system/dbupdate_3.4/76663_tempus_rekursive_raum_struktur.php
@@ -0,0 +1,22 @@
+db_query("SELECT parent_ort_kurzbz FROM public.tbl_ort LIMIT 1;"))
+{
+ $qry = 'ALTER TABLE public.tbl_ort ADD COLUMN parent_ort_kurzbz VARCHAR(16);';
+ if(!$db->db_query($qry))
+ echo 'public.tbl_ort: '.$db->db_last_error().'
';
+ else
+ echo ' public.tbl_ort: parent_ort_kurzbz added successfully.
';
+}
+
+$result = $db->db_query("SELECT constraint_name FROM information_schema.table_constraints
+ WHERE table_name='tbl_ort' AND constraint_type='FOREIGN KEY' AND constraint_name='fk_parent_ort_kurzbz'");
+if($db->db_num_rows($result)==0)
+{
+ $qry = "ALTER TABLE public.tbl_ort ADD CONSTRAINT fk_parent_ort_kurzbz FOREIGN KEY(parent_ort_kurzbz) REFERENCES public.tbl_ort(ort_kurzbz);";
+ if(!$db->db_query($qry))
+ echo 'public.tbl_ort: '.$db->db_last_error().'
';
+ else
+ echo '
Added foreign key constraint fk_parent_ort_kurzbz to public.tbl_ort';
+}
\ No newline at end of file
diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php
index e42befef2..3e422f514 100644
--- a/system/phrasesupdate.php
+++ b/system/phrasesupdate.php
@@ -58657,6 +58657,206 @@ I have been informed that I am under no obligation to consent to the transmissio
)
)
),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'parentRoom',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'übergeordneter Raum',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'parent room',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'assignRoomTypeToRoomModalTitle',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'raumtyp zu raum zuweisen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'assign room type to room',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'createRoomType',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'raumtyp erstellen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'create room type',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'createRoomTypeFormTitle',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'raumtyp erstellen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'create room type',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'hierarchy',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'hierarchie',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'hierarchy',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'assignedRoomTypesTitle',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'zugewiesene Raumtypen',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'assigned room types',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'roomType',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Raumtyp',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'room type',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'error_fieldUnique',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => '{field} muss einzigartig sein',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => '{field} must be unique',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'error_roomToRoomTypeRelationAlreadyExists',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'Die Relation mit der gleichen Hierarchie ist diesem Raum bereits zugeordnet',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'The relation with the same hierarchy is already assigned to this room',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
+ array(
+ 'app' => 'core',
+ 'category' => 'ui',
+ 'phrase' => 'roomManagerPageTitle',
+ 'insertvon' => 'system',
+ 'phrases' => array(
+ array(
+ 'sprache' => 'German',
+ 'text' => 'raumverwaltung',
+ 'description' => '',
+ 'insertvon' => 'system'
+ ),
+ array(
+ 'sprache' => 'English',
+ 'text' => 'room management',
+ 'description' => '',
+ 'insertvon' => 'system'
+ )
+ )
+ ),
);