diff --git a/frontend/src/RootFolder/RootFolderRow.css b/frontend/src/RootFolder/RootFolderRow.css index 124c9e449..c1ec2625e 100644 --- a/frontend/src/RootFolder/RootFolderRow.css +++ b/frontend/src/RootFolder/RootFolderRow.css @@ -1,7 +1,16 @@ .link { composes: link from '~Components/Link/Link.css'; +} - display: block; +.unavailablePath { + display: flex; + align-items: center; +} + +.unavailableLabel { + composes: label from '~Components/Label.css'; + + margin-left: 10px; } .freeSpace, diff --git a/frontend/src/RootFolder/RootFolderRow.js b/frontend/src/RootFolder/RootFolderRow.js index 2a4038a54..ffa836dc2 100644 --- a/frontend/src/RootFolder/RootFolderRow.js +++ b/frontend/src/RootFolder/RootFolderRow.js @@ -1,7 +1,8 @@ import PropTypes from 'prop-types'; import React from 'react'; import formatBytes from 'Utilities/Number/formatBytes'; -import { icons } from 'Helpers/Props'; +import { icons, kinds } from 'Helpers/Props'; +import Label from 'Components/Label'; import IconButton from 'Components/Link/IconButton'; import Link from 'Components/Link/Link'; import TableRow from 'Components/Table/TableRow'; @@ -18,20 +19,35 @@ function RootFolderRow(props) { } = props; const unmappedFoldersCount = unmappedFolders.length || '-'; + const isUnavailable = freeSpace == null; return ( - - {path} - + { + isUnavailable ? +
+ {path} + + +
: + + + {path} + + }
- {formatBytes(freeSpace) || '-'} + {freeSpace ? formatBytes(freeSpace) : '-'} @@ -52,13 +68,12 @@ function RootFolderRow(props) { RootFolderRow.propTypes = { id: PropTypes.number.isRequired, path: PropTypes.string.isRequired, - freeSpace: PropTypes.number.isRequired, + freeSpace: PropTypes.number, unmappedFolders: PropTypes.arrayOf(PropTypes.object).isRequired, onDeletePress: PropTypes.func.isRequired }; RootFolderRow.defaultProps = { - freeSpace: 0, unmappedFolders: [] }; diff --git a/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs b/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs index 8e73d0c92..972535a46 100644 --- a/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs +++ b/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs @@ -7,7 +7,6 @@ using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; -using NzbDrone.Core.Configuration; using NzbDrone.Core.RootFolders; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; diff --git a/src/NzbDrone.Core/RootFolders/RootFolderService.cs b/src/NzbDrone.Core/RootFolders/RootFolderService.cs index e0b48aaa1..88bcb409f 100644 --- a/src/NzbDrone.Core/RootFolders/RootFolderService.cs +++ b/src/NzbDrone.Core/RootFolders/RootFolderService.cs @@ -2,6 +2,8 @@ using System.Linq; using System; using System.Collections.Generic; using System.IO; +using System.Threading; +using System.Threading.Tasks; using NLog; using NzbDrone.Common; using NzbDrone.Common.Disk; @@ -67,11 +69,9 @@ namespace NzbDrone.Core.RootFolders { try { - if (folder.Path.IsPathValid() && _diskProvider.FolderExists(folder.Path)) + if (folder.Path.IsPathValid()) { - folder.FreeSpace = _diskProvider.GetAvailableSpace(folder.Path); - folder.TotalSpace = _diskProvider.GetTotalSize(folder.Path); - folder.UnmappedFolders = GetUnmappedFolders(folder.Path); + GetDetails(folder); } } //We don't want an exception to prevent the root folders from loading in the UI, so they can still be deleted @@ -111,9 +111,7 @@ namespace NzbDrone.Core.RootFolders _rootFolderRepository.Insert(rootFolder); - rootFolder.FreeSpace = _diskProvider.GetAvailableSpace(rootFolder.Path); - rootFolder.TotalSpace = _diskProvider.GetTotalSize(rootFolder.Path); - rootFolder.UnmappedFolders = GetUnmappedFolders(rootFolder.Path); + GetDetails(rootFolder); return rootFolder; } @@ -160,9 +158,8 @@ namespace NzbDrone.Core.RootFolders public RootFolder Get(int id) { var rootFolder = _rootFolderRepository.Get(id); - rootFolder.FreeSpace = _diskProvider.GetAvailableSpace(rootFolder.Path); - rootFolder.TotalSpace = _diskProvider.GetTotalSize(rootFolder.Path); - rootFolder.UnmappedFolders = GetUnmappedFolders(rootFolder.Path); + GetDetails(rootFolder); + return rootFolder; } @@ -179,5 +176,19 @@ namespace NzbDrone.Core.RootFolders return possibleRootFolder.Path; } + + private void GetDetails(RootFolder rootFolder) + { + Task.Run(() => + { + if (_diskProvider.FolderExists(rootFolder.Path)) + { + rootFolder.FreeSpace = _diskProvider.GetAvailableSpace(rootFolder.Path); + rootFolder.TotalSpace = _diskProvider.GetTotalSize(rootFolder.Path); + rootFolder.UnmappedFolders = GetUnmappedFolders(rootFolder.Path); + } + }) + .Wait(5000); + } } }