From d72ce0b06b912ee6af399ac242e561ea63b10dad Mon Sep 17 00:00:00 2001 From: Ali <010109ali@gmail.com> Date: Tue, 28 Oct 2025 14:43:48 +0400 Subject: [PATCH] table sums are now available in table row formulas --- .../public/js/formula_editor_table_rows.js | 313 ++++++++++++------ 1 file changed, 206 insertions(+), 107 deletions(-) diff --git a/formula_editor/public/js/formula_editor_table_rows.js b/formula_editor/public/js/formula_editor_table_rows.js index f98373e..3a4ab7f 100644 --- a/formula_editor/public/js/formula_editor_table_rows.js +++ b/formula_editor/public/js/formula_editor_table_rows.js @@ -114,7 +114,29 @@ function createTableRowFormulaModal() { `; + // Стили для модального окна + const modalStyles = ` + + `; + $('body').append(modalHtml); + + // Добавляем стили только если их еще нет + if (!$('#table-row-formula-modal-styles').length) { + $('head').append(modalStyles); + } // Обработчики для селекторов $("#table_row_table").on('change', function() { @@ -525,125 +547,202 @@ function populateTableRowFormulaFieldsAsync(frm, $modal, callback) { $container.append($documentFieldsGroup); - // 2. Добавляем раздел с полями текущей строки таблицы - const $rowFieldsGroup = $(` + // === НОВЫЙ КОД: Добавляем поля из табличных частей === + // 2. Добавляем раздел с полями табличных частей (суммы) + const $tableFieldsGroup = $(`
-
Поля текущей строки
-
+
Поля табличных частей (суммы)
+
`); - $container.append($rowFieldsGroup); + const $tableFieldsContainer = $tableFieldsGroup.find('.field-buttons-container'); - // 3. Добавляем раздел с универсальными полями - if (frm.doc.universal_fields_storage) { - const universalFields = JSON.parse(frm.doc.universal_fields_storage || "{}"); - - if (Object.keys(universalFields).length > 0) { - const $universalFieldGroup = $(` -
-
Универсальные поля
-
-
- `); - - const $universalButtonsContainer = $universalFieldGroup.find('.field-buttons-container'); - - Object.keys(universalFields).forEach(fieldId => { - const field = universalFields[fieldId]; - - if (!field || !field.name) return; - - const $fieldBtn = $(` - - `); - - $universalButtonsContainer.append($fieldBtn); - }); - - $container.append($universalFieldGroup); - } + // Счетчик для отслеживания загруженных таблиц + let tablesToLoad = 0; + let tablesLoaded = 0; + + // Подсчитываем количество таблиц + if (meta && meta.fields) { + meta.fields.forEach(tableField => { + if (tableField.fieldtype === 'Table' && tableField.options) { + tablesToLoad++; + } + }); } - // 4. Добавляем раздел с полями отчетов - if (frm.doc.report_fields_storage) { - const reportFields = JSON.parse(frm.doc.report_fields_storage || "{}"); - - if (Object.keys(reportFields).length > 0) { - const $reportFieldGroup = $(` -
-
Поля отчетов
-
-
- `); - - const $reportButtonsContainer = $reportFieldGroup.find('.field-buttons-container'); - - Object.keys(reportFields).forEach(fieldId => { - const field = reportFields[fieldId]; - - if (!field || !field.name) return; - - const $fieldBtn = $(` - - `); - - $reportButtonsContainer.append($fieldBtn); - }); - - $container.append($reportFieldGroup); - } + // Если нет табличных частей, сразу продолжаем + if (tablesToLoad === 0) { + continueWithOtherGroups(); + return; } - // НОВОЕ: 5. Добавляем группу для полей из конкретных строк табличных частей - const $tableFieldGroup = $(` -
-
Поля из строк табличных частей
-
- + // Проходим по всем табличным частям + 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 = $(` + + `); + + $tableFieldsContainer.append($fieldBtn); + } + }); + } + + // Увеличиваем счетчик загруженных таблиц + tablesLoaded++; + + // Если все таблицы загружены, продолжаем + if (tablesLoaded === tablesToLoad) { + $container.append($tableFieldsGroup); + continueWithOtherGroups(); + } + }); + } + }); + } + + // Функция для продолжения загрузки остальных групп + function continueWithOtherGroups() { + // 3. Добавляем раздел с полями текущей строки таблицы + const $rowFieldsGroup = $(` +
+
Поля текущей строки
+
-
- `); - - $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. Добавляем обработчики для кнопок полей - $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' : - $(this).hasClass('report-field-btn') ? 'report-field' : 'field'; + `); - // Добавляем в формулу - const $token = $(`${fieldText}×`); - $formulaContainer.append($token).append(' '); + $container.append($rowFieldsGroup); - // Добавляем обработчики к токену - addTokenHandlers($formulaContainer); - }); - - if (callback) callback(); + // 4. Добавляем раздел с универсальными полями + if (frm.doc.universal_fields_storage) { + const universalFields = JSON.parse(frm.doc.universal_fields_storage || "{}"); + + if (Object.keys(universalFields).length > 0) { + const $universalFieldGroup = $(` +
+
Универсальные поля
+
+
+ `); + + const $universalButtonsContainer = $universalFieldGroup.find('.field-buttons-container'); + + Object.keys(universalFields).forEach(fieldId => { + const field = universalFields[fieldId]; + + if (!field || !field.name) return; + + const $fieldBtn = $(` + + `); + + $universalButtonsContainer.append($fieldBtn); + }); + + $container.append($universalFieldGroup); + } + } + + // 5. Добавляем раздел с полями отчетов + if (frm.doc.report_fields_storage) { + const reportFields = JSON.parse(frm.doc.report_fields_storage || "{}"); + + if (Object.keys(reportFields).length > 0) { + const $reportFieldGroup = $(` +
+
Поля отчетов
+
+
+ `); + + const $reportButtonsContainer = $reportFieldGroup.find('.field-buttons-container'); + + Object.keys(reportFields).forEach(fieldId => { + const field = reportFields[fieldId]; + + if (!field || !field.name) return; + + const $fieldBtn = $(` + + `); + + $reportButtonsContainer.append($fieldBtn); + }); + + $container.append($reportFieldGroup); + } + } + + // 6. Добавляем группу для полей из конкретных строк табличных частей + const $tableFieldGroup = $(` +
+
Поля из строк табличных частей
+
+ +
+
+ `); + + $container.append($tableFieldGroup); + + // Добавляем обработчик для кнопки выбора поля из строки табличной части + $tableFieldGroup.find('.select-table-field-in-row').on('click', function() { + const targetContainer = $modal.find(".table-row-formula"); + openTableFieldSelector(frm, targetContainer, false); + }); + + // 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' : + $(this).hasClass('report-field-btn') ? 'report-field' : 'field'; + + // Добавляем в формулу + const $token = $(`${fieldText}×`); + $formulaContainer.append($token).append(' '); + + // Добавляем обработчики к токену + addTokenHandlers($formulaContainer); + }); + + if (callback) callback(); + } }); }