198 lines
6.3 KiB
Python
198 lines
6.3 KiB
Python
"""
|
|
Result Frame
|
|
|
|
UI component for displaying secret generation results.
|
|
"""
|
|
|
|
import customtkinter as ctk
|
|
from typing import Callable
|
|
|
|
|
|
class ResultFrame(ctk.CTkFrame):
|
|
"""Frame for displaying secret generation results."""
|
|
|
|
def __init__(self, parent, on_generate_another: Callable = None):
|
|
"""
|
|
Initialize the result frame.
|
|
|
|
Args:
|
|
parent: Parent widget
|
|
on_generate_another: Callback function when "Generate Another" is clicked
|
|
"""
|
|
super().__init__(parent)
|
|
|
|
self.on_generate_another = on_generate_another
|
|
|
|
# Configure frame with success colors
|
|
self.configure(
|
|
corner_radius=10,
|
|
border_width=3,
|
|
border_color="green",
|
|
fg_color=("#E8F5E9", "#1B5E20") # Light green / Dark green
|
|
)
|
|
|
|
# Success title
|
|
self.success_label = ctk.CTkLabel(
|
|
self,
|
|
text="✓ Secret Generated Successfully!",
|
|
font=ctk.CTkFont(size=20, weight="bold"),
|
|
text_color="green"
|
|
)
|
|
self.success_label.grid(row=0, column=0, columnspan=2, padx=20, pady=(20, 15), sticky="w")
|
|
|
|
# Secret Name Label
|
|
self.name_title_label = ctk.CTkLabel(
|
|
self,
|
|
text="Secret Name:",
|
|
font=ctk.CTkFont(size=14, weight="bold")
|
|
)
|
|
self.name_title_label.grid(row=1, column=0, padx=20, pady=(0, 5), sticky="w")
|
|
|
|
self.name_value_label = ctk.CTkLabel(
|
|
self,
|
|
text="",
|
|
font=ctk.CTkFont(size=14)
|
|
)
|
|
self.name_value_label.grid(row=1, column=1, padx=20, pady=(0, 5), sticky="w")
|
|
|
|
# Key Vault Label
|
|
self.vault_title_label = ctk.CTkLabel(
|
|
self,
|
|
text="Key Vault:",
|
|
font=ctk.CTkFont(size=14, weight="bold")
|
|
)
|
|
self.vault_title_label.grid(row=2, column=0, padx=20, pady=(0, 5), sticky="w")
|
|
|
|
self.vault_value_label = ctk.CTkLabel(
|
|
self,
|
|
text="",
|
|
font=ctk.CTkFont(size=14)
|
|
)
|
|
self.vault_value_label.grid(row=2, column=1, padx=20, pady=(0, 5), sticky="w")
|
|
|
|
# Old Secrets Removed Label (initially hidden)
|
|
self.removed_title_label = ctk.CTkLabel(
|
|
self,
|
|
text="Old Secrets Removed:",
|
|
font=ctk.CTkFont(size=14, weight="bold")
|
|
)
|
|
self.removed_title_label.grid(row=3, column=0, padx=20, pady=(0, 15), sticky="w")
|
|
self.removed_title_label.grid_remove() # Hide initially
|
|
|
|
self.removed_value_label = ctk.CTkLabel(
|
|
self,
|
|
text="",
|
|
font=ctk.CTkFont(size=14)
|
|
)
|
|
self.removed_value_label.grid(row=3, column=1, padx=20, pady=(0, 15), sticky="w")
|
|
self.removed_value_label.grid_remove() # Hide initially
|
|
|
|
# Secret Value Label
|
|
self.secret_label = ctk.CTkLabel(
|
|
self,
|
|
text="Secret Value (copy this now):",
|
|
font=ctk.CTkFont(size=14, weight="bold")
|
|
)
|
|
self.secret_label.grid(row=4, column=0, columnspan=2, padx=20, pady=(10, 5), sticky="w")
|
|
|
|
# Secret Value Textbox (read-only)
|
|
self.secret_textbox = ctk.CTkTextbox(
|
|
self,
|
|
height=80,
|
|
font=ctk.CTkFont(family="Consolas", size=12),
|
|
wrap="word"
|
|
)
|
|
self.secret_textbox.grid(row=5, column=0, columnspan=2, padx=20, pady=(0, 15), sticky="ew")
|
|
|
|
# Buttons frame
|
|
self.buttons_frame = ctk.CTkFrame(self, fg_color="transparent")
|
|
self.buttons_frame.grid(row=6, column=0, columnspan=2, padx=20, pady=(0, 20))
|
|
|
|
# Copy button
|
|
self.copy_button = ctk.CTkButton(
|
|
self.buttons_frame,
|
|
text="Copy to Clipboard",
|
|
command=self._on_copy_clicked,
|
|
width=180,
|
|
height=40,
|
|
font=ctk.CTkFont(size=14, weight="bold")
|
|
)
|
|
self.copy_button.grid(row=0, column=0, padx=(0, 10))
|
|
|
|
# Generate Another button
|
|
self.another_button = ctk.CTkButton(
|
|
self.buttons_frame,
|
|
text="Generate Another Secret",
|
|
command=self._on_another_clicked,
|
|
width=200,
|
|
height=40,
|
|
font=ctk.CTkFont(size=14, weight="bold")
|
|
)
|
|
self.another_button.grid(row=0, column=1, padx=(10, 0))
|
|
|
|
# Configure grid
|
|
self.grid_columnconfigure(1, weight=1)
|
|
|
|
# Initially hide the frame
|
|
self.grid_remove()
|
|
|
|
def show_result(
|
|
self,
|
|
secret_name: str,
|
|
vault_name: str,
|
|
secret_value: str,
|
|
removed_count: int = 0
|
|
):
|
|
"""
|
|
Display secret generation result.
|
|
|
|
Args:
|
|
secret_name: The sanitized secret name
|
|
vault_name: The Key Vault name
|
|
secret_value: The secret value
|
|
removed_count: Number of old secrets removed (0 if not applicable)
|
|
"""
|
|
# Update labels
|
|
self.name_value_label.configure(text=secret_name)
|
|
self.vault_value_label.configure(text=vault_name)
|
|
|
|
# Show/hide removed count
|
|
if removed_count > 0:
|
|
self.removed_value_label.configure(text=str(removed_count))
|
|
self.removed_title_label.grid()
|
|
self.removed_value_label.grid()
|
|
else:
|
|
self.removed_title_label.grid_remove()
|
|
self.removed_value_label.grid_remove()
|
|
|
|
# Set secret value in textbox
|
|
self.secret_textbox.delete("1.0", "end")
|
|
self.secret_textbox.insert("1.0", secret_value)
|
|
self.secret_textbox.configure(state="disabled")
|
|
|
|
# Show the frame
|
|
self.grid()
|
|
|
|
def _on_copy_clicked(self):
|
|
"""Handle copy button click."""
|
|
# Get secret value from textbox
|
|
secret_value = self.secret_textbox.get("1.0", "end").strip()
|
|
|
|
# Copy to clipboard
|
|
self.clipboard_clear()
|
|
self.clipboard_append(secret_value)
|
|
|
|
# Show temporary confirmation
|
|
original_text = self.copy_button.cget("text")
|
|
self.copy_button.configure(text="✓ Copied!")
|
|
self.after(2000, lambda: self.copy_button.configure(text=original_text))
|
|
|
|
def _on_another_clicked(self):
|
|
"""Handle generate another button click."""
|
|
if self.on_generate_another:
|
|
self.on_generate_another()
|
|
|
|
def hide(self):
|
|
"""Hide the result frame."""
|
|
self.grid_remove()
|