#20542 Collapsible media library tree in admin.

Dynamically loading MediaLibrary directory tree using ajax and knockout templates
This commit is contained in:
Benjamin Grabkowitz
2014-03-07 17:07:20 -05:00
committed by Sebastien Ros
parent ba09ba8053
commit 5d2a31ffc0
8 changed files with 798 additions and 683 deletions

View File

@@ -1,160 +1,173 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Web.Mvc; using System.Web.Mvc;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.Localization; using Orchard.Localization;
using Orchard.Logging; using Orchard.Logging;
using Orchard.MediaLibrary.Models; using Orchard.MediaLibrary.Models;
using Orchard.MediaLibrary.Services; using Orchard.MediaLibrary.Services;
using Orchard.MediaLibrary.ViewModels; using Orchard.MediaLibrary.ViewModels;
using Orchard.Mvc; using Orchard.Mvc;
using Orchard.Themes; using Orchard.Themes;
using Orchard.UI.Navigation; using Orchard.UI.Navigation;
using Orchard.ContentManagement.MetaData; using Orchard.ContentManagement.MetaData;
using Orchard.Validation; using Orchard.Validation;
namespace Orchard.MediaLibrary.Controllers { namespace Orchard.MediaLibrary.Controllers {
[ValidateInput(false)] [ValidateInput(false)]
public class AdminController : Controller { public class AdminController : Controller {
private readonly IMediaLibraryService _mediaLibraryService; private readonly IMediaLibraryService _mediaLibraryService;
private readonly INavigationManager _navigationManager; private readonly INavigationManager _navigationManager;
private readonly IContentDefinitionManager _contentDefinitionManager; private readonly IContentDefinitionManager _contentDefinitionManager;
public AdminController( public AdminController(
IOrchardServices services, IOrchardServices services,
IMediaLibraryService mediaLibraryService, IMediaLibraryService mediaLibraryService,
INavigationManager navigationManager, INavigationManager navigationManager,
IContentDefinitionManager contentDefinitionManager) { IContentDefinitionManager contentDefinitionManager) {
_mediaLibraryService = mediaLibraryService; _mediaLibraryService = mediaLibraryService;
_navigationManager = navigationManager; _navigationManager = navigationManager;
_contentDefinitionManager = contentDefinitionManager; _contentDefinitionManager = contentDefinitionManager;
Services = services; Services = services;
T = NullLocalizer.Instance; T = NullLocalizer.Instance;
Logger = NullLogger.Instance; Logger = NullLogger.Instance;
} }
public IOrchardServices Services { get; set; } public IOrchardServices Services { get; set; }
public Localizer T { get; set; } public Localizer T { get; set; }
public ILogger Logger { get; set; } public ILogger Logger { get; set; }
public ActionResult Index(string folderPath = "", bool dialog = false) { public ActionResult Index(string folderPath = "", bool dialog = false) {
// let other modules enhance the ui by providing custom navigation and actions // let other modules enhance the ui by providing custom navigation and actions
var explorer = Services.ContentManager.New("MediaLibraryExplorer"); var explorer = Services.ContentManager.New("MediaLibraryExplorer");
explorer.Weld(new MediaLibraryExplorerPart()); explorer.Weld(new MediaLibraryExplorerPart());
var explorerShape = Services.ContentManager.BuildDisplay(explorer); var explorerShape = Services.ContentManager.BuildDisplay(explorer);
var viewModel = new MediaManagerIndexViewModel { var viewModel = new MediaManagerIndexViewModel {
DialogMode = dialog, DialogMode = dialog,
Folders = _mediaLibraryService.GetMediaFolders(null).Select(GetFolderHierarchy), FolderPath = folderPath,
FolderPath = folderPath, MediaTypes = _mediaLibraryService.GetMediaTypes(),
MediaTypes = _mediaLibraryService.GetMediaTypes(), CustomActionsShapes = explorerShape.Actions,
CustomActionsShapes = explorerShape.Actions, CustomNavigationShapes = explorerShape.Navigation,
CustomNavigationShapes = explorerShape.Navigation, };
};
foreach (var shape in explorerShape.Actions.Items) {
foreach (var shape in explorerShape.Actions.Items) { shape.MediaManagerIndexViewModel = viewModel;
shape.MediaManagerIndexViewModel = viewModel; }
}
foreach (var shape in explorerShape.Navigation.Items) {
foreach (var shape in explorerShape.Navigation.Items) { shape.MediaManagerIndexViewModel = viewModel;
shape.MediaManagerIndexViewModel = viewModel; }
}
return View(viewModel);
return View(viewModel); }
}
public ActionResult Import(string folderPath) {
public ActionResult Import(string folderPath) {
var mediaProviderMenu = _navigationManager.BuildMenu("mediaproviders");
var mediaProviderMenu = _navigationManager.BuildMenu("mediaproviders"); var imageSets = _navigationManager.BuildImageSets("mediaproviders");
var imageSets = _navigationManager.BuildImageSets("mediaproviders");
var viewModel = new MediaManagerImportViewModel {
var viewModel = new MediaManagerImportViewModel { Menu = mediaProviderMenu,
Menu = mediaProviderMenu, ImageSets = imageSets,
ImageSets = imageSets, FolderPath = folderPath,
FolderPath = folderPath, MediaTypes = _mediaLibraryService.GetMediaTypes()
MediaTypes = _mediaLibraryService.GetMediaTypes() };
};
return View(viewModel);
return View(viewModel); }
}
[Themed(false)]
[Themed(false)] public ActionResult MediaItems(string folderPath, int skip = 0, int count = 0, string order = "created", string mediaType = "") {
public ActionResult MediaItems(string folderPath, int skip = 0, int count = 0, string order = "created", string mediaType = "") { var mediaParts = _mediaLibraryService.GetMediaContentItems(folderPath, skip, count, order, mediaType, VersionOptions.Latest);
var mediaParts = _mediaLibraryService.GetMediaContentItems(folderPath, skip, count, order, mediaType, VersionOptions.Latest); var mediaPartsCount = _mediaLibraryService.GetMediaContentItemsCount(folderPath, mediaType, VersionOptions.Latest);
var mediaPartsCount = _mediaLibraryService.GetMediaContentItemsCount(folderPath, mediaType, VersionOptions.Latest);
var mediaItems = mediaParts.Select(x => new MediaManagerMediaItemViewModel {
var mediaItems = mediaParts.Select(x => new MediaManagerMediaItemViewModel { MediaPart = x,
MediaPart = x, Shape = Services.ContentManager.BuildDisplay(x.ContentItem, "Thumbnail")
Shape = Services.ContentManager.BuildDisplay(x.ContentItem, "Thumbnail") }).ToList();
}).ToList();
var viewModel = new MediaManagerMediaItemsViewModel {
var viewModel = new MediaManagerMediaItemsViewModel { MediaItems = mediaItems,
MediaItems = mediaItems, MediaItemsCount = mediaPartsCount
MediaItemsCount = mediaPartsCount };
};
return View(viewModel);
return View(viewModel); }
}
[Themed(false)]
[Themed(false)] public ActionResult ChildFolders(string folderPath = null) {
public ActionResult RecentMediaItems(int skip = 0, int count = 0, string order = "created", string mediaType = "") { if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent, T("Cannot get child folder listing")))
var mediaParts = _mediaLibraryService.GetMediaContentItems(skip, count, order, mediaType, VersionOptions.Latest); return new HttpUnauthorizedResult();
var mediaPartsCount = _mediaLibraryService.GetMediaContentItemsCount(mediaType, VersionOptions.Latest);
var childFolders = _mediaLibraryService.GetMediaFolders(folderPath);
var mediaItems = mediaParts.Select(x => new MediaManagerMediaItemViewModel {
MediaPart = x, var viewModel = new MediaManagerChildFoldersViewModel {
Shape = Services.ContentManager.BuildDisplay(x, "Thumbnail") Children = childFolders
}).ToList(); };
var viewModel = new MediaManagerMediaItemsViewModel { return View(viewModel);
MediaItems = mediaItems, }
MediaItemsCount = mediaPartsCount
}; [Themed(false)]
public ActionResult RecentMediaItems(int skip = 0, int count = 0, string order = "created", string mediaType = "") {
return View("MediaItems", viewModel); var mediaParts = _mediaLibraryService.GetMediaContentItems(skip, count, order, mediaType, VersionOptions.Latest);
} var mediaPartsCount = _mediaLibraryService.GetMediaContentItemsCount(mediaType, VersionOptions.Latest);
[Themed(false)] var mediaItems = mediaParts.Select(x => new MediaManagerMediaItemViewModel {
public ActionResult MediaItem(int id, string displayType = "SummaryAdmin") { MediaPart = x,
var contentItem = Services.ContentManager.Get(id, VersionOptions.Latest); Shape = Services.ContentManager.BuildDisplay(x, "Thumbnail")
}).ToList();
if (contentItem == null)
return HttpNotFound(); var viewModel = new MediaManagerMediaItemsViewModel {
MediaItems = mediaItems,
if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent, contentItem, T("Cannot edit media"))) MediaItemsCount = mediaPartsCount
return new HttpUnauthorizedResult(); };
dynamic model = Services.ContentManager.BuildDisplay(contentItem, displayType); return View("MediaItems", viewModel);
}
return new ShapeResult(this, model);
} [Themed(false)]
public ActionResult MediaItem(int id, string displayType = "SummaryAdmin") {
[HttpPost] var contentItem = Services.ContentManager.Get(id, VersionOptions.Latest);
public ActionResult Delete(int[] mediaItemIds) {
if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent, T("Couldn't delete media items"))) if (contentItem == null)
return new HttpUnauthorizedResult(); return HttpNotFound();
try { if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent, contentItem, T("Cannot edit media")))
foreach (var media in Services.ContentManager.Query(VersionOptions.Latest).ForContentItems(mediaItemIds).List()) { return new HttpUnauthorizedResult();
if (media != null) {
Services.ContentManager.Remove(media); dynamic model = Services.ContentManager.BuildDisplay(contentItem, displayType);
}
} return new ShapeResult(this, model);
}
return Json(true);
} [HttpPost]
catch(Exception e) { public ActionResult Delete(int[] mediaItemIds) {
Logger.Error(e, "Could not delete media items."); if (!Services.Authorizer.Authorize(Permissions.ManageMediaContent, T("Couldn't delete media items")))
return Json(false); return new HttpUnauthorizedResult();
}
} try {
foreach (var media in Services.ContentManager.Query(VersionOptions.Latest).ForContentItems(mediaItemIds).List()) {
private FolderHierarchy GetFolderHierarchy(MediaFolder root) { if (media != null) {
Argument.ThrowIfNull(root, "root"); Services.ContentManager.Remove(media);
return new FolderHierarchy(root) {Children = _mediaLibraryService.GetMediaFolders(root.MediaPath).Select(GetFolderHierarchy)}; }
} }
}
return Json(true);
}
catch(Exception e) {
Logger.Error(e, "Could not delete media items.");
return Json(false);
}
}
private FolderHierarchy GetFolderHierarchy(MediaFolder root) {
Argument.ThrowIfNull(root, "root");
return new FolderHierarchy(root) {Children = _mediaLibraryService.GetMediaFolders(root.MediaPath).Select(GetFolderHierarchy)};
}
}
} }

