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)
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 {

View file

@ -76,7 +76,7 @@ func (t *rawPluginTask) Start() error {
if err != nil {
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)
}
}()

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)
}
if respGQL.Errors != nil && len(respGQL.Errors) > 0 {
if len(respGQL.Errors) > 0 {
// try to parse standard graphql error
errors := &client.GqlErrorList{}
if e := json.Unmarshal(responseBytes, errors); e != nil {

View file

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

View file

@ -54,6 +54,15 @@ export const ScraperMenu: React.FC<{
<Dropdown.Toggle variant={variant}>{toggle}</Dropdown.Toggle>
<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 && (
<ClearableInput
placeholder={`${intl.formatMessage({ id: "filter" })}...`}
@ -61,6 +70,7 @@ export const ScraperMenu: React.FC<{
setValue={setFilter}
/>
)}
{filteredStashboxes.map((s, index) => (
<Dropdown.Item
key={s.endpoint}
@ -86,14 +96,6 @@ export const ScraperMenu: React.FC<{
{s.name}
</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>
);