Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
S
Stable Diffusion Webui
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
novelai-storage
Stable Diffusion Webui
Commits
f49c220c
Commit
f49c220c
authored
Jan 15, 2024
by
Sj-Si
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move extra network tab buttons into tree view;
parent
d88424ef
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
401 additions
and
284 deletions
+401
-284
html/extra-networks-card.html
html/extra-networks-card.html
+2
-6
html/extra-networks-copy-path-button.html
html/extra-networks-copy-path-button.html
+5
-0
html/extra-networks-edit-item-button.html
html/extra-networks-edit-item-button.html
+4
-0
html/extra-networks-metadata-button.html
html/extra-networks-metadata-button.html
+4
-0
html/extra-networks-tree-button.html
html/extra-networks-tree-button.html
+4
-2
html/extra-networks-tree.html
html/extra-networks-tree.html
+42
-0
javascript/extraNetworks.js
javascript/extraNetworks.js
+63
-19
modules/ui_extra_networks.py
modules/ui_extra_networks.py
+91
-179
style.css
style.css
+186
-78
No files found.
html/extra-networks-card.html
View file @
f49c220c
<div
class=
'card'
style=
{style}
onclick=
{card_clicked}
data-name=
"{name}"
{
sort_keys
}
>
<div
class=
"card"
style=
{style}
onclick=
"{card_clicked}"
data-name=
"{name}"
{
sort_keys
}
>
{background_image}
{background_image}
<div
class=
"button-row"
>
<div
class=
"button-row"
>
{copy_path_button}{metadata_button}{edit_button}
</div>
{copy_path_button}
{metadata_button}
{edit_button}
</div>
<div
class=
'actions'
>
<div
class=
'actions'
>
<div
class=
'additional'
>
{search_terms}
</div>
<div
class=
'additional'
>
{search_terms}
</div>
<span
class=
'name'
>
{name}
</span>
<span
class=
'name'
>
{name}
</span>
...
...
html/extra-networks-copy-path-button.html
0 → 100644
View file @
f49c220c
<div
class=
"copy-path-button card-button"
title=
"Copy path to clipboard"
onclick=
"extraNetworksCopyCardPath(event, '{filename}')"
data-clipboard-text=
"{filename}"
>
</div>
\ No newline at end of file
html/extra-networks-edit-item-button.html
0 → 100644
View file @
f49c220c
<div
class=
"edit-button card-button"
title=
"Edit metadata"
onclick=
"extraNetworksEditUserMetadata(event, '{tabname}', '{page_id}', '{name}')"
>
</div>
\ No newline at end of file
html/extra-networks-metadata-button.html
0 → 100644
View file @
f49c220c
<div
class=
"metadata-button card-button"
title=
"Show internal metadata"
onclick=
"extraNetworksRequestMetadata(event, '{page_id}', '{name}')"
>
</div>
\ No newline at end of file
html/extra-networks-tree-button.html
View file @
f49c220c
<span
data-filterable-item-text
hidden
>
{search_terms}
</span>
<span
data-filterable-item-text
hidden
>
{search_terms}
</span>
<
button
class=
"tree-list-content {subclass}"
<
div
class=
"tree-list-content {subclass}"
expanded=
"false"
expanded=
"false"
type=
"button"
type=
"button"
onclick=
"extraNetworksTreeOnClick(event, '{tabname}', '{tab_id}');{onclick_extra}"
onclick=
"extraNetworksTreeOnClick(event, '{tabname}', '{tab_id}');{onclick_extra}"
data-path=
"{data_path}"
data-hash=
"{data_hash}"
>
>
<span
class=
'tree-list-item-action tree-list-item-action--leading'
>
<span
class=
'tree-list-item-action tree-list-item-action--leading'
>
{action_list_item_action_leading}
{action_list_item_action_leading}
...
@@ -19,4 +21,4 @@
...
@@ -19,4 +21,4 @@
<span
class=
"tree-list-item-action tree-list-item-action--trailing"
>
<span
class=
"tree-list-item-action tree-list-item-action--trailing"
>
{action_list_item_action_trailing}
{action_list_item_action_trailing}
</span>
</span>
</button>
</div>
\ No newline at end of file
\ No newline at end of file
html/extra-networks-tree.html
0 → 100644
View file @
f49c220c
<div
class=
"tree-list"
>
<div
class=
"tree-list-controls"
>
<div
class=
"tree-list-search"
>
<input
id=
"{tabname}_{tab_id}_extra_search"
class=
"tree-list-search-text"
type=
"search"
placeholder=
"Filter files"
>
</div>
<div
id=
"{tabname}_{tab_id}_extra_sort"
class=
"tree-list-sort"
data-sortmode=
"path"
data-sortkey=
"sortPath-Ascending-640"
title=
"Sort by path"
onclick=
"extraNetworksTreeSortOnClick(event, '{tabname}', '{tab_id}');"
>
<i
class=
"tree-list-sort-icon"
></i>
</div>
<div
id=
"{tabname}_{tab_id}_extra_sort_dir"
class=
"tree-list-sort-dir"
data-sortdir=
"Ascending"
title=
"Sort ascending"
onclick=
"extraNetworksTreeSortDirOnClick(event, '{tabname}', '{tab_id}');"
>
<i
class=
"tree-list-sort-dir-icon"
></i>
</div>
<div
id=
"{tabname}_{tab_id}_extra_refresh"
class=
"tree-list-refresh"
title=
"Refresh page"
onclick=
"extraNetworksTreeRefreshOnClick(event, '{tabname}', '{tab_id}');"
>
<i
class=
"tree-list-refresh-icon"
></i>
</div>
</div>
<div
class=
"tree-list-container"
>
{tree}
</div>
</div>
\ No newline at end of file
javascript/extraNetworks.js
View file @
f49c220c
...
@@ -37,15 +37,20 @@ function setupExtraNetworksForTab(tabname) {
...
@@ -37,15 +37,20 @@ function setupExtraNetworksForTab(tabname) {
return
;
// `continue` doesn't work in `forEach` loops. This is equivalent.
return
;
// `continue` doesn't work in `forEach` loops. This is equivalent.
}
}
var
tabs
=
gradioApp
().
querySelector
(
'
#
'
+
tabname
+
'
_extra_tabs > div
'
);
var
sort
=
gradioApp
().
querySelector
(
"
#
"
+
tab_id
+
"
_extra_sort
"
);
var
sort
=
gradioApp
().
getElementById
(
tabname
+
'
_extra_sort
'
);
if
(
!
sort
)
{
var
sortOrder
=
gradioApp
().
getElementById
(
tabname
+
'
_extra_sortorder
'
);
return
;
// `continue` doesn't work in `forEach` loops. This is equivalent.
var
refresh
=
gradioApp
().
getElementById
(
tabname
+
'
_extra_refresh
'
);
}
var
promptContainer
=
gradioApp
().
querySelector
(
'
.prompt-container-compact#
'
+
tabname
+
'
_prompt_container
'
);
var
negativePrompt
=
gradioApp
().
querySelector
(
'
#
'
+
tabname
+
'
_neg_prompt
'
);
var
sort_dir
=
gradioApp
().
querySelector
(
"
#
"
+
tab_id
+
"
_extra_sort_dir
"
);
tabs
.
appendChild
(
sort
);
if
(
!
sort_dir
)
{
tabs
.
appendChild
(
sortOrder
);
return
;
// `continue` doesn't work in `forEach` loops. This is equivalent.
tabs
.
appendChild
(
refresh
);
}
var
refresh
=
gradioApp
().
querySelector
(
"
#
"
+
tab_id
+
"
_extra_refresh
"
);
if
(
!
refresh
)
{
return
;
// `continue` doesn't work in `forEach` loops. This is equivalent.
}
var
applyFilter
=
function
()
{
var
applyFilter
=
function
()
{
var
searchTerm
=
search
.
value
.
toLowerCase
();
var
searchTerm
=
search
.
value
.
toLowerCase
();
...
@@ -72,8 +77,8 @@ function setupExtraNetworksForTab(tabname) {
...
@@ -72,8 +77,8 @@ function setupExtraNetworksForTab(tabname) {
var
applySort
=
function
()
{
var
applySort
=
function
()
{
var
cards
=
gradioApp
().
querySelectorAll
(
'
#
'
+
tabname
+
'
_extra_tabs div.card
'
);
var
cards
=
gradioApp
().
querySelectorAll
(
'
#
'
+
tabname
+
'
_extra_tabs div.card
'
);
var
reverse
=
sort
Order
.
classList
.
contains
(
"
sortReverse
"
)
;
var
reverse
=
sort
_dir
.
dataset
.
sortdir
==
"
Descending
"
;
var
sortKey
=
sort
.
querySelector
(
"
input
"
).
valu
e
.
toLowerCase
().
replace
(
"
sort
"
,
""
).
replaceAll
(
"
"
,
"
_
"
).
replace
(
/_+$/
,
""
).
trim
()
||
"
name
"
;
var
sortKey
=
sort
.
dataset
.
sortmod
e
.
toLowerCase
().
replace
(
"
sort
"
,
""
).
replaceAll
(
"
"
,
"
_
"
).
replace
(
/_+$/
,
""
).
trim
()
||
"
name
"
;
sortKey
=
"
sort
"
+
sortKey
.
charAt
(
0
).
toUpperCase
()
+
sortKey
.
slice
(
1
);
sortKey
=
"
sort
"
+
sortKey
.
charAt
(
0
).
toUpperCase
()
+
sortKey
.
slice
(
1
);
var
sortKeyStore
=
sortKey
+
"
-
"
+
(
reverse
?
"
Descending
"
:
"
Ascending
"
)
+
"
-
"
+
cards
.
length
;
var
sortKeyStore
=
sortKey
+
"
-
"
+
(
reverse
?
"
Descending
"
:
"
Ascending
"
)
+
"
-
"
+
cards
.
length
;
...
@@ -107,10 +112,7 @@ function setupExtraNetworksForTab(tabname) {
...
@@ -107,10 +112,7 @@ function setupExtraNetworksForTab(tabname) {
};
};
search
.
addEventListener
(
"
input
"
,
applyFilter
);
search
.
addEventListener
(
"
input
"
,
applyFilter
);
sortOrder
.
addEventListener
(
"
click
"
,
function
()
{
applySort
();
sortOrder
.
classList
.
toggle
(
"
sortReverse
"
);
applySort
();
});
applyFilter
();
applyFilter
();
extraNetworksApplySort
[
tab_id
]
=
applySort
;
extraNetworksApplySort
[
tab_id
]
=
applySort
;
...
@@ -274,7 +276,7 @@ function extraNetworksTreeProcessFileClick(event, btn, tabname, tab_id) {
...
@@ -274,7 +276,7 @@ function extraNetworksTreeProcessFileClick(event, btn, tabname, tab_id) {
var
par
=
btn
.
parentElement
;
var
par
=
btn
.
parentElement
;
var
search_id
=
tabname
+
"
_
"
+
tab_id
+
"
_extra_search
"
;
var
search_id
=
tabname
+
"
_
"
+
tab_id
+
"
_extra_search
"
;
var
type
=
par
.
getAttribute
(
"
data-tree-entry-type
"
);
var
type
=
par
.
getAttribute
(
"
data-tree-entry-type
"
);
var
path
=
par
.
getAttribute
(
"
data-path
"
);
var
path
=
btn
.
getAttribute
(
"
data-path
"
);
}
}
function
extraNetworksTreeProcessDirectoryClick
(
event
,
btn
,
tabname
,
tab_id
)
{
function
extraNetworksTreeProcessDirectoryClick
(
event
,
btn
,
tabname
,
tab_id
)
{
...
@@ -310,7 +312,7 @@ function extraNetworksTreeProcessDirectoryClick(event, btn, tabname, tab_id) {
...
@@ -310,7 +312,7 @@ function extraNetworksTreeProcessDirectoryClick(event, btn, tabname, tab_id) {
function
_remove_selected_from_all
()
{
function
_remove_selected_from_all
()
{
// Removes the `selected` attribute from all buttons.
// Removes the `selected` attribute from all buttons.
var
sels
=
document
.
querySelectorAll
(
"
button
.tree-list-content
"
);
var
sels
=
document
.
querySelectorAll
(
"
div
.tree-list-content
"
);
[...
sels
].
forEach
(
el
=>
{
[...
sels
].
forEach
(
el
=>
{
el
.
removeAttribute
(
"
selected
"
);
el
.
removeAttribute
(
"
selected
"
);
});
});
...
@@ -345,11 +347,11 @@ function extraNetworksTreeProcessDirectoryClick(event, btn, tabname, tab_id) {
...
@@ -345,11 +347,11 @@ function extraNetworksTreeProcessDirectoryClick(event, btn, tabname, tab_id) {
// NOTE: Double inversion sucks but it is the clearest way to show the branching here.
// NOTE: Double inversion sucks but it is the clearest way to show the branching here.
_expand_or_collapse
(
ul
,
btn
);
_expand_or_collapse
(
ul
,
btn
);
_select_button
(
btn
,
tabname
,
tab_id
);
_select_button
(
btn
,
tabname
,
tab_id
);
_update_search
(
tabname
,
tab_id
,
btn
.
parentElement
.
getAttribute
(
"
data-path
"
));
_update_search
(
tabname
,
tab_id
,
btn
.
getAttribute
(
"
data-path
"
));
}
else
{
}
else
{
// All other cases, just select the button.
// All other cases, just select the button.
_select_button
(
btn
,
tabname
,
tab_id
);
_select_button
(
btn
,
tabname
,
tab_id
);
_update_search
(
tabname
,
tab_id
,
btn
.
parentElement
.
getAttribute
(
"
data-path
"
));
_update_search
(
tabname
,
tab_id
,
btn
.
getAttribute
(
"
data-path
"
));
}
}
}
}
}
}
...
@@ -374,6 +376,48 @@ function extraNetworksTreeOnClick(event, tabname, tab_id) {
...
@@ -374,6 +376,48 @@ function extraNetworksTreeOnClick(event, tabname, tab_id) {
}
}
}
}
function
extraNetworksTreeSortOnClick
(
event
,
tabname
,
tab_id
)
{
var
curr_mode
=
event
.
currentTarget
.
dataset
.
sortmode
;
var
el_sort_dir
=
gradioApp
().
querySelector
(
"
#
"
+
tabname
+
"
_
"
+
tab_id
+
"
_extra_sort_dir
"
);
var
sort_dir
=
el_sort_dir
.
dataset
.
sortdir
;
if
(
curr_mode
==
"
path
"
)
{
event
.
currentTarget
.
dataset
.
sortmode
=
"
name
"
;
event
.
currentTarget
.
dataset
.
sortkey
=
"
sortName-
"
+
sort_dir
+
"
-640
"
;
event
.
currentTarget
.
setAttribute
(
"
title
"
,
"
Sort by filename
"
);
}
else
if
(
curr_mode
==
"
name
"
)
{
event
.
currentTarget
.
dataset
.
sortmode
=
"
date_created
"
;
event
.
currentTarget
.
dataset
.
sortkey
=
"
sortDate_created-
"
+
sort_dir
+
"
-640
"
;
event
.
currentTarget
.
setAttribute
(
"
title
"
,
"
Sort by date created
"
);
}
else
if
(
curr_mode
==
"
date_created
"
)
{
event
.
currentTarget
.
dataset
.
sortmode
=
"
date_modified
"
;
event
.
currentTarget
.
dataset
.
sortkey
=
"
sortDate_modified-
"
+
sort_dir
+
"
-640
"
;
event
.
currentTarget
.
setAttribute
(
"
title
"
,
"
Sort by date modified
"
);
}
else
{
event
.
currentTarget
.
dataset
.
sortmode
=
"
path
"
;
event
.
currentTarget
.
dataset
.
sortkey
=
"
sortPath-
"
+
sort_dir
+
"
-640
"
;
event
.
currentTarget
.
setAttribute
(
"
title
"
,
"
Sort by path
"
);
}
applyExtraNetworkSort
(
tabname
+
"
_
"
+
tab_id
);
}
function
extraNetworksTreeSortDirOnClick
(
event
,
tabname
,
tab_id
)
{
var
curr_dir
=
event
.
currentTarget
.
getAttribute
(
"
data-sortdir
"
);
if
(
curr_dir
==
"
Ascending
"
)
{
event
.
currentTarget
.
dataset
.
sortdir
=
"
Descending
"
;
event
.
currentTarget
.
setAttribute
(
"
title
"
,
"
Sort descending
"
);
}
else
{
event
.
currentTarget
.
dataset
.
sortdir
=
"
Ascending
"
;
event
.
currentTarget
.
setAttribute
(
"
title
"
,
"
Sort ascending
"
);
}
applyExtraNetworkSort
(
tabname
+
"
_
"
+
tab_id
);
}
function
extraNetworksTreeRefreshOnClick
(
event
,
tabname
,
tab_id
)
{
console
.
log
(
"
refresh clicked
"
);
var
btn_refresh_internal
=
gradioApp
().
getElementById
(
tabname
+
"
_extra_refresh_internal
"
);
btn_refresh_internal
.
dispatchEvent
(
new
Event
(
"
click
"
));
}
var
globalPopup
=
null
;
var
globalPopup
=
null
;
var
globalPopupInner
=
null
;
var
globalPopupInner
=
null
;
...
...
modules/ui_extra_networks.py
View file @
f49c220c
This diff is collapsed.
Click to expand it.
style.css
View file @
f49c220c
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment