UI Formatting Cleanup

This commit is contained in:
Qstick 2017-10-07 02:21:06 -04:00
parent b963f2aa82
commit 52e3d96f4a
110 changed files with 901 additions and 701 deletions

9
.esprintrc Normal file
View File

@ -0,0 +1,9 @@
{
"paths": [
"frontend/src/**/*.js"
],
"ignored": [
"**/node_modules/**/*"
],
"port": 5004
}

View File

@ -1,4 +1,5 @@
#addin "Cake.Npm" #addin "Cake.Npm"
#addin "Cake.Yarn"
#addin "SharpZipLib" #addin "SharpZipLib"
#addin "Cake.Compression" #addin "Cake.Compression"

View File

@ -74,6 +74,17 @@ BuildWithXbuild()
CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile CheckExitCode xbuild /p:Configuration=Release /p:Platform=x86 /t:Build /p:AllowedReferenceRelatedFileExtensions=.pdb $slnFile
} }
LintUI()
{
ProgressStart 'ESLint'
CheckExitCode yarn eslint
ProgressEnd 'ESLint'
ProgressStart 'Stylelint'
CheckExitCode yarn stylelint
ProgressEnd 'Stylelint'
}
Build() Build()
{ {
echo "##teamcity[progressStart 'Build']" echo "##teamcity[progressStart 'Build']"
@ -98,13 +109,14 @@ Build()
RunGulp() RunGulp()
{ {
echo "##teamcity[progressStart 'npm install']" ProgressStart 'npm install'
npm-cache install npm || CheckExitCode npm install --no-optional --no-bin-links yarn install
echo "##teamcity[progressFinish 'npm install']" #npm-cache install npm || CheckExitCode npm install --no-optional --no-bin-links
ProgressEnd 'npm install'
echo "##teamcity[progressStart 'Running gulp']" ProgressStart 'Running gulp'
CheckExitCode npm run build -- --production CheckExitCode npm run build -- --production
echo "##teamcity[progressFinish 'Running gulp']" ProgressEnd 'Running gulp'
} }
CreateMdbs() CreateMdbs()
@ -253,6 +265,7 @@ case "$(uname -s)" in
;; ;;
esac esac
LintUI
Build Build
RunGulp RunGulp
PackageMono PackageMono

View File

@ -11,7 +11,7 @@
"globals": { "globals": {
"expect": false, "expect": false,
"chai": false, "chai": false,
"sinon": false, "sinon": false
}, },
"parserOptions": { "parserOptions": {
@ -20,7 +20,7 @@
"ecmaFeatures": { "ecmaFeatures": {
"modules": true, "modules": true,
"impliedStrict": true "impliedStrict": true
}, }
}, },
"plugins": [ "plugins": [
@ -33,32 +33,32 @@
# ECMAScript 6 # ECMAScript 6
arrow-body-style: [0], "arrow-body-style": [0],
arrow-parens: ["error", "always"], "arrow-parens": ["error", "always"],
arrow-spacing: ["error", { "before": true, "after": true }], "arrow-spacing": ["error", { "before": true, "after": true }],
constructor-super: "error", "constructor-super": "error",
generator-star-spacing: "off", "generator-star-spacing": "off",
no-class-assign: "error", "no-class-assign": "error",
no-confusing-arrow: "error", "no-confusing-arrow": "error",
no-const-assign: "error", "no-const-assign": "error",
no-dupe-class-members: "error", "no-dupe-class-members": "error",
no-duplicate-imports: "error", "no-duplicate-imports": "error",
no-new-symbol: "error", "no-new-symbol": "error",
no-this-before-super: "error", "no-this-before-super": "error",
no-useless-escape: "error", "no-useless-escape": "error",
no-useless-computed-key: "error", "no-useless-computed-key": "error",
no-useless-constructor: "error", "no-useless-constructor": "error",
no-var: "warn", "no-var": "warn",
object-shorthand: ["error", "properties"], "object-shorthand": ["error", "properties"],
prefer-arrow-callback: "error", "prefer-arrow-callback": "error",
prefer-const: "warn", "prefer-const": "warn",
prefer-reflect: "off", "prefer-reflect": "off",
prefer-rest-params: "off", "prefer-rest-params": "off",
prefer-spread: "warn", "prefer-spread": "warn",
prefer-template: "error", "prefer-template": "error",
require-yield: "off", "require-yield": "off",
template-curly-spacing: ["error", "never"], "template-curly-spacing": ["error", "never"],
yield-star-spacing: "off", "yield-star-spacing": "off",
# Possible Errors # Possible Errors
@ -110,7 +110,7 @@
"no-div-regex": "error", "no-div-regex": "error",
"no-else-return": "error", "no-else-return": "error",
"no-empty-function": ["error", {"allow": ["arrowFunctions"]}], "no-empty-function": ["error", {"allow": ["arrowFunctions"]}],
no-empty-pattern: "error", "no-empty-pattern": "error",
"no-eval": "error", "no-eval": "error",
"no-extend-native": "error", "no-extend-native": "error",
"no-extra-bind": "error", "no-extra-bind": "error",
@ -122,158 +122,159 @@
"string": true, "string": true,
"allow": [/* "!!", "~", "*", "+" */] "allow": [/* "!!", "~", "*", "+" */]
}], }],
no-implicit-globals: "error", "no-implicit-globals": "error",
no-implied-eval: "error", "no-implied-eval": "error",
no-invalid-this: "off", "no-invalid-this": "off",
no-iterator: "error", "no-iterator": "error",
no-labels: "error", "no-labels": "error",
no-lone-blocks: "error", "no-lone-blocks": "error",
no-loop-func: "error", "no-loop-func": "error",
no-magic-numbers: ["off", {"ignoreArrayIndexes": true, "ignore": [0, 1] }], "no-magic-numbers": ["off", {"ignoreArrayIndexes": true, "ignore": [0, 1] }],
no-multi-spaces: "error", "no-multi-spaces": "error",
no-multi-str: "error", "no-multi-str": "error",
"no-native-reassign": ["error", {"exceptions": ["console"]}], "no-native-reassign": ["error", {"exceptions": ["console"]}],
no-new: "off", "no-new": "off",
no-new-func: "error", "no-new-func": "error",
no-new-wrappers: "error", "no-new-wrappers": "error",
no-octal: "error", "no-octal": "error",
no-octal-escape: "error", "no-octal-escape": "error",
no-param-reassign: "off", "no-param-reassign": "off",
no-process-env: "off", "no-process-env": "off",
no-proto: "error", "no-proto": "error",
no-redeclare: "error", "no-redeclare": "error",
no-return-assign: "warn", "no-return-assign": "warn",
no-script-url: "error", "no-script-url": "error",
no-self-assign: "error", "no-self-assign": "error",
no-self-compare: "error", "no-self-compare": "error",
no-sequences: "error", "no-sequences": "error",
no-throw-literal: "error", "no-throw-literal": "error",
no-unmodified-loop-condition: "error", "no-unmodified-loop-condition": "error",
no-unused-expressions: "error", "no-unused-expressions": "error",
no-unused-labels: "error", "no-unused-labels": "error",
no-useless-call: "error", "no-useless-call": "error",
no-useless-concat: "error", "no-useless-concat": "error",
no-void: "error", "no-void": "error",
no-warning-comments: "off", "no-warning-comments": "off",
no-with: "error", "no-with": "error",
radix: ["error", "as-needed"], "radix": ["error", "as-needed"],
vars-on-top: "off", "vars-on-top": "off",
wrap-iife: ["error", "inside"], "wrap-iife": ["error", "inside"],
yoda: "error", "yoda": "error",
# Strict Mode # Strict Mode
strict: ["error", "never"], "strict": ["error", "never"],
# Variables # Variables
init-declarations: ["error", "always"], "init-declarations": ["error", "always"],
no-catch-shadow: "error", "no-catch-shadow": "error",
no-delete-var: "error", "no-delete-var": "error",
no-label-var: "error", "no-label-var": "error",
no-restricted-globals: "off", "no-restricted-globals": "off",
no-shadow: "error", "no-shadow": "error",
no-shadow-restricted-names: "error", "no-shadow-restricted-names": "error",
no-undef: "error", "no-undef": "error",
no-undef-init: "off", "no-undef-init": "off",
no-undefined: "off", "no-undefined": "off",
no-unused-vars: ["error", { "args": "none" }], "no-unused-vars": ["error", { "args": "none" }],
no-use-before-define: "error", "no-use-before-define": "error",
# Node.js and CommonJS # Node.js and CommonJS
callback-return: "warn", "callback-return": "warn",
global-require: "error", "global-require": "error",
handle-callback-err: "warn", "handle-callback-err": "warn",
no-mixed-requires: "error", "no-mixed-requires": "error",
no-new-require: "error", "no-new-require": "error",
no-path-concat: "error", "no-path-concat": "error",
no-process-exit: "error", "no-process-exit": "error",
# Stylistic Issues # Stylistic Issues
array-bracket-spacing: ["error", "never"], "array-bracket-spacing": ["error", "never"],
block-spacing: ["error", "always"], "block-spacing": ["error", "always"],
brace-style: ["error", "1tbs", { "allowSingleLine": false }], "brace-style": ["error", "1tbs", { "allowSingleLine": false }],
camelcase: "off", "camelcase": "off",
comma-spacing: ["error", {"before": false, "after": true}], "comma-spacing": ["error", {"before": false, "after": true}],
comma-style: ["error", "last"], "comma-style": ["error", "last"],
computed-property-spacing: ["error", "never"], "computed-property-spacing": ["error", "never"],
consistent-this: ["error", "self"], "consistent-this": ["error", "self"],
eol-last: "error", "eol-last": "error",
func-names: "off", "func-names": "off",
func-style: ["error", "declaration"], "func-style": ["error", "declaration"],
indent: ["error", 2, {"SwitchCase": 1}], "indent": ["error", 2, {"SwitchCase": 1}],
key-spacing: ["error", {"beforeColon": false, "afterColon": true}], "key-spacing": ["error", {"beforeColon": false, "afterColon": true}],
keyword-spacing: ["error", {before: true, after: true}], "keyword-spacing": ["error", {before: true, after: true}],
lines-around-comment: ["error", { "beforeBlockComment": true, "afterBlockComment": false }], "lines-around-comment": ["error", { "beforeBlockComment": true, "afterBlockComment": false }],
max-depth: ["error", {"maximum": 5}], "max-depth": ["error", {"maximum": 5}],
max-nested-callbacks: ["error", 4], "max-nested-callbacks": ["error", 4],
max-params: ["error", 4], "max-params": ["error", 4],
max-statements: "off", "max-statements": "off",
max-statements-per-line: ["error", { "max": 1 }], "max-statements-per-line": ["error", { "max": 1 }],
new-cap: ["error", {"capIsNewExceptions": ["$.Deferred"]}], "new-cap": ["error", {"capIsNewExceptions": ["$.Deferred"]}],
new-parens: "error", "new-parens": "error",
newline-after-var: "off", "newline-after-var": "off",
newline-before-return: "off", "newline-before-return": "off",
newline-per-chained-call: "off", "newline-per-chained-call": "off",
no-array-constructor: "error", "no-array-constructor": "error",
no-bitwise: "error", "no-bitwise": "error",
no-continue: "error", "no-continue": "error",
no-inline-comments: "off", "no-inline-comments": "off",
no-lonely-if: "warn", "no-lonely-if": "warn",
no-mixed-spaces-and-tabs: "error", "no-mixed-spaces-and-tabs": "error",
no-multiple-empty-lines: ["error", {max: 1}], "no-multiple-empty-lines": ["error", {max: 1}],
no-negated-condition: "warn", "no-negated-condition": "warn",
no-nested-ternary: "error", "no-nested-ternary": "error",
no-new-object: "error", "no-new-object": "error",
no-plusplus: "off", "no-plusplus": "off",
no-restricted-syntax: "off", "no-restricted-syntax": "off",
no-spaced-func: "error", "no-spaced-func": "error",
no-ternary: "off", "no-ternary": "off",
no-trailing-spaces: "error", "no-trailing-spaces": "error",
no-underscore-dangle: ["error", { "allowAfterThis": true }], "no-underscore-dangle": ["error", { "allowAfterThis": true }],
no-unneeded-ternary: "error", "no-unneeded-ternary": "error",
no-whitespace-before-property: "error", "no-whitespace-before-property": "error",
object-curly-spacing: ["error", "always"], "object-curly-spacing": ["error", "always"],
one-var: ["error", "never"], "one-var": ["error", "never"],
one-var-declaration-per-line: ["error", "always"], "one-var-declaration-per-line": ["error", "always"],
operator-assignment: ["off", "never"], "operator-assignment": ["off", "never"],
operator-linebreak: ["error", "after"], "operator-linebreak": ["error", "after"],
quote-props: ["error", "as-needed"], "quote-props": ["error", "as-needed"],
quotes: ["error", "single"], "quotes": ["error", "single"],
require-jsdoc: "off", "require-jsdoc": "off",
semi: "error", "semi": "error",
semi-spacing: ["error", { "before": false, "after": true }], "semi-spacing": ["error", { "before": false, "after": true }],
sort-vars: "off", "sort-vars": "off",
space-before-blocks: ["error", "always"], "space-before-blocks": ["error", "always"],
space-before-function-paren: ["error", "never"], "space-before-function-paren": ["error", "never"],
space-in-parens: "off", "space-in-parens": "off",
space-infix-ops: "off", "space-infix-ops": "off",
space-unary-ops: "off", "space-unary-ops": "off",
spaced-comment: "error", "spaced-comment": "error",
wrap-regex: "error", "wrap-regex": "error",
# React # React
"react/jsx-boolean-value": [2, "always"], "react/jsx-boolean-value": [2, "always"],
"react/jsx-uses-vars": 2, "react/jsx-uses-vars": 2,
"react/jsx-closing-bracket-location": 2, "react/jsx-closing-bracket-location": 2,
"react/jsx-space-before-closing": 2, "react/jsx-tag-spacing": ["error"],
"react/jsx-curly-spacing": [2, "never"], "react/jsx-curly-spacing": [2, "never"],
"react/jsx-equals-spacing": [2, "never"], "react/jsx-equals-spacing": [2, "never"],
"react/jsx-indent-props": [2, 2], "react/jsx-indent-props": [2, 2],
"react/jsx-indent": [2, 2], "react/jsx-indent": [2, 2],
"react/jsx-key": 2, "react/jsx-key": 2,
"react/jsx-no-bind": [2, { allowArrowFunctions: true }], "react/jsx-no-bind": [2, { "allowArrowFunctions": true }],
"react/jsx-no-duplicate-props": [2, { "ignoreCase": true }], "react/jsx-no-duplicate-props": [2, { "ignoreCase": true }],
"react/jsx-max-props-per-line": [2, { "maximum": 2 }], "react/jsx-max-props-per-line": [2, { "maximum": 2 }],
"react/jsx-handler-names": [2, { "eventHandlerPrefix": "on", "eventHandlerPropPrefix": "on" }], "react/jsx-handler-names": [2, { "eventHandlerPrefix": "on", "eventHandlerPropPrefix": "on" }],
"react/jsx-no-undef": 2, "react/jsx-no-undef": 2,
"react/jsx-pascal-case": 2, "react/jsx-pascal-case": 2,
"react/jsx-uses-react": 2, "react/jsx-uses-react": 2,
"react/no-did-mount-set-state": 2, // Explicitly disabled in case we want to enable them again
"react/no-did-update-set-state": 2, "react/no-did-mount-set-state": 0,
"react/no-did-update-set-state": 0,
"react/no-direct-mutation-state": 2, "react/no-direct-mutation-state": 2,
"react/no-multi-comp": [2, { "ignoreStateless": true }], "react/no-multi-comp": [2, { "ignoreStateless": true }],
"react/no-unknown-property": 2, "react/no-unknown-property": 2,

View File

@ -2,6 +2,10 @@
"plugins": [ "plugins": [
"stylelint-order" "stylelint-order"
], ],
"ignoreFiles": [
"frontend/src/Styles/scaffolding.css",
"frontend/src/Content/Fonts/font-awesome.css"
],
"rules": { "rules": {
"at-rule-empty-line-before": [ "at-rule-empty-line-before": [
"always", "always",

View File

@ -3,6 +3,11 @@ const reload = require('require-nocache')(module);
module.exports = (ctx, configPath, options) => { module.exports = (ctx, configPath, options) => {
const config = { const config = {
plugins: { plugins: {
'postcss-mixins': {
mixinsDir: [
'frontend/src/Styles/Mixins'
]
},
'postcss-simple-vars': { 'postcss-simple-vars': {
variables: () => variables: () =>
ctx.options.cssVarsFiles.reduce((acc, vars) => { ctx.options.cssVarsFiles.reduce((acc, vars) => {
@ -10,11 +15,6 @@ module.exports = (ctx, configPath, options) => {
}, {}) }, {})
}, },
'postcss-nested': {}, 'postcss-nested': {},
'postcss-mixins': {
mixinsDir: [
'frontend/src/Styles/Mixins'
]
},
autoprefixer: { autoprefixer: {
browsers: [ browsers: [
'Chrome >= 30', 'Chrome >= 30',

View File

@ -142,6 +142,8 @@ class BlacklistRow extends Component {
</TableRowCell> </TableRowCell>
); );
} }
return null;
}) })
} }

View File

@ -205,6 +205,8 @@ class HistoryRow extends Component {
</TableRowCell> </TableRowCell>
); );
} }
return null;
}) })
} }

View File

@ -268,6 +268,8 @@ class QueueRow extends Component {
</TableRowCell> </TableRowCell>
); );
} }
return null;
}) })
} }

View File

@ -161,9 +161,7 @@ class AddNewArtist extends Component {
</div> </div>
} }
<div> <div />
</div>
</PageContentBodyConnector> </PageContentBodyConnector>
</PageContent> </PageContent>
); );

View File

@ -9,7 +9,7 @@
.poster { .poster {
flex: 0 0 170px; flex: 0 0 170px;
margin-right: 20px; margin-right: 20px;
height: 250px; height: 250px;
} }

View File

@ -202,7 +202,7 @@ class ImportArtistFooter extends Component {
</SpinnerButton> </SpinnerButton>
{ {
isLookingUpArtist && isLookingUpArtist &&
<LoadingIndicator <LoadingIndicator
className={styles.loading} className={styles.loading}
size={24} size={24}

View File

@ -66,7 +66,6 @@
.searchInput { .searchInput {
composes: text from 'Components/Form/TextInput.css'; composes: text from 'Components/Form/TextInput.css';
/*border-left: 0;*/
border-top-left-radius: 0; border-top-left-radius: 0;
border-bottom-left-radius: 0; border-bottom-left-radius: 0;
} }

View File

@ -116,8 +116,7 @@ class ImportArtistSelectArtist extends Component {
isPopulated, isPopulated,
error, error,
items, items,
queued, queued
onArtistSelect
} = this.props; } = this.props;
const errorMessage = error && const errorMessage = error &&

View File

@ -4,7 +4,6 @@ import React, { Component } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
import { push } from 'react-router-redux'; import { push } from 'react-router-redux';
import hasDifferentItems from 'Utilities/Object/hasDifferentItems';
import { fetchRootFolders, addRootFolder, deleteRootFolder } from 'Store/Actions/rootFolderActions'; import { fetchRootFolders, addRootFolder, deleteRootFolder } from 'Store/Actions/rootFolderActions';
import ImportArtistSelectFolder from './ImportArtistSelectFolder'; import ImportArtistSelectFolder from './ImportArtistSelectFolder';

View File

@ -62,9 +62,9 @@ AlbumStudioConnector.propTypes = {
}; };
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
mapDispatchToProps, mapDispatchToProps,
undefined, undefined,
undefined, undefined,
{ section: 'series', uiSection: 'albumStudio' } { section: 'series', uiSection: 'albumStudio' }
)(AlbumStudioConnector); )(AlbumStudioConnector);

