diff --git a/html/extra-networks-pane.html b/html/extra-networks-pane.html
index 3c0e44924..2b9b6a2fc 100644
--- a/html/extra-networks-pane.html
+++ b/html/extra-networks-pane.html
@@ -130,7 +130,8 @@
class='extra-network-tree styled-scrollbar clusterize-scroll'>
@@ -139,7 +140,8 @@
class='extra-network-cards styled-scrollbar clusterize-scroll'>
diff --git a/javascript/clusterize.js b/javascript/clusterize.js
index 245fd9d45..f03530912 100644
--- a/javascript/clusterize.js
+++ b/javascript/clusterize.js
@@ -19,6 +19,8 @@ class Clusterize {
content_elem = null;
scroll_id = null;
content_id = null;
+ no_data_class_default = "clusterize-no-data";
+ loading_class_default = "clusterize-loading";
options = {
rows_in_block: 50,
cols_in_block: 1,
@@ -26,12 +28,15 @@ class Clusterize {
tag: null,
id_attr: "data-div-id",
show_no_data_row: true,
- no_data_class: "clusterize-no-data",
- no_data_text: "No data",
- loading_data_text: "Loading...",
+ no_data_class: this.no_data_class_default,
+ loading_class: this.loading_class_default,
keep_parity: true,
callbacks: {},
};
+ loading_html_default = `Loading...
`;
+ no_data_html_default = `No Data
`;
+ loading_html = null;
+ no_data_html = null;
setup_has_run = false;
enabled = false;
#is_mac = null;
@@ -100,6 +105,9 @@ class Clusterize {
this.#max_items = args.max_items;
this.#on_scroll_bound = this.#onScroll.bind(this);
+
+ this.loading_html = args.loading_html;
+ this.no_data_html = args.no_data_html;
}
// ==== PUBLIC FUNCTIONS ====
@@ -125,12 +133,13 @@ class Clusterize {
this.setup_has_run = true;
}
- clear(custom_text) {
+ clear(custom_html) {
if (!this.setup_has_run || !this.enabled) {
return;
}
- this.#html(this.#generateEmptyRow(custom_text).join(""));
+ custom_html = custom_html || this.no_data_html;
+ this.#html(custom_html);
}
destroy() {
@@ -138,7 +147,7 @@ class Clusterize {
this.#teardownElementObservers();
this.#teardownResizeObservers();
- this.#html(this.#generateEmptyRow().join(""));
+ this.#html(this.no_data_html);
this.setup_has_run = false;
}
@@ -276,6 +285,23 @@ class Clusterize {
if (!this.options.tag) {
this.options.tag = this.content_elem.children[0].tagName.toLowerCase();
}
+
+ if (!isString(this.loading_html)) {
+ const loading_elem = this.content_elem.querySelector(`.${this.options.loading_class}`);
+ if (isElement(loading_elem)) {
+ this.loading_html = loading_elem.outerHTML;
+ loading_elem.remove();
+ }
+ }
+
+ if (!isString(this.no_data_html)) {
+ const no_data_elem = this.content_elem.querySelector(`.${this.options.no_data_class}`);
+ if (isElement(no_data_elem)) {
+ this.no_data_html = no_data_elem.outerHTML;
+ no_data_elem.remove();
+ }
+ }
+
this.#recalculateDims();
}
@@ -290,7 +316,9 @@ class Clusterize {
}
// Get the first element that isn't one of our placeholder rows.
- const node = this.content_elem.querySelector(":scope > :not(.clusterize-extra-row,.clusterize-no-data)");
+ const node = this.content_elem.querySelector(
+ `:scope > :not(.clusterize-extra-row,.${this.options.no_data_class},.${this.options.loading_class})`
+ );
if (!isElement(node)) {
// dont attempt to compute dims if we have no data.
return;
@@ -348,30 +376,6 @@ class Clusterize {
return Math.min(current_cluster, max_cluster);
}
- #generateEmptyRow(text, class_name) {
- if (isNullOrUndefined(text)) {
- text = this.options.no_data_text;
- }
-
- if (isNullOrUndefined(class_name)) {
- class_name = this.options.no_data_class;
- }
-
- const empty_row = document.createElement(this.options.tag);
- const content = document.createTextNode(text);
- empty_row.className = class_name;
- if (this.options.tag === "tr") {
- const td = document.createElement("td");
- // fixes #53
- td.colSpan = 100;
- td.appendChild(content);
- empty_row.appendChild(td);
- } else {
- empty_row.appendChild(content);
- }
- return [empty_row.outerHTML];
- }
-
async #generate() {
const rows_start = Math.max(0, (this.options.rows_in_cluster - this.options.rows_in_block) * this.#getClusterNum());
const rows_end = rows_start + this.options.rows_in_cluster;
@@ -393,7 +397,7 @@ class Clusterize {
top_offset: 0,
bottom_offset: 0,
rows_above: 0,
- rows: this_cluster_rows.length ? this_cluster_rows : this.#generateEmptyRow(),
+ rows: this_cluster_rows.length ? this_cluster_rows : [this.no_data_html],
};
}
@@ -413,12 +417,12 @@ class Clusterize {
if (!Array.isArray(rows) || !rows.length) {
// This implies there is no data for this list. Not an error.
// Errors should be handled in the fetchData callback, not here.
- this.#html(this.#generateEmptyRow().join(""));
+ this.#html(this.no_data_html);
return;
} else {
this.#exploreEnvironment(rows, this.#cache);
// Remove the temporary item from the data since we calculated its size.
- this.#html(this.#generateEmptyRow("Loading...").join(""));
+ this.#html(this.loading_html);
}
}
diff --git a/javascript/extraNetworks.js b/javascript/extraNetworks.js
index 0615ae7eb..5be4bdf71 100644
--- a/javascript/extraNetworks.js
+++ b/javascript/extraNetworks.js
@@ -111,6 +111,10 @@ class ExtraNetworksTab {
refresh_in_progress = false;
dirs_view_en = false;
tree_view_en = false;
+ tree_list_no_data_html_bkp = null;
+ tree_list_loading_html_bkp = null;
+ cards_list_no_data_html_bkp = null;
+ cards_list_loading_html_bkp = null;
constructor({tabname, extra_networks_tabname}) {
this.tabname = tabname;
this.extra_networks_tabname = extra_networks_tabname;
@@ -149,6 +153,26 @@ class ExtraNetworksTab {
this.controls_elem.id = `${this.tabname_full}_controls`;
controls_div.insertBefore(this.controls_elem, null);
+ // create backups of the no-data and loading elements for tree/cards list
+ const tree_loading_elem = this.container_elem.querySelector(
+ ".extra-network-tree .clusterize-loading"
+ );
+ const tree_no_data_elem = this.container_elem.querySelector(
+ ".extra-network-tree .clusterize-no-data"
+ );
+ const cards_loading_elem = this.container_elem.querySelector(
+ ".extra-network-cards-content .clusterize-loading"
+ );
+ const cards_no_data_elem = this.container_elem.querySelector(
+ ".extra-network-cards-content .clusterize-no-data"
+ );
+ // need to store backup of these since they are removed on clusterize clear.
+ // we re-apply them next time we call setup.
+ this.cards_list_no_data_html_bkp = cards_no_data_elem.outerHTML;
+ this.cards_list_loading_html_bkp = cards_loading_elem.outerHTML;
+ this.tree_list_no_data_html_bkp = tree_no_data_elem.outerHTML;
+ this.tree_list_loading_html_bkp = tree_loading_elem.outerHTML;
+
await Promise.all([this.setupTreeList(), this.setupCardsList()]);
const btn_dirs_view = this.controls_elem.querySelector(".extra-network-control--dirs-view");
@@ -232,6 +256,8 @@ class ExtraNetworksTab {
initData: this.onInitTreeData.bind(this),
fetchData: this.onFetchTreeData.bind(this),
},
+ no_data_html: this.tree_list_no_data_html_bkp,
+ loading_html: this.tree_list_loading_html_bkp,
});
await this.tree_list.setup();
}
@@ -250,6 +276,8 @@ class ExtraNetworksTab {
initData: this.onInitCardsData.bind(this),
fetchData: this.onFetchCardsData.bind(this),
},
+ no_data_html: this.cards_list_no_data_html_bkp,
+ loading_html: this.cards_list_loading_html_bkp,
});
await this.cards_list.setup();
}
diff --git a/javascript/extraNetworksClusterize.js b/javascript/extraNetworksClusterize.js
index f8844c5f1..fbb77bce9 100644
--- a/javascript/extraNetworksClusterize.js
+++ b/javascript/extraNetworksClusterize.js
@@ -106,7 +106,7 @@ class ExtraNetworksClusterize extends Clusterize {
if (this.lru instanceof LRUCache) {
this.lru.clear();
}
- super.clear("Loading...");
+ super.clear(this.loading_html);
}
async load(force_init_data) {
@@ -263,15 +263,12 @@ class ExtraNetworksClusterizeTreeList extends ExtraNetworksClusterize {
selected_div_id = null;
constructor(args) {
- super({
- ...args,
- no_data_text: "Directory is empty.",
- });
+ super({...args});
}
clear() {
this.selected_div_id = null;
- super.clear("Loading...");
+ super.clear(this.loading_html);
}
async onRowSelected(elem) {
@@ -498,10 +495,7 @@ class ExtraNetworksClusterizeTreeList extends ExtraNetworksClusterize {
class ExtraNetworksClusterizeCardsList extends ExtraNetworksClusterize {
constructor(args) {
- super({
- ...args,
- no_data_text: "No files matching filter.",
- });
+ super({...args});
}
sortByPath(data) {
diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py
index 2e8360fba..1be7bdb6e 100644
--- a/modules/ui_extra_networks.py
+++ b/modules/ui_extra_networks.py
@@ -759,6 +759,16 @@ class ExtraNetworksPage:
include_hidden=shared.opts.extra_networks_show_hidden_directories,
)
+ no_cards_html_dirs = "".join(
+ [f"{x}" for x in self.allowed_directories_for_previews()]
+ )
+ no_cards_html = (
+ ""
+ "
Nothing here. Add some content to the following directories:
"
+ f"
"
+ "
"
+ )
+
# Now use tree roots to generate a mapping of div_ids to nodes.
# Flatten roots into a single sorted list of nodes.
# Directories always come before files. After that, natural sort is used.
@@ -794,6 +804,7 @@ class ExtraNetworksPage:
"tree_view_style": f"flex-basis: {shared.opts.extra_networks_tree_view_default_width}px;",
"cards_view_style": "flex-grow: 1;",
"dirs_html": dirs_html,
+ "no_cards_html": no_cards_html,
}
)
diff --git a/style.css b/style.css
index 24c1d1b34..0470a3dd5 100644
--- a/style.css
+++ b/style.css
@@ -946,6 +946,7 @@ footer {
.extra-network-pane .nocards li{
margin-left: 0.5em;
+ text-align: left;
}
.extra-network-pane .card .button-row{
@@ -1216,6 +1217,11 @@ body.resizing .resize-handle {
color: var(--input-placeholder-color) !important;
}
+.clusterize-loading {
+ text-align: center;
+ color: var(--input-placeholder-color) !important;
+}
+
.extra-network-pane {
display: flex;
flex-direction: column;