mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-22 05:32:12 -03:00
156 lines
4.8 KiB
JavaScript
156 lines
4.8 KiB
JavaScript
import { createCheckpointCard } from '../components/CheckpointCard.js';
|
|
import {
|
|
loadMoreModels,
|
|
fetchModelsPage,
|
|
resetAndReload as baseResetAndReload,
|
|
resetAndReloadWithVirtualScroll,
|
|
loadMoreWithVirtualScroll,
|
|
refreshModels as baseRefreshModels,
|
|
deleteModel as baseDeleteModel,
|
|
replaceModelPreview,
|
|
fetchCivitaiMetadata,
|
|
refreshSingleModelMetadata,
|
|
excludeModel as baseExcludeModel
|
|
} from './baseModelApi.js';
|
|
import { state } from '../state/index.js';
|
|
|
|
/**
|
|
* Fetch checkpoints with pagination for virtual scrolling
|
|
* @param {number} page - Page number to fetch
|
|
* @param {number} pageSize - Number of items per page
|
|
* @returns {Promise<Object>} Object containing items, total count, and pagination info
|
|
*/
|
|
export async function fetchCheckpointsPage(page = 1, pageSize = 100) {
|
|
return fetchModelsPage({
|
|
modelType: 'checkpoint',
|
|
page,
|
|
pageSize,
|
|
endpoint: '/api/checkpoints'
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Load more checkpoints with pagination - updated to work with VirtualScroller
|
|
* @param {boolean} resetPage - Whether to reset to the first page
|
|
* @param {boolean} updateFolders - Whether to update folder tags
|
|
* @returns {Promise<void>}
|
|
*/
|
|
export async function loadMoreCheckpoints(resetPage = false, updateFolders = false) {
|
|
// Check if virtual scroller is available
|
|
if (state.virtualScroller) {
|
|
return loadMoreWithVirtualScroll({
|
|
modelType: 'checkpoint',
|
|
resetPage,
|
|
updateFolders,
|
|
fetchPageFunction: fetchCheckpointsPage
|
|
});
|
|
} else {
|
|
// Fall back to the original implementation if virtual scroller isn't available
|
|
return loadMoreModels({
|
|
resetPage,
|
|
updateFolders,
|
|
modelType: 'checkpoint',
|
|
createCardFunction: createCheckpointCard,
|
|
endpoint: '/api/checkpoints'
|
|
});
|
|
}
|
|
}
|
|
|
|
// Reset and reload checkpoints
|
|
export async function resetAndReload(updateFolders = false) {
|
|
// Check if virtual scroller is available
|
|
if (state.virtualScroller) {
|
|
return resetAndReloadWithVirtualScroll({
|
|
modelType: 'checkpoint',
|
|
updateFolders,
|
|
fetchPageFunction: fetchCheckpointsPage
|
|
});
|
|
} else {
|
|
// Fall back to original implementation
|
|
return baseResetAndReload({
|
|
updateFolders,
|
|
modelType: 'checkpoint',
|
|
loadMoreFunction: loadMoreCheckpoints
|
|
});
|
|
}
|
|
}
|
|
|
|
// Refresh checkpoints
|
|
export async function refreshCheckpoints(fullRebuild = false) {
|
|
return baseRefreshModels({
|
|
modelType: 'checkpoint',
|
|
scanEndpoint: '/api/checkpoints/scan',
|
|
resetAndReloadFunction: resetAndReload,
|
|
fullRebuild: fullRebuild
|
|
});
|
|
}
|
|
|
|
// Delete a checkpoint
|
|
export function deleteCheckpoint(filePath) {
|
|
return baseDeleteModel(filePath, 'checkpoint');
|
|
}
|
|
|
|
// Replace checkpoint preview
|
|
export function replaceCheckpointPreview(filePath) {
|
|
return replaceModelPreview(filePath, 'checkpoint');
|
|
}
|
|
|
|
// Fetch metadata from Civitai for checkpoints
|
|
export async function fetchCivitai() {
|
|
return fetchCivitaiMetadata({
|
|
modelType: 'checkpoint',
|
|
fetchEndpoint: '/api/checkpoints/fetch-all-civitai',
|
|
resetAndReloadFunction: resetAndReload
|
|
});
|
|
}
|
|
|
|
// Refresh single checkpoint metadata
|
|
export async function refreshSingleCheckpointMetadata(filePath) {
|
|
const success = await refreshSingleModelMetadata(filePath, 'checkpoint');
|
|
if (success) {
|
|
// Reload the current view to show updated data
|
|
await resetAndReload();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Save model metadata to the server
|
|
* @param {string} filePath - Path to the model file
|
|
* @param {Object} data - Metadata to save
|
|
* @returns {Promise} - Promise that resolves with the server response
|
|
*/
|
|
export async function saveModelMetadata(filePath, data) {
|
|
try {
|
|
// Show loading indicator
|
|
state.loadingManager.showSimpleLoading('Saving metadata...');
|
|
|
|
const response = await fetch('/api/checkpoints/save-metadata', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify({
|
|
file_path: filePath,
|
|
...data
|
|
})
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error('Failed to save metadata');
|
|
}
|
|
|
|
return response.json();
|
|
} finally {
|
|
// Always hide the loading indicator when done
|
|
state.loadingManager.hide();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Exclude a checkpoint model from being shown in the UI
|
|
* @param {string} filePath - File path of the checkpoint to exclude
|
|
* @returns {Promise<boolean>} Promise resolving to success status
|
|
*/
|
|
export function excludeCheckpoint(filePath) {
|
|
return baseExcludeModel(filePath, 'checkpoint');
|
|
} |