table sums are now available in table row formulas

This commit is contained in:
Ali 2025-10-28 14:43:48 +04:00
parent 2dd18c4143
commit d72ce0b06b
1 changed files with 206 additions and 107 deletions

View File

@ -114,8 +114,30 @@ function createTableRowFormulaModal() {
</div>
`;
// Стили для модального окна
const modalStyles = `
<style id="table-row-formula-modal-styles">
/* Стили для кнопок полей табличных частей (суммы) */
.table-sum-field-btn {
background-color: #fff3e0 !important;
border-color: #ffb74d !important;
}
.table-sum-field-btn:hover {
background-color: #ffe0b2 !important;
}
/* Остальные стили уже есть в основных стилях */
</style>
`;
$('body').append(modalHtml);
// Добавляем стили только если их еще нет
if (!$('#table-row-formula-modal-styles').length) {
$('head').append(modalStyles);
}
// Обработчики для селекторов
$("#table_row_table").on('change', function() {
const selectedTable = $(this).val();
@ -525,7 +547,83 @@ function populateTableRowFormulaFieldsAsync(frm, $modal, callback) {
$container.append($documentFieldsGroup);
// 2. Добавляем раздел с полями текущей строки таблицы
// === НОВЫЙ КОД: Добавляем поля из табличных частей ===
// 2. Добавляем раздел с полями табличных частей (суммы)
const $tableFieldsGroup = $(`
<div class="field-group">
<div class="field-group-title">Поля табличных частей (суммы)</div>
<div class="field-buttons-container" data-group="table-fields"></div>
</div>
`);
const $tableFieldsContainer = $tableFieldsGroup.find('.field-buttons-container');
// Счетчик для отслеживания загруженных таблиц
let tablesToLoad = 0;
let tablesLoaded = 0;
// Подсчитываем количество таблиц
if (meta && meta.fields) {
meta.fields.forEach(tableField => {
if (tableField.fieldtype === 'Table' && tableField.options) {
tablesToLoad++;
}
});
}
// Если нет табличных частей, сразу продолжаем
if (tablesToLoad === 0) {
continueWithOtherGroups();
return;
}
// Проходим по всем табличным частям
if (meta && meta.fields) {
meta.fields.forEach(tableField => {
if (tableField.fieldtype === 'Table' && tableField.options) {
// Получаем meta дочерней таблицы
frappe.model.with_doctype(tableField.options, function() {
const childMeta = frappe.get_meta(tableField.options);
if (childMeta && childMeta.fields) {
// Добавляем только числовые поля
childMeta.fields.forEach(childField => {
if (childField.fieldname && ['Int', 'Float', 'Currency'].includes(childField.fieldtype)) {
const tableLabel = tableField.label || tableField.fieldname;
const fieldLabel = childField.label || childField.fieldname;
const combinedFieldname = `${tableField.fieldname}_${childField.fieldname}`;
const $fieldBtn = $(`
<button class="btn btn-sm field-btn table-sum-field-btn draggable-item"
data-fieldname="${combinedFieldname}"
data-label="${tableLabel} → ${fieldLabel}"
data-group="table-fields"
data-fieldtype="${childField.fieldtype}"
draggable="true">
val(${combinedFieldname})
</button>
`);
$tableFieldsContainer.append($fieldBtn);
}
});
}
// Увеличиваем счетчик загруженных таблиц
tablesLoaded++;
// Если все таблицы загружены, продолжаем
if (tablesLoaded === tablesToLoad) {
$container.append($tableFieldsGroup);
continueWithOtherGroups();
}
});
}
});
}
// Функция для продолжения загрузки остальных групп
function continueWithOtherGroups() {
// 3. Добавляем раздел с полями текущей строки таблицы
const $rowFieldsGroup = $(`
<div class="field-group">
<div class="field-group-title">Поля текущей строки</div>
@ -535,7 +633,7 @@ function populateTableRowFormulaFieldsAsync(frm, $modal, callback) {
$container.append($rowFieldsGroup);
// 3. Добавляем раздел с универсальными полями
// 4. Добавляем раздел с универсальными полями
if (frm.doc.universal_fields_storage) {
const universalFields = JSON.parse(frm.doc.universal_fields_storage || "{}");
@ -572,7 +670,7 @@ function populateTableRowFormulaFieldsAsync(frm, $modal, callback) {
}
}
// 4. Добавляем раздел с полями отчетов
// 5. Добавляем раздел с полями отчетов
if (frm.doc.report_fields_storage) {
const reportFields = JSON.parse(frm.doc.report_fields_storage || "{}");
@ -609,7 +707,7 @@ function populateTableRowFormulaFieldsAsync(frm, $modal, callback) {
}
}
// НОВОЕ: 5. Добавляем группу для полей из конкретных строк табличных частей
// 6. Добавляем группу для полей из конкретных строк табличных частей
const $tableFieldGroup = $(`
<div class="field-group">
<div class="field-group-title">Поля из строк табличных частей</div>
@ -623,13 +721,13 @@ function populateTableRowFormulaFieldsAsync(frm, $modal, callback) {
$container.append($tableFieldGroup);
// НОВОЕ: Добавляем обработчик для кнопки выбора поля из строки табличной части
// Добавляем обработчик для кнопки выбора поля из строки табличной части
$tableFieldGroup.find('.select-table-field-in-row').on('click', function() {
const targetContainer = $modal.find(".table-row-formula");
openTableFieldSelector(frm, targetContainer, false);
});
// 6. Добавляем обработчики для кнопок полей
// 7. Добавляем обработчики для кнопок полей
$modal.off('click', '.field-btn, .universal-field-btn, .report-field-btn').on('click', '.field-btn, .universal-field-btn, .report-field-btn', function() {
const fieldText = $(this).text().trim();
const fieldType = $(this).hasClass('universal-field-btn') ? 'universal-field' :
@ -644,6 +742,7 @@ function populateTableRowFormulaFieldsAsync(frm, $modal, callback) {
});
if (callback) callback();
}
});
}