webdav portal search added

This commit is contained in:
vfedosevich 2015-02-24 06:43:38 -08:00
parent cc16aca8d0
commit 82a9151241
24 changed files with 807 additions and 413 deletions

View file

@ -73,6 +73,8 @@ namespace WebsitePanel.EnterpriseServer {
private System.Threading.SendOrPostCallback UpdateWebDavPortalUserSettingsOperationCompleted;
private System.Threading.SendOrPostCallback SearchFilesOperationCompleted;
private System.Threading.SendOrPostCallback GetDirectoryBrowseEnabledOperationCompleted;
private System.Threading.SendOrPostCallback SetDirectoryBrowseEnabledOperationCompleted;
@ -155,6 +157,9 @@ namespace WebsitePanel.EnterpriseServer {
/// <remarks/>
public event UpdateWebDavPortalUserSettingsCompletedEventHandler UpdateWebDavPortalUserSettingsCompleted;
/// <remarks/>
public event SearchFilesCompletedEventHandler SearchFilesCompleted;
/// <remarks/>
public event GetDirectoryBrowseEnabledCompletedEventHandler GetDirectoryBrowseEnabledCompleted;
@ -1022,6 +1027,59 @@ namespace WebsitePanel.EnterpriseServer {
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SearchFiles", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public SystemFile[] SearchFiles(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive) {
object[] results = this.Invoke("SearchFiles", new object[] {
itemId,
searchPath,
searchText,
userPrincipalName,
recursive});
return ((SystemFile[])(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginSearchFiles(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("SearchFiles", new object[] {
itemId,
searchPath,
searchText,
userPrincipalName,
recursive}, callback, asyncState);
}
/// <remarks/>
public SystemFile[] EndSearchFiles(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((SystemFile[])(results[0]));
}
/// <remarks/>
public void SearchFilesAsync(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive) {
this.SearchFilesAsync(itemId, searchPath, searchText, userPrincipalName, recursive, null);
}
/// <remarks/>
public void SearchFilesAsync(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive, object userState) {
if ((this.SearchFilesOperationCompleted == null)) {
this.SearchFilesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSearchFilesOperationCompleted);
}
this.InvokeAsync("SearchFiles", new object[] {
itemId,
searchPath,
searchText,
userPrincipalName,
recursive}, this.SearchFilesOperationCompleted, userState);
}
private void OnSearchFilesOperationCompleted(object arg) {
if ((this.SearchFilesCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.SearchFilesCompleted(this, new SearchFilesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetDirectoryBrowseEnabled", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public bool GetDirectoryBrowseEnabled(int itemId, string site) {
@ -1935,6 +1993,32 @@ namespace WebsitePanel.EnterpriseServer {
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void UpdateWebDavPortalUserSettingsCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void SearchFilesCompletedEventHandler(object sender, SearchFilesCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class SearchFilesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal SearchFilesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public SystemFile[] Result {
get {
this.RaiseExceptionIfNecessary();
return ((SystemFile[])(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void GetDirectoryBrowseEnabledCompletedEventHandler(object sender, GetDirectoryBrowseEnabledCompletedEventArgs e);

View file

@ -172,6 +172,50 @@ namespace WebsitePanel.EnterpriseServer
return ObjectUtils.FillObjectFromDataReader<WebDavAccessToken>(DataProvider.GetWebDavAccessTokenByAccessToken(accessToken));
}
public static SystemFile[] SearchFiles(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive)
{
try
{
// load organization
Organization org = OrganizationController.GetOrganization(itemId);
if (org == null)
{
return new SystemFile[0];
}
int serviceId = GetEnterpriseStorageServiceID(org.PackageId);
if (serviceId == 0)
{
return new SystemFile[0];
}
EnterpriseStorage es = GetEnterpriseStorage(serviceId);
var rootFolders = GetRootFolders(userPrincipalName).ToList();
var searchResult = es.Search(Path.Combine(org.OrganizationId, searchPath ?? string.Empty), searchText, userPrincipalName, recursive);
var result = new List<SystemFile>();
foreach (var systemFile in searchResult)
{
if (rootFolders.All(x => !systemFile.FullName.Contains(x.FullName)))
{
continue;
}
result.Add(systemFile);
}
return result.ToArray();
}
catch (Exception ex)
{
throw ex;
}
}
#region Directory Browsing
public static bool GetDirectoryBrowseEnabled(int itemId, string siteId)
@ -202,6 +246,33 @@ namespace WebsitePanel.EnterpriseServer
#endregion
private static IEnumerable<SystemFile> GetRootFolders(string userPrincipalName)
{
var rootFolders = new List<SystemFile>();
var account = ExchangeServerController.GetAccountByAccountName(userPrincipalName);
var userGroups = OrganizationController.GetSecurityGroupsByMember(account.ItemId, account.AccountId);
foreach (var folder in GetFolders(account.ItemId))
{
var permissions = GetFolderPermission(account.ItemId, folder.Name);
foreach (var permission in permissions)
{
if ((!permission.IsGroup
&& (permission.DisplayName == account.UserPrincipalName || permission.DisplayName == account.DisplayName))
|| (permission.IsGroup && userGroups.Any(x => x.DisplayName == permission.DisplayName)))
{
rootFolders.Add(folder);
break;
}
}
}
return rootFolders;
}
protected static void StartESBackgroundTaskInternal(string taskName, int itemId, SystemFile folder, ESPermission[] permissions, bool directoyBrowsingEnabled, int quota, QuotaType quotaType)
{
// load organization

View file

@ -170,6 +170,12 @@ namespace WebsitePanel.EnterpriseServer
EnterpriseStorageController.UpdateUserSettings(accountId,settings);
}
[WebMethod]
public SystemFile[] SearchFiles(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive)
{
return EnterpriseStorageController.SearchFiles(itemId, searchPath, searchText, userPrincipalName, recursive);
}
#region Directory Browsing
[WebMethod]

View file

@ -46,6 +46,6 @@ namespace WebsitePanel.Providers.EnterpriseStorage
bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules);
WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting);
bool CheckFileServicesInstallation();
SystemFile[] Search(string searchPath, string searchText, string userPrincipalName, bool recursive);
}
}

View file

@ -144,6 +144,8 @@ namespace WebsitePanel.Providers.OS
set { this.url = value; }
}
public string RelativeUrl { get; set; }
public string DriveLetter
{
get { return this.driveLetter; }

View file

@ -27,9 +27,12 @@
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System;
using System.Data.OleDb;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Principal;
using System.Text;
using Microsoft.Win32;
@ -62,6 +65,7 @@ namespace WebsitePanel.Providers.EnterpriseStorage
#endregion
#region Folders
public SystemFile[] GetFolders(string organizationId, WebDavSetting[] settings)
{
ArrayList items = new ArrayList();
@ -70,7 +74,8 @@ namespace WebsitePanel.Providers.EnterpriseStorage
foreach (var setting in webDavSettings)
{
string rootPath = string.Format("{0}:\\{1}\\{2}", setting.LocationDrive, setting.HomeFolder, organizationId);
string rootPath = string.Format("{0}:\\{1}\\{2}", setting.LocationDrive, setting.HomeFolder,
organizationId);
var windows = new WebsitePanel.Providers.OS.Windows2012();
@ -114,16 +119,17 @@ namespace WebsitePanel.Providers.EnterpriseStorage
}
}
return (SystemFile[])items.ToArray(typeof(SystemFile));
return (SystemFile[]) items.ToArray(typeof (SystemFile));
}
public SystemFile GetFolder(string organizationId, string folderName, WebDavSetting setting)
{
var webDavSetting = GetWebDavSetting(setting);
string fullName = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, folderName);
string fullName = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder,
organizationId, folderName);
SystemFile folder = null;
var windows = new WebsitePanel.Providers.OS.Windows2012();
if (Directory.Exists(fullName))
@ -151,7 +157,7 @@ namespace WebsitePanel.Providers.EnterpriseStorage
folder.FRSMQuotaGB = windows.ConvertMegaBytesToGB(folder.FRSMQuotaMB);
folder.FsrmQuotaType = quota.QuotaType;
}
return folder;
}
@ -159,17 +165,21 @@ namespace WebsitePanel.Providers.EnterpriseStorage
{
var webDavSetting = GetWebDavSetting(setting);
FileUtils.CreateDirectory(string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, folder));
FileUtils.CreateDirectory(string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive,
webDavSetting.HomeFolder, organizationId, folder));
}
public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting)
public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder,
WebDavSetting setting)
{
var webDavSetting = GetWebDavSetting(setting);
var oldPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, originalFolder);
var newPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, newFolder);
var oldPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder,
organizationId, originalFolder);
var newPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder,
organizationId, newFolder);
FileUtils.MoveFile(oldPath,newPath);
FileUtils.MoveFile(oldPath, newPath);
IWebDav webdav = new WebDav(webDavSetting);
@ -183,17 +193,20 @@ namespace WebsitePanel.Providers.EnterpriseStorage
{
var webDavSetting = GetWebDavSetting(setting);
string rootPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, folder);
string rootPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder,
organizationId, folder);
DirectoryInfo treeRoot = new DirectoryInfo(rootPath);
if (treeRoot.Exists)
{
DirectoryInfo[] dirs = treeRoot.GetDirectories();
while (dirs.Length > 0)
{
foreach (DirectoryInfo dir in dirs)
DeleteFolder(organizationId, folder != string.Empty ? string.Format("{0}\\{1}", folder, dir.Name) : dir.Name, webDavSetting);
DeleteFolder(organizationId,
folder != string.Empty ? string.Format("{0}\\{1}", folder, dir.Name) : dir.Name,
webDavSetting);
dirs = treeRoot.GetDirectories();
}
@ -207,14 +220,15 @@ namespace WebsitePanel.Providers.EnterpriseStorage
}
IWebDav webdav = new WebDav(webDavSetting);
webdav.DeleteAllWebDavRules(organizationId, folder);
Directory.Delete(treeRoot.FullName, true);
}
}
public bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules)
public bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting,
WebDavFolderRule[] rules)
{
var users = new List<UserPermission>();
@ -243,14 +257,15 @@ namespace WebsitePanel.Providers.EnterpriseStorage
var webDavSetting = GetWebDavSetting(setting);
string path = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, folder);
string path = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder,
organizationId, folder);
SecurityUtils.ResetNtfsPermissions(path);
SecurityUtils.GrantGroupNtfsPermissions(path, users.ToArray(), false, new RemoteServerSettings(), null, null);
IWebDav webdav = new WebDav(webDavSetting);
return webdav.SetFolderWebDavRules(organizationId, folder, rules);
}
@ -270,6 +285,58 @@ namespace WebsitePanel.Providers.EnterpriseStorage
#endregion
public SystemFile[] Search(string searchPath, string searchText, string userPrincipalName, bool recursive)
{
var settings = GetWebDavSetting(null);
var result = new List<SystemFile>();
using (new WindowsIdentity(userPrincipalName).Impersonate())
{
using (var conn = new OleDbConnection("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"))
{
var searchDirectory = Path.Combine(settings.LocationDrive + ":\\", settings.HomeFolder);
searchDirectory = Path.Combine(searchDirectory, searchPath);
var searchDirectoryUrl = new Uri(searchDirectory).AbsoluteUri;
var wsSql = string.Format(@"SELECT System.FileName, System.DateModified, System.Size, System.Kind, System.ItemPathDisplay, System.ItemType FROM SYSTEMINDEX WHERE System.FileName LIKE '%{0}%' AND {1} = '{2}'",
searchText, recursive ? "SCOPE" : "DIRECTORY", searchDirectoryUrl);
conn.Open();
var cmd = new OleDbCommand(wsSql, conn);
using (OleDbDataReader reader = cmd.ExecuteReader())
{
while (reader!= null && reader.Read())
{
var file = new SystemFile {Name = reader[0] as string};
file.Changed = file.CreatedDate = reader[1] is DateTime ? (DateTime)reader[1] : new DateTime();
file.Size = reader[2] is long ? (long) reader[2] : 0;
var kind = reader[3] is IEnumerable ? ((IEnumerable)reader[3]).Cast<string>().ToList() : null;
var itemType = reader[5] as string ?? string.Empty;
if (kind != null && kind.Any() && itemType.ToLowerInvariant() != ".zip")
{
file.IsDirectory = kind.Any(x => x == "folder");
}
file.FullName = (reader[4] as string ?? string.Empty);
file.RelativeUrl = file.FullName.Replace(searchDirectory, string.Empty).Trim('\\');
result.Add(file);
}
}
}
}
return result.ToArray();
}
#region HostingServiceProvider methods
public override string[] Install()

