diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..703c23f
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.project b/.project
new file mode 100644
index 0000000..14853ae
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+
+
+ portal
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/build.xml b/build.xml
new file mode 100644
index 0000000..231deb1
--- /dev/null
+++ b/build.xml
@@ -0,0 +1,183 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src-modules/module/portal/conf/excludes.txt b/src-modules/module/portal/conf/excludes.txt
new file mode 100644
index 0000000..3ab2249
--- /dev/null
+++ b/src-modules/module/portal/conf/excludes.txt
@@ -0,0 +1,10 @@
+rohdaten/ETL_ENV
+rohdaten/*.properties
+preparation.sql
+finalize.sql
+rohdaten/*.err
+*.log
+*.err
+rohdaten/unl/*
+conf/customize.sql
+conf/*.log
diff --git a/src-modules/module/portal/conf/includes.txt b/src-modules/module/portal/conf/includes.txt
new file mode 100644
index 0000000..eec7122
--- /dev/null
+++ b/src-modules/module/portal/conf/includes.txt
@@ -0,0 +1,7 @@
+doku/etl_modul/etl.html
+WEB-INF/conf/edustore/db/bin/SQL_ENV_etl.sam
+WEB-INF/lib/superx-etl.jar
+images/eye.svg
+images/downloadblck.svg
+images/resultset_up.svg
+
diff --git a/src-modules/module/portal/conf/portal.xml b/src-modules/module/portal/conf/portal.xml
new file mode 100644
index 0000000..19e6b4e
--- /dev/null
+++ b/src-modules/module/portal/conf/portal.xml
@@ -0,0 +1,642 @@
+
+
+
+
+
+
+
+
+
+ Schlüsseltabelle für Portalkonfigurationen
+
+
+
+
+ (optional)
+
+
+ (optional für Filterung)
+
+
+
+
+
+superx
+superx
+portal_config
+tid
+1
+portal_config_pk
+
+
+
+
+
+
+
+
+
+
+
+ Portal-Tab Metadaten
+
+
+
+
+
+
+
+
+ bei Frames
+ bei Frames
+ bei DOM
+
+
+
+
+superx
+superx
+portal_config_tab
+tid
+1
+portal_config_tab_pk
+
+
+
+
+
+
+
+
+ Portalkonfiguration-Menü Metadaten
+
+
+
+
+
+
+
+
+
+superx
+superx
+portal_config_menu
+tid
+1
+portal_config_menu_pk
+
+
+
+
+
+
+
+
+ Portal-Elemente
+
+
+ Maske, Wiki, static_html, dbform
+
+
+ JS-Hander, wenn auf das Element geklickt wird
+
+
+
+ Bei Wiki und static_html
+
+
+
+
+
+
+
+
+
+
+
+superx
+superx
+portal_element
+tid
+1
+portal_element_pk
+
+
+
+
+
+
+
+
+ Schlüsseltabelle für Arten von Portalelementen
+
+
+
+
+
+
+
+
+
+superx
+superx
+portal_element_type
+tid
+1
+portal_element_type_pk
+
+
+
+
+
+
+
+
+
+ Schlüsseltabelle für Rollen von Portalelementen
+
+
+
+
+
+
+
+
+
+
+superx
+superx
+portal_element_role
+tid
+1
+portal_element_role_pk
+
+
+
+
+
+
+
+
+ Zuordnung Element zu Portal
+
+
+
+
+
+
+ Header,Footer,Sidebar-left, sidebar-right, content
+
+
+ Wert 1-32 (max)
+ in px
+
+
+
+
+superx
+superx
+portal_config2element
+tid
+1
+portal_config2element_pk
+
+
+
+
+
+
+
+
+
+ Portal-Layout
+
+
+
+
+ fixed (Feste Spalten), smart (Responsiv)
+ 1-32
+
+
+
+
+
+
+superx
+superx
+portal_layout
+tid
+1
+portal_layout_pk
+
+
+
+
+
+ Zuordnung Layout zu Portal
+
+
+
+
+ optional
+
+
+
+
+superx
+superx
+portal_config2layout
+tid
+1
+portal_config2layout_pk
+
+
+
+
+
+
+
+
+
+ Verlinkung Portal-Menü zu Elementen
+
+
+
+
+
+
+
+superx
+superx
+portal_config_menu2element
+tid
+1
+portal_config_menu2element_pk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Abfragen zur Administration von Portalkonfiguration
+
+
+
+
+ Portalkonfiguration verwalten
+
+ $PORTAL_PFAD/masken
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src-modules/module/portal/masken/52000_felderinfo.unl b/src-modules/module/portal/masken/52000_felderinfo.unl
new file mode 100644
index 0000000..dc4b18d
--- /dev/null
+++ b/src-modules/module/portal/masken/52000_felderinfo.unl
@@ -0,0 +1,7 @@
+52000^Benutzer/in^50^0^0^150^200^1^integer^200^0^1^<> select tid,nvl(name,benutzer) from userinfo order by 2;^hidden^^
+52001^Portal-Layouts bearbeiten^1000^0^0^140^80^1^char^255^0^18^ ^ ^<> select '../edit/portal/portal_layout_list.jsp' from xdummy;^
+52003^Stichwort^20^0^0^150^150^1^sql^50^0^0^^^^
+52004^Komponente^1^0^0^150^200^1^integer^200^0^13^<> select tid,name from systeminfo order by 2;^ ^^
+52005^Portale bearbeiten^100^0^0^140^80^1^char^255^0^18^ ^ ^<> select '../edit/portal/portal_config_list.jsp' from xdummy;^
+52006^Virtuelle Tabelle^5^0^0^150^200^1^integer^200^0^13^<> select tid,caption from rpta_resultset where 1=1 /* and systeminfo_id=<> */ order by 2;^^^
+52008^Schlüssel^15^0^0^150^80^1^sql^200^0^0^ ^^^
diff --git a/src-modules/module/portal/masken/52000_maske_system_bez.unl b/src-modules/module/portal/masken/52000_maske_system_bez.unl
new file mode 100644
index 0000000..3e33479
--- /dev/null
+++ b/src-modules/module/portal/masken/52000_maske_system_bez.unl
@@ -0,0 +1 @@
+52000^370^
diff --git a/src-modules/module/portal/masken/52000_masken_felder_bez.unl b/src-modules/module/portal/masken/52000_masken_felder_bez.unl
new file mode 100644
index 0000000..1124436
--- /dev/null
+++ b/src-modules/module/portal/masken/52000_masken_felder_bez.unl
@@ -0,0 +1,7 @@
+52000^52000^
+52000^52001^
+52000^52003^
+52000^52004^
+52000^52005^
+52000^52006^
+52000^52008^
diff --git a/src-modules/module/portal/masken/52000_maskeninfo.unl b/src-modules/module/portal/masken/52000_maskeninfo.unl
new file mode 100644
index 0000000..a012022
--- /dev/null
+++ b/src-modules/module/portal/masken/52000_maskeninfo.unl
@@ -0,0 +1,62 @@
+52000^Portale verwalten^--Autor: D. Quathamer\
+--Datum: 15.3.2024\
+--freemarker template\
+create temp table tmp_portal_config(\
+ tid INTEGER , \
+uniquename VARCHAR(255) not null, \
+caption VARCHAR(255) , \
+userinfo_id INTEGER , \
+print_maskeninfo_id INTEGER , \
+booklet_stylesheet VARCHAR(255) ,\
+layout_uniquename varchar(255),\
+layout_id integer,\
+id_param_name VARCHAR(255) ,\
+nextedit varchar(255)\
+);\
+insert into tmp_portal_config (tid,\
+ uniquename,\
+ caption,\
+ userinfo_id,\
+ print_maskeninfo_id,\
+ booklet_stylesheet,\
+-- id_param,\
+-- id_param_name,\
+ nextedit) \
+select tid,\
+ uniquename,\
+ caption,\
+ userinfo_id,\
+ print_maskeninfo_id,\
+ booklet_stylesheet,\
+-- id_param,\
+-- id_param_name\
+ ('../edit/portal/portal_config_edit.jsp|tid=' || C.tid)::varchar(255)\
+FROM portal_config C\
+where 1=1\
+/* and C.caption ilike '%<>%' */\
+/* and C.uniquename ilike '%<>%' */\
+;\
+\
+\
+\
+select \
+caption,\
+uniquename,\
+nextedit \
+\
+from tmp_portal_config\
+order by caption ,uniquename\
+;^XIL List\
+ drop_and_delete movable_columns sizable_columns horizontal_scrolling\
+ white_space_color=COLOR_WHITE fixed_columns=2\
+ min_heading_height=35\
+Column CID=0 heading_text="Name" center_heading\
+ row_selectable col_selectable heading_platform readonly\
+ width=50 text_size=100\
+Column CID=0 heading_text="Schlüssel" center_heading\
+ row_selectable col_selectable heading_platform readonly\
+ width=50 text_size=100\
+Column CID=1 heading_text="Bearbeiten" center_heading\
+ row_selectable col_selectable heading_platform readonly\
+ width=5 text_size=200\
+@@@^^^Portale und Inhalte verwalten.^drop table tmp_portal_config;^^1^440^360^0^1^ ^
diff --git a/src-modules/module/portal/masken/52000_sachgeb_maske_bez.unl b/src-modules/module/portal/masken/52000_sachgeb_maske_bez.unl
new file mode 100644
index 0000000..61e91e2
--- /dev/null
+++ b/src-modules/module/portal/masken/52000_sachgeb_maske_bez.unl
@@ -0,0 +1 @@
+381^52000^
diff --git a/src-modules/module/portal/schluesseltabellen/fm_templates.unl b/src-modules/module/portal/schluesseltabellen/fm_templates.unl
new file mode 100644
index 0000000..d99b9df
--- /dev/null
+++ b/src-modules/module/portal/schluesseltabellen/fm_templates.unl
@@ -0,0 +1,337 @@
+222^PORTAL-Makros^<#macro PORTAL_FUELLEN portal_config portal_elements portal_tabs>\
+ create temp table tmp_portal_config(\
+ tid INTEGER , \
+uniquename VARCHAR(255) not null, \
+caption VARCHAR(255) , \
+userinfo_id INTEGER , \
+print_maskeninfo_id INTEGER , \
+booklet_stylesheet VARCHAR(255) ,\
+layout_uniquename varchar(255),\
+layout_id integer,\
+id_param_name VARCHAR(255) \
+\
+) \
+;\
+\
+create temp table tmp_portal_element(\
+ tid INTEGER, \
+ element_type_uniquename varchar(255),\
+element_type_id INTEGER , \
+caption VARCHAR(255) , \
+uniquename VARCHAR(255),\
+onclick_event VARCHAR(255) , \
+description VARCHAR(255) , \
+open_modal_card_detail SMALLINT default 1 , \
+src_url VARCHAR(255) , \
+content_static TEXT , \
+content_maskeninfo_id INTEGER , \
+content_chart_uniquename VARCHAR(255) , \
+content_rpta_column_layout_uniquename VARCHAR(255) , \
+content_tablestylesheet VARCHAR(255) , \
+link_maskeninfo_id INTEGER , \
+link_chart_uniquename VARCHAR(255) , \
+link_tablestylesheet VARCHAR(255) , \
+active SMALLINT default 1 not null\
+\
+) \
+;\
+\
+create temp table tmp_portal_config2element(\
+ \
+portal_config_id INTEGER not null, \
+portal_element_id INTEGER not null, \
+portal_config_tab_id INTEGER , \
+sortnr INTEGER , \
+element_role_id INTEGER , \
+is_foldable INTEGER , \
+is_maximizable INTEGER , \
+min_width INTEGER , \
+height INTEGER , \
+active SMALLINT default 1 not null\
+) \
+;\
+\
+create temp table tmp_portal_config2layout(\
+ \
+portal_config_id INTEGER not null, \
+portal_layout_id INTEGER not null, \
+userinfo_id INTEGER , \
+active SMALLINT default 1 not null\
+) \
+;\
+\
+create temp table tmp_portal_config_tab(\
+ \
+portal_config_id INTEGER, \
+caption VARCHAR(255) , \
+print_maskeninfo_id INTEGER , \
+booklet_stylesheet VARCHAR(255) , \
+sortnr SMALLINT default 0 , \
+tab_id VARCHAR(255) , \
+target_url VARCHAR(255) , \
+target_window VARCHAR(255) , \
+target_div VARCHAR(255) \
+\
+) \
+;\
+\
+insert into tmp_portal_config(uniquename,\
+ caption,\
+-- userinfo_id,\
+ print_maskeninfo_id,\
+ booklet_stylesheet,\
+ id_param_name)\
+select '${portal_config.uniquename}',\
+'${portal_config.caption}',\
+<#if portal_config.print_maskeninfo_id?exists> ${portal_config.print_maskeninfo_id} <#else> null::integer#if>,\
+<#if portal_config.booklet_stylesheet?exists> '${portal_config.booklet_stylesheet}' <#else> null::varchar(255) #if>,\
+<#if portal_config.id_param_name?exists> '${portal_config.id_param_name}' <#else> null::varchar(255) #if>\
+from xdummy;\
+\
+update portal_config set caption='${portal_config.caption}'\
+<#if portal_config.print_maskeninfo_id?exists>, print_maskeninfo_id=${portal_config.print_maskeninfo_id} #if>\
+<#if portal_config.booklet_stylesheet?exists>, booklet_stylesheet='${portal_config.booklet_stylesheet}' #if>\
+<#if portal_config.id_param_name?exists>, id_param_name='${portal_config.id_param_name}' #if>\
+where uniquename='${portal_config.uniquename}';\
+\
+delete from tmp_portal_config where uniquename in (select uniquename\
+from portal_config);\
+\
+insert into portal_config(uniquename,\
+ caption,\
+-- userinfo_id,\
+ print_maskeninfo_id,\
+ booklet_stylesheet,\
+ id_param_name)\
+ select uniquename,\
+ caption,\
+-- userinfo_id,\
+ print_maskeninfo_id,\
+ booklet_stylesheet,\
+ id_param_name\
+ from tmp_portal_config;\
+ \
+\
+--Zuordnung zu Layout:\
+\
+insert into tmp_portal_config2layout(portal_config_id,\
+ portal_layout_id,\
+ userinfo_id,\
+ active)\
+ select C.tid,\
+ L.tid as layout_id,\
+ null::integer,\
+ 1 as active\
+ from portal_config C, portal_layout L\
+ where L.uniquename='${portal_config.layout_uniquename}'\
+ and C.uniquename='${portal_config.uniquename}';\
+\
+delete from portal_config2layout\
+where (portal_config_id,portal_layout_id) in (\
+select portal_config_id,portal_layout_id\
+from tmp_portal_config2layout);\
+\
+insert into portal_config2layout(portal_config_id,\
+ portal_layout_id,\
+ userinfo_id,\
+ active)\
+ select portal_config_id,\
+ portal_layout_id,\
+ userinfo_id,\
+ active\
+ from tmp_portal_config2layout;\
+ \
+ \
+<#foreach elem in portal_elements>\
+insert into tmp_portal_element(\
+element_type_id,\
+ caption,\
+ uniquename,\
+ onclick_event,\
+ description,\
+ open_modal_card_detail,\
+ src_url,\
+ content_static,\
+ content_maskeninfo_id,\
+ content_chart_uniquename,\
+ content_rpta_column_layout_uniquename,\
+ content_tablestylesheet,\
+ link_maskeninfo_id,\
+ link_chart_uniquename,\
+ link_tablestylesheet,\
+ active)\
+select T.tid,\
+'${elem.caption}',\
+'${elem.uniquename}',\
+<#if elem.onclick_event?exists> '${elem.onclick_event}' <#else> null::varchar(255)#if>,\
+<#if elem.description?exists> '${elem.description}' <#else> null::varchar(255)#if>,\
+<#if elem.open_modal_card_detail?exists> 1 <#else> 0#if>,\
+<#if elem.src_url?exists> '${elem.src_url}' <#else> null::varchar(255)#if>,\
+<#if elem.content_static?exists> '${elem.content_static?replace("'","''")}' <#else> null::varchar(255)#if>,\
+<#if elem.content_maskeninfo_id?exists> ${elem.content_maskeninfo_id} <#else> null::integer#if>,\
+<#if elem.content_chart_uniquename?exists> '${elem.content_chart_uniquename}' <#else> null::varchar(255)#if>,\
+<#if elem.content_rpta_column_layout_uniquename?exists> '${elem.content_rpta_column_layout_uniquename}' <#else> null::varchar(255)#if>,\
+<#if elem.content_tablestylesheet?exists> '${elem.content_tablestylesheet}' <#else> null::varchar(255)#if>,\
+<#if elem.link_maskeninfo_id?exists> link_maskeninfo_id <#else> null::integer#if>,\
+<#if elem.link_chart_uniquename?exists> '${elem.link_chart_uniquename}' <#else> null::varchar(255)#if>,\
+<#if elem.link_tablestylesheet?exists> '${elem.link_tablestylesheet}' <#else> null::varchar(255)#if>,\
+1 as active\
+from portal_element_type T\
+where T.uniquename= '${elem.element_type}';\
+\
+\
+#foreach>\
+\
+update portal_element E set caption=T.caption,\
+element_type_id=T.element_type_id,\
+ onclick_event=T.onclick_event,\
+ description=T.description,\
+ open_modal_card_detail=T.open_modal_card_detail,\
+ src_url=T.src_url,\
+ content_static=T.content_static,\
+ content_maskeninfo_id=T.content_maskeninfo_id,\
+ content_chart_uniquename=T.content_chart_uniquename,\
+ content_rpta_column_layout_uniquename=T.content_rpta_column_layout_uniquename,\
+ content_tablestylesheet=T.content_tablestylesheet,\
+ link_maskeninfo_id=T.link_maskeninfo_id,\
+ link_chart_uniquename=T.link_chart_uniquename,\
+ link_tablestylesheet=T.link_tablestylesheet,\
+ active=T.active\
+from tmp_portal_element T\
+ where T.uniquename=E.uniquename\
+ and E.uniquename in (select T2.uniquename from tmp_portal_element T2);\
+\
+delete from tmp_portal_element where uniquename in (select uniquename\
+from portal_element);\
+\
+insert into portal_element(\
+element_type_id,\
+ caption,\
+ uniquename,\
+ onclick_event,\
+ description,\
+ open_modal_card_detail,\
+ src_url,\
+ content_static,\
+ content_maskeninfo_id,\
+ content_chart_uniquename,\
+ content_rpta_column_layout_uniquename,\
+ content_tablestylesheet,\
+ link_maskeninfo_id,\
+ link_chart_uniquename,\
+ link_tablestylesheet,\
+ active)\
+ select element_type_id,\
+ caption,\
+ uniquename,\
+ onclick_event,\
+ description,\
+ open_modal_card_detail,\
+ src_url,\
+ content_static,\
+ content_maskeninfo_id,\
+ content_chart_uniquename,\
+ content_rpta_column_layout_uniquename,\
+ content_tablestylesheet,\
+ link_maskeninfo_id,\
+ link_chart_uniquename,\
+ link_tablestylesheet,\
+ active\
+ from tmp_portal_element;\
+\
+ \
+ delete from portal_config2element where \
+ portal_config_id =(select T.tid from portal_config T where T.uniquename='${portal_config.uniquename}');\
+\
+ <#assign sortnr=0 />\
+<#foreach elem in portal_elements>\
+ <#assign sortnr=sortnr +1 />\
+ \
+ insert into portal_config2element(\
+ portal_config_id,\
+ portal_element_id,\
+ --portal_config_tab_id,\
+ sortnr,\
+ element_role_id,\
+ is_foldable,\
+ is_maximizable,\
+ min_width,\
+ height,\
+ active)\
+select T.tid as portal_config_id,\
+ E.tid as portal_element_id,\
+ --portal_config_tab_id,\
+ ${sortnr} as sortnr,\
+ R.tid as element_role_id,\
+ <#if elem.is_foldable?exists> 1 <#else> 0#if> as is_foldable,\
+ <#if elem.is_maximizable?exists> 1 <#else> 0#if> as is_maximizable,\
+ <#if elem.min_width?exists> ${elem.min_width} <#else> null::integer #if> as min_width,\
+ <#if elem.height?exists> ${elem.height} <#else> null::integer #if> as height,\
+ 1 as active\
+ from portal_config T, portal_element_role R, portal_element E\
+ where T.uniquename='${portal_config.uniquename}'\
+ and R.uniquename='${elem.element_role}'\
+ and E.uniquename='${elem.uniquename}';\
+#foreach> \
+\
+\
+--TABS:\
+<#assign sortnr=0 />\
+\
+<#foreach elem in portal_tabs>\
+<#assign sortnr=sortnr+1 />\
+insert into tmp_portal_config_tab(\
+portal_config_id,\
+ caption,\
+-- print_maskeninfo_id,\
+-- booklet_stylesheet,\
+ sortnr,\
+ tab_id,\
+ target_url,\
+ target_window,\
+ target_div)\
+select T.tid,\
+'${elem.caption}',\
+${sortnr},\
+'${elem.tab_id}',\
+<#if elem.target_url?exists> '${elem.target_url}' <#else> null::varchar(255)#if>,\
+<#if portal_config.tab_target_window?exists> '${portal_config.tab_target_window}' <#else> null::varchar(255)#if>,\
+<#if portal_config.target_div?exists> '${portal_config.target_div}' <#else> null::varchar(255)#if>\
+\
+from portal_config T\
+where T.uniquename= '${portal_config.uniquename}';\
+\
+\
+#foreach>\
+\
+delete from portal_config_tab where \
+ portal_config_id =(select T.tid from portal_config T where T.uniquename='${portal_config.uniquename}');\
+\
+ insert into portal_config_tab(\
+portal_config_id,\
+ caption,\
+-- print_maskeninfo_id,\
+-- booklet_stylesheet,\
+ sortnr,\
+ tab_id,\
+ target_url,\
+ target_window,\
+ target_div)\
+ select portal_config_id,\
+ caption,\
+-- print_maskeninfo_id,\
+-- booklet_stylesheet,\
+ sortnr,\
+ tab_id,\
+ target_url,\
+ target_window,\
+ target_div\
+ from tmp_portal_config_tab;\
+ \
+\
+drop table tmp_portal_config;\
+drop table tmp_portal_element;\
+drop table tmp_portal_config2element;\
+drop table tmp_portal_config2layout;\
+drop table tmp_portal_config_tab;\
+ #macro>^Makros des Portal-Moduls^^1^
diff --git a/src-modules/module/portal/schluesseltabellen/fm_templates_fuellen.sql b/src-modules/module/portal/schluesseltabellen/fm_templates_fuellen.sql
new file mode 100644
index 0000000..17b375a
--- /dev/null
+++ b/src-modules/module/portal/schluesseltabellen/fm_templates_fuellen.sql
@@ -0,0 +1,15 @@
+
+delete from fm_templates where id in (select id from tmp_templates);
+
+insert into fm_templates(id,
+ content,
+ description,
+ comment,
+ version) select id,
+ content,
+ description,
+ comment,
+ version from tmp_templates;
+
+drop table tmp_templates;
+
diff --git a/src-modules/module/portal/schluesseltabellen/fm_templates_unload.x b/src-modules/module/portal/schluesseltabellen/fm_templates_unload.x
new file mode 100755
index 0000000..5d4eb2b
--- /dev/null
+++ b/src-modules/module/portal/schluesseltabellen/fm_templates_unload.x
@@ -0,0 +1,11 @@
+#!/bin/bash
+#löscht alle nicht-kern-templates und entlädt die Tabelle sortiert ins Rohdaten Verzeichnis (für git-diff).
+
+
+
+
+SX_CLIENT=jdbc
+export SX_CLIENT
+#man_catalogue
+DOQUERY "select * from fm_templates where id in ('PORTAL-Makros')" false $DBDELIMITER ./fm_templates.unl txt
+
diff --git a/src-modules/module/portal/schluesseltabellen/fm_templates_update.x b/src-modules/module/portal/schluesseltabellen/fm_templates_update.x
new file mode 100755
index 0000000..e2bc6db
--- /dev/null
+++ b/src-modules/module/portal/schluesseltabellen/fm_templates_update.x
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+DOQUERY "create table tmp_templates(tid integer,
+ id char(200) not null,
+content text not null,
+description char(200) ,
+comment char(200) ,
+version integer default 1
+
+)
+;"
+
+sx_auto_upload_table.x tmp_templates ./fm_templates.unl
+
+DOSQL fm_templates_fuellen.sql
+
+
diff --git a/src-modules/module/portal/schluesseltabellen/portal_config_fuellen_gang.sql b/src-modules/module/portal/schluesseltabellen/portal_config_fuellen_gang.sql
new file mode 100644
index 0000000..cfb2965
--- /dev/null
+++ b/src-modules/module/portal/schluesseltabellen/portal_config_fuellen_gang.sql
@@ -0,0 +1,64 @@
+--freemarker template
+<#include "PORTAL-Makros"/>
+
+<#assign portal_config =
+{"uniquename":"portal_config_gang_bearbeiten",
+"caption":"Studiengang bearbeiten",
+"print_maskeninfo_id":"25100",
+"layout_uniquename":"COLUMNS_2",
+"id_param_name":"tid",
+"tab_target_window":"parent.editPane"}
+ />
+
+
+<#assign portal_elements = [
+{"element_type":"STATIC_HTML", "caption":"GANG Kopfzeile",
+"uniquename":"GANG_HEADER", "src_url":"",
+ "content_static":"GANG Studiengangsverwaltung",
+ "element_role":"HEADER"},
+ {"element_type":"STATIC_HTML", "caption":"GANG Menue",
+"uniquename":"GANG_MENU", "src_url":"../../edit/gang/menue.jsp",
+ "content_static":"menü",
+ "element_role":"CONTENT",
+ "min_width":"4",
+ "height":"400"},
+ {"element_type":"IFRAME", "caption":"GANG Content",
+"uniquename":"GANG_CONTENT", "src_url":"../../edit/gang/studiengang_edit.jsp",
+ "content_static":"Inhalt",
+ "element_role":"CONTENT",
+ "min_width":"8",
+ "height":"400"},
+{"element_type":"STATIC_HTML", "caption":"GANG Fusszeile",
+"uniquename":"SX_FOOTER", "src_url":"../../edit/gang/bottombar.htm",
+"content_static":"
+",
+ "element_role":"FOOTER"}
+] />
+
+
+<#assign portal_tabs = [
+{"caption":"Studiengang", "tab_id":"Linkstudiengang", "target_url":"../../edit/gang/studiengang_edit.jsp"},
+{"caption":"Zuordnung", "tab_id":"Linkzuordnung", "target_url":"../../edit/gang/zuordnung_edit.jsp"},
+{"caption":"Allgemein", "tab_id":"Linkallgemein", "target_url":"../../edit/gang/allgemein_edit.jsp"},
+{"caption":"Bes. Studienform", "tab_id":"Linkstudienformen", "target_url":"../../edit/gang/studienformen_edit.jsp"},
+{"caption":"Zulassung", "tab_id":"Linkzulassung", "target_url":"../../edit/gang/zulassung_edit.jsp"},
+{"caption":"Zulassungszahlen", "tab_id":"Linkzulassungszahlen", "target_url":"../../edit/gang/zulassungszahlen_edit.jsp"},
+{"caption":"Kapazität", "tab_id":"Linkkapazitaet", "target_url":"../../edit/gang/kapazitaet_edit.jsp"},
+{"caption":"Prüfungsrechtliches", "tab_id":"Linkpruefung", "target_url":"../../edit/gang/pruefung_edit.jsp"},
+{"caption":"Initialisierung", "tab_id":"Linkinitialisierung", "target_url":"../../edit/gang/initialisierung_edit.jsp"},
+{"caption":"Akkreditierung", "tab_id":"Linkakkreditierung", "target_url":"../../edit/gang/akkreditierung_edit.jsp"},
+{"caption":"Qualitätssicherung", "tab_id":"Linkevaluation", "target_url":"../../edit/gang/studiengang_edit.jsp"},
+{"caption":"Einstellung", "tab_id":"Linkabwicklung", "target_url":"../../edit/gang/abwicklung_edit.jsp"}
+] />
+
+<@PORTAL_FUELLEN portal_config=portal_config portal_elements=portal_elements portal_tabs=portal_tabs />
+
+
+
+
+
diff --git a/src-modules/module/portal/schluesseltabellen/portal_config_fuellen_sample_superx.sql b/src-modules/module/portal/schluesseltabellen/portal_config_fuellen_sample_superx.sql
new file mode 100644
index 0000000..dc611ad
--- /dev/null
+++ b/src-modules/module/portal/schluesseltabellen/portal_config_fuellen_sample_superx.sql
@@ -0,0 +1,60 @@
+--freemarker template
+<#include "PORTAL-Makros"/>
+
+<#assign portal_config =
+{"uniquename":"portal_config_sample_superx",
+"caption":"SuperX-Beispielportal",
+"print_maskeninfo_id":"25100",
+"layout_uniquename":"SUPERX_CARD",
+"id_param_name":"",
+"tab_target_window":""}
+ />
+
+
+<#assign portal_elements = [
+{"element_type":"STATIC_HTML", "caption":"SuperX Kopfzeile",
+"uniquename":"SX_HEADER", "src_url":"",
+ "content_static":"SuperX-Beispielportal Header",
+ "element_role":"HEADER",
+ "min_width":"100",
+ "height":"40"},
+{"element_type":"STATIC_HTML", "caption":"SuperX Content Beispielinhalt",
+"uniquename":"SX_CONTENT1", "src_url":"",
+ "content_static":"Dieses Portal",
+ "element_role":"CONTENT",
+ "min_width":"33",
+ "height":"60"},
+{"element_type":"STATIC_HTML", "caption":"SuperX Content Beispielinhalt 2",
+"uniquename":"SX_CONTENT2", "src_url":"",
+ "content_static":"ist nur",
+ "element_role":"CONTENT",
+ "min_width":"33",
+ "height":"60"},
+{"element_type":"STATIC_HTML", "caption":"SuperX Content Beispielinhalt 3",
+"uniquename":"SX_CONTENT3", "src_url":"",
+ "content_static":"ein Muster",
+ "element_role":"CONTENT",
+ "min_width":"33",
+ "height":"60"},
+{"element_type":"STATIC_HTML", "caption":"SuperX Fusszeile",
+"uniquename":"SX_FOOTER",
+"content_static":"
+",
+ "element_role":"FOOTER",
+ "min_width":"100",
+ "height":"40"}
+] />
+
+
+<#assign portal_tabs = [
+] />
+
+<@PORTAL_FUELLEN portal_config=portal_config portal_elements=portal_elements portal_tabs=portal_tabs />
+
+
+
diff --git a/src-modules/module/portal/schluesseltabellen/portal_element_role.unl b/src-modules/module/portal/schluesseltabellen/portal_element_role.unl
new file mode 100644
index 0000000..1b52fe9
--- /dev/null
+++ b/src-modules/module/portal/schluesseltabellen/portal_element_role.unl
@@ -0,0 +1,8 @@
+1^CONTENT^Inhalt^1^
+2^FOOTER^Fusszeile^0^
+3^HEADER^Kopfzeile^0^
+4^TAB_BOTTOM^Reiter (unten)^0^
+5^TAB_TOP^Reiter (oben)^0^
+6^SIDEBAR_LEFT^Sidebar-links^0^
+7^SIDEBAR_RIGHT^Sidebar-rechts^0^
+8^MENU^Menüzeile^1^
diff --git a/src-modules/module/portal/schluesseltabellen/portal_element_type.unl b/src-modules/module/portal/schluesseltabellen/portal_element_type.unl
new file mode 100644
index 0000000..002a3e7
--- /dev/null
+++ b/src-modules/module/portal/schluesseltabellen/portal_element_type.unl
@@ -0,0 +1,6 @@
+1^STATIC_HTML^Statisches HTML^
+2^STATIC_WIKI^Statisches Wiki^
+3^MASKE^Maske^
+4^DBFORM^DB-Form^
+5^VIZ_CHART^VIZ-Grafik^
+6^IFRAME^Inline-Frame^
diff --git a/src-modules/module/portal/schluesseltabellen/portal_layout_fuellen.sql b/src-modules/module/portal/schluesseltabellen/portal_layout_fuellen.sql
new file mode 100644
index 0000000..fdf631b
--- /dev/null
+++ b/src-modules/module/portal/schluesseltabellen/portal_layout_fuellen.sql
@@ -0,0 +1,82 @@
+--freemarker template
+<#assign portal_layouts = [
+{"uniquename":"FRAMESET_GANG",
+"caption":"GANG-Portal mit Frame-Layout"},
+{"uniquename":"CARD_V",
+"caption":"Cards (vertikal)"},
+{"uniquename":"FLEXBOX_GRID_3COLS",
+"caption":"Flexbox-Grid (dreispaltig)",
+"fixed_grid_column_count","3"},
+{"uniquename":"FLEXBOX_GRID_2COLS",
+"caption":"Flexbox-Grid (zweispaltig)",
+"fixed_grid_column_count","2"},
+{"uniquename":"FLEXBOX_GRID",
+"caption":"Flexbox-Grid (responsiv)"},
+{"uniquename":"COLUMNS_2",
+"caption":"Inhalt zweispaltig",
+"fixed_grid_column_count","2"}
+
+]
+ />
+
+ create temp table tmp_portal_layout(
+ tid SERIAL not null,
+caption VARCHAR(255) ,
+uniquename VARCHAR(255) ,
+grid_type VARCHAR(255) ,
+fixed_grid_column_count SMALLINT,
+css_url VARCHAR(255) ,
+js_url VARCHAR(255) ,
+onload_handler VARCHAR(255)
+)
+;
+<#foreach elem in portal_layouts>
+insert into tmp_portal_layout(caption,
+ uniquename,
+ grid_type,
+ fixed_grid_column_count,
+ css_url,
+ js_url,
+ onload_handler)
+ select
+ '${elem.caption}',
+'${elem.uniquename}',
+<#if elem.grid_type?exists> '${elem.grid_type}' <#else> null::varchar(255)#if>,
+<#if elem.fixed_grid_column_count?exists> ${elem.fixed_grid_column_count} <#else> null::integer#if>,
+<#if elem.css_url?exists> '${elem.css_url}' <#else> null::varchar(255)#if>,
+<#if elem.js_url?exists> '${elem.js_url}' <#else> null::varchar(255)#if>,
+<#if elem.onload_handler?exists> '${elem.onload_handler}' <#else> null::varchar(255)#if>
+from xdummy;
+
+#foreach>
+
+update portal_layout L set caption=T.caption,
+grid_type=T.grid_type,
+ fixed_grid_column_count=T.fixed_grid_column_count,
+ css_url=T.css_url,
+ js_url=T.js_url,
+ onload_handler=T.onload_handler
+from tmp_portal_layout T
+ where L.uniquename in (select T2.uniquename from tmp_portal_layout T2);
+
+delete from tmp_portal_layout where uniquename in (select uniquename
+from portal_layout);
+
+insert into portal_layout(caption,
+ uniquename,
+ grid_type,
+ fixed_grid_column_count,
+ css_url,
+ js_url,
+ onload_handler)
+ select caption,
+ uniquename,
+ grid_type,
+ fixed_grid_column_count,
+ css_url,
+ js_url,
+ onload_handler
+from tmp_portal_layout;
+
+drop table tmp_portal_layout;
+
diff --git a/src/de/superx/portal/PortalConfig.java b/src/de/superx/portal/PortalConfig.java
new file mode 100644
index 0000000..1ee36a6
--- /dev/null
+++ b/src/de/superx/portal/PortalConfig.java
@@ -0,0 +1,123 @@
+package de.superx.portal;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.LinkedList;
+import java.util.List;
+
+public class PortalConfig {
+ public PortalConfig(String uniquename) {
+ super();
+ this.uniquename = uniquename;
+ }
+ List elementList = new LinkedList();
+
+ String uniquename;
+ int configTid;
+ String configCaption;
+ String idParamName;
+ String layoutUniquename;
+ public String PortalElementsSql;
+ public String PortalConfigSql;
+
+ public int getConfigTid() {
+ return configTid;
+ }
+ public void setConfigTid(int configTid) {
+ this.configTid = configTid;
+ }
+ public String getConfigCaption() {
+ return configCaption;
+ }
+ public void setConfigCaption(String configCaption) {
+ this.configCaption = configCaption;
+ }
+ public String getIdParamName() {
+ return idParamName;
+ }
+ public void setIdParamName(String idParamName) {
+ this.idParamName = idParamName;
+ }
+ public String getLayoutUniquename() {
+ return layoutUniquename;
+ }
+ public void setLayoutUniquename(String layoutUniquename) {
+ this.layoutUniquename = layoutUniquename;
+ }
+ public String getPortalConfigSql() {
+ return PortalConfigSql;
+ }
+ public void setPortalConfigSql(String portletLayoutUniquename ) {
+ String sql="select C.tid as config_tid,C.caption as config_caption,C.id_param_name,L.uniquename as layout_uniquename";
+ sql+=" from portal_config C, portal_config2layout CL, portal_layout L";
+ sql+=" where C.uniquename='"+this.uniquename+"'";
+ sql+=" and C.tid=CL.portal_config_id and L.tid=CL.portal_layout_id";
+ sql+= " and L.uniquename='"+portletLayoutUniquename+"'";
+
+ PortalConfigSql = sql;
+ }
+ public void setPortalConfigAttributesFromSQL(ResultSet rs) throws SQLException
+ {
+ while (rs.next())
+ {
+ if(rs.getObject(1) !=null)
+ {
+ configTid=(int) rs.getObject(1);
+ configCaption=rs.getString(2);
+ idParamName=rs.getString(3);
+ layoutUniquename=rs.getString(4);
+ }
+ }
+ }
+ public String getPortalElementsSql() {
+ String sql="select T.uniquename as element_type_uniquename,R.uniquename as element_role_uniquename,";
+ sql+="E.content_static,E.src_url,";
+ sql+="E.caption as element_caption,E.uniquename as element_uniquename,";
+ sql+= "EC.tid as portal_element2config_tid,";
+ sql+= "EC.min_width,EC.height,EC.sortnr,EC.is_foldable,EC.is_maximizable";
+ sql+=" from portal_element_type T, portal_config2element EC, portal_config C,portal_element_role R, portal_element E";
+ sql+=" where T.tid=E.element_type_id and C.tid=EC.portal_config_id and R.tid=EC.element_role_id ";
+ sql+=" and E.tid=EC.portal_element_id";
+ sql+=" and E.active=1 and EC.active=1";
+ sql+=" and C.uniquename='"+this.uniquename+"'";
+ sql+=" order by EC.sortnr,E.caption";
+ return sql;
+ }
+ public void setPortalConfigElementsFromSQL(ResultSet rs) throws SQLException
+ {
+ while (rs.next())
+ {
+ if(rs.getObject(1) !=null && rs.getObject(1) != null)
+ {
+ PortalElement myElem=new PortalElement(rs.getString(6));
+ myElem.setElementTypeUniquename(rs.getString(1));
+ myElem.setElementRoleUniquename(rs.getString(2));
+ myElem.setContentStatic(rs.getString(3));
+ myElem.setSrcUrl(rs.getString(4));
+ myElem.setElementCaption(rs.getString(5));
+ myElem.setMinWidth(getIntFromRs(rs.getObject(8),100));
+ myElem.setHeight(getIntFromRs(rs.getObject(9),80));
+ myElem.setSortnr(getIntFromRs(rs.getObject(10),0));
+ myElem.setFoldable( (rs.getObject(11)==null || getIntFromRs(rs.getObject(11),0)==0 ?false:true));
+ myElem.setIs_maximizable( (rs.getObject(12)==null || getIntFromRs(rs.getObject(12),0)==0 ?false:true));
+
+ elementList.add(myElem);
+ }
+ }
+ }
+ public List getElementList()
+ {
+ return elementList;
+ }
+ public static int getIntFromRs(Object o,int defaultWert)
+ {
+ int ret=defaultWert;
+ if(o!=null && o instanceof Integer)
+ {
+ ret=(int) o;
+ }
+
+ return ret;
+ }
+
+}
diff --git a/src/de/superx/portal/PortalElement.java b/src/de/superx/portal/PortalElement.java
new file mode 100644
index 0000000..cc22e2a
--- /dev/null
+++ b/src/de/superx/portal/PortalElement.java
@@ -0,0 +1,96 @@
+package de.superx.portal;
+
+public class PortalElement {
+ public PortalElement(String elementUniquename) {
+ super();
+ this.elementUniquename = elementUniquename;
+ }
+ String elementRoleUniquename;
+ String elementCaption;
+ String elementUniquename;
+ String contentStatic;
+ String srcUrl;
+ int portalElement2configTid;
+ int minWidth;
+ int height;
+ int sortnr;
+ boolean isFoldable;
+ boolean is_maximizable;
+ String elementTypeUniquename;
+
+ public String getElementTypeUniquename() {
+ return elementTypeUniquename;
+ }
+ public void setElementTypeUniquename(String elementTypeUniquename) {
+ this.elementTypeUniquename = elementTypeUniquename;
+ }
+ public String getElementRoleUniquename() {
+ return elementRoleUniquename;
+ }
+ public void setElementRoleUniquename(String elementRoleUniquename) {
+ this.elementRoleUniquename = elementRoleUniquename;
+ }
+ public String getElementCaption() {
+ return elementCaption;
+ }
+ public void setElementCaption(String elementCaption) {
+ this.elementCaption = elementCaption;
+ }
+ public String getElementUniquename() {
+ return elementUniquename;
+ }
+ public void setElementUniquename(String elementUniquename) {
+ this.elementUniquename = elementUniquename;
+ }
+ public String getContentStatic() {
+ return contentStatic;
+ }
+ public void setContentStatic(String contentStatic) {
+ this.contentStatic = contentStatic;
+ }
+ public String getSrcUrl() {
+ return srcUrl;
+ }
+ public void setSrcUrl(String srcUrl) {
+ this.srcUrl = srcUrl;
+ }
+ public int getPortalElement2configTid() {
+ return portalElement2configTid;
+ }
+ public void setPortalElement2configTid(int portalElement2configTid) {
+ this.portalElement2configTid = portalElement2configTid;
+ }
+ public int getMinWidth() {
+ return minWidth;
+ }
+ public void setMinWidth(int minWidth) {
+ this.minWidth = minWidth;
+ }
+ public int getHeight() {
+ return height;
+ }
+ public void setHeight(int height) {
+ this.height = height;
+ }
+ public int getSortnr() {
+ return sortnr;
+ }
+ public void setSortnr(int sortnr) {
+ this.sortnr = sortnr;
+ }
+ public boolean isFoldable() {
+ return isFoldable;
+ }
+ public void setFoldable(boolean isFoldable) {
+ this.isFoldable = isFoldable;
+ }
+ public boolean isMaximizable() {
+ return is_maximizable;
+ }
+ public void setIs_maximizable(boolean is_maximizable) {
+ this.is_maximizable = is_maximizable;
+ }
+
+
+
+}
diff --git a/superx/WEB-INF/conf/edustore/db/bin/SQL_ENV_portal.sam b/superx/WEB-INF/conf/edustore/db/bin/SQL_ENV_portal.sam
new file mode 100644
index 0000000..334e36e
--- /dev/null
+++ b/superx/WEB-INF/conf/edustore/db/bin/SQL_ENV_portal.sam
@@ -0,0 +1,16 @@
+#Beispielumgebung für das PORTAL-Modul:
+
+#SUPERX_MODULE=$SUPERX_DIR/db/module
+#SUPERX_ROHDATEN=rohdaten
+
+PORTAL_PFAD=$SUPERX_MODULE/portal; export PORTAL_PFAD
+PORTAL_ERRORDAT=$PORTAL_PFAD/portal_update.err; export PORTAL_ERRORDAT
+#Hier stehen die Rohdaten (im Unterverzeichnis unl)
+PORTAL_LOAD_PFAD=$PORTAL_PFAD/$SUPERX_ROHDATEN; export PORTAL_LOAD_PFAD
+PORTAL_ERRORMAIL=$ERRORMAIL; export PORTAL_ERRORMAIL
+PORTAL_LOGMAIL=$LOGMAIL; export PORTAL_LOGMAIL
+
+PATH=$PORTAL_PFAD/bin:$PATH
+export PATH
+
+
diff --git a/superx/WEB-INF/lib/spring-context-indexer-6.2.19.jar b/superx/WEB-INF/lib/spring-context-indexer-6.2.19.jar
new file mode 100644
index 0000000..6b2bbdc
Binary files /dev/null and b/superx/WEB-INF/lib/spring-context-indexer-6.2.19.jar differ
diff --git a/superx/WEB-INF/lib/superx-portal.jar b/superx/WEB-INF/lib/superx-portal.jar
new file mode 100644
index 0000000..cb74242
Binary files /dev/null and b/superx/WEB-INF/lib/superx-portal.jar differ