View File

@ -10,6 +10,6 @@
.changes { .changes {
margin-top: 20px; margin-top: 20px;
padding-bottom: 5px; padding-bottom: 5px;
font-size: 18px;
border-bottom: 1px solid #e5e5e5; border-bottom: 1px solid #e5e5e5;
font-size: 18px;
} }

View File

@ -429,7 +429,7 @@ class ArtistDetails extends Component {
foreignArtistId={foreignArtistId} foreignArtistId={foreignArtistId}
links={links} links={links}
/> />
} }
kind={kinds.INVERSE} kind={kinds.INVERSE}
position={tooltipPositions.BOTTOM} position={tooltipPositions.BOTTOM}
/> />

View File

@ -2,7 +2,6 @@ import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import { kinds, sizes } from 'Helpers/Props'; import { kinds, sizes } from 'Helpers/Props';
import Label from 'Components/Label'; import Label from 'Components/Label';
import styles from './ArtistTags.css';
function ArtistTags({ tags }) { function ArtistTags({ tags }) {
return ( return (

View File

@ -78,9 +78,9 @@ ArtistEditorConnector.propTypes = {
}; };
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
mapDispatchToProps, mapDispatchToProps,
undefined, undefined,
undefined, undefined,
{ section: 'series', uiSection: 'artistEditor' } { section: 'series', uiSection: 'artistEditor' }
)(ArtistEditorConnector); )(ArtistEditorConnector);

View File

@ -51,8 +51,7 @@ class TagsModalContent extends Component {
const { const {
artistTags, artistTags,
tagList, tagList,
onModalClose, onModalClose
onApplyTagsPress
} = this.props; } = this.props;
const { const {
@ -107,55 +106,55 @@ class TagsModalContent extends Component {
<FormLabel>Result</FormLabel> <FormLabel>Result</FormLabel>
<div className={styles.result}> <div className={styles.result}>
{ {
artistTags.map((t) => { artistTags.map((t) => {
const tag = _.find(tagList, { id: t });
if (!tag) {
return null;
}
const removeTag = (applyTags === 'remove' && tags.indexOf(t) > -1) ||
(applyTags === 'replace' && tags.indexOf(t) === -1);
return (
<Label
key={tag.id}
title={removeTag ? 'Removing tag' : 'Existing tag'}
kind={removeTag ? kinds.INVERSE : kinds.INFO}
size={sizes.LARGE}
>
{tag.label}
</Label>
);
})
}
{
(applyTags === 'add' || applyTags === 'replace') &&
tags.map((t) => {
const tag = _.find(tagList, { id: t }); const tag = _.find(tagList, { id: t });
if (!tag) { if (!tag) {
return null; return null;
} }
const removeTag = (applyTags === 'remove' && tags.indexOf(t) > -1) || if (artistTags.indexOf(t) > -1) {
(applyTags === 'replace' && tags.indexOf(t) === -1); return null;
}
return ( return (
<Label <Label
key={tag.id} key={tag.id}
title={removeTag ? 'Removing tag' : 'Existing tag'} title={'Adding tag'}
kind={removeTag ? kinds.INVERSE : kinds.INFO} kind={kinds.SUCCESS}
size={sizes.LARGE} size={sizes.LARGE}
> >
{tag.label} {tag.label}
</Label> </Label>
); );
}) })
} }
{
(applyTags === 'add' || applyTags === 'replace') &&
tags.map((t) => {
const tag = _.find(tagList, { id: t });
if (!tag) {
return null;
}
if (artistTags.indexOf(t) > -1) {
return null;
}
return (
<Label
key={tag.id}
title={'Adding tag'}
kind={kinds.SUCCESS}
size={sizes.LARGE}
>
{tag.label}
</Label>
);
})
}
</div> </div>
</FormGroup> </FormGroup>
</Form> </Form>

View File

@ -1,4 +1,3 @@
import _ from 'lodash';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
@ -151,6 +150,7 @@ class ArtistIndexConnector extends Component {
} }
ArtistIndexConnector.propTypes = { ArtistIndexConnector.propTypes = {
isSmallScreen: PropTypes.bool.isRequired,
view: PropTypes.string.isRequired, view: PropTypes.string.isRequired,
scrollTop: PropTypes.number.isRequired, scrollTop: PropTypes.number.isRequired,
fetchArtist: PropTypes.func.isRequired, fetchArtist: PropTypes.func.isRequired,

View File

@ -31,22 +31,22 @@ function ArtistIndexFooter({ series }) {
<div className={styles.footer}> <div className={styles.footer}>
<div> <div>
<div className={styles.legendItem}> <div className={styles.legendItem}>
<div className={styles.continuing}></div> <div className={styles.continuing} />
<div>Continuing (All tracks downloaded)</div> <div>Continuing (All tracks downloaded)</div>
</div> </div>
<div className={styles.legendItem}> <div className={styles.legendItem}>
<div className={styles.ended}></div> <div className={styles.ended} />
<div>Ended (All tracks downloaded)</div> <div>Ended (All tracks downloaded)</div>
</div> </div>
<div className={styles.legendItem}> <div className={styles.legendItem}>
<div className={styles.missingMonitored}></div> <div className={styles.missingMonitored} />
<div>Missing Tracks (Artist monitored)</div> <div>Missing Tracks (Artist monitored)</div>
</div> </div>
<div className={styles.legendItem}> <div className={styles.legendItem}>
<div className={styles.missingUnmonitored}></div> <div className={styles.missingUnmonitored} />
<div>Missing Tracks (Artist not monitored)</div> <div>Missing Tracks (Artist not monitored)</div>
</div> </div>
</div> </div>

View File

@ -12,9 +12,6 @@ $hoverScale: 1.05;
box-shadow: 0 0 12px $black; box-shadow: 0 0 12px $black;
transition: all 200ms ease-in; transition: all 200ms ease-in;
// Transforming causes the content to shift slightly
// transform: scale($hoverScale);
.controls { .controls {
opacity: 0.9; opacity: 0.9;
transition: opacity 200ms linear 150ms; transition: opacity 200ms linear 150ms;

View File

@ -72,6 +72,8 @@ function calculateRowHeight(bannerHeight, sortKey, isSmallScreen, bannerOptions)
heights.push(19); heights.push(19);
} }
break; break;
default:
// No need to add a height of 0
} }
return heights.reduce((acc, height) => acc + height, 0); return heights.reduce((acc, height) => acc + height, 0);

View File

@ -25,9 +25,9 @@ function createMapStateToProps() {
} }
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
undefined, undefined,
undefined, undefined,
{ withRef: true }, { withRef: true },
{ section: 'series', uiSection: 'artistIndex' } { section: 'series', uiSection: 'artistIndex' }
)(ArtistIndexBanners); )(ArtistIndexBanners);

View File

@ -12,9 +12,6 @@ $hoverScale: 1.05;
box-shadow: 0 0 12px $black; box-shadow: 0 0 12px $black;
transition: all 200ms ease-in; transition: all 200ms ease-in;
// Transforming causes the content to shift slightly
// transform: scale($hoverScale);
.controls { .controls {
opacity: 0.9; opacity: 0.9;
transition: opacity 200ms linear 150ms; transition: opacity 200ms linear 150ms;

View File

@ -72,6 +72,8 @@ function calculateRowHeight(posterHeight, sortKey, isSmallScreen, posterOptions)
heights.push(19); heights.push(19);
} }
break; break;
default:
// No need to add a height of 0
} }
return heights.reduce((acc, height) => acc + height, 0); return heights.reduce((acc, height) => acc + height, 0);

View File

@ -25,9 +25,9 @@ function createMapStateToProps() {
} }
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
undefined, undefined,
undefined, undefined,
{ withRef: true }, { withRef: true },
{ section: 'series', uiSection: 'artistIndex' } { section: 'series', uiSection: 'artistIndex' }
)(ArtistIndexPosters); )(ArtistIndexPosters);

View File

@ -26,9 +26,9 @@ function createMapDispatchToProps(dispatch, props) {
} }
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
createMapDispatchToProps, createMapDispatchToProps,
undefined, undefined,
{ withRef: true }, { withRef: true },
{ section: 'series', uiSection: 'artistIndex' } { section: 'series', uiSection: 'artistIndex' }
)(ArtistIndexTable); )(ArtistIndexTable);

View File