View file

@ -175,6 +175,23 @@ namespace WebsitePanel.Server
}
}
[WebMethod, SoapHeader("settings")]
public SystemFile[] Search(string searchPath, string searchText, string userPrincipalName, bool recursive)
{
try
{
Log.WriteStart("'{0}' Search", ProviderSettings.ProviderName);
var searchResults = EnterpriseStorageProvider.Search(searchPath, searchText, userPrincipalName, recursive);
Log.WriteEnd("'{0}' Search", ProviderSettings.ProviderName);
return searchResults;
}
catch (Exception ex)
{
Log.WriteError(String.Format("'{0}' Search", ProviderSettings.ProviderName), ex);
throw;
}
}
[WebMethod, SoapHeader("settings")]
public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting)
{

View file

@ -251,14 +251,14 @@ namespace WebsitePanel.WebDav.Core
{
get
{
string displayName = _href.AbsoluteUri.Replace(_baseUri.AbsoluteUri, "");
string displayName = _href.AbsoluteUri.Trim('/').Replace(_baseUri.AbsoluteUri.Trim('/'), "");
displayName = Regex.Replace(displayName, "\\/$", "");
Match displayNameMatch = Regex.Match(displayName, "([\\/]+)$");
if (displayNameMatch.Success)
{
displayName = displayNameMatch.Groups[1].Value;
}
return HttpUtility.UrlDecode(displayName);
return HttpUtility.UrlDecode(displayName.Trim('/'));
}
}
@ -473,15 +473,10 @@ namespace WebsitePanel.WebDav.Core
public void SetHref(Uri href)
{
_href = href;
string baseUri = _href.Scheme + "://" + _href.Host;
for (int i = 0; i < _href.Segments.Length - 1; i++)
{
if (_href.Segments[i] != "/")
{
baseUri += "/" + _href.Segments[i];
}
}
_baseUri = new Uri(baseUri);
var baseUrl = href.AbsoluteUri.Remove(href.AbsoluteUri.Length - href.Segments.Last().Length);
_baseUri = new Uri(baseUrl);
}
/// <summary>

View file

@ -14,6 +14,7 @@ namespace WebsitePanel.WebDav.Core.Interfaces.Managers
void UploadFile(string path, HttpPostedFileBase file);
void UploadFile(string path, byte[] bytes);
void UploadFile(string path, Stream stream);
IEnumerable<IHierarchyItem> SearchFiles(int itemId, string pathPart, string searchValue, string uesrPrincipalName, bool recursive);
IResource GetResource(string path);
string GetFileUrl(string path);
void DeleteResource(string path);

View file

@ -14,6 +14,7 @@ using WebsitePanel.WebDav.Core.Config;
using WebsitePanel.WebDav.Core.Exceptions;
using WebsitePanel.WebDav.Core.Extensions;
using WebsitePanel.WebDav.Core.Interfaces.Managers;
using WebsitePanel.WebDav.Core.Interfaces.Security;
using WebsitePanel.WebDav.Core.Resources;
using WebsitePanel.WebDav.Core.Security.Cryptography;
using WebsitePanel.WebDav.Core.Wsp.Framework;
@ -24,15 +25,17 @@ namespace WebsitePanel.WebDav.Core.Managers
{
private readonly ICryptography _cryptography;
private readonly WebDavSession _webDavSession;
private readonly IWebDavAuthorizationService _webDavAuthorizationService;
private readonly ILog Log;
private bool _isRoot = true;
private IFolder _currentFolder;
public WebDavManager(ICryptography cryptography)
public WebDavManager(ICryptography cryptography, IWebDavAuthorizationService webDavAuthorizationService)
{
_cryptography = cryptography;
_webDavAuthorizationService = webDavAuthorizationService;
Log = LogManager.GetLogger(this.GetType());
_webDavSession = new WebDavSession();
@ -84,6 +87,36 @@ namespace WebsitePanel.WebDav.Core.Managers
return sortedChildren;
}
public IEnumerable<IHierarchyItem> SearchFiles(int itemId, string pathPart, string searchValue, string uesrPrincipalName, bool recursive)
{
pathPart = (pathPart ?? string.Empty).Replace("/","\\");
var items = WspContext.Services.EnterpriseStorage.SearchFiles(itemId, pathPart, searchValue, uesrPrincipalName, recursive);
var resources = Convert(items, new Uri(WebDavAppConfigManager.Instance.WebdavRoot).Append(WspContext.User.OrganizationId, pathPart));
if (string.IsNullOrWhiteSpace(pathPart))
{
var rootItems = ConnectToWebDavServer().ToArray();
foreach (var resource in resources)
{
var rootItem = rootItems.FirstOrDefault(x => x.Name == resource.DisplayName);
if (rootItem == null)
{
continue;
}
resource.ContentLength = rootItem.Size;
resource.AllocatedSpace = rootItem.FRSMQuotaMB;
resource.IsRootItem = true;
}
}
return FilterResult(resources);
}
public bool IsFile(string path)
{
string folder = GetFileFolder(path);
@ -290,6 +323,7 @@ namespace WebsitePanel.WebDav.Core.Managers
}
}
}
return rootFolders;
}
@ -307,6 +341,33 @@ namespace WebsitePanel.WebDav.Core.Managers
return pathPart.StartsWith('/' + toRemove) ? pathPart.Substring(toRemove.Length + 1) : pathPart;
}
private IEnumerable<WebDavResource> Convert(IEnumerable<SystemFile> files, Uri baseUri)
{
var convertResult = new List<WebDavResource>();
var credentials = new NetworkCredential(WspContext.User.Login,
_cryptography.Decrypt(WspContext.User.EncryptedPassword),
WebDavAppConfigManager.Instance.UserDomain);
foreach (var file in files)
{
var webDavitem = new WebDavResource();
webDavitem.SetCredentials(credentials);
webDavitem.SetHref(baseUri.Append(file.RelativeUrl.Replace("\\","/")));
webDavitem.SetItemType(file.IsDirectory? ItemType.Folder : ItemType.Resource);
webDavitem.SetLastModified(file.Changed);
webDavitem.ContentLength = file.Size;
webDavitem.AllocatedSpace = file.FRSMQuotaMB;
convertResult.Add(webDavitem);
}
return convertResult;
}
private byte[] ReadFully(Stream input)
{
var buffer = new byte[16 * 1024];

View file

@ -36,8 +36,7 @@ namespace WebsitePanel.WebDavPortal
));
bundles.Add(new ScriptBundle("~/bundles/bigIconsScripts").Include(
"~/Scripts/appScripts/recalculateResourseHeight.js",
"~/Scripts/appScripts/uploadingData2.js"
"~/Scripts/appScripts/recalculateResourseHeight.js"
));
bundles.Add(new ScriptBundle("~/bundles/authScripts").Include(

View file

@ -248,6 +248,15 @@ tr.selected-file {
width: 200px;
}
.search-block {
}
.search-block input, .search-block label {
display: inline-block;
width: initial;
font-weight: normal;
}
/* Theme Mods */
input,div{border-radius:0px!important;}

View file

@ -48,6 +48,7 @@ namespace WebsitePanel.WebDavPortal.Controllers
private readonly IAccessTokenManager _tokenManager;
private readonly IWebDavAuthorizationService _webDavAuthorizationService;
private readonly IUserSettingsManager _userSettingsManager;
private readonly FileOpenerManager _openerManager;
private readonly ILog Log;
public FileSystemController(ICryptography cryptography, IWebDavManager webdavManager, IAuthenticationService authenticationService, IAccessTokenManager tokenManager, IWebDavAuthorizationService webDavAuthorizationService, FileOpenerManager openerManager, IUserSettingsManager userSettingsManager)
@ -60,6 +61,7 @@ namespace WebsitePanel.WebDavPortal.Controllers
_userSettingsManager = userSettingsManager;
Log = LogManager.GetLogger(this.GetType());
_openerManager = new FileOpenerManager();
}
[HttpGet]
@ -70,8 +72,7 @@ namespace WebsitePanel.WebDavPortal.Controllers
return RedirectToRoute(FileSystemRouteNames.ShowContentPath, new { org, pathPart });
}
[HttpGet]
public ActionResult ShowContent(string org, string pathPart = "")
public ActionResult ShowContent(string org, string pathPart = "", string searchValue = "")
{
if (org != WspContext.User.OrganizationId)
{
@ -92,7 +93,8 @@ namespace WebsitePanel.WebDavPortal.Controllers
{
UrlSuffix = pathPart,
Permissions =_webDavAuthorizationService.GetPermissions(WspContext.User, pathPart),
UserSettings = _userSettingsManager.GetUserSettings(WspContext.User.AccountId)
UserSettings = _userSettingsManager.GetUserSettings(WspContext.User.AccountId),
SearchValue = searchValue
};
return View(model);
@ -104,24 +106,26 @@ namespace WebsitePanel.WebDavPortal.Controllers
}
[ChildActionOnly]
public ActionResult ContentList(string org, FolderViewTypes viewType, string pathPart = "")
public ActionResult ContentList(string org, ModelForWebDav model, string pathPart = "")
{
try
{
IEnumerable<IHierarchyItem> children = _webdavManager.OpenFolder(pathPart);
var model = new ModelForWebDav
{
UrlSuffix = pathPart,
Permissions = _webDavAuthorizationService.GetPermissions(WspContext.User, pathPart),
UserSettings = _userSettingsManager.GetUserSettings(WspContext.User.AccountId)
};
if (Request.Browser.IsMobileDevice == false && model.UserSettings.WebDavViewType == FolderViewTypes.Table)
{
return PartialView("_ShowContentTable", model);
}
IEnumerable<IHierarchyItem> children;
if (string.IsNullOrEmpty(model.SearchValue))
{
children = _webdavManager.OpenFolder(pathPart);
}
else
{
children = _webdavManager.SearchFiles(WspContext.User.ItemId, pathPart, model.SearchValue, WspContext.User.Login, true);
}
model.Items = children.Take(WebDavAppConfigManager.Instance.ElementsRendering.DefaultCount);
return PartialView("_ShowContentBigIcons", model);
@ -136,9 +140,20 @@ namespace WebsitePanel.WebDavPortal.Controllers
[HttpGet]
public ActionResult GetContentDetails(string org, string pathPart, [ModelBinder(typeof (JqueryDataTableModelBinder))] JqueryDataTableRequest dtRequest)
{
var folderItems = _webdavManager.OpenFolder(pathPart);
IEnumerable<WebDavResource> folderItems;
var tableItems = Mapper.Map<IEnumerable<IHierarchyItem>, IEnumerable<ResourceTableItemModel>>(folderItems).ToList();
if (string.IsNullOrEmpty(dtRequest.Search.Value) == false)
{
folderItems = _webdavManager.SearchFiles(WspContext.User.ItemId, pathPart, dtRequest.Search.Value, WspContext.User.Login, true).Select(x => new WebDavResource(null, x));
}
else
{
folderItems = _webdavManager.OpenFolder(pathPart).Select(x=>new WebDavResource(null, x));
}
var tableItems = Mapper.Map<IEnumerable<WebDavResource>, IEnumerable<ResourceTableItemModel>>(folderItems).ToList();
FillContentModel(tableItems);
var orders = dtRequest.Orders.ToList();
orders.Insert(0, new JqueryDataTableOrder{Column = 3, Ascending = false});
@ -146,7 +161,7 @@ namespace WebsitePanel.WebDavPortal.Controllers
dtRequest.Orders = orders;
var dataTableResponse = DataTableHelper.ProcessRequest(tableItems, dtRequest);
return Json(dataTableResponse, JsonRequestBehavior.AllowGet);
}
@ -304,5 +319,27 @@ namespace WebsitePanel.WebDavPortal.Controllers
}
#endregion
private void FillContentModel(IEnumerable<ResourceTableItemModel> items)
{
foreach (var item in items)
{
var opener = _openerManager[Path.GetExtension(item.DisplayName)];
switch (opener)
{
case FileOpenerType.OfficeOnline:
{
var pathPart = item.Href.AbsolutePath.Replace("/" + WspContext.User.OrganizationId, "").TrimStart('/');
item.Url = string.Concat(Url.RouteUrl(FileSystemRouteNames.EditOfficeOnline, new {org = WspContext.User.OrganizationId, pathPart = ""}), pathPart);
break;
}
default:
{
item.Url = item.Href.LocalPath;
break;
}
}
}
}
}
}

