mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-07-09 03:04:24 -04:00
add Add to collection buttons
This commit is contained in:
parent
86a9df53f2
commit
1af651bc56
@ -60,7 +60,12 @@ namespace MediaBrowser.Controller.Channels
|
|||||||
|
|
||||||
protected override string GetInternalMetadataPath(string basePath)
|
protected override string GetInternalMetadataPath(string basePath)
|
||||||
{
|
{
|
||||||
return System.IO.Path.Combine(basePath, "channels", Id.ToString("N"), "metadata");
|
return GetInternalMetadataPath(basePath, Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetInternalMetadataPath(string basePath, Guid id)
|
||||||
|
{
|
||||||
|
return System.IO.Path.Combine(basePath, "channels", id.ToString("N"), "metadata");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -381,11 +381,6 @@ namespace MediaBrowser.Controller.Entities
|
|||||||
{
|
{
|
||||||
var basePath = ConfigurationManager.ApplicationPaths.InternalMetadataPath;
|
var basePath = ConfigurationManager.ApplicationPaths.InternalMetadataPath;
|
||||||
|
|
||||||
if (ConfigurationManager.Configuration.EnableLibraryMetadataSubFolder)
|
|
||||||
{
|
|
||||||
basePath = System.IO.Path.Combine(basePath, "library");
|
|
||||||
}
|
|
||||||
|
|
||||||
return GetInternalMetadataPath(basePath);
|
return GetInternalMetadataPath(basePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -393,14 +388,10 @@ namespace MediaBrowser.Controller.Entities
|
|||||||
{
|
{
|
||||||
var idString = Id.ToString("N");
|
var idString = Id.ToString("N");
|
||||||
|
|
||||||
return System.IO.Path.Combine(basePath, idString.Substring(0, 2), idString);
|
if (ConfigurationManager.Configuration.EnableLibraryMetadataSubFolder)
|
||||||
}
|
{
|
||||||
|
basePath = System.IO.Path.Combine(basePath, "library");
|
||||||
public static string GetInternalMetadataPathForId(Guid id)
|
}
|
||||||
{
|
|
||||||
var idString = id.ToString("N");
|
|
||||||
|
|
||||||
var basePath = ConfigurationManager.ApplicationPaths.InternalMetadataPath;
|
|
||||||
|
|
||||||
return System.IO.Path.Combine(basePath, idString.Substring(0, 2), idString);
|
return System.IO.Path.Combine(basePath, idString.Substring(0, 2), idString);
|
||||||
}
|
}
|
||||||
|
@ -117,7 +117,7 @@ namespace MediaBrowser.Controller.Entities
|
|||||||
return await GetGameView(user, queryParent, query).ConfigureAwait(false);
|
return await GetGameView(user, queryParent, query).ConfigureAwait(false);
|
||||||
|
|
||||||
case CollectionType.BoxSets:
|
case CollectionType.BoxSets:
|
||||||
return GetResult(GetMediaFolders(user).SelectMany(i => i.GetRecursiveChildren(user)).OfType<BoxSet>(), queryParent, query);
|
return await GetBoxsetView(queryParent, user, query).ConfigureAwait(false);
|
||||||
|
|
||||||
case CollectionType.TvShows:
|
case CollectionType.TvShows:
|
||||||
return await GetTvView(queryParent, user, query).ConfigureAwait(false);
|
return await GetTvView(queryParent, user, query).ConfigureAwait(false);
|
||||||
@ -526,6 +526,22 @@ namespace MediaBrowser.Controller.Entities
|
|||||||
return GetResult(items, queryParent, query);
|
return GetResult(items, queryParent, query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<QueryResult<BaseItem>> GetBoxsetView(Folder parent, User user, InternalItemsQuery query)
|
||||||
|
{
|
||||||
|
return GetResult(GetMediaFolders(user).SelectMany(i =>
|
||||||
|
{
|
||||||
|
var hasCollectionType = i as ICollectionFolder;
|
||||||
|
|
||||||
|
if (hasCollectionType != null && string.Equals(hasCollectionType.CollectionType, CollectionType.BoxSets, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
return i.GetChildren(user, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return i.GetRecursiveChildren(user);
|
||||||
|
|
||||||
|
}).OfType<BoxSet>(), parent, query);
|
||||||
|
}
|
||||||
|
|
||||||
private async Task<QueryResult<BaseItem>> GetTvView(Folder parent, User user, InternalItemsQuery query)
|
private async Task<QueryResult<BaseItem>> GetTvView(Folder parent, User user, InternalItemsQuery query)
|
||||||
{
|
{
|
||||||
if (query.Recursive)
|
if (query.Recursive)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
using MediaBrowser.Common.IO;
|
using MediaBrowser.Common.IO;
|
||||||
using MediaBrowser.Common.Net;
|
using MediaBrowser.Common.Net;
|
||||||
|
using MediaBrowser.Controller;
|
||||||
using MediaBrowser.Controller.Configuration;
|
using MediaBrowser.Controller.Configuration;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.Entities.Audio;
|
using MediaBrowser.Controller.Entities.Audio;
|
||||||
@ -58,6 +59,7 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
private IMetadataProvider[] _metadataProviders = { };
|
private IMetadataProvider[] _metadataProviders = { };
|
||||||
private IEnumerable<IMetadataSaver> _savers;
|
private IEnumerable<IMetadataSaver> _savers;
|
||||||
private IImageSaver[] _imageSavers;
|
private IImageSaver[] _imageSavers;
|
||||||
|
private readonly IServerApplicationPaths _appPaths;
|
||||||
|
|
||||||
private IExternalId[] _externalIds;
|
private IExternalId[] _externalIds;
|
||||||
|
|
||||||
@ -69,13 +71,14 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
/// <param name="libraryMonitor">The directory watchers.</param>
|
/// <param name="libraryMonitor">The directory watchers.</param>
|
||||||
/// <param name="logManager">The log manager.</param>
|
/// <param name="logManager">The log manager.</param>
|
||||||
/// <param name="fileSystem">The file system.</param>
|
/// <param name="fileSystem">The file system.</param>
|
||||||
public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem)
|
public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths)
|
||||||
{
|
{
|
||||||
_logger = logManager.GetLogger("ProviderManager");
|
_logger = logManager.GetLogger("ProviderManager");
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
ConfigurationManager = configurationManager;
|
ConfigurationManager = configurationManager;
|
||||||
_libraryMonitor = libraryMonitor;
|
_libraryMonitor = libraryMonitor;
|
||||||
_fileSystem = fileSystem;
|
_fileSystem = fileSystem;
|
||||||
|
_appPaths = appPaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -467,7 +470,7 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
// Give it a dummy path just so that it looks like a file system item
|
// Give it a dummy path just so that it looks like a file system item
|
||||||
var dummy = new T()
|
var dummy = new T()
|
||||||
{
|
{
|
||||||
Path = BaseItem.GetInternalMetadataPathForId(Guid.NewGuid()),
|
Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy"),
|
||||||
|
|
||||||
// Dummy this up to fool the local trailer check
|
// Dummy this up to fool the local trailer check
|
||||||
Parent = new Folder()
|
Parent = new Folder()
|
||||||
@ -709,7 +712,7 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
// Give it a dummy path just so that it looks like a file system item
|
// Give it a dummy path just so that it looks like a file system item
|
||||||
var dummy = new TItemType
|
var dummy = new TItemType
|
||||||
{
|
{
|
||||||
Path = BaseItem.GetInternalMetadataPathForId(Guid.NewGuid()),
|
Path = Path.Combine(_appPaths.InternalMetadataPath, "dummy"),
|
||||||
|
|
||||||
// Dummy this up to fool the local trailer check
|
// Dummy this up to fool the local trailer check
|
||||||
Parent = new Folder()
|
Parent = new Folder()
|
||||||
|
@ -393,7 +393,9 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|||||||
|
|
||||||
private async Task<Channel> GetChannel(IChannel channelInfo, CancellationToken cancellationToken)
|
private async Task<Channel> GetChannel(IChannel channelInfo, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var path = Path.Combine(_config.ApplicationPaths.ItemsByNamePath, "channels", _fileSystem.GetValidFilename(channelInfo.Name));
|
var id = GetInternalChannelId(channelInfo.Name);
|
||||||
|
|
||||||
|
var path = Channel.GetInternalMetadataPath(_config.ApplicationPaths.InternalMetadataPath, id);
|
||||||
|
|
||||||
var fileInfo = new DirectoryInfo(path);
|
var fileInfo = new DirectoryInfo(path);
|
||||||
|
|
||||||
@ -414,8 +416,6 @@ namespace MediaBrowser.Server.Implementations.Channels
|
|||||||
isNew = true;
|
isNew = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var id = GetInternalChannelId(channelInfo.Name);
|
|
||||||
|
|
||||||
var item = _libraryManager.GetItemById(id) as Channel;
|
var item = _libraryManager.GetItemById(id) as Channel;
|
||||||
|
|
||||||
if (item == null)
|
if (item == null)
|
||||||
|
@ -1646,7 +1646,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
|||||||
|
|
||||||
var id = GetNewItemId("7_namedview_" + name + user.Id.ToString("N") + parentId, typeof(UserView));
|
var id = GetNewItemId("7_namedview_" + name + user.Id.ToString("N") + parentId, typeof(UserView));
|
||||||
|
|
||||||
var path = BaseItem.GetInternalMetadataPathForId(id);
|
var path = Path.Combine(ConfigurationManager.ApplicationPaths.InternalMetadataPath, "views", "specialviews", id.ToString("N"));
|
||||||
|
|
||||||
var item = GetItemById(id) as UserView;
|
var item = GetItemById(id) as UserView;
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@ using MediaBrowser.Controller.Library;
|
|||||||
using MediaBrowser.Model.Entities;
|
using MediaBrowser.Model.Entities;
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
|
namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
|
||||||
{
|
{
|
||||||
@ -46,17 +45,6 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsInvalid(string collectionType)
|
|
||||||
{
|
|
||||||
var validCollectionTypes = new[]
|
|
||||||
{
|
|
||||||
CollectionType.Movies,
|
|
||||||
CollectionType.BoxSets
|
|
||||||
};
|
|
||||||
|
|
||||||
return !validCollectionTypes.Contains(collectionType ?? string.Empty, StringComparer.OrdinalIgnoreCase);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the initial item values.
|
/// Sets the initial item values.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -45,8 +45,14 @@
|
|||||||
"LabelFailed": "(failed)",
|
"LabelFailed": "(failed)",
|
||||||
"ButtonHelp": "Help",
|
"ButtonHelp": "Help",
|
||||||
"ButtonSave": "Save",
|
"ButtonSave": "Save",
|
||||||
|
"HeaderAddToCollection": "Add to Collection",
|
||||||
|
"NewCollectionNameExample": "Example: Star Wars Collection",
|
||||||
|
"OptionSearchForInternetMetadata": "Search the internet for artwork and metadata",
|
||||||
|
"LabelSelectCollection": "Select collection:",
|
||||||
"HeaderDevices": "Devices",
|
"HeaderDevices": "Devices",
|
||||||
"ButtonScheduledTasks": "Scheduled tasks",
|
"ButtonScheduledTasks": "Scheduled tasks",
|
||||||
|
"MessageItemsAdded": "Items added",
|
||||||
|
"ButtonAddToCollection": "Add to collection",
|
||||||
"HeaderSelectCertificatePath": "Select Certificate Path",
|
"HeaderSelectCertificatePath": "Select Certificate Path",
|
||||||
"ConfirmMessageScheduledTaskButton": "This operation normally runs automatically as a scheduled task. It can also be run manually here. To configure the scheduled task, see:",
|
"ConfirmMessageScheduledTaskButton": "This operation normally runs automatically as a scheduled task. It can also be run manually here. To configure the scheduled task, see:",
|
||||||
"HeaderSupporterBenefit": "A supporter membership provides additional benefits such as access to premium plugins, internet channel content, and more. {0}Learn more{1}.",
|
"HeaderSupporterBenefit": "A supporter membership provides additional benefits such as access to premium plugins, internet channel content, and more. {0}Learn more{1}.",
|
||||||
@ -223,6 +229,7 @@
|
|||||||
"ButtonRefresh": "Refresh",
|
"ButtonRefresh": "Refresh",
|
||||||
"LabelCurrentPath": "Current path:",
|
"LabelCurrentPath": "Current path:",
|
||||||
"HeaderSelectMediaPath": "Select Media Path",
|
"HeaderSelectMediaPath": "Select Media Path",
|
||||||
|
"HeaderSelectPath": "Select Path",
|
||||||
"ButtonNetwork": "Network",
|
"ButtonNetwork": "Network",
|
||||||
"MessageDirectoryPickerInstruction": "Network paths can be entered manually in the event the Network button fails to locate your devices. For example, {0} or {1}.",
|
"MessageDirectoryPickerInstruction": "Network paths can be entered manually in the event the Network button fails to locate your devices. For example, {0} or {1}.",
|
||||||
"HeaderMenu": "Menu",
|
"HeaderMenu": "Menu",
|
||||||
|
@ -55,6 +55,8 @@
|
|||||||
"HeaderAudio": "Audio",
|
"HeaderAudio": "Audio",
|
||||||
"HeaderVideo": "Video",
|
"HeaderVideo": "Video",
|
||||||
"HeaderPaths": "Paths",
|
"HeaderPaths": "Paths",
|
||||||
|
"LabelSyncTempPath": "Temporary file path:",
|
||||||
|
"LabelSyncTempPathHelp": "",
|
||||||
"LabelCustomCertificatePath": "Custom certificate path:",
|
"LabelCustomCertificatePath": "Custom certificate path:",
|
||||||
"LabelCustomCertificatePathHelp": "Supply your own ssl certificate. If omitted, the server will create a self-signed certificate.",
|
"LabelCustomCertificatePathHelp": "Supply your own ssl certificate. If omitted, the server will create a self-signed certificate.",
|
||||||
"TitleNotifications": "Notifications",
|
"TitleNotifications": "Notifications",
|
||||||
@ -516,10 +518,7 @@
|
|||||||
"LabelPreferredDisplayLanguageHelp": "Translating Media Browser is an ongoing project and is not yet complete.",
|
"LabelPreferredDisplayLanguageHelp": "Translating Media Browser is an ongoing project and is not yet complete.",
|
||||||
"LabelReadHowYouCanContribute": "Read about how you can contribute.",
|
"LabelReadHowYouCanContribute": "Read about how you can contribute.",
|
||||||
"HeaderNewCollection": "New Collection",
|
"HeaderNewCollection": "New Collection",
|
||||||
"HeaderAddToCollection": "Add to Collection",
|
|
||||||
"ButtonSubmit": "Submit",
|
"ButtonSubmit": "Submit",
|
||||||
"NewCollectionNameExample": "Example: Star Wars Collection",
|
|
||||||
"OptionSearchForInternetMetadata": "Search the internet for artwork and metadata",
|
|
||||||
"ButtonCreate": "Create",
|
"ButtonCreate": "Create",
|
||||||
"LabelCustomCss": "Custom css:",
|
"LabelCustomCss": "Custom css:",
|
||||||
"LabelCustomCssHelp": "Apply your own custom css to the web interface.",
|
"LabelCustomCssHelp": "Apply your own custom css to the web interface.",
|
||||||
@ -891,6 +890,8 @@
|
|||||||
"OptionDefaultSort": "Default",
|
"OptionDefaultSort": "Default",
|
||||||
"OptionCommunityMostWatchedSort": "Most Watched",
|
"OptionCommunityMostWatchedSort": "Most Watched",
|
||||||
"TabNextUp": "Next Up",
|
"TabNextUp": "Next Up",
|
||||||
|
"HeaderBecomeMediaBrowserSupporter": "Become a Media Browser Supporter",
|
||||||
|
"TextAccessPremiumFeatures": "Enjoy Premium Features",
|
||||||
"MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.",
|
"MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.",
|
||||||
"MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, Albums, Books and Games. Click the + button to start creating Collections.",
|
"MessageNoCollectionsAvailable": "Collections allow you to enjoy personalized groupings of Movies, Series, Albums, Books and Games. Click the + button to start creating Collections.",
|
||||||
"MessageNoPlaylistsAvailable": "Playlists allow you to create lists of content to play consecutively at a time. To add items to playlists, right click or tap and hold, then select Add to Playlist.",
|
"MessageNoPlaylistsAvailable": "Playlists allow you to create lists of content to play consecutively at a time. To add items to playlists, right click or tap and hold, then select Add to Playlist.",
|
||||||
@ -907,7 +908,6 @@
|
|||||||
"LabelChannelDownloadAge": "Delete content after: (days)",
|
"LabelChannelDownloadAge": "Delete content after: (days)",
|
||||||
"LabelChannelDownloadAgeHelp": "Downloaded content older than this will be deleted. It will remain playable via internet streaming.",
|
"LabelChannelDownloadAgeHelp": "Downloaded content older than this will be deleted. It will remain playable via internet streaming.",
|
||||||
"ChannelSettingsFormHelp": "Install channels such as Trailers and Vimeo in the plugin catalog.",
|
"ChannelSettingsFormHelp": "Install channels such as Trailers and Vimeo in the plugin catalog.",
|
||||||
"LabelSelectCollection": "Select collection:",
|
|
||||||
"ButtonOptions": "Options",
|
"ButtonOptions": "Options",
|
||||||
"ViewTypeMovies": "Movies",
|
"ViewTypeMovies": "Movies",
|
||||||
"ViewTypeTvShows": "TV",
|
"ViewTypeTvShows": "TV",
|
||||||
@ -969,6 +969,7 @@
|
|||||||
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
|
"LabelGroupChannelsIntoViews": "Display the following channels directly within my views:",
|
||||||
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
|
"LabelGroupChannelsIntoViewsHelp": "If enabled, these channels will be displayed directly alongside other views. If disabled, they'll be displayed within a separate Channels view.",
|
||||||
"LabelDisplayCollectionsView": "Display a collections view to show movie collections",
|
"LabelDisplayCollectionsView": "Display a collections view to show movie collections",
|
||||||
|
"LabelDisplayCollectionsViewHelp": "This will create a separate view to display collections that you've created or have access to. To create a collection, right-click or tap-hold any movie and select 'Add to Collection'. ",
|
||||||
"LabelKodiMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
|
"LabelKodiMetadataEnableExtraThumbs": "Copy extrafanart into extrathumbs",
|
||||||
"LabelKodiMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Kodi skin compatibility.",
|
"LabelKodiMetadataEnableExtraThumbsHelp": "When downloading images they can be saved into both extrafanart and extrathumbs for maximum Kodi skin compatibility.",
|
||||||
"TabServices": "Services",
|
"TabServices": "Services",
|
||||||
|
@ -33,7 +33,7 @@ namespace MediaBrowser.Server.Implementations.Themes
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return Path.Combine(_appPaths.ItemsByNamePath, "appthemes");
|
return Path.Combine(_appPaths.ProgramDataPath, "appthemes");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,7 +419,7 @@ namespace MediaBrowser.Server.Startup.Common
|
|||||||
LibraryMonitor = new LibraryMonitor(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager);
|
LibraryMonitor = new LibraryMonitor(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager);
|
||||||
RegisterSingleInstance(LibraryMonitor);
|
RegisterSingleInstance(LibraryMonitor);
|
||||||
|
|
||||||
ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager);
|
ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager, ApplicationPaths);
|
||||||
RegisterSingleInstance(ProviderManager);
|
RegisterSingleInstance(ProviderManager);
|
||||||
|
|
||||||
SeriesOrderManager = new SeriesOrderManager();
|
SeriesOrderManager = new SeriesOrderManager();
|
||||||
|
@ -565,7 +565,8 @@ namespace MediaBrowser.WebDashboard.Api
|
|||||||
"userimage.css",
|
"userimage.css",
|
||||||
"livetv.css",
|
"livetv.css",
|
||||||
"nowplaying.css",
|
"nowplaying.css",
|
||||||
"icons.css"
|
"icons.css",
|
||||||
|
"materialize.css"
|
||||||
};
|
};
|
||||||
|
|
||||||
var builder = new StringBuilder();
|
var builder = new StringBuilder();
|
||||||
|
@ -96,6 +96,9 @@
|
|||||||
<Content Include="dashboard-ui\css\images\tour\dashboard\help.png">
|
<Content Include="dashboard-ui\css\images\tour\dashboard\help.png">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
<Content Include="dashboard-ui\css\materialize.css">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="dashboard-ui\dashboardhosting.html">
|
<Content Include="dashboard-ui\dashboardhosting.html">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user