Co-authored-by: Suraj Shetty <surajshetty3416@gmail.com>
This commit is contained in:
parent
ab7f9c0b1b
commit
1d37a43059
1 changed files with 74 additions and 62 deletions
|
|
@ -12,83 +12,95 @@ frappe.ui.form.ControlTable = frappe.ui.form.Control.extend({
|
|||
parent: this.wrapper,
|
||||
control: this
|
||||
});
|
||||
if(this.frm) {
|
||||
|
||||
if (this.frm) {
|
||||
this.frm.grids[this.frm.grids.length] = this;
|
||||
}
|
||||
this.$wrapper.on('paste',':text', function(e) {
|
||||
var cur_table_field =$(e.target).closest('div [data-fieldtype="Table"]').data('fieldname');
|
||||
var cur_field = $(e.target).data('fieldname');
|
||||
var cur_grid= cur_frm.get_field(cur_table_field).grid;
|
||||
var grid_pagination = cur_grid.grid_pagination;
|
||||
var cur_grid_rows = cur_grid.grid_rows;
|
||||
var cur_doctype = cur_grid.doctype;
|
||||
var cur_row_docname =$(e.target).closest('div .grid-row').data('name');
|
||||
var row_idx = locals[cur_doctype][cur_row_docname].idx;
|
||||
var clipboardData, pastedData;
|
||||
// Get pasted data via clipboard API
|
||||
clipboardData = e.clipboardData || window.clipboardData || e.originalEvent.clipboardData;
|
||||
pastedData = clipboardData.getData('Text');
|
||||
if (!pastedData) return;
|
||||
var data = frappe.utils.csv_to_array(pastedData,'\t');
|
||||
if (data.length === 1 & data[0].length === 1) return;
|
||||
if (data.length > 500) {
|
||||
data = data.slice(0, 500);
|
||||
frappe.msgprint(__('For performance, only the first 500 rows were processed.'));
|
||||
}
|
||||
var fieldnames = [];
|
||||
var get_field = function(name_or_label) {
|
||||
var fieldname;
|
||||
$.each(cur_grid.meta.fields,(ci,field)=>{
|
||||
name_or_label = name_or_label.toLowerCase()
|
||||
if (field.fieldname.toLowerCase() === name_or_label ||
|
||||
(field.label && !in_list(frappe.model.no_value_type, field.fieldtype) &&
|
||||
field.label.toLowerCase() === name_or_label)) {
|
||||
fieldname = field.fieldname;
|
||||
return false;
|
||||
}
|
||||
|
||||
this.$wrapper.on('paste', ':text', e => {
|
||||
const table_field = this.df.fieldname;
|
||||
const grid = this.grid;
|
||||
const grid_pagination = grid.grid_pagination;
|
||||
const grid_rows = grid.grid_rows;
|
||||
const doctype = grid.doctype;
|
||||
const row_docname = $(e.target).closest('.grid-row').data('name');
|
||||
|
||||
let clipboard_data = e.clipboardData || window.clipboardData || e.originalEvent.clipboardData;
|
||||
let pasted_data = clipboard_data.getData('Text');
|
||||
|
||||
if (!pasted_data) return;
|
||||
|
||||
let data = frappe.utils.csv_to_array(pasted_data, '\t');
|
||||
let fieldnames = [];
|
||||
// for raw data with column header
|
||||
if (this.get_field(data[0][0])) {
|
||||
data[0].forEach(column => {
|
||||
fieldnames.push(this.get_field(column));
|
||||
});
|
||||
return fieldname;
|
||||
}
|
||||
if (get_field(data[0][0])){ // for raw data with column header
|
||||
$.each(data[0], (ci, column)=>{fieldnames.push(get_field(column));});
|
||||
data.shift();
|
||||
}
|
||||
else{ // no column header, map to the existing visible columns
|
||||
var visible_columns = cur_grid_rows[0].get_visible_columns();
|
||||
var find;
|
||||
$.each(visible_columns, (ci, column)=>{
|
||||
if (column.fieldname === cur_field) find = true;
|
||||
find && fieldnames.push(column.fieldname);
|
||||
})
|
||||
}
|
||||
$.each(data, function(i, row) {
|
||||
var blank_row = true;
|
||||
$.each(row, function(ci, value) {
|
||||
if(value) {
|
||||
blank_row = false;
|
||||
return false;
|
||||
} else {
|
||||
// no column header, map to the existing visible columns
|
||||
const visible_columns = grid_rows[0].get_visible_columns();
|
||||
visible_columns.forEach(column => {
|
||||
if (column.fieldname === $(e.target).data('fieldname')) {
|
||||
fieldnames.push(column.fieldname);
|
||||
}
|
||||
});
|
||||
if(!blank_row) {
|
||||
if (row_idx > cur_frm.doc[cur_table_field].length){
|
||||
cur_grid.add_new_row();
|
||||
}
|
||||
|
||||
let row_idx = locals[doctype][row_docname].idx;
|
||||
data.forEach((row, i) => {
|
||||
let blank_row = !row.filter(Boolean).length;
|
||||
if (blank_row) return;
|
||||
|
||||
setTimeout(() => {
|
||||
if (row_idx > this.frm.doc[table_field].length) {
|
||||
this.grid.add_new_row();
|
||||
}
|
||||
if (row_idx > 1 && (row_idx - 1) % grid_pagination.page_length === 0) {
|
||||
grid_pagination.go_to_page(grid_pagination.page_index + 1);
|
||||
}
|
||||
var cur_row = cur_grid_rows[row_idx - 1];
|
||||
row_idx ++;
|
||||
var row_name = cur_row.doc.name;
|
||||
$.each(row, function(ci, value) {
|
||||
if (fieldnames[ci]) frappe.model.set_value(cur_doctype, row_name, fieldnames[ci], value);
|
||||
|
||||
const row_name = grid_rows[row_idx - 1].doc.name;
|
||||
row.forEach((value, data_index) => {
|
||||
if (fieldnames[data_index]) {
|
||||
frappe.model.set_value(doctype, row_name, fieldnames[data_index], value);
|
||||
}
|
||||
});
|
||||
frappe.show_progress(__('Processing'), i, data.length);
|
||||
}
|
||||
row_idx++;
|
||||
|
||||
let progress = i + 1;
|
||||
frappe.show_progress(__('Processing'), progress, data.length);
|
||||
if (progress === data.length) {
|
||||
frappe.hide_progress();
|
||||
}
|
||||
}, 0);
|
||||
});
|
||||
frappe.hide_progress();
|
||||
return false; // Prevent the default handler from running.
|
||||
});
|
||||
},
|
||||
get_field(field_name) {
|
||||
let fieldname;
|
||||
this.grid.meta.fields.some(field => {
|
||||
if (frappe.model.no_value_type.includes(field.fieldtype)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
field_name = field_name.toLowerCase();
|
||||
const is_field_matching = field_name => {
|
||||
return (
|
||||
field.fieldname.toLowerCase() === field_name ||
|
||||
(field.label || '').toLowerCase() === field_name
|
||||
);
|
||||
};
|
||||
|
||||
if (is_field_matching()) {
|
||||
fieldname = field.fieldname;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
return fieldname;
|
||||
},
|
||||
refresh_input: function() {
|
||||
this.grid.refresh();
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue