Enhance Item Search Functionality in Sales Order Page

- Updated the item search logic to include additional filters for both item name and item number, improving search accuracy.
- Implemented an API call to fetch item information based on the search keyword, allowing for dynamic filtering of results.
- Adjusted the state management to handle cases where no items are found, ensuring a smooth user experience.

(TASK: ERP-031)
This commit is contained in:
kjs
2026-05-08 17:01:54 +09:00
parent a8457de52f
commit 0746db5eff
7 changed files with 154 additions and 7 deletions

View File

@@ -784,7 +784,28 @@ export default function SalesOrderPage() {
setItemSearchLoading(true);
try {
const filters: any[] = [];
if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword });
if (itemSearchKeyword) {
const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, {
page: 1, size: 0,
dataFilter: {
enabled: true,
matchType: "any",
filters: [
{ columnName: "item_name", operator: "contains", value: itemSearchKeyword },
{ columnName: "item_number", operator: "contains", value: itemSearchKeyword },
],
},
autoFilter: true,
});
const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || [];
const kwIds = kwRows.map((r: any) => r.id).filter(Boolean);
if (kwIds.length === 0) {
setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1);
setItemSearchLoading(false);
return;
}
filters.push({ columnName: "id", operator: "in", value: kwIds });
}
// 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용
if (itemSearchDivision !== "all") {

View File

@@ -784,7 +784,28 @@ export default function SalesOrderPage() {
setItemSearchLoading(true);
try {
const filters: any[] = [];
if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword });
if (itemSearchKeyword) {
const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, {
page: 1, size: 0,
dataFilter: {
enabled: true,
matchType: "any",
filters: [
{ columnName: "item_name", operator: "contains", value: itemSearchKeyword },
{ columnName: "item_number", operator: "contains", value: itemSearchKeyword },
],
},
autoFilter: true,
});
const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || [];
const kwIds = kwRows.map((r: any) => r.id).filter(Boolean);
if (kwIds.length === 0) {
setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1);
setItemSearchLoading(false);
return;
}
filters.push({ columnName: "id", operator: "in", value: kwIds });
}
// 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용
if (itemSearchDivision !== "all") {

View File

@@ -784,7 +784,28 @@ export default function SalesOrderPage() {
setItemSearchLoading(true);
try {
const filters: any[] = [];
if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword });
if (itemSearchKeyword) {
const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, {
page: 1, size: 0,
dataFilter: {
enabled: true,
matchType: "any",
filters: [
{ columnName: "item_name", operator: "contains", value: itemSearchKeyword },
{ columnName: "item_number", operator: "contains", value: itemSearchKeyword },
],
},
autoFilter: true,
});
const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || [];
const kwIds = kwRows.map((r: any) => r.id).filter(Boolean);
if (kwIds.length === 0) {
setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1);
setItemSearchLoading(false);
return;
}
filters.push({ columnName: "id", operator: "in", value: kwIds });
}
// 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용
if (itemSearchDivision !== "all") {

View File

@@ -784,7 +784,28 @@ export default function SalesOrderPage() {
setItemSearchLoading(true);
try {
const filters: any[] = [];
if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword });
if (itemSearchKeyword) {
const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, {
page: 1, size: 0,
dataFilter: {
enabled: true,
matchType: "any",
filters: [
{ columnName: "item_name", operator: "contains", value: itemSearchKeyword },
{ columnName: "item_number", operator: "contains", value: itemSearchKeyword },
],
},
autoFilter: true,
});
const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || [];
const kwIds = kwRows.map((r: any) => r.id).filter(Boolean);
if (kwIds.length === 0) {
setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1);
setItemSearchLoading(false);
return;
}
filters.push({ columnName: "id", operator: "in", value: kwIds });
}
// 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용
if (itemSearchDivision !== "all") {

View File

@@ -785,7 +785,28 @@ export default function SalesOrderPage() {
setItemSearchLoading(true);
try {
const filters: any[] = [];
if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword });
if (itemSearchKeyword) {
const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, {
page: 1, size: 0,
dataFilter: {
enabled: true,
matchType: "any",
filters: [
{ columnName: "item_name", operator: "contains", value: itemSearchKeyword },
{ columnName: "item_number", operator: "contains", value: itemSearchKeyword },
],
},
autoFilter: true,
});
const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || [];
const kwIds = kwRows.map((r: any) => r.id).filter(Boolean);
if (kwIds.length === 0) {
setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1);
setItemSearchLoading(false);
return;
}
filters.push({ columnName: "id", operator: "in", value: kwIds });
}
// 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용
if (itemSearchDivision !== "all") {

View File

@@ -784,7 +784,28 @@ export default function SalesOrderPage() {
setItemSearchLoading(true);
try {
const filters: any[] = [];
if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword });
if (itemSearchKeyword) {
const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, {
page: 1, size: 0,
dataFilter: {
enabled: true,
matchType: "any",
filters: [
{ columnName: "item_name", operator: "contains", value: itemSearchKeyword },
{ columnName: "item_number", operator: "contains", value: itemSearchKeyword },
],
},
autoFilter: true,
});
const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || [];
const kwIds = kwRows.map((r: any) => r.id).filter(Boolean);
if (kwIds.length === 0) {
setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1);
setItemSearchLoading(false);
return;
}
filters.push({ columnName: "id", operator: "in", value: kwIds });
}
// 관리품목 필터: 다중값(콤마 구분) 저장된 경우도 매칭되도록 contains 사용
if (itemSearchDivision !== "all") {

View File

@@ -599,7 +599,28 @@ export default function JeilGlassOrderPage() {
const filters: any[] = [];
if (salesCode) filters.push({ columnName: "division", operator: "contains", value: salesCode });
if (productCode) filters.push({ columnName: "type", operator: "equals", value: productCode });
if (itemSearchKeyword) filters.push({ columnName: "item_name", operator: "contains", value: itemSearchKeyword });
if (itemSearchKeyword) {
const kwRes = await apiClient.post(`/table-management/tables/item_info/data`, {
page: 1, size: 0,
dataFilter: {
enabled: true,
matchType: "any",
filters: [
{ columnName: "item_name", operator: "contains", value: itemSearchKeyword },
{ columnName: "item_number", operator: "contains", value: itemSearchKeyword },
],
},
autoFilter: true,
});
const kwRows = kwRes.data?.data?.data || kwRes.data?.data?.rows || [];
const kwIds = kwRows.map((r: any) => r.id).filter(Boolean);
if (kwIds.length === 0) {
setItemSearchResults([]); setItemTotal(0); setItemTotalPages(1);
setItemSearchLoading(false);
return;
}
filters.push({ columnName: "id", operator: "in", value: kwIds });
}
if (itemSearchWidth) filters.push({ columnName: "width", operator: "equals", value: itemSearchWidth });
if (itemSearchHeight) filters.push({ columnName: "height", operator: "equals", value: itemSearchHeight });
if (itemSearchThickness) filters.push({ columnName: "thickness", operator: "equals", value: itemSearchThickness });