From b59486d46ebf7a584572c371152f99264070fec1 Mon Sep 17 00:00:00 2001 From: drfho Date: Thu, 26 Dec 2024 18:17:02 +0100 Subject: [PATCH 1/2] ZMSRecordSet grid-view: started with multiple row inserting Ref: https://github.com/zms-publishing/ZMS/pull/347 --- Products/zms/_multilangmanager.py | 2 +- Products/zms/zmscustom.py | 23 +++-- Products/zms/zpt/ZMSRecordSet/grid.zpt | 122 ++++++++++++------------- 3 files changed, 75 insertions(+), 72 deletions(-) diff --git a/Products/zms/_multilangmanager.py b/Products/zms/_multilangmanager.py index 26c7f9981..b68742d05 100644 --- a/Products/zms/_multilangmanager.py +++ b/Products/zms/_multilangmanager.py @@ -657,7 +657,7 @@ def manage_changeLangDictProperties(self, lang, btn, REQUEST, RESPONSE=None): if enabled: lang_dict[key][lang_id] = REQUEST['%s_value_%s'%(key, lang_id)].strip() # Insert (multiple) new language keys at once. - # Ref: ZMSMetaobjManager.py#L1294 + # Ref: ZMSMetaobjManager.py#L1207 for key in REQUEST.form.keys(): if key.startswith('_lang_dict_key_'): i = int(key[len('_lang_dict_key_'):]) diff --git a/Products/zms/zmscustom.py b/Products/zms/zmscustom.py index fe62f9ee6..08d0e1327 100644 --- a/Products/zms/zmscustom.py +++ b/Products/zms/zmscustom.py @@ -494,9 +494,9 @@ def handle_record(self, r): ############################################################################ - # ZMSCustom.manage_changeRecordSet: + # ZMSCustom.manage_changeRecordGrid: # - # Change record-set. + # Change record-grid. ############################################################################ def manage_changeRecordGrid(self, lang, btn, REQUEST, RESPONSE): """ ZMSCustom.manage_changeRecordGrid """ @@ -525,14 +525,15 @@ def retrieve(row): row['_change_dt'] = standard.getDateTime( time.time()) for metaObjAttr in filter_columns: objAttr = self.getObjAttr(metaObjAttr['id']) + # Hint: objAttrName gets nested by REQUEST-vars objAttrNamePrefix, objAttrNameSuffix objAttrName = self.getObjAttrName(objAttr, lang) if metaObjAttr['type'] in self.metaobj_manager.valid_types or \ metaObjAttr['type'] not in self.metaobj_manager.valid_xtypes+self.metaobj_manager.valid_zopetypes: set, value = True, self.formatObjAttrValue(objAttr, REQUEST.get(objAttrName), lang) try: del value['aq_parent'] except: pass - if value is None and metaObjAttr['id'] == 'sort_id': - value = len(res_abs) + # if value is None and metaObjAttr['id'] == 'sort_id': + # value = len(res_abs) ### CAVE NameError: 'res_abs' not defined if value is None and metaObjAttr['type'] in ['file', 'image'] and int(REQUEST.get('del_%s'%objAttrName, 0)) == 0: set = False if set: @@ -548,16 +549,18 @@ def retrieve(row): # Update c = 0 for record in records: - REQUEST.set('objAttrNamePrefix', ''); - REQUEST.set('objAttrNameSuffix', '_%i'%c); + REQUEST.set('objAttrNamePrefix', '') + REQUEST.set('objAttrNameSuffix', '_%i'%c) record = retrieve(record) if record is not None: new_records.append(record) c += 1 - # Insert - REQUEST.set('objAttrNamePrefix', '_'); - REQUEST.set('objAttrNameSuffix', ''); - record = retrieve({}) + # Insert new records: var names start with '_' + REQUEST.set('objAttrNamePrefix', '_') + REQUEST.set('objAttrNameSuffix', '') + for new_col_id_idx in [k[8:] for k in REQUEST.form.keys() if k.startswith('_col_id_')]: + REQUEST.set('objAttrNameSuffix', '_%s'%new_col_id_idx) + record = retrieve({}) if record is not None: new_records.append(record) message = self.getZMILangStr('MSG_CHANGED') diff --git a/Products/zms/zpt/ZMSRecordSet/grid.zpt b/Products/zms/zpt/ZMSRecordSet/grid.zpt index 590aa8b89..2cffe9bce 100644 --- a/Products/zms/zpt/ZMSRecordSet/grid.zpt +++ b/Products/zms/zpt/ZMSRecordSet/grid.zpt @@ -127,7 +127,7 @@ - + @@ -253,74 +253,74 @@ // Prepare multiple inserts // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // // New field set: initially disable inputs - // $('input, textarea, select','tr.row_insert').attr('disabled',true); + // New field set: initially disable inputs + $('input, textarea, select','tr.row_insert').attr('disabled',true); - // // ++++++++++++ - // // Add rows to table #grid0 on button click - // // ++++++++++++ - // let new_row_counter = $('#grid0 tbody tr').length - 2; + // ++++++++++++ + // Add rows to table #grid0 on button click + // ++++++++++++ + let new_row_counter = $('#grid0 tbody tr').length - 2; - // // Add click event function to add-buttons - // $(".row_insert .btn-add").click(function(){ - // new_row_counter++; - // // New field set: clone with enabled inputs - // $('input, textarea, select','tr.row_insert').attr('disabled',false); + // Add click event function to add-buttons + $(".row_insert .btn-add").click(function(){ + new_row_counter++; + // New field set: clone with enabled inputs + $('input, textarea, select','tr.row_insert').attr('disabled',false); - // // Where to insert the new row - // let $where_insert = $(this).closest('tr'); + // Where to insert the new row + let $where_insert = $(this).closest('tr'); - // // Set variables - // let new_row_name = `tr_${new_row_counter}`; - // let new_btn_html = ` - // - // - // - // `; + // Set variables + let new_row_name = `tr_${new_row_counter}`; + let new_btn_html = ` + + + + `; - // // Clone(true) to get a deep copy including select options - // let $new_row = $where_insert.clone(true); + // Clone(true) to get a deep copy including select options + let $new_row = $where_insert.clone(true); - // // Process table cells of the clone like "old" row - // $new_row.find('td').each(function() { - // $(this).find('input,select,textarea').each(function() { - // let tagname = $(this).prop('tagName'); - // let defname = $(this).attr('name'); - // let deftype = $(this).attr('type'); - // debugger; - // let newname = $(this).attr('name').split('_').at(-1); - // let newval = $(this).val(); - // newname = `${newname}_${new_row_counter}` - // newname = defname.includes(':') ? `${newname}:int` : newname; - // $(this).attr('name',newname); - // $(this).attr('id',newname); - // newval = `new${new_row_counter}`; - // if ( tagname == 'INPUT' && deftype != 'checkbox' && deftype != 'file' ) { - // $(this).val(newval); - // $(this).attr('placeholder',newval); - // } else if ( deftype == 'checkbox' ) { - // $(this).val(1); - // }; - // }); - // }); + // Process table cells of the clone like "old" row + $new_row.find('td').each(function() { + $(this).find('input,select,textarea').each(function() { + let tagname = $(this).prop('tagName'); + let defname = $(this).attr('name'); + let deftype = $(this).attr('type'); + debugger; + // let newname = $(this).attr('name').split('_').at(-1); + // newname = defname.includes(':') ? `${newname}:int` : newname; + let newname = `${defname}_${new_row_counter}` + let newval = $(this).val(); + $(this).attr('name',newname); + $(this).attr('id',newname); + newval = `new_${new_row_counter}`; + if ( tagname == 'INPUT' && deftype != 'checkbox' && deftype != 'file' ) { + $(this).val(newval); + $(this).attr('placeholder',newval); + } else if ( deftype == 'checkbox' ) { + $(this).val(1); + }; + }); + }); - // // Process td:first-child of the clone - // $new_row.find('td.meta-sort').html(new_btn_html); - // $new_row.removeClass('row_insert').attr('id',new_row_name) + // Process td:first-child of the clone + $new_row.find('td.meta-sort span').replaceWith(new_btn_html); + $new_row.removeClass('row_insert').attr('id',new_row_name) - // // Insert the new row - // $new_row.insertBefore($where_insert); - // // Set form as modified - // $ZMI.set_form_modified($('.meta-id input',$new_row)); - // // Reset the clone template - // $where_insert.find('input:not([type="checkbox"]),select,textarea').each(function() { - // $(this).val(undefined); - // }); - // // New field set: reset to disabled inputs - // $('input, textarea, select','tr.row_insert').attr('disabled',true); - // }); + // Insert the new row + $new_row.insertBefore($where_insert); + // Set form as modified + $ZMI.set_form_modified($('.meta-id input',$new_row)); + // Reset the clone template + $where_insert.find('input:not([type="checkbox"]),select,textarea').each(function() { + $(this).val(undefined); + }); + // New field set: reset to disabled inputs + $('input, textarea, select','tr.row_insert').attr('disabled',true); + }); }); //--> From dba8f70f533bf4c46078d44a3b8d67127b2e30ff Mon Sep 17 00:00:00 2001 From: drfho Date: Sat, 28 Dec 2024 17:23:10 +0100 Subject: [PATCH 2/2] fixed iteration of new items, fixed type of form var "del_" --- Products/zms/zmscustom.py | 4 ++-- Products/zms/zpt/ZMSRecordSet/grid.zpt | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Products/zms/zmscustom.py b/Products/zms/zmscustom.py index 08d0e1327..6e13665a8 100644 --- a/Products/zms/zmscustom.py +++ b/Products/zms/zmscustom.py @@ -561,8 +561,8 @@ def retrieve(row): for new_col_id_idx in [k[8:] for k in REQUEST.form.keys() if k.startswith('_col_id_')]: REQUEST.set('objAttrNameSuffix', '_%s'%new_col_id_idx) record = retrieve({}) - if record is not None: - new_records.append(record) + if record is not None: + new_records.append(record) message = self.getZMILangStr('MSG_CHANGED') # Set self.setObjProperty(record_id, new_records, lang) diff --git a/Products/zms/zpt/ZMSRecordSet/grid.zpt b/Products/zms/zpt/ZMSRecordSet/grid.zpt index 2cffe9bce..783e70e2c 100644 --- a/Products/zms/zpt/ZMSRecordSet/grid.zpt +++ b/Products/zms/zpt/ZMSRecordSet/grid.zpt @@ -297,7 +297,9 @@ $(this).attr('name',newname); $(this).attr('id',newname); newval = `new_${new_row_counter}`; - if ( tagname == 'INPUT' && deftype != 'checkbox' && deftype != 'file' ) { + if ( defname.startsWith('del_') ) { + $(this).val(0); + } else if ( tagname == 'INPUT' && deftype != 'checkbox' && deftype != 'file' ) { $(this).val(newval); $(this).attr('placeholder',newval); } else if ( deftype == 'checkbox' ) {