feat: enhance purchase orders management with delete and approve actions
- Added delete and approve functionality for purchase orders in the procurement dashboard. - Integrated toast notifications for user feedback on actions. - Updated the purchase orders table to include action buttons for viewing, editing, approving, and deleting orders. refactor: improve stage editor panel UI and functionality - Refactored StageEditorPanel to use a dialog for better user experience. - Enhanced input handling and added custom fields management. - Improved layout and organization of inputs and outputs sections. fix: streamline template builder page layout - Adjusted layout of the template builder page for better responsiveness and usability. - Ensured the StageEditorPanel is displayed correctly when a node is selected. feat: implement vendor code generation logic - Created a new utility function to generate unique vendor codes based on the vendor name. - Updated the vendor creation form to auto-generate vendor codes and display them to the user. - Removed manual vendor code input requirement, improving user experience and reducing errors.
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
/** First word of the name, uppercased and stripped to alphanumerics — falls back to "VN"
|
||||
* so an empty/punctuation-only name still yields a usable base. Mirrors the warehouse
|
||||
* code generator (app/dashboard/warehouse/page.tsx). */
|
||||
function vendorCodeBase(name: string): string {
|
||||
const firstWord = name.trim().split(/\s+/)[0] ?? ""
|
||||
const cleaned = firstWord.toUpperCase().replace(/[^A-Z0-9]/g, "")
|
||||
return cleaned.slice(0, 10) || "VN"
|
||||
}
|
||||
|
||||
/** Appends a numeric suffix until the code doesn't collide with an existing one — the
|
||||
* backend enforces global uniqueness (409 on conflict) but has no generation of its own. */
|
||||
export function generateVendorCode(name: string, existingCodes: string[]): string {
|
||||
const base = `VN-${vendorCodeBase(name)}`
|
||||
if (!existingCodes.includes(base)) return base
|
||||
let suffix = 2
|
||||
while (existingCodes.includes(`${base}${suffix}`)) suffix += 1
|
||||
return `${base}${suffix}`
|
||||
}
|
||||
Reference in New Issue
Block a user