{text}
} +{message}
+ {onRetry && ( + + )} +총 금액
-- ₩{getTotalAmount().toLocaleString()} -
-- 항목 탭에서 추가한 "{masterField.name}" 항목의 속성값들입니다 + 항목 탭에서 추가한 "{masterField.field_name}" 항목의 속성값들입니다
- 이 속성들은 항목 탭에서 "{masterField.name}" 항목을 편집하여 추가/수정/삭제할 수 있습니다. + 이 속성들은 항목 탭에서 "{masterField.field_name}" 항목을 편집하여 추가/수정/삭제할 수 있습니다.
등록된 마스터 항목이 없습니다
-- 항목 추가 버튼을 눌러 재사용 가능한 항목을 등록하세요. -
-등록된 일반 섹션이 없습니다
-- 섹션추가 버튼을 눌러 재사용 가능한 섹션을 등록하세요. -
-- 이 템플릿과 관련되는 항목 목록을 조회합니다 -
- -- 항목을 활용을 구간이에만 추가 버튼을 클릭해보세요 -
-- 품목의 목록명, 수량, 입력방법 고객화된 표시할 수 있습니다 -
-등록된 모듈 섹션이 없습니다
-- 섹션추가 버튼을 눌러 BOM 모듈 섹션을 등록하세요. -
-섹션을 추가해주세요
- ) : ( - itemPages.map(page => ( -섹션을 추가해주세요
- ) : ( - selectedPage.sections - .map((section, index) => { - console.log('Rendering section:', section.title, 'type:', section.type, 'bomItems:', section.bomItems); - return ( -항목을 추가해주세요
- ) : ( - section.fields - .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)) - .map((field, fieldIndex) => ( -왼쪽에서 섹션을 선택하세요
- )} -- 등록된 마스터 항목이 없습니다 -
- ) : ( -{field.description}
- )} - {Array.isArray(field.category) && field.category.length > 0 && ( -- 추가된 컬럼이 없습니다 -
- )} -- 이 항목의 값에 따라 다른 항목이나 섹션을 동적으로 표시/숨김 처리합니다 (모든 입력방식 지원) -
-
- 💡 사용 방법:
- 1. 아래에서 조건값(예: "제품", "원자재")을 추가합니다
- 2. 이 항목을 저장한 후, 같은 섹션에 다른 항목을 추가할 때
- 3. 새 항목의 "조건부 표시" 설정에서 이 항목과 조건값을 선택하면
- 4. 조건이 맞을 때만 해당 항목이 표시됩니다
-
- {newFieldInputType === 'dropdown' && '드롭다운 옵션값을 입력하세요'} - {newFieldInputType === 'checkbox' && '체크박스 상태값(true/false)을 입력하세요'} - {newFieldInputType === 'textbox' && '텍스트 값을 입력하세요 (예: "제품", "부품")'} - {newFieldInputType === 'number' && '숫자 값을 입력하세요 (예: 100, 200)'} - {newFieldInputType === 'date' && '날짜 값을 입력하세요 (예: 2025-01-01)'} - {newFieldInputType === 'textarea' && '텍스트 값을 입력하세요'} -
-- → 이 조건에 연결된 항목들이 표시됩니다 -
-
- 💡 사용 방법:
- 1. 먼저 조건값을 추가합니다 (예: "제품", "부품")
- 2. 각 조건값일 때 표시할 섹션들을 선택합니다
- 3. 사용자가 이 항목에서 값을 선택하면 해당 섹션이 자동으로 표시/숨김 됩니다
-
- 위 조건값 중 하나라도 선택되면 아래 섹션들이 표시됩니다 -
-추가 칼럼
+추가 칼럼
+추가 칼럼
++ 항목 탭에서 추가한 "{masterField.name}" 항목의 속성값들입니다 +
+{property.key}
+ + 마스터 항목 속성 관리 +
++ 이 속성들은 항목 탭에서 "{masterField.name}" 항목을 편집하여 추가/수정/삭제할 수 있습니다. +
+추가 칼럼
+아직 추가된 항목이 없습니다
+위 "추가" 버튼을 클릭하여 새로운 속성을 추가할 수 있습니다
+등록된 마스터 항목이 없습니다
++ 항목 추가 버튼을 눌러 재사용 가능한 항목을 등록하세요. +
+등록된 일반 섹션이 없습니다
++ 섹션추가 버튼을 눌러 재사용 가능한 섹션을 등록하세요. +
++ 이 템플릿과 관련되는 항목 목록을 조회합니다 +
+ ++ 항목을 활용을 구간이에만 추가 버튼을 클릭해보세요 +
++ 품목의 목록명, 수량, 입력방법 고객화된 표시할 수 있습니다 +
+등록된 모듈 섹션이 없습니다
++ 섹션추가 버튼을 눌러 BOM 모듈 섹션을 등록하세요. +
+섹션을 추가해주세요
+ ) : ( + itemPages.map(page => ( +섹션을 추가해주세요
+ ) : ( + selectedPage.sections + .map((section, index) => { + console.log('Rendering section:', section.title, 'type:', section.type, 'bomItems:', section.bomItems); + return ( +항목을 추가해주세요
+ ) : ( + section.fields + .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)) + .map((field, fieldIndex) => ( +왼쪽에서 섹션을 선택하세요
+ )} +{tab.label} 탭의 콘텐츠가 비어있습니다
++ 이 탭에 필요한 기능을 추가하여 사용하세요 +
++ 등록된 마스터 항목이 없습니다 +
+ ) : ( +{field.description}
+ )} + {Array.isArray(field.category) && field.category.length > 0 && ( ++ 추가된 컬럼이 없습니다 +
+ )} ++ 이 항목의 값에 따라 다른 항목이나 섹션을 동적으로 표시/숨김 처리합니다 (모든 입력방식 지원) +
+
+ 💡 사용 방법:
+ 1. 아래에서 조건값(예: "제품", "원자재")을 추가합니다
+ 2. 이 항목을 저장한 후, 같은 섹션에 다른 항목을 추가할 때
+ 3. 새 항목의 "조건부 표시" 설정에서 이 항목과 조건값을 선택하면
+ 4. 조건이 맞을 때만 해당 항목이 표시됩니다
+
+ {newFieldInputType === 'dropdown' && '드롭다운 옵션값을 입력하세요'} + {newFieldInputType === 'checkbox' && '체크박스 상태값(true/false)을 입력하세요'} + {newFieldInputType === 'textbox' && '텍스트 값을 입력하세요 (예: "제품", "부품")'} + {newFieldInputType === 'number' && '숫자 값을 입력하세요 (예: 100, 200)'} + {newFieldInputType === 'date' && '날짜 값을 입력하세요 (예: 2025-01-01)'} + {newFieldInputType === 'textarea' && '텍스트 값을 입력하세요'} +
++ → 이 조건에 연결된 항목들이 표시됩니다 +
+
+ 💡 사용 방법:
+ 1. 먼저 조건값을 추가합니다 (예: "제품", "부품")
+ 2. 각 조건값일 때 표시할 섹션들을 선택합니다
+ 3. 사용자가 이 항목에서 값을 선택하면 해당 섹션이 자동으로 표시/숨김 됩니다
+
+ 위 조건값 중 하나라도 선택되면 아래 섹션들이 표시됩니다 +
+추가 칼럼
+추가 칼럼
+추가 칼럼
++ 항목 탭에서 추가한 "{masterField.name}" 항목의 속성값들입니다 +
+{property.key}
+ + 마스터 항목 속성 관리 +
++ 이 속성들은 항목 탭에서 "{masterField.name}" 항목을 편집하여 추가/수정/삭제할 수 있습니다. +
+추가 칼럼
+아직 추가된 항목이 없습니다
+위 "추가" 버튼을 클릭하여 새로운 속성을 추가할 수 있습니다
+등록된 일반 섹션이 없습니다
++ 섹션추가 버튼을 눌러 재사용 가능한 섹션을 등록하세요. +
++ 이 템플릿과 관련되는 항목 목록을 조회합니다 +
+ ++ 항목을 활용을 구간이에만 추가 버튼을 클릭해보세요 +
++ 품목의 목록명, 수량, 입력방법 고객화된 표시할 수 있습니다 +
+등록된 모듈 섹션이 없습니다
++ 섹션추가 버튼을 눌러 BOM 모듈 섹션을 등록하세요. +
+{tab.label} 탭의 콘텐츠가 비어있습니다
++ 이 탭에 필요한 기능을 추가하여 사용하세요 +
++ 이 항목의 값에 따라 다른 항목이나 섹션을 동적으로 표시/숨김 처리합니다 +
+
+ 💡 사용 방법:
+ 1. 조건값을 추가하고 각 조건값마다 표시할 항목들을 선택합니다
+ 2. 사용자가 이 항목에서 특정 값을 선택하면
+ 3. 해당 조건값에 연결된 항목들만 동적으로 표시됩니다
+
+ 현재 섹션에 표시할 수 있는 다른 항목이 없습니다. +
+ )} +{getPlaceholderText()}
+
+ 💡 사용 방법:
+ 1. 조건값을 추가하고 각 조건값마다 표시할 섹션들을 선택합니다
+ 2. 사용자가 이 항목에서 특정 값을 선택하면
+ 3. 해당 조건값에 연결된 섹션들만 동적으로 표시됩니다
+
{getPlaceholderText()}
++ 등록된 마스터 항목이 없습니다 +
+ ) : ( +{field.description}
+ )} + {Array.isArray(field.category) && field.category.length > 0 && ( ++ 추가된 컬럼이 없습니다 +
+ )} ++ 이 항목의 값에 따라 다른 항목이나 섹션을 동적으로 표시/숨김 처리합니다 (모든 입력방식 지원) +
+
+ 💡 사용 방법:
+ 1. 아래에서 조건값(예: "제품", "원자재")을 추가합니다
+ 2. 이 항목을 저장한 후, 같은 섹션에 다른 항목을 추가할 때
+ 3. 새 항목의 "조건부 표시" 설정에서 이 항목과 조건값을 선택하면
+ 4. 조건이 맞을 때만 해당 항목이 표시됩니다
+
+ {newFieldInputType === 'dropdown' && '드롭다운 옵션값을 입력하세요'} + {newFieldInputType === 'checkbox' && '체크박스 상태값(true/false)을 입력하세요'} + {newFieldInputType === 'textbox' && '텍스트 값을 입력하세요 (예: "제품", "부품")'} + {newFieldInputType === 'number' && '숫자 값을 입력하세요 (예: 100, 200)'} + {newFieldInputType === 'date' && '날짜 값을 입력하세요 (예: 2025-01-01)'} + {newFieldInputType === 'textarea' && '텍스트 값을 입력하세요'} +
++ → 이 조건에 연결된 항목들이 표시됩니다 +
+
+ 💡 사용 방법:
+ 1. 먼저 조건값을 추가합니다 (예: "제품", "부품")
+ 2. 각 조건값일 때 표시할 섹션들을 선택합니다
+ 3. 사용자가 이 항목에서 값을 선택하면 해당 섹션이 자동으로 표시/숨김 됩니다
+
+ 위 조건값 중 하나라도 선택되면 아래 섹션들이 표시됩니다 +
+섹션을 추가해주세요
+ ) : ( + itemPages.map(page => ( +섹션을 추가해주세요
+ ) : ( + selectedPage.sections + .map((section, index) => ( +항목을 추가해주세요
+ ) : ( + section.fields + .sort((a, b) => (a.order_no ?? 0) - (b.order_no ?? 0)) + .map((field, fieldIndex) => ( +왼쪽에서 섹션을 선택하세요
+ )} +등록된 마스터 항목이 없습니다
++ 항목 추가 버튼을 눌러 재사용 가능한 항목을 등록하세요. +
+등록된 일반 섹션이 없습니다
++ 섹션추가 버튼을 눌러 재사용 가능한 섹션을 등록하세요. +
++ 이 템플릿과 관련되는 항목 목록을 조회합니다 +
+ ++ 항목을 활용을 구간이에만 추가 버튼을 클릭해보세요 +
++ 품목의 목록명, 수량, 입력방법 고객화된 표시할 수 있습니다 +
+등록된 모듈 섹션이 없습니다
++ 섹션추가 버튼을 눌러 BOM 모듈 섹션을 등록하세요. +
+{message}
+ {onRetry && ( + + )} +{text}
} +(() => { + if (typeof window === 'undefined') return initialQuotes; const saved = localStorage.getItem('mes-quotes'); return saved ? JSON.parse(saved) : initialQuotes; }); const [productionOrders, setProductionOrders] = useState(() => { + if (typeof window === 'undefined') return initialProductionOrders; const saved = localStorage.getItem('mes-productionOrders'); return saved ? JSON.parse(saved) : initialProductionOrders; }); const [qualityInspections, setQualityInspections] = useState (() => { + if (typeof window === 'undefined') return initialQualityInspections; const saved = localStorage.getItem('mes-qualityInspections'); return saved ? JSON.parse(saved) : initialQualityInspections; }); const [inventoryItems, setInventoryItems] = useState (() => { + if (typeof window === 'undefined') return initialInventoryItems; const saved = localStorage.getItem('mes-inventoryItems'); return saved ? JSON.parse(saved) : initialInventoryItems; }); const [purchaseOrders, setPurchaseOrders] = useState