New order column (test)
This commit is contained in:
parent
34171eaa3c
commit
0d6841402d
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -163,6 +174,10 @@ 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() !== "")) {
|
||||
|
|
@ -170,13 +185,24 @@ frappe.require([
|
|||
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`;
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -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"}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>');
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue