import base64 import os from dash.dependencies import Input, Output, State, ALL from dash import html, callback_context from utils.file_utils import list_files_in_directory, save_file, delete_file, get_file_metadata from components.intents import generate_intent_table, INTENT_DIR def register_intents_callbacks(app): @app.callback( Output('intent-upload-status', 'children'), [ Input('upload-intent-data', 'contents'), Input({'type': 'delete-intent-button', 'index': ALL}, 'n_clicks') ], [ State('upload-intent-data', 'filename'), State('upload-intent-data', 'last_modified'), State({'type': 'delete-intent-button', 'index': ALL}, 'id') ] ) def manage_intent_files(contents, filenames, last_modified, delete_ids): ctx = callback_context if not ctx.triggered: return html.Div() triggered_id = ctx.triggered[0]['prop_id'].split('.')[0] if 'upload-intent-data' in triggered_id and contents: for content, filename in zip(contents, filenames): data = content.split(",")[1] save_file(INTENT_DIR, filename, base64.b64decode(data)) files = list_files_in_directory(INTENT_DIR) return generate_intent_table(files) elif 'delete-intent-button' in triggered_id: for item in delete_ids: if item['id'] == triggered_id: file_path = os.path.join(INTENT_DIR, item['index']) delete_file(file_path) files = list_files_in_directory(INTENT_DIR) return generate_intent_table(files) return html.Div()