View file

@ -15,7 +15,6 @@ namespace WebsitePanel.WebDavPortal.FileOperations
public class FileOpenerManager
{
private readonly IDictionary<string, FileOpenerType> _operationTypes = new Dictionary<string, FileOpenerType>();
private UrlHelper _urlHelper;
public FileOpenerManager()
{
@ -23,10 +22,8 @@ namespace WebsitePanel.WebDavPortal.FileOperations
_operationTypes.AddRange(WebDavAppConfigManager.Instance.OfficeOnline.ToDictionary(x => x.Extension, y => FileOpenerType.OfficeOnline));
}
public string GetUrl(IHierarchyItem item)
public string GetUrl(IHierarchyItem item, UrlHelper urlHelper)
{
_urlHelper =_urlHelper ?? new UrlHelper(HttpContext.Current.Request.RequestContext);
var opener = this[Path.GetExtension(item.DisplayName)];
string href = "/";
@ -35,7 +32,7 @@ namespace WebsitePanel.WebDavPortal.FileOperations
case FileOpenerType.OfficeOnline:
{
var pathPart = item.Href.AbsolutePath.Replace("/" + WspContext.User.OrganizationId, "").TrimStart('/');
href = string.Concat(_urlHelper.RouteUrl(FileSystemRouteNames.EditOfficeOnline, new { org = WspContext.User.OrganizationId, pathPart = "" }), pathPart);
href = string.Concat(urlHelper.RouteUrl(FileSystemRouteNames.EditOfficeOnline, new { org = WspContext.User.OrganizationId, pathPart = "" }), pathPart);
break;
}
default:

View file

@ -36,18 +36,18 @@ namespace WebsitePanel.WebDavPortal.Mapping.Profiles.Webdav
{
var openerManager = new FileOpenerManager();
Mapper.CreateMap<IHierarchyItem, ResourceTableItemModel>()
Mapper.CreateMap<WebDavResource, ResourceTableItemModel>()
.ForMember(ti => ti.DisplayName, x => x.MapFrom(hi => hi.DisplayName.Trim('/')))
.ForMember(ti => ti.Url, x => x.MapFrom(hi => openerManager.GetUrl(hi)))
.ForMember(ti => ti.Href, x => x.MapFrom(hi => hi.Href))
.ForMember(ti => ti.Type, x => x.MapFrom(hi => hi.ItemType.GetDescription().ToLowerInvariant()))
.ForMember(ti => ti.IconHref, x => x.MapFrom(hi => hi.ItemType == ItemType.Folder ? WebDavAppConfigManager.Instance.FileIcons.FolderPath.Trim('~') : WebDavAppConfigManager.Instance.FileIcons[Path.GetExtension(hi.DisplayName.Trim('/'))].Trim('~')))
.ForMember(ti => ti.IsTargetBlank, x => x.MapFrom(hi => openerManager.GetIsTargetBlank(hi)))
.ForMember(ti => ti.Type, x => x.MapFrom(hi => (new WebDavResource(null, hi)).ItemType.GetDescription().ToLowerInvariant()))
.ForMember(ti => ti.IconHref, x => x.MapFrom(hi => (new WebDavResource(null, hi)).ItemType == ItemType.Folder ? WebDavAppConfigManager.Instance.FileIcons.FolderPath.Trim('~') : WebDavAppConfigManager.Instance.FileIcons[Path.GetExtension(hi.DisplayName.Trim('/'))].Trim('~')))
.ForMember(ti => ti.LastModified, x => x.MapFrom(hi => (new WebDavResource(null, hi)).LastModified))
.ForMember(ti => ti.LastModified, x => x.MapFrom(hi => hi.LastModified))
.ForMember(ti => ti.LastModifiedFormated,
x => x.MapFrom(hi => (new WebDavResource(null, hi)).LastModified == DateTime.MinValue ? "--" : (new WebDavResource(null, hi)).LastModified.ToString("dd/MM/yyyy hh:mm tt")))
x => x.MapFrom(hi => hi.LastModified == DateTime.MinValue ? "--" : (new WebDavResource(null, hi)).LastModified.ToString("dd/MM/yyyy hh:mm tt")))
.ForMember(ti => ti.Size, x => x.MapFrom(hi => (new WebDavResource(null,hi)).ContentLength))
.ForMember(ti => ti.IsFolder, x => x.MapFrom(hi => (new WebDavResource(null, hi)).ItemType == ItemType.Folder));
.ForMember(ti => ti.Size, x => x.MapFrom(hi => hi.ContentLength))
.ForMember(ti => ti.IsFolder, x => x.MapFrom(hi => hi.ItemType == ItemType.Folder));
}
}
}

