From ca3276680923e876f71743a85ce06bca6cf9fbe6 Mon Sep 17 00:00:00 2001 From: "DESKTOP-TVBJISQ\\Primere" Date: Sun, 8 Mar 2026 15:52:05 +0100 Subject: [PATCH] V 2.0.0 - Universal api #69 - modal issues --- components/primereserver.py | 3 - front_end/primere_visuals.js | 1160 +++++++++++++--------------------- 2 files changed, 435 insertions(+), 728 deletions(-) diff --git a/components/primereserver.py b/components/primereserver.py index 4524349..cf542da 100644 --- a/components/primereserver.py +++ b/components/primereserver.py @@ -285,9 +285,6 @@ async def primere_get_version(request): typefilter = categories_by_type[versionName] category_modelnames = [s for s in allSource if any(x + '.' in s for x in typefilter)] - if len(category_modelnames) == 0: - category_modelnames = allSource - PromptServer.instance.send_sync("VersionListResponse", category_modelnames) return web.json_response({}) diff --git a/front_end/primere_visuals.js b/front_end/primere_visuals.js index a638196..1dc9472 100644 --- a/front_end/primere_visuals.js +++ b/front_end/primere_visuals.js @@ -1,50 +1,77 @@ import { app } from "/scripts/app.js"; import { api } from "/scripts/api.js"; -let eventListenerInit = false; -const realPath = "/extensions/ComfyUI_Primere_Nodes"; //"extensions/Primere"; -const prwPath = "/extensions/ComfyUI_Primere_Nodes"; //"extensions/PrimerePreviews"; +const prwPath = "/extensions/ComfyUI_Primere_Nodes"; const validClasses = ['PrimereVisualCKPT', 'PrimereVisualLORA', 'PrimereVisualEmbedding', 'PrimereVisualHypernetwork', 'PrimereVisualStyle', 'PrimereVisualLYCORIS', 'PrimereVisualPromptOrganizerCSV']; const stackedClasses = ['PrimereVisualLORA', 'PrimereVisualEmbedding', 'PrimereVisualHypernetwork', 'PrimereVisualLYCORIS']; -let widget_name = ""; -let widget_object = {}; -let node_object = {}; -let lastDirObject = {}; -let currentClass = false; -let hiddenWidgets = {}; -let ShowHidden = false; -let FilterType = 'Subdir'; -let SelectedModel = 'SelectedModel'; -let sortType = 'name'; -let operator = 'ASC'; -let PreviewPath = true; -let aeScoreMin = 400; -let aeScoreMax = 900; -let nodeHelper = {}; -let cache_key = ''; -let source_subdirname = ''; -let AutoFilter = false; -let StackVersion = 'Auto'; -let ModelVersion = 'SD1'; -// API -let SetupCacheData = {}; -let VersionCacheData = {}; -let supportedModels = []; -let ModelsByVersion = {}; -let AllPath = []; -let ModelList = {}; -let AscoreDataResponse = {}; -let STimeDataResponse = {}; -let FileDateResponse = {}; -let FileLinkResponse = {}; -let RawImageDataResponse = {}; +const state = { + eventListenerInit: false, + callbackfunct: null, + widget_name: "", + widget_object: {}, + node_object: {}, + lastDirObject: {}, + currentClass: false, + hiddenWidgets: {}, + ShowHidden: false, + FilterType: 'Subdir', + SelectedModel: 'SelectedModel', + sortType: 'name', + operator: 'ASC', + PreviewPath: true, + aeScoreMin: 400, + aeScoreMax: 900, + nodeHelper: {}, + cache_key: '', + source_subdirname: '', + AutoFilter: false, + StackVersion: 'Auto', + ModelVersion: 'SD1', + SetupCacheData: {}, + VersionCacheData: {}, + supportedModels: [], + ModelsByVersion: {}, + AllPath: [], + ModelList: {}, + AscoreDataResponse: {}, + STimeDataResponse: {}, + FileDateResponse: {}, + FileLinkResponse: {}, + RawImageDataResponse: {}, +}; + +function apiPost(endpoint, eventName, params = {}) { + return new Promise((resolve) => { + api.addEventListener(eventName, (event) => resolve(event.detail), true); + const body = new FormData(); + for (const [key, value] of Object.entries(params)) body.append(key, value); + api.fetchApi(endpoint, { method: "POST", body }); + }); +} + +const categoryHandler = (setupValue, method, setupKey) => apiPost('/primere_category_handler', 'LastCategoryResponse', { setupValue, setupMethod: method, setupKey }); +const getSupportedModels = () => apiPost('/primere_supported_models', 'SupportedModelsResponse', { models: 'get' }); +const getAllPath = (sourceType) => apiPost('/primere_modelpaths', 'AllPathResponse', { sourceType }); +const getModelData = (message) => apiPost('/primere_get_category', 'CategoryListResponse', { cache_key: message }); +const getModelDatabyPath = (subdir, type) => apiPost('/primere_get_subdir', 'SourceListResponse', { subdir, type }); +const getModelDatabyVersion= (subdir, cachekey, version) => apiPost('/primere_get_version', 'VersionListResponse', { subdir, cachekey, version }); +const getCacheByKey = (chachekey) => apiPost('/primere_get_cache', 'CacheByKey', { chachekey }); +const ReadAScores = (type) => apiPost('/primere_get_ascores', 'AscoreData', { type }); +const ReadSTimes = (type) => apiPost('/primere_get_stime', 'STimeData', { type }); +const modelImageData = (SubdirName, PreviewPath) => apiPost('/primere_get_images', 'CollectedImageData', { SubdirName, PreviewPath }); +const ReadFileDate = (sourcetype) => apiPost('/primere_get_filedates', 'FileDateData', { type: sourcetype }); +const ReadFileSymlink = (sourcetype) => apiPost('/primere_get_filelinks', 'FileLinkData', { type: sourcetype }); + +function sendPOSTModelName(modelName) { + const body = new FormData(); + body.append('modelName', modelName); + api.fetchApi("/primere_keyword_parser", { method: "POST", body }); +} function setText(selector, value) { const el = document.querySelector(selector); - if (el) { - el.textContent = value; - } + if (el) el.textContent = value; } function getFilterInput() { @@ -54,9 +81,7 @@ function getFilterInput() { function clearModalCardsKeepingSelected() { const cards = document.querySelectorAll('div.primere-modal-content div.visual-ckpt'); for (const card of cards) { - if (!card.classList.contains('visual-ckpt-selected')) { - card.remove(); - } + if (!card.classList.contains('visual-ckpt-selected')) card.remove(); } } @@ -72,24 +97,10 @@ function clearSelectedPathButtons() { app.registerExtension({ name: "Primere.VisualMenu", - /* init() { - Promise.all([ - fetch('extensions/Primere/keywords/lora-keyword.txt').then(x => x.text()), - fetch('extensions/Primere/keywords/model-keyword.txt').then(x => x.text()) - ]).then(([Lora, Model]) => { - console.log(Lora); - console.log(Model); - }); - }, */ - - /* async setup() { - - }, */ - - async beforeRegisterNodeDef(nodeType, nodeData, app) { // 0 + async beforeRegisterNodeDef(nodeType, nodeData, app) { if (validClasses.includes(nodeData.name)) { if (nodeData.input.hasOwnProperty('hidden') === true) { - hiddenWidgets[nodeData.name] = nodeData.input.hidden; + state.hiddenWidgets[nodeData.name] = nodeData.input.hidden; } const onNodeCreated = nodeType.prototype.onNodeCreated; nodeType.prototype.onNodeCreated = function () { @@ -100,130 +111,295 @@ app.registerExtension({ }, }); +function ModalHandler() { + state.eventListenerInit = true; + + document.body.addEventListener("click", async function (event) { + let modal = null; + + const closeButton = event.target.closest('button.modal-closer'); + if (closeButton) { + modal = document.getElementById("primere_visual_modal"); + if (modal) modal.setAttribute('style', 'display: none; width: 80%; height: 70%;'); + + var lastDirValue = 'All'; + if (state.lastDirObject.hasOwnProperty(state.currentClass) === true) lastDirValue = state.lastDirObject[state.currentClass]; + + if (typeof state.nodeHelper['sortbuttons'] !== "object" || typeof state.nodeHelper['sortbuttons'][0] !== "object" || state.nodeHelper['sortbuttons'][0].indexOf("Path") > -1) { + if (state.AutoFilter !== true) { + await categoryHandler(lastDirValue, 'add', 'last_visual_category' + '_' + state.cache_key); + await categoryHandler(state.FilterType, 'add', 'last_visual_category_type' + '_' + state.cache_key); + const filter = getFilterInput()?.value ?? ''; + await categoryHandler(filter, 'add', 'last_visual_filter' + '_' + state.cache_key); + await categoryHandler(state.sortType, 'add', 'last_visual_sort_type' + '_' + state.cache_key); + await categoryHandler(state.operator, 'add', 'last_visual_sort_operator' + '_' + state.cache_key); + } + } + return; + } + + const selectedImage = event.target.closest('div.primere-modal-content div.visual-ckpt img'); + if (selectedImage) { + var ckptName = selectedImage.dataset.ckptname; + modal = document.getElementById("primere_visual_modal"); + if (modal) modal.setAttribute('style', 'display: none; width: 80%; height: 70%;'); + + var lastDirValue = 'All'; + if (state.lastDirObject.hasOwnProperty(state.currentClass) === true) lastDirValue = state.lastDirObject[state.currentClass]; + + if (state.source_subdirname == 'styles') { + let pathLastIndex = ckptName.lastIndexOf('\\'); + ckptName = ckptName.substring(pathLastIndex + 1); + } + + if (ckptName && typeof state.callbackfunct == 'function') { + state.callbackfunct(ckptName); + sendPOSTModelName(ckptName); + } + + if (typeof state.nodeHelper['sortbuttons'] !== "object" || typeof state.nodeHelper['sortbuttons'][0] !== "object" || state.nodeHelper['sortbuttons'][0].indexOf("Path") > -1) { + if (state.AutoFilter !== true) { + await categoryHandler(lastDirValue, 'add', 'last_visual_category' + '_' + state.cache_key); + await categoryHandler(state.FilterType, 'add', 'last_visual_category_type' + '_' + state.cache_key); + const filter = getFilterInput()?.value ?? ''; + await categoryHandler(filter, 'add', 'last_visual_filter' + '_' + state.cache_key); + await categoryHandler(state.sortType, 'add', 'last_visual_sort_type' + '_' + state.cache_key); + await categoryHandler(state.operator, 'add', 'last_visual_sort_operator' + '_' + state.cache_key); + } + } + return; + } + + var subdirName = 'All'; + var filteredCheckpoints = 0; + + const subdirButton = event.target.closest('div.subdirtab button.subdirfilter'); + if (subdirButton) { + const filterInput = getFilterInput(); + if (filterInput) filterInput.value = ''; + subdirName = subdirButton.dataset.ckptsubdir; + if (state.currentClass !== false) state.lastDirObject[state.currentClass] = subdirName; + + filteredCheckpoints = 0; + clearModalCardsKeepingSelected(); + + if (state.source_subdirname != 'styles') { + state.ModelsByVersion = await getModelData(state.cache_key + '_version'); + } + state.ModelList = await getModelDatabyPath(state.source_subdirname, subdirName); + + if (state.source_subdirname == 'styles') { + if (state.ModelList.includes(state.SelectedModel) || state.ModelList.includes(subdirName + '\\' + state.SelectedModel)) { + var index_pre = (state.ModelList.indexOf(state.SelectedModel) + state.ModelList.indexOf(subdirName + '\\' + state.SelectedModel)) + 1; + if (index_pre !== -1) await state.ModelList.splice(index_pre, 1); + } + } + + for (var checkpoint of state.ModelList) { + let firstletter = checkpoint.charAt(0); + var filterpass = true; + if (state.SelectedModel == checkpoint) filterpass = false; + + if (((firstletter === '.' && state.ShowHidden === true) || firstletter !== '.') && ((checkpoint.match('^NSFW') && state.ShowHidden === true) || !checkpoint.match('^NSFW')) && filterpass == true) { + let pathLastIndex = checkpoint.lastIndexOf('\\'); + let ckptName_full = checkpoint.substring(pathLastIndex + 1); + let dotLastIndex = ckptName_full.lastIndexOf('.'); + var ckptName = ckptName_full.substring(0, dotLastIndex); + var CategoryName = 'Unknown'; + + for (const [ver_index, ver_value] of Object.entries(state.ModelsByVersion)) { + if (ver_value.includes(ckptName)) CategoryName = ver_index; + } + + var container = document.querySelector('div.primere-modal-content.ckpt-container'); + if (subdirName === 'Root') { + let isSubdirExist = checkpoint.lastIndexOf('\\'); + if (isSubdirExist < 0) { + filteredCheckpoints++; + await createCardElement(checkpoint, container, state.SelectedModel, state.source_subdirname, CategoryName); + } + } else { + filteredCheckpoints++; + await createCardElement(checkpoint, container, state.SelectedModel, state.source_subdirname, CategoryName); + } + } + setText('div#primere_visual_modal div.modal_header label.ckpt-counter', String(filteredCheckpoints)); + } + + previewSorter(state.operator, state.sortType); + setText('div#primere_visual_modal div.modal_header label.ckpt-name', subdirName); + setText('div#primere_visual_modal div.modal_header label.ckpt-ver', 'Subdir'); + clearSelectedPathButtons(); + subdirButton.classList.add('selected_path'); + state.FilterType = 'Subdir'; + return; + } + + const versionButton = event.target.closest('div.subdirtab button.verfilter'); + if (versionButton) { + const filterInput = getFilterInput(); + if (filterInput) filterInput.value = ''; + var versionName = versionButton.dataset.ckptver; + + if (state.currentClass !== false) state.lastDirObject[state.currentClass] = versionName; + + filteredCheckpoints = 0; + clearModalCardsKeepingSelected(); + + state.ModelList = await getModelDatabyVersion(state.source_subdirname, state.cache_key + '_version', versionName); + + for (var checkpoint of state.ModelList) { + let firstletter = checkpoint.charAt(0); + var filterpass = true; + if (state.SelectedModel == checkpoint) filterpass = false; + if (((firstletter === '.' && state.ShowHidden === true) || firstletter !== '.') && ((checkpoint.match('^NSFW') && state.ShowHidden === true) || !checkpoint.match('^NSFW')) && filterpass == true) { + filteredCheckpoints++; + var container = document.querySelector('div.primere-modal-content.ckpt-container'); + await createCardElement(checkpoint, container, state.SelectedModel, state.source_subdirname, versionName); + } + } + setText('div#primere_visual_modal div.modal_header label.ckpt-counter', String(filteredCheckpoints)); + + previewSorter(state.operator, state.sortType); + setText('div#primere_visual_modal div.modal_header label.ckpt-name', versionName); + setText('div#primere_visual_modal div.modal_header label.ckpt-ver', 'Version'); + clearSelectedPathButtons(); + versionButton.classList.add('selected_path'); + state.FilterType = 'Version'; + return; + } + + const clearButton = event.target.closest('div.subdirtab button.filter_clear'); + if (clearButton) { + const filterInput = getFilterInput(); + if (filterInput) filterInput.value = ''; + const images = document.querySelectorAll('div.primere-modal-content div.visual-ckpt img'); + filteredCheckpoints = 0; + for (const image of images) { + const parent = image.parentElement; + if (parent) { + parent.style.display = ''; + filteredCheckpoints++; + } + } + setText('div#primere_visual_modal div.modal_header label.ckpt-counter', String(filteredCheckpoints - 1)); + return; + } + + const sortButton = event.target.closest('div.subdirtab button.preview_sort'); + if (sortButton) { + state.sortType = sortButton.dataset.sortsource; + state.operator = document.querySelector('button.preview_sort_direction')?.textContent ?? 'ASC'; + previewSorter(state.operator, state.sortType); + const sortButtons = document.querySelectorAll('div.subdirtab button.preview_sort'); + for (const button of sortButtons) button.classList.remove('selected_path'); + sortButton.classList.add('selected_path'); + return; + } + + const sortDirectionButton = event.target.closest('div.subdirtab button.preview_sort_direction'); + if (sortDirectionButton) { + state.operator = sortDirectionButton.textContent; + if (state.operator == 'ASC') { + sortDirectionButton.textContent = 'DESC'; + state.operator = 'DESC'; + sortDirectionButton.classList.add('selected_path'); + } else { + sortDirectionButton.textContent = 'ASC'; + state.operator = 'ASC'; + sortDirectionButton.classList.remove('selected_path'); + } + previewSorter(state.operator, state.sortType); + } + }); + + document.body.addEventListener("keyup", function (event) { + const filterInput = event.target.closest('div.subdirtab input'); + if (filterInput) previewFilter(filterInput.value); + }); +} class ModalControl { constructor(node) { - let callbackfunct = null; - let modaltitle = ''; - let nodematch = ''; - let isnumeric_end = false; + const modaltitle = ''; + const nodematch = ''; for (var i = 0; i < node.widgets.length; ++i) { var w = node.widgets[i]; - if (!w || w.disabled) - continue; - - if (w.type != "combo") - continue; + if (!w || w.disabled) continue; + if (w.type != "combo") continue; let nx = i; node.widgets[i].mouse = async function (event, pos, node) { - if (event.type == 'pointermove' && validClasses.includes(node.type)) { - return false; - } + if (event.type == 'pointermove' && validClasses.includes(node.type)) return false; - if (stackedClasses.includes(node.type)) { - isnumeric_end = true; - } else { - isnumeric_end = false; - } + const isnumeric_end = stackedClasses.includes(node.type); - currentClass = node.type; + state.currentClass = node.type; var ShowModal = false; - AutoFilter = null; - StackVersion = null; - ModelVersion = null; + state.AutoFilter = null; + state.StackVersion = null; + state.ModelVersion = null; for (var p = 0; p < node.widgets.length; ++p) { - if (node.widgets[p].name == 'show_hidden') { - ShowHidden = node.widgets[p].value; - } - if (node.widgets[p].name == 'show_modal') { - ShowModal = node.widgets[p].value; - } - if (node.widgets[p].name == 'preview_path') { - PreviewPath = node.widgets[p].value; - } - if (node.widgets[p].name == 'aescore_percent_min') { - if (node.widgets[p].value >= 0) { - aeScoreMin = node.widgets[p].value; - } - } - if (node.widgets[p].name == 'aescore_percent_max') { - if (node.widgets[p].value > 0) { - aeScoreMax = node.widgets[p].value; - } - } - if (node.widgets[p].name == 'auto_filter') { - AutoFilter = node.widgets[p].value; - } - if (node.widgets[p].name == 'stack_version') { - StackVersion = node.widgets[p].value; - } - if (node.widgets[p].name == 'model_version') { - ModelVersion = node.widgets[p].value; - } + if (node.widgets[p].name == 'show_hidden') state.ShowHidden = node.widgets[p].value; + if (node.widgets[p].name == 'show_modal') ShowModal = node.widgets[p].value; + if (node.widgets[p].name == 'preview_path') state.PreviewPath = node.widgets[p].value; + if (node.widgets[p].name == 'aescore_percent_min' && node.widgets[p].value >= 0) state.aeScoreMin = node.widgets[p].value; + if (node.widgets[p].name == 'aescore_percent_max' && node.widgets[p].value > 0) state.aeScoreMax = node.widgets[p].value; + if (node.widgets[p].name == 'auto_filter') state.AutoFilter = node.widgets[p].value; + if (node.widgets[p].name == 'stack_version') state.StackVersion = node.widgets[p].value; + if (node.widgets[p].name == 'model_version') state.ModelVersion = node.widgets[p].value; } - widget_name = node.widgets[nx].name; - widget_object = node.widgets[nx]; - node_object = node; + state.widget_name = node.widgets[nx].name; + state.widget_object = node.widgets[nx]; + state.node_object = node; if (ShowModal === true) { const contextMenu = document.querySelector('div.litegraph.litecontextmenu.litemenubar-panel'); - if (contextMenu) { - contextMenu.style.display = 'none'; - } + if (contextMenu) contextMenu.style.display = 'none'; - nodeHelper = hiddenWidgets[currentClass] - source_subdirname = nodeHelper['subdir']; - cache_key = nodeHelper['cache_key']; + state.nodeHelper = state.hiddenWidgets[state.currentClass]; + state.source_subdirname = state.nodeHelper['subdir']; + state.cache_key = state.nodeHelper['cache_key']; - if (eventListenerInit == false) { - ModalHandler(); - } + if (state.eventListenerInit == false) ModalHandler(); if (document.querySelector('div.primere-modal-content div.visual-ckpt')) { const ckptContainer = document.querySelector('div.primere-modal-content.ckpt-container'); - if (ckptContainer) { - ckptContainer.innerHTML = ''; - } + if (ckptContainer) ckptContainer.innerHTML = ''; } - const widgetNumericEnd = /\d$/.test(String(widget_object?.name ?? '')); - //const widgetNumericEnd = Number.isFinite(Number(widget_object.name.substr(-1))); - if (widget_object.name.match(nodematch) && widgetNumericEnd === isnumeric_end) { + const widgetNumericEnd = /\d$/.test(String(state.widget_object?.name ?? '')); + if (state.widget_object.name.match(nodematch) && widgetNumericEnd === isnumeric_end) { await sleep(200); - SelectedModel = node_object.widgets[nx].value; - // setup_visual_modal(modaltitle, 'AllModels', ShowHidden, SelectedModel, source_subdirname, node_object, PreviewPath); + state.SelectedModel = state.node_object.widgets[nx].value; await new Promise((resolve) => requestAnimationFrame(resolve)); - setup_visual_modal(modaltitle, 'AllModels', ShowHidden, SelectedModel, source_subdirname, node_object, PreviewPath); - callbackfunct = inner_clicked.bind(widget_object); + setup_visual_modal(modaltitle, 'AllModels', state.ShowHidden, state.SelectedModel, state.source_subdirname, state.node_object, state.PreviewPath); + state.callbackfunct = inner_clicked.bind(state.widget_object); function inner_clicked(value, option, event) { - inner_value_change(widget_object, value); + inner_value_change(state.widget_object, value); app.canvas.setDirty(true); return false; } function inner_value_change(widget_object, value) { - if (typeof nodeHelper['sortbuttons'] === "object" && typeof nodeHelper['sortbuttons'][0] === "object" && nodeHelper['sortbuttons'][0].indexOf("Path") == -1) { - for (var ic = 0; ic < node_object.widgets.length; ++ic) { - if (node_object.widgets[ic].type == 'combo' && node_object.widgets[ic].value != 'None') { - node_object.widgets[ic].value = 'None'; + if (typeof state.nodeHelper['sortbuttons'] === "object" && typeof state.nodeHelper['sortbuttons'][0] === "object" && state.nodeHelper['sortbuttons'][0].indexOf("Path") == -1) { + for (var ic = 0; ic < state.node_object.widgets.length; ++ic) { + if (state.node_object.widgets[ic].type == 'combo' && state.node_object.widgets[ic].value != 'None') { + state.node_object.widgets[ic].value = 'None'; } } } - - if (widget_object.type == "number") { - value = Number(value); - } + if (widget_object.type == "number") value = Number(value); widget_object.value = value; - if (widget_object.options && widget_object.options.property && node_object.properties[widget_object.options.property] !== undefined) { - node_object.setProperty(widget_object.options.property, value); + if (widget_object.options && widget_object.options.property && state.node_object.properties[widget_object.options.property] !== undefined) { + state.node_object.setProperty(widget_object.options.property, value); } if (widget_object.callback) { - widget_object.callback(widget_object.value, this, node_object, pos, event); + widget_object.callback(widget_object.value, this, state.node_object, pos, event); } } @@ -232,249 +408,10 @@ class ModalControl { } } } - - function ModalHandler() { // 02 - eventListenerInit = true; - - document.body.addEventListener("click", async function (event) { - let modal = null; - - const closeButton = event.target.closest('button.modal-closer'); - if (closeButton) { - modal = document.getElementById("primere_visual_modal"); - if (modal) { - modal.setAttribute('style', 'display: none; width: 80%; height: 70%;'); - } - var lastDirValue = 'All'; - if (lastDirObject.hasOwnProperty(currentClass) === true) { - lastDirValue = lastDirObject[currentClass]; - } - - if (typeof nodeHelper['sortbuttons'] !== "object" || typeof nodeHelper['sortbuttons'][0] !== "object" || nodeHelper['sortbuttons'][0].indexOf("Path") > -1) { - if (AutoFilter !== true) { - await categoryHandler(lastDirValue, 'add', 'last_visual_category' + '_' + cache_key); - await categoryHandler(FilterType, 'add', 'last_visual_category_type' + '_' + cache_key); - const filter = getFilterInput()?.value ?? ''; - await categoryHandler(filter, 'add', 'last_visual_filter' + '_' + cache_key); - await categoryHandler(sortType, 'add', 'last_visual_sort_type' + '_' + cache_key); - await categoryHandler(operator, 'add', 'last_visual_sort_operator' + '_' + cache_key); - } - } - return; - } - - const selectedImage = event.target.closest('div.primere-modal-content div.visual-ckpt img'); - if (selectedImage) { - var ckptName = selectedImage.dataset.ckptname; - modal = document.getElementById("primere_visual_modal"); - if (modal) { - modal.setAttribute('style', 'display: none; width: 80%; height: 70%;'); - } - var lastDirValue = 'All'; - if (lastDirObject.hasOwnProperty(currentClass) === true) { - lastDirValue = lastDirObject[currentClass]; - } - - if (source_subdirname == 'styles') { - let pathLastIndex = ckptName.lastIndexOf('\\'); - ckptName = ckptName.substring(pathLastIndex + 1); - } - - if (ckptName && typeof callbackfunct == 'function') { - callbackfunct(ckptName); - sendPOSTModelName(ckptName); - } - - if (typeof nodeHelper['sortbuttons'] !== "object" || typeof nodeHelper['sortbuttons'][0] !== "object" || nodeHelper['sortbuttons'][0].indexOf("Path") > -1) { - if (AutoFilter !== true) { - await categoryHandler(lastDirValue, 'add', 'last_visual_category' + '_' + cache_key); - await categoryHandler(FilterType, 'add', 'last_visual_category_type' + '_' + cache_key); - const filter = getFilterInput()?.value ?? ''; - await categoryHandler(filter, 'add', 'last_visual_filter' + '_' + cache_key); - await categoryHandler(sortType, 'add', 'last_visual_sort_type' + '_' + cache_key); - await categoryHandler(operator, 'add', 'last_visual_sort_operator' + '_' + cache_key); - } - } - return; - } - - var subdirName = 'All'; - var filteredCheckpoints = 0; - - const subdirButton = event.target.closest('div.subdirtab button.subdirfilter'); - if (subdirButton) { - const filterInput = getFilterInput(); - if (filterInput) { - filterInput.value = ''; - } - subdirName = subdirButton.dataset.ckptsubdir; - if (currentClass !== false) { - lastDirObject[currentClass] = subdirName; - } - - filteredCheckpoints = 0; - clearModalCardsKeepingSelected(); - - if (source_subdirname != 'styles') { - ModelsByVersion = await getModelData(cache_key + '_version'); - } - ModelList = await getModelDatabyPath(source_subdirname, subdirName); - - if (source_subdirname == 'styles') { - if (ModelList.includes(SelectedModel) || ModelList.includes(subdirName + '\\' + SelectedModel)) { - var index_pre = (ModelList.indexOf(SelectedModel) + ModelList.indexOf(subdirName + '\\' + SelectedModel)) + 1; - if (index_pre !== -1) { - await ModelList.splice(index_pre, 1); - } - } - } - - for (var checkpoint of ModelList) { - let firstletter = checkpoint.charAt(0); - - var filterpass = true; - if (SelectedModel == checkpoint) { - filterpass = false; - } - - if (((firstletter === '.' && ShowHidden === true) || firstletter !== '.') && ((checkpoint.match('^NSFW') && ShowHidden === true) || !checkpoint.match('^NSFW')) && filterpass == true) { - let pathLastIndex = checkpoint.lastIndexOf('\\'); - let ckptName_full = checkpoint.substring(pathLastIndex + 1); - let dotLastIndex = ckptName_full.lastIndexOf('.'); - var ckptName = ckptName_full.substring(0, dotLastIndex); - var CategoryName = 'Unknown'; - - for (const [ver_index, ver_value] of Object.entries(ModelsByVersion)) { - if (ver_value.includes(ckptName)) { - CategoryName = ver_index; - } - } - - var container = document.querySelector('div.primere-modal-content.ckpt-container'); - if (subdirName === 'Root') { - let isSubdirExist = checkpoint.lastIndexOf('\\'); - if (isSubdirExist < 0) { - filteredCheckpoints++; - await createCardElement(checkpoint, container, SelectedModel, source_subdirname, CategoryName); - } - } else { - filteredCheckpoints++; - await createCardElement(checkpoint, container, SelectedModel, source_subdirname, CategoryName); - } - } - setText('div#primere_visual_modal div.modal_header label.ckpt-counter', String(filteredCheckpoints)); - } - - previewSorter(operator, sortType); - - setText('div#primere_visual_modal div.modal_header label.ckpt-name', subdirName); - setText('div#primere_visual_modal div.modal_header label.ckpt-ver', 'Subdir'); - clearSelectedPathButtons(); - subdirButton.classList.add('selected_path'); - FilterType = 'Subdir'; - return; - } - - const versionButton = event.target.closest('div.subdirtab button.verfilter'); - if (versionButton) { - const filterInput = getFilterInput(); - if (filterInput) { - filterInput.value = ''; - } - var versionName = versionButton.dataset.ckptver; - - if (currentClass !== false) { - lastDirObject[currentClass] = versionName; - } - - filteredCheckpoints = 0; - clearModalCardsKeepingSelected(); - - ModelList = await getModelDatabyVersion(source_subdirname, cache_key + '_version', versionName); - - for (var checkpoint of ModelList) { - let firstletter = checkpoint.charAt(0); - var filterpass = true; - if (SelectedModel == checkpoint) { - filterpass = false; - } - if (((firstletter === '.' && ShowHidden === true) || firstletter !== '.') && ((checkpoint.match('^NSFW') && ShowHidden === true) || !checkpoint.match('^NSFW')) && filterpass == true) { - filteredCheckpoints++; - var container = document.querySelector('div.primere-modal-content.ckpt-container'); - await createCardElement(checkpoint, container, SelectedModel, source_subdirname, versionName); - } - setText('div#primere_visual_modal div.modal_header label.ckpt-counter', String(filteredCheckpoints)); - } - - previewSorter(operator, sortType); - - setText('div#primere_visual_modal div.modal_header label.ckpt-name', versionName); - setText('div#primere_visual_modal div.modal_header label.ckpt-ver', 'Version'); - clearSelectedPathButtons(); - versionButton.classList.add('selected_path'); - FilterType = 'Version'; - return; - } - - const clearButton = event.target.closest('div.subdirtab button.filter_clear'); - if (clearButton) { - const filterInput = getFilterInput(); - if (filterInput) { - filterInput.value = ''; - } - const images = document.querySelectorAll('div.primere-modal-content div.visual-ckpt img'); - filteredCheckpoints = 0; - for (const image of images) { - const parent = image.parentElement; - if (parent) { - parent.style.display = ''; - filteredCheckpoints++; - } - } - setText('div#primere_visual_modal div.modal_header label.ckpt-counter', String(filteredCheckpoints - 1)); - return; - } - - const sortButton = event.target.closest('div.subdirtab button.preview_sort'); - if (sortButton) { - sortType = sortButton.dataset.sortsource; - operator = document.querySelector('button.preview_sort_direction')?.textContent ?? 'ASC'; - previewSorter(operator, sortType); - const sortButtons = document.querySelectorAll('div.subdirtab button.preview_sort'); - for (const button of sortButtons) { - button.classList.remove('selected_path'); - } - sortButton.classList.add('selected_path'); - return; - } - - const sortDirectionButton = event.target.closest('div.subdirtab button.preview_sort_direction'); - if (sortDirectionButton) { - operator = sortDirectionButton.textContent; - if (operator == 'ASC') { - sortDirectionButton.textContent = 'DESC'; - operator = 'DESC'; - sortDirectionButton.classList.add('selected_path'); - } else { - sortDirectionButton.textContent = 'ASC'; - operator = 'ASC'; - sortDirectionButton.classList.remove('selected_path'); - } - previewSorter(operator, sortType); - } - }); - - document.body.addEventListener("keyup", function (event) { - const filterInput = event.target.closest('div.subdirtab input'); - if (filterInput) { - previewFilter(filterInput.value); - } - }); - } } } -async function setup_visual_modal(combo_name, AllModels, ShowHidden, SelectedModel, ModelType, node, PreviewPath) { //3 +async function setup_visual_modal(combo_name, AllModels, ShowHidden, SelectedModel, ModelType, node, PreviewPath) { var container = null; var modal = null; @@ -508,12 +445,8 @@ async function setup_visual_modal(combo_name, AllModels, ShowHidden, SelectedMod for (var checkpoints of AllModels) { let pathLastIndex = checkpoints.lastIndexOf('\\'); let ckptSubdir = checkpoints.substring(0, pathLastIndex); - if (ckptSubdir === '') { - ckptSubdir = 'Root'; - } - if (subdirArray.indexOf(ckptSubdir) === -1) { - subdirArray.push(ckptSubdir); - } + if (ckptSubdir === '') ckptSubdir = 'Root'; + if (subdirArray.indexOf(ckptSubdir) === -1) subdirArray.push(ckptSubdir); } var subdir_tabs = modal.getElementsByClassName("subdirtab")[0]; @@ -521,16 +454,14 @@ async function setup_visual_modal(combo_name, AllModels, ShowHidden, SelectedMod var type_html = ''; var version_html = ''; - if (typeof nodeHelper['sortbuttons'] !== "object" || typeof nodeHelper['sortbuttons'][0] !== "object" || nodeHelper['sortbuttons'][0].indexOf("Path") > -1 && AutoFilter !== true) { + if (typeof state.nodeHelper['sortbuttons'] !== "object" || typeof state.nodeHelper['sortbuttons'][0] !== "object" || state.nodeHelper['sortbuttons'][0].indexOf("Path") > -1 && state.AutoFilter !== true) { for (var subdir of subdirArray) { var addWhiteClass = ''; let firstletter = subdir.charAt(0); var subdirName = subdir; - if (firstletter === '.') { - subdirName = subdir.substring(1); - } + if (firstletter === '.') subdirName = subdir.substring(1); if ((firstletter === '.' && ShowHidden === true) || firstletter !== '.') { - if (lastDirObject.hasOwnProperty(currentClass) === true && subdir === lastDirObject[currentClass]) { + if (state.lastDirObject.hasOwnProperty(state.currentClass) === true && subdir === state.lastDirObject[state.currentClass]) { addWhiteClass = ' selected_path'; } menu_html += ''; @@ -542,103 +473,99 @@ async function setup_visual_modal(combo_name, AllModels, ShowHidden, SelectedMod var LastCatType = 'Subdir'; var savedfilter = ""; - SetupCacheData = await getCacheByKey("setup") + state.SetupCacheData = await getCacheByKey("setup"); - if (SetupCacheData != null && typeof SetupCacheData === "object") { - if (typeof nodeHelper['sortbuttons'] !== "object" || typeof nodeHelper['sortbuttons'][0] !== "object" || nodeHelper['sortbuttons'][0].indexOf("Path") > -1) { - if (SetupCacheData.hasOwnProperty("last_visual_category" + '_' + cache_key)) { - LastCat = SetupCacheData["last_visual_category" + '_' + cache_key]; + if (state.SetupCacheData != null && typeof state.SetupCacheData === "object") { + if (typeof state.nodeHelper['sortbuttons'] !== "object" || typeof state.nodeHelper['sortbuttons'][0] !== "object" || state.nodeHelper['sortbuttons'][0].indexOf("Path") > -1) { + if (state.SetupCacheData.hasOwnProperty("last_visual_category" + '_' + state.cache_key)) { + LastCat = state.SetupCacheData["last_visual_category" + '_' + state.cache_key]; } - if (SetupCacheData.hasOwnProperty("last_visual_category_type" + '_' + cache_key)) { - LastCatType = SetupCacheData["last_visual_category_type" + '_' + cache_key]; + if (state.SetupCacheData.hasOwnProperty("last_visual_category_type" + '_' + state.cache_key)) { + LastCatType = state.SetupCacheData["last_visual_category_type" + '_' + state.cache_key]; } - if (SetupCacheData.hasOwnProperty("last_visual_filter" + '_' + cache_key)) { - savedfilter = SetupCacheData['last_visual_filter' + '_' + cache_key]; + if (state.SetupCacheData.hasOwnProperty("last_visual_filter" + '_' + state.cache_key)) { + savedfilter = state.SetupCacheData['last_visual_filter' + '_' + state.cache_key]; } - if (SetupCacheData.hasOwnProperty("last_visual_sort_type" + '_' + cache_key)) { - sortType = SetupCacheData['last_visual_sort_type' + '_' + cache_key]; + if (state.SetupCacheData.hasOwnProperty("last_visual_sort_type" + '_' + state.cache_key)) { + state.sortType = state.SetupCacheData['last_visual_sort_type' + '_' + state.cache_key]; } - if (SetupCacheData.hasOwnProperty("last_visual_sort_operator" + '_' + cache_key)) { - operator = SetupCacheData['last_visual_sort_operator' + '_' + cache_key]; + if (state.SetupCacheData.hasOwnProperty("last_visual_sort_operator" + '_' + state.cache_key)) { + state.operator = state.SetupCacheData['last_visual_sort_operator' + '_' + state.cache_key]; } } } - if (AutoFilter === true && StackVersion != null && ModelVersion != null) { - if (StackVersion == 'Auto') { - LastCat = ModelVersion; + if (state.AutoFilter === true && state.StackVersion != null && state.ModelVersion != null) { + if (state.StackVersion == 'Auto') { + LastCat = state.ModelVersion; LastCatType = 'Version'; - } else if (StackVersion != 'Any' && StackVersion != 'Auto') { - LastCat = StackVersion; + } else if (state.StackVersion != 'Any' && state.StackVersion != 'Auto') { + LastCat = state.StackVersion; LastCatType = 'Version'; } } - if (typeof nodeHelper['sortbuttons'] === "object" && typeof nodeHelper['sortbuttons'][0] === "object" && nodeHelper['sortbuttons'][0].indexOf("Path") == -1) { - LastCat = widget_name + if (typeof state.nodeHelper['sortbuttons'] === "object" && typeof state.nodeHelper['sortbuttons'][0] === "object" && state.nodeHelper['sortbuttons'][0].indexOf("Path") == -1) { + LastCat = state.widget_name; } - supportedModels = []; - ModelsByVersion = {}; + state.supportedModels = []; + state.ModelsByVersion = {}; if (ModelType != 'styles') { - supportedModels = await getSupportedModels(); - ModelsByVersion = await getModelData(cache_key + '_version'); - VersionCacheData = await getCacheByKey(cache_key + '_version'); + state.supportedModels = await getSupportedModels(); + state.ModelsByVersion = await getModelData(state.cache_key + '_version'); + state.VersionCacheData = await getCacheByKey(state.cache_key + '_version'); } - AllPath = await getAllPath(source_subdirname); + state.AllPath = await getAllPath(state.source_subdirname); - if (LastCatType == 'Subdir') { - ModelList = await getModelDatabyPath(source_subdirname, LastCat); - } - if (LastCatType == 'Version') { - ModelList = await getModelDatabyVersion(source_subdirname, cache_key + '_version', LastCat); - } + if (LastCatType == 'Subdir') state.ModelList = await getModelDatabyPath(state.source_subdirname, LastCat); + if (LastCatType == 'Version') state.ModelList = await getModelDatabyVersion(state.source_subdirname, state.cache_key + '_version', LastCat); - if (typeof nodeHelper['cache_key'] !== "undefined" && nodeHelper['sortbuttons'] !== "undefined") { - if (typeof nodeHelper['sortbuttons'] === "object" && typeof nodeHelper['sortbuttons'][0] === "object" && nodeHelper['sortbuttons'][0].length > 0) { - if (nodeHelper['sortbuttons'][0].indexOf("aScore") > -1) { - AscoreDataResponse = await ReadAScores(nodeHelper['cache_key']); + if (typeof state.nodeHelper['cache_key'] !== "undefined" && state.nodeHelper['sortbuttons'] !== "undefined") { + if (typeof state.nodeHelper['sortbuttons'] === "object" && typeof state.nodeHelper['sortbuttons'][0] === "object" && state.nodeHelper['sortbuttons'][0].length > 0) { + if (state.nodeHelper['sortbuttons'][0].indexOf("aScore") > -1) { + state.AscoreDataResponse = await ReadAScores(state.nodeHelper['cache_key']); } } } - if (typeof nodeHelper['cache_key'] !== "undefined" && nodeHelper['sortbuttons'] !== "undefined") { - if (typeof nodeHelper['sortbuttons'] === "object" && typeof nodeHelper['sortbuttons'][0] === "object" && nodeHelper['sortbuttons'][0].length > 0) { - if (nodeHelper['sortbuttons'][0].indexOf("STime") > -1) { - STimeDataResponse = await ReadSTimes(nodeHelper['cache_key']); + if (typeof state.nodeHelper['cache_key'] !== "undefined" && state.nodeHelper['sortbuttons'] !== "undefined") { + if (typeof state.nodeHelper['sortbuttons'] === "object" && typeof state.nodeHelper['sortbuttons'][0] === "object" && state.nodeHelper['sortbuttons'][0].length > 0) { + if (state.nodeHelper['sortbuttons'][0].indexOf("STime") > -1) { + state.STimeDataResponse = await ReadSTimes(state.nodeHelper['cache_key']); } } } - if (typeof nodeHelper['sortbuttons'] !== "undefined") { - if (typeof nodeHelper['sortbuttons'] === "object" && typeof nodeHelper['sortbuttons'][0] === "object" && nodeHelper['sortbuttons'][0].length > 0) { - if (nodeHelper['sortbuttons'][0].indexOf("Date") > -1) { - FileDateResponse = await ReadFileDate(nodeHelper['subdir']); + if (typeof state.nodeHelper['sortbuttons'] !== "undefined") { + if (typeof state.nodeHelper['sortbuttons'] === "object" && typeof state.nodeHelper['sortbuttons'][0] === "object" && state.nodeHelper['sortbuttons'][0].length > 0) { + if (state.nodeHelper['sortbuttons'][0].indexOf("Date") > -1) { + state.FileDateResponse = await ReadFileDate(state.nodeHelper['subdir']); } } } - if (nodeHelper['subdir'] == 'checkpoints' && nodeHelper['sortbuttons'][0].indexOf("Symlink") > -1) { - FileLinkResponse = await ReadFileSymlink(nodeHelper['subdir']); + if (state.nodeHelper['subdir'] == 'checkpoints' && state.nodeHelper['sortbuttons'][0].indexOf("Symlink") > -1) { + state.FileLinkResponse = await ReadFileSymlink(state.nodeHelper['subdir']); } - RawImageDataResponse = {} - RawImageDataResponse = await modelImageData(source_subdirname, PreviewPath); + state.RawImageDataResponse = {}; + state.RawImageDataResponse = await modelImageData(state.source_subdirname, PreviewPath); - if (ModelsByVersion !== false && ModelsByVersion != null && Object.keys(ModelsByVersion).length > 0 && source_subdirname != 'styles' && AutoFilter !== true) { - version_html = createTypeMenu(ModelsByVersion, supportedModels, LastCat, LastCatType); + if (state.ModelsByVersion !== false && state.ModelsByVersion != null && Object.keys(state.ModelsByVersion).length > 0 && state.source_subdirname != 'styles' && state.AutoFilter !== true) { + version_html = createTypeMenu(state.ModelsByVersion, state.supportedModels, LastCat, LastCatType); } - if (AllPath !== false && AllPath != null && AllPath.length > 0 && AutoFilter !== true) { - if (typeof nodeHelper['sortbuttons'] !== "object" || typeof nodeHelper['sortbuttons'][0] !== "object" || nodeHelper['sortbuttons'][0].indexOf("Path") > -1) { - type_html = createPathMenu(AllPath, ShowHidden, LastCat, LastCatType); + if (state.AllPath !== false && state.AllPath != null && state.AllPath.length > 0 && state.AutoFilter !== true) { + if (typeof state.nodeHelper['sortbuttons'] !== "object" || typeof state.nodeHelper['sortbuttons'][0] !== "object" || state.nodeHelper['sortbuttons'][0].indexOf("Path") > -1) { + type_html = createPathMenu(state.AllPath, ShowHidden, LastCat, LastCatType); } } subdir_tabs.innerHTML = menu_html + type_html + version_html + ' '; - var sortbuttons = nodeHelper['sortbuttons']; + var sortbuttons = state.nodeHelper['sortbuttons']; var sort_string = ""; if (typeof sortbuttons === "object" && typeof sortbuttons[0] === "object" && sortbuttons[0].length > 0) { sort_string = createSortButtons(sortbuttons[0]); @@ -646,47 +573,41 @@ async function setup_visual_modal(combo_name, AllModels, ShowHidden, SelectedMod subdir_tabs.innerHTML += sort_string; var fondModel = null; - if (ModelList.includes(SelectedModel) || ModelList.includes(LastCat + '\\' + SelectedModel)) { - var index_pre = (ModelList.indexOf(SelectedModel) + ModelList.indexOf(LastCat + '\\' + SelectedModel)) + 1; - fondModel = ModelList[index_pre]; - if (index_pre !== -1) { - await ModelList.splice(index_pre, 1); - } + if (state.ModelList.includes(SelectedModel) || state.ModelList.includes(LastCat + '\\' + SelectedModel)) { + var index_pre = (state.ModelList.indexOf(SelectedModel) + state.ModelList.indexOf(LastCat + '\\' + SelectedModel)) + 1; + fondModel = state.ModelList[index_pre]; + if (index_pre !== -1) await state.ModelList.splice(index_pre, 1); } - if (ModelType == 'styles' && fondModel != null) { - SelectedModel = fondModel; - } + if (ModelType == 'styles' && fondModel != null) SelectedModel = fondModel; - if (!ModelList.includes(SelectedModel)) { + if (!state.ModelList.includes(SelectedModel)) { if (fondModel == null) { - await ModelList.unshift(SelectedModel); + await state.ModelList.unshift(SelectedModel); } else { - await ModelList.unshift(fondModel); + await state.ModelList.unshift(fondModel); } } - setText('div#primere_visual_modal div.modal_header label.ckpt-counter', String(ModelList.length)); + setText('div#primere_visual_modal div.modal_header label.ckpt-counter', String(state.ModelList.length)); setText('div#primere_visual_modal div.modal_header label.ckpt-name', LastCat); setText('div#primere_visual_modal div.modal_header label.ckpt-ver', LastCatType); var CKPTElements = 0; modal.setAttribute('style','display: block; width: 80%; height: 70%;'); - for (var checkpoint of ModelList) { + for (var checkpoint of state.ModelList) { let firstletter = checkpoint.charAt(0); let pathLastIndex = checkpoint.lastIndexOf('\\'); let ckptName_full = checkpoint.substring(pathLastIndex + 1); let dotLastIndex = ckptName_full.lastIndexOf('.'); var ckptName = ckptName_full.substring(0, dotLastIndex); - if (((firstletter === '.' && ShowHidden === true) || firstletter !== '.') && ((checkpoint.match('^NSFW') && ShowHidden === true) || !checkpoint.match('^NSFW'))) { + if (((firstletter === '.' && ShowHidden === true) || firstletter !== '.') && ((checkpoint.match('^NSFW') && ShowHidden === true) || !checkpoint.match('^NSFW'))) { var CategoryName = 'Unknown'; - for (const [ver_index, ver_value] of Object.entries(ModelsByVersion)) { - if (ver_value.includes(ckptName)) { - CategoryName = ver_index; - } + for (const [ver_index, ver_value] of Object.entries(state.ModelsByVersion)) { + if (ver_value.includes(ckptName)) CategoryName = ver_index; } if (LastCat === 'Root') { @@ -705,20 +626,16 @@ async function setup_visual_modal(combo_name, AllModels, ShowHidden, SelectedMod if (savedfilter.length > 0) { const filterInput = getFilterInput(); - if (filterInput) { - filterInput.value = savedfilter; - } + if (filterInput) filterInput.value = savedfilter; previewFilter(savedfilter); } const sortDirectionButton = document.querySelector('button.preview_sort_direction'); - if (sortDirectionButton) { - sortDirectionButton.textContent = operator; - } - if (operator != 'ASC') { + if (sortDirectionButton) sortDirectionButton.textContent = state.operator; + if (state.operator != 'ASC') { document.querySelector('div.subdirtab button.preview_sort_direction')?.classList.add("selected_path"); } - document.querySelector('div.subdirtab button.preview_sort[data-sortsource="' + sortType + '"]')?.classList.add('selected_path'); - previewSorter(operator, sortType); + document.querySelector('div.subdirtab button.preview_sort[data-sortsource="' + state.sortType + '"]')?.classList.add('selected_path'); + previewSorter(state.operator, state.sortType); if (!document.querySelector('#primere_visual_modal div.subdirtab button.selected_path')) { document.querySelector('#primere_visual_modal div.subdirtab button[data-ckptsubdir="All"]')?.classList.add('selected_path'); @@ -727,9 +644,7 @@ async function setup_visual_modal(combo_name, AllModels, ShowHidden, SelectedMod function previewSorter(operator, sortType) { const container = document.querySelector('div.primere-modal-content.ckpt-container.ckpt-grid-layout'); - if (!container) { - return; - } + if (!container) return; const cards = Array.from(container.querySelectorAll('div.visual-ckpt:not(.visual-ckpt-selected)')); cards.sort(function (a, b) { var aVal = a.dataset[sortType] ?? ''; @@ -738,21 +653,15 @@ function previewSorter(operator, sortType) { if (isNaN(parseInt(aVal)) && isNaN(parseInt(bVal))) { aVal = String(aVal).toUpperCase(); bVal = String(bVal).toUpperCase(); - if (operator == 'ASC') { - return aVal < bVal ? -1 : (aVal > bVal ? 1 : 0); - } + if (operator == 'ASC') return aVal < bVal ? -1 : (aVal > bVal ? 1 : 0); return aVal > bVal ? -1 : (aVal < bVal ? 1 : 0); } - if (operator == 'ASC') { - return parseInt(aVal) - parseInt(bVal); - } + if (operator == 'ASC') return parseInt(aVal) - parseInt(bVal); return parseInt(bVal) - parseInt(aVal); }); - for (const card of cards) { - container.appendChild(card); - } + for (const card of cards) container.appendChild(card); } function previewFilter(filterString) { @@ -764,14 +673,10 @@ function previewFilter(filterString) { const parentCard = img_obj.parentElement; const selectedCard = parentCard?.closest('.visual-ckpt-selected'); if (ImageCheckpoint.toLowerCase().indexOf(filterString.toLowerCase()) >= 0 || selectedCard) { - if (parentCard) { - parentCard.style.display = ''; - } + if (parentCard) parentCard.style.display = ''; filteredCheckpoints++; } else { - if (parentCard) { - parentCard.style.display = 'none'; - } + if (parentCard) parentCard.style.display = 'none'; } setText('div#primere_visual_modal div.modal_header label.ckpt-counter', String(filteredCheckpoints - 1)); } @@ -796,30 +701,24 @@ async function createCardElement(checkpoint, container, SelectedModel, ModelType let symlinkWidget = ''; var path_only = checkpoint.substring(0, checkpoint.indexOf("\\")); - if (ckptName == 'None') { - return; - } + if (ckptName == 'None') return; + var versionString = 'Unknown'; if (CategoryName) { var titleText = CategoryName + ' checkpoint. Select right version of additional networks.'; - var versionString = CategoryName; + versionString = CategoryName; if (ModelType != 'styles') { versionWidget = '
'; } else { var SelModelIndex = SelectedModel.replaceAll(' ', "_"); - if (RawImageDataResponse.hasOwnProperty(SelectedModel.replaceAll(' ', "_")) === true && checkpoint == SelectedModel) { - var selected_full = RawImageDataResponse[SelectedModel.replaceAll(' ', "_")]; + if (state.RawImageDataResponse.hasOwnProperty(SelectedModel.replaceAll(' ', "_")) === true && checkpoint == SelectedModel) { + var selected_full = state.RawImageDataResponse[SelectedModel.replaceAll(' ', "_")]; var selful_first = selected_full.charAt(0); var substringStart = 0; - if (selful_first == '\\') { - substringStart = 1; - } + if (selful_first == '\\') substringStart = 1; path_only = selected_full.substring(substringStart, selected_full.lastIndexOf("\\")); } - - if (path_only == "") { - path_only = 'Root'; - } + if (path_only == "") path_only = 'Root'; versionWidget = '
 ' + path_only + ' 
'; } } @@ -831,49 +730,42 @@ async function createCardElement(checkpoint, container, SelectedModel, ModelType var missingimgsrc = prwPath + '/images/missing.jpg'; card.classList.add('visual-ckpt', 'version-' + versionString); - if (FileDateResponse.hasOwnProperty(ckptName) === true) { - var timestamp = FileDateResponse[ckptName]; - card.dataset.date = String(timestamp); + if (state.FileDateResponse.hasOwnProperty(ckptName) === true) { + card.dataset.date = String(state.FileDateResponse[ckptName]); } else { card.dataset.date = '0'; } - if (FileLinkResponse.hasOwnProperty(ckptName) === true) { - var unetname = FileLinkResponse[ckptName]; + if (state.FileLinkResponse.hasOwnProperty(ckptName) === true) { + var unetname = state.FileLinkResponse[ckptName]; card.dataset.symlink = unetname; var unetnameShort = unetname; - if (unetname == 'diffusion_models') { unetnameShort = 'DiMo'} - if (unetname == 'diffusers') { unetnameShort = 'Diff'} + if (unetname == 'diffusion_models') unetnameShort = 'DiMo'; + if (unetname == 'diffusers') unetnameShort = 'Diff'; symlinkWidget = ''; card_html += symlinkWidget; } else { card.dataset.symlink = ""; } - if (SelectedModel === checkpoint) { - card.classList.add('visual-ckpt-selected'); - } + if (SelectedModel === checkpoint) card.classList.add('visual-ckpt-selected'); - if (AscoreDataResponse != null && AscoreDataResponse.hasOwnProperty(ckptName) === true) { - var aestString = AscoreDataResponse[ckptName]; + if (state.AscoreDataResponse != null && state.AscoreDataResponse.hasOwnProperty(ckptName) === true) { + var aestString = state.AscoreDataResponse[ckptName]; var aestArray = aestString.split("|"); var aestAVGValue = Math.floor(aestArray[1] / aestArray[0]); card.dataset.ascore = String(aestAVGValue); - var aeScorePercentLine = Math.floor(((aestAVGValue - aeScoreMin) / (aeScoreMax - aeScoreMin)) * 100); - if (aeScorePercentLine < 0) { - aeScorePercentLine = 0; - } - if (aeScorePercentLine > 100) { - aeScorePercentLine = 100; - } + var aeScorePercentLine = Math.floor(((aestAVGValue - state.aeScoreMin) / (state.aeScoreMax - state.aeScoreMin)) * 100); + if (aeScorePercentLine < 0) aeScorePercentLine = 0; + if (aeScorePercentLine > 100) aeScorePercentLine = 100; aesthWidget = '
' + aestAVGValue + ' - ' + aeScorePercentLine + '%
'; card_html += aesthWidget; } else { card.dataset.ascore = '0'; } - if (STimeDataResponse != null && STimeDataResponse.hasOwnProperty(ckptName) === true) { - var stimeString = STimeDataResponse[ckptName]; + if (state.STimeDataResponse != null && state.STimeDataResponse.hasOwnProperty(ckptName) === true) { + var stimeString = state.STimeDataResponse[ckptName]; var stimestArray = stimeString.split("|"); var stimestAVGValue = Math.floor(stimestArray[1] / stimestArray[0]); card.dataset.stime = String(stimestAVGValue); @@ -884,18 +776,18 @@ async function createCardElement(checkpoint, container, SelectedModel, ModelType } card.dataset.name = ckptName; - if (CategoryName == 'StableCascade') { CategoryName = 'Cascade'; } + if (CategoryName == 'StableCascade') CategoryName = 'Cascade'; card.dataset.version = CategoryName; card.dataset.path = path_only; - if (RawImageDataResponse != null && Object.keys(RawImageDataResponse).length > 0) { - if (RawImageDataResponse.hasOwnProperty(finalName) === true) { - if (PreviewPath == false) { - var imgsrc = 'data:image/jpeg;charset=utf-8;base64, ' + RawImageDataResponse[finalName]; - card_html += ''; + if (state.RawImageDataResponse != null && Object.keys(state.RawImageDataResponse).length > 0) { + if (state.RawImageDataResponse.hasOwnProperty(finalName) === true) { + if (state.PreviewPath == false) { + var imgsrc = 'data:image/jpeg;charset=utf-8;base64, ' + state.RawImageDataResponse[finalName]; + card_html += ''; } else { - var imgsrc = prwPath + '/images/' + RawImageDataResponse[finalName]; - card_html += ''; + var imgsrc = prwPath + '/images/' + state.RawImageDataResponse[finalName]; + card_html += ''; } card.innerHTML = card_html; container.appendChild(card); @@ -914,12 +806,9 @@ async function createCardElement(checkpoint, container, SelectedModel, ModelType const img = new Image(); img.src = imgsrc; - waitForImageToLoad(img).then(() => { - return true; - }); + waitForImageToLoad(img).then(() => { return true; }); } - function createSortButtons(buttondata) { var sort_html = ''; for (const buttonName of buttondata) { @@ -931,19 +820,15 @@ function createSortButtons(buttondata) { function createTypeMenu(ModelsByVersion, supportedModels, LastCat, LastCatType) { var version_html = ''; - for (const [ver_index, ver_value] of Object.entries(ModelsByVersion)) { var addWhiteClass = ''; if (supportedModels.includes(ver_index)) { if (!version_html.includes('data-ckptver="' + ver_index + '"')) { - if (ver_index === LastCat && LastCatType == 'Version') { - addWhiteClass = ' selected_path'; - } + if (ver_index === LastCat && LastCatType == 'Version') addWhiteClass = ' selected_path'; version_html += ''; } } } - version_html += ''; return version_html; } @@ -954,192 +839,17 @@ function createPathMenu(AllPath, ShowHidden, LastCat, LastCatType) { var addWhiteClass = ""; let firstletter = subdir.charAt(0); var subdirName = subdir; - if (firstletter === '.') { - subdirName = subdir.substring(1); - } - if (((firstletter === '.' && ShowHidden === true) || firstletter !== '.') && ((subdir.match('^NSFW') && ShowHidden === true) || !subdir.match('^NSFW'))) { - if (subdir === LastCat && LastCatType == 'Subdir') { - addWhiteClass = ' selected_path'; - } + if (firstletter === '.') subdirName = subdir.substring(1); + if (((firstletter === '.' && ShowHidden === true) || firstletter !== '.') && ((subdir.match('^NSFW') && ShowHidden === true) || !subdir.match('^NSFW'))) { + if (subdir === LastCat && LastCatType == 'Subdir') addWhiteClass = ' selected_path'; menu_html += ''; } } return menu_html + ''; } -function sendPOSTModelName(modelName) { // ModelKeywordResponse - const body = new FormData(); - body.append('modelName', modelName); - api.fetchApi("/primere_keyword_parser", {method: "POST", body,}); -} - -// ************************* categoryHandler LastCategoryResponse -function categoryHandler(setupValue, method, setupKey) { - return new Promise((resolve, reject) => { - api.addEventListener("LastCategoryResponse", (event) => resolve(event.detail), true); - postCategoryHandler(setupValue, method, setupKey); - }); -} -function postCategoryHandler(setupValue, method, setupKey) { - const body = new FormData(); - body.append('setupValue', setupValue); - body.append('setupMethod', method); - body.append('setupKey', setupKey); - api.fetchApi("/primere_category_handler", {method: "POST", body,}); -} - -// ************************* getSupportedModels SupportedModelsResponse -function getSupportedModels() { - return new Promise((resolve, reject) => { - api.addEventListener("SupportedModelsResponse", (event) => resolve(event.detail), true); - postSupportedModels(); - }); -} -function postSupportedModels() { - const body = new FormData(); - body.append('models', 'get'); - api.fetchApi("/primere_supported_models", {method: "POST", body,}); -} - -// ************************* getAllPath AllPathResponse -function getAllPath(source_subdirname) { - return new Promise((resolve, reject) => { - api.addEventListener("AllPathResponse", (event) => resolve(event.detail), true); - postAllPath(source_subdirname); - }); -} -function postAllPath(source_subdirname) { - const body = new FormData(); - body.append('sourceType', source_subdirname); - api.fetchApi("/primere_modelpaths", {method: "POST", body,}); -} - -// ************************* getModelData CategoryListResponse -function getModelData(message) { - return new Promise((resolve, reject) => { - api.addEventListener("CategoryListResponse", (event) => resolve(event.detail), true); - postModelData(message); - }); -} -function postModelData(message) { - const body = new FormData(); - body.append('cache_key', message); - api.fetchApi("/primere_get_category", {method: "POST", body,}); -} - -// ************************* getModelDatabyPath SourceListResponse -function getModelDatabyPath(subdir, type) { - return new Promise((resolve, reject) => { - api.addEventListener("SourceListResponse", (event) => resolve(event.detail), true); - postModelDatabyPath(subdir, type); - }); -} -function postModelDatabyPath(subdir, type) { - const body = new FormData(); - body.append('subdir', subdir); - body.append('type', type); - api.fetchApi("/primere_get_subdir", {method: "POST", body,}); -} - -// ************************* getModelDatabyVersion VersionListResponse -function getModelDatabyVersion(subdir, cachekey, version) { - return new Promise((resolve, reject) => { - api.addEventListener("VersionListResponse", (event) => resolve(event.detail), true); - postModelVersion(subdir, cachekey, version); - }); -} - -function postModelVersion(subdir, cachekey, version) { - const body = new FormData(); - body.append('subdir', subdir); - body.append('cachekey', cachekey); - body.append('version', version); - api.fetchApi("/primere_get_version", {method: "POST", body,}); -} - -// ************************* getCacheByKey CacheByKey -function getCacheByKey(chachekey) { - return new Promise((resolve, reject) => { - api.addEventListener("CacheByKey", (event) => resolve(event.detail), true); - postCacheKey(chachekey); - }); -} -function postCacheKey(chachekey) { - const body = new FormData(); - body.append('chachekey', chachekey); - api.fetchApi("/primere_get_cache", {method: "POST", body,}); -} - -// ************************* ReadAScores AscoreData -function ReadAScores(type) { - return new Promise((resolve, reject) => { - api.addEventListener("AscoreData", (event) => resolve(event.detail), true); - postAscoreData(type); - }); -} -function postAscoreData(type) { - const body = new FormData(); - body.append('type', type); - api.fetchApi("/primere_get_ascores", {method: "POST", body,}); -} - -// ************************* ReadSTimes STimeData -function ReadSTimes(type) { - return new Promise((resolve, reject) => { - api.addEventListener("STimeData", (event) => resolve(event.detail), true); - postSTimeData(type); - }); -} -function postSTimeData(type) { - const body = new FormData(); - body.append('type', type); - api.fetchApi("/primere_get_stime", {method: "POST", body,}); -} - -// ************************* modelImageData CollectedImageData -function modelImageData(SubdirName, PreviewPath) { - return new Promise((resolve, reject) => { - api.addEventListener("CollectedImageData", (event) => resolve(event.detail), true); - postModelImageData(SubdirName, PreviewPath); - }); -} -function postModelImageData(SubdirName, PreviewPath) { - const body = new FormData(); - body.append('SubdirName', SubdirName); - body.append('PreviewPath', PreviewPath); - api.fetchApi("/primere_get_images", {method: "POST", body,}); -} - -// ************************* ReadFileDate FileDateData -function ReadFileDate(sourcetype) { - return new Promise((resolve, reject) => { - api.addEventListener("FileDateData", (event) => resolve(event.detail), true); - postReadFileDate(sourcetype); - }); -} -function postReadFileDate(sourcetype) { - const body = new FormData(); - body.append('type', sourcetype); - api.fetchApi("/primere_get_filedates", {method: "POST", body,}); -} - -// ************************* ReadFileDate ReadFileSymlink -function ReadFileSymlink(sourcetype) { - return new Promise((resolve, reject) => { - api.addEventListener("FileLinkData", (event) => resolve(event.detail), true); - postReadFileSymlink(sourcetype); - }); -} -function postReadFileSymlink(sourcetype) { - const body = new FormData(); - body.append('type', sourcetype); - api.fetchApi("/primere_get_filelinks", {method: "POST", body,}); -} - -//await sleep(2000); -//await waitUntil(() => variable === true); -function sleep(ms){ - return new Promise(resolve => setTimeout(resolve, ms)); +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); } async function waitUntil(condition, time = 100) { @@ -1154,6 +864,6 @@ async function waitUntilEqual(condition1, condition2, time = 100) { } } -async function waitForImageToLoad(imageElement){ - return new Promise(resolve=>{imageElement.onload = resolve}) -} \ No newline at end of file +async function waitForImageToLoad(imageElement) { + return new Promise(resolve => { imageElement.onload = resolve }); +}