@@ -143,7 +143,8 @@ class EditTsv(CopyToClipboard):
143143 allow_download = tr .Bool (default_value = True )
144144 exclude_metadata = tr .Bool (default_value = True )
145145 header_depth = tr .Int (default_value = 1 )
146- disable_text_editing = tr .Bool (default_value = False )
146+ disable_text_editing = tr .Bool (default_value = True )
147+ filename_suffix = tr .Unicode (default_value = "" , allow_none = True )
147148
148149 @tr .observe ("upload_status" )
149150 def upload_status_onchange (self , on_change ):
@@ -239,6 +240,12 @@ def create_file(self):
239240 is_transposed = self .transposed ,
240241 exclude_metadata = self .exclude_metadata ,
241242 )[0 ]
243+ # Append suffix to filename if provided
244+ if self .filename_suffix :
245+ new_name = fpth .stem + self .filename_suffix + fpth .suffix
246+ new_fpth = fpth .parent / new_name
247+ fpth .rename (new_fpth )
248+ fpth = new_fpth
242249 return fpth
243250
244251 def _text (self , change ):
@@ -249,7 +256,7 @@ def _text(self, change):
249256 is_transposed = self .transposed ,
250257 model = self .model ,
251258 delimiter = "\t " ,
252- header_depth = self . header_depth )
259+ )
253260 if self .errors :
254261 self .vbx_errors .children = [
255262 w .HTML (markdown (markdown_error (e ))) for e in self .errors
@@ -265,7 +272,7 @@ def tsv_data(self): # TODO: ensure header row unchanged
265272 is_transposed = self .transposed ,
266273 model = self .model ,
267274 delimiter = "\t " ,
268- header_depth = self . header_depth )
275+ )
269276
270277 @property
271278 def pydantic_object (self ):
@@ -484,6 +491,12 @@ def __init__(self, **kwargs):
484491
485492 self .bn_confirmation .on_click (self ._bn_check_upload )
486493 self .bn_cross .on_click (self ._bn_cross_clicked )
494+
495+ self .file_uploader = TempFileUploadProcessor (
496+ fn_process = self ._process_uploaded_file ,
497+ allowed_file_type = ".xlsx" ,
498+ )
499+
487500 super ().__init__ (** kwargs )
488501 self .value = value
489502 self .upload_status = "None"
@@ -495,9 +508,9 @@ def _update_changes(self, change):
495508
496509 def _set_children (self ):
497510 if self .allow_download :
498- self .vbx_bns .children = [self .bn_copy , self .bn_upload_text , self .mfdld , self .bn_confirmation , self .bn_cross ]
511+ self .vbx_bns .children = [self .bn_copy , self .bn_upload_text , self .mfdld , self .bn_confirmation , self .bn_cross , self . file_uploader ]
499512 else :
500- self .vbx_bns .children = [self .bn_copy , self .bn_upload_text , self .bn_confirmation , self .bn_cross ]
513+ self .vbx_bns .children = [self .bn_copy , self .bn_upload_text , self .bn_confirmation , self .bn_cross , self . file_uploader ]
501514 self .hbx_main .children = [self .vbx_bns , self .text , self .ddiff , self .output ]
502515 self .children = [self .vbx_errors , self .hbx_main ]
503516
@@ -549,6 +562,9 @@ def _bn_check_upload(self, onclick):
549562
550563 def _bn_cross_clicked (self , onclick ):
551564 self .show_upload_button_and_hide_deepdiff (upload_disabled = False )
565+
566+ def _process_uploaded_file (self , path : Path ):
567+ pass
552568
553569 def show_upload_button_and_hide_deepdiff (self , upload_disabled = True ):
554570 # Hide check button and show upload button as well as text area
@@ -590,7 +606,6 @@ def deepdiff_to_crud(self, diff: DeepDiff):
590606 path_list = delta .path (output_format = "list" )
591607 primary_key = str (path_list [0 ]) # first key (primary key)
592608 changes .deletions .append (primary_key )
593-
594609
595610 if "values_changed" in diff :
596611 for delta in diff ["values_changed" ]:
@@ -653,23 +668,8 @@ def __init__(self, **kwargs):
653668 # Ensure text editing is disabled by default
654669 kwargs .setdefault ("disable_text_editing" , True )
655670
656- # Create uploader before parent init so it's available during layout build
657- self .file_uploader = TempFileUploadProcessor (
658- fn_process = self ._process_uploaded_file ,
659- allowed_file_type = ".xlsx" ,
660- )
661-
662671 # Initialize base class
663672 super ().__init__ (** kwargs )
664- self .last_upload_metadata = None
665-
666- def _set_children (self ):
667- super ()._set_children ()
668- buttons = list (self .vbx_bns .children )
669- if self .file_uploader not in buttons :
670- insert_at = 1 if buttons else 0
671- buttons .insert (insert_at , self .file_uploader )
672- self .vbx_bns .children = tuple (buttons )
673673
674674 def _text (self , change ):
675675 pass
@@ -684,7 +684,6 @@ def _process_uploaded_file(self, path: Path):
684684 data , errors = xdg .read_excel (
685685 path ,
686686 is_transposed = self .transposed ,
687- header_depth = self .header_depth ,
688687 model = self .model ,
689688 )
690689 except Exception :
0 commit comments