Dev #7

Merged
foefl merged 74 commits from dev into main 2026-07-31 14:19:01 +00:00
Showing only changes of commit 393e3ba39b - Show all commits
+109 -19
View File
@@ -2947,6 +2947,14 @@ class Page_InitRecCompany(QWidget):
header_layout.addWidget(self.comp_profile_btn) header_layout.addWidget(self.comp_profile_btn)
vert_layout.addWidget(header_container) vert_layout.addWidget(header_container)
# --- BANNER ---
self.info_banners_container = QWidget()
self.info_banners: list[InfoBanner] = []
self.info_banners_layout = QVBoxLayout(self.info_banners_container)
self.info_banners_layout.setContentsMargins(0, 0, 0, 0)
self.info_banners_layout.setSpacing(6)
header_layout.addWidget(self.info_banners_container)
# --- MAIN CONTENT --- # --- MAIN CONTENT ---
container = QWidget() container = QWidget()
# SCROLL AREA # SCROLL AREA
@@ -2975,7 +2983,7 @@ class Page_InitRecCompany(QWidget):
self.auto_form = AutoForm(auto_form_state) self.auto_form = AutoForm(auto_form_state)
container_layout.addWidget(self.auto_form) container_layout.addWidget(self.auto_form)
self.auto_form.update_triggered.connect(lambda: self.update_main_page.emit()) self.auto_form.update_triggered.connect(lambda: self.update_main_page.emit())
self.auto_form.update_triggered.connect(self._enable_company_profile) self.auto_form.update_triggered.connect(self._auto_form_updated)
container_layout.addSpacing(15) container_layout.addSpacing(15)
@@ -2988,9 +2996,35 @@ class Page_InitRecCompany(QWidget):
QLineEdit, search_widget.company_widgets["ma_unternehmensname"] QLineEdit, search_widget.company_widgets["ma_unternehmensname"]
) )
def _enable_company_profile(self) -> None: def _clear_info_banners(self) -> None:
while self.info_banners:
banner = self.info_banners[0]
self.info_banners_layout.removeWidget(banner)
self.info_banners.remove(banner)
banner.deleteLater()
def _add_info_banner(
self,
text: str,
button_text: str,
button_func: Callable[[], None] | None = None,
) -> None:
if button_text and button_func is None:
raise ValueError("Can not add button without calling function")
banner = InfoBanner(
text=text,
button_text=button_text,
)
if button_func is not None:
banner.btn_clicked.connect(button_func)
self.info_banners.append(banner)
self.info_banners_layout.addWidget(banner)
def _auto_form_updated(self) -> None:
self._sync_GUI_to_state() self._sync_GUI_to_state()
self._sync_state_to_GUI("comp_profile") self._sync_state_to_GUI("comp_profile")
self._sync_state_to_GUI("banners")
def _request_company_profile(self) -> None: def _request_company_profile(self) -> None:
assert self.STATE.un_id is not None, ( assert self.STATE.un_id is not None, (
@@ -3008,7 +3042,7 @@ class Page_InitRecCompany(QWidget):
def _sync_state_to_GUI( def _sync_state_to_GUI(
self, self,
section: Literal["auto_form", "comp_profile"] | None, section: Literal["auto_form", "comp_profile", "banners"] | None,
) -> None: ) -> None:
if section is None or section == "auto_form": if section is None or section == "auto_form":
auto_form_state = AutoForm_State( auto_form_state = AutoForm_State(
@@ -3026,6 +3060,14 @@ class Page_InitRecCompany(QWidget):
else: else:
self.comp_profile_btn.setEnabled(True) self.comp_profile_btn.setEnabled(True)
if section is None or section == "banners":
self._clear_info_banners()
if self.STATE.un_id is None:
self._add_info_banner(
text="⚠️ Dieser Eintrag ist noch nicht gespeichert.",
button_text="",
)
def _sync_GUI_to_state(self) -> None: def _sync_GUI_to_state(self) -> None:
auto_form_state = self.auto_form.get_state() auto_form_state = self.auto_form.get_state()
self.STATE.un_id = auto_form_state.rec_id self.STATE.un_id = auto_form_state.rec_id
@@ -3102,6 +3144,14 @@ class Page_InitRecPerson(QWidget):
header_layout.addWidget(title) header_layout.addWidget(title)
vert_layout.addWidget(header_container) vert_layout.addWidget(header_container)
# --- BANNER ---
self.info_banners_container = QWidget()
self.info_banners: list[InfoBanner] = []
self.info_banners_layout = QVBoxLayout(self.info_banners_container)
self.info_banners_layout.setContentsMargins(0, 0, 0, 0)
self.info_banners_layout.setSpacing(6)
header_layout.addWidget(self.info_banners_container)
# --- MAIN CONTENT --- # --- MAIN CONTENT ---
container = QWidget() container = QWidget()
# SCROLL AREA # SCROLL AREA
@@ -3130,6 +3180,7 @@ class Page_InitRecPerson(QWidget):
self.auto_form = AutoForm(auto_form_state) self.auto_form = AutoForm(auto_form_state)
container_layout.addWidget(self.auto_form) container_layout.addWidget(self.auto_form)
self.auto_form.update_triggered.connect(lambda: self.update_triggered.emit()) self.auto_form.update_triggered.connect(lambda: self.update_triggered.emit())
self.auto_form.update_triggered.connect(self._auto_form_updated)
container_layout.addSpacing(15) container_layout.addSpacing(15)
@@ -3168,18 +3219,59 @@ class Page_InitRecPerson(QWidget):
self.selection_county.style().polish(self.selection_county) self.selection_county.style().polish(self.selection_county)
self.selection_county.update() self.selection_county.update()
def _clear_info_banners(self) -> None:
while self.info_banners:
banner = self.info_banners[0]
self.info_banners_layout.removeWidget(banner)
self.info_banners.remove(banner)
banner.deleteLater()
def _add_info_banner(
self,
text: str,
button_text: str,
button_func: Callable[[], None] | None = None,
) -> None:
if button_text and button_func is None:
raise ValueError("Can not add button without calling function")
banner = InfoBanner(
text=text,
button_text=button_text,
)
if button_func is not None:
banner.btn_clicked.connect(button_func)
self.info_banners.append(banner)
self.info_banners_layout.addWidget(banner)
def _auto_form_updated(self) -> None:
self._sync_GUI_to_state()
self._sync_state_to_GUI("banners")
def reset_form(self) -> None: def reset_form(self) -> None:
self.auto_form.reset_form() self.auto_form.reset_form()
def _sync_state_to_GUI(self) -> None: def _sync_state_to_GUI(
auto_form_state = AutoForm_State( self,
session=self.STATE.session, section: Literal["auto_form", "banners"] | None,
cfg=self.AUTO_FORM_CFG, ) -> None:
rec_id=self.STATE.pers_id, if section is None or section == "auto_form":
form_data=None, auto_form_state = AutoForm_State(
locked=self.STATE.locked, session=self.STATE.session,
) cfg=self.AUTO_FORM_CFG,
self.auto_form.load_state(auto_form_state) rec_id=self.STATE.pers_id,
form_data=None,
locked=self.STATE.locked,
)
self.auto_form.load_state(auto_form_state)
if section is None or section == "banners":
self._clear_info_banners()
if self.STATE.pers_id is None:
self._add_info_banner(
text="⚠️ Dieser Eintrag ist noch nicht gespeichert.",
button_text="",
)
def _sync_GUI_to_state(self) -> None: def _sync_GUI_to_state(self) -> None:
auto_form_state = self.auto_form.get_state() auto_form_state = self.auto_form.get_state()
@@ -3190,7 +3282,7 @@ class Page_InitRecPerson(QWidget):
new_state: Page_InitRecPerson_State, new_state: Page_InitRecPerson_State,
) -> None: ) -> None:
set_page_state(self.STATE, new_state) set_page_state(self.STATE, new_state)
self._sync_state_to_GUI() self._sync_state_to_GUI(None)
def get_state(self) -> Page_InitRecPerson_State: def get_state(self) -> Page_InitRecPerson_State:
self._sync_GUI_to_state() self._sync_GUI_to_state()
@@ -4076,7 +4168,7 @@ class Page_Consulting(QWidget):
self.info_banners.remove(banner) self.info_banners.remove(banner)
banner.deleteLater() banner.deleteLater()
def _add_linking_banner( def _add_info_banner(
self, self,
text: str, text: str,
button_text: str, button_text: str,
@@ -4118,13 +4210,13 @@ class Page_Consulting(QWidget):
if section is None or section == "banners": if section is None or section == "banners":
self._clear_info_banners() self._clear_info_banners()
if self.STATE.vorgang_id is None: if self.STATE.vorgang_id is None:
self._add_linking_banner( self._add_info_banner(
text="⚠️ Dieser Eintrag ist noch nicht gespeichert.", text="⚠️ Dieser Eintrag ist noch nicht gespeichert.",
button_text="", button_text="",
) )
else: else:
if self.STATE.un_id is None and self.STATE.pers_id is None: if self.STATE.un_id is None and self.STATE.pers_id is None:
self._add_linking_banner( self._add_info_banner(
text="⚠️ Dieser Eintrag ist noch nicht mit einer Entität verknüpft.", text="⚠️ Dieser Eintrag ist noch nicht mit einer Entität verknüpft.",
button_text="Jetzt verknüpfen", button_text="Jetzt verknüpfen",
button_func=self._open_linking_dialogue, button_func=self._open_linking_dialogue,
@@ -4133,7 +4225,7 @@ class Page_Consulting(QWidget):
self.STATE.beratungs_typ is ConsultingType.INDIVIDUAL self.STATE.beratungs_typ is ConsultingType.INDIVIDUAL
and self.STATE.pers_id is None and self.STATE.pers_id is None
): ):
self._add_linking_banner( self._add_info_banner(
text=( text=(
"⚠️ Dies ist eine Individualberatung, aber die Verknüpfgung zu " "⚠️ Dies ist eine Individualberatung, aber die Verknüpfgung zu "
"einer Person fehlt." "einer Person fehlt."
@@ -4235,7 +4327,6 @@ class Page_Consulting(QWidget):
if update_only: if update_only:
relevant_gui_states = [s for s in self.STATE.cons_sessions if not s.ist_geloescht] relevant_gui_states = [s for s in self.STATE.cons_sessions if not s.ist_geloescht]
rel_cons_session_states = [s for s in data.beratungen if s.geloescht is None] rel_cons_session_states = [s for s in data.beratungen if s.geloescht is None]
print(f">>>>>>> {pformat(relevant_gui_states)}")
assert len(relevant_gui_states) == len(rel_cons_session_states) assert len(relevant_gui_states) == len(rel_cons_session_states)
for gui_state, pydantic_state in zip( for gui_state, pydantic_state in zip(
relevant_gui_states, rel_cons_session_states relevant_gui_states, rel_cons_session_states
@@ -5452,7 +5543,6 @@ class EditButtons(QWidget):
self, self,
enable_modification: bool, enable_modification: bool,
) -> None: ) -> None:
print(f">>>>>>>>> SET modify GROUP: {enable_modification=}")
if self.modify_button is not None: if self.modify_button is not None:
self.modify_button.set_modify_state(enable_modification) self.modify_button.set_modify_state(enable_modification)
self.save_btn.setEnabled(enable_modification) self.save_btn.setEnabled(enable_modification)