From 6659ebd6ac9fdc5a43e7cd77974ac85e2dcb08fa Mon Sep 17 00:00:00 2001 From: Martin Tranberg Date: Tue, 31 Mar 2026 12:05:50 +0200 Subject: [PATCH] feat: add refresh functionality to UI and document future feature requests --- README.md | 6 +++++ sharepoint_browser.py | 52 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index da54878..f101b95 100644 --- a/README.md +++ b/README.md @@ -41,4 +41,10 @@ Den færdige fil findes i mappen `dist/`. Husk at placere `settings.json` i samm "tenant_id": "DIN_TENANT_ID", "temp_dir": "C:\\Temp_SP" } + +## Feature Request + 1. Tilføj funktion til at gemme og administrere, flere tenants. + 2. Debug log til at se hvad der sker i baggrunden. + 3. Exteded log for 14 dage, som logger alle handlinger brugeren forateager sig i appen. + 4. Licens styring, så man kan licencere programmet til kunder. Der skal være mulighed for 1 år, 3 år og unlimited. ``` diff --git a/sharepoint_browser.py b/sharepoint_browser.py index 8133b73..0f53482 100644 --- a/sharepoint_browser.py +++ b/sharepoint_browser.py @@ -59,6 +59,7 @@ STRINGS = { "btn_save_changes": "💾 Gem ændringer i SharePoint", "btn_login": "Log ind", "btn_logged_in": "Logget ind", + "btn_refresh": "🔄 Opdater", "btn_upload_file": "📤 Upload Fil", "btn_upload_folder": "📁 Upload Mappe", "btn_new_folder": "➕ Ny Mappe", @@ -128,6 +129,7 @@ STRINGS = { "btn_save_changes": "💾 Save changes to SharePoint", "btn_login": "Login", "btn_logged_in": "Logged in", + "btn_refresh": "🔄 Refresh", "btn_upload_file": "📤 Upload File", "btn_upload_folder": "📁 Upload Folder", "btn_new_folder": "➕ New Folder", @@ -315,6 +317,11 @@ class SharePointApp(wx.Frame): self.home_btn.Bind(wx.EVT_BUTTON, self.load_sites) nav_hbox.Add(self.home_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5) + self.refresh_btn = wx.Button(nav_panel, label=self.get_txt("btn_refresh"), size=(100, 30)) + self.refresh_btn.Disable() + self.refresh_btn.Bind(wx.EVT_BUTTON, self.on_refresh) + nav_hbox.Add(self.refresh_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5) + # NY KNAP: Gem ændringer (Vises kun ved redigering) self.done_btn = wx.Button(nav_panel, label=self.get_txt("btn_save_changes"), size=(200, 30)) self.done_btn.SetBackgroundColour(wx.Colour(255, 69, 0)) # OrangeRed @@ -372,6 +379,7 @@ class SharePointApp(wx.Frame): self.tree_ctrl.AssignImageList(self.image_list) self.tree_ctrl.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.on_tree_expanding) self.tree_ctrl.Bind(wx.EVT_TREE_SEL_CHANGED, self.on_tree_selected) + self.tree_ctrl.Bind(wx.EVT_TREE_ITEM_MENU, self.on_tree_right_click) # Right side: File Area - ListCtrl self.list_ctrl = wx.ListCtrl(self.splitter, style=wx.LC_REPORT | wx.BORDER_SUNKEN) @@ -450,8 +458,26 @@ class SharePointApp(wx.Frame): new_folder_item = menu.Append(wx.ID_ANY, self.get_txt("msg_new_folder_here")) self.Bind(wx.EVT_MENU, self.on_new_folder_clicked, new_folder_item) + # Tilføj altid opdater punkt til sidst if menu.GetMenuItemCount() > 0: - self.PopupMenu(menu) + menu.AppendSeparator() + + refresh_item = menu.Append(wx.ID_ANY, self.get_txt("btn_refresh")) + self.Bind(wx.EVT_MENU, self.on_refresh, refresh_item) + + self.PopupMenu(menu) + menu.Destroy() + + def on_tree_right_click(self, event): + if self.is_editing: return + item = event.GetItem() + if not item.IsOk() or item == self.tree_root: return + + self.tree_ctrl.SelectItem(item) + menu = wx.Menu() + refresh_item = menu.Append(wx.ID_ANY, self.get_txt("btn_refresh")) + self.Bind(wx.EVT_MENU, self.on_refresh, refresh_item) + self.PopupMenu(menu) menu.Destroy() # --- FILHÅNDTERING (Upload, Slet, Ny Mappe) --- @@ -686,6 +712,7 @@ class SharePointApp(wx.Frame): self.upload_btn.SetLabel(self.get_txt("btn_upload_file")) self.upload_folder_btn.SetLabel(self.get_txt("btn_upload_folder")) self.new_folder_btn.SetLabel(self.get_txt("btn_new_folder")) + self.refresh_btn.SetLabel(self.get_txt("btn_refresh")) if self.access_token: self.login_btn.SetLabel(self.get_txt("btn_logged_in")) @@ -721,9 +748,31 @@ class SharePointApp(wx.Frame): self.list_ctrl.Enable(not lock) self.back_btn.Enable(not lock if len(self.history) > 1 else False) self.home_btn.Enable(not lock) + self.refresh_btn.Enable(not lock) self.login_btn.Enable(not lock) wx.CallAfter(_do) + def on_refresh(self, event=None): + if self.is_editing: return + + selected = self.tree_ctrl.GetSelection() + if not selected.IsOk() or selected == self.tree_root: + self.load_sites() + return + + data = self.tree_item_data.get(selected) + if data: + self.set_status(f"Opdaterer '{data['name']}'...") + # Opdater Listekontrol (højre side) + threading.Thread(target=self._fetch_list_contents_bg, args=(data,), daemon=True).start() + + # Opdater Træstruktur (venstre side) - Ryd og indlæs igen hvis det er en container + if data['type'] in ["SITE", "DRIVE", "FOLDER"]: + data["loaded"] = False # Tillad genindlæsning + if self.tree_ctrl.IsExpanded(selected): + # Genindlæs træets børn asynkront + threading.Thread(target=self._fetch_tree_children_bg, args=(selected, data), daemon=True).start() + def _refresh_current_view(self): sel = self.tree_ctrl.GetSelection() if sel.IsOk(): @@ -819,6 +868,7 @@ class SharePointApp(wx.Frame): self.login_btn.SetLabel(self.get_txt("btn_logged_in")) self.login_btn.SetBackgroundColour(wx.Colour(200, 200, 200)) # Grå self.home_btn.Enable() + self.refresh_btn.Enable() self.load_sites() else: self.set_status(self.get_txt("status_login_failed"))