View file

@ -8,6 +8,7 @@ namespace WebsitePanel.WebDavPortal.Models.FileSystem
{
public string DisplayName { get; set; }
public string Url { get; set; }
public Uri Href { get; set; }
public bool IsTargetBlank { get; set; }
public bool IsFolder { get; set; }
public long Size { get; set; }

View file

@ -11,6 +11,7 @@ namespace WebsitePanel.WebDavPortal.Models
public IEnumerable<IHierarchyItem> Items { get; set; }
public string UrlSuffix { get; set; }
public string Error { get; set; }
public string SearchValue { get; set; }
public WebDavPermissions Permissions { get; set; }
public UserPortalSettings UserSettings { get; set; }
}

View file

@ -249,6 +249,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Search.
/// </summary>
public static string Search {
get {
return ResourceManager.GetString("Search", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Select files to upload.
/// </summary>

View file

@ -180,6 +180,9 @@
<data name="ProcessingWithDots" xml:space="preserve">
<value>Processing...</value>
</data>
<data name="Search" xml:space="preserve">
<value>Search</value>
</data>
<data name="SelectFilesToUpload" xml:space="preserve">
<value>Select files to upload</value>
</data>

View file

@ -83,7 +83,6 @@ WspFileBrowser.prototype = {
"ajax": ajaxUrl,
"processing": true,
"serverSide": true,
"searching": false,
"columnDefs": [
{
"render": function(data, type, row) {
@ -118,6 +117,14 @@ WspFileBrowser.prototype = {
});
$(tableId).removeClass('dataTable');
var oTable = this.table;
$(tableId+'_filter input').unbind();
$(tableId+'_filter input').bind('keyup', function (e) {
if (e.keyCode == 13) {
oTable.fnFilter(this.value);
}
});
},
refreshDataTable: function () {
@ -136,6 +143,40 @@ WspFileBrowser.prototype = {
sequentialUploads: true
});
});
},
initBigIcons: function (elementId, url) {
$(document).ready(function () {
$(window).load(function () {
getResources();
});
$(window).scroll(function () {
if (($(window).scrollTop() + 1) >= ($(document).height() - $(window).height())) {
getResources();
};
});
});
var oldResourcesDivHeight = $(elementId).height();
function getResources() {
$.ajax({
type: 'POST',
url: url,//'/storage/show-additional-content',
data: { path: window.location.pathname, resourseRenderCount: $(".element-container").length },
dataType: "html",
success: function (result) {
var domElement = $(result);
$(elementId).append(domElement);
if ($(document).height() == $(window).height() && oldResourcesDivHeight != $('#resourcesDiv').height()) {
getResources();
oldResourcesDivHeight = $(elementId).height();
};
recalculateResourseHeight();
}
});
};
}
};

View file

@ -41,9 +41,9 @@ $(document).on('touchstart', '.element-container', function(e) {
$(document).on('dblclick', '.element-container', function (e) {
wsp.fileBrowser.openItem(this);
var links = $(item).find('.file-link');
var links = $(this).find('.file-link');
if (links.length != 0 && links[0].hasClass('processing-dialog')) {
if (links.length != 0 && $(links[0]).hasClass('processing-dialog')) {
wsp.dialogs.showProcessDialog();
}
});

View file

@ -20,7 +20,7 @@ else
{
@Html.Partial("_ShowContentTopMenu", Model)
@Html.Action("ContentList", "FileSystem", new { viewType = Request.Browser.IsMobileDevice ? FolderViewTypes.BigIcons : Model.UserSettings.WebDavViewType });
@Html.Action("ContentList", "FileSystem", new { model = Model });
}
@ -34,17 +34,22 @@ else
@Scripts.Render("~/bundles/bigIconsScripts")
<script>
recalculateResourseHeight();
$(document).ready(function () {
@if (string.IsNullOrEmpty(Model.SearchValue))
{
@:wsp.fileBrowser.initBigIcons('#resourcesDiv', '@Url.RouteUrl(FileSystemRouteNames.ShowAdditionalContent)');
}
recalculateResourseHeight();
});
</script>
}
else
{
<script>
$(document).ready(function() {
$(document).ready(function () {
wsp.fileBrowser.setSettings({ deletionUrl: "@Url.RouteUrl(FileSystemRouteNames.DeleteFiles)" });
wsp.fileBrowser.initDataTable('#webdav-items-table', '@Url.RouteUrl(FileSystemRouteNames.ShowContentDetails)');
});
</script>
}
}

View file

@ -1,10 +1,26 @@
@using WebsitePanel.WebDav.Core.Client
@using WebsitePanel.WebDavPortal.Resources
@using WebsitePanel.WebDavPortal.UI.Routes
@model WebsitePanel.WebDavPortal.Models.ModelForWebDav
<div class="container">
<div class="search-block navbar-right">
<div>
@using (Html.BeginRouteForm(FileSystemRouteNames.ShowContentPath))
{
<label>
@UI.Search:
</label>
@Html.TextBoxFor(x => x.SearchValue, new { @class = "form-control input-sm"})
}
</div>
</div>
</div>
<div class="container">
<div class="row" id="resourcesDiv">
@if (Model != null)
{