mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
Style fixes
This commit is contained in:
@@ -80,7 +80,7 @@ export const MainNavbar: React.FC = () => {
|
|||||||
>
|
>
|
||||||
<Button className="minimal">
|
<Button className="minimal">
|
||||||
<Icon icon={i.icon} />
|
<Icon icon={i.icon} />
|
||||||
{i.text}
|
<span>{i.text}</span>
|
||||||
</Button>
|
</Button>
|
||||||
</LinkContainer>
|
</LinkContainer>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
<h4>Library</h4>
|
<h4>Library</h4>
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Group id="stashes">
|
<Form.Group id="stashes">
|
||||||
<Form.Label>Stashes</Form.Label>
|
<h6>Stashes</h6>
|
||||||
<FolderSelect
|
<FolderSelect
|
||||||
directories={stashes}
|
directories={stashes}
|
||||||
onDirectoriesChanged={onStashesChanged}
|
onDirectoriesChanged={onStashesChanged}
|
||||||
@@ -172,8 +172,9 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
<Form.Group id="database-path">
|
<Form.Group id="database-path">
|
||||||
<Form.Label>Database Path</Form.Label>
|
<h6>Database Path</h6>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
|
className="col-6"
|
||||||
defaultValue={databasePath}
|
defaultValue={databasePath}
|
||||||
onChange={(e: any) => setDatabasePath(e.target.value)}
|
onChange={(e: any) => setDatabasePath(e.target.value)}
|
||||||
/>
|
/>
|
||||||
@@ -183,8 +184,9 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
<Form.Group id="generated-path">
|
<Form.Group id="generated-path">
|
||||||
<Form.Label>Generated Path</Form.Label>
|
<h6>Generated Path</h6>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
|
className="col-6"
|
||||||
defaultValue={generatedPath}
|
defaultValue={generatedPath}
|
||||||
onChange={(e: any) => setGeneratedPath(e.target.value)}
|
onChange={(e: any) => setGeneratedPath(e.target.value)}
|
||||||
/>
|
/>
|
||||||
@@ -195,11 +197,13 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Label>Excluded Patterns</Form.Label>
|
<h6>Excluded Patterns</h6>
|
||||||
|
<Form.Group>
|
||||||
{excludes
|
{excludes
|
||||||
? excludes.map((regexp, i) => (
|
&& excludes.map((regexp, i) => (
|
||||||
<InputGroup>
|
<InputGroup>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
|
className="col-6"
|
||||||
value={regexp}
|
value={regexp}
|
||||||
onChange={(e: any) =>
|
onChange={(e: any) =>
|
||||||
excludeRegexChanged(i, e.target.value)
|
excludeRegexChanged(i, e.target.value)
|
||||||
@@ -215,13 +219,12 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
</InputGroup.Append>
|
</InputGroup.Append>
|
||||||
</InputGroup>
|
</InputGroup>
|
||||||
))
|
))
|
||||||
: ""}
|
}
|
||||||
|
</Form.Group>
|
||||||
<Button variant="danger" onClick={() => excludeAddRegex()}>
|
<Button className="minimal" onClick={() => excludeAddRegex()}>
|
||||||
<Icon icon="plus" />
|
<Icon icon="plus" />
|
||||||
</Button>
|
</Button>
|
||||||
<div>
|
<Form.Text>
|
||||||
<p>
|
|
||||||
<a
|
<a
|
||||||
href="https://github.com/stashapp/stash/wiki/Exclude-file-configuration"
|
href="https://github.com/stashapp/stash/wiki/Exclude-file-configuration"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
@@ -232,8 +235,7 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
</span>
|
</span>
|
||||||
<Icon icon="question-circle" />
|
<Icon icon="question-circle" />
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</Form.Text>
|
||||||
</div>
|
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
@@ -242,8 +244,9 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
<Form.Group>
|
<Form.Group>
|
||||||
<h4>Video</h4>
|
<h4>Video</h4>
|
||||||
<Form.Group id="transcode-size">
|
<Form.Group id="transcode-size">
|
||||||
<Form.Label>Maximum transcode size</Form.Label>
|
<h6>Maximum transcode size</h6>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
|
className="col-6"
|
||||||
as="select"
|
as="select"
|
||||||
onChange={(event: React.FormEvent<HTMLSelectElement>) =>
|
onChange={(event: React.FormEvent<HTMLSelectElement>) =>
|
||||||
setMaxTranscodeSize(translateQuality(event.currentTarget.value))
|
setMaxTranscodeSize(translateQuality(event.currentTarget.value))
|
||||||
@@ -261,8 +264,9 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
</Form.Text>
|
</Form.Text>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Form.Group id="streaming-transcode-size">
|
<Form.Group id="streaming-transcode-size">
|
||||||
<Form.Label>Maximum streaming transcode size</Form.Label>
|
<h6>Maximum streaming transcode size</h6>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
|
className="col-6"
|
||||||
as="select"
|
as="select"
|
||||||
onChange={(event: React.FormEvent<HTMLSelectElement>) =>
|
onChange={(event: React.FormEvent<HTMLSelectElement>) =>
|
||||||
setMaxStreamingTranscodeSize(
|
setMaxStreamingTranscodeSize(
|
||||||
@@ -288,8 +292,9 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
<Form.Group>
|
<Form.Group>
|
||||||
<h4>Authentication</h4>
|
<h4>Authentication</h4>
|
||||||
<Form.Group id="username">
|
<Form.Group id="username">
|
||||||
<Form.Label>Username</Form.Label>
|
<h6>Username</h6>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
|
className="col-6"
|
||||||
defaultValue={username}
|
defaultValue={username}
|
||||||
onChange={(e: React.FormEvent<HTMLInputElement>) =>
|
onChange={(e: React.FormEvent<HTMLInputElement>) =>
|
||||||
setUsername(e.currentTarget.value)
|
setUsername(e.currentTarget.value)
|
||||||
@@ -300,8 +305,9 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
</Form.Text>
|
</Form.Text>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Form.Group id="password">
|
<Form.Group id="password">
|
||||||
<Form.Label>Password</Form.Label>
|
<h6>Password</h6>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
|
className="col-6"
|
||||||
type="password"
|
type="password"
|
||||||
defaultValue={password}
|
defaultValue={password}
|
||||||
onChange={(e: React.FormEvent<HTMLInputElement>) =>
|
onChange={(e: React.FormEvent<HTMLInputElement>) =>
|
||||||
@@ -318,8 +324,9 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
|
|
||||||
<h4>Logging</h4>
|
<h4>Logging</h4>
|
||||||
<Form.Group id="log-file">
|
<Form.Group id="log-file">
|
||||||
<Form.Label>Log file</Form.Label>
|
<h6>Log file</h6>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
|
className="col-6"
|
||||||
defaultValue={logFile}
|
defaultValue={logFile}
|
||||||
onChange={(e: React.FormEvent<HTMLInputElement>) =>
|
onChange={(e: React.FormEvent<HTMLInputElement>) =>
|
||||||
setLogFile(e.currentTarget.value)
|
setLogFile(e.currentTarget.value)
|
||||||
@@ -333,6 +340,7 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
|
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="log-terminal"
|
||||||
checked={logOut}
|
checked={logOut}
|
||||||
label="Log to terminal"
|
label="Log to terminal"
|
||||||
onChange={() => setLogOut(!logOut)}
|
onChange={() => setLogOut(!logOut)}
|
||||||
@@ -344,8 +352,9 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
<Form.Group id="log-level">
|
<Form.Group id="log-level">
|
||||||
<Form.Label>Log Level</Form.Label>
|
<h6>Log Level</h6>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
|
className="col-6"
|
||||||
as="select"
|
as="select"
|
||||||
onChange={(event: React.FormEvent<HTMLSelectElement>) =>
|
onChange={(event: React.FormEvent<HTMLSelectElement>) =>
|
||||||
setLogLevel(event.currentTarget.value)
|
setLogLevel(event.currentTarget.value)
|
||||||
@@ -362,6 +371,7 @@ export const SettingsConfigurationPanel: React.FC = () => {
|
|||||||
|
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="log-http"
|
||||||
checked={logAccess}
|
checked={logAccess}
|
||||||
label="Log http access"
|
label="Log http access"
|
||||||
onChange={() => setLogAccess(!logAccess)}
|
onChange={() => setLogAccess(!logAccess)}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import { Button, Form } from "react-bootstrap";
|
import { Button, Form } from "react-bootstrap";
|
||||||
import { LoadingIndicator } from 'src/components/Shared';
|
import { DurationInput, LoadingIndicator } from 'src/components/Shared';
|
||||||
import { StashService } from "src/core/StashService";
|
import { StashService } from "src/core/StashService";
|
||||||
import { useToast } from "src/hooks";
|
import { useToast } from "src/hooks";
|
||||||
|
|
||||||
@@ -61,11 +61,13 @@ export const SettingsInterfacePanel: React.FC = () => {
|
|||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Label>Scene / Marker Wall</Form.Label>
|
<Form.Label>Scene / Marker Wall</Form.Label>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="wall-show-title"
|
||||||
checked={wallShowTitle}
|
checked={wallShowTitle}
|
||||||
label="Display title and tags"
|
label="Display title and tags"
|
||||||
onChange={() => setWallShowTitle(!wallShowTitle)}
|
onChange={() => setWallShowTitle(!wallShowTitle)}
|
||||||
/>
|
/>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="wall-sound-enabled"
|
||||||
checked={soundOnPreview}
|
checked={soundOnPreview}
|
||||||
label="Enable sound"
|
label="Enable sound"
|
||||||
onChange={() => setSoundOnPreview(!soundOnPreview)}
|
onChange={() => setSoundOnPreview(!soundOnPreview)}
|
||||||
@@ -76,8 +78,9 @@ export const SettingsInterfacePanel: React.FC = () => {
|
|||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Label>Scene List</Form.Label>
|
<h5>Scene List</h5>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="show-text-studios"
|
||||||
checked={showStudioAsText}
|
checked={showStudioAsText}
|
||||||
label="Show Studios as text"
|
label="Show Studios as text"
|
||||||
onChange={() => {
|
onChange={() => {
|
||||||
@@ -87,8 +90,9 @@ export const SettingsInterfacePanel: React.FC = () => {
|
|||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Label>Scene Player</Form.Label>
|
<h5>Scene Player</h5>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="auto-start-video"
|
||||||
checked={autostartVideo}
|
checked={autostartVideo}
|
||||||
label="Auto-start video"
|
label="Auto-start video"
|
||||||
onChange={() => {
|
onChange={() => {
|
||||||
@@ -98,27 +102,21 @@ export const SettingsInterfacePanel: React.FC = () => {
|
|||||||
|
|
||||||
<Form.Group id="max-loop-duration">
|
<Form.Group id="max-loop-duration">
|
||||||
<Form.Label>Maximum loop duration</Form.Label>
|
<Form.Label>Maximum loop duration</Form.Label>
|
||||||
<Form.Control
|
<DurationInput
|
||||||
type="number"
|
className="col-4"
|
||||||
defaultValue={maximumLoopDuration}
|
numericValue={maximumLoopDuration}
|
||||||
onChange={(event: React.FormEvent<HTMLInputElement>) =>
|
onValueChange={duration => setMaximumLoopDuration(duration)}
|
||||||
setMaximumLoopDuration(
|
|
||||||
Number.parseInt(event.currentTarget.value, 10) ?? 0
|
|
||||||
)
|
|
||||||
}
|
|
||||||
min={0}
|
|
||||||
step={1}
|
|
||||||
/>
|
/>
|
||||||
<Form.Text className="text-muted">
|
<Form.Text className="text-muted">
|
||||||
Maximum scene duration - in seconds - where scene player will loop
|
Maximum scene duration where scene player will loop the video - 0 to disable
|
||||||
the video - 0 to disable
|
|
||||||
</Form.Text>
|
</Form.Text>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Label>Custom CSS</Form.Label>
|
<h5>Custom CSS</h5>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="custom-css"
|
||||||
checked={cssEnabled}
|
checked={cssEnabled}
|
||||||
label="Custom CSS enabled"
|
label="Custom CSS enabled"
|
||||||
onChange={() => {
|
onChange={() => {
|
||||||
@@ -131,6 +129,7 @@ export const SettingsInterfacePanel: React.FC = () => {
|
|||||||
value={css}
|
value={css}
|
||||||
onChange={(e: any) => setCSS(e.target.value)}
|
onChange={(e: any) => setCSS(e.target.value)}
|
||||||
rows={16}
|
rows={16}
|
||||||
|
className="col-6"
|
||||||
></Form.Control>
|
></Form.Control>
|
||||||
<Form.Text className="text-muted">
|
<Form.Text className="text-muted">
|
||||||
Page must be reloaded for changes to take effect.
|
Page must be reloaded for changes to take effect.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { Form, Col } from "react-bootstrap";
|
import { Form } from "react-bootstrap";
|
||||||
import * as GQL from "src/core/generated-graphql";
|
import * as GQL from "src/core/generated-graphql";
|
||||||
import { StashService } from "src/core/StashService";
|
import { StashService } from "src/core/StashService";
|
||||||
|
|
||||||
@@ -37,12 +37,11 @@ const LogElement: React.FC<ILogElementProps> = ({ logEntry }) => {
|
|||||||
const level = logEntry.level.padEnd(GQL.LogLevel.Progress.length);
|
const level = logEntry.level.padEnd(GQL.LogLevel.Progress.length);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<div className="row">
|
||||||
<span>{logEntry.time}</span>
|
<span className="log-time">{logEntry.time}</span>
|
||||||
<span className={levelClass(logEntry.level)}>{level}</span>
|
<span className={`${levelClass(logEntry.level)}`}>{level}</span>
|
||||||
<span>{logEntry.message}</span>
|
<span className="col-9">{logEntry.message}</span>
|
||||||
<br />
|
</div>
|
||||||
</>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -100,11 +99,9 @@ export const SettingsLogsPanel: React.FC = () => {
|
|||||||
<>
|
<>
|
||||||
<h4>Logs</h4>
|
<h4>Logs</h4>
|
||||||
<Form.Row id="log-level">
|
<Form.Row id="log-level">
|
||||||
<Col xs={1}>
|
<Form.Label className="col-2">Log Level</Form.Label>
|
||||||
<Form.Label>Log Level</Form.Label>
|
|
||||||
</Col>
|
|
||||||
<Col xs={2}>
|
|
||||||
<Form.Control
|
<Form.Control
|
||||||
|
className="col-2"
|
||||||
as="select"
|
as="select"
|
||||||
defaultValue={logLevel}
|
defaultValue={logLevel}
|
||||||
onChange={event => setLogLevel(event.currentTarget.value)}
|
onChange={event => setLogLevel(event.currentTarget.value)}
|
||||||
@@ -115,7 +112,6 @@ export const SettingsLogsPanel: React.FC = () => {
|
|||||||
</option>
|
</option>
|
||||||
))}
|
))}
|
||||||
</Form.Control>
|
</Form.Control>
|
||||||
</Col>
|
|
||||||
</Form.Row>
|
</Form.Row>
|
||||||
<div className="logs">
|
<div className="logs">
|
||||||
{maybeRenderError}
|
{maybeRenderError}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ export const GenerateButton: React.FC = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
id="sprite-task"
|
id="sprite-task"
|
||||||
@@ -50,12 +51,15 @@ export const GenerateButton: React.FC = () => {
|
|||||||
label="Transcodes (MP4 conversions of unsupported video formats)"
|
label="Transcodes (MP4 conversions of unsupported video formats)"
|
||||||
onChange={() => setTranscodes(!transcodes)}
|
onChange={() => setTranscodes(!transcodes)}
|
||||||
/>
|
/>
|
||||||
<Button id="generate" type="submit" onClick={() => onGenerate()}>
|
</Form.Group>
|
||||||
|
<Form.Group>
|
||||||
|
<Button id="generate" variant="secondary" type="submit" onClick={() => onGenerate()}>
|
||||||
Generate
|
Generate
|
||||||
</Button>
|
</Button>
|
||||||
<Form.Text className="text-muted">
|
<Form.Text className="text-muted">
|
||||||
Generate supporting image, sprite, video, vtt and other files.
|
Generate supporting image, sprite, video, vtt and other files.
|
||||||
</Form.Text>
|
</Form.Text>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -183,20 +183,23 @@ export const SettingsTasksPanel: React.FC = () => {
|
|||||||
{renderImportAlert()}
|
{renderImportAlert()}
|
||||||
{renderCleanAlert()}
|
{renderCleanAlert()}
|
||||||
|
|
||||||
<h4>Running Jobs</h4>
|
<h5>Running Jobs</h5>
|
||||||
|
|
||||||
{renderJobStatus()}
|
{renderJobStatus()}
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<h4>Library</h4>
|
<h5>Library</h5>
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="use-file-metadata"
|
||||||
checked={useFileMetadata}
|
checked={useFileMetadata}
|
||||||
label="Set name, date, details from metadata (if present)"
|
label="Set name, date, details from metadata (if present)"
|
||||||
onChange={() => setUseFileMetadata(!useFileMetadata)}
|
onChange={() => setUseFileMetadata(!useFileMetadata)}
|
||||||
/>
|
/>
|
||||||
<Button id="scan" type="submit" onClick={() => onScan()}>
|
</Form.Group>
|
||||||
|
<Form.Group>
|
||||||
|
<Button variant="secondary" type="submit" onClick={() => onScan()}>
|
||||||
Scan
|
Scan
|
||||||
</Button>
|
</Button>
|
||||||
<Form.Text className="text-muted">
|
<Form.Text className="text-muted">
|
||||||
@@ -206,25 +209,30 @@ export const SettingsTasksPanel: React.FC = () => {
|
|||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<h4>Auto Tagging</h4>
|
<h5>Auto Tagging</h5>
|
||||||
|
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="autotag-performers"
|
||||||
checked={autoTagPerformers}
|
checked={autoTagPerformers}
|
||||||
label="Performers"
|
label="Performers"
|
||||||
onChange={() => setAutoTagPerformers(!autoTagPerformers)}
|
onChange={() => setAutoTagPerformers(!autoTagPerformers)}
|
||||||
/>
|
/>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="autotag-studios"
|
||||||
checked={autoTagStudios}
|
checked={autoTagStudios}
|
||||||
label="Studios"
|
label="Studios"
|
||||||
onChange={() => setAutoTagStudios(!autoTagStudios)}
|
onChange={() => setAutoTagStudios(!autoTagStudios)}
|
||||||
/>
|
/>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
|
id="autotag-tags"
|
||||||
checked={autoTagTags}
|
checked={autoTagTags}
|
||||||
label="Tags"
|
label="Tags"
|
||||||
onChange={() => setAutoTagTags(!autoTagTags)}
|
onChange={() => setAutoTagTags(!autoTagTags)}
|
||||||
/>
|
/>
|
||||||
<Button id="autoTag" type="submit" onClick={() => onAutoTag()}>
|
</Form.Group>
|
||||||
|
<Form.Group>
|
||||||
|
<Button variant="secondary" type="submit" onClick={() => onAutoTag()}>
|
||||||
Auto Tag
|
Auto Tag
|
||||||
</Button>
|
</Button>
|
||||||
<Form.Text className="text-muted">
|
<Form.Text className="text-muted">
|
||||||
@@ -233,14 +241,16 @@ export const SettingsTasksPanel: React.FC = () => {
|
|||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Button>
|
<Link to="/sceneFilenameParser">
|
||||||
<Link to="/sceneFilenameParser">Scene Filename Parser</Link>
|
<Button variant="secondary">
|
||||||
|
Scene Filename Parser
|
||||||
</Button>
|
</Button>
|
||||||
|
</Link>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<h4>Generated Content</h4>
|
<h5>Generated Content</h5>
|
||||||
<GenerateButton />
|
<GenerateButton />
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Button
|
<Button
|
||||||
@@ -258,10 +268,11 @@ export const SettingsTasksPanel: React.FC = () => {
|
|||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<h4>Metadata</h4>
|
<h5>Metadata</h5>
|
||||||
<Form.Group>
|
<Form.Group>
|
||||||
<Button
|
<Button
|
||||||
id="export"
|
id="export"
|
||||||
|
variant="secondary"
|
||||||
type="submit"
|
type="submit"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
StashService.queryMetadataExport().then(() => {
|
StashService.queryMetadataExport().then(() => {
|
||||||
|
|||||||
33
ui/v2.5/src/components/Settings/styles.scss
Normal file
33
ui/v2.5/src/components/Settings/styles.scss
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
.logs {
|
||||||
|
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace;
|
||||||
|
font-size: smaller;
|
||||||
|
max-height: 100vh;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding-top: 1rem;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
|
||||||
|
.debug {
|
||||||
|
color: lightgreen;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info {
|
||||||
|
color: white;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.warning {
|
||||||
|
color: orange;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
color: red;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.log-time {
|
||||||
|
margin-right: 1rem;
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@ interface IProps {
|
|||||||
numericValue: number;
|
numericValue: number;
|
||||||
onValueChange(valueAsNumber: number): void;
|
onValueChange(valueAsNumber: number): void;
|
||||||
onReset?(): void;
|
onReset?(): void;
|
||||||
|
className?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DurationInput: React.FC<IProps> = (props: IProps) => {
|
export const DurationInput: React.FC<IProps> = (props: IProps) => {
|
||||||
@@ -61,7 +62,7 @@ export const DurationInput: React.FC<IProps> = (props: IProps) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form.Group>
|
<Form.Group className={props.className}>
|
||||||
<InputGroup>
|
<InputGroup>
|
||||||
<Form.Control
|
<Form.Control
|
||||||
disabled={props.disabled}
|
disabled={props.disabled}
|
||||||
|
|||||||
@@ -62,8 +62,10 @@ export const FolderSelect: React.FC<IProps> = (props: IProps) => {
|
|||||||
)}
|
)}
|
||||||
</InputGroup.Append>
|
</InputGroup.Append>
|
||||||
</InputGroup>
|
</InputGroup>
|
||||||
|
<ul className="folder-list">
|
||||||
{selectableDirectories.map(path => {
|
{selectableDirectories.map(path => {
|
||||||
return (
|
return (
|
||||||
|
<li className="folder-item">
|
||||||
<Button
|
<Button
|
||||||
variant="link"
|
variant="link"
|
||||||
key={path}
|
key={path}
|
||||||
@@ -71,12 +73,14 @@ export const FolderSelect: React.FC<IProps> = (props: IProps) => {
|
|||||||
>
|
>
|
||||||
{path}
|
{path}
|
||||||
</Button>
|
</Button>
|
||||||
|
</li>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</Modal.Body>
|
</Modal.Body>
|
||||||
<Modal.Footer>
|
<Modal.Footer>
|
||||||
<Button onClick={() => onSelectDirectory()}>Add</Button>
|
<Button variant="success" onClick={() => onSelectDirectory()}>Add</Button>
|
||||||
</Modal.Footer>
|
</Modal.Footer>
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
@@ -99,7 +103,7 @@ export const FolderSelect: React.FC<IProps> = (props: IProps) => {
|
|||||||
})}
|
})}
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
|
|
||||||
<Button onClick={() => setIsDisplayingDialog(true)}>Add Directory</Button>
|
<Button variant="secondary" onClick={() => setIsDisplayingDialog(true)}>Add Directory</Button>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -324,9 +324,13 @@ const SelectComponent: React.FC<ISelectProps & ITypeProps> = ({
|
|||||||
}] : items;
|
}] : items;
|
||||||
|
|
||||||
const styles = {
|
const styles = {
|
||||||
option: (provided:CSSProperties) => ({
|
option: (base:CSSProperties) => ({
|
||||||
...provided,
|
...base,
|
||||||
color: "#000"
|
color: "#000"
|
||||||
|
}),
|
||||||
|
container: (base:CSSProperties, state:any) => ({
|
||||||
|
...base,
|
||||||
|
zIndex: state.isFocused ? 10 : base.zIndex
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -47,3 +47,15 @@
|
|||||||
margin-left: 0 !important;
|
margin-left: 0 !important;
|
||||||
padding: 1px 7px;
|
padding: 1px 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.folder-list {
|
||||||
|
margin-top: .5rem 0 0 0;
|
||||||
|
max-height: 30vw;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.folder-item {
|
||||||
|
button {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,9 +12,10 @@ export const StudioCard: React.FC<IProps> = ({ studio }) => {
|
|||||||
<Card className="studio-card">
|
<Card className="studio-card">
|
||||||
<Link
|
<Link
|
||||||
to={`/studios/${studio.id}`}
|
to={`/studios/${studio.id}`}
|
||||||
className="studio previewable image"
|
className="studio-image"
|
||||||
style={{ backgroundImage: `url(${studio.image_path})` }}
|
>
|
||||||
/>
|
<img alt={studio.name} src={studio.image_path ?? ''} />
|
||||||
|
</Link>
|
||||||
<div className="card-section">
|
<div className="card-section">
|
||||||
<h5 className="text-truncate">{studio.name}</h5>
|
<h5 className="text-truncate">{studio.name}</h5>
|
||||||
<span>{studio.scene_count} scenes.</span>
|
<span>{studio.scene_count} scenes.</span>
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ export const ListFilter: React.FC<IListFilterProps> = (
|
|||||||
as="select"
|
as="select"
|
||||||
onChange={onChangePageSize}
|
onChange={onChangePageSize}
|
||||||
value={props.filter.itemsPerPage.toString()}
|
value={props.filter.itemsPerPage.toString()}
|
||||||
className="filter-item"
|
className="filter-item col-1"
|
||||||
>
|
>
|
||||||
{PAGE_SIZE_OPTIONS.map(s => (
|
{PAGE_SIZE_OPTIONS.map(s => (
|
||||||
<option value={s} key={s}>{s}</option>
|
<option value={s} key={s}>{s}</option>
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ export const SceneMarkerForm: React.FC<ISceneMarkerForm> = ({ sceneID, editingMa
|
|||||||
.catch(err => Toast.error(err));
|
.catch(err => Toast.error(err));
|
||||||
}
|
}
|
||||||
const renderTitleField = (fieldProps: FieldProps<string>) => (
|
const renderTitleField = (fieldProps: FieldProps<string>) => (
|
||||||
<div className="col-6">
|
<div className="col-10">
|
||||||
<MarkerTitleSuggest
|
<MarkerTitleSuggest
|
||||||
initialMarkerTitle={fieldProps.field.value}
|
initialMarkerTitle={fieldProps.field.value}
|
||||||
onChange={(query: string) =>
|
onChange={(query: string) =>
|
||||||
@@ -75,6 +75,7 @@ export const SceneMarkerForm: React.FC<ISceneMarkerForm> = ({ sceneID, editingMa
|
|||||||
);
|
);
|
||||||
|
|
||||||
const renderSecondsField = (fieldProps: FieldProps<string>) => (
|
const renderSecondsField = (fieldProps: FieldProps<string>) => (
|
||||||
|
<div className="col-3">
|
||||||
<DurationInput
|
<DurationInput
|
||||||
onValueChange={s => fieldProps.form.setFieldValue("seconds", s)}
|
onValueChange={s => fieldProps.form.setFieldValue("seconds", s)}
|
||||||
onReset={() =>
|
onReset={() =>
|
||||||
@@ -85,6 +86,7 @@ export const SceneMarkerForm: React.FC<ISceneMarkerForm> = ({ sceneID, editingMa
|
|||||||
}
|
}
|
||||||
numericValue={Number.parseInt(fieldProps.field.value ?? '0', 10)}
|
numericValue={Number.parseInt(fieldProps.field.value ?? '0', 10)}
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
const renderPrimaryTagField = (fieldProps: FieldProps<string>) => (
|
const renderPrimaryTagField = (fieldProps: FieldProps<string>) => (
|
||||||
@@ -129,25 +131,27 @@ export const SceneMarkerForm: React.FC<ISceneMarkerForm> = ({ sceneID, editingMa
|
|||||||
<Form.Label htmlFor="title" className="col-2">
|
<Form.Label htmlFor="title" className="col-2">
|
||||||
Scene Marker Title
|
Scene Marker Title
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
<Field name="title" className="col-6">
|
<Field name="title">
|
||||||
{renderTitleField}
|
{renderTitleField}
|
||||||
</Field>
|
</Field>
|
||||||
<Form.Label htmlFor="seconds" className="col-1">Time</Form.Label>
|
|
||||||
<Field name="seconds" className="col-2">
|
|
||||||
{renderSecondsField}
|
|
||||||
</Field>
|
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Form.Group className="row">
|
<Form.Group className="row">
|
||||||
<Form.Label htmlFor="primaryTagId" className="col-2">
|
<Form.Label htmlFor="primaryTagId" className="col-2">
|
||||||
Primary Tag
|
Primary Tag
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
<div className="col-4">
|
<div className="col-6">
|
||||||
<Field name="primaryTagId">
|
<Field name="primaryTagId">
|
||||||
{renderPrimaryTagField}
|
{renderPrimaryTagField}
|
||||||
</Field>
|
</Field>
|
||||||
</div>
|
</div>
|
||||||
|
<Form.Label htmlFor="seconds" className="col-1">Time</Form.Label>
|
||||||
|
<Field name="seconds">
|
||||||
|
{renderSecondsField}
|
||||||
|
</Field>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group className="row">
|
||||||
<Form.Label htmlFor="tagIds" className="col-2">Tags</Form.Label>
|
<Form.Label htmlFor="tagIds" className="col-2">Tags</Form.Label>
|
||||||
<div className="col-4">
|
<div className="col-10">
|
||||||
<Field name="tagIds">
|
<Field name="tagIds">
|
||||||
{renderTagsField}
|
{renderTagsField}
|
||||||
</Field>
|
</Field>
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ export class ScenePlayerImpl extends React.Component<
|
|||||||
return (
|
return (
|
||||||
<ReactJWPlayer
|
<ReactJWPlayer
|
||||||
playerId={JWUtils.playerID}
|
playerId={JWUtils.playerID}
|
||||||
playerScript="http://192.168.1.65:9999/jwplayer/jwplayer.js"
|
playerScript="http://localhost:9999/jwplayer/jwplayer.js"
|
||||||
customProps={config}
|
customProps={config}
|
||||||
onReady={this.onReady}
|
onReady={this.onReady}
|
||||||
onSeeked={this.onSeeked}
|
onSeeked={this.onSeeked}
|
||||||
|
|||||||
15
ui/v2.5/src/components/styles.scss
Normal file
15
ui/v2.5/src/components/styles.scss
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
.studio-card {
|
||||||
|
padding: .5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.studio-image {
|
||||||
|
height: 150px;
|
||||||
|
line-height: 150px;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-height: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -332,37 +332,6 @@ video.preview.portrait {
|
|||||||
white-space: pre-line;
|
white-space: pre-line;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logs {
|
|
||||||
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace;
|
|
||||||
font-size: smaller;
|
|
||||||
max-height: 100vh;
|
|
||||||
overflow-y: auto;
|
|
||||||
padding-right: 10px;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
width: 120ch;
|
|
||||||
word-break: break-all;
|
|
||||||
|
|
||||||
.debug {
|
|
||||||
color: lightgreen;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info {
|
|
||||||
color: white;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.warning {
|
|
||||||
color: orange;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error {
|
|
||||||
color: red;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.studio {
|
.studio {
|
||||||
.image {
|
.image {
|
||||||
background-position: center !important;
|
background-position: center !important;
|
||||||
@@ -507,8 +476,6 @@ video.preview.portrait {
|
|||||||
|
|
||||||
/* BOOTSTRAP OVERRIDES */
|
/* BOOTSTRAP OVERRIDES */
|
||||||
.form-control {
|
.form-control {
|
||||||
width: inherit;
|
|
||||||
|
|
||||||
&-plaintext {
|
&-plaintext {
|
||||||
color: $text-color;
|
color: $text-color;
|
||||||
|
|
||||||
@@ -564,3 +531,13 @@ video.preview.portrait {
|
|||||||
.tab-content {
|
.tab-content {
|
||||||
padding-bottom: 2rem;
|
padding-bottom: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.svg-inline--fa {
|
||||||
|
margin: 0 .4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn .svg-inline--fa {
|
||||||
|
&:last-child:first-child {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -51,8 +51,8 @@ button.minimal {
|
|||||||
content: none;
|
content: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav .svg-inline--fa {
|
.nav-link {
|
||||||
margin-right: 7px;
|
color: $text-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-tabs {
|
.nav-tabs {
|
||||||
|
|||||||
Reference in New Issue
Block a user