View File

@@ -1,395 +1,396 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion> <ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{73A7688A-5BD3-4F7E-ADFA-CE36C5A10E3B}</ProjectGuid> <ProjectGuid>{73A7688A-5BD3-4F7E-ADFA-CE36C5A10E3B}</ProjectGuid>
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids> <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Orchard.MediaLibrary</RootNamespace> <RootNamespace>Orchard.MediaLibrary</RootNamespace>
<AssemblyName>Orchard.MediaLibrary</AssemblyName> <AssemblyName>Orchard.MediaLibrary</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion> <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<MvcBuildViews>false</MvcBuildViews> <MvcBuildViews>false</MvcBuildViews>
<FileUpgradeFlags> <FileUpgradeFlags>
</FileUpgradeFlags> </FileUpgradeFlags>
<OldToolsVersion>4.0</OldToolsVersion> <OldToolsVersion>4.0</OldToolsVersion>
<UpgradeBackupLocation /> <UpgradeBackupLocation />
<TargetFrameworkProfile /> <TargetFrameworkProfile />
<UseIISExpress>false</UseIISExpress> <UseIISExpress>false</UseIISExpress>
<IISExpressSSLPort /> <IISExpressSSLPort />
<IISExpressAnonymousAuthentication /> <IISExpressAnonymousAuthentication />
<IISExpressWindowsAuthentication /> <IISExpressWindowsAuthentication />
<IISExpressUseClassicPipelineMode /> <IISExpressUseClassicPipelineMode />
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\</OutputPath> <OutputPath>bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit> <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<OutputPath>bin\</OutputPath> <OutputPath>bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit> <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\lib\newtonsoft.json\Newtonsoft.Json.dll</HintPath> <HintPath>..\..\..\..\lib\newtonsoft.json\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.ComponentModel.DataAnnotations"> <Reference Include="System.ComponentModel.DataAnnotations">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.Web.ApplicationServices" /> <Reference Include="System.Web.ApplicationServices" />
<Reference Include="System.Web.DynamicData" /> <Reference Include="System.Web.DynamicData" />
<Reference Include="System.Web.Entity" /> <Reference Include="System.Web.Entity" />
<Reference Include="System.Web.Extensions" /> <Reference Include="System.Web.Extensions" />
<Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> <Reference Include="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\lib\aspnetmvc\System.Web.Mvc.dll</HintPath> <HintPath>..\..\..\..\lib\aspnetmvc\System.Web.Mvc.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Web" /> <Reference Include="System.Web" />
<Reference Include="System.Web.Abstractions" /> <Reference Include="System.Web.Abstractions" />
<Reference Include="System.Web.Routing" /> <Reference Include="System.Web.Routing" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="System.Configuration" /> <Reference Include="System.Configuration" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="Scripts\knockout-2.3.0.js" /> <Content Include="Scripts\knockout-2.3.0.js" />
<Content Include="Scripts\media-library.js" /> <Content Include="Scripts\media-library.js" />
<Content Include="Scripts\modal-window.js" /> <Content Include="Scripts\modal-window.js" />
<Content Include="Scripts\history.js" /> <Content Include="Scripts\history.js" />
<Content Include="Styles\font-awesome\css\font-awesome.css" /> <Content Include="Styles\font-awesome\css\font-awesome.css" />
<Content Include="Styles\font-awesome\css\font-awesome.min.css" /> <Content Include="Styles\font-awesome\css\font-awesome.min.css" />
<Content Include="Styles\font-awesome\font\fontawesome-webfont.svg" /> <Content Include="Styles\font-awesome\font\fontawesome-webfont.svg" />
<Content Include="Styles\Images\menu.media.png" /> <Content Include="Styles\Images\menu.media.png" />
<Content Include="Styles\menu.media-library-admin.css" /> <Content Include="Styles\menu.media-library-admin.css" />
<Content Include="Styles\menu.oembed-mediaproviders.css" /> <Content Include="Styles\menu.oembed-mediaproviders.css" />
<Content Include="Styles\orchard-oembed-admin.css" /> <Content Include="Styles\orchard-oembed-admin.css" />
<Content Include="Styles\menu.websearch-mediaproviders.css" /> <Content Include="Styles\menu.websearch-mediaproviders.css" />
<Content Include="Styles\menu.clientstorage-mediaproviders.css" /> <Content Include="Styles\menu.clientstorage-mediaproviders.css" />
<Content Include="Styles\dialog-mode.css" /> <Content Include="Styles\dialog-mode.css" />
<Content Include="Styles\media-library-picker-admin.css" /> <Content Include="Styles\media-library-picker-admin.css" />
<Content Include="Styles\Images\folders-loader.gif" /> <Content Include="Styles\Images\folders-loader.gif" />
<Content Include="Styles\Images\loading.gif" /> <Content Include="Styles\Images\loading.gif" />
<Content Include="Styles\Images\processing.gif" /> <Content Include="Styles\Images\processing.gif" />
<Content Include="Styles\orchard-clientstorage-admin.css" /> <Content Include="Styles\orchard-clientstorage-admin.css" />
<Content Include="Styles\Images\ajax-loader.gif" /> <Content Include="Styles\Images\ajax-loader.gif" />
<Content Include="Styles\orchard-websearch-admin.css" /> <Content Include="Styles\orchard-websearch-admin.css" />
<Content Include="Styles\orchard-mediaproviders-admin.css" /> <Content Include="Styles\orchard-mediaproviders-admin.css" />
<Content Include="Styles\orchard-medialibrary-admin.css" /> <Content Include="Styles\orchard-medialibrary-admin.css" />
<Content Include="Web.config"> <Content Include="Web.config">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</Content> </Content>
<Content Include="Scripts\Web.config" /> <Content Include="Scripts\Web.config" />
<Content Include="Styles\Web.config" /> <Content Include="Styles\Web.config" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Content Include="Module.txt" /> <Content Include="Module.txt" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\Orchard\Orchard.Framework.csproj"> <ProjectReference Include="..\..\..\Orchard\Orchard.Framework.csproj">
<Project>{2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6}</Project> <Project>{2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6}</Project>
<Name>Orchard.Framework</Name> <Name>Orchard.Framework</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\..\Core\Orchard.Core.csproj"> <ProjectReference Include="..\..\Core\Orchard.Core.csproj">
<Project>{9916839C-39FC-4CEB-A5AF-89CA7E87119F}</Project> <Project>{9916839C-39FC-4CEB-A5AF-89CA7E87119F}</Project>
<Name>Orchard.Core</Name> <Name>Orchard.Core</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\Orchard.Tokens\Orchard.Tokens.csproj"> <ProjectReference Include="..\Orchard.Tokens\Orchard.Tokens.csproj">
<Project>{6f759635-13d7-4e94-bcc9-80445d63f117}</Project> <Project>{6f759635-13d7-4e94-bcc9-80445d63f117}</Project>
<Name>Orchard.Tokens</Name> <Name>Orchard.Tokens</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Drivers\MediaLibraryExplorerPartDriver.cs" /> <Compile Include="Drivers\MediaLibraryExplorerPartDriver.cs" />
<Compile Include="ModalAdminFilter.cs" /> <Compile Include="ModalAdminFilter.cs" />
<Compile Include="AdminMenu.cs" /> <Compile Include="AdminMenu.cs" />
<Compile Include="Controllers\AdminController.cs" /> <Compile Include="Controllers\AdminController.cs" />
<Compile Include="Controllers\ClientStorageController.cs" /> <Compile Include="Controllers\ClientStorageController.cs" />
<Compile Include="Controllers\OEmbedController.cs" /> <Compile Include="Controllers\OEmbedController.cs" />
<Compile Include="Controllers\FolderController.cs" /> <Compile Include="Controllers\FolderController.cs" />
<Compile Include="Controllers\WebSearchController.cs" /> <Compile Include="Controllers\WebSearchController.cs" />
<Compile Include="Drivers\AudioPartDriver.cs" /> <Compile Include="Drivers\AudioPartDriver.cs" />
<Compile Include="Drivers\OEmbedPartDriver.cs" /> <Compile Include="Drivers\OEmbedPartDriver.cs" />
<Compile Include="Drivers\MediaLibraryPickerFieldDriver.cs" /> <Compile Include="Drivers\MediaLibraryPickerFieldDriver.cs" />
<Compile Include="Drivers\DocumentPartDriver.cs" /> <Compile Include="Drivers\DocumentPartDriver.cs" />
<Compile Include="Drivers\VideoPartDriver.cs" /> <Compile Include="Drivers\VideoPartDriver.cs" />
<Compile Include="Drivers\ImagePartDriver.cs" /> <Compile Include="Drivers\ImagePartDriver.cs" />
<Compile Include="Factories\AudioFactory.cs" /> <Compile Include="Factories\AudioFactory.cs" />
<Compile Include="Factories\DocumentFactory.cs" /> <Compile Include="Factories\DocumentFactory.cs" />
<Compile Include="Factories\VideoFactory.cs" /> <Compile Include="Factories\VideoFactory.cs" />
<Compile Include="Factories\ImageFactory.cs" /> <Compile Include="Factories\ImageFactory.cs" />
<Compile Include="Factories\IMediaFactory.cs" /> <Compile Include="Factories\IMediaFactory.cs" />
<Compile Include="Factories\IMediaFactorySelector.cs" /> <Compile Include="Factories\IMediaFactorySelector.cs" />
<Compile Include="Factories\MediaFactorySelectorResult.cs" /> <Compile Include="Factories\MediaFactorySelectorResult.cs" />
<Compile Include="Fields\MediaLibraryPickerField.cs" /> <Compile Include="Fields\MediaLibraryPickerField.cs" />
<Compile Include="Handlers\MediaLibraryPickerFieldHandler.cs" /> <Compile Include="Handlers\MediaLibraryPickerFieldHandler.cs" />
<Compile Include="Handlers\MediaPartHandler.cs" /> <Compile Include="Handlers\MediaPartHandler.cs" />
<Compile Include="Drivers\MediaPartDriver.cs" /> <Compile Include="Drivers\MediaPartDriver.cs" />
<Compile Include="Handlers\WebSearchSettingsPartHandler.cs" /> <Compile Include="Handlers\WebSearchSettingsPartHandler.cs" />
<Compile Include="Migrations.cs" /> <Compile Include="Migrations.cs" />
<Compile Include="Models\AudioPart.cs" /> <Compile Include="Models\AudioPart.cs" />
<Compile Include="Models\FolderHierarchy.cs" /> <Compile Include="Models\FolderHierarchy.cs" />
<Compile Include="Models\MediaFile.cs" /> <Compile Include="Models\MediaFile.cs" />
<Compile Include="Models\MediaFolder.cs" /> <Compile Include="Models\MediaFolder.cs" />
<Compile Include="Models\MediaLibraryExplorerPart.cs" /> <Compile Include="Models\MediaLibraryExplorerPart.cs" />
<Compile Include="Models\WebSearchSettingsPart.cs" /> <Compile Include="Models\WebSearchSettingsPart.cs" />
<Compile Include="Models\ImagePart.cs" /> <Compile Include="Models\ImagePart.cs" />
<Compile Include="Models\DocumentPart.cs" /> <Compile Include="Models\DocumentPart.cs" />
<Compile Include="Models\VideoPart.cs" /> <Compile Include="Models\VideoPart.cs" />
<Compile Include="Models\OEmbedPart.cs" /> <Compile Include="Models\OEmbedPart.cs" />
<Compile Include="Models\MediaPart.cs" /> <Compile Include="Models\MediaPart.cs" />
<Compile Include="Models\MediaPartRecord.cs" /> <Compile Include="Models\MediaPartRecord.cs" />
<Compile Include="Permissions.cs" /> <Compile Include="Permissions.cs" />
<Compile Include="Providers\ClientStorageMenu.cs" /> <Compile Include="Providers\ClientStorageMenu.cs" />
<Compile Include="Providers\OEmbedMenu.cs" /> <Compile Include="Providers\OEmbedMenu.cs" />
<Compile Include="Providers\WebSearchMenu.cs" /> <Compile Include="Providers\WebSearchMenu.cs" />
<Compile Include="ResourceManifest.cs" /> <Compile Include="ResourceManifest.cs" />
<Compile Include="Services\IMediaLibraryService.cs" /> <Compile Include="Services\IMediaLibraryService.cs" />
<Compile Include="Services\MediaLibraryService.cs" /> <Compile Include="Services\MediaLibraryService.cs" />
<Compile Include="Services\Shapes.cs" /> <Compile Include="Services\Shapes.cs" />
<Compile Include="Services\XmlRpcHandler.cs" /> <Compile Include="Services\XmlRpcHandler.cs" />
<Compile Include="Settings\MediaLibraryPickerFieldEditorEvents.cs" /> <Compile Include="Settings\MediaLibraryPickerFieldEditorEvents.cs" />
<Compile Include="Settings\MediaLibraryPickerFieldSettings.cs" /> <Compile Include="Settings\MediaLibraryPickerFieldSettings.cs" />
<Compile Include="Tokens\FieldTokens.cs" /> <Compile Include="Tokens\FieldTokens.cs" />
<Compile Include="ViewModels\ImportMediaViewModel.cs" /> <Compile Include="ViewModels\MediaManagerChildFoldersViewModel.cs" />
<Compile Include="ViewModels\MediaLibraryPickerFieldViewModel.cs" /> <Compile Include="ViewModels\ImportMediaViewModel.cs" />
<Compile Include="ViewModels\MediaManagerMediaItemsViewModel.cs" /> <Compile Include="ViewModels\MediaLibraryPickerFieldViewModel.cs" />
<Compile Include="ViewModels\MediaManagerFolderCreateViewModel.cs" /> <Compile Include="ViewModels\MediaManagerMediaItemsViewModel.cs" />
<Compile Include="ViewModels\MediaManagerFolderEditViewModel.cs" /> <Compile Include="ViewModels\MediaManagerFolderCreateViewModel.cs" />
<Compile Include="ViewModels\MediaManagerImportViewModel.cs" /> <Compile Include="ViewModels\MediaManagerFolderEditViewModel.cs" />
<Compile Include="ViewModels\MediaManagerIndexViewModel.cs" /> <Compile Include="ViewModels\MediaManagerImportViewModel.cs" />
<Compile Include="ViewModels\OEmbedViewModel.cs" /> <Compile Include="ViewModels\MediaManagerIndexViewModel.cs" />
</ItemGroup> <Compile Include="ViewModels\OEmbedViewModel.cs" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Admin\Index.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Admin\Index.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Admin\MediaManagerFolder.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media.Edit.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media.Edit.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\ClientStorage\Index.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\ClientStorage\Index.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Admin\Import.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Admin\Import.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\WebSearch\Index.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\WebSearch\Index.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Folder\Create.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Folder\Create.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Folder\Edit.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Folder\Edit.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media-Image.Thumbnail.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media-Image.Thumbnail.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media.Thumbnail.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media.Thumbnail.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Admin\MediaItems.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Admin\MediaItems.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media-Video.Thumbnail.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media-Video.Thumbnail.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Media.SummaryAdmin.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Media.SummaryAdmin.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Placement.info">
<ItemGroup> <SubType>Designer</SubType>
<Content Include="Placement.info"> </Content>
<SubType>Designer</SubType> </ItemGroup>
</Content> <ItemGroup>
</ItemGroup> <Content Include="Views\EditorTemplates\Parts.Media.Edit.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\EditorTemplates\Parts.Media.Edit.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Image.SummaryAdmin.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Image.SummaryAdmin.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Image.Metadata.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Image.Metadata.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Media.Actions.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Media.Actions.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media.SummaryAdmin.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media.SummaryAdmin.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Video.Metadata.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Video.Metadata.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Video.SummaryAdmin.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Video.SummaryAdmin.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media-Audio.Thumbnail.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media-Audio.Thumbnail.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media-Document.Thumbnail.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media-Document.Thumbnail.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Audio.Metadata.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Audio.Metadata.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Audio.SummaryAdmin.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Audio.SummaryAdmin.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Document.Metadata.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Document.Metadata.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Document.SummaryAdmin.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Document.SummaryAdmin.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\DefinitionTemplates\MediaLibraryPickerFieldSettings.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\DefinitionTemplates\MediaLibraryPickerFieldSettings.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\EditorTemplates\Fields\MediaLibraryPicker.Edit.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\EditorTemplates\Fields\MediaLibraryPicker.Edit.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Fields\MediaLibraryPicker.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Fields\MediaLibraryPicker.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Fields\MediaLibraryPicker.SummaryAdmin.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Fields\MediaLibraryPicker.SummaryAdmin.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Audio.Summary.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Audio.Summary.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Document.Summary.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Document.Summary.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Image.Summary.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Image.Summary.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Video.Summary.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Video.Summary.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Audio.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Audio.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Document.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Document.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Image.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Image.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\Video.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\Video.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\OEmbed\Index.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\OEmbed\Index.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\OEmbed.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\OEmbed.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\OEmbed.Metadata.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\OEmbed.Metadata.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\OEmbed.Summary.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\OEmbed.Summary.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\OEmbed.SummaryAdmin.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\OEmbed.SummaryAdmin.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media-OEmbed.Thumbnail.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media-OEmbed.Thumbnail.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\EditorTemplates\Parts\WebSearch.WebSearchSettings.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\EditorTemplates\Parts\WebSearch.WebSearchSettings.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media.Raw.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media.Raw.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Styles\font-awesome\font\fontawesome-webfont.eot" />
<ItemGroup> <Content Include="Styles\font-awesome\font\fontawesome-webfont.ttf" />
<Content Include="Styles\font-awesome\font\fontawesome-webfont.eot" /> <Content Include="Styles\font-awesome\font\fontawesome-webfont.woff" />
<Content Include="Styles\font-awesome\font\fontawesome-webfont.ttf" /> <Content Include="Styles\font-awesome\font\FontAwesome.otf" />
<Content Include="Styles\font-awesome\font\fontawesome-webfont.woff" /> </ItemGroup>
<Content Include="Styles\font-awesome\font\FontAwesome.otf" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Media.Summary.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Media.Summary.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\MediaLibrary.Actions.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\MediaLibrary.Actions.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Parts\MediaLibrary.Navigation.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Parts\MediaLibrary.Navigation.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Fields\MediaLibraryPicker.Summary.cshtml" />
<ItemGroup> </ItemGroup>
<Content Include="Views\Fields\MediaLibraryPicker.Summary.cshtml" /> <ItemGroup>
</ItemGroup> <Content Include="Views\Admin\ChildFolders.cshtml" />
<PropertyGroup> </ItemGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> <PropertyGroup>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
</PropertyGroup> <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<PropertyGroup> </PropertyGroup>
<ApplicationManifest>Styles\orchard-medialibrary-admin.css</ApplicationManifest> <PropertyGroup>
</PropertyGroup> <ApplicationManifest>Styles\orchard-medialibrary-admin.css</ApplicationManifest>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> </PropertyGroup>
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" /> <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
Other similar extension points exist, see Microsoft.Common.targets. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
<Target Name="BeforeBuild"> Other similar extension points exist, see Microsoft.Common.targets.
</Target> --> <Target Name="BeforeBuild">
<Target Name="AfterBuild" DependsOnTargets="AfterBuildCompiler"> </Target> -->
<PropertyGroup> <Target Name="AfterBuild" DependsOnTargets="AfterBuildCompiler">
<AreasManifestDir>$(ProjectDir)\..\Manifests</AreasManifestDir> <PropertyGroup>
</PropertyGroup> <AreasManifestDir>$(ProjectDir)\..\Manifests</AreasManifestDir>
<!-- If this is an area child project, uncomment the following line: </PropertyGroup>
<CreateAreaManifest AreaName="$(AssemblyName)" AreaType="Child" AreaPath="$(ProjectDir)" ManifestPath="$(AreasManifestDir)" ContentFiles="@(Content)" /> <!-- If this is an area child project, uncomment the following line:
--> <CreateAreaManifest AreaName="$(AssemblyName)" AreaType="Child" AreaPath="$(ProjectDir)" ManifestPath="$(AreasManifestDir)" ContentFiles="@(Content)" />
<!-- If this is an area parent project, uncomment the following lines: -->
<CreateAreaManifest AreaName="$(AssemblyName)" AreaType="Parent" AreaPath="$(ProjectDir)" ManifestPath="$(AreasManifestDir)" ContentFiles="@(Content)" /> <!-- If this is an area parent project, uncomment the following lines:
<CopyAreaManifests ManifestPath="$(AreasManifestDir)" CrossCopy="false" RenameViews="true" /> <CreateAreaManifest AreaName="$(AssemblyName)" AreaType="Parent" AreaPath="$(ProjectDir)" ManifestPath="$(AreasManifestDir)" ContentFiles="@(Content)" />
--> <CopyAreaManifests ManifestPath="$(AreasManifestDir)" CrossCopy="false" RenameViews="true" />
</Target> -->
<Target Name="AfterBuildCompiler" Condition="'$(MvcBuildViews)'=='true'"> </Target>
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" /> <Target Name="AfterBuildCompiler" Condition="'$(MvcBuildViews)'=='true'">
</Target> <AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
<ProjectExtensions> </Target>
<VisualStudio> <ProjectExtensions>
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}"> <VisualStudio>
<WebProjectProperties> <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
<UseIIS>False</UseIIS> <WebProjectProperties>
<AutoAssignPort>True</AutoAssignPort> <UseIIS>False</UseIIS>
<DevelopmentServerPort>45979</DevelopmentServerPort> <AutoAssignPort>True</AutoAssignPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath> <DevelopmentServerPort>45979</DevelopmentServerPort>
<IISUrl> <DevelopmentServerVPath>/</DevelopmentServerVPath>
</IISUrl> <IISUrl>
<NTLMAuthentication>False</NTLMAuthentication> </IISUrl>
<UseCustomServer>True</UseCustomServer> <NTLMAuthentication>False</NTLMAuthentication>
<CustomServerUrl>http://orchard.codeplex.com</CustomServerUrl> <UseCustomServer>True</UseCustomServer>
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile> <CustomServerUrl>http://orchard.codeplex.com</CustomServerUrl>
</WebProjectProperties> <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
</FlavorProperties> </WebProjectProperties>
</VisualStudio> </FlavorProperties>
</ProjectExtensions> </VisualStudio>
</ProjectExtensions>
</Project> </Project>

