New order column (test)

This commit is contained in:
Ali 2025-08-28 15:54:01 +04:00
parent 34171eaa3c
commit 0d6841402d
3 changed files with 72 additions and 15 deletions

View File

@ -109,20 +109,31 @@ frappe.require([
function restore_formulas(frm) {
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");
if (!fieldname) {
return;
}
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) {
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") {
return;
if (isTriggerField || (!isTriggerField && !isOrderField)) {
if (typeof value !== "string") {
return;
}
}
$(this).val(value);
}
@ -164,19 +175,34 @@ frappe.require([
let triggers = $(frm.fields_dict.formula_fields.wrapper)
.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() !== "")) {
formulasFound++;
formula_data[fieldname] = {
formula: formula || "",
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));
}
// Вспомогательная функция для извлечения порядка из строки обработчика
function extractOrderFromHandler(handlerCode) {
// Ищем комментарий с порядком в строке обработчика
const orderMatch = handlerCode.match(/\/\/ order: (\d+)/);
if (orderMatch) {
return parseInt(orderMatch[1]);
}
return 10; // значение по умолчанию
}
// Генерация клиентского скрипта
function generate_client_script(frm) {
if (!frm.doc.target_doctype) {
@ -504,8 +530,8 @@ frappe.require([
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`;
}
// Сортируем обработчики 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') {
refreshHandlerBody += ` ${needsAsync && handler.uses_universal ? 'await ' : ''}calculate_${handler.field}(frm);\n`;
}
@ -616,7 +649,7 @@ frappe.require([
);
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`;
});

View File

@ -28,6 +28,12 @@ doctype_js = {
"Formula Editor": "formula_editor/doctype/formula_editor/formula_editor_main.js",
}
fixtures = [
{
"doctype": "Formula Editor"
}
]
# include js in doctype list views
# doctype_list_js = {"doctype" : "public/js/doctype_list.js"}

View File

@ -139,8 +139,8 @@ function addTokenStyles() {
}
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;">' +
'<div class="frappe-control input-max-width" data-fieldtype="Data" data-fieldname="' + field.fieldname + '" ' + dataAttr + ' style="flex:1;">' +
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:2;">' +
'<div class="form-group horizontal">' +
'<div class="clearfix"><label class="control-label">' + field.label + ' (' + field.fieldname + ')</label></div>' +
'<div class="control-input-wrapper" style="display:flex;align-items:center;">' +
@ -151,7 +151,7 @@ function createFormulaFieldHtml(field, dataAttr) {
'</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="clearfix"><label class="control-label">Обновлять при изменении</label></div>' +
'<div class="control-input-wrapper" style="display:flex;align-items:center;">' +
@ -162,6 +162,16 @@ function createFormulaFieldHtml(field, dataAttr) {
'</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>');
}