Merge branch 'develop' of https://github.com/Darklyter/stash into develop

This commit is contained in:
Darklyter 2024-08-21 00:46:18 -04:00
commit 7db01e15ac
6 changed files with 886 additions and 876 deletions

View file

@ -192,7 +192,7 @@ func (me *contentDirectoryService) Handle(action string, argsXML []byte, r *http
obj, err := me.objectFromID(browse.ObjectID) obj, err := me.objectFromID(browse.ObjectID)
if err != nil { if err != nil {
return nil, upnp.Errorf(upnpav.NoSuchObjectErrorCode, err.Error()) return nil, upnp.Errorf(upnpav.NoSuchObjectErrorCode, "cannot find object with id %q: %v", browse.ObjectID, err.Error())
} }
switch browse.BrowseFlag { switch browse.BrowseFlag {

View file

@ -76,7 +76,7 @@ func (t *rawPluginTask) Start() error {
if err != nil { if err != nil {
logger.Warnf("error marshalling raw command input") logger.Warnf("error marshalling raw command input")
} }
if k, err := io.WriteString(stdin, string(inBytes)); err != nil { if k, err := stdin.Write(inBytes); err != nil {
logger.Warnf("error writing input to plugins stdin (wrote %v bytes out of %v): %v", k, len(string(inBytes)), err) logger.Warnf("error writing input to plugins stdin (wrote %v bytes out of %v): %v", k, len(string(inBytes)), err)
} }
}() }()

View file

@ -1338,7 +1338,7 @@ func (c *Client) submitDraft(ctx context.Context, query string, input interface{
return fmt.Errorf("failed to decode data %s: %w", string(responseBytes), err) return fmt.Errorf("failed to decode data %s: %w", string(responseBytes), err)
} }
if respGQL.Errors != nil && len(respGQL.Errors) > 0 { if len(respGQL.Errors) > 0 {
// try to parse standard graphql error // try to parse standard graphql error
errors := &client.GqlErrorList{} errors := &client.GqlErrorList{}
if e := json.Unmarshal(responseBytes, errors); e != nil { if e := json.Unmarshal(responseBytes, errors); e != nil {

View file

@ -1,5 +1,6 @@
import React from "react"; import React from "react";
import { BooleanSetting } from "../Inputs"; import { BooleanSetting } from "../Inputs";
import { PatchComponent } from "src/patch";
interface IItem { interface IItem {
id: string; id: string;
@ -13,49 +14,47 @@ interface ICheckboxGroupProps {
onChange?: (ids: string[]) => void; onChange?: (ids: string[]) => void;
} }
export const CheckboxGroup: React.FC<ICheckboxGroupProps> = ({ export const CheckboxGroup: React.FC<ICheckboxGroupProps> = PatchComponent(
groupId, "CheckboxGroup",
items, ({ groupId, items, checkedIds = [], onChange }) => {
checkedIds = [], function generateId(itemId: string) {
onChange, return `${groupId}-${itemId}`;
}) => { }
function generateId(itemId: string) {
return `${groupId}-${itemId}`;
}
return ( return (
<> <>
{items.map(({ id, headingID }) => ( {items.map(({ id, headingID }) => (
<BooleanSetting <BooleanSetting
key={id} key={id}
id={generateId(id)} id={generateId(id)}
headingID={headingID} headingID={headingID}
checked={checkedIds.includes(id)} checked={checkedIds.includes(id)}
onChange={(v) => { onChange={(v) => {
if (v) { if (v) {
onChange?.( onChange?.(
items items
.map((item) => item.id) .map((item) => item.id)
.filter( .filter(
(itemId) => (itemId) =>
generateId(itemId) === generateId(id) || generateId(itemId) === generateId(id) ||
checkedIds.includes(itemId) checkedIds.includes(itemId)
) )
); );
} else { } else {
onChange?.( onChange?.(
items items
.map((item) => item.id) .map((item) => item.id)
.filter( .filter(
(itemId) => (itemId) =>
generateId(itemId) !== generateId(id) && generateId(itemId) !== generateId(id) &&
checkedIds.includes(itemId) checkedIds.includes(itemId)
) )
); );
} }
}} }}
/> />
))} ))}
</> </>
); );
}; }
);

View file

@ -54,6 +54,15 @@ export const ScraperMenu: React.FC<{
<Dropdown.Toggle variant={variant}>{toggle}</Dropdown.Toggle> <Dropdown.Toggle variant={variant}>{toggle}</Dropdown.Toggle>
<Dropdown.Menu> <Dropdown.Menu>
<Dropdown.Item onClick={() => onReloadScrapers()}>
<span className="fa-icon">
<Icon icon={faSyncAlt} />
</span>
<span>
<FormattedMessage id="actions.reload_scrapers" />
</span>
</Dropdown.Item>
{(stashBoxes?.length ?? 0) + scrapers.length > minFilteredScrapers && ( {(stashBoxes?.length ?? 0) + scrapers.length > minFilteredScrapers && (
<ClearableInput <ClearableInput
placeholder={`${intl.formatMessage({ id: "filter" })}...`} placeholder={`${intl.formatMessage({ id: "filter" })}...`}
@ -61,6 +70,7 @@ export const ScraperMenu: React.FC<{
setValue={setFilter} setValue={setFilter}
/> />
)} )}
{filteredStashboxes.map((s, index) => ( {filteredStashboxes.map((s, index) => (
<Dropdown.Item <Dropdown.Item
key={s.endpoint} key={s.endpoint}
@ -86,14 +96,6 @@ export const ScraperMenu: React.FC<{
{s.name} {s.name}
</Dropdown.Item> </Dropdown.Item>
))} ))}
<Dropdown.Item onClick={() => onReloadScrapers()}>
<span className="fa-icon">
<Icon icon={faSyncAlt} />
</span>
<span>
<FormattedMessage id="actions.reload_scrapers" />
</span>
</Dropdown.Item>
</Dropdown.Menu> </Dropdown.Menu>
</Dropdown> </Dropdown>
); );