04/24 Fixed bulk import check for duplicate
This commit is contained in:
@@ -450,12 +450,26 @@ class ShiftDialog(tk.Toplevel):
|
||||
)
|
||||
self._user_picker.grid(row=0, column=0, sticky="nsew", pady=(0, 8))
|
||||
|
||||
# Websites picker
|
||||
# Websites picker — include check_type suffix in label and colour map
|
||||
_TYPE_SUFFIX = {"daily": " [D]", "weekly": " [W]"}
|
||||
_TYPE_COLOUR = {
|
||||
"daily": COLOURS.get("accent", "#5B4DE8"),
|
||||
"weekly": COLOURS.get("warning", "#F57C00"),
|
||||
}
|
||||
site_items = [
|
||||
(w["id"], w["name"] + _TYPE_SUFFIX.get(w.get("check_type", "daily"), ""))
|
||||
for w in self._all_websites
|
||||
]
|
||||
site_colours = {
|
||||
w["id"]: _TYPE_COLOUR.get(w.get("check_type", "daily"), COLOURS["text"])
|
||||
for w in self._all_websites
|
||||
}
|
||||
self._site_picker = _DualListPicker(
|
||||
pane,
|
||||
title="Assigned Websites",
|
||||
all_items=[(w["id"], w["name"]) for w in self._all_websites],
|
||||
all_items=site_items,
|
||||
allow_reorder=True,
|
||||
item_colours=site_colours,
|
||||
)
|
||||
self._site_picker.grid(row=1, column=0, sticky="nsew")
|
||||
|
||||
@@ -541,11 +555,13 @@ class _DualListPicker(ttk.Frame):
|
||||
Supports optional drag-to-reorder on the assigned list.
|
||||
"""
|
||||
def __init__(self, parent, title: str, all_items: list,
|
||||
allow_reorder=False):
|
||||
allow_reorder=False, item_colours: dict = None):
|
||||
super().__init__(parent)
|
||||
self._all_items = all_items # [(id, label), ...]
|
||||
self._allow_reorder = allow_reorder
|
||||
self._drag_start = None
|
||||
# item_colours: {id: colour_str} — applied per-item after refresh
|
||||
self._item_colours = item_colours or {}
|
||||
self._build(title)
|
||||
|
||||
def _build(self, title: str):
|
||||
@@ -555,7 +571,19 @@ class _DualListPicker(ttk.Frame):
|
||||
|
||||
ttk.Label(self, text=title,
|
||||
style="Heading.TLabel").grid(
|
||||
row=0, column=0, columnspan=3, sticky="w", pady=(4, 6))
|
||||
row=0, column=0, columnspan=3, sticky="w", pady=(4, 2))
|
||||
|
||||
# Colour legend — only shown when item_colours are provided
|
||||
if self._item_colours:
|
||||
legend = tk.Frame(self, bg=COLOURS["bg"])
|
||||
legend.grid(row=0, column=0, columnspan=3, sticky="e", pady=(4, 2))
|
||||
for lbl_text, colour in [
|
||||
("● Daily", COLOURS.get("accent", "#5B4DE8")),
|
||||
("● Weekly", COLOURS.get("warning", "#F57C00")),
|
||||
]:
|
||||
tk.Label(legend, text=lbl_text,
|
||||
bg=COLOURS["bg"], fg=colour,
|
||||
font=FONT_SMALL).pack(side="left", padx=(0, 10))
|
||||
|
||||
# ── Available list ────────────────────────────────────────────────────
|
||||
avail_frame = tk.Frame(self, bg=COLOURS["surface"])
|
||||
@@ -632,12 +660,16 @@ class _DualListPicker(ttk.Frame):
|
||||
|
||||
def _refresh_listboxes(self):
|
||||
self._avail_lb.delete(0, "end")
|
||||
for _, lbl in self._avail_data:
|
||||
for idx, (id_, lbl) in enumerate(self._avail_data):
|
||||
self._avail_lb.insert("end", lbl)
|
||||
if id_ in self._item_colours:
|
||||
self._avail_lb.itemconfig(idx, fg=self._item_colours[id_])
|
||||
|
||||
self._assign_lb.delete(0, "end")
|
||||
for _, lbl in self._assign_data:
|
||||
for idx, (id_, lbl) in enumerate(self._assign_data):
|
||||
self._assign_lb.insert("end", lbl)
|
||||
if id_ in self._item_colours:
|
||||
self._assign_lb.itemconfig(idx, fg=self._item_colours[id_])
|
||||
|
||||
def _add(self):
|
||||
sel = list(self._avail_lb.curselection())
|
||||
@@ -747,4 +779,4 @@ def _valid_time(s: str) -> bool:
|
||||
h, m = int(parts[0]), int(parts[1])
|
||||
return 0 <= h <= 23 and 0 <= m <= 59
|
||||
except ValueError:
|
||||
return False
|
||||
return False
|
||||
Reference in New Issue
Block a user