From 393e3ba39ba205bdd10017511ab64db36e045b78 Mon Sep 17 00:00:00 2001 From: foefl Date: Wed, 15 Jul 2026 15:28:54 +0200 Subject: [PATCH] added info banners to initial recording --- src/wce_crm/gui.py | 128 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 109 insertions(+), 19 deletions(-) diff --git a/src/wce_crm/gui.py b/src/wce_crm/gui.py index 026ae14..251d9f7 100644 --- a/src/wce_crm/gui.py +++ b/src/wce_crm/gui.py @@ -2947,6 +2947,14 @@ class Page_InitRecCompany(QWidget): header_layout.addWidget(self.comp_profile_btn) 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 --- container = QWidget() # SCROLL AREA @@ -2975,7 +2983,7 @@ class Page_InitRecCompany(QWidget): self.auto_form = AutoForm(auto_form_state) container_layout.addWidget(self.auto_form) 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) @@ -2988,9 +2996,35 @@ class Page_InitRecCompany(QWidget): 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_state_to_GUI("comp_profile") + self._sync_state_to_GUI("banners") def _request_company_profile(self) -> None: assert self.STATE.un_id is not None, ( @@ -3008,7 +3042,7 @@ class Page_InitRecCompany(QWidget): def _sync_state_to_GUI( self, - section: Literal["auto_form", "comp_profile"] | None, + section: Literal["auto_form", "comp_profile", "banners"] | None, ) -> None: if section is None or section == "auto_form": auto_form_state = AutoForm_State( @@ -3026,6 +3060,14 @@ class Page_InitRecCompany(QWidget): else: 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: auto_form_state = self.auto_form.get_state() self.STATE.un_id = auto_form_state.rec_id @@ -3102,6 +3144,14 @@ class Page_InitRecPerson(QWidget): header_layout.addWidget(title) 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 --- container = QWidget() # SCROLL AREA @@ -3130,6 +3180,7 @@ class Page_InitRecPerson(QWidget): self.auto_form = AutoForm(auto_form_state) container_layout.addWidget(self.auto_form) 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) @@ -3168,18 +3219,59 @@ class Page_InitRecPerson(QWidget): self.selection_county.style().polish(self.selection_county) 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: self.auto_form.reset_form() - def _sync_state_to_GUI(self) -> None: - auto_form_state = AutoForm_State( - session=self.STATE.session, - cfg=self.AUTO_FORM_CFG, - rec_id=self.STATE.pers_id, - form_data=None, - locked=self.STATE.locked, - ) - self.auto_form.load_state(auto_form_state) + def _sync_state_to_GUI( + self, + section: Literal["auto_form", "banners"] | None, + ) -> None: + if section is None or section == "auto_form": + auto_form_state = AutoForm_State( + session=self.STATE.session, + cfg=self.AUTO_FORM_CFG, + 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: auto_form_state = self.auto_form.get_state() @@ -3190,7 +3282,7 @@ class Page_InitRecPerson(QWidget): new_state: Page_InitRecPerson_State, ) -> None: 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: self._sync_GUI_to_state() @@ -4076,7 +4168,7 @@ class Page_Consulting(QWidget): self.info_banners.remove(banner) banner.deleteLater() - def _add_linking_banner( + def _add_info_banner( self, text: str, button_text: str, @@ -4118,13 +4210,13 @@ class Page_Consulting(QWidget): if section is None or section == "banners": self._clear_info_banners() if self.STATE.vorgang_id is None: - self._add_linking_banner( + self._add_info_banner( text="⚠️ Dieser Eintrag ist noch nicht gespeichert.", button_text="", ) else: 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.", button_text="Jetzt verknüpfen", button_func=self._open_linking_dialogue, @@ -4133,7 +4225,7 @@ class Page_Consulting(QWidget): self.STATE.beratungs_typ is ConsultingType.INDIVIDUAL and self.STATE.pers_id is None ): - self._add_linking_banner( + self._add_info_banner( text=( "⚠️ Dies ist eine Individualberatung, aber die Verknüpfgung zu " "einer Person fehlt." @@ -4235,7 +4327,6 @@ class Page_Consulting(QWidget): if update_only: 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] - print(f">>>>>>> {pformat(relevant_gui_states)}") assert len(relevant_gui_states) == len(rel_cons_session_states) for gui_state, pydantic_state in zip( relevant_gui_states, rel_cons_session_states @@ -5452,7 +5543,6 @@ class EditButtons(QWidget): self, enable_modification: bool, ) -> None: - print(f">>>>>>>>> SET modify GROUP: {enable_modification=}") if self.modify_button is not None: self.modify_button.set_modify_state(enable_modification) self.save_btn.setEnabled(enable_modification)