mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Changes
This commit is contained in:
@@ -30,6 +30,7 @@
|
||||
"react-router-bootstrap": "^0.25.0",
|
||||
"react-router-dom": "^5.1.2",
|
||||
"react-scripts": "3.3.0",
|
||||
"react-select": "^3.0.8",
|
||||
"subscriptions-transport-ws": "^0.9.16",
|
||||
"video.js": "^7.6.0"
|
||||
},
|
||||
@@ -60,6 +61,7 @@
|
||||
"@types/react-dom": "16.9.4",
|
||||
"@types/react-router-bootstrap": "^0.24.5",
|
||||
"@types/react-router-dom": "5.1.3",
|
||||
"@types/react-select": "^3.0.8",
|
||||
"@types/video.js": "^7.2.11",
|
||||
"eslint": "^6.7.2",
|
||||
"graphql-code-generator": "0.18.2",
|
||||
|
||||
Binary file not shown.
@@ -11,6 +11,7 @@ import { Stats } from "./components/Stats";
|
||||
import Studios from "./components/Studios/Studios";
|
||||
import Tags from "./components/Tags/Tags";
|
||||
import { SceneFilenameParser } from "./components/scenes/SceneFilenameParser";
|
||||
import { ToastProvider } from './components/Shared/Toast';
|
||||
|
||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||
import { fas } from '@fortawesome/free-solid-svg-icons'
|
||||
@@ -23,6 +24,7 @@ export const App: React.FC = () => (
|
||||
<div className="bp3-dark">
|
||||
<ErrorBoundary>
|
||||
<MainNavbar />
|
||||
<ToastProvider>
|
||||
<div className="main">
|
||||
<Switch>
|
||||
<Route exact={true} path="/" component={Stats} />
|
||||
@@ -37,6 +39,7 @@ export const App: React.FC = () => (
|
||||
<Route component={PageNotFound} />
|
||||
</Switch>
|
||||
</div>
|
||||
</ToastProvider>
|
||||
</ErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -10,7 +10,7 @@ import { StudiosCriterion } from "../../models/list-filter/criteria/studios";
|
||||
import { TagsCriterion } from "../../models/list-filter/criteria/tags";
|
||||
import { makeCriteria } from "../../models/list-filter/criteria/utils";
|
||||
import { ListFilterModel } from "../../models/list-filter/filter";
|
||||
import { FilterMultiSelect } from "../select/FilterMultiSelect";
|
||||
import { FilterSelect } from "../select/FilterSelect";
|
||||
|
||||
interface IAddFilterProps {
|
||||
onAddCriterion: (criterion: Criterion, oldId?: string) => void;
|
||||
@@ -113,27 +113,24 @@ export const AddFilter: React.FC<IAddFilterProps> = (props: IAddFilterProps) =>
|
||||
}
|
||||
|
||||
if (Array.isArray(criterion.value)) {
|
||||
let type: "performers" | "studios" | "tags" | "" = "";
|
||||
let type: "performers" | "studios" | "tags";
|
||||
if (criterion instanceof PerformersCriterion) {
|
||||
type = "performers";
|
||||
} else if (criterion instanceof StudiosCriterion) {
|
||||
type = "studios";
|
||||
} else if (criterion instanceof TagsCriterion) {
|
||||
type = "tags";
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (type === "") {
|
||||
return (<>todo</>);
|
||||
} else {
|
||||
return (
|
||||
<FilterMultiSelect
|
||||
<FilterSelect
|
||||
type={type}
|
||||
onUpdate={(items) => criterion.value = items.map((i) => ({id: i.id, label: i.name!}))}
|
||||
openOnKeyDown={true}
|
||||
onSelect={(items) => criterion.value = items.map((i) => ({id: i.id, label: i.name!}))}
|
||||
initialIds={criterion.value.map((labeled: any) => labeled.id)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if (criterion.options) {
|
||||
defaultValue.current = criterion.value;
|
||||
|
||||
@@ -3,8 +3,7 @@ import * as GQL from "../../../core/generated-graphql";
|
||||
import { StashService } from "../../../core/StashService";
|
||||
import { ErrorUtils } from "../../../utils/errors";
|
||||
import { ToastUtils } from "../../../utils/toasts";
|
||||
import { FilterMultiSelect } from "../../select/FilterMultiSelect";
|
||||
import { FilterSelect } from "../../select/FilterSelect";
|
||||
import { FilterSelect, StudioSelect } from "../../select/FilterSelect";
|
||||
import { ValidGalleriesSelect } from "../../select/ValidGalleriesSelect";
|
||||
import { ImageUtils } from "../../../utils/image";
|
||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||
@@ -129,11 +128,12 @@ export const SceneEditPanel: React.FC<IProps> = (props: IProps) => {
|
||||
props.onDelete();
|
||||
}
|
||||
|
||||
function renderMultiSelect(type: "performers" | "tags", initialIds: string[] | undefined) {
|
||||
function renderMultiSelect(type: "performers" | "tags", initialIds: string[] = []) {
|
||||
return (
|
||||
<FilterMultiSelect
|
||||
<FilterSelect
|
||||
type={type}
|
||||
onUpdate={(items) => {
|
||||
isMulti={true}
|
||||
onSelect={(items) => {
|
||||
const ids = items.map((i) => i.id);
|
||||
switch (type) {
|
||||
case "performers": setPerformerIds(ids); break;
|
||||
@@ -352,10 +352,9 @@ export const SceneEditPanel: React.FC<IProps> = (props: IProps) => {
|
||||
|
||||
<Form.Group controlId="studio">
|
||||
<Form.Label>Studio</Form.Label>
|
||||
<FilterSelect
|
||||
type="studios"
|
||||
onSelectItem={(item) => setStudioId(item ? item.id : undefined)}
|
||||
initialId={studioId}
|
||||
<StudioSelect
|
||||
onSelect={(items) => items.length && setStudioId(items[0]?.id)}
|
||||
initialIds={studioId ? [studioId] : []}
|
||||
/>
|
||||
</Form.Group>
|
||||
|
||||
|
||||
@@ -4,8 +4,7 @@ import React, { CSSProperties, FunctionComponent, useState } from "react";
|
||||
import * as GQL from "../../../core/generated-graphql";
|
||||
import { StashService } from "../../../core/StashService";
|
||||
import { TextUtils } from "../../../utils/text";
|
||||
import { FilterMultiSelect } from "../../select/FilterMultiSelect";
|
||||
import { FilterSelect } from "../../select/FilterSelect";
|
||||
import { TagSelect } from "../../select/FilterSelect";
|
||||
import { MarkerTitleSuggest } from "../../select/MarkerTitleSuggest";
|
||||
import { WallPanel } from "../../Wall/WallPanel";
|
||||
import { SceneHelpers } from "../helpers";
|
||||
@@ -149,19 +148,18 @@ export const SceneMarkersPanel: FunctionComponent<ISceneMarkersPanelProps> = (pr
|
||||
}
|
||||
function renderPrimaryTagField(fieldProps: FieldProps<IFormFields>) {
|
||||
return (
|
||||
<FilterSelect
|
||||
type="tags"
|
||||
onSelectItem={(tag) => fieldProps.form.setFieldValue("primaryTagId", tag ? tag.id : undefined)}
|
||||
initialId={!!editingMarker ? editingMarker.primary_tag.id : undefined}
|
||||
<TagSelect
|
||||
onSelect={(tags) => fieldProps.form.setFieldValue("primaryTagId", tags[0]?.id)}
|
||||
initialIds={editingMarker ? [editingMarker.primary_tag.id] : []}
|
||||
/>
|
||||
);
|
||||
}
|
||||
function renderTagsField(fieldProps: FieldProps<IFormFields>) {
|
||||
return (
|
||||
<FilterMultiSelect
|
||||
type="tags"
|
||||
onUpdate={(tags) => fieldProps.form.setFieldValue("tagIds", tags.map((tag) => tag.id))}
|
||||
initialIds={!!editingMarker ? fieldProps.form.values.tagIds : undefined}
|
||||
<TagSelect
|
||||
isMulti={true}
|
||||
onSelect={(tags) => fieldProps.form.setFieldValue("tagIds", tags.map((tag) => tag.id))}
|
||||
initialIds={editingMarker ? fieldProps.form.values.tagIds : []}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -9,8 +9,7 @@ import _ from "lodash";
|
||||
import { ToastUtils } from "../../utils/toasts";
|
||||
import { ErrorUtils } from "../../utils/errors";
|
||||
import { Pagination } from "../list/Pagination";
|
||||
import { FilterMultiSelect } from "../select/FilterMultiSelect";
|
||||
import { FilterSelect } from "../select/FilterSelect";
|
||||
import { FilterSelect, StudioSelect } from "../select/FilterSelect";
|
||||
|
||||
class ParserResult<T> {
|
||||
public value: Maybe<T>;
|
||||
@@ -760,10 +759,11 @@ export const SceneFilenameParser: React.FC = () => {
|
||||
|
||||
function renderNewMultiSelect(type: "performers" | "tags", props : ISceneParserFieldProps, onChange : (value : any) => void) {
|
||||
return (
|
||||
<FilterMultiSelect
|
||||
<FilterSelect
|
||||
className={props.className}
|
||||
type={type}
|
||||
onUpdate={(items) => {
|
||||
isMulti={true}
|
||||
onSelect={(items) => {
|
||||
const ids = items.map((i) => i.id);
|
||||
onChange(ids);
|
||||
}}
|
||||
@@ -782,12 +782,11 @@ export const SceneFilenameParser: React.FC = () => {
|
||||
|
||||
function renderNewStudioSelect(props : ISceneParserFieldProps, onChange : (value : any) => void) {
|
||||
return (
|
||||
<FilterSelect
|
||||
type="studios"
|
||||
<StudioSelect
|
||||
noSelectionString=""
|
||||
className={props.className}
|
||||
onSelectItem={(item) => onChange(item ? item.id : undefined)}
|
||||
initialId={props.parserResult.value}
|
||||
onSelect={(items) => onChange(items[0]?.id)}
|
||||
initialIds={props.parserResult.value ? [props.parserResult.value] : []}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import _ from "lodash";
|
||||
import { Button, ButtonGroup, Form, Spinner } from 'react-bootstrap';
|
||||
import React, { useEffect, useState } from "react";
|
||||
import { FilterSelect } from "../select/FilterSelect";
|
||||
import { FilterMultiSelect } from "../select/FilterMultiSelect";
|
||||
import { FilterSelect, StudioSelect } from "../select/FilterSelect";
|
||||
import { StashService } from "../../core/StashService";
|
||||
import * as GQL from "../../core/generated-graphql";
|
||||
import { ErrorUtils } from "../../utils/errors";
|
||||
@@ -236,16 +235,17 @@ export const SceneSelectedOptions: React.FC<IListOperationProps> = (props: IList
|
||||
|
||||
function renderMultiSelect(type: "performers" | "tags", initialIds: string[] | undefined) {
|
||||
return (
|
||||
<FilterMultiSelect
|
||||
<FilterSelect
|
||||
type={type}
|
||||
onUpdate={(items) => {
|
||||
isMulti={true}
|
||||
onSelect={(items) => {
|
||||
const ids = items.map((i) => i.id);
|
||||
switch (type) {
|
||||
case "performers": setPerformerIds(ids); break;
|
||||
case "tags": setTagIds(ids); break;
|
||||
}
|
||||
}}
|
||||
initialIds={initialIds}
|
||||
initialIds={initialIds ?? []}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -268,10 +268,9 @@ export const SceneSelectedOptions: React.FC<IListOperationProps> = (props: IList
|
||||
|
||||
<Form.Group controlId="studio" className="operation-item">
|
||||
<Form.Label>Studio</Form.Label>
|
||||
<FilterSelect
|
||||
type="studios"
|
||||
onSelectItem={(item : any) => setStudioId(item ? item.id : undefined)}
|
||||
initialId={studioId}
|
||||
<StudioSelect
|
||||
onSelect={(items) => setStudioId(items[0]?.id)}
|
||||
initialIds={studioId ? [studioId] : []}
|
||||
/>
|
||||
</Form.Group>
|
||||
|
||||
|
||||
@@ -1,117 +1,146 @@
|
||||
import * as React from "react";
|
||||
import { Button } from 'react-bootstrap';
|
||||
import React, { useState } from "react";
|
||||
import Select, { ValueType } from 'react-select';
|
||||
import CreatableSelect from 'react-select/creatable';
|
||||
|
||||
import { ISelectProps, ItemPredicate, ItemRenderer, Select } from "@blueprintjs/select";
|
||||
import { ErrorUtils } from "../../utils/errors";
|
||||
import * as GQL from "../../core/generated-graphql";
|
||||
import { StashService } from "../../core/StashService";
|
||||
import { HTMLInputProps } from "../../models";
|
||||
|
||||
const InternalPerformerSelect = Select.ofType<GQL.AllPerformersForFilterAllPerformers>();
|
||||
const InternalTagSelect = Select.ofType<GQL.AllTagsForFilterAllTags>();
|
||||
const InternalStudioSelect = Select.ofType<GQL.AllStudiosForFilterAllStudios>();
|
||||
import useToast from '../Shared/Toast';
|
||||
|
||||
type ValidTypes =
|
||||
GQL.AllPerformersForFilterAllPerformers |
|
||||
GQL.AllTagsForFilterAllTags |
|
||||
GQL.AllStudiosForFilterAllStudios;
|
||||
type Option = { value:string, label:string };
|
||||
|
||||
interface IProps extends HTMLInputProps {
|
||||
type: "performers" | "studios" | "tags";
|
||||
initialId?: string;
|
||||
interface ITypeProps {
|
||||
type: 'performers' | 'studios' | 'tags';
|
||||
}
|
||||
interface IFilterProps {
|
||||
initialIds: string[];
|
||||
onSelect: (item: ValidTypes[]) => void;
|
||||
noSelectionString?: string;
|
||||
onSelectItem: (item: ValidTypes | undefined) => void;
|
||||
className?: string;
|
||||
isMulti?: boolean;
|
||||
}
|
||||
interface ISelectProps {
|
||||
className?: string;
|
||||
items: Option[];
|
||||
selectedOptions?: Option[];
|
||||
creatable?: boolean;
|
||||
onCreateOption?: (value: string) => void;
|
||||
isLoading: boolean;
|
||||
onChange: (item: ValueType<Option>) => void;
|
||||
initialIds: string[];
|
||||
noSelectionString?: string;
|
||||
isMulti?: boolean;
|
||||
}
|
||||
|
||||
function addNoneOption(items: ValidTypes[]) {
|
||||
// Add a none option to clear the gallery
|
||||
if (!items.find((item) => item.id === "0")) { items.unshift({id: "0", name: "None"}); }
|
||||
export const FilterSelect: React.FC<IFilterProps & ITypeProps> = (props) => (
|
||||
props.type === 'performers' ? <PerformerSelect {...props as IFilterProps} />
|
||||
: props.type === 'studios' ? <StudioSelect {...props as IFilterProps} />
|
||||
: <TagSelect {...props as IFilterProps} />
|
||||
);
|
||||
|
||||
export const PerformerSelect: React.FC<IFilterProps> = (props) => {
|
||||
const { data, loading } = StashService.useAllPerformersForFilter();
|
||||
|
||||
const normalizedData = data?.allPerformers ?? [];
|
||||
const items:Option[] = normalizedData.map(item => ({ value: item.id, label: item.name ?? '' }));
|
||||
|
||||
const onChange = (selectedItems:ValueType<Option>) => {
|
||||
const selectedIds = (Array.isArray(selectedItems) ? selectedItems : [selectedItems])
|
||||
.map(item => item.value);
|
||||
props.onSelect(normalizedData.filter(item => selectedIds.indexOf(item.id) !== -1));
|
||||
};
|
||||
|
||||
return <SelectComponent {...props} onChange={onChange} type="performers" isLoading={loading} items={items} />
|
||||
}
|
||||
|
||||
export const FilterSelect: React.FunctionComponent<IProps> = (props: IProps) => {
|
||||
let items: ValidTypes[];
|
||||
let InternalSelect: new (props: ISelectProps<any>) => Select<any>;
|
||||
switch (props.type) {
|
||||
case "performers": {
|
||||
const { data } = StashService.useAllPerformersForFilter();
|
||||
items = !!data && !!data.allPerformers ? data.allPerformers : [];
|
||||
addNoneOption(items);
|
||||
InternalSelect = InternalPerformerSelect;
|
||||
break;
|
||||
}
|
||||
case "studios": {
|
||||
const { data } = StashService.useAllStudiosForFilter();
|
||||
items = !!data && !!data.allStudios ? data.allStudios : [];
|
||||
addNoneOption(items);
|
||||
InternalSelect = InternalStudioSelect;
|
||||
break;
|
||||
}
|
||||
case "tags": {
|
||||
const { data } = StashService.useAllTagsForFilter();
|
||||
items = !!data && !!data.allTags ? data.allTags : [];
|
||||
InternalSelect = InternalTagSelect;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
console.error("Unhandled case in FilterSelect");
|
||||
return <>Unhandled case in FilterSelect</>;
|
||||
}
|
||||
}
|
||||
export const StudioSelect: React.FC<IFilterProps> = (props) => {
|
||||
const { data, loading } = StashService.useAllStudiosForFilter();
|
||||
|
||||
/* eslint-disable react-hooks/rules-of-hooks */
|
||||
const [selectedItem, setSelectedItem] = React.useState<ValidTypes | undefined>(undefined);
|
||||
const normalizedData = data?.allStudios ?? [];
|
||||
const items:Option[] = normalizedData.map(item => ({ value: item.id, label: item.name }));
|
||||
|
||||
React.useEffect(() => {
|
||||
if (!!items) {
|
||||
const initialItem = items.find((item) => props.initialId === item.id);
|
||||
if (!!initialItem) {
|
||||
setSelectedItem(initialItem);
|
||||
} else {
|
||||
setSelectedItem(undefined);
|
||||
}
|
||||
}
|
||||
}, [props.initialId, items]);
|
||||
/* eslint-enable */
|
||||
|
||||
const renderItem: ItemRenderer<ValidTypes> = (item, itemProps) => {
|
||||
if (!itemProps.modifiers.matchesPredicate) { return null; }
|
||||
return (
|
||||
<MenuItem
|
||||
active={itemProps.modifiers.active}
|
||||
disabled={itemProps.modifiers.disabled}
|
||||
key={item.id}
|
||||
onClick={itemProps.handleClick}
|
||||
text={item.name}
|
||||
shouldDismissPopover={false}
|
||||
/>
|
||||
);
|
||||
const onChange = (selectedItems:ValueType<Option>) => {
|
||||
const selectedIds = (Array.isArray(selectedItems) ? selectedItems : [selectedItems])
|
||||
.map(item => item.value);
|
||||
props.onSelect(normalizedData.filter(item => selectedIds.indexOf(item.id) !== -1));
|
||||
};
|
||||
|
||||
const filter: ItemPredicate<ValidTypes> = (query, item) => {
|
||||
return item.name!.toLowerCase().indexOf(query.toLowerCase()) >= 0;
|
||||
return <SelectComponent {...props} onChange={onChange} type="studios" isLoading={loading} items={items} />
|
||||
}
|
||||
|
||||
export const TagSelect: React.FC<IFilterProps> = (props) => {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [selectedIds, setSelectedIds] = useState<string[]>([]);
|
||||
const { data, loading: dataLoading } = StashService.useAllTagsForFilter();
|
||||
const createTag = StashService.useTagCreate({name: ''});
|
||||
const Toast = useToast();
|
||||
|
||||
const tags = data?.allTags ?? [];
|
||||
|
||||
const onCreate = async (tagName: string) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
const result = await createTag({
|
||||
variables: { name: tagName },
|
||||
});
|
||||
|
||||
setSelectedIds([...selectedIds, result.data.tagCreate.id]);
|
||||
props.onSelect([...tags, result.data.tagCreate].filter(item => selected.indexOf(item.id) !== -1));
|
||||
setLoading(false);
|
||||
|
||||
Toast({ content: (<span>Created tag: <b>{tagName}</b></span>) });
|
||||
} catch (e) {
|
||||
ErrorUtils.handle(e);
|
||||
}
|
||||
};
|
||||
|
||||
function onItemSelect(item: ValidTypes | undefined) {
|
||||
if (item && item.id === "0") {
|
||||
item = undefined;
|
||||
const onChange = (selectedItems:ValueType<Option>) => {
|
||||
debugger;
|
||||
const selected = (Array.isArray(selectedItems) ? selectedItems : [selectedItems])
|
||||
.map(item => item.value);
|
||||
setSelectedIds(selected);
|
||||
props.onSelect(tags.filter(item => selected.indexOf(item.id) !== -1));
|
||||
};
|
||||
|
||||
const selected = tags.filter(tag => selectedIds.indexOf(tag.id) !== -1).map(tag => ({value: tag.id, label: tag.name}));
|
||||
const items:Option[] = tags.map(item => ({ value: item.id, label: item.name }));
|
||||
return <SelectComponent {...props} onChange={onChange} creatable={true} type="tags"
|
||||
isLoading={loading || dataLoading} items={items} onCreateOption={onCreate} selectedOptions={selected} />
|
||||
}
|
||||
|
||||
const SelectComponent: React.FC<ISelectProps & ITypeProps> = ({
|
||||
type,
|
||||
initialIds,
|
||||
noSelectionString,
|
||||
onChange,
|
||||
className,
|
||||
items,
|
||||
selectedOptions,
|
||||
isLoading,
|
||||
onCreateOption,
|
||||
creatable = false,
|
||||
isMulti = false,
|
||||
}) => {
|
||||
const defaultValue = items.filter(item => initialIds?.indexOf(item.value) !== -1) ?? null;
|
||||
|
||||
const props = {
|
||||
className: className,
|
||||
options: items,
|
||||
value: selectedOptions,
|
||||
onChange: onChange,
|
||||
isMulti: isMulti,
|
||||
defaultValue: defaultValue,
|
||||
noOptionsMessage: () => (type !== 'tags' ? 'None' : null),
|
||||
placeholder: noSelectionString ?? "(No selection)"
|
||||
}
|
||||
|
||||
props.onSelectItem(item);
|
||||
setSelectedItem(item);
|
||||
}
|
||||
|
||||
const noSelection = props.noSelectionString !== undefined ? props.noSelectionString : "(No selection)"
|
||||
const buttonText = selectedItem ? selectedItem.name : noSelection;
|
||||
return (
|
||||
<InternalSelect
|
||||
items={items}
|
||||
itemRenderer={renderItem}
|
||||
itemPredicate={filter}
|
||||
noResults={<MenuItem disabled={true} text="No results." />}
|
||||
onItemSelect={onItemSelect}
|
||||
popoverProps={{position: "bottom"}}
|
||||
{...props}
|
||||
>
|
||||
<Button>{buttonText}</Button>
|
||||
</InternalSelect>
|
||||
creatable
|
||||
? <CreatableSelect {...props} isLoading={isLoading} isDisabled={isLoading} onCreateOption={onCreateOption} />
|
||||
: <Select {...props} isLoading={isLoading} />
|
||||
);
|
||||
};
|
||||
|
||||
@@ -360,21 +360,20 @@ export class StashService {
|
||||
public static useTagCreate(input: GQL.TagCreateInput) {
|
||||
return GQL.useTagCreate({
|
||||
variables: input,
|
||||
refetchQueries: ["AllTags"],
|
||||
update: () => StashService.invalidateQueries(StashService.tagMutationImpactedQueries)
|
||||
refetchQueries: ["AllTags", "AllTagsForFilter"],
|
||||
//update: () => StashService.invalidateQueries(StashService.tagMutationImpactedQueries)
|
||||
});
|
||||
}
|
||||
public static useTagUpdate(input: GQL.TagUpdateInput) {
|
||||
return GQL.useTagUpdate({
|
||||
variables: input,
|
||||
refetchQueries: ["AllTags"],
|
||||
update: () => StashService.invalidateQueries(StashService.tagMutationImpactedQueries)
|
||||
refetchQueries: ["AllTags", "AllTagsForFilter"],
|
||||
});
|
||||
}
|
||||
public static useTagDestroy(input: GQL.TagDestroyInput) {
|
||||
return GQL.useTagDestroy({
|
||||
variables: input,
|
||||
refetchQueries: ["AllTags"],
|
||||
refetchQueries: ["AllTags", "AllTagsForFilter"],
|
||||
update: () => StashService.invalidateQueries(StashService.tagMutationImpactedQueries)
|
||||
});
|
||||
}
|
||||
|
||||
@@ -517,3 +517,15 @@ span.block {
|
||||
box-shadow: 0 0 0 1px rgba(16,22,26,.4), 0 0 0 rgba(16,22,26,0), 0 0 0 rgba(16,22,26,0);
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.toast-container {
|
||||
z-index: 1031;
|
||||
position: fixed;
|
||||
top: 2rem;
|
||||
left: 45%;
|
||||
max-width: 350px;
|
||||
|
||||
.toast {
|
||||
width: 350px;
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -2,7 +2,6 @@ import { EditableText, IOptionProps } from "@blueprintjs/core";
|
||||
import { Form } from 'react-bootstrap';
|
||||
import React from "react";
|
||||
import { EditableTextUtils } from "./editabletext";
|
||||
import { FilterMultiSelect } from "../components/select/FilterMultiSelect";
|
||||
import { FilterSelect } from "../components/select/FilterSelect";
|
||||
import _ from "lodash";
|
||||
|
||||
@@ -106,8 +105,8 @@ export class TableUtils {
|
||||
<td>
|
||||
<FilterSelect
|
||||
type={options.type}
|
||||
onSelectItem={(item) => options.onChange(item ? item.id : undefined)}
|
||||
initialId={options.initialId}
|
||||
onSelect={(items) => options.onChange(items[0]?.id)}
|
||||
initialIds={options.initialId ? [options.initialId] : []}
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -125,11 +124,11 @@ export class TableUtils {
|
||||
<tr>
|
||||
<td>{options.title}</td>
|
||||
<td>
|
||||
<FilterMultiSelect
|
||||
<FilterSelect
|
||||
type={options.type}
|
||||
onUpdate={(items) => options.onChange(items.map((i) => i.id))}
|
||||
openOnKeyDown={true}
|
||||
initialIds={options.initialIds}
|
||||
isMulti={true}
|
||||
onSelect={(items) => options.onChange(items.map((i) => i.id))}
|
||||
initialIds={options.initialIds ?? []}
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
dependencies:
|
||||
"@babel/types" "^7.7.4"
|
||||
|
||||
"@babel/helper-module-imports@^7.7.4":
|
||||
"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.4":
|
||||
version "7.7.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91"
|
||||
integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==
|
||||
@@ -913,7 +913,7 @@
|
||||
dependencies:
|
||||
regenerator-runtime "^0.13.2"
|
||||
|
||||
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4":
|
||||
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4":
|
||||
version "7.7.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.7.tgz#194769ca8d6d7790ec23605af9ee3e42a0aa79cf"
|
||||
integrity sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==
|
||||
@@ -1022,6 +1022,83 @@
|
||||
resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18"
|
||||
integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==
|
||||
|
||||
"@emotion/cache@^10.0.27", "@emotion/cache@^10.0.9":
|
||||
version "10.0.27"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.27.tgz#7895db204e2c1a991ae33d51262a3a44f6737303"
|
||||
integrity sha512-Zp8BEpbMunFsTcqAK4D7YTm3MvCp1SekflSLJH8lze2fCcSZ/yMkXHo8kb3t1/1Tdd3hAqf3Fb7z9VZ+FMiC9w==
|
||||
dependencies:
|
||||
"@emotion/sheet" "0.9.4"
|
||||
"@emotion/stylis" "0.8.5"
|
||||
"@emotion/utils" "0.11.3"
|
||||
"@emotion/weak-memoize" "0.2.5"
|
||||
|
||||
"@emotion/core@^10.0.9":
|
||||
version "10.0.27"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.0.27.tgz#7c3f78be681ab2273f3bf11ca3e2edc4a9dd1fdc"
|
||||
integrity sha512-XbD5R36pVbohQMnKfajHv43g8EbN4NHdF6Zh9zg/C0nr0jqwOw3gYnC07Xj3yG43OYSRyrGsoQ5qPwc8ycvLZw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.5.5"
|
||||
"@emotion/cache" "^10.0.27"
|
||||
"@emotion/css" "^10.0.27"
|
||||
"@emotion/serialize" "^0.11.15"
|
||||
"@emotion/sheet" "0.9.4"
|
||||
"@emotion/utils" "0.11.3"
|
||||
|
||||
"@emotion/css@^10.0.27", "@emotion/css@^10.0.9":
|
||||
version "10.0.27"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c"
|
||||
integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==
|
||||
dependencies:
|
||||
"@emotion/serialize" "^0.11.15"
|
||||
"@emotion/utils" "0.11.3"
|
||||
babel-plugin-emotion "^10.0.27"
|
||||
|
||||
"@emotion/hash@0.7.4":
|
||||
version "0.7.4"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.4.tgz#f14932887422c9056b15a8d222a9074a7dfa2831"
|
||||
integrity sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==
|
||||
|
||||
"@emotion/memoize@0.7.4":
|
||||
version "0.7.4"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
|
||||
integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
|
||||
|
||||
"@emotion/serialize@^0.11.15":
|
||||
version "0.11.15"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.15.tgz#9a0f5873fb458d87d4f23e034413c12ed60a705a"
|
||||
integrity sha512-YE+qnrmGwyR+XB5j7Bi+0GT1JWsdcjM/d4POu+TXkcnrRs4RFCCsi3d/Ebf+wSStHqAlTT2+dfd+b9N9EO2KBg==
|
||||
dependencies:
|
||||
"@emotion/hash" "0.7.4"
|
||||
"@emotion/memoize" "0.7.4"
|
||||
"@emotion/unitless" "0.7.5"
|
||||
"@emotion/utils" "0.11.3"
|
||||
csstype "^2.5.7"
|
||||
|
||||
"@emotion/sheet@0.9.4":
|
||||
version "0.9.4"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5"
|
||||
integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==
|
||||
|
||||
"@emotion/stylis@0.8.5":
|
||||
version "0.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
|
||||
integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
|
||||
|
||||
"@emotion/unitless@0.7.5":
|
||||
version "0.7.5"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
|
||||
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
|
||||
|
||||
"@emotion/utils@0.11.3":
|
||||
version "0.11.3"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924"
|
||||
integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==
|
||||
|
||||
"@emotion/weak-memoize@0.2.5":
|
||||
version "0.2.5"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
|
||||
integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
|
||||
|
||||
"@fortawesome/fontawesome-common-types@^0.2.26":
|
||||
version "0.2.26"
|
||||
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.26.tgz#6e0b13a752676036f8196f8a1500d53a27b4adc1"
|
||||
@@ -1526,7 +1603,7 @@
|
||||
dependencies:
|
||||
query-string "*"
|
||||
|
||||
"@types/react-dom@16.9.4":
|
||||
"@types/react-dom@*", "@types/react-dom@16.9.4":
|
||||
version "16.9.4"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.4.tgz#0b58df09a60961dcb77f62d4f1832427513420df"
|
||||
integrity sha512-fya9xteU/n90tda0s+FtN5Ym4tbgxpq/hb/Af24dvs6uYnYn+fspaxw5USlw0R8apDNwxsqumdRoCoKitckQqw==
|
||||
@@ -1558,6 +1635,22 @@
|
||||
"@types/history" "*"
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react-select@^3.0.8":
|
||||
version "3.0.8"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-select/-/react-select-3.0.8.tgz#b824a12d438dd493c30ffff49a805f797602a837"
|
||||
integrity sha512-0763TXYZc8bTiHM+DUnWoy9Rg5mk6PxYWBrEe6Fkjgc0Kv0r1RqjZk9/BrK4wdM0RNjYjixlFPnUhOJb76sMGg==
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
"@types/react-dom" "*"
|
||||
"@types/react-transition-group" "*"
|
||||
|
||||
"@types/react-transition-group@*":
|
||||
version "4.2.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.2.3.tgz#4924133f7268694058e415bf7aea2d4c21131470"
|
||||
integrity sha512-Hk8jiuT7iLOHrcjKP/ZVSyCNXK73wJAUz60xm0mVhiRujrdiI++j4duLiL282VGxwAgxetHQFfqA29LgEeSkFA==
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react@*", "@types/react@^16.8.23", "@types/react@^16.9.11":
|
||||
version "16.9.17"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.17.tgz#58f0cc0e9ec2425d1441dd7b623421a867aa253e"
|
||||
@@ -2417,6 +2510,22 @@ babel-plugin-dynamic-import-node@2.3.0, babel-plugin-dynamic-import-node@^2.3.0:
|
||||
dependencies:
|
||||
object.assign "^4.1.0"
|
||||
|
||||
babel-plugin-emotion@^10.0.27:
|
||||
version "10.0.27"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.27.tgz#59001cf5de847c1d61f2079cd906a90a00d3184f"
|
||||
integrity sha512-SUNYcT4FqhOqvwv0z1oeYhqgheU8qrceLojuHyX17ngo7WtWqN5I9l3IGHzf21Xraj465CVzF4IvOlAF+3ed0A==
|
||||
dependencies:
|
||||
"@babel/helper-module-imports" "^7.0.0"
|
||||
"@emotion/hash" "0.7.4"
|
||||
"@emotion/memoize" "0.7.4"
|
||||
"@emotion/serialize" "^0.11.15"
|
||||
babel-plugin-macros "^2.0.0"
|
||||
babel-plugin-syntax-jsx "^6.18.0"
|
||||
convert-source-map "^1.5.0"
|
||||
escape-string-regexp "^1.0.5"
|
||||
find-root "^1.1.0"
|
||||
source-map "^0.5.7"
|
||||
|
||||
babel-plugin-istanbul@^5.1.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854"
|
||||
@@ -2443,11 +2552,25 @@ babel-plugin-macros@2.7.1:
|
||||
cosmiconfig "^6.0.0"
|
||||
resolve "^1.12.0"
|
||||
|
||||
babel-plugin-macros@^2.0.0:
|
||||
version "2.8.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138"
|
||||
integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.7.2"
|
||||
cosmiconfig "^6.0.0"
|
||||
resolve "^1.12.0"
|
||||
|
||||
babel-plugin-named-asset-import@^0.3.5:
|
||||
version "0.3.5"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.5.tgz#d3fa1a7f1f4babd4ed0785b75e2f926df0d70d0d"
|
||||
integrity sha512-sGhfINU+AuMw9oFAdIn/nD5sem3pn/WgxAfDZ//Q3CnF+5uaho7C7shh2rKLk6sKE/XkfmyibghocwKdVjLIKg==
|
||||
|
||||
babel-plugin-syntax-jsx@^6.18.0:
|
||||
version "6.18.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
|
||||
integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
|
||||
|
||||
babel-plugin-syntax-object-rest-spread@^6.8.0:
|
||||
version "6.13.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
|
||||
@@ -3392,7 +3515,7 @@ content-type@~1.0.4:
|
||||
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
|
||||
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
|
||||
|
||||
convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.7.0:
|
||||
convert-source-map@1.7.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.7.0:
|
||||
version "1.7.0"
|
||||
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
|
||||
integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
|
||||
@@ -3789,7 +3912,7 @@ cssstyle@^1.0.0, cssstyle@^1.1.1:
|
||||
dependencies:
|
||||
cssom "0.3.x"
|
||||
|
||||
csstype@^2.2.0, csstype@^2.6.7:
|
||||
csstype@^2.2.0, csstype@^2.5.7, csstype@^2.6.7:
|
||||
version "2.6.8"
|
||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431"
|
||||
integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==
|
||||
@@ -4961,6 +5084,11 @@ find-cache-dir@^3.0.0:
|
||||
make-dir "^3.0.0"
|
||||
pkg-dir "^4.1.0"
|
||||
|
||||
find-root@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
|
||||
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
|
||||
|
||||
find-up@3.0.0, find-up@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
|
||||
@@ -7663,6 +7791,11 @@ mem@^4.0.0:
|
||||
mimic-fn "^2.0.0"
|
||||
p-is-promise "^2.0.0"
|
||||
|
||||
memoize-one@^5.0.0:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.1.1.tgz#047b6e3199b508eaec03504de71229b8eb1d75c0"
|
||||
integrity sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==
|
||||
|
||||
memory-fs@^0.4.1:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
|
||||
@@ -9652,7 +9785,7 @@ prop-types-extra@^1.1.0:
|
||||
react-is "^16.3.2"
|
||||
warning "^3.0.0"
|
||||
|
||||
prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@~15.7.2:
|
||||
prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@~15.7.2:
|
||||
version "15.7.2"
|
||||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
|
||||
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
|
||||
@@ -9948,6 +10081,13 @@ react-images@0.5.19:
|
||||
react-scrolllock "^2.0.1"
|
||||
react-transition-group "2"
|
||||
|
||||
react-input-autosize@^2.2.2:
|
||||
version "2.2.2"
|
||||
resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2"
|
||||
integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==
|
||||
dependencies:
|
||||
prop-types "^15.5.8"
|
||||
|
||||
react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4:
|
||||
version "16.12.0"
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
|
||||
@@ -10108,7 +10248,21 @@ react-scrolllock@^2.0.1:
|
||||
exenv "^1.2.2"
|
||||
react-prop-toggle "^1.0.2"
|
||||
|
||||
react-transition-group@2, react-transition-group@^2.9.0:
|
||||
react-select@^3.0.8:
|
||||
version "3.0.8"
|
||||
resolved "https://registry.yarnpkg.com/react-select/-/react-select-3.0.8.tgz#06ff764e29db843bcec439ef13e196865242e0c1"
|
||||
integrity sha512-v9LpOhckLlRmXN5A6/mGGEft4FMrfaBFTGAnuPHcUgVId7Je42kTq9y0Z+Ye5z8/j0XDT3zUqza8gaRaI1PZIg==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.4.4"
|
||||
"@emotion/cache" "^10.0.9"
|
||||
"@emotion/core" "^10.0.9"
|
||||
"@emotion/css" "^10.0.9"
|
||||
memoize-one "^5.0.0"
|
||||
prop-types "^15.6.0"
|
||||
react-input-autosize "^2.2.2"
|
||||
react-transition-group "^2.2.1"
|
||||
|
||||
react-transition-group@2, react-transition-group@^2.2.1, react-transition-group@^2.9.0:
|
||||
version "2.9.0"
|
||||
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
|
||||
integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
|
||||
@@ -11036,7 +11190,7 @@ source-map@^0.4.2:
|
||||
dependencies:
|
||||
amdefine ">=0.0.4"
|
||||
|
||||
source-map@^0.5.0, source-map@^0.5.6:
|
||||
source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7:
|
||||
version "0.5.7"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
||||
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
|
||||
|
||||
Reference in New Issue
Block a user