@ -20,7 +20,8 @@ function CalendarDay(props) {
<div className={classNames( <div className={classNames(
styles.day, styles.day,
view === calendarViews.DAY && styles.isSingleDay view === calendarViews.DAY && styles.isSingleDay
)}> )}
>
{ {
view === calendarViews.MONTH && view === calendarViews.MONTH &&
<div className={classNames( <div className={classNames(

View File

@ -134,7 +134,8 @@ class CalendarDays extends Component {
<div className={classNames( <div className={classNames(
styles.days, styles.days,
styles[view] styles[view]
)}> )}
>
{ {
dates.map((date) => { dates.map((date) => {
return ( return (

View File

@ -36,7 +36,8 @@ class DayOfWeek extends Component {
styles.dayOfWeek, styles.dayOfWeek,
view === calendarViews.DAY && styles.isSingleDay, view === calendarViews.DAY && styles.isSingleDay,
highlightToday && styles.isToday highlightToday && styles.isToday
)}> )}
>
{formatedDate} {formatedDate}
</div> </div>
); );

View File

@ -1,3 +1,4 @@
/* eslint max-params: 0 */
import moment from 'moment'; import moment from 'moment';
function getStatusStyle(episodeNumber, downloading, startTime, isMonitored) { function getStatusStyle(episodeNumber, downloading, startTime, isMonitored) {

View File

@ -103,8 +103,7 @@ class CircularProgressBar extends Component {
strokeWidth, strokeWidth,
strokeDashoffset strokeDashoffset
}} }}
> />
</circle>
</svg> </svg>
{ {

View File

@ -366,7 +366,7 @@ class EnhancedSelectInput extends Component {
} }
</ModalBody> </ModalBody>
</Modal> </Modal>
} }
</div> </div>
); );
} }

View File

@ -1,7 +1,6 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import { icons, inputTypes } from 'Helpers/Props'; import { inputTypes } from 'Helpers/Props';
import Icon from 'Components/Icon';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import CaptchaInputConnector from './CaptchaInputConnector'; import CaptchaInputConnector from './CaptchaInputConnector';
import CheckInput from './CheckInput'; import CheckInput from './CheckInput';
@ -85,7 +84,7 @@ function FormInputGroup(props) {
errors, errors,
warnings, warnings,
...otherProps ...otherProps
} = props; } = props;
const InputComponent = getComponent(type); const InputComponent = getComponent(type);
const checkInput = type === inputTypes.CHECK; const checkInput = type === inputTypes.CHECK;

View File

@ -23,7 +23,8 @@ function FormInputHelpText(props) {
isError && styles.isError, isError && styles.isError,
isWarning && styles.isWarning, isWarning && styles.isWarning,
isCheckInput && styles.isCheckInput isCheckInput && styles.isCheckInput
)}> )}
>
{text} {text}
{ {

View File

@ -98,8 +98,13 @@ RootFolderSelectInput.propTypes = {
values: PropTypes.arrayOf(PropTypes.object).isRequired, values: PropTypes.arrayOf(PropTypes.object).isRequired,
isSaving: PropTypes.bool.isRequired, isSaving: PropTypes.bool.isRequired,
saveError: PropTypes.object, saveError: PropTypes.object,
includeNoChange: PropTypes.bool.isRequired,
onChange: PropTypes.func.isRequired, onChange: PropTypes.func.isRequired,
onNewRootFolderSelect: PropTypes.func.isRequired onNewRootFolderSelect: PropTypes.func.isRequired
}; };
RootFolderSelectInput.defaultProps = {
includeNoChange: false
};
export default RootFolderSelectInput; export default RootFolderSelectInput;

View File

@ -21,7 +21,8 @@ function RootFolderSelectInputOption(props) {
<div className={classNames( <div className={classNames(
styles.optionText, styles.optionText,
isMobile && styles.isMobile isMobile && styles.isMobile
)}> )}
>
<div>{value}</div> <div>{value}</div>
{ {

View File

@ -18,8 +18,8 @@ function RootFolderSelectInputSelectedValue(props) {
{...otherProps} {...otherProps}
> >
<div className={styles.path}> <div className={styles.path}>
{value {value}
}</div> </div>
{ {
freeSpace != null && includeFreeSpace && freeSpace != null && includeFreeSpace &&

View File

@ -24,8 +24,7 @@ function Icon(props) {
style={{ style={{
fontSize: `${size}px` fontSize: `${size}px`
}} }}
> />
</i>
); );
} }

View File

@ -83,7 +83,6 @@ class ClipboardButton extends Component {
...otherProps ...otherProps
} = this.props; } = this.props;
const { const {
showSuccess, showSuccess,
showError showError

View File

@ -10,7 +10,6 @@
cursor: pointer; cursor: pointer;
&:global(.isDisabled) { &:global(.isDisabled) {
/*color: $disabledColor;*/
pointer-events: none; pointer-events: none;
} }
} }

View File

@ -28,24 +28,8 @@
position: absolute; position: absolute;
border: 2px solid #3a3f51; border: 2px solid #3a3f51;
border-radius: 100%; border-radius: 100%;
animation-fill-mode: both;
animation: rippleContainer 1.25s 0s infinite cubic-bezier(0.21, 0.53, 0.56, 0.8); animation: rippleContainer 1.25s 0s infinite cubic-bezier(0.21, 0.53, 0.56, 0.8);
} animation-fill-mode: both;
@-webkit-keyframes rippleContainer {
0% {
opacity: 1;
transform: scale(0.1);
}
70% {
opacity: 0.7;
transform: scale(1);
}
100% {
opacity: 0;
}
} }
@keyframes rippleContainer { @keyframes rippleContainer {

View File

@ -1,35 +1,29 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React from 'react';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import Menu from 'Components/Menu/Menu'; import Menu from 'Components/Menu/Menu';
import ToolbarMenuButton from 'Components/Menu/ToolbarMenuButton'; import ToolbarMenuButton from 'Components/Menu/ToolbarMenuButton';
import styles from './FilterMenu.css'; import styles from './FilterMenu.css';
class FilterMenu extends Component { function FilterMenu(props) {
const {
className,
children,
...otherProps
} = props;
// return (
// Render <Menu
className={className}
render() { {...otherProps}
const { >
className, <ToolbarMenuButton
children, iconName={icons.FILTER}
...otherProps text="Filter"
} = this.props; />
{children}
return ( </Menu>
<Menu );
className={className}
{...otherProps}
>
<ToolbarMenuButton
iconName={icons.FILTER}
text="Filter"
/>
{children}
</Menu>
);
}
} }
FilterMenu.propTypes = { FilterMenu.propTypes = {

View File

@ -1,34 +1,28 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React from 'react';
import { icons } from 'Helpers/Props'; import { icons } from 'Helpers/Props';
import Menu from 'Components/Menu/Menu'; import Menu from 'Components/Menu/Menu';
import ToolbarMenuButton from 'Components/Menu/ToolbarMenuButton'; import ToolbarMenuButton from 'Components/Menu/ToolbarMenuButton';
class SortMenu extends Component { function SortMenu(props) {
const {
className,
children,
...otherProps
} = props;
// return (
// Render <Menu
className={className}
render() { {...otherProps}
const { >
className, <ToolbarMenuButton
children, iconName={icons.SORT}
...otherProps text="Sort"
} = this.props; />
{children}
return ( </Menu>
<Menu );
className={className}
{...otherProps}
>
<ToolbarMenuButton
iconName={icons.SORT}
text="Sort"
/>
{children}
</Menu>
);
}
} }
SortMenu.propTypes = { SortMenu.propTypes = {

View File

@ -18,7 +18,7 @@ function ViewMenu(props) {
iconName={icons.VIEW} iconName={icons.VIEW}
text="View" text="View"
/> />
{children} {children}
</Menu> </Menu>
); );
} }

View File

@ -40,7 +40,8 @@ PageContentBody.propTypes = {
className: PropTypes.string, className: PropTypes.string,
innerClassName: PropTypes.string, innerClassName: PropTypes.string,
isSmallScreen: PropTypes.bool.isRequired, isSmallScreen: PropTypes.bool.isRequired,
children: PropTypes.node.isRequired children: PropTypes.node.isRequired,
dispatch: PropTypes.func
}; };
PageContentBody.defaultProps = { PageContentBody.defaultProps = {

View File

@ -1,7 +1,7 @@
.jumpBar { .jumpBar {
display: flex; display: flex;
align-items: stretch;
align-content: stretch; align-content: stretch;
align-items: stretch;
align-self: stretch; align-self: stretch;
justify-content: center; justify-content: center;
flex: 0 0 30px; flex: 0 0 30px;

View File

@ -43,7 +43,8 @@ function Message(props) {
<div className={classNames( <div className={classNames(
styles.message, styles.message,
styles[type] styles[type]
)}> )}
>
<div className={styles.iconContainer}> <div className={styles.iconContainer}>
<Icon <Icon
name={getIconName(name)} name={getIconName(name)}

View File

@ -148,7 +148,8 @@ class PageToolbarSection extends Component {
<div className={classNames( <div className={classNames(
styles.section, styles.section,
styles[alignContent] styles[alignContent]
)}> )}
>
{ {
buttons.map((button) => { buttons.map((button) => {
return button; return button;

View File

@ -8,7 +8,7 @@ class PageToolbarSeparator extends Component {
render() { render() {
return ( return (
<div className={styles.separator}></div> <div className={styles.separator} />
); );
} }

View File

@ -55,22 +55,22 @@ function ProgressBar(props) {
aria-valuemax="100" aria-valuemax="100"
style={{ width: progressPercent }} style={{ width: progressPercent }}
/> />
{ {
showText && showText &&
<div
className={styles.frontTextContainer}
style={{ width: progressPercent }}
>
<div <div
className={styles.frontTextContainer} className={styles.frontText}
style={{ width: progressPercent }} style={{ width: actualWidth }}
> >
<div <div>
className={styles.frontText} {progressText}
style={{ width: actualWidth }}
>
<div>
{progressText}
</div>
</div> </div>
</div> </div>
} </div>
}
</div> </div>
); );
} }

View File

@ -1,4 +1,5 @@
.scroller { .scroller {
/* Placeholder */
} }
.thumb { .thumb {

View File

@ -5,7 +5,7 @@ import Link from 'Components/Link/Link';
import Icon from 'Components/Icon'; import Icon from 'Components/Icon';
import styles from './TableHeaderCell.css'; import styles from './TableHeaderCell.css';
class VirtualTableHeaderCell extends Component { class TableHeaderCell extends Component {
// //
// Listeners // Listeners
@ -43,8 +43,8 @@ class VirtualTableHeaderCell extends Component {
const isSorting = isSortable && sortKey === name; const isSorting = isSortable && sortKey === name;
const sortIcon = sortDirection === sortDirections.ASCENDING ? const sortIcon = sortDirection === sortDirections.ASCENDING ?
icons.SORT_ASCENDING : icons.SORT_ASCENDING :
icons.SORT_DESCENDING; icons.SORT_DESCENDING;
return ( return (
isSortable ? isSortable ?
@ -72,7 +72,7 @@ class VirtualTableHeaderCell extends Component {
} }
} }
VirtualTableHeaderCell.propTypes = { TableHeaderCell.propTypes = {
className: PropTypes.string, className: PropTypes.string,
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
label: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), label: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
@ -86,9 +86,9 @@ VirtualTableHeaderCell.propTypes = {
onSortPress: PropTypes.func onSortPress: PropTypes.func
}; };
VirtualTableHeaderCell.defaultProps = { TableHeaderCell.defaultProps = {
className: styles.headerCell, className: styles.headerCell,
isSortable: false isSortable: false
}; };
export default VirtualTableHeaderCell; export default TableHeaderCell;

View File

@ -142,9 +142,9 @@ class VirtualTable extends Component {
{...otherProps} {...otherProps}
/> />
</Scroller> </Scroller>
); );
}
} }
}
</WindowScroller> </WindowScroller>
</Measure> </Measure>
); );

View File

@ -58,8 +58,8 @@ class VirtualTableHeaderCell extends Component {
const isSorting = isSortable && sortKey === name; const isSorting = isSortable && sortKey === name;
const sortIcon = sortDirection === sortDirections.ASCENDING ? const sortIcon = sortDirection === sortDirections.ASCENDING ?
icons.SORT_ASCENDING : icons.SORT_ASCENDING :
icons.SORT_DESCENDING; icons.SORT_DESCENDING;
return ( return (
isSortable ? isSortable ?

View File

@ -1,3 +1,5 @@
/* stylelint-disable */
/*! /*!
* Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
@ -2335,3 +2337,5 @@
overflow: visible; overflow: visible;
clip: auto; clip: auto;
} }
/* stylelint-enable */

View File

@ -82,9 +82,9 @@ InteractiveEpisodeSearchConnector.propTypes = {
}; };
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
mapDispatchToProps, mapDispatchToProps,
undefined, undefined,
undefined, undefined,
{ section: 'releases' } { section: 'releases' }
)(InteractiveEpisodeSearchConnector); )(InteractiveEpisodeSearchConnector);

View File

@ -66,15 +66,15 @@ class SelectArtistModalContent extends Component {
{ {
items.map((item) => { items.map((item) => {
return item.artistName.toLowerCase().includes(filter) ? return item.artistName.toLowerCase().includes(filter) ?
( (
<SelectArtistRow <SelectArtistRow
key={item.id} key={item.id}
id={item.id} id={item.id}
artistName={item.artistName} artistName={item.artistName}
onArtistSelect={onArtistSelect} onArtistSelect={onArtistSelect}
/> />
) : ) :
null; null;
}) })
} }
</Scroller> </Scroller>

View File

@ -147,9 +147,9 @@ InteractiveImportModalContentConnector.propTypes = {
}; };
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
mapDispatchToProps, mapDispatchToProps,
undefined, undefined,
undefined, undefined,
{ section: 'interactiveImport' } { section: 'interactiveImport' }
)(InteractiveImportModalContentConnector); )(InteractiveImportModalContentConnector);

View File

@ -178,7 +178,7 @@ class InteractiveImportRow extends Component {
const artistName = artist ? artist.artistName : ''; const artistName = artist ? artist.artistName : '';
const albumTitle = album ? album.title : ''; const albumTitle = album ? album.title : '';
const trackNumbers = tracks.map((track) => track.trackNumber) const trackNumbers = tracks.map((track) => track.trackNumber)
.join(', '); .join(', ');
const showArtistPlaceholder = isSelected && !artist; const showArtistPlaceholder = isSelected && !artist;
const showAlbumNumberPlaceholder = isSelected && !!artist && !album; const showAlbumNumberPlaceholder = isSelected && !!artist && !album;

View File

@ -3,7 +3,7 @@ import styles from './InteractiveImportRowCellPlaceholder.css';
function InteractiveImportRowCellPlaceholder() { function InteractiveImportRowCellPlaceholder() {
return ( return (
<span className={styles.placeholder}></span> <span className={styles.placeholder} />
); );
} }

View File

@ -50,7 +50,7 @@ class SelectLanguageModalContentConnector extends Component {
onLanguageSelect = ({ value }) => { onLanguageSelect = ({ value }) => {
const languageId = parseInt(value); const languageId = parseInt(value);
const language = _.find(this.props.items, const language = _.find(this.props.items,
(item) => item.language.id === languageId).language; (item) => item.language.id === languageId).language;
this.props.updateInteractiveImportItem({ this.props.updateInteractiveImportItem({
id: this.props.id, id: this.props.id,

View File

@ -49,7 +49,7 @@ class SelectQualityModalContentConnector extends Component {
onQualitySelect = ({ qualityId, proper, real }) => { onQualitySelect = ({ qualityId, proper, real }) => {
const quality = _.find(this.props.items, const quality = _.find(this.props.items,
(item) => item.quality.id === qualityId).quality; (item) => item.quality.id === qualityId).quality;
const revision = { const revision = {
version: proper ? 2 : 1, version: proper ? 2 : 1,

View File

@ -46,7 +46,7 @@ class AddDownloadClientModalContent extends Component {
} }
{ {
!isFetching && !error && isPopulated && !error &&
<div> <div>
<Alert kind={kinds.INFO}> <Alert kind={kinds.INFO}>

View File

@ -84,9 +84,9 @@ DownloadClientOptionsConnector.propTypes = {
}; };
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
mapDispatchToProps, mapDispatchToProps,
undefined, undefined,
{ withRef: true }, { withRef: true },
{ section: 'downloadClientOptions' } { section: 'downloadClientOptions' }
)(DownloadClientOptionsConnector); )(DownloadClientOptionsConnector);

View File

@ -109,9 +109,9 @@ GeneralSettingsConnector.propTypes = {
}; };
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
mapDispatchToProps, mapDispatchToProps,
undefined, undefined,
undefined, undefined,
{ section: 'general' } { section: 'general' }
)(GeneralSettingsConnector); )(GeneralSettingsConnector);

View File

@ -84,9 +84,9 @@ IndexerOptionsConnector.propTypes = {
}; };
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
mapDispatchToProps, mapDispatchToProps,
undefined, undefined,
{ withRef: true }, { withRef: true },
{ section: 'indexerOptions' } { section: 'indexerOptions' }
)(IndexerOptionsConnector); )(IndexerOptionsConnector);

View File

@ -83,9 +83,9 @@ MediaManagementConnector.propTypes = {
}; };
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
mapDispatchToProps, mapDispatchToProps,
undefined, undefined,
undefined, undefined,
{ section: 'mediaManagement' } { section: 'mediaManagement' }
)(MediaManagementConnector); )(MediaManagementConnector);

View File

@ -94,9 +94,9 @@ NamingConnector.propTypes = {
}; };
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
mapDispatchToProps, mapDispatchToProps,
undefined, undefined,
undefined, undefined,
{ section: 'naming' } { section: 'naming' }
)(NamingConnector); )(NamingConnector);

View File

@ -168,21 +168,21 @@ class NamingModal extends Component {
<FieldSet legend="File Names"> <FieldSet legend="File Names">
<div className={styles.groups}> <div className={styles.groups}>
{ {
fileNameTokens.map(({ token, example }) => { fileNameTokens.map(({ token, example }) => {
return ( return (
<NamingOption <NamingOption
key={token} key={token}
name={name} name={name}
value={value} value={value}
token={token} token={token}
example={example} example={example}
isFullFilename={true} isFullFilename={true}
tokenCase={this.state.case} tokenCase={this.state.case}
size={sizes.LARGE} size={sizes.LARGE}
onInputChange={onInputChange} onInputChange={onInputChange}
/> />
); );
} }
) )
} }
</div> </div>
@ -192,19 +192,19 @@ class NamingModal extends Component {
<FieldSet legend="Artist"> <FieldSet legend="Artist">
<div className={styles.groups}> <div className={styles.groups}>
{ {
artistTokens.map(({ token, example }) => { artistTokens.map(({ token, example }) => {
return ( return (
<NamingOption <NamingOption
key={token} key={token}
name={name} name={name}
value={value} value={value}
token={token} token={token}
example={example} example={example}
tokenCase={this.state.case} tokenCase={this.state.case}
onInputChange={onInputChange} onInputChange={onInputChange}
/> />
); );
} }
) )
} }
</div> </div>
@ -215,7 +215,7 @@ class NamingModal extends Component {
<div> <div>
<FieldSet legend="Album"> <FieldSet legend="Album">
<div className={styles.groups}> <div className={styles.groups}>
{ {
albumTokens.map(({ token, example }) => { albumTokens.map(({ token, example }) => {
return ( return (
<NamingOption <NamingOption
@ -229,14 +229,14 @@ class NamingModal extends Component {
/> />
); );
} }
) )
} }
</div> </div>
</FieldSet> </FieldSet>
<FieldSet legend="Release Date"> <FieldSet legend="Release Date">
<div className={styles.groups}> <div className={styles.groups}>
{ {
releaseDateTokens.map(({ token, example }) => { releaseDateTokens.map(({ token, example }) => {
return ( return (
<NamingOption <NamingOption
@ -250,8 +250,8 @@ class NamingModal extends Component {
/> />
); );
} }
) )
} }
</div> </div>
</FieldSet> </FieldSet>
</div> </div>
@ -263,19 +263,19 @@ class NamingModal extends Component {
<FieldSet legend="Track"> <FieldSet legend="Track">
<div className={styles.groups}> <div className={styles.groups}>
{ {
trackTokens.map(({ token, example }) => { trackTokens.map(({ token, example }) => {
return ( return (
<NamingOption <NamingOption
key={token} key={token}
name={name} name={name}
value={value} value={value}
token={token} token={token}
example={example} example={example}
tokenCase={this.state.case} tokenCase={this.state.case}
onInputChange={onInputChange} onInputChange={onInputChange}
/> />
); );
} }
) )
} }
</div> </div>
@ -290,19 +290,19 @@ class NamingModal extends Component {
<FieldSet legend="Track Title"> <FieldSet legend="Track Title">
<div className={styles.groups}> <div className={styles.groups}>
{ {
trackTitleTokens.map(({ token, example }) => { trackTitleTokens.map(({ token, example }) => {
return ( return (
<NamingOption <NamingOption
key={token} key={token}
name={name} name={name}
value={value} value={value}
token={token} token={token}
example={example} example={example}
tokenCase={this.state.case} tokenCase={this.state.case}
onInputChange={onInputChange} onInputChange={onInputChange}
/> />
); );
} }
) )
} }
</div> </div>
@ -311,19 +311,19 @@ class NamingModal extends Component {
<FieldSet legend="Quality"> <FieldSet legend="Quality">
<div className={styles.groups}> <div className={styles.groups}>
{ {
qualityTokens.map(({ token, example }) => { qualityTokens.map(({ token, example }) => {
return ( return (
<NamingOption <NamingOption
key={token} key={token}
name={name} name={name}
value={value} value={value}
token={token} token={token}
example={example} example={example}
tokenCase={this.state.case} tokenCase={this.state.case}
onInputChange={onInputChange} onInputChange={onInputChange}
/> />
); );
} }
) )
} }
</div> </div>
@ -332,19 +332,19 @@ class NamingModal extends Component {
<FieldSet legend="Media Info"> <FieldSet legend="Media Info">
<div className={styles.groups}> <div className={styles.groups}>
{ {
mediaInfoTokens.map(({ token, example }) => { mediaInfoTokens.map(({ token, example }) => {
return ( return (
<NamingOption <NamingOption
key={token} key={token}
name={name} name={name}
value={value} value={value}
token={token} token={token}
example={example} example={example}
tokenCase={this.state.case} tokenCase={this.state.case}
onInputChange={onInputChange} onInputChange={onInputChange}
/> />
); );
} }
) )
} }
</div> </div>
@ -353,19 +353,19 @@ class NamingModal extends Component {
<FieldSet legend="Release Group"> <FieldSet legend="Release Group">
<div className={styles.groups}> <div className={styles.groups}>
{ {
releaseGroupTokens.map(({ token, example }) => { releaseGroupTokens.map(({ token, example }) => {
return ( return (
<NamingOption <NamingOption
key={token} key={token}
name={name} name={name}
value={value} value={value}
token={token} token={token}
example={example} example={example}
tokenCase={this.state.case} tokenCase={this.state.case}
onInputChange={onInputChange} onInputChange={onInputChange}
/> />
); );
} }
) )
} }
</div> </div>
@ -374,20 +374,20 @@ class NamingModal extends Component {
<FieldSet legend="Original"> <FieldSet legend="Original">
<div className={styles.groups}> <div className={styles.groups}>
{ {
originalTokens.map(({ token, example }) => { originalTokens.map(({ token, example }) => {
return ( return (
<NamingOption <NamingOption
key={token} key={token}
name={name} name={name}
value={value} value={value}
token={token} token={token}
example={example} example={example}
tokenCase={this.state.case} tokenCase={this.state.case}
size={sizes.LARGE} size={sizes.LARGE}
onInputChange={onInputChange} onInputChange={onInputChange}
/> />
); );
} }
) )
} }
</div> </div>

View File

@ -1,6 +1,6 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import { inputTypes, kinds } from 'Helpers/Props'; import { inputTypes } from 'Helpers/Props';
import Button from 'Components/Link/Button'; import Button from 'Components/Link/Button';
import SpinnerErrorButton from 'Components/Link/SpinnerErrorButton'; import SpinnerErrorButton from 'Components/Link/SpinnerErrorButton';
import ModalContent from 'Components/Modal/ModalContent'; import ModalContent from 'Components/Modal/ModalContent';

View File

@ -42,7 +42,7 @@ class AddNotificationModalContent extends Component {
} }
{ {
!isFetching && !error && !isPopulated && !error &&
<div> <div>
<div className={styles.notifications}> <div className={styles.notifications}>
{ {

View File

@ -1,4 +1,3 @@
import _ from 'lodash';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';

View File

@ -1,6 +1,6 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import { kinds, sizes } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import Button from 'Components/Link/Button'; import Button from 'Components/Link/Button';
import Modal from 'Components/Modal/Modal'; import Modal from 'Components/Modal/Modal';
import ModalContent from 'Components/Modal/ModalContent'; import ModalContent from 'Components/Modal/ModalContent';
@ -11,7 +11,6 @@ import ModalFooter from 'Components/Modal/ModalFooter';
function PendingChangesModal(props) { function PendingChangesModal(props) {
const { const {
isOpen, isOpen,
size,
onConfirm, onConfirm,
onCancel onCancel
} = props; } = props;
@ -52,7 +51,6 @@ PendingChangesModal.propTypes = {
className: PropTypes.string, className: PropTypes.string,
isOpen: PropTypes.bool.isRequired, isOpen: PropTypes.bool.isRequired,
kind: PropTypes.oneOf(kinds.all), kind: PropTypes.oneOf(kinds.all),
size: PropTypes.oneOf(sizes.all),
onConfirm: PropTypes.func.isRequired, onConfirm: PropTypes.func.isRequired,
onCancel: PropTypes.func.isRequired onCancel: PropTypes.func.isRequired
}; };

View File

@ -78,7 +78,6 @@ class DelayProfile extends Component {
preferredProtocol, preferredProtocol,
usenetDelay, usenetDelay,
torrentDelay, torrentDelay,
order,
tags, tags,
tagList, tagList,
isDragging, isDragging,
@ -158,7 +157,6 @@ DelayProfile.propTypes = {
preferredProtocol: PropTypes.string.isRequired, preferredProtocol: PropTypes.string.isRequired,
usenetDelay: PropTypes.number.isRequired, usenetDelay: PropTypes.number.isRequired,
torrentDelay: PropTypes.number.isRequired, torrentDelay: PropTypes.number.isRequired,
order: PropTypes.number.isRequired,
tags: PropTypes.arrayOf(PropTypes.number).isRequired, tags: PropTypes.arrayOf(PropTypes.number).isRequired,
tagList: PropTypes.arrayOf(PropTypes.object).isRequired, tagList: PropTypes.arrayOf(PropTypes.object).isRequired,
isDragging: PropTypes.bool.isRequired, isDragging: PropTypes.bool.isRequired,

View File

@ -58,7 +58,7 @@ class QualityProfileItem extends Component {
name={icons.REORDER} name={icons.REORDER}
/> />
</div> </div>
) )
} }
</div> </div>
); );

View File

@ -74,9 +74,9 @@ UISettingsConnector.propTypes = {
}; };
export default connectSection( export default connectSection(
createMapStateToProps, createMapStateToProps,
mapDispatchToProps, mapDispatchToProps,
undefined, undefined,
undefined, undefined,
{ section: 'ui' } { section: 'ui' }
)(UISettingsConnector); )(UISettingsConnector);

View File

@ -1,7 +1,7 @@
if (window.Sonarr.analytics) { if (window.Sonarr.analytics) {
var d = document; const d = document;
var g = d.createElement('script'); const g = d.createElement('script');
var s = d.getElementsByTagName('script')[0]; const s = d.getElementsByTagName('script')[0];
g.type = 'text/javascript'; g.type = 'text/javascript';
g.async = true; g.async = true;
g.defer = true; g.defer = true;

View File

@ -3,6 +3,8 @@ import ajax from 'jQuery/jquery.ajax';
ajax($); ajax($);
const jquery = $;
window.$ = $; window.$ = $;
window.jQuery = $; window.jQuery = $;
export default $;
export default jquery;

View File

@ -12,8 +12,8 @@ function createSetServerSideCollectionSortHandler(section, getFromState, fetchHa
if (!sortDirection) { if (!sortDirection) {
if (payload.sortKey === sectionState.sortKey) { if (payload.sortKey === sectionState.sortKey) {
sortDirection = sectionState.sortDirection === sortDirections.ASCENDING ? sortDirection = sectionState.sortDirection === sortDirections.ASCENDING ?
sortDirections.DESCENDING : sortDirections.DESCENDING :
sortDirections.ASCENDING; sortDirections.ASCENDING;
} else { } else {
sortDirection = sectionState.sortDirection; sortDirection = sectionState.sortDirection;
} }

View File

@ -12,13 +12,15 @@ const section = 'series';
const artistActionHandlers = { const artistActionHandlers = {
[types.FETCH_ARTIST]: createFetchHandler(section, '/artist'), [types.FETCH_ARTIST]: createFetchHandler(section, '/artist'),
[types.SAVE_ARTIST]: createSaveProviderHandler(section, [types.SAVE_ARTIST]: createSaveProviderHandler(
'/artist', section,
(state) => state.series), '/artist',
(state) => state.series),
[types.DELETE_ARTIST]: createRemoveItemHandler(section, [types.DELETE_ARTIST]: createRemoveItemHandler(
'/artist', section,
(state) => state.series), '/artist',
(state) => state.series),
[types.TOGGLE_ARTIST_MONITORED]: function(payload) { [types.TOGGLE_ARTIST_MONITORED]: function(payload) {
return function(dispatch, getState) { return function(dispatch, getState) {

View File

@ -130,12 +130,12 @@ const calendarActionHandlers = {
}; };
const attrs = isPrePopulated ? const attrs = isPrePopulated ?
{ {
view, view,
...basesAttrs, ...basesAttrs,
...dates ...dates
} : } :
basesAttrs; basesAttrs;
dispatch(set(attrs)); dispatch(set(attrs));

View File

@ -1,3 +1,4 @@
/* eslint callback-return: 0 */
import _ from 'lodash'; import _ from 'lodash';
import $ from 'jquery'; import $ from 'jquery';
import requestAction from 'Utilities/requestAction'; import requestAction from 'Utilities/requestAction';

View File

@ -10,9 +10,10 @@ const section = 'rootFolders';
const rootFolderActionHandlers = { const rootFolderActionHandlers = {
[types.FETCH_ROOT_FOLDERS]: createFetchHandler('rootFolders', '/rootFolder'), [types.FETCH_ROOT_FOLDERS]: createFetchHandler('rootFolders', '/rootFolder'),
[types.DELETE_ROOT_FOLDER]: createRemoveItemHandler('rootFolders', [types.DELETE_ROOT_FOLDER]: createRemoveItemHandler(
'/rootFolder', 'rootFolders',
(state) => state.rootFolders), '/rootFolder',
(state) => state.rootFolders),
[types.ADD_ROOT_FOLDER]: function(payload) { [types.ADD_ROOT_FOLDER]: function(payload) {
return function(dispatch, getState) { return function(dispatch, getState) {

View File

@ -88,34 +88,40 @@ const settingsActionHandlers = {
[types.FETCH_QUALITY_PROFILES]: createFetchHandler('qualityProfiles', '/qualityprofile'), [types.FETCH_QUALITY_PROFILES]: createFetchHandler('qualityProfiles', '/qualityprofile'),
[types.FETCH_QUALITY_PROFILE_SCHEMA]: createFetchSchemaHandler('qualityProfiles', '/qualityprofile/schema'), [types.FETCH_QUALITY_PROFILE_SCHEMA]: createFetchSchemaHandler('qualityProfiles', '/qualityprofile/schema'),
[types.SAVE_QUALITY_PROFILE]: createSaveProviderHandler('qualityProfiles', [types.SAVE_QUALITY_PROFILE]: createSaveProviderHandler(
'/qualityprofile', 'qualityProfiles',
(state) => state.settings.qualityProfiles), '/qualityprofile',
(state) => state.settings.qualityProfiles),
[types.DELETE_QUALITY_PROFILE]: createRemoveItemHandler('qualityProfiles', [types.DELETE_QUALITY_PROFILE]: createRemoveItemHandler(
'/qualityprofile', 'qualityProfiles',
(state) => state.settings.qualityProfiles), '/qualityprofile',
(state) => state.settings.qualityProfiles),
[types.FETCH_LANGUAGE_PROFILES]: createFetchHandler('languageProfiles', '/languageprofile'), [types.FETCH_LANGUAGE_PROFILES]: createFetchHandler('languageProfiles', '/languageprofile'),
[types.FETCH_LANGUAGE_PROFILE_SCHEMA]: createFetchSchemaHandler('languageProfiles', '/languageprofile/schema'), [types.FETCH_LANGUAGE_PROFILE_SCHEMA]: createFetchSchemaHandler('languageProfiles', '/languageprofile/schema'),
[types.SAVE_LANGUAGE_PROFILE]: createSaveProviderHandler('languageProfiles', [types.SAVE_LANGUAGE_PROFILE]: createSaveProviderHandler(
'/languageprofile', 'languageProfiles',
(state) => state.settings.languageProfiles), '/languageprofile',
(state) => state.settings.languageProfiles),
[types.DELETE_LANGUAGE_PROFILE]: createRemoveItemHandler('languageProfiles', [types.DELETE_LANGUAGE_PROFILE]: createRemoveItemHandler(
'/languageprofile', 'languageProfiles',
(state) => state.settings.languageProfiles), '/languageprofile',
(state) => state.settings.languageProfiles),
[types.FETCH_DELAY_PROFILES]: createFetchHandler('delayProfiles', '/delayprofile'), [types.FETCH_DELAY_PROFILES]: createFetchHandler('delayProfiles', '/delayprofile'),
[types.SAVE_DELAY_PROFILE]: createSaveProviderHandler('delayProfiles', [types.SAVE_DELAY_PROFILE]: createSaveProviderHandler(
'/delayprofile', 'delayProfiles',
(state) => state.settings.delayProfiles), '/delayprofile',
(state) => state.settings.delayProfiles),
[types.DELETE_DELAY_PROFILE]: createRemoveItemHandler('delayProfiles', [types.DELETE_DELAY_PROFILE]: createRemoveItemHandler(
'/delayprofile', 'delayProfiles',
(state) => state.settings.delayProfiles), '/delayprofile',
(state) => state.settings.delayProfiles),
[types.FETCH_QUALITY_DEFINITIONS]: createFetchHandler('qualityDefinitions', '/qualitydefinition'), [types.FETCH_QUALITY_DEFINITIONS]: createFetchHandler('qualityDefinitions', '/qualitydefinition'),
[types.SAVE_QUALITY_DEFINITIONS]: createSaveHandler('qualityDefinitions', '/qualitydefinition', (state) => state.settings.qualitydefinitions), [types.SAVE_QUALITY_DEFINITIONS]: createSaveHandler('qualityDefinitions', '/qualitydefinition', (state) => state.settings.qualitydefinitions),
@ -157,19 +163,22 @@ const settingsActionHandlers = {
[types.FETCH_INDEXERS]: createFetchHandler('indexers', '/indexer'), [types.FETCH_INDEXERS]: createFetchHandler('indexers', '/indexer'),
[types.FETCH_INDEXER_SCHEMA]: createFetchSchemaHandler('indexers', '/indexer/schema'), [types.FETCH_INDEXER_SCHEMA]: createFetchSchemaHandler('indexers', '/indexer/schema'),
[types.SAVE_INDEXER]: createSaveProviderHandler('indexers', [types.SAVE_INDEXER]: createSaveProviderHandler(
'/indexer', 'indexers',
(state) => state.settings.indexers), '/indexer',
(state) => state.settings.indexers),
[types.CANCEL_SAVE_INDEXER]: createCancelSaveProviderHandler('indexers'), [types.CANCEL_SAVE_INDEXER]: createCancelSaveProviderHandler('indexers'),
[types.DELETE_INDEXER]: createRemoveItemHandler('indexers', [types.DELETE_INDEXER]: createRemoveItemHandler(
'/indexer', 'indexers',
(state) => state.settings.indexers), '/indexer',
(state) => state.settings.indexers),
[types.TEST_INDEXER]: createTestProviderHandler('indexers', [types.TEST_INDEXER]: createTestProviderHandler(
'/indexer', 'indexers',
(state) => state.settings.indexers), '/indexer',
(state) => state.settings.indexers),
[types.CANCEL_TEST_INDEXER]: createCancelTestProviderHandler('indexers'), [types.CANCEL_TEST_INDEXER]: createCancelTestProviderHandler('indexers'),
@ -178,30 +187,35 @@ const settingsActionHandlers = {
[types.FETCH_RESTRICTIONS]: createFetchHandler('restrictions', '/restriction'), [types.FETCH_RESTRICTIONS]: createFetchHandler('restrictions', '/restriction'),
[types.SAVE_RESTRICTION]: createSaveProviderHandler('restrictions', [types.SAVE_RESTRICTION]: createSaveProviderHandler(
'/restriction', 'restrictions',
(state) => state.settings.restrictions), '/restriction',
(state) => state.settings.restrictions),
[types.DELETE_RESTRICTION]: createRemoveItemHandler('restrictions', [types.DELETE_RESTRICTION]: createRemoveItemHandler(
'/restriction', 'restrictions',
(state) => state.settings.restrictions), '/restriction',
(state) => state.settings.restrictions),
[types.FETCH_DOWNLOAD_CLIENTS]: createFetchHandler('downloadClients', '/downloadclient'), [types.FETCH_DOWNLOAD_CLIENTS]: createFetchHandler('downloadClients', '/downloadclient'),
[types.FETCH_DOWNLOAD_CLIENT_SCHEMA]: createFetchSchemaHandler('downloadClients', '/downloadclient/schema'), [types.FETCH_DOWNLOAD_CLIENT_SCHEMA]: createFetchSchemaHandler('downloadClients', '/downloadclient/schema'),
[types.SAVE_DOWNLOAD_CLIENT]: createSaveProviderHandler('downloadClients', [types.SAVE_DOWNLOAD_CLIENT]: createSaveProviderHandler(
'/downloadclient', 'downloadClients',
(state) => state.settings.downloadClients), '/downloadclient',
(state) => state.settings.downloadClients),
[types.CANCEL_SAVE_DOWNLOAD_CLIENT]: createCancelSaveProviderHandler('downloadClients'), [types.CANCEL_SAVE_DOWNLOAD_CLIENT]: createCancelSaveProviderHandler('downloadClients'),
[types.DELETE_DOWNLOAD_CLIENT]: createRemoveItemHandler('downloadClients', [types.DELETE_DOWNLOAD_CLIENT]: createRemoveItemHandler(
'/downloadclient', 'downloadClients',
(state) => state.settings.downloadClients), '/downloadclient',
(state) => state.settings.downloadClients),
[types.TEST_DOWNLOAD_CLIENT]: createTestProviderHandler('downloadClients', [types.TEST_DOWNLOAD_CLIENT]: createTestProviderHandler(
'/downloadclient', 'downloadClients',
(state) => state.settings.downloadClients), '/downloadclient',
(state) => state.settings.downloadClients),
[types.CANCEL_TEST_DOWNLOAD_CLIENT]: createCancelTestProviderHandler('downloadClients'), [types.CANCEL_TEST_DOWNLOAD_CLIENT]: createCancelTestProviderHandler('downloadClients'),
@ -210,38 +224,44 @@ const settingsActionHandlers = {
[types.FETCH_REMOTE_PATH_MAPPINGS]: createFetchHandler('remotePathMappings', '/remotepathmapping'), [types.FETCH_REMOTE_PATH_MAPPINGS]: createFetchHandler('remotePathMappings', '/remotepathmapping'),
[types.SAVE_REMOTE_PATH_MAPPING]: createSaveProviderHandler('remotePathMappings', [types.SAVE_REMOTE_PATH_MAPPING]: createSaveProviderHandler(
'/remotepathmapping', 'remotePathMappings',
(state) => state.settings.remotePathMappings), '/remotepathmapping',
(state) => state.settings.remotePathMappings),
[types.DELETE_REMOTE_PATH_MAPPING]: createRemoveItemHandler('remotePathMappings', [types.DELETE_REMOTE_PATH_MAPPING]: createRemoveItemHandler(
'/remotepathmapping', 'remotePathMappings',
(state) => state.settings.remotePathMappings), '/remotepathmapping',
(state) => state.settings.remotePathMappings),
[types.FETCH_NOTIFICATIONS]: createFetchHandler('notifications', '/notification'), [types.FETCH_NOTIFICATIONS]: createFetchHandler('notifications', '/notification'),
[types.FETCH_NOTIFICATION_SCHEMA]: createFetchSchemaHandler('notifications', '/notification/schema'), [types.FETCH_NOTIFICATION_SCHEMA]: createFetchSchemaHandler('notifications', '/notification/schema'),
[types.SAVE_NOTIFICATION]: createSaveProviderHandler('notifications', [types.SAVE_NOTIFICATION]: createSaveProviderHandler(
'/notification', 'notifications',
(state) => state.settings.notifications), '/notification',
(state) => state.settings.notifications),
[types.CANCEL_SAVE_NOTIFICATION]: createCancelSaveProviderHandler('notifications'), [types.CANCEL_SAVE_NOTIFICATION]: createCancelSaveProviderHandler('notifications'),
[types.DELETE_NOTIFICATION]: createRemoveItemHandler('notifications', [types.DELETE_NOTIFICATION]: createRemoveItemHandler(
'/notification', 'notifications',
(state) => state.settings.notifications), '/notification',
(state) => state.settings.notifications),
[types.TEST_NOTIFICATION]: createTestProviderHandler('notifications', [types.TEST_NOTIFICATION]: createTestProviderHandler(
'/notification', 'notifications',
(state) => state.settings.notifications), '/notification',
(state) => state.settings.notifications),
[types.CANCEL_TEST_NOTIFICATION]: createCancelTestProviderHandler('notifications'), [types.CANCEL_TEST_NOTIFICATION]: createCancelTestProviderHandler('notifications'),
[types.FETCH_METADATA]: createFetchHandler('metadata', '/metadata'), [types.FETCH_METADATA]: createFetchHandler('metadata', '/metadata'),
[types.SAVE_METADATA]: createSaveProviderHandler('metadata', [types.SAVE_METADATA]: createSaveProviderHandler(
'/metadata', 'metadata',
(state) => state.settings.metadata), '/metadata',
(state) => state.settings.metadata),
[types.FETCH_METADATA_PROVIDER]: createFetchHandler('metadataProvider', '/config/metadataProvider'), [types.FETCH_METADATA_PROVIDER]: createFetchHandler('metadataProvider', '/config/metadataProvider'),
[types.SAVE_METADATA_PROVIDER]: createSaveHandler('metadataProvider', '/config/metadataProvider', (state) => state.settings.metadataProvider), [types.SAVE_METADATA_PROVIDER]: createSaveHandler('metadataProvider', '/config/metadataProvider', (state) => state.settings.metadataProvider),

View File

@ -1,35 +1,15 @@
import { applyMiddleware, compose } from 'redux'; import { applyMiddleware, compose } from 'redux';
import Raven from 'raven-js';
import createRavenMiddleware from 'raven-for-redux';
import thunk from 'redux-thunk'; import thunk from 'redux-thunk';
import { routerMiddleware } from 'react-router-redux'; import { routerMiddleware } from 'react-router-redux';
import sentryMiddleware from './sentryMiddleware';
import persistState from './persistState'; import persistState from './persistState';
export default function(history) { export default function(history) {
const {
analytics,
branch,
version,
release,
isProduction
} = window.Sonarr;
const dsn = isProduction ? 'https://c3a5b33e08de4e18b7d0505e942dbc95@sentry.io/216290' :
'https://c3a5b33e08de4e18b7d0505e942dbc95@sentry.io/216290';
Raven.config(dsn).install();
const middlewares = []; const middlewares = [];
const ravenMiddleware = sentryMiddleware();
if (analytics) { if (ravenMiddleware) {
middlewares.push(createRavenMiddleware(Raven, { middlewares.push(ravenMiddleware);
environment: isProduction ? 'production' : 'development',
release,
tags: {
branch,
version
}
}));
} }
middlewares.push(routerMiddleware(history)); middlewares.push(routerMiddleware(history));

View File

@ -0,0 +1,48 @@
import _ from 'lodash';
import Raven from 'raven-js';
import createRavenMiddleware from 'raven-for-redux';
import parseUrl from 'Utilities/String/parseUrl';
function cleanseUrl(url) {
const properties = parseUrl(url);
return `${properties.pathname}${properties.search}`;
}
function cleanseData(data) {
const result = _.cloneDeep(data);
result.culprit = cleanseUrl(result.culprit);
result.request.url = cleanseUrl(result.request.url);
return result;
}
export default function sentryMiddleware() {
const {
analytics,
branch,
version,
release,
isProduction
} = window.Sonarr;
if (!analytics) {
return;
}
const dsn = isProduction ? 'https://c3a5b33e08de4e18b7d0505e942dbc95@sentry.io/216290' :
'https://c3a5b33e08de4e18b7d0505e942dbc95@sentry.io/216290';
Raven.config(dsn).install();
return createRavenMiddleware(Raven, {
environment: isProduction ? 'production' : 'development',
release,
tags: {
branch,
version
},
dataCallback: cleanseData
});
}

View File

@ -12,8 +12,8 @@ function createSetClientSideCollectionSortReducer(section) {
if (!sortDirection) { if (!sortDirection) {
if (payload.sortKey === newState.sortKey) { if (payload.sortKey === newState.sortKey) {
sortDirection = newState.sortDirection === sortDirections.ASCENDING ? sortDirection = newState.sortDirection === sortDirections.ASCENDING ?
sortDirections.DESCENDING : sortDirections.DESCENDING :
sortDirections.ASCENDING; sortDirections.ASCENDING;
} else { } else {
sortDirection = newState.sortDirection; sortDirection = newState.sortDirection;
} }

View File

@ -2,28 +2,6 @@ import _ from 'lodash';
import getSectionState from 'Utilities/State/getSectionState'; import getSectionState from 'Utilities/State/getSectionState';
import updateSectionState from 'Utilities/State/updateSectionState'; import updateSectionState from 'Utilities/State/updateSectionState';
const whitelistedProperties = [
'isFetching',
'isPopulated',
'error',
'isFetchingSchema',
'schemaPopulated',
'schemaError',
'schema',
'selectedSchema',
'isSaving',
'saveError',
'isTesting',
'isDeleting',
'deleteError',
'pendingChanges',
'filterKey',
'filterValue',
'page',
'sortKey',
'sortDirection'
];
const blacklistedProperties = [ const blacklistedProperties = [
'section', 'section',
'id' 'id'
@ -33,7 +11,7 @@ function createSetReducer(section) {
return (state, { payload }) => { return (state, { payload }) => {
if (section === payload.section) { if (section === payload.section) {
const newState = Object.assign(getSectionState(state, section), const newState = Object.assign(getSectionState(state, section),
_.omit(payload, blacklistedProperties)); _.omit(payload, blacklistedProperties));
return updateSectionState(state, section, newState); return updateSectionState(state, section, newState);
} }

View File

@ -9,8 +9,9 @@ const whitelistedProperties = [
function createSetTableOptionReducer(section) { function createSetTableOptionReducer(section) {
return (state, { payload }) => { return (state, { payload }) => {
const newState = Object.assign(getSectionState(state, section), const newState = Object.assign(
_.pick(payload, whitelistedProperties)); getSectionState(state, section),
_.pick(payload, whitelistedProperties));
return updateSectionState(state, section, newState); return updateSectionState(state, section, newState);
}; };

View File

@ -1,5 +1,4 @@
import { handleActions } from 'redux-actions'; import { handleActions } from 'redux-actions';
import updateSectionState from 'Utilities/State/updateSectionState';
import { sortDirections } from 'Helpers/Props'; import { sortDirections } from 'Helpers/Props';
import * as types from 'Store/Actions/actionTypes'; import * as types from 'Store/Actions/actionTypes';
import createClearReducer from './Creators/createClearReducer'; import createClearReducer from './Creators/createClearReducer';

View File

@ -1,4 +1,8 @@
/* stylelint-disable */
@import '~normalize.css/normalize.css'; @import '~normalize.css/normalize.css';
@import 'scaffolding.css'; @import 'scaffolding.css';
@import '../Content/Fonts/fonts.css'; @import '../Content/Fonts/fonts.css';
@import '../Content/Fonts/font-awesome.css'; @import '../Content/Fonts/font-awesome.css';
/* stylelint-enable */

View File

@ -1,19 +1,22 @@
/* stylelint-disable */
* { * {
box-sizing: border-box; box-sizing: border-box;
} }
*:before,
*:after { *::before,
*::after {
box-sizing: border-box; box-sizing: border-box;
} }
*:focus { *:focus {
outline: none; outline: none;
} }
/* stylelint-enable */
html, html,
body { body {
color: #515253; color: #515253;
font-family: "Roboto", "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-family: 'Roboto', 'open sans', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
} }
body { body {

View File

@ -123,6 +123,8 @@ class LogsTableRow extends Component {
/> />
); );
} }
return null;
}) })
} }

View File

@ -27,7 +27,7 @@ class UpdateChanges extends Component {
<li key={index}> <li key={index}>
{change} {change}
</li> </li>
) );
}) })
} }
</ul> </ul>
@ -42,4 +42,4 @@ UpdateChanges.propTypes = {
changes: PropTypes.arrayOf(PropTypes.string) changes: PropTypes.arrayOf(PropTypes.string)
}; };
export default UpdateChanges export default UpdateChanges;

View File

@ -1,3 +1,4 @@
/* eslint max-params: 0 */
import _ from 'lodash'; import _ from 'lodash';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';

View File

@ -1,6 +1,6 @@
import moment from 'moment'; import moment from 'moment';
function isTomrrow(date) { function isTomorrow(date) {
if (!date) { if (!date) {
return false; return false;
} }
@ -8,4 +8,4 @@ function isTomrrow(date) {
return moment(date).isSame(moment().add(1, 'day'), 'day'); return moment(date).isSame(moment().add(1, 'day'), 'day');
} }
export default isTomrrow; export default isTomorrow;

Some files were not shown because too many files have changed in this diff Show More