From e451afef8b6c89d60c472f42b521a1f422c60ae3 Mon Sep 17 00:00:00 2001 From: Timo-Breumelhof Date: Tue, 30 Jun 2020 12:04:52 +0200 Subject: [PATCH 01/34] Fixed some typos and added some extra lines of text --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e6c0ff9..c180e89c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Structured Content editing for DNN (Dotnetnuke) *Goals* -* Html module remplacement for responsive websites +* Html module replacement for responsive websites * Easy content editing of complex layouts by end users * Content editing for websites using frameworks like bootstrap @@ -13,11 +13,13 @@ Structured Content editing for DNN (Dotnetnuke) *Features* * Structured content editing of complex data (from single item to multiple lists) +* Field types for Text, HTML, Images (with cropper) and more. * Template based rendering * Multi language * Template exchange with data definition and templates * Module title editing from the Content editing UI * Online template editing +* And much more... Documentation : [url:https://opencontent.readme.io] From ecda1ebebb2d4034ec4ed5067e84a9e961bf40b8 Mon Sep 17 00:00:00 2001 From: Timo-Breumelhof Date: Tue, 30 Jun 2020 12:17:22 +0200 Subject: [PATCH 02/34] Added template github link --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c180e89c..363d3cba 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,11 @@ Structured Content editing for DNN (Dotnetnuke) Documentation : [url:https://opencontent.readme.io] +** Starter Templates Demos : [url:http://www.openextensions.net/dnn-modules/opencontent/bootstrap] - Templates download : [url:http://www.openextensions.net/templates/open-content] +Templates on GitHub [url:https://github.com/sachatrauwaen/OpenContent-Templates] + From cc9707ef8cfda3e6bb76dc0ffed0d9ae0c5cda5d Mon Sep 17 00:00:00 2001 From: Sacha Trauwaen Date: Wed, 7 Oct 2020 10:58:27 +0200 Subject: [PATCH 03/34] fix users count --- OpenContent/Components/Datasource/DnnUsersDataSource.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenContent/Components/Datasource/DnnUsersDataSource.cs b/OpenContent/Components/Datasource/DnnUsersDataSource.cs index 97fb7440..caff4e1f 100644 --- a/OpenContent/Components/Datasource/DnnUsersDataSource.cs +++ b/OpenContent/Components/Datasource/DnnUsersDataSource.cs @@ -146,8 +146,8 @@ public override IDataItems GetAll(DataSourceContext context, Select selectQuery) else { users = UserController.GetUsers(context.PortalId, pageIndex, pageSize, ref total, true, false).Cast(); - total = users.Count(); } + var userCount = users.Count(); if (ruleRoles != null) { var roleNames = ruleRoles.MultiValue.Select(r => r.AsString).ToList(); @@ -158,14 +158,14 @@ public override IDataItems GetAll(DataSourceContext context, Select selectQuery) var val = bool.Parse(ruleApproved.Value.AsString); users = users.Where(u => u.Membership.Approved == val); } + total = total - (userCount - users.Count()); } else { users = UserController.GetUsers(context.PortalId, pageIndex, pageSize, ref total, true, false).Cast(); } - int excluded = users.Count() - users.Count(u => u.IsInRole("Administrators")); + int excluded = users.Count(u => u.IsInRole("Administrators")); users = users.Where(u => !u.IsInRole("Administrators")); - //users = users.Skip(pageIndex * pageSize).Take(pageSize); var dataList = new List(); From 31ce6c9fe00b25598f071cf6ee000461c33bf507 Mon Sep 17 00:00:00 2001 From: Sacha Trauwaen Date: Wed, 7 Oct 2020 11:12:38 +0200 Subject: [PATCH 04/34] fix users count --- OpenContent/Components/Datasource/DnnUsersDataSource.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenContent/Components/Datasource/DnnUsersDataSource.cs b/OpenContent/Components/Datasource/DnnUsersDataSource.cs index caff4e1f..581d952c 100644 --- a/OpenContent/Components/Datasource/DnnUsersDataSource.cs +++ b/OpenContent/Components/Datasource/DnnUsersDataSource.cs @@ -146,6 +146,7 @@ public override IDataItems GetAll(DataSourceContext context, Select selectQuery) else { users = UserController.GetUsers(context.PortalId, pageIndex, pageSize, ref total, true, false).Cast(); + total = users.Count(); } var userCount = users.Count(); if (ruleRoles != null) From ffa5ad732b64e1f2b4907c033d65e864ae7d7077 Mon Sep 17 00:00:00 2001 From: Sacha Trauwaen Date: Wed, 7 Oct 2020 11:23:54 +0200 Subject: [PATCH 05/34] fix 3 users count --- .../Components/Datasource/DnnUsersDataSource.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/OpenContent/Components/Datasource/DnnUsersDataSource.cs b/OpenContent/Components/Datasource/DnnUsersDataSource.cs index 581d952c..347af26a 100644 --- a/OpenContent/Components/Datasource/DnnUsersDataSource.cs +++ b/OpenContent/Components/Datasource/DnnUsersDataSource.cs @@ -127,13 +127,12 @@ public override IDataItems GetAll(DataSourceContext context, Select selectQuery) else { int pageIndex = 0; - int pageSize = 1000; + int pageSize = 100000; int total = 0; IEnumerable users; if (selectQuery != null) { - pageIndex = selectQuery.PageIndex; - pageSize = selectQuery.PageSize; + var ruleDisplayName = selectQuery.Query.FilterRules.FirstOrDefault(f => f.Field == "DisplayName"); var ruleRoles = selectQuery.Query.FilterRules.FirstOrDefault(f => f.Field == "Roles"); var ruleApproved = selectQuery.Query.FilterRules.FirstOrDefault(f => f.Field == "Approved"); @@ -146,7 +145,7 @@ public override IDataItems GetAll(DataSourceContext context, Select selectQuery) else { users = UserController.GetUsers(context.PortalId, pageIndex, pageSize, ref total, true, false).Cast(); - total = users.Count(); + } var userCount = users.Count(); if (ruleRoles != null) @@ -159,7 +158,10 @@ public override IDataItems GetAll(DataSourceContext context, Select selectQuery) var val = bool.Parse(ruleApproved.Value.AsString); users = users.Where(u => u.Membership.Approved == val); } - total = total - (userCount - users.Count()); + total = users.Count(); + pageIndex = selectQuery.PageIndex; + pageSize = selectQuery.PageSize; + users = users.Skip(pageIndex * pageSize).Take(pageSize); } else { @@ -167,8 +169,7 @@ public override IDataItems GetAll(DataSourceContext context, Select selectQuery) } int excluded = users.Count(u => u.IsInRole("Administrators")); users = users.Where(u => !u.IsInRole("Administrators")); - - //users = users.Skip(pageIndex * pageSize).Take(pageSize); + var dataList = new List(); foreach (var user in users) { From b2aa15393352bece9ea8fb59e016521913abf487 Mon Sep 17 00:00:00 2001 From: holoncom Date: Fri, 30 Oct 2020 10:01:28 +0100 Subject: [PATCH 06/34] improve ImageUriFactory to better support imageX --- .../TemplateHelpers/Images/ImageUriFactory.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/OpenContent/Components/TemplateHelpers/Images/ImageUriFactory.cs b/OpenContent/Components/TemplateHelpers/Images/ImageUriFactory.cs index 328579e3..21302901 100644 --- a/OpenContent/Components/TemplateHelpers/Images/ImageUriFactory.cs +++ b/OpenContent/Components/TemplateHelpers/Images/ImageUriFactory.cs @@ -17,11 +17,19 @@ public static ImageUri CreateImageUri(dynamic imageInfo) { if (imageInfo?["ImageId"] != null) { - retval = CreateImageUri(Convert.ToString(imageInfo["ImageId"])); //it might be an enhanced image object + retval = CreateImageUri(Convert.ToString(imageInfo["ImageId"])); // it might be an enhanced image object + } + else if (imageInfo?["url"] != null) + { + retval = CreateImageUri(Convert.ToString(imageInfo["url"])); // it might be an imageX object + } + else if (imageInfo?["id"] != null) + { + retval = CreateImageUri(Convert.ToString(imageInfo["id"])); // it might be an imageX object } else { - retval = CreateImageUri(Convert.ToString(imageInfo)); //it might be just the image Id + retval = CreateImageUri(Convert.ToString(imageInfo)); // it might be just the image Id } } catch (Exception ex) From bef2b0e57a60daac19c0bc965f0690fb05748e29 Mon Sep 17 00:00:00 2001 From: holoncom Date: Fri, 20 Nov 2020 21:53:41 +0100 Subject: [PATCH 07/34] if item is not found during ReOrder (sorting), then do not fail, but log the error, continue and return the result --- OpenContent/Components/OpenContentAPIController.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/OpenContent/Components/OpenContentAPIController.cs b/OpenContent/Components/OpenContentAPIController.cs index bc79738b..2bd8cb5f 100644 --- a/OpenContent/Components/OpenContentAPIController.cs +++ b/OpenContent/Components/OpenContentAPIController.cs @@ -669,14 +669,17 @@ public HttpResponseMessage ReOrder(List ids) return Request.CreateResponse(HttpStatusCode.OK, new { isValid = true }); int i = 1; + string errorOccured = ""; foreach (var id in ids) { if (id == "-1") continue; // ignore items explicitly marked with id -1; var dsItem = ds.Get(dsContext, id); if (dsItem == null) { - Utils.DebuggerBreak(); // this should never happen: investigate! - throw new Exception($"Reorder failed. Unknown item {id}. Reindex module and try again."); + Utils.DebuggerBreak(); // item not found. investigate! + errorOccured = $"Reorder failed. Unknown item {id}. Reindex module and try again."; + App.Services.Logger.Error(errorOccured); + continue; } var json = dsItem.Data; @@ -710,7 +713,8 @@ public HttpResponseMessage ReOrder(List ids) } return Request.CreateResponse(HttpStatusCode.OK, new { - isValid = true + isValid = string.IsNullOrEmpty(errorOccured), + errorMsg = errorOccured }); } catch (Exception exc) From e22426978175c8125efe6e8ad3d46fe78d875618 Mon Sep 17 00:00:00 2001 From: holoncom Date: Fri, 20 Nov 2020 21:55:19 +0100 Subject: [PATCH 08/34] fix assembly version number --- OpenContent/Properties/AssemblyInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenContent/Properties/AssemblyInfo.cs b/OpenContent/Properties/AssemblyInfo.cs index e5b70e25..17c00363 100644 --- a/OpenContent/Properties/AssemblyInfo.cs +++ b/OpenContent/Properties/AssemblyInfo.cs @@ -30,5 +30,5 @@ // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("04.04.00.0")] -[assembly: AssemblyFileVersion("04.04.00.0")] +[assembly: AssemblyVersion("04.05.00.0")] +[assembly: AssemblyFileVersion("04.05.00.0")] From 899f3181e975273d690883b19200f36a220e89eb Mon Sep 17 00:00:00 2001 From: Sacha Trauwaen Date: Fri, 27 Nov 2020 21:22:06 +0100 Subject: [PATCH 09/34] filter settings will be saved to filter-data.json Improve speed ImageX when using an image folder with a lot of images with image handler added disableEdit on template template level context.TemplatePath context.TemplateName delete ml Confirmation Text error message next to the Save button --- OpenContent/App_LocalResources/Edit.ascx.resx | 9 + .../Components/Alpaca/AlpacaContext.cs | 3 + .../Components/DnnEntitiesAPIController.cs | 8 +- .../Components/FileUploadController.cs | 12 +- OpenContent/Components/InitAPIController.cs | 23 +- OpenContent/Components/Manifest/Manifest.cs | 4 + .../Components/Manifest/TemplateManifest.cs | 3 + .../Components/OpenContentAPIController.cs | 19 +- .../Components/Render/ModelFactoryBase.cs | 5 +- .../Components/Render/ModelFactoryMultiple.cs | 2 +- .../Components/Render/ModelFactorySingle.cs | 2 +- OpenContent/Components/Render/RenderEngine.cs | 6 +- .../TemplateHelpers/Images/ImageHelper.cs | 35 +- OpenContent/Edit.ascx | 7 +- OpenContent/Edit.ascx.cs | 5 + OpenContent/EditData.ascx.cs | 5 +- OpenContent/alpaca/js/fields/dnn/FileField.js | 542 +++++++++--------- .../alpaca/js/fields/dnn/ImageField.js | 4 +- .../alpaca/js/fields/dnn/ImageXField.js | 4 +- OpenContent/alpaca/js/fields/dnn/dnnfields.js | 532 ++++++++--------- .../alpaca/js/fields/dnn/dnnfields.min.js | 2 +- OpenContent/js/alpacaengine.js | 100 ++-- 22 files changed, 713 insertions(+), 619 deletions(-) diff --git a/OpenContent/App_LocalResources/Edit.ascx.resx b/OpenContent/App_LocalResources/Edit.ascx.resx index 86cf37a6..054df758 100644 --- a/OpenContent/App_LocalResources/Edit.ascx.resx +++ b/OpenContent/App_LocalResources/Edit.ascx.resx @@ -129,4 +129,13 @@ Copy + + Some fields are required or invalid. + + + Are you sure you want to delete this Item? + + + Are you sure you want to delete this Item (this may affect all languages)? + \ No newline at end of file diff --git a/OpenContent/Components/Alpaca/AlpacaContext.cs b/OpenContent/Components/Alpaca/AlpacaContext.cs index cce98c35..4e7a0424 100644 --- a/OpenContent/Components/Alpaca/AlpacaContext.cs +++ b/OpenContent/Components/Alpaca/AlpacaContext.cs @@ -84,5 +84,8 @@ public string AppPath public bool Horizontal { get; set; } [JsonProperty(PropertyName = "isNew")] public bool IsNew { get; set; } + [JsonProperty(PropertyName = "deleteConfirmMessage")] + public string DeleteConfirmMessage { get; set; } + } } diff --git a/OpenContent/Components/DnnEntitiesAPIController.cs b/OpenContent/Components/DnnEntitiesAPIController.cs index 200ab6f9..addaec25 100644 --- a/OpenContent/Components/DnnEntitiesAPIController.cs +++ b/OpenContent/Components/DnnEntitiesAPIController.cs @@ -145,14 +145,16 @@ public HttpResponseMessage ImagesLookup(string q, string d) [ValidateAntiForgeryToken] [DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.Edit)] [HttpGet] - public HttpResponseMessage ImagesLookupExt(string q, string folder) + public HttpResponseMessage ImagesLookupExt(string q, string folder, string itemId) { try { - var folderManager = FolderManager.Instance; string imageFolder = "OpenContent/Files/" + ActiveModule.ModuleID; - + if (!string.IsNullOrEmpty(itemId)) + { + imageFolder += "/" + itemId; + } if (!string.IsNullOrEmpty(folder)) { imageFolder = folder; diff --git a/OpenContent/Components/FileUploadController.cs b/OpenContent/Components/FileUploadController.cs index aae42682..0291eeba 100644 --- a/OpenContent/Components/FileUploadController.cs +++ b/OpenContent/Components/FileUploadController.cs @@ -81,7 +81,8 @@ public HttpResponseMessage UploadEasyImage() } return new HttpResponseMessage { - Content = new StringContent(JsonConvert.SerializeObject(new ImageStatus{ + Content = new StringContent(JsonConvert.SerializeObject(new ImageStatus + { Default = statuses[0].url })) }; @@ -130,11 +131,20 @@ private void UploadWholeFile(HttpContextBase context, ICollection s if (IsAllowedExtension(fileName)) { bool? overwrite = null; + + var module = OpenContentModuleConfig.Create(ActiveModule, PortalSettings); if (!string.IsNullOrEmpty(context.Request.Form["overwrite"])) { overwrite = context.Request.Form["overwrite"] == "true"; } string uploadfolder = "OpenContent/Files/" + ActiveModule.ModuleID; + if (module.Settings.Manifest.DeleteFiles) + { + if (!string.IsNullOrEmpty(context.Request.Form["itemId"])) + { + uploadfolder += "/" + context.Request.Form["itemId"]; + } + } if (!string.IsNullOrEmpty(context.Request.Form["uploadfolder"])) { uploadfolder = context.Request.Form["uploadfolder"]; diff --git a/OpenContent/Components/InitAPIController.cs b/OpenContent/Components/InitAPIController.cs index 21af8c82..729523fd 100644 --- a/OpenContent/Components/InitAPIController.cs +++ b/OpenContent/Components/InitAPIController.cs @@ -49,12 +49,12 @@ public List GetPortals() var listItems = new List(); foreach (var item in portals) { - var li = new PortalDto() - { - Text = item.PortalName, - PortalId= item.PortalID - }; - listItems.Add(li); + var li = new PortalDto() + { + Text = item.PortalName, + PortalId = item.PortalID + }; + listItems.Add(li); } return listItems.OrderBy(x => x.Text).ToList(); } @@ -82,7 +82,7 @@ public List GetModules() if (!tab.IsNeutralCulture && tab.CultureCode != DnnLanguageUtils.GetCurrentCultureCode()) { // skip other cultures - //continue; + //continue; } else { @@ -254,6 +254,15 @@ public ModuleStateDto SaveTemplate(SaveDto input) settings = ActiveModule.OpenContentSettings(); } } + // filter settings + var filterFilename = templateManifest.MainTemplateUri().PhysicalFullDirectory + "\\" + "filter-data.json"; + if (File.Exists(filterFilename)) + { + var settingContent = File.ReadAllText(filterFilename); + mc.UpdateModuleSetting(ActiveModule.ModuleID, "query", settingContent); + ActiveModule.ModuleSettings["query"] = settingContent; + settings = ActiveModule.OpenContentSettings(); + } bool defaultData = false; if (templateManifest.DataNeeded()) { diff --git a/OpenContent/Components/Manifest/Manifest.cs b/OpenContent/Components/Manifest/Manifest.cs index 4003699f..a8d90792 100644 --- a/OpenContent/Components/Manifest/Manifest.cs +++ b/OpenContent/Components/Manifest/Manifest.cs @@ -73,6 +73,10 @@ public Dictionary AdditionalDataDefinition [JsonProperty(PropertyName = "advanced")] public bool Advanced { get; set; } + [JsonProperty(PropertyName = "deleteFiles")] + public bool DeleteFiles { get; set; } + + public bool HasTemplates => (Templates != null); public FolderUri ManifestDir { get; set; } diff --git a/OpenContent/Components/Manifest/TemplateManifest.cs b/OpenContent/Components/Manifest/TemplateManifest.cs index ad777964..2658f7e3 100644 --- a/OpenContent/Components/Manifest/TemplateManifest.cs +++ b/OpenContent/Components/Manifest/TemplateManifest.cs @@ -35,6 +35,9 @@ public class TemplateManifest [JsonProperty(PropertyName = "collection")] public string Collection { get; set; } = "Items"; + [JsonProperty(PropertyName = "disableEdit")] + public bool DisableEdit { get; set; } + public bool IsListTemplate => Type == "multiple"; public TemplateKey Key { get; private set; } diff --git a/OpenContent/Components/OpenContentAPIController.cs b/OpenContent/Components/OpenContentAPIController.cs index bc79738b..1f291eb5 100644 --- a/OpenContent/Components/OpenContentAPIController.cs +++ b/OpenContent/Components/OpenContentAPIController.cs @@ -27,6 +27,7 @@ using Satrabel.OpenContent.Components.Manifest; using Satrabel.OpenContent.Components.Datasource; using Satrabel.OpenContent.Components.Dnn; +using DotNetNuke.Services.FileSystem; #endregion @@ -684,7 +685,7 @@ public HttpResponseMessage ReOrder(List ids) { #region Normalize irregulatities with SortIndex field // if old data-format (single-language) detected. Migrate to ML version. - if (json["SortIndex"] == null || json["SortIndex"].Type != JTokenType.Object) + if (json["SortIndex"] == null || json["SortIndex"].Type != JTokenType.Object) { json["SortIndex"] = new JObject(); } @@ -838,6 +839,22 @@ public HttpResponseMessage Delete(JObject json) ds.Delete(dsContext, content); } App.Services.CacheAdapter.SyncronizeCache(module); + + if (module.IsListMode() && module.Settings.Manifest.DeleteFiles) + { + string uploadfolder = "OpenContent/Files/" + ActiveModule.ModuleID; + if (module.IsListMode()) + { + uploadfolder += "/" + json["id"].ToString(); + } + var folderManager = FolderManager.Instance; + var fileManager = FileManager.Instance; + var moduleFolder = folderManager.GetFolder(PortalSettings.PortalId, uploadfolder); + var files = folderManager.GetFiles(moduleFolder); + fileManager.DeleteFiles(files); + folderManager.DeleteFolder(moduleFolder); + } + return Request.CreateResponse(HttpStatusCode.OK, ""); } catch (Exception exc) diff --git a/OpenContent/Components/Render/ModelFactoryBase.cs b/OpenContent/Components/Render/ModelFactoryBase.cs index ce50d0f4..f0de452c 100644 --- a/OpenContent/Components/Render/ModelFactoryBase.cs +++ b/OpenContent/Components/Render/ModelFactoryBase.cs @@ -288,7 +288,7 @@ protected void ExtendModel(JObject model, bool onlyData, bool onlyMainData) context["ModuleId"] = _module.ViewModule.ModuleId; context["GoogleApiKey"] = App.Services.CreateGlobalSettingsRepository(_portalId).GetGoogleApiKey(); context["ModuleTitle"] = _module.ViewModule.ModuleTitle; - var editIsAllowed = !_manifest.DisableEdit && IsEditAllowed(-1); + var editIsAllowed = !_manifest.DisableEdit && !_templateManifest.DisableEdit && IsEditAllowed(-1); context["IsEditable"] = editIsAllowed; //allowed to edit the item or list (meaning allow Add) context["IsEditMode"] = IsEditMode; context["PortalId"] = _portalId; @@ -296,6 +296,9 @@ protected void ExtendModel(JObject model, bool onlyData, bool onlyMainData) context["HomeDirectory"] = _module.HomeDirectory; context["HTTPAlias"] = _module.HostName; context["PortalName"] = _module.PortalName; + context["TemplatePath"] = _module.Settings.TemplateDir.UrlFolder; + context["TemplateName"] = (String.IsNullOrEmpty(_manifest.Title) ? Path.GetFileName(_templateManifest.MainTemplateUri().FolderPath) : _manifest.Title) +" - "+ (string.IsNullOrEmpty(_templateManifest.Title) ? _templateManifest.Key.ShortKey : _templateManifest.Title); + //context["TemplateName"] = _templateManifest.MainTemplateUri().UrlFilePath ; } } diff --git a/OpenContent/Components/Render/ModelFactoryMultiple.cs b/OpenContent/Components/Render/ModelFactoryMultiple.cs index 5b972131..c4410bd7 100644 --- a/OpenContent/Components/Render/ModelFactoryMultiple.cs +++ b/OpenContent/Components/Render/ModelFactoryMultiple.cs @@ -103,7 +103,7 @@ public override JToken GetModelAsJson(bool onlyData = false, bool onlyMainData = } else { - var editStatus = !_manifest.DisableEdit && IsEditAllowed(item.CreatedByUserId); + var editStatus = !_manifest.DisableEdit && !_templateManifest.DisableEdit && IsEditAllowed(item.CreatedByUserId); context["IsEditable"] = editStatus; if (HasEditPermissions(item.CreatedByUserId)) { diff --git a/OpenContent/Components/Render/ModelFactorySingle.cs b/OpenContent/Components/Render/ModelFactorySingle.cs index 98d4418c..a3b3b35e 100644 --- a/OpenContent/Components/Render/ModelFactorySingle.cs +++ b/OpenContent/Components/Render/ModelFactorySingle.cs @@ -57,7 +57,7 @@ private void ExtendModelSingle(JObject model) { context["DetailUrl"] = GenerateDetailUrl(_data, model, _manifest, GetCurrentCultureCode(), _detailTabId); context["Id"] = _data.Id; - var editIsAllowed = !_manifest.DisableEdit && IsEditAllowed(_data.CreatedByUserId); + var editIsAllowed = !_manifest.DisableEdit && !_templateManifest.DisableEdit && IsEditAllowed(_data.CreatedByUserId); context["EditUrl"] = editIsAllowed ? _module.EditUrl("id", _data.Id, _module.ViewModule.ModuleId) : ""; } } diff --git a/OpenContent/Components/Render/RenderEngine.cs b/OpenContent/Components/Render/RenderEngine.cs index 8edbf33f..f65c305d 100644 --- a/OpenContent/Components/Render/RenderEngine.cs +++ b/OpenContent/Components/Render/RenderEngine.cs @@ -695,7 +695,7 @@ public List GetMenuActions() bool isDetailPageRequest = _renderinfo.IsDetailPageRequest; //Add item / Edit Item - if (templateDefined && template.DataNeeded() && !_settings.Manifest.DisableEdit) + if (templateDefined && template.DataNeeded() && !_settings.Manifest.DisableEdit && !template.DisableEdit) { string title = App.Services.Localizer.GetString(isListPageRequest ? "Add.Action" : "Edit.Action", ResourceFile); if (!string.IsNullOrEmpty(_settings.Manifest.Title)) @@ -714,7 +714,7 @@ public List GetMenuActions() } //Add AdditionalData manage actions - if (templateDefined && template.Manifest.AdditionalDataDefined() && !_settings.Manifest.DisableEdit) + if (templateDefined && template.Manifest.AdditionalDataDefined() && !_settings.Manifest.DisableEdit && !template.DisableEdit) { foreach (var addData in template.Manifest.AdditionalDataDefinition) { @@ -865,7 +865,7 @@ public List GetMenuActions() //Edit Raw Data if (templateDefined && _settings.Manifest != null && - (template.DataNeeded() || template.SettingsNeeded() || template.Manifest.AdditionalDataDefined()) && !_settings.Manifest.DisableEdit) + (template.DataNeeded() || template.SettingsNeeded() || template.Manifest.AdditionalDataDefined()) && !_settings.Manifest.DisableEdit && !template.DisableEdit) { actions.Add( new MenuAction( diff --git a/OpenContent/Components/TemplateHelpers/Images/ImageHelper.cs b/OpenContent/Components/TemplateHelpers/Images/ImageHelper.cs index dcdc9d9c..13b57db0 100644 --- a/OpenContent/Components/TemplateHelpers/Images/ImageHelper.cs +++ b/OpenContent/Components/TemplateHelpers/Images/ImageHelper.cs @@ -16,6 +16,25 @@ namespace Satrabel.OpenContent.Components.TemplateHelpers { public static class ImageHelper { + //static bool DnnImageHandlerExist = AppDomain.CurrentDomain.GetAssemblies().Any(a => a.FullName.StartsWith(assemblyName) == "DotNetNuke.Services.GeneratedImage.DnnImageHandler, DotNetNuke"); + + //static bool DnnImageHandlerExist = (from assembly in AppDomain.CurrentDomain.GetAssemblies() + // from type in assembly.GetTypes() + // where type.Name == "DotNetNuke.Services.GeneratedImage.DnnImageHandler, DotNetNuke" + // select type).Any(); + + + static bool DnnImageHandlerExist = Type.GetType("DotNetNuke.Services.GeneratedImage.DnnImageHandler, DotNetNuke") != null; + + //static bool ImageProcessorExist = AppDomain.CurrentDomain.GetAssemblies().Any(a => a.FullName == "ImageProcessor.Web.HttpModules.ImageProcessingModule, ImageProcessor.Web"); + + //static bool ImageProcessorExist = (from assembly in AppDomain.CurrentDomain.GetAssemblies() + // from type in assembly.GetTypes() + // where type.Name == "ImageProcessor.Web.HttpModules.ImageProcessingModule, ImageProcessor.Web" + // select type).Any(); + + static bool ImageProcessorExist = Type.GetType("ImageProcessor.Web.HttpModules.ImageProcessingModule, ImageProcessor.Web") != null; + public static bool IsImageFile(this IFileInfo file) { return (Globals.glbImageFileTypes + ",").IndexOf(file.Extension.ToLower().Replace(".", "") + ",") > -1; @@ -91,7 +110,21 @@ public static string GetImageUrl(IFileInfo file, Ratio requestedCropRatio) if (ModuleDefinitionController.GetModuleDefinitionByFriendlyName("OpenFiles") == null) { - return DnnFileUtils.ToUrl(file); + var fileurl = DnnFileUtils.ToUrl(file); + if (!fileurl.Contains("LinkClick")) + { + if (DnnImageHandlerExist) + { + fileurl = fileurl.RemoveQueryParams(); + return $"/DnnImageHandler.ashx?mode=file&file={fileurl}&resizemode=Crop&w={requestedCropRatio.Width}&h={requestedCropRatio.Height}"; + } + else if (ImageProcessorExist) + { + fileurl = fileurl.RemoveQueryParams(); + return fileurl.AppendQueryParams($"width={requestedCropRatio.Width}&height={requestedCropRatio.Height}&mode=crop"); + } + } + return fileurl; } var url = file.ToLinkClickSafeUrl(); url = url.RemoveQueryParams(); //imageprocessor does not tolerate unknow querystrings (for security reasons). Remove them diff --git a/OpenContent/Edit.ascx b/OpenContent/Edit.ascx index e1aadedf..3a676473 100644 --- a/OpenContent/Edit.ascx +++ b/OpenContent/Edit.ascx @@ -4,7 +4,7 @@
    - +
  • @@ -21,6 +21,11 @@
+