import flet as ft from modules import logger, login from modules.setting_manager import SettingsManager from modules.db_manager import DBManager from modules.main_window import MainWindow def main(page: ft.Page): page.title = "Modern Market and Product Manager" page.window_width = 1000 page.window_height = 700 # 하단 로그 출력용 텍스트 위젯 log_display = ft.Text(value="", size=12) def gui_log_callback(formatted_message: str): print(formatted_message) # 로거, 설정 관리자, DBManager 초기화 app_logger = logger.get_logger(gui_callback=gui_log_callback) settings_manager = SettingsManager() db_manager = DBManager(app_logger) # 로그인 다이얼로그 실행 (비동기) async def do_login(): login_dialog = login.LoginDialog(page, app_logger, settings_manager, supabase_manager) logged_in = await login_dialog.show() if logged_in: page.controls.clear() page.add(ft.Text("로그인 성공! 메인 화면입니다."), log_display) else: page.add(ft.Text("로그인 실패!"), log_display) page.async_run(do_login) # 마켓 탭 UI 구성 market_tab_content = ft.Column([ ft.Row([ ft.ElevatedButton("마켓목록 가져오기", on_click=lambda e: load_market_list(page)), ft.ElevatedButton("팔린상품 가져오기", on_click=lambda e: load_sold_products(page)), ft.ElevatedButton("마켓추가하기", on_click=lambda e: add_market(page)) ]), ft.DataTable( columns=[ ft.DataColumn(ft.Text("마켓이름")), ft.DataColumn(ft.Text("마켓 URL")), ft.DataColumn(ft.Text("메모")) ], rows=[], expand=True, key="market_table" ) ], scroll=ft.ScrollMode.AUTO) # 상품 탭 UI 구성 product_tab_content = ft.Column([ ft.Row([ ft.ElevatedButton("금지어필터링", on_click=lambda e: filter_forbidden(page)), ft.ElevatedButton("카테고리 필터링", on_click=lambda e: filter_category(page)), ft.Dropdown( label="소싱몰 목록", options=[ ft.dropdown.Option("타오바오"), ft.dropdown.Option("1688") ], key="sourcing_market" ), ft.ElevatedButton("소싱하기", on_click=lambda e: sourcing_products(page)), ft.ElevatedButton("출력", on_click=lambda e: export_products(page)) ]), ft.DataTable( columns=[ ft.DataColumn(ft.Text("상품명")), ft.DataColumn(ft.Text("카테고리")), ft.DataColumn(ft.Text("이미지 URL")), ft.DataColumn(ft.Text("소싱 URL")) ], rows=[], expand=True, key="product_table" ) ], scroll=ft.ScrollMode.AUTO) # 금지어 관리 탭 (추후 구현) forbidden_tab_content = ft.Column([ ft.Text("금지어 관리 탭 내용 (추후 구현)") ]) # 카테고리 관리 탭 (추후 구현) category_tab_content = ft.Column([ ft.Text("카테고리 관리 탭 내용 (추후 구현)") ]) # 메인 탭 생성 tabs = ft.Tabs( selected_index=0, tabs=[ ft.Tab(text="마켓", content=market_tab_content), ft.Tab(text="상품", content=product_tab_content), ft.Tab(text="금지어 관리", content=forbidden_tab_content), ft.Tab(text="카테고리 관리", content=category_tab_content) ], key="main_tabs" ) # 페이지 레이아웃 구성 page.add(tabs, log_display) # 로그 추가 함수 (각 모듈에서 호출 가능하도록 page.session에 저장) def append_log(message: str): current = log_display.value log_display.value = current + message + "\n" page.update() page.session.set("append_log", append_log) def load_market_list(page: ft.Page): global market_list page.session.get("append_log")("Fetching market list...") market_list = backend.get_market_list() market_rows = [] for m in market_list: row = ft.DataRow(cells=[ ft.DataCell(ft.Text(m.get("name", ""))), ft.DataCell(ft.Text(m.get("url", ""))), ft.DataCell(ft.Text(m.get("memo", ""))) ]) market_rows.append(row) market_table: ft.DataTable = page.get_control("market_table") market_table.rows = market_rows page.session.get("append_log")("Market list loaded.") page.update() def load_sold_products(page: ft.Page): global sold_products, filtered_products, sourced_products page.session.get("append_log")("Fetching sold products for each market...") sold_products = backend.get_sold_products(market_list) filtered_products = sold_products.copy() page.session.get("append_log")("Sold products loaded. Switching to 상품 탭.") update_product_table(page, filtered_products) tabs: ft.Tabs = page.get_control("main_tabs") tabs.selected_index = 1 page.update() def update_product_table(page: ft.Page, products): product_rows = [] for p in products: row = ft.DataRow(cells=[ ft.DataCell(ft.Text(p.get("name", ""))), ft.DataCell(ft.Text(p.get("category", ""))), ft.DataCell(ft.Text(p.get("image_url", ""))), ft.DataCell(ft.Text(p.get("sourcing_url", ""))) ]) product_rows.append(row) product_table: ft.DataTable = page.get_control("product_table") product_table.rows = product_rows page.update() def add_market(page: ft.Page): page.session.get("append_log")("Add market functionality not implemented yet.") page.update() def filter_forbidden(page: ft.Page): global filtered_products page.session.get("append_log")("Filtering products with forbidden words...") filtered_products = product_filter.filter_forbidden_words(filtered_products) update_product_table(page, filtered_products) page.session.get("append_log")("Forbidden words filtering applied.") page.update() def filter_category(page: ft.Page): global filtered_products page.session.get("append_log")("Filtering products with forbidden categories...") filtered_products = product_filter.filter_forbidden_categories(filtered_products) update_product_table(page, filtered_products) page.session.get("append_log")("Category filtering applied.") page.update() def sourcing_products(page: ft.Page): global sourced_products, filtered_products sourcing_market: ft.Dropdown = page.get_control("sourcing_market") selected_market = sourcing_market.value page.session.get("append_log")(f"Starting sourcing using {selected_market}...") sourced_products = [] for product in filtered_products: sourcing_url = backend.sourcing_product(product.get("image_url", ""), selected_market) product["sourcing_url"] = sourcing_url sourced_products.append(product) update_product_table(page, sourced_products) page.session.get("append_log")("Sourcing completed.") page.update() def export_products(page: ft.Page): page.session.get("append_log")("Exporting products to Excel...") export.export_to_excel(sourced_products) page.session.get("append_log")("Products exported and folder opened.") page.update() if __name__ == "__main__": ft.app(target=main)