Compare commits
2 Commits
29ded9f6a6
...
c3a42d67b5
| Author | SHA1 | Date | |
|---|---|---|---|
| c3a42d67b5 | |||
| 0a9f589c05 |
@ -201,7 +201,27 @@ export function useAssetMutations() {
|
||||
}
|
||||
};
|
||||
|
||||
return { createAsset, updateAsset, deleteAsset, loading, error };
|
||||
const submitAsset = async (assetName: string) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
|
||||
console.log('[useAssetMutations] Submitting asset:', assetName);
|
||||
const response = await assetService.submitAsset(assetName);
|
||||
console.log('[useAssetMutations] Submit asset response:', response);
|
||||
|
||||
return response;
|
||||
} catch (err) {
|
||||
console.error('[useAssetMutations] Submit asset error:', err);
|
||||
const errorMessage = err instanceof Error ? err.message : 'Failed to submit asset';
|
||||
setError(errorMessage);
|
||||
throw err;
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
return { createAsset, updateAsset, deleteAsset, submitAsset, loading, error };
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
76
src/hooks/useDocTypeMeta.ts
Normal file
76
src/hooks/useDocTypeMeta.ts
Normal file
@ -0,0 +1,76 @@
|
||||
import { useState, useEffect } from 'react';
|
||||
import apiService from '../services/apiService';
|
||||
|
||||
export interface DocTypeField {
|
||||
fieldname: string;
|
||||
fieldtype: string;
|
||||
label: string;
|
||||
allow_on_submit: number; // 0 or 1
|
||||
reqd: number; // 0 or 1 for required
|
||||
read_only: number; // 0 or 1
|
||||
}
|
||||
|
||||
export const useDocTypeMeta = (doctype: string) => {
|
||||
const [fields, setFields] = useState<DocTypeField[]>([]);
|
||||
const [allowOnSubmitFields, setAllowOnSubmitFields] = useState<Set<string>>(new Set());
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
const fetchDocTypeMeta = async () => {
|
||||
if (!doctype) {
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
setLoading(true);
|
||||
const response = await apiService.apiCall<any>(
|
||||
`/api/resource/DocType/${doctype}`
|
||||
);
|
||||
|
||||
// Handle different response structures from Frappe API
|
||||
// Response can be: { data: {...} } or directly {...}
|
||||
const docTypeData = response.data || response;
|
||||
const fieldsList: DocTypeField[] = docTypeData.fields || [];
|
||||
|
||||
// Extract fields that allow editing on submit
|
||||
const allowOnSubmitSet = new Set<string>();
|
||||
fieldsList.forEach((field: DocTypeField) => {
|
||||
// Check both number (1) and boolean (true) formats
|
||||
if (field.allow_on_submit === 1 || field.allow_on_submit === true) {
|
||||
allowOnSubmitSet.add(field.fieldname);
|
||||
}
|
||||
});
|
||||
|
||||
// Debug logging (development only)
|
||||
if (import.meta.env.DEV) {
|
||||
console.log(`[DocTypeMeta] Loaded ${fieldsList.length} fields for ${doctype}`);
|
||||
console.log(`[DocTypeMeta] Fields with allow_on_submit:`, Array.from(allowOnSubmitSet));
|
||||
}
|
||||
|
||||
setFields(fieldsList);
|
||||
setAllowOnSubmitFields(allowOnSubmitSet);
|
||||
setError(null);
|
||||
} catch (err) {
|
||||
console.error(`[DocTypeMeta] Error fetching DocType meta for ${doctype}:`, err);
|
||||
setError(err instanceof Error ? err.message : 'Unknown error');
|
||||
// Don't block the UI if metadata fetch fails - allow all fields to be editable
|
||||
// This is a graceful degradation
|
||||
setFields([]);
|
||||
setAllowOnSubmitFields(new Set());
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
fetchDocTypeMeta();
|
||||
}, [doctype]);
|
||||
|
||||
const isAllowedOnSubmit = (fieldname: string): boolean => {
|
||||
return allowOnSubmitFields.has(fieldname);
|
||||
};
|
||||
|
||||
return { fields, allowOnSubmitFields, isAllowedOnSubmit, loading, error };
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -6,6 +6,7 @@ export interface Asset {
|
||||
name: string;
|
||||
asset_name: string;
|
||||
company: string;
|
||||
docstatus?: number; // 0 = Draft, 1 = Submitted, 2 = Cancelled
|
||||
custom_serial_number?: string;
|
||||
location?: string;
|
||||
custom_manufacturer?: string;
|
||||
@ -207,6 +208,22 @@ class AssetService {
|
||||
const endpoint = `${API_CONFIG.ENDPOINTS.SEARCH_ASSETS}?search_term=${encodeURIComponent(searchTerm)}&limit=${limit}`;
|
||||
return apiService.apiCall<Asset[]>(endpoint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit an asset document (changes docstatus from 0 to 1)
|
||||
*/
|
||||
async submitAsset(assetName: string): Promise<{ message: string }> {
|
||||
return apiService.apiCall('/api/method/frappe.client.submit', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
doctype: 'Asset',
|
||||
name: assetName
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Create and export singleton instance
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user