New order column (test)
This commit is contained in:
parent
34171eaa3c
commit
0d6841402d
|
|
@ -109,20 +109,31 @@ frappe.require([
|
||||||
function restore_formulas(frm) {
|
function restore_formulas(frm) {
|
||||||
let stored_formulas = JSON.parse(frm.doc.formula_storage || "{}");
|
let stored_formulas = JSON.parse(frm.doc.formula_storage || "{}");
|
||||||
|
|
||||||
$(frm.fields_dict.formula_fields.wrapper).find('.formula-input, .trigger-input').each(function() {
|
$(frm.fields_dict.formula_fields.wrapper).find('.formula-input, .trigger-input, .order-input').each(function() {
|
||||||
let fieldname = $(this).attr("data-fieldname");
|
let fieldname = $(this).attr("data-fieldname");
|
||||||
if (!fieldname) {
|
if (!fieldname) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let isTriggerField = fieldname.endsWith("_triggers");
|
let isTriggerField = fieldname.endsWith("_triggers");
|
||||||
let baseFieldname = isTriggerField ? fieldname.replace("_triggers", "") : fieldname;
|
let isOrderField = fieldname.endsWith("_order");
|
||||||
|
let baseFieldname = isTriggerField ? fieldname.replace("_triggers", "") :
|
||||||
|
isOrderField ? fieldname.replace("_order", "") : fieldname;
|
||||||
|
|
||||||
if (stored_formulas[baseFieldname] !== undefined) {
|
if (stored_formulas[baseFieldname] !== undefined) {
|
||||||
let value = isTriggerField ? stored_formulas[baseFieldname].triggers : stored_formulas[baseFieldname].formula;
|
let value;
|
||||||
|
if (isTriggerField) {
|
||||||
|
value = stored_formulas[baseFieldname].triggers;
|
||||||
|
} else if (isOrderField) {
|
||||||
|
value = stored_formulas[baseFieldname].order || 10;
|
||||||
|
} else {
|
||||||
|
value = stored_formulas[baseFieldname].formula;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof value !== "string") {
|
if (isTriggerField || (!isTriggerField && !isOrderField)) {
|
||||||
return;
|
if (typeof value !== "string") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$(this).val(value);
|
$(this).val(value);
|
||||||
}
|
}
|
||||||
|
|
@ -163,6 +174,10 @@ frappe.require([
|
||||||
// Получаем триггерное поле
|
// Получаем триггерное поле
|
||||||
let triggers = $(frm.fields_dict.formula_fields.wrapper)
|
let triggers = $(frm.fields_dict.formula_fields.wrapper)
|
||||||
.find(`[data-fieldname="${fieldname}_triggers"] input`).val();
|
.find(`[data-fieldname="${fieldname}_triggers"] input`).val();
|
||||||
|
|
||||||
|
// Получаем поле порядка
|
||||||
|
let order = $(frm.fields_dict.formula_fields.wrapper)
|
||||||
|
.find(`[data-fieldname="${fieldname}_order"] input`).val();
|
||||||
|
|
||||||
// Проверяем, что формула или триггеры не пустые
|
// Проверяем, что формула или триггеры не пустые
|
||||||
if (formula.trim() !== "" || (triggers && triggers.trim() !== "")) {
|
if (formula.trim() !== "" || (triggers && triggers.trim() !== "")) {
|
||||||
|
|
@ -170,13 +185,24 @@ frappe.require([
|
||||||
formula_data[fieldname] = {
|
formula_data[fieldname] = {
|
||||||
formula: formula || "",
|
formula: formula || "",
|
||||||
triggers: triggers || "",
|
triggers: triggers || "",
|
||||||
is_table_field: is_table_field
|
is_table_field: is_table_field,
|
||||||
|
order: order ? parseInt(order) : 10
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
frm.set_value("formula_storage", JSON.stringify(formula_data));
|
frm.set_value("formula_storage", JSON.stringify(formula_data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Вспомогательная функция для извлечения порядка из строки обработчика
|
||||||
|
function extractOrderFromHandler(handlerCode) {
|
||||||
|
// Ищем комментарий с порядком в строке обработчика
|
||||||
|
const orderMatch = handlerCode.match(/\/\/ order: (\d+)/);
|
||||||
|
if (orderMatch) {
|
||||||
|
return parseInt(orderMatch[1]);
|
||||||
|
}
|
||||||
|
return 10; // значение по умолчанию
|
||||||
|
}
|
||||||
|
|
||||||
// Генерация клиентского скрипта
|
// Генерация клиентского скрипта
|
||||||
function generate_client_script(frm) {
|
function generate_client_script(frm) {
|
||||||
if (!frm.doc.target_doctype) {
|
if (!frm.doc.target_doctype) {
|
||||||
|
|
@ -504,8 +530,8 @@ frappe.require([
|
||||||
triggerHandlers[trigger].isAsync = true;
|
triggerHandlers[trigger].isAsync = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Добавляем вызов функции расчета
|
// Добавляем вызов функции расчета с информацией о порядке
|
||||||
triggerHandlers[trigger].handlers.push(`await calculate_${fieldname}(frm);`);
|
triggerHandlers[trigger].handlers.push(`await calculate_${fieldname}(frm); // order: ${field_info.order || 10}`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -540,8 +566,15 @@ frappe.require([
|
||||||
refreshHandlerBody += ` await calculate_universal_fields(frm);\n`;
|
refreshHandlerBody += ` await calculate_universal_fields(frm);\n`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Сортируем обработчики refresh по порядку
|
||||||
|
const sortedRefreshHandlers = refreshHandlers.slice().sort((a, b) => {
|
||||||
|
const orderA = formula_data[a.field] ? (formula_data[a.field].order || 10) : 10;
|
||||||
|
const orderB = formula_data[b.field] ? (formula_data[b.field].order || 10) : 10;
|
||||||
|
return orderA - orderB;
|
||||||
|
});
|
||||||
|
|
||||||
// Добавляем вызовы для каждого поля с триггером "При открытии документа"
|
// Добавляем вызовы для каждого поля с триггером "При открытии документа"
|
||||||
refreshHandlers.forEach(handler => {
|
sortedRefreshHandlers.forEach(handler => {
|
||||||
if (!handler.type || handler.type !== 'table_row') {
|
if (!handler.type || handler.type !== 'table_row') {
|
||||||
refreshHandlerBody += ` ${needsAsync && handler.uses_universal ? 'await ' : ''}calculate_${handler.field}(frm);\n`;
|
refreshHandlerBody += ` ${needsAsync && handler.uses_universal ? 'await ' : ''}calculate_${handler.field}(frm);\n`;
|
||||||
}
|
}
|
||||||
|
|
@ -616,7 +649,7 @@ frappe.require([
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!hasUniversalCall) {
|
if (!hasUniversalCall) {
|
||||||
triggerHandlers[field].handlers.unshift('await calculate_universal_fields(frm);');
|
triggerHandlers[field].handlers.unshift('await calculate_universal_fields(frm); // order: 0');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -633,8 +666,16 @@ frappe.require([
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Добавляем все обработчики
|
// Сортируем обработчики по порядку выполнения
|
||||||
handler.handlers.forEach(handlerCode => {
|
const sortedHandlers = handler.handlers.slice().sort((a, b) => {
|
||||||
|
// Извлекаем порядок из строки обработчика
|
||||||
|
const orderA = extractOrderFromHandler(a) || 10;
|
||||||
|
const orderB = extractOrderFromHandler(b) || 10;
|
||||||
|
return orderA - orderB;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Добавляем отсортированные обработчики
|
||||||
|
sortedHandlers.forEach(handlerCode => {
|
||||||
main_script += ` ${handlerCode}\n`;
|
main_script += ` ${handlerCode}\n`;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,12 @@ doctype_js = {
|
||||||
"Formula Editor": "formula_editor/doctype/formula_editor/formula_editor_main.js",
|
"Formula Editor": "formula_editor/doctype/formula_editor/formula_editor_main.js",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fixtures = [
|
||||||
|
{
|
||||||
|
"doctype": "Formula Editor"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
# include js in doctype list views
|
# include js in doctype list views
|
||||||
# doctype_list_js = {"doctype" : "public/js/doctype_list.js"}
|
# doctype_list_js = {"doctype" : "public/js/doctype_list.js"}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -139,8 +139,8 @@ function addTokenStyles() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function createFormulaFieldHtml(field, dataAttr) {
|
function createFormulaFieldHtml(field, dataAttr) {
|
||||||
return $('<div class="formula-row" style="display:flex;justify-content:space-between;gap:20px;align-items:center;width:100%;margin-bottom:10px;">' +
|
return $('<div class="formula-row" style="display:flex;justify-content:space-between;gap:15px;align-items:center;width:100%;margin-bottom:10px;">' +
|
||||||
'<div class="frappe-control input-max-width" data-fieldtype="Data" data-fieldname="' + field.fieldname + '" ' + dataAttr + ' style="flex:1;">' +
|
'<div class="frappe-control input-max-width" data-fieldtype="Data" data-fieldname="' + field.fieldname + '" ' + dataAttr + ' style="flex:2;">' +
|
||||||
'<div class="form-group horizontal">' +
|
'<div class="form-group horizontal">' +
|
||||||
'<div class="clearfix"><label class="control-label">' + field.label + ' (' + field.fieldname + ')</label></div>' +
|
'<div class="clearfix"><label class="control-label">' + field.label + ' (' + field.fieldname + ')</label></div>' +
|
||||||
'<div class="control-input-wrapper" style="display:flex;align-items:center;">' +
|
'<div class="control-input-wrapper" style="display:flex;align-items:center;">' +
|
||||||
|
|
@ -151,7 +151,7 @@ function createFormulaFieldHtml(field, dataAttr) {
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'<div class="frappe-control input-max-width" data-fieldtype="Data" data-fieldname="' + field.fieldname + '_triggers" ' + dataAttr + ' style="flex:1;">' +
|
'<div class="frappe-control input-max-width" data-fieldtype="Data" data-fieldname="' + field.fieldname + '_triggers" ' + dataAttr + ' style="flex:2;">' +
|
||||||
'<div class="form-group horizontal">' +
|
'<div class="form-group horizontal">' +
|
||||||
'<div class="clearfix"><label class="control-label">Обновлять при изменении</label></div>' +
|
'<div class="clearfix"><label class="control-label">Обновлять при изменении</label></div>' +
|
||||||
'<div class="control-input-wrapper" style="display:flex;align-items:center;">' +
|
'<div class="control-input-wrapper" style="display:flex;align-items:center;">' +
|
||||||
|
|
@ -162,6 +162,16 @@ function createFormulaFieldHtml(field, dataAttr) {
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
'</div>' +
|
'</div>' +
|
||||||
|
'<div class="frappe-control input-max-width" data-fieldtype="Int" data-fieldname="' + field.fieldname + '_order" ' + dataAttr + ' style="flex:0.5;">' +
|
||||||
|
'<div class="form-group horizontal">' +
|
||||||
|
'<div class="clearfix"><label class="control-label">Порядок</label></div>' +
|
||||||
|
'<div class="control-input-wrapper">' +
|
||||||
|
'<div class="control-input">' +
|
||||||
|
'<input type="number" class="input-with-feedback form-control order-input" data-fieldtype="Int" data-fieldname="' + field.fieldname + '_order" ' + dataAttr + ' autocomplete="off" placeholder="10" min="0" step="1">' +
|
||||||
|
'</div>' +
|
||||||
|
'</div>' +
|
||||||
|
'</div>' +
|
||||||
|
'</div>' +
|
||||||
'</div>');
|
'</div>');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue