refactor CardsView to CardView to match Dirs and Tree view lengths. Got sick of it being 1 letter longer.

This commit is contained in:
Sj-Si 2024-05-07 16:44:11 -04:00
parent 14442b8ad3
commit 5a2fca8ca5
4 changed files with 111 additions and 111 deletions

View File

@ -105,7 +105,7 @@
d="M 5 5 V 14 H 8 M 5 8 H 8" /> d="M 5 5 V 14 H 8 M 5 8 H 8" />
</svg> </svg>
</button> </button>
<button class="extra-network-control extra-network-control--cards-view" title="Enable Card View" <button class="extra-network-control extra-network-control--card-view" title="Enable Card View"
{btn_card_view_data_attributes}> {btn_card_view_data_attributes}>
<svg class="extra-network-control--icon" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" <svg class="extra-network-control--icon" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"
fill="currentColor" stroke="none"> fill="currentColor" stroke="none">
@ -146,16 +146,16 @@
class='extra-network-tree-content clusterize-content'></div> class='extra-network-tree-content clusterize-content'></div>
</div> </div>
</div> </div>
<div class="extra-network-content resize-handle-col" style="{cards_view_style}"> <div class="extra-network-content resize-handle-col" style="{card_view_style}">
<div id='{tabname}_{extra_networks_tabname}_cards_list_loading_splash' <div id='{tabname}_{extra_networks_tabname}_card_list_loading_splash'
class='extra-network-cards extra-network-list-splash'>{cards_list_loading_splash_content}</div> class='extra-network-cards extra-network-list-splash'>{card_list_loading_splash_content}</div>
<div id='{tabname}_{extra_networks_tabname}_cards_list_no_data_splash' <div id='{tabname}_{extra_networks_tabname}_card_list_no_data_splash'
class='extra-network-cards extra-network-list-splash hidden'>{cards_list_no_data_splash_content} class='extra-network-cards extra-network-list-splash hidden'>{card_list_no_data_splash_content}
</div> </div>
<div id='{tabname}_{extra_networks_tabname}_cards_list_scroll_area' <div id='{tabname}_{extra_networks_tabname}_card_list_scroll_area'
class='extra-network-cards styled-scrollbar clusterize-scroll'> class='extra-network-cards styled-scrollbar clusterize-scroll'>
<div id='{tabname}_{extra_networks_tabname}_cards_list_content_area' <div id='{tabname}_{extra_networks_tabname}_card_list_content_area'
class='extra-network-cards-content clusterize-content'></div> class='extra-network-card-content clusterize-content'></div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -2,7 +2,7 @@
/*global /*global
selectCheckpoint, selectCheckpoint,
ExtraNetworksClusterizeTreeList, ExtraNetworksClusterizeTreeList,
ExtraNetworksClusterizeCardsList, ExtraNetworksClusterizeCardList,
waitForElement, waitForElement,
isString, isString,
isElement, isElement,
@ -89,7 +89,7 @@ class ExtraNetworksTab {
extra_networks_tabname; extra_networks_tabname;
tabname_full; // {tabname}_{extra_networks_tabname} tabname_full; // {tabname}_{extra_networks_tabname}
tree_list; tree_list;
cards_list; card_list;
container_elem; container_elem;
controls_elem; controls_elem;
txt_search_elem; txt_search_elem;
@ -109,8 +109,8 @@ class ExtraNetworksTab {
refresh_in_progress = false; refresh_in_progress = false;
dirs_view_en = false; dirs_view_en = false;
tree_view_en = false; tree_view_en = false;
cards_view_en = false; card_view_en = false;
cards_list_splash_state = null; card_list_splash_state = null;
tree_list_splash_state = null; tree_list_splash_state = null;
directory_filters = {}; directory_filters = {};
list_button_states = {}; list_button_states = {};
@ -132,11 +132,11 @@ class ExtraNetworksTab {
waitForElement(`#${this.tabname}_neg_prompt_row`).then(elem => this.neg_prompt_row_elem = elem), waitForElement(`#${this.tabname}_neg_prompt_row`).then(elem => this.neg_prompt_row_elem = elem),
waitForElement(`#${this.tabname_full}_tree_list_scroll_area`), waitForElement(`#${this.tabname_full}_tree_list_scroll_area`),
waitForElement(`#${this.tabname_full}_tree_list_content_area`), waitForElement(`#${this.tabname_full}_tree_list_content_area`),
waitForElement(`#${this.tabname_full}_cards_list_scroll_area`), waitForElement(`#${this.tabname_full}_card_list_scroll_area`),
waitForElement(`#${this.tabname_full}_cards_list_content_area`), waitForElement(`#${this.tabname_full}_card_list_content_area`),
]); ]);
this.updateSplashState({cards_list_state: "loading", tree_list_state: "loading"}); this.updateSplashState({card_list_state: "loading", tree_list_state: "loading"});
this.txt_search_elem = this.controls_elem.querySelector(".extra-network-control--search-text"); this.txt_search_elem = this.controls_elem.querySelector(".extra-network-control--search-text");
this.dirs_view_en = "selected" in this.controls_elem.querySelector( this.dirs_view_en = "selected" in this.controls_elem.querySelector(
@ -145,8 +145,8 @@ class ExtraNetworksTab {
this.tree_view_en = "selected" in this.controls_elem.querySelector( this.tree_view_en = "selected" in this.controls_elem.querySelector(
".extra-network-control--tree-view" ".extra-network-control--tree-view"
).dataset; ).dataset;
this.cards_view_en = "selected" in this.controls_elem.querySelector( this.card_view_en = "selected" in this.controls_elem.querySelector(
".extra-network-control--cards-view" ".extra-network-control--card-view"
).dataset; ).dataset;
// determine whether compact prompt mode is enabled. // determine whether compact prompt mode is enabled.
@ -166,28 +166,28 @@ class ExtraNetworksTab {
"Please refresh tab.<br>" + "Please refresh tab.<br>" +
`${error_btn.outerHTML}</div>`; `${error_btn.outerHTML}</div>`;
await Promise.all([this.setupTreeList(), this.setupCardsList()]); await Promise.all([this.setupTreeList(), this.setupCardList()]);
const btn_dirs_view = this.controls_elem.querySelector(".extra-network-control--dirs-view"); const btn_dirs_view = this.controls_elem.querySelector(".extra-network-control--dirs-view");
const btn_tree_view = this.controls_elem.querySelector(".extra-network-control--tree-view"); const btn_tree_view = this.controls_elem.querySelector(".extra-network-control--tree-view");
const btn_cards_view = this.controls_elem.querySelector(".extra-network-control--cards-view"); const btn_card_view = this.controls_elem.querySelector(".extra-network-control--card-view");
const div_dirs = this.container_elem.querySelector(".extra-network-content--dirs-view"); const div_dirs = this.container_elem.querySelector(".extra-network-content--dirs-view");
// We actually want to select the tree view's column in the resize-handle-row. // We actually want to select the tree view's column in the resize-handle-row.
// This is what we actually show/hide, not the inner elements. // This is what we actually show/hide, not the inner elements.
const div_tree = this.tree_list.scroll_elem.closest(".resize-handle-col"); const div_tree = this.tree_list.scroll_elem.closest(".resize-handle-col");
const div_cards = this.cards_list.scroll_elem.closest(".resize-handle-col"); const div_card = this.card_list.scroll_elem.closest(".resize-handle-col");
this.dirs_view_en = "selected" in btn_dirs_view.dataset; this.dirs_view_en = "selected" in btn_dirs_view.dataset;
this.tree_view_en = "selected" in btn_tree_view.dataset; this.tree_view_en = "selected" in btn_tree_view.dataset;
this.cards_view_en = "selected" in btn_cards_view.dataset; this.card_view_en = "selected" in btn_card_view.dataset;
// Remove "hidden" class if button is enabled, otherwise add it. // Remove "hidden" class if button is enabled, otherwise add it.
div_dirs.classList.toggle("hidden", !this.dirs_view_en); div_dirs.classList.toggle("hidden", !this.dirs_view_en);
div_tree.classList.toggle("hidden", !this.tree_view_en); div_tree.classList.toggle("hidden", !this.tree_view_en);
div_cards.classList.toggle("hidden", !this.cards_view_en); div_card.classList.toggle("hidden", !this.card_view_en);
// Apply the current resize handle classes. // Apply the current resize handle classes.
const resize_handle_row = this.tree_list.scroll_elem.closest(".resize-handle-row"); const resize_handle_row = this.tree_list.scroll_elem.closest(".resize-handle-row");
resize_handle_row.classList.toggle("resize-handle-hidden", !this.tree_view_en || !this.cards_view_en); resize_handle_row.classList.toggle("resize-handle-hidden", !this.tree_view_en || !this.card_view_en);
const sort_mode_elem = this.controls_elem.querySelector(".extra-network-control--sort-mode[data-selected]"); const sort_mode_elem = this.controls_elem.querySelector(".extra-network-control--sort-mode[data-selected]");
isElementThrowError(sort_mode_elem); isElementThrowError(sort_mode_elem);
@ -211,9 +211,9 @@ class ExtraNetworksTab {
destroy() { destroy() {
this.unload(); this.unload();
this.tree_list.destroy(); this.tree_list.destroy();
this.cards_list.destroy(); this.card_list.destroy();
this.tree_list = null; this.tree_list = null;
this.cards_list = null; this.card_list = null;
this.container_elem = null; this.container_elem = null;
this.controls_elem = null; this.controls_elem = null;
this.txt_search_elem = null; this.txt_search_elem = null;
@ -227,7 +227,7 @@ class ExtraNetworksTab {
this.refresh_in_progress = false; this.refresh_in_progress = false;
this.tree_view_en = false; this.tree_view_en = false;
this.dirs_view_en = false; this.dirs_view_en = false;
this.cards_view_en = false; this.card_view_en = false;
this.directory_filters = {}; this.directory_filters = {};
this.list_button_states = {}; this.list_button_states = {};
} }
@ -261,39 +261,39 @@ class ExtraNetworksTab {
await this.tree_list.setup(); await this.tree_list.setup();
} }
async setupCardsList() { async setupCardList() {
if (this.cards_list instanceof ExtraNetworksClusterizeCardsList) { if (this.card_list instanceof ExtraNetworksClusterizeCardList) {
this.cards_list.destroy(); this.card_list.destroy();
} }
this.cards_list = new ExtraNetworksClusterizeCardsList({ this.card_list = new ExtraNetworksClusterizeCardList({
tabname: this.tabname, tabname: this.tabname,
extra_networks_tabname: this.extra_networks_tabname, extra_networks_tabname: this.extra_networks_tabname,
scrollId: `${this.tabname_full}_cards_list_scroll_area`, scrollId: `${this.tabname_full}_card_list_scroll_area`,
contentId: `${this.tabname_full}_cards_list_content_area`, contentId: `${this.tabname_full}_card_list_content_area`,
tag: "div", tag: "div",
no_data_html: "No data matching filter.", no_data_html: "No data matching filter.",
error_html: this.clusterize_error_html, error_html: this.clusterize_error_html,
callbacks: { callbacks: {
initData: this.onInitCardsData.bind(this), initData: this.onInitCardData.bind(this),
fetchData: this.onFetchCardsData.bind(this), fetchData: this.onFetchCardData.bind(this),
}, },
}); });
await this.cards_list.setup(); await this.card_list.setup();
} }
setSortMode(sort_mode_str) { setSortMode(sort_mode_str) {
this.sort_mode_str = sort_mode_str; this.sort_mode_str = sort_mode_str;
this.cards_list.setSortMode(this.sort_mode_str); this.card_list.setSortMode(this.sort_mode_str);
} }
setSortDir(sort_dir_str) { setSortDir(sort_dir_str) {
this.sort_dir_str = sort_dir_str; this.sort_dir_str = sort_dir_str;
this.cards_list.setSortDir(this.sort_dir_str); this.card_list.setSortDir(this.sort_dir_str);
} }
setFilterStr(filter_str) { setFilterStr(filter_str) {
this.filter_str = filter_str; this.filter_str = filter_str;
this.cards_list.setFilterStr(this.filter_str); this.card_list.setFilterStr(this.filter_str);
} }
movePrompt(show_prompt = true, show_neg_prompt = true) { movePrompt(show_prompt = true, show_neg_prompt = true) {
@ -324,7 +324,7 @@ class ExtraNetworksTab {
}, },
(data) => { (data) => {
if (data && data.html) { if (data && data.html) {
this.cards_list.updateHtml(elem, data.html); this.card_list.updateHtml(elem, data.html);
} }
}, },
); );
@ -338,7 +338,7 @@ class ExtraNetworksTab {
this.controls_elem.classList.add("hidden"); this.controls_elem.classList.add("hidden");
} }
updateSplashState({cards_list_state, tree_list_state} = {}) { updateSplashState({card_list_state, tree_list_state} = {}) {
const _handle_state = (state_str, loading_elem, no_data_elem) => { const _handle_state = (state_str, loading_elem, no_data_elem) => {
switch (state_str) { switch (state_str) {
case "loading": case "loading":
@ -361,11 +361,11 @@ class ExtraNetworksTab {
let loading_elem; let loading_elem;
let no_data_elem; let no_data_elem;
if (isString(cards_list_state)) { if (isString(card_list_state)) {
this.cards_list_splash_state = cards_list_state; this.card_list_splash_state = card_list_state;
loading_elem = document.getElementById(`${this.tabname_full}_cards_list_loading_splash`); loading_elem = document.getElementById(`${this.tabname_full}_card_list_loading_splash`);
no_data_elem = document.getElementById(`${this.tabname_full}_cards_list_no_data_splash`); no_data_elem = document.getElementById(`${this.tabname_full}_card_list_no_data_splash`);
_handle_state(cards_list_state, loading_elem, no_data_elem); _handle_state(card_list_state, loading_elem, no_data_elem);
} }
if (isString(tree_list_state)) { if (isString(tree_list_state)) {
@ -377,13 +377,13 @@ class ExtraNetworksTab {
} }
async #refresh() { async #refresh() {
this.updateSplashState({cards_list_state: "loading", tree_list_state: "loading"}); this.updateSplashState({card_list_state: "loading", tree_list_state: "loading"});
try { try {
await this.waitForServerPageReady(); await this.waitForServerPageReady();
} catch (error) { } catch (error) {
console.error(`refresh error: ${error.message}`); console.error(`refresh error: ${error.message}`);
this.updateSplashState({cards_list_state: "no_data", tree_list_state: "no_data"}); this.updateSplashState({card_list_state: "no_data", tree_list_state: "no_data"});
return; return;
} }
const btn_dirs_view = this.controls_elem.querySelector(".extra-network-control--dirs-view"); const btn_dirs_view = this.controls_elem.querySelector(".extra-network-control--dirs-view");
@ -392,29 +392,29 @@ class ExtraNetworksTab {
// We actually want to select the tree view's column in the resize-handle-row. // We actually want to select the tree view's column in the resize-handle-row.
// This is what we actually show/hide, not the inner elements. // This is what we actually show/hide, not the inner elements.
const div_tree = this.tree_list.scroll_elem.closest(".resize-handle-col"); const div_tree = this.tree_list.scroll_elem.closest(".resize-handle-col");
const div_cards = this.cards_list.scroll_elem.closest(".resize-handle-col"); const div_card = this.card_list.scroll_elem.closest(".resize-handle-col");
this.dirs_view_en = "selected" in btn_dirs_view.dataset; this.dirs_view_en = "selected" in btn_dirs_view.dataset;
this.tree_view_en = "selected" in btn_tree_view.dataset; this.tree_view_en = "selected" in btn_tree_view.dataset;
this.cards_view_en = "selected" in btn_tree_view.dataset; this.card_view_en = "selected" in btn_tree_view.dataset;
// Remove "hidden" class if button is enabled, otherwise add it. // Remove "hidden" class if button is enabled, otherwise add it.
div_dirs.classList.toggle("hidden", !this.dirs_view_en); div_dirs.classList.toggle("hidden", !this.dirs_view_en);
div_tree.classList.toggle("hidden", !this.tree_view_en); div_tree.classList.toggle("hidden", !this.tree_view_en);
div_cards.classList.toggle("hidden", !this.cards_view_en); div_card.classList.toggle("hidden", !this.card_view_en);
// Apply the current resize handle classes. // Apply the current resize handle classes.
const resize_handle_row = this.tree_list.scroll_elem.closest(".resize-handle-row"); const resize_handle_row = this.tree_list.scroll_elem.closest(".resize-handle-row");
resize_handle_row.classList.toggle("resize-handle-hidden", div_tree.classList.contains("hidden")); resize_handle_row.classList.toggle("resize-handle-hidden", div_tree.classList.contains("hidden"));
if (this.tree_view_en && !this.cards_view_en) { if (this.tree_view_en && !this.card_view_en) {
this.tree_list.scroll_elem.parentElement.style.flexGrow = 1; this.tree_list.scroll_elem.parentElement.style.flexGrow = 1;
} else { } else {
this.tree_list.scroll_elem.parentElement.style.flexGrow = null; this.tree_list.scroll_elem.parentElement.style.flexGrow = null;
} }
await Promise.all([this.setupTreeList(), this.setupCardsList()]); await Promise.all([this.setupTreeList(), this.setupCardList()]);
this.tree_list.enable(this.tree_view_en); this.tree_list.enable(this.tree_view_en);
this.cards_list.enable(this.cards_view_en); this.card_list.enable(this.card_view_en);
await Promise.all([this.tree_list.load(true), this.cards_list.load(true)]); await Promise.all([this.tree_list.load(true), this.card_list.load(true)]);
// apply the previous sort/filter options // apply the previous sort/filter options
await this.applyListButtonStates(); await this.applyListButtonStates();
@ -436,32 +436,32 @@ class ExtraNetworksTab {
async load(show_prompt, show_neg_prompt) { async load(show_prompt, show_neg_prompt) {
this.movePrompt(show_prompt, show_neg_prompt); this.movePrompt(show_prompt, show_neg_prompt);
this.updateSplashState({ this.updateSplashState({
cards_list_state: this.cards_list_splash_state, card_list_state: this.card_list_splash_state,
tree_list_state: this.tree_list_splash_state, tree_list_state: this.tree_list_splash_state,
}); });
this.showControls(); this.showControls();
this.tree_list.enable(this.tree_view_en); this.tree_list.enable(this.tree_view_en);
this.cards_list.enable(this.cards_view_en); this.card_list.enable(this.card_view_en);
await Promise.all([this.tree_list.load(), this.cards_list.load()]); await Promise.all([this.tree_list.load(), this.card_list.load()]);
} }
unload() { unload() {
this.movePrompt(false, false); this.movePrompt(false, false);
this.hideControls(); this.hideControls();
this.tree_list.enable(false); this.tree_list.enable(false);
this.cards_list.enable(false); this.card_list.enable(false);
} }
addDirectoryFilter(div_id, filter_str, recurse) { addDirectoryFilter(div_id, filter_str, recurse) {
filter_str = isString(filter_str) ? filter_str : ""; filter_str = isString(filter_str) ? filter_str : "";
recurse = recurse === true || recurse === false ? recurse : false; recurse = recurse === true || recurse === false ? recurse : false;
if (this.cards_list.addDirectoryFilter(div_id, filter_str, recurse)) { if (this.card_list.addDirectoryFilter(div_id, filter_str, recurse)) {
this.directory_filters[div_id] = {filter_str: filter_str, recurse: recurse}; this.directory_filters[div_id] = {filter_str: filter_str, recurse: recurse};
} }
} }
removeDirectoryFilter(div_id) { removeDirectoryFilter(div_id) {
this.cards_list.removeDirectoryFilter(div_id); this.card_list.removeDirectoryFilter(div_id);
delete this.directory_filters[div_id]; delete this.directory_filters[div_id];
} }
@ -474,7 +474,7 @@ class ExtraNetworksTab {
excluded_div_ids = []; excluded_div_ids = [];
} }
this.cards_list.clearDirectoryFilters({excluded_div_ids: excluded_div_ids}); this.card_list.clearDirectoryFilters({excluded_div_ids: excluded_div_ids});
for (const div_id of Object.keys(this.directory_filters)) { for (const div_id of Object.keys(this.directory_filters)) {
if (excluded_div_ids.includes(div_id)) { if (excluded_div_ids.includes(div_id)) {
continue; continue;
@ -484,11 +484,11 @@ class ExtraNetworksTab {
} }
setDirectoryFilters() { setDirectoryFilters() {
this.cards_list.setDirectoryFilters(this.directory_filters); this.card_list.setDirectoryFilters(this.directory_filters);
} }
applyDirectoryFilters() { applyDirectoryFilters() {
this.cards_list.filterData(); this.card_list.filterData();
} }
applyFilter(filter_str) { applyFilter(filter_str) {
@ -529,13 +529,13 @@ class ExtraNetworksTab {
return await fetchWithRetryAndBackoff(url, payload, opts); return await fetchWithRetryAndBackoff(url, payload, opts);
} }
async onInitCardsData() { async onInitCardData() {
this.updateSplashState({cards_list_state: "loading"}); this.updateSplashState({card_list_state: "loading"});
try { try {
await this.waitForServerPageReady(); await this.waitForServerPageReady();
} catch (error) { } catch (error) {
console.error(`onInitCardsData error: ${error.message}`); console.error(`onInitCardData error: ${error.message}`);
this.updateSplashState({cards_list_state: "no_data"}); this.updateSplashState({card_list_state: "no_data"});
return {}; return {};
} }
@ -551,21 +551,21 @@ class ExtraNetworksTab {
}); });
}); });
const url = "./sd_extra_networks/init-cards-data"; const url = "./sd_extra_networks/init-card-data";
const payload = {tabname: this.tabname, extra_networks_tabname: this.extra_networks_tabname}; const payload = {tabname: this.tabname, extra_networks_tabname: this.extra_networks_tabname};
const timeout_ms = EXTRA_NETWORKS_INIT_DATA_TIMEOUT_MS; const timeout_ms = EXTRA_NETWORKS_INIT_DATA_TIMEOUT_MS;
const opts = {timeout_ms: timeout_ms, response_handler: response_handler}; const opts = {timeout_ms: timeout_ms, response_handler: response_handler};
try { try {
const response = await fetchWithRetryAndBackoff(url, payload, opts); const response = await fetchWithRetryAndBackoff(url, payload, opts);
if (Object.keys(response.data).length === 0) { if (Object.keys(response.data).length === 0) {
this.updateSplashState({cards_list_state: "no_data"}); this.updateSplashState({card_list_state: "no_data"});
} else { } else {
this.updateSplashState({cards_list_state: "show"}); this.updateSplashState({card_list_state: "show"});
} }
return response.data; return response.data;
} catch (error) { } catch (error) {
console.error(`onInitCardsData error: ${error.message}`); console.error(`onInitCardData error: ${error.message}`);
this.updateSplashState({cards_list_state: "no_data"}); this.updateSplashState({card_list_state: "no_data"});
return {}; return {};
} }
} }
@ -611,8 +611,8 @@ class ExtraNetworksTab {
} }
} }
async onFetchCardsData(div_ids) { async onFetchCardData(div_ids) {
const url = "./sd_extra_networks/fetch-cards-data"; const url = "./sd_extra_networks/fetch-card-data";
const payload = {extra_networks_tabname: this.extra_networks_tabname, div_ids: div_ids}; const payload = {extra_networks_tabname: this.extra_networks_tabname, div_ids: div_ids};
const timeout_ms = EXTRA_NETWORKS_FETCH_DATA_TIMEOUT_MS; const timeout_ms = EXTRA_NETWORKS_FETCH_DATA_TIMEOUT_MS;
const opts = {timeout_ms: timeout_ms}; const opts = {timeout_ms: timeout_ms};
@ -622,14 +622,14 @@ class ExtraNetworksTab {
console.warn(`Failed to fetch multiple div_ids: ${response.missing_div_ids}`); console.warn(`Failed to fetch multiple div_ids: ${response.missing_div_ids}`);
} }
if (Object.keys(response.data).length === 0) { if (Object.keys(response.data).length === 0) {
this.updateSplashState({cards_list_state: "no_data"}); this.updateSplashState({card_list_state: "no_data"});
} else { } else {
this.updateSplashState({cards_list_state: "show"}); this.updateSplashState({card_list_state: "show"});
} }
return response.data; return response.data;
} catch (error) { } catch (error) {
console.error(`onFetchCardsData error: ${error.message}`); console.error(`onFetchCardData error: ${error.message}`);
this.updateSplashState({cards_list_state: "no_data"}); this.updateSplashState({card_list_state: "no_data"});
return {}; return {};
} }
} }
@ -1027,7 +1027,7 @@ function extraNetworksShowMetadata(text) {
function extraNetworksRefreshSingleCard(tabname, extra_networks_tabname, name) { function extraNetworksRefreshSingleCard(tabname, extra_networks_tabname, name) {
const tab = extra_networks_tabs[`${tabname}_${extra_networks_tabname}`]; const tab = extra_networks_tabs[`${tabname}_${extra_networks_tabname}`];
const elem = tab.cards_list.content_elem.querySelector(`.card[data-name="${name}"]`); const elem = tab.card_list.content_elem.querySelector(`.card[data-name="${name}"]`);
isElementThrowError(elem); isElementThrowError(elem);
tab.refreshSingleCard(elem); tab.refreshSingleCard(elem);
} }
@ -1154,9 +1154,9 @@ async function extraNetworksControlTreeViewOnClick(event) {
// this is only recently supported in firefox. So for now we just add a class // this is only recently supported in firefox. So for now we just add a class
// to the resize-handle-row instead. // to the resize-handle-row instead.
const resize_handle_row = tab.tree_list.scroll_elem.closest(".resize-handle-row"); const resize_handle_row = tab.tree_list.scroll_elem.closest(".resize-handle-row");
resize_handle_row.classList.toggle("resize-handle-hidden", !tab.cards_view_en || !tab.tree_view_en); resize_handle_row.classList.toggle("resize-handle-hidden", !tab.card_view_en || !tab.tree_view_en);
if (tab.tree_view_en && !tab.cards_view_en) { if (tab.tree_view_en && !tab.card_view_en) {
tab.tree_list.scroll_elem.parentElement.style.flexGrow = 1; tab.tree_list.scroll_elem.parentElement.style.flexGrow = 1;
} else { } else {
tab.tree_list.scroll_elem.parentElement.style.flexGrow = null; tab.tree_list.scroll_elem.parentElement.style.flexGrow = null;
@ -1190,28 +1190,28 @@ function extraNetworksControlDirsViewOnClick(event) {
tab.applyListButtonStates(); tab.applyListButtonStates();
} }
async function extraNetworksControlCardsViewOnClick(event) { async function extraNetworksControlCardViewOnClick(event) {
/** Handles `onclick` events for the Card View button. /** Handles `onclick` events for the Card View button.
* *
* Toggles the card view in the extra networks pane. * Toggles the card view in the extra networks pane.
*/ */
const btn = event.target.closest(".extra-network-control--cards-view"); const btn = event.target.closest(".extra-network-control--card-view");
const controls = btn.closest(".extra-network-controls"); const controls = btn.closest(".extra-network-controls");
const tab = extra_networks_tabs[controls.dataset.tabnameFull]; const tab = extra_networks_tabs[controls.dataset.tabnameFull];
btn.toggleAttribute("data-selected"); btn.toggleAttribute("data-selected");
tab.cards_view_en = "selected" in btn.dataset; tab.card_view_en = "selected" in btn.dataset;
tab.cards_list.scroll_elem.parentElement.classList.toggle("hidden", !tab.cards_view_en); tab.card_list.scroll_elem.parentElement.classList.toggle("hidden", !tab.card_view_en);
tab.cards_list.enable(tab.cards_view_en); tab.card_list.enable(tab.card_view_en);
// Apply the resize-handle-hidden class to the resize-handle-row. // Apply the resize-handle-hidden class to the resize-handle-row.
// NOTE: This can be simplified using only css with the ":has" selector however // NOTE: This can be simplified using only css with the ":has" selector however
// this is only recently supported in firefox. So for now we just add a class // this is only recently supported in firefox. So for now we just add a class
// to the resize-handle-row instead. // to the resize-handle-row instead.
const resize_handle_row = tab.cards_list.scroll_elem.closest(".resize-handle-row"); const resize_handle_row = tab.card_list.scroll_elem.closest(".resize-handle-row");
resize_handle_row.classList.toggle("resize-handle-hidden", !tab.cards_view_en || !tab.tree_view_en); resize_handle_row.classList.toggle("resize-handle-hidden", !tab.card_view_en || !tab.tree_view_en);
if (tab.tree_view_en && !tab.cards_view_en) { if (tab.tree_view_en && !tab.card_view_en) {
tab.tree_list.scroll_elem.parentElement.style.flexGrow = 1; tab.tree_list.scroll_elem.parentElement.style.flexGrow = 1;
} else { } else {
tab.tree_list.scroll_elem.parentElement.style.flexGrow = null; tab.tree_list.scroll_elem.parentElement.style.flexGrow = null;
@ -1220,8 +1220,8 @@ async function extraNetworksControlCardsViewOnClick(event) {
// If the tree list hasn't loaded yet, we need to force it to load. // If the tree list hasn't loaded yet, we need to force it to load.
// This can happen if tree view is disabled by default or before refresh. // This can happen if tree view is disabled by default or before refresh.
// Then after refresh, enabling the tree view will require a load. // Then after refresh, enabling the tree view will require a load.
if (tab.cards_view_en && !tab.cards_list.initial_load) { if (tab.card_view_en && !tab.card_list.initial_load) {
await tab.cards_list.load(); await tab.card_list.load();
} }
} }
@ -1250,11 +1250,11 @@ function extraNetworksControlRefreshOnClick(event) {
return; return;
} }
tab.updateSplashState({cards_list_state: "loading", tree_list_state: "loading"}); tab.updateSplashState({card_list_state: "loading", tree_list_state: "loading"});
// We want to reset tab lists on refresh click so that the viewing area // We want to reset tab lists on refresh click so that the viewing area
// shows that it is loading new data. // shows that it is loading new data.
tab.tree_list.clear(); tab.tree_list.clear();
tab.cards_list.clear(); tab.card_list.clear();
// Fire an event for this button click. // Fire an event for this button click.
gradioApp().getElementById( gradioApp().getElementById(
`${tabname_full}_extra_refresh_internal` `${tabname_full}_extra_refresh_internal`
@ -1541,7 +1541,7 @@ function extraNetworksSetupEventDelegators() {
".extra-network-control--sort-dir": extraNetworksControlSortDirOnClick, ".extra-network-control--sort-dir": extraNetworksControlSortDirOnClick,
".extra-network-control--dirs-view": extraNetworksControlDirsViewOnClick, ".extra-network-control--dirs-view": extraNetworksControlDirsViewOnClick,
".extra-network-control--tree-view": extraNetworksControlTreeViewOnClick, ".extra-network-control--tree-view": extraNetworksControlTreeViewOnClick,
".extra-network-control--cards-view": extraNetworksControlCardsViewOnClick, ".extra-network-control--card-view": extraNetworksControlCardViewOnClick,
".extra-network-control--refresh": extraNetworksControlRefreshOnClick, ".extra-network-control--refresh": extraNetworksControlRefreshOnClick,
}; };

View File

@ -526,7 +526,7 @@ class ExtraNetworksClusterizeTreeList extends ExtraNetworksClusterize {
} }
} }
class ExtraNetworksClusterizeCardsList extends ExtraNetworksClusterize { class ExtraNetworksClusterizeCardList extends ExtraNetworksClusterize {
constructor(args) { constructor(args) {
super({...args}); super({...args});
} }

View File

@ -365,7 +365,7 @@ class ExtraNetworksPage:
return res return res
def get_button_row(self, tabname: str, item: dict) -> str: def get_button_row(self, tabname: str, item: dict) -> str:
"""Generates a row of buttons for use in Tree/Cards View items.""" """Generates a row of buttons for use in Tree/Card View items."""
metadata = item.get("metadata", None) metadata = item.get("metadata", None)
name = item.get("name", "") name = item.get("name", "")
filename = os.path.normpath(item.get("filename", "")) filename = os.path.normpath(item.get("filename", ""))
@ -474,8 +474,8 @@ class ExtraNetworksPage:
description=description, description=description,
) )
def generate_cards_view_data(self, tabname: str) -> dict: def generate_card_view_data(self, tabname: str) -> dict:
"""Generates the datasets and HTML used to display the Cards View. """Generates the datasets and HTML used to display the Card View.
Returns: Returns:
A dictionary containing necessary info for the client. A dictionary containing necessary info for the client.
@ -809,9 +809,9 @@ class ExtraNetworksPage:
self.tree_roots[abspath] = DirectoryTreeNode(os.path.dirname(abspath), abspath, None) self.tree_roots[abspath] = DirectoryTreeNode(os.path.dirname(abspath), abspath, None)
self.tree_roots[abspath].build(tree_items) self.tree_roots[abspath].build(tree_items)
cards_list_loading_splash_content = "Loading..." card_list_loading_splash_content = "Loading..."
no_cards_html_dirs = "".join([f"<li>{x}</li>" for x in self.allowed_directories_for_previews()]) no_cards_html_dirs = "".join([f"<li>{x}</li>" for x in self.allowed_directories_for_previews()])
cards_list_no_data_splash_content = ( card_list_no_data_splash_content = (
"<div class='nocards'>" "<div class='nocards'>"
"<h1>Nothing here. Add some content to the following directories:</h1>" "<h1>Nothing here. Add some content to the following directories:</h1>"
f"<ul>{no_cards_html_dirs}</ul>" f"<ul>{no_cards_html_dirs}</ul>"
@ -855,10 +855,10 @@ class ExtraNetworksPage:
"btn_tree_view_data_attributes": "data-selected" if tree_view_en else "", "btn_tree_view_data_attributes": "data-selected" if tree_view_en else "",
"btn_card_view_data_attributes": "data-selected" if card_view_en else "", "btn_card_view_data_attributes": "data-selected" if card_view_en else "",
"tree_view_style": f"flex-basis: {shared.opts.extra_networks_tree_view_default_width}px;", "tree_view_style": f"flex-basis: {shared.opts.extra_networks_tree_view_default_width}px;",
"cards_view_style": "flex-grow: 1;", "card_view_style": "flex-grow: 1;",
"dirs_html": dirs_html, "dirs_html": dirs_html,
"cards_list_loading_splash_content": cards_list_loading_splash_content, "card_list_loading_splash_content": card_list_loading_splash_content,
"cards_list_no_data_splash_content": cards_list_no_data_splash_content, "card_list_no_data_splash_content": card_list_no_data_splash_content,
"tree_list_loading_splash_content": tree_list_loading_splash_content, "tree_list_loading_splash_content": tree_list_loading_splash_content,
"tree_list_no_data_splash_content": tree_list_no_data_splash_content, "tree_list_no_data_splash_content": tree_list_no_data_splash_content,
} }
@ -1017,8 +1017,8 @@ def init_tree_data(tabname: str = "", extra_networks_tabname: str = "") -> JSONR
return JSONResponse({"data": data, "ready": data is not None}) return JSONResponse({"data": data, "ready": data is not None})
def init_cards_data(tabname: str = "", extra_networks_tabname: str = "") -> JSONResponse: def init_card_data(tabname: str = "", extra_networks_tabname: str = "") -> JSONResponse:
"""Generates the initial Cards View data and returns a simplified dataset. """Generates the initial Card View data and returns a simplified dataset.
The data returned does not contain any HTML strings. The data returned does not contain any HTML strings.
@ -1028,7 +1028,7 @@ def init_cards_data(tabname: str = "", extra_networks_tabname: str = "") -> JSON
""" """
page = get_page_by_name(extra_networks_tabname) page = get_page_by_name(extra_networks_tabname)
data = page.generate_cards_view_data(tabname) data = page.generate_card_view_data(tabname)
return JSONResponse({"data": data, "ready": data is not None}) return JSONResponse({"data": data, "ready": data is not None})
@ -1059,11 +1059,11 @@ def fetch_tree_data(
return JSONResponse({"data": res, "missing_div_ids": missed}) return JSONResponse({"data": res, "missing_div_ids": missed})
def fetch_cards_data( def fetch_card_data(
extra_networks_tabname: str = "", extra_networks_tabname: str = "",
div_ids: str = "", div_ids: str = "",
) -> JSONResponse: ) -> JSONResponse:
"""Retrieves Cards View HTML strings for the specified `div_ids`. """Retrieves Card View HTML strings for the specified `div_ids`.
Args: Args:
div_ids: A string with div_ids in CSV format. div_ids: A string with div_ids in CSV format.
@ -1159,9 +1159,9 @@ def add_pages_to_demo(app):
app.add_api_route("/sd_extra_networks/metadata", get_metadata, methods=["GET"]) app.add_api_route("/sd_extra_networks/metadata", get_metadata, methods=["GET"])
app.add_api_route("/sd_extra_networks/get-single-card", get_single_card, methods=["GET"]) app.add_api_route("/sd_extra_networks/get-single-card", get_single_card, methods=["GET"])
app.add_api_route("/sd_extra_networks/init-tree-data", init_tree_data, methods=["GET"]) app.add_api_route("/sd_extra_networks/init-tree-data", init_tree_data, methods=["GET"])
app.add_api_route("/sd_extra_networks/init-cards-data", init_cards_data, methods=["GET"]) app.add_api_route("/sd_extra_networks/init-card-data", init_card_data, methods=["GET"])
app.add_api_route("/sd_extra_networks/fetch-tree-data", fetch_tree_data, methods=["GET"]) app.add_api_route("/sd_extra_networks/fetch-tree-data", fetch_tree_data, methods=["GET"])
app.add_api_route("/sd_extra_networks/fetch-cards-data", fetch_cards_data, methods=["GET"]) app.add_api_route("/sd_extra_networks/fetch-card-data", fetch_card_data, methods=["GET"])
app.add_api_route("/sd_extra_networks/page-is-ready", page_is_ready, methods=["GET"]) app.add_api_route("/sd_extra_networks/page-is-ready", page_is_ready, methods=["GET"])
app.add_api_route("/sd_extra_networks/clear-page-data", clear_page_data, methods=["GET"]) app.add_api_route("/sd_extra_networks/clear-page-data", clear_page_data, methods=["GET"])