Fix stock mappings JSON fields and enable row selection for editing

This commit is contained in:
Mikhail Chusavitin
2026-02-06 19:39:39 +03:00
parent 104a26d907
commit eb8ac34d83
2 changed files with 18 additions and 8 deletions

View File

@@ -57,9 +57,9 @@ func (StockLog) TableName() string {
// LotPartnumber maps external part numbers to internal lots. // LotPartnumber maps external part numbers to internal lots.
type LotPartnumber struct { type LotPartnumber struct {
Partnumber string `gorm:"column:partnumber;size:255;primaryKey"` Partnumber string `gorm:"column:partnumber;size:255;primaryKey" json:"partnumber"`
LotName string `gorm:"column:lot_name;size:255;primaryKey"` LotName string `gorm:"column:lot_name;size:255;primaryKey" json:"lot_name"`
Description *string `gorm:"column:description;size:10000"` Description *string `gorm:"column:description;size:10000" json:"description,omitempty"`
} }
func (LotPartnumber) TableName() string { func (LotPartnumber) TableName() string {

View File

@@ -308,6 +308,7 @@ let isCreatingPricelist = false;
let cachedDbUsername = null; let cachedDbUsername = null;
let syncUsersStatusTimer = null; let syncUsersStatusTimer = null;
let stockMappingsPage = 1; let stockMappingsPage = 1;
let stockMappingsCache = [];
async function loadTab(tab) { async function loadTab(tab) {
currentTab = tab; currentTab = tab;
@@ -1109,16 +1110,17 @@ async function loadStockMappings(page = 1) {
const data = await resp.json(); const data = await resp.json();
if (!resp.ok) throw new Error(data.error || 'Ошибка загрузки'); if (!resp.ok) throw new Error(data.error || 'Ошибка загрузки');
const items = data.items || []; const items = data.items || [];
stockMappingsCache = items;
if (items.length === 0) { if (items.length === 0) {
body.innerHTML = '<tr><td colspan="4" class="px-4 py-3 text-sm text-gray-500">Нет сопоставлений</td></tr>'; body.innerHTML = '<tr><td colspan="4" class="px-4 py-3 text-sm text-gray-500">Нет сопоставлений</td></tr>';
} else { } else {
body.innerHTML = items.map(item => ` body.innerHTML = items.map(item => `
<tr> <tr class="cursor-pointer hover:bg-gray-50" onclick="selectStockMappingRow('${escapeHtml((item.partnumber || item.Partnumber || '')).replace(/'/g, "\\'")}')">
<td class="px-4 py-2 text-sm font-mono">${escapeHtml(item.partnumber)}</td> <td class="px-4 py-2 text-sm font-mono">${escapeHtml(item.partnumber || item.Partnumber || '—')}</td>
<td class="px-4 py-2 text-sm text-gray-600">${escapeHtml(item.description || '—')}</td> <td class="px-4 py-2 text-sm text-gray-600">${escapeHtml(item.description || item.Description || '—')}</td>
<td class="px-4 py-2 text-sm font-mono">${escapeHtml(item.lot_name || '—')}</td> <td class="px-4 py-2 text-sm font-mono">${escapeHtml(item.lot_name || item.LotName || '—')}</td>
<td class="px-4 py-2 text-right"> <td class="px-4 py-2 text-right">
<button data-partnumber="${escapeHtml(item.partnumber)}" onclick="deleteStockMapping(this.dataset.partnumber)" class="text-red-600 hover:text-red-800 text-sm">Удалить</button> <button data-partnumber="${escapeHtml(item.partnumber || item.Partnumber || '')}" onclick="event.stopPropagation(); deleteStockMapping(this.dataset.partnumber)" class="text-red-600 hover:text-red-800 text-sm">Удалить</button>
</td> </td>
</tr> </tr>
`).join(''); `).join('');
@@ -1141,6 +1143,14 @@ async function loadStockMappings(page = 1) {
} }
} }
function selectStockMappingRow(partnumber) {
const normalized = (partnumber || '').trim().toLowerCase();
const row = stockMappingsCache.find(item => ((item.partnumber || item.Partnumber || '').trim().toLowerCase() === normalized));
if (!row) return;
document.getElementById('mapping-partnumber').value = (row.partnumber || row.Partnumber || '').trim();
document.getElementById('mapping-lotname').value = (row.lot_name || row.LotName || '').trim();
}
async function saveStockMapping() { async function saveStockMapping() {
const partnumber = document.getElementById('mapping-partnumber').value.trim(); const partnumber = document.getElementById('mapping-partnumber').value.trim();
const lotName = document.getElementById('mapping-lotname').value.trim(); const lotName = document.getElementById('mapping-lotname').value.trim();