View File

@@ -79,7 +79,29 @@ $(function () {
self.pendingRequest = ko.observable(false); self.pendingRequest = ko.observable(false);
self.mediaItemsCount = 0; self.mediaItemsCount = 0;
self.orderMedia = ko.observableArray(['created']); self.orderMedia = ko.observableArray(['created']);
self.mediaType = ko.observableArray([]); self.mediaType = ko.observableArray([]);
self.mediaFolders = ko.observableArray([]);
(function () {
var getChildFolderListUrl = function (f) {
return settings.childFolderListingActionUrl + '?folderPath=' + encodeURIComponent(f);
};
var url = getChildFolderListUrl(settings.folderPath);
$.ajax({
type: "GET",
url: url,
cache: false
}).done(function (data) {
var childFolders = data.childFolders;
for (var x = 0; x < childFolders.length; x++) {
self.mediaFolders.push(new mediaFolderViewModel(childFolders[x]));
}
}).fail(function (data) {
console.error(data);
});
})();
self.getMediaItems = function (count, append) { self.getMediaItems = function (count, append) {
var folderPath = self.displayed() || ''; var folderPath = self.displayed() || '';
@@ -164,7 +186,6 @@ $(function () {
}); });
self.displayFolder = function(folderPath) { self.displayFolder = function(folderPath) {
self.results([]); self.results([]);
self.displayed(folderPath); self.displayed(folderPath);
@@ -172,10 +193,10 @@ $(function () {
return settings.mediaItemsActionUrl + '?folderPath=' + encodeURIComponent(f) + '&skip=' + skip + '&count=' + count + '&order=' + order + '&mediaType=' + mediaType; return settings.mediaItemsActionUrl + '?folderPath=' + encodeURIComponent(f) + '&skip=' + skip + '&count=' + count + '&order=' + order + '&mediaType=' + mediaType;
}; };
self.getMediaItems(pageCount); self.getMediaItems(pageCount);
}; };
self.selectFolder = function(folderPath) { self.selectFolder = function (folderPath) {
History.pushState({ action: 'displayFolder', folderPath: folderPath }, '', '?folderPath=' + folderPath); History.pushState({ action: 'displayFolder', folderPath: folderPath }, '', '?folderPath=' + folderPath);
self.displayFolder(folderPath); self.displayFolder(folderPath);
}; };
@@ -242,6 +263,73 @@ $(function () {
var viewModel = new mediaIndexViewModel(); var viewModel = new mediaIndexViewModel();
function mediaFolderViewModel(data) {
var self = this;
self.mediaIndexViewModel = viewModel;
self.folderPath = ko.observable(data.folderPath);
self.name = ko.observable(data.name);
self.childFolders = ko.observableArray([]);
self.childFoldersFetchStatus = 0; //0 = unfetched, 1 = fetching, 2 = fetched
self.isExpanded = ko.observable(false);
self.isVisible = ko.observable(true);
self.isSelected = ko.computed(function() {
return (self.mediaIndexViewModel.displayed() == self.folderPath());
});
self.folderClicked = function () {
self.mediaIndexViewModel.selectFolder(self.folderPath());
var childFolders = self.childFolders();
if (self.isExpanded()) {
for (var x = 0; x < childFolders.length; x++) {
childFolders[x].isVisible(false);
}
self.isExpanded(false);
} else {
if (self.childFoldersFetchStatus !== 0) {
for (var x = 0; x < childFolders.length; x++) {
childFolders[x].isVisible(true);
}
} else {
self.childFoldersFetchStatus = 1;
var getChildFolderListUrl = function (f) {
return settings.childFolderListingActionUrl + '?folderPath=' + encodeURIComponent(f);
};
var url = getChildFolderListUrl(self.folderPath());
$.ajax({
type: "GET",
url: url,
cache: false
}).done(function (data) {
var newChildFolders = data.childFolders;
for (var y = 0; y < newChildFolders.length; y++) {
var newChildFolder = new mediaFolderViewModel(newChildFolders[y]);
newChildFolder.isVisible(true);
self.childFolders.push(newChildFolder);
}
self.childFoldersFetchStatus = 2;
}).fail(function (data) {
console.error(data);
self.childFoldersFetchStatus = 0;
});
}
self.isExpanded(true);
}
};
}
enhanceViewModel(viewModel); enhanceViewModel(viewModel);
ko.applyBindings(viewModel); ko.applyBindings(viewModel);
@@ -271,7 +359,7 @@ $(function () {
// only for left click // only for left click
if (e.which != 1) { if (e.which != 1) {
return; return;
} }
var searchResult = ko.dataFor(this); var searchResult = ko.dataFor(this);
if (e.ctrlKey) { if (e.ctrlKey) {

View File

@@ -0,0 +1,8 @@
using System.Collections.Generic;
using Orchard.MediaLibrary.Models;
namespace Orchard.MediaLibrary.ViewModels {
public class MediaManagerChildFoldersViewModel {
public IEnumerable<MediaFolder> Children { get; set; }
}
}

View File

@@ -4,7 +4,6 @@ using Orchard.MediaLibrary.Models;
namespace Orchard.MediaLibrary.ViewModels { namespace Orchard.MediaLibrary.ViewModels {
public class MediaManagerIndexViewModel { public class MediaManagerIndexViewModel {
public IEnumerable<FolderHierarchy> Folders { get; set; }
public string FolderPath { get; set; } public string FolderPath { get; set; }
public bool DialogMode { get; set; } public bool DialogMode { get; set; }
public IEnumerable<ContentTypeDefinition> MediaTypes { get; set; } public IEnumerable<ContentTypeDefinition> MediaTypes { get; set; }

View File

@@ -0,0 +1,15 @@
@using Orchard.Utility.Extensions
@model Orchard.MediaLibrary.ViewModels.MediaManagerChildFoldersViewModel
@{
Response.ContentType = "text/json";
@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(
new {
childFolders = Model.Children.Select(x => new {
folderPath = x.MediaPath,
name = x.Name,
lastUpdated = x.LastUpdated
}).ToArray()
}))
}

View File

@@ -1,109 +1,116 @@
@model Orchard.MediaLibrary.ViewModels.MediaManagerIndexViewModel @model Orchard.MediaLibrary.ViewModels.MediaManagerIndexViewModel
@{ @{
var viewModel = Model; var viewModel = Model;
Script.Require("ShapesBase"); Script.Require("ShapesBase");
Style.Require("MediaManagerAdmin"); Style.Require("MediaManagerAdmin");
Script.Require("jQuery"); Script.Require("jQuery");
Script.Require("jQueryUI_Droppable"); Script.Require("jQueryUI_Droppable");
Script.Include("knockout-2.3.0.js"); Script.Include("knockout-2.3.0.js");
Script.Include("history.js"); Script.Include("history.js");
Script.Include("media-library.js"); Script.Include("media-library.js");
Style.Require("FontAwesome"); Style.Require("FontAwesome");
Layout.Title = T("Media Library"); Layout.Title = T("Media Library");
} }
<div id="media-library" data-draft-text="@T("Draft")"> <div id="media-library" data-draft-text="@T("Draft")">
<div id="media-library-toolbar"> <div id="media-library-toolbar">
<a href="#" data-bind="visible: displayed(), click: importMedia" class="button" id="button-import">@T("Import")</a> <a href="#" data-bind="visible: displayed(), click: importMedia" class="button" id="button-import">@T("Import")</a>
<a href="#" data-bind="visible: displayed(), attr: { href: '@HttpUtility.JavaScriptStringEncode(Url.Action("Edit", "Folder", new { area = "Orchard.MediaLibrary"}))?folderPath=' + encodeURIComponent(displayed()) }" class="button" id="button-edit-folder">@T("Edit Folder")</a> <a href="#" data-bind="visible: displayed(), attr: { href: '@HttpUtility.JavaScriptStringEncode(Url.Action("Edit", "Folder", new { area = "Orchard.MediaLibrary"}))?folderPath=' + encodeURIComponent(displayed()) }" class="button" id="button-edit-folder">@T("Edit Folder")</a>
<a href="#" data-bind="attr: { href: '@HttpUtility.JavaScriptStringEncode(Url.Action("Create", "Folder", new { area = "Orchard.MediaLibrary"}))?folderPath=' + encodeURIComponent(displayed() ? displayed() : '') }" class="button" id="button-create-folder">@T("Create Folder")</a> <a href="#" data-bind="attr: { href: '@HttpUtility.JavaScriptStringEncode(Url.Action("Create", "Folder", new { area = "Orchard.MediaLibrary"}))?folderPath=' + encodeURIComponent(displayed() ? displayed() : '') }" class="button" id="button-create-folder">@T("Create Folder")</a>
@Display(Model.CustomActionsShapes) @Display(Model.CustomActionsShapes)
</div> </div>
<div id="media-library-main"> <div id="media-library-main">
<div id="media-library-main-navigation"> <div id="media-library-main-navigation">
<ul> <ul>
@Display(Model.CustomNavigationShapes) @Display(Model.CustomNavigationShapes)
<li id="media-library-main-navigation-tree"> <li id="media-library-main-navigation-tree">
<ul> <ul data-bind="template: { name: 'media-folder-template', foreach: mediaFolders }">
@foreach (var folder in viewModel.Folders) { </ul>
<li> </li>
@Display.Partial(TemplateName: "MediaManagerFolder", Model: folder) </ul>
</li> </div>
} <div id="media-library-main-list-wrapper">
</ul> <div id="media-library-main-list" data-bind="event: { scroll: scrolled }, css: { pending: pendingRequest() }">
</li> <ul data-bind="foreach: results">
</ul> <li data-bind="css: cssClass">
</div> <div class="thumbnail" data-bind="html: data.thumbnail">
<div id="media-library-main-list-wrapper"> </div>
<div id="media-library-main-list" data-bind="event: { scroll: scrolled }, css: { pending: pendingRequest() }"> <div class="media-library-main-list-overlay">
<ul data-bind="foreach: results"> <p class="title" data-bind="text: data.title"></p>
<li data-bind="css: cssClass"> <p class="publication-status" data-bind="text: publicationStatus"></p>
<div class="thumbnail" data-bind="html: data.thumbnail"> </div>
</div> </li>
<div class="media-library-main-list-overlay"> </ul>
<p class="title" data-bind="text: data.title"></p> </div>
<p class="publication-status" data-bind="text: publicationStatus"></p> </div>
</div> <div id="media-library-main-editor">
</li> <div id="media-library-main-editor-focus" data-bind="with: focus">
</ul> <h1>@T("PROPERTIES")</h1>
</div> <div class="summary" data-bind="html: summary">
</div>
<div id="media-library-main-editor"> </div>
<div id="media-library-main-editor-focus" data-bind="with: focus"> </div>
<h1>@T("PROPERTIES")</h1> <article>
<div class="summary" data-bind="html: summary"> <header>
<div id="media-library-main-selection" data-bind="visible: selection().length > 0">
</div> <h1>@T("SELECTION")</h1>
</div> <ul data-bind="foreach: selection">
<article> <li data-bind="css: cssClass">
<header> <div class="thumbnail selection" data-bind="html: data.thumbnail, click: $parent.focus">
<div id="media-library-main-selection" data-bind="visible: selection().length > 0"> </div>
<h1>@T("SELECTION")</h1> </li>
<ul data-bind="foreach: selection"> </ul>
<li data-bind="css: cssClass"> <div id="media-library-main-selection-actions">
<div class="thumbnail selection" data-bind="html: data.thumbnail, click: $parent.focus"> <button id="delete-selection-button">@T("Delete")</button>
</div> </div>
</li> </div>
</ul> </header>
<div id="media-library-main-selection-actions"> <footer>
<button id="delete-selection-button">@T("Delete")</button> <div id="media-library-main-selection-select">
</div> <button class="button-select" data-bind="visible: selection().length > 0">@T("Select")</button>
</div> <button class="button-cancel">@T("Cancel")</button>
</header> </div>
<footer> </footer>
<div id="media-library-main-selection-select"> </article>
<button class="button-select" data-bind="visible: selection().length > 0">@T("Select")</button> </div>
<button class="button-cancel">@T("Cancel")</button> </div>
</div> </div>
</footer>
</article>
</div> @using (Script.Foot()) {
</div> <script type="text/javascript">
</div> //<![CDATA[
var mediaLibrarySettings = {
mediaItemActionUrl: '@HttpUtility.JavaScriptStringEncode(Url.Action("MediaItem", "Admin"))',
@using (Script.Foot()) { mediaItemsActionUrl: '@HttpUtility.JavaScriptStringEncode(Url.Action("MediaItems", "Admin"))',
<script type="text/javascript"> recentMediaItemsActionUrl: '@HttpUtility.JavaScriptStringEncode(Url.Action("RecentMediaItems", "Admin"))',
//<![CDATA[ childFolderListingActionUrl: '@HttpUtility.JavaScriptStringEncode(Url.Action("ChildFolders", "Admin"))',
var mediaLibrarySettings = { importActionUrl: '@HttpUtility.JavaScriptStringEncode(Url.Action("Import", "Admin"))',
mediaItemActionUrl: '@HttpUtility.JavaScriptStringEncode(Url.Action("MediaItem", "Admin"))', moveActionUrl: '@Url.Action("Move", "Folder", new {area = "Orchard.MediaLibrary"})',
mediaItemsActionUrl: '@HttpUtility.JavaScriptStringEncode(Url.Action("MediaItems", "Admin"))', deleteActionUrl: '@Url.Action("Delete", "Admin", new {area = "Orchard.MediaLibrary"})',
recentMediaItemsActionUrl: '@HttpUtility.JavaScriptStringEncode(Url.Action("RecentMediaItems", "Admin"))', hasFolderPath: @(viewModel.FolderPath != null ? "true" : "false"),
importActionUrl: '@HttpUtility.JavaScriptStringEncode(Url.Action("Import", "Admin"))', folderPath: '@HttpUtility.JavaScriptStringEncode(viewModel.FolderPath)',
moveActionUrl: '@Url.Action("Move", "Folder", new {area = "Orchard.MediaLibrary"})', deleteConfirmationMessage: '@HttpUtility.JavaScriptStringEncode(T("Are you sure you want to delete these media items ?").Text)',
deleteActionUrl: '@Url.Action("Delete", "Admin", new {area = "Orchard.MediaLibrary"})', errorMessage: '@HttpUtility.JavaScriptStringEncode(T("An unexpected error occured, please refresh the page and try again.").Text)',
hasFolderPath: @(viewModel.FolderPath != null ? "true" : "false"), antiForgeryToken: '@Html.AntiForgeryTokenValueOrchard()'
folderPath: '@HttpUtility.JavaScriptStringEncode(viewModel.FolderPath)', };
deleteConfirmationMessage: '@HttpUtility.JavaScriptStringEncode(T("Are you sure you want to delete these media items ?").Text)', //]]>
errorMessage: '@HttpUtility.JavaScriptStringEncode(T("An unexpected error occured, please refresh the page and try again.").Text)', </script>
antiForgeryToken: '@Html.AntiForgeryTokenValueOrchard()' <script type="text/html" id="media-folder-template">
}; <li data-bind="visible: isVisible()">
//]]> <div class="media-library-folder">
</script> <div class="media-library-folder-title" data-bind="click: folderClicked, css: { selected: isSelected() }">
<a data-bind="disable: $root.pendingRequest" href="#" class="media-library-navigation-folder-link"><i data-bind="css: {'icon-folder-open-alt': isExpanded(), 'icon-folder-close-alt': !isExpanded()}"></i><span data-bind="text: name"></span></a>
</div>
<ul data-bind="template: { name: 'media-folder-template', foreach: childFolders }, visible: childFolders().length > 0">
</ul>
</div>
</li>
</script>
} }

View File

@@ -1,16 +0,0 @@
@model Orchard.MediaLibrary.Models.FolderHierarchy
<div class="media-library-folder">
<div class="media-library-folder-title" data-bind="click: function(data, event) { selectFolder('@HttpUtility.JavaScriptStringEncode(Model.Root.MediaPath)'); }, css: { selected: displayed() == $element.getAttribute('data-media-path') }" data-media-path="@Model.Root.MediaPath" >
<a data-bind="disable: $root.pendingRequest" href="#" class="media-library-navigation-folder-link" data-mediapath="@Model.Root.MediaPath"><i class="icon-folder-close-alt"></i>@Model.Root.Name</a>
</div>
@if (Model.Children.Any()) {
<ul>
@foreach (var folder in Model.Children) {
<li>
@Display.Partial(TemplateName: "MediaManagerFolder", Model: folder)
</li>
}
</ul>
}
</div>