GithubHelp home page GithubHelp logo

umbraco.uibuilder.issues's Introduction

Umbraco UI Builder is the rapid admin interface builder for Umbraco brought to you by Umbraco HQ

About This Repository

The purpose of this repository is to act as a central hub for reporting issues with the core Umbraco UI Builder product. This repo will NOT contain the Umbraco UI Builder source code which is closed source.

Useful Links

Copyright

Copyright © 2023 Umbraco HQ. All rights reserved.

umbraco.uibuilder.issues's People

Contributors

dampee avatar mattbrailsford avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

dampee bifort

umbraco.uibuilder.issues's Issues

Context apps Not Loading on Production

Describe the bug
The context app does not load on production site. When running locally the app loads fine.

Steps To Reproduce
On a production site, navigate to a context app using its icon.
No visual error is shown, but one appears in the console log.

Screenshots
image

image

Environment (please complete the following information):

  • Server OS: Server 2012
  • Browser: Chrome/Edge
  • Umbraco Version: 10.3.2
  • Product Version: 1.6.1

Additional context
Browser console log:

umbraco-backoffice-js.js.v638040298904548122:147 Error: [$compile:multidir] http://errors.angularjs.org/1.8.3/$compile/multidir?p0=konstruktCollectionListView&p1=%20(module%3A%20umbraco.directives)&p2=konstruktCollectionListView&p3=%20(module%3A%20umbraco.directives)&p4=template&p5=%3Cdiv%20collection-alias%3D%22tab.collection.alias%22%20open-in-infinite-editor%3D%22true%22%20show-create-button%3D%22true%22%20parent-entity-id%3D%22vm.nodeUdi%22%3E
    at umbraco-backoffice-js.js.v638040298904548122:25:168
    at ba (umbraco-backoffice-js.js.v638040298904548122:103:448)
    at aa (umbraco-backoffice-js.js.v638040298904548122:96:378)
    at umbraco-backoffice-js.js.v638040298904548122:102:238
    at umbraco-backoffice-js.js.v638040298904548122:159:454
    at m.$digest (umbraco-backoffice-js.js.v638040298904548122:171:67)
    at m.$apply (umbraco-backoffice-js.js.v638040298904548122:174:484)
    at k (umbraco-backoffice-js.js.v638040298904548122:125:445)
    at v (umbraco-backoffice-js.js.v638040298904548122:131:40)
    at y.onload (umbraco-backoffice-js.js.v638040298904548122:131:464)

the 'entity picker' doesn't appear to be using the value converter

Describe the bug
the 'entity picker' doesn't appear to be using the value converter as the type in the generated models builder class is object not IEnumerable<object> as described in the documentation https://docs.getkonstrukt.net/extras/property-editors/entity-picker#getting-the-value-of-an-entity-picker

Steps To Reproduce
Steps to reproduce the behavior:

  1. add a new datatype based on the Konstrukt Entity Picker and configure it to talk to a entity
    image
  2. add the datatype to a property on a doctype:
    image
  3. pick items on the node in the content tree:
    image
  4. view the property type in the generated models builder file:
    image

Expected behavior
an IEnumerable<object> type in the generated model

Environment (please complete the following information):

  • Server OS: windows 10
  • Browser: firefox
  • Umbraco Version: 9.4.3
  • Product Version: 1.0.2 and 1.0.3-beta0002

Additional context
would it also be possible to give the code path to the property value converter as we need to call the ConvertIntermediateToObject method in another area of the backend code?

Support different foreign key types in context app collections, other than UDI

It's quite common for custom data to be associated with umbraco entities via their id (int) or key (Guid).

However in UI Builder, when adding a collection to the context app, it seems to assume that the foreign key is a UDI string, and having it as anything else breaks the app. It doesn't show related items in the list view, and saving items throws an error.

Is there anyway to match the foreign key field to something other than the UDI? For example the node ID or key?

Make whereClause nullable in custom repo overrides

Describe the bug
If I create my own repo for the data in UI Builder then it will generate the methods to override for me via the IDE.

However, some of them has an expression parameter for a whereClause:

protected override IEnumerable<Movie> GetAllImpl(Expression<Func<Movie, bool>> whereClause, Expression<Func<Movie, object>> orderBy, SortDirection orderByDirection)
{
    throw new NotImplementedException();
}

protected override PagedResult<Movie> GetPagedImpl(int pageNumber, int pageSize, Expression<Func<Movie, bool>> whereClause, Expression<Func<Movie, object>> orderBy,
    SortDirection orderByDirection)
{
    throw new NotImplementedException();
}

protected override long GetCountImpl(Expression<Func<Movie, bool>> whereClause)
{
    throw new NotImplementedException();
}

And if no filters or anything is added then the whereClause is null, which means we need to have a nullcheck for it, but our IDE will constantly tell us that the null check is not needed:

image

image

Would be nice if the method set the Expression as nullable.

Environment (please complete the following information):

  • Server OS: windows
  • Browser any
  • Umbraco Version 12.3.1
  • Product Version 12.0.1

Cannot delete entity when it is in a schema

Describe the bug
There is an error on the delete entity row action when the referenced entity is in a schema other than dbo.

Steps To Reproduce
Steps to reproduce the behavior:

  1. Go to a collection
  2. Click the actions menu and select "delete"
  3. Confirm the delete in the modal

Expected behavior
The entity should be deleted

Environment (please complete the following information):

  • Server OS: Win10
  • Browser Chrome
  • Umbraco Version 9.5.0 (Also 9.4)
  • Product Version 1.1.0
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at StackExchange.Profiling.Data.ProfiledDbCommand.ExecuteNonQuery() in C:\projects\dotnet\src\MiniProfiler.Shared\Data\ProfiledDbCommand.cs:line 281
   at Umbraco.Cms.Infrastructure.Persistence.FaultHandling.FaultHandlingDbCommand.<ExecuteNonQuery>b__31_0()
   at Umbraco.Cms.Infrastructure.Persistence.FaultHandling.FaultHandlingDbCommand.<>c__DisplayClass33_0`1.<Execute>b__0()
   at Umbraco.Cms.Infrastructure.Persistence.FaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)
   at Umbraco.Cms.Infrastructure.Persistence.FaultHandling.FaultHandlingDbCommand.Execute[T](Func`1 f)
   at Umbraco.Cms.Infrastructure.Persistence.FaultHandling.FaultHandlingDbCommand.ExecuteNonQuery()
   at NPoco.Database.ExecuteNonQueryHelper(DbCommand cmd)
   at NPoco.Database.Execute(String sql, CommandType commandType, Object[] args)
   at NPoco.Database.Execute(Sql Sql)
   at Konstrukt.Persistence.DefaultKonstruktRepository.Delete(Object id, Boolean raiseEvents)```

Missing `DataTypeKey` in PropertyDisplayModel

Describe the bug
I am trying to use Contentment data picker inside UI-Builder. It's failing because it is missing the DataTypeKey property inside its editor model.

I have validated through debugging that adding this property resolves the issue and allows contentment data-picker to work inside UI-Builder.

Samples:

  • Data returned by GetEntityScaffold api - see "dataTypeKey" is all zeros.
    image

  • The property is not being set inside Umbraco.UIBuilder.Web.Models.Mappers.ToContentPropertyDisplayModel

  • When all zeros, it causes Contentment to issue a request to: /umbraco/backoffice/Contentment/DataPickerApi/GetItems?id=-1&dataTypeKey=00000000-0000-0000-0000-000000000000 which fails with
    "Unable to locate data source for data type: '00000000-0000-0000-0000-000000000000" as it uses the dataTypeKey to lookup to relevant configuration information.


This item has been added to our backlog AB#35772

Umbraco 9.4.3 Smidge CSS notation clash

Describe the bug
When navigating to any list view with this version of Umbraco and the 1.0.2 of konstrukt then a clash in the Smidge minification/bundling occurs on the rgb CSS definition resulting in the same error as described here: madskristensen/BundlerMinifier#552

Steps To Reproduce
Steps to reproduce the behavior:

  1. Go to any list view
  2. load the grid
  3. See error in network tab (Chrome) where umbraco backoffice combined CSS from plugins fails to load

image

Stack Trace:

image

Smidge.Nuglify.NuglifyCss.ProcessAsync(FileProcessContext fileProcessContext, PreProcessorDelegate next)
Smidge.FileProcessors.PreProcessPipeline.ProcessNext(Queue<IPreProcessor> queue, FileProcessContext fileProcessContext)
Smidge.FileProcessors.PreProcessPipeline+<>c__DisplayClass5_0+<<ProcessNext>b__0>d.MoveNext()
Smidge.FileProcessors.PreProcessPipeline.ProcessNext(Queue<IPreProcessor> queue, FileProcessContext fileProcessContext)
Smidge.FileProcessors.PreProcessPipeline+<>c__DisplayClass5_0+<<ProcessNext>b__0>d.MoveNext()
Smidge.FileProcessors.CssImportProcessor.ProcessAsync(FileProcessContext fileProcessContext, PreProcessorDelegate next)
Smidge.FileProcessors.PreProcessPipeline.ProcessNext(Queue<IPreProcessor> queue, FileProcessContext fileProcessContext)
Smidge.FileProcessors.PreProcessPipeline.ProcessAsync(FileProcessContext fileProcessContext)
Smidge.FileProcessors.PreProcessManager.ProcessFileImpl(IWebFile file, BundleOptions bundleOptions, BundleContext bundleContext)
Smidge.FileProcessors.PreProcessManager.ProcessFile(IWebFile file, BundleOptions bundleOptions, BundleContext bundleContext)
Smidge.FileProcessors.PreProcessManager.ProcessAndCacheFileAsync(IWebFile file, BundleOptions bundleOptions, BundleContext bundleContext)
Smidge.Controllers.SmidgeController.Bundle(BundleRequestModel bundleModel)
Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor+TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments)
System.Threading.Tasks.ValueTask<TResult>.get_Result()
System.Runtime.CompilerServices.ValueTaskAwaiter<TResult>.GetResult()
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Logged|12_1(ControllerActionInvoker invoker)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
Umbraco.StorageProviders.AzureBlob.AzureBlobFileSystemMiddleware.HandleRequestAsync(HttpContext context, RequestDelegate next)
Microsoft.AspNetCore.Builder.UseMiddlewareExtensions+<>c__DisplayClass6_1+<<UseMiddlewareInterface>b__1>d.MoveNext()
Umbraco.Cms.Web.Common.Middleware.BasicAuthenticationMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
Microsoft.AspNetCore.Builder.UseMiddlewareExtensions+<>c__DisplayClass6_1+<<UseMiddlewareInterface>b__1>d.MoveNext()
Umbraco.Cms.Web.BackOffice.Middleware.BackOfficeExternalLoginProviderErrorMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
Microsoft.AspNetCore.Builder.UseMiddlewareExtensions+<>c__DisplayClass6_1+<<UseMiddlewareInterface>b__1>d.MoveNext()
Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
SixLabors.ImageSharp.Web.Middleware.ImageSharpMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.Invoke(HttpContext context)
StackExchange.Profiling.MiniProfilerMiddleware.Invoke(HttpContext context) in MiniProfilerMiddleware.cs
Umbraco.Cms.Web.Common.Middleware.UmbracoRequestMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
Microsoft.AspNetCore.Builder.UseMiddlewareExtensions+<>c__DisplayClass6_1+<<UseMiddlewareInterface>b__1>d.MoveNext()
Umbraco.Cms.Web.Common.Middleware.PreviewAuthenticationMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
Microsoft.AspNetCore.Builder.UseMiddlewareExtensions+<>c__DisplayClass6_1+<<UseMiddlewareInterface>b__1>d.MoveNext()
Umbraco.Cms.Web.Common.Middleware.UmbracoRequestLoggingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
Microsoft.AspNetCore.Builder.UseMiddlewareExtensions+<>c__DisplayClass6_1+<<UseMiddlewareInterface>b__1>d.MoveNext()
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Expected behavior
CSS loads correctly.

Environment (please complete the following information):

  • Server OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Umbraco Version [e.g. 9.0.0]
  • Product Version [e.g. 1.0.0]

Additional context
Fix appears to be changing the RGB definition of CSS as suggested in the linked article above from:

.konstrukt-card {
    display: flex;
    align-items: center;
    background-color: white;
    border-radius: 3px;
    padding: 15px;
    border: solid 1px #f5f5f5;
    **box-shadow: 0 1px 1px 0 rgb(0 0 0 / 16%);**
}

to:

.konstrukt-card {
    display: flex;
    align-items: center;
    background-color: white;
    border-radius: 3px;
    padding: 15px;
    border: solid 1px #f5f5f5;
    **box-shadow: 0px 1px 1px 0 rgba(0, 0, 0, 0.16);**
}

Save button not visible

Describe the bug
Since updating to 1.6.0 the "Save" button is no longer visible on any collection entity edit.

When creating a new entity the 'Save' button is also not visible.

The only option on all collections is now "Return to List"

Unsure if I have misread any of the release notes has there been an update to enable the save button? Could it a permissions thing?

None of the collections have .DisableUpdate or .DisableCreate

Just noticed this in the DOM:

image

Steps To Reproduce
Steps to reproduce the behavior:

  1. Go to any collection
  2. No Save button visible

Expected behavior
The Save button should be present and clickable.

Screenshots
image

Environment (please complete the following information):

  • Server OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Umbraco Version 10.2.1
  • Product Version 1.6.0

Make the type in GetImpl nullable in custom repos

Describe the bug
I am implementing a custom repo for a UI Builder collection like this:

public class MovieUiBuilderRepository : Repository<Movie, int>


protected override Movie GetImpl(int id)
{
        throw new NotImplementedException();
}

However, based on just an ID we can't guarantee that the T type (Movie in my case) exists. It would be nice to have an option to say the T type with the id doesn't exist.

Easiest way would be if it was nullable and we could just return null.


This item has been added to our backlog AB#35173

DataView that returns no entities errors

Describe the bug

When adding a DataView (this is tested as a DataView within a category, if relevant) and when that view returns no results, then the FindEntities API call returns a 500 with the following:

The url /umbraco/backoffice/konstrukt/konstruktapi/FindEntities returns:

{"ExceptionMessage":"Value cannot be null. (Parameter 'source')","ExceptionType":null,"StackTrace":null}

This is configured with:

var today = DateTime.Today;
var nextMonth = DateTime.UtcNow.AddMonths(1);
.AddDataView("Renewal Due", "This Month", p => p.NextDueDate > today && p.NextDueDate <= nextMonth)

(Nb: the reason for the definitions of the dates being outside the Konstrukt config is that it completely error'ed when dates were supplied inline to the query - assume NPoco limitations in query conversions)

image

Steps To Reproduce
Steps to reproduce the behavior:

  1. Configure List View with DataView that would trigger no results to be returned
  2. Click on dataview after loading the list view for the collection
  3. no results are returned via api
  4. See error

Expected behavior
page loads with the standard "no results" backing text.

Environment (please complete the following information):
Server OS: Win10
Browser Chrome
Umbraco Version 9.5.0 (Also 9.4)
Product Version 1.1.0 / 1.1.1-beta0071

Additional context
Add any other context about the problem here.

using a 'blocklist editor' datatype for a field causes a 'Could not find umbVariantContent in the $scope chain' console error

hi matt,

just checking if there is support for the blocklist editor datatype? we've double checked https://docs.getkonstrukt.net/extras/known-issues and it's not mentioned as not supported...

we've created a very basic doctype with one text property on it and then created a datalist datatype that uses the doctype:

image
image

we'added a Data column to our table in sql server with a data type of nvarchar(MAX):

image

added it to our poco:

using NPoco;
using Umbraco.Cms.Infrastructure.Persistence.DatabaseAnnotations;

namespace KonstruktTesting.Core
{
	[TableName("Person")]
	[PrimaryKey("Id")]
	public class Person
	{
		[PrimaryKeyColumn]
		public int Id { get; set; }
		public string Name { get; set; }
		public string JobTitle { get; set; }
		public string Email { get; set; }
		public string Telephone { get; set; }
		public int Age { get; set; }
		public string Avatar { get; set; }
		public string Data { get; set; }
	}
}

and set the datatype for the property in our konstructor using .AddField(p => p.Data).SetDataType("Blocklist editor test"):

using Konstrukt.Configuration;
using Konstrukt.Configuration.Builders;

namespace KonstruktTesting.Core
{
	public class MyKonstruktConfigurator : IKonstruktConfigurator
	{
		public void Configure(KonstruktConfigBuilder builder)
		{
			builder.AddSectionAfter("media", "Repositories", sectionConfig => sectionConfig
				.Tree(treeConfig => treeConfig
					.AddCollection<Person>(x => x.Id, "Person", "People", "A person entity", "icon-umb-users", "icon-umb-users", collectionConfig => collectionConfig
						.SetConnectionString("dataDbDSN")
						.SetNameProperty(p => p.Name)
						.ListView(listViewConfig => listViewConfig
							.AddField(p => p.JobTitle).SetHeading("Job Title")
							.AddField(p => p.Email)
						)
						.Editor(editorConfig => editorConfig
							.AddTab("General", tabConfig => tabConfig
								.AddFieldset("General", fieldsetConfig => fieldsetConfig
									.AddField(p => p.JobTitle).MakeRequired()
									.AddField(p => p.Age)
									.AddField(p => p.Email).SetValidationRegex("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+")
									.AddField(p => p.Telephone).SetDescription("inc area code")
								)
								.AddFieldset("Media", fieldsetConfig => fieldsetConfig
									.AddField(p => p.Avatar)
								)
								.AddFieldset("Data", fieldsetConfig => fieldsetConfig
									.AddField(p => p.Data).SetDataType("Blocklist editor test")
								)
							)
						)
					)
				)
			);
		}
	}
}

attempting to create a new 'person' in the backoffice results in the following error:

Could not find umbVariantContent in the $scope chain

image

if we put the same datatype on a doctype and add content in the content tree, everything works as expected.

we've had a search, and it appears that this error has been reported in earlier versions of umbraco 8 https://github.com/skttl/umbraco-doc-type-grid-editor/issues/226 but has been fixed in later versions.

just to double check that its not a core issue, we've tried this in a projects running v9.3.1 and v9.4.1 of umbraco and get the same results.

if you could let us know if this is a bug or the blocklist editor is an unsupported datatype, that'd be great 👍


This item has been added to our backlog AB#34774

Not populating $scope.model.dataTypeKey, problems using Contentment Data Picker

Describe the bug
When using Contentment Data Picker we noticed a problem. UI builder is not populating $scope.model.dataTypeKey which Contentment use for the data picker.
More info on the bug here: leekelleher/umbraco-contentment#368 (comment)

Steps To Reproduce
Steps to reproduce the behavior:

  1. Create a datatype using Contentment Data Picker
  2. Add as datatype for a field in UI Builder
  3. Try to use the data picker
  4. See error in throwing a 404 because dataTypeKey is empty GUID.

Screenshots
If applicable, add screenshots to help explain your problem.

Environment (please complete the following information):

  • Umbraco Version 12.3.1
  • UI Builder Version 12.0.1
  • Contentment 4.5.1

This item has been added to our backlog AB#35174

BulkAction return value of false is not displayed in Umbraco alert pane

Describe the bug
When returning a result of "false" to a KonstuktActionResult the angular controller appears to throw the following exception, and no friendly message to the user appears in the Umbraco Back office.

return new KonstruktActionResult(false);

image

public class BugReproBulkAction : KonstruktAction<Settings, KonstruktActionResult>
    {
        public override string Alias => "bugRepro";

        public override string Name => "Bug Repro";

        public override bool ConfirmAction => true;

        public override void Configure(KonstruktSettingsConfigBuilder<Settings> settingsConfig)
        {
            settingsConfig.AddFieldset("General", fieldsetConfig => fieldsetConfig
                .AddField(s => s.Value).SetLabel("Value"));
        }

        public override KonstruktActionResult Execute(string collectionAlias, object[] entityIds, Settings settings)
        {
            return new KonstruktActionResult(false);
        }

        public override bool IsVisible(KonstruktActionVisibilityContext ctx)
        {
            return ctx.ActionType == KonstruktActionType.Row;
        }
    }

    public class Settings
    {
        public string Value { get; set; }
    }

Steps To Reproduce
Steps to reproduce the behavior:

  1. Click an action that triggers a KonstruktAction
  2. Return false from that action: new KonstruktActionResult(false);
  3. Error appears in console

Expected behavior
A friendly red error message is the assumed behaviour here, presented to the user in the Umbraco back office.

Environment (please complete the following information):

  • Server OS: Win10
  • Browser Chrome
  • Umbraco Version 9.5.0 (Also 9.4)
  • Product Version 1.1.0 / 1.1.1-beta0060

Additional context
new KonstruktActionResult(true); works as intended

Data View seems to use the wrong query

Describe the bug
Some of the .AddDataView configured queries seem to be executed incorrectly, when selecting from the dropdown, the database query that seems to be executed is the incorrect one.

image

Dates specified here as using NPOCO cannot translate unless static values

image

Selecting "Today":

.AddDataView("Subscription Expires", "Today", p => p.ExpiryDate == today)

Application Insights Telemetry (unconfigured): {"name":"AppDependencies","time":"2022-07-06T12:28:23.3634790Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"88e9b0700f6080b5e97e0ea69e0498d3","ai.operation.parentId":"6535ba3306856c65","ai.operation.name":"POST /umbraco/backoffice/konstrukt/konstruktapi/FindEntities","ai.location.ip":"::1","ai.internal.sdkVersion":"rdddsc:2.20.0-103","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"MATT-ROG-PC | equity-cms","id":"dfc205eb28544c6cb252ccc77c86f6e9","data":"SELECT [umbracoNode].[id] AS [Id], [umbracoNode].[path] AS [Path]\nFROM [umbracoNode]\nWHERE (([umbracoNode].[nodeObjectType] = @0))\nAND ([umbracoNode].[id] IN (@1))","duration":"00:00:00.0016567","success":true,"type":"SQL","target":"MATT-ROG-PC | equity-cms","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Dependencies', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}
Application Insights Telemetry (unconfigured): {"name":"AppDependencies","time":"2022-07-06T12:28:23.3678824Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"88e9b0700f6080b5e97e0ea69e0498d3","ai.operation.parentId":"6535ba3306856c65","ai.operation.name":"POST /umbraco/backoffice/konstrukt/konstruktapi/FindEntities","ai.location.ip":"::1","ai.internal.sdkVersion":"rdddsc:2.20.0-103","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"MATT-ROG-PC | equity-cms","id":"2ee890729c62465f81b05d26f41585de","data":"SELECT [umbracoNode].[id] AS [Id], [umbracoNode].[path] AS [Path]\nFROM [umbracoNode]\nWHERE (([umbracoNode].[nodeObjectType] = @0))\nAND ([umbracoNode].[id] IN (@1))","duration":"00:00:00.0001895","success":true,"type":"SQL","target":"MATT-ROG-PC | equity-cms","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Dependencies', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}
Application Insights Telemetry (unconfigured): {"name":"AppDependencies","time":"2022-07-06T12:28:23.3701348Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"88e9b0700f6080b5e97e0ea69e0498d3","ai.operation.parentId":"6535ba3306856c65","ai.operation.name":"POST /umbraco/backoffice/konstrukt/konstruktapi/FindEntities","ai.location.ip":"::1","ai.internal.sdkVersion":"rdddsc:2.20.0-103","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"MATT-ROG-PC | equity-cms","id":"dc86399ddc8a48aa8ca7e16afc0ab3c8","data":"SELECT TOP 1 [umbracoUserLogin].[sessionId] AS [SessionId], [umbracoUserLogin].[userId] AS [UserId], [umbracoUserLogin].[loggedInUtc] AS [LoggedInUtc], [umbracoUserLogin].[lastValidatedUtc] AS [LastValidatedUtc], [umbracoUserLogin].[loggedOutUtc] AS [LoggedOutUtc], [umbracoUserLogin].[ipAddress] AS [IpAddress]\nFROM [umbracoUserLogin] WITH (UPDLOCK)\nWHERE (([umbracoUserLogin].[sessionId] = @0))","duration":"00:00:00.0009597","success":true,"type":"SQL","target":"MATT-ROG-PC | equity-cms","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Dependencies', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}
Application Insights Telemetry (unconfigured): {"name":"AppDependencies","time":"2022-07-06T12:28:23.3728875Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"88e9b0700f6080b5e97e0ea69e0498d3","ai.operation.parentId":"6535ba3306856c65","ai.operation.name":"POST /umbraco/backoffice/konstrukt/konstruktapi/FindEntities","ai.location.ip":"::1","ai.internal.sdkVersion":"rdddsc:2.20.0-103","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"MATT-ROG-PC | equity-cms","id":"c25162dd6afb4b63988a44aa1ac125c9","data":"UPDATE [umbracoUserLogin] SET [userId] = @0, [loggedInUtc] = @1, [lastValidatedUtc] = @2, [loggedOutUtc] = @3, [ipAddress] = @4 WHERE [sessionId] = @5","duration":"00:00:00.0018394","success":true,"type":"SQL","target":"MATT-ROG-PC | equity-cms","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Dependencies', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}
Application Insights Telemetry (unconfigured): {"name":"AppDependencies","time":"2022-07-06T12:28:23.4032660Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"88e9b0700f6080b5e97e0ea69e0498d3","ai.operation.parentId":"6535ba3306856c65","ai.operation.name":"POST KonstruktApi/FindEntities [area]","ai.location.ip":"::1","ai.internal.sdkVersion":"rdddsc:2.20.0-103","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"MATT-ROG-PC | equity-cms","id":"b4db4beb27cc41788313732b7e417866","data":"SELECT COUNT(*) FROM (SELECT *\nFROM [Subscribers]\nWHERE (([Subscribers].[ExpiryDate] = @0))\n) npoco_tbl","duration":"00:00:00.0014525","success":true,"type":"SQL","target":"MATT-ROG-PC | equity-cms","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Dependencies', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}
Application Insights Telemetry (unconfigured): {"name":"AppDependencies","time":"2022-07-06T12:28:23.4063834Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"88e9b0700f6080b5e97e0ea69e0498d3","ai.operation.parentId":"6535ba3306856c65","ai.operation.name":"POST KonstruktApi/FindEntities [area]","ai.location.ip":"::1","ai.internal.sdkVersion":"rdddsc:2.20.0-103","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"MATT-ROG-PC | equity-cms","id":"8ca15ae4de12428296c927dd247d64b0","data":"SELECT *\nFROM [Subscribers]\nWHERE (([Subscribers].[ExpiryDate] = @0))\nORDER BY [Subscribers].[Id] DESC\nOFFSET @1 ROWS FETCH NEXT @2 ROWS ONLY","duration":"00:00:00.0008512","success":true,"type":"SQL","target":"MATT-ROG-PC | equity-cms","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Dependencies', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}
Application Insights Telemetry (unconfigured): {"name":"AppRequests","time":"2022-07-06T12:28:23.3605156Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"88e9b0700f6080b5e97e0ea69e0498d3","ai.operation.name":"POST KonstruktApi/FindEntities [area]","ai.location.ip":"::1","ai.internal.sdkVersion":"aspnet5c:2.20.0+51c3ed8aa3f32209edf01168f9136a3ac8486c5d","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RequestData","baseData":{"ver":2,"id":"6535ba3306856c65","name":"POST KonstruktApi/FindEntities [area]","duration":"00:00:00.0514611","success":true,"responseCode":"200","url":"https://localhost:44389/umbraco/backoffice/konstrukt/konstruktapi/FindEntities","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Requests', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}

Logs a correct dependency:
"data":"SELECT *\nFROM [Subscribers]\nWHERE (([Subscribers].[ExpiryDate] = @0))\nORDER BY [Subscribers].[Id] DESC\nOFFSET @1 ROWS FETCH NEXT @2 ROWS ONLY"

However selecting "Subscription Expired" > "Within Last Year"


Application Insights Telemetry (unconfigured): {"name":"AppDependencies","time":"2022-07-06T12:29:51.1204211Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"e0c2f67158ee7ad045ae9a3138a0440c","ai.operation.parentId":"a83a959ad52fef2a","ai.operation.name":"POST /umbraco/backoffice/konstrukt/konstruktapi/FindEntities","ai.location.ip":"::1","ai.internal.sdkVersion":"rdddsc:2.20.0-103","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"MATT-ROG-PC | equity-cms","id":"689d55c4eb2e492594195d785f531001","data":"SELECT TOP 1 [umbracoUserLogin].[sessionId] AS [SessionId], [umbracoUserLogin].[userId] AS [UserId], [umbracoUserLogin].[loggedInUtc] AS [LoggedInUtc], [umbracoUserLogin].[lastValidatedUtc] AS [LastValidatedUtc], [umbracoUserLogin].[loggedOutUtc] AS [LoggedOutUtc], [umbracoUserLogin].[ipAddress] AS [IpAddress]\nFROM [umbracoUserLogin] WITH (UPDLOCK)\nWHERE (([umbracoUserLogin].[sessionId] = @0))","duration":"00:00:00.0011016","success":true,"type":"SQL","target":"MATT-ROG-PC | equity-cms","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Dependencies', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}
Application Insights Telemetry (unconfigured): {"name":"AppDependencies","time":"2022-07-06T12:29:51.1236397Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"e0c2f67158ee7ad045ae9a3138a0440c","ai.operation.parentId":"a83a959ad52fef2a","ai.operation.name":"POST /umbraco/backoffice/konstrukt/konstruktapi/FindEntities","ai.location.ip":"::1","ai.internal.sdkVersion":"rdddsc:2.20.0-103","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"MATT-ROG-PC | equity-cms","id":"c0e2a306a2a54a69891750833c2a4012","data":"UPDATE [umbracoUserLogin] SET [userId] = @0, [loggedInUtc] = @1, [lastValidatedUtc] = @2, [loggedOutUtc] = @3, [ipAddress] = @4 WHERE [sessionId] = @5","duration":"00:00:00.0021010","success":true,"type":"SQL","target":"MATT-ROG-PC | equity-cms","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Dependencies', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}
Application Insights Telemetry (unconfigured): {"name":"AppDependencies","time":"2022-07-06T12:29:51.1527282Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"e0c2f67158ee7ad045ae9a3138a0440c","ai.operation.parentId":"a83a959ad52fef2a","ai.operation.name":"POST KonstruktApi/FindEntities [area]","ai.location.ip":"::1","ai.internal.sdkVersion":"rdddsc:2.20.0-103","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"MATT-ROG-PC | equity-cms","id":"634ff7b252334c3ab67136eab0f2d8bd","data":"SELECT COUNT(*) FROM (SELECT *\nFROM [Subscribers]\nWHERE (([Subscribers].[JoinDate] >= @0))\n) npoco_tbl","duration":"00:00:00.0014898","success":true,"type":"SQL","target":"MATT-ROG-PC | equity-cms","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Dependencies', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}
Application Insights Telemetry (unconfigured): {"name":"AppDependencies","time":"2022-07-06T12:29:51.1563218Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"e0c2f67158ee7ad045ae9a3138a0440c","ai.operation.parentId":"a83a959ad52fef2a","ai.operation.name":"POST KonstruktApi/FindEntities [area]","ai.location.ip":"::1","ai.internal.sdkVersion":"rdddsc:2.20.0-103","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RemoteDependencyData","baseData":{"ver":2,"name":"MATT-ROG-PC | equity-cms","id":"e8e7565623484587801015a26717d259","data":"SELECT *\nFROM [Subscribers]\nWHERE (([Subscribers].[JoinDate] >= @0))\nORDER BY [Subscribers].[Id] DESC\nOFFSET @1 ROWS FETCH NEXT @2 ROWS ONLY","duration":"00:00:00.0009668","success":true,"type":"SQL","target":"MATT-ROG-PC | equity-cms","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Dependencies', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}
Application Insights Telemetry (unconfigured): {"name":"AppRequests","time":"2022-07-06T12:29:51.1176985Z","tags":{"ai.application.ver":"1.0.0.0","ai.cloud.roleInstance":"matt-rog-pc","ai.operation.id":"e0c2f67158ee7ad045ae9a3138a0440c","ai.operation.name":"POST KonstruktApi/FindEntities [area]","ai.location.ip":"::1","ai.internal.sdkVersion":"aspnet5c:2.20.0+51c3ed8aa3f32209edf01168f9136a3ac8486c5d","ai.internal.nodeName":"matt-rog-pc"},"data":{"baseType":"RequestData","baseData":{"ver":2,"id":"a83a959ad52fef2a","name":"POST KonstruktApi/FindEntities [area]","duration":"00:00:00.0489672","success":true,"responseCode":"200","url":"https://localhost:44389/umbraco/backoffice/konstrukt/konstruktapi/FindEntities","properties":{"_MS.ProcessedByMetricExtractors":"(Name:'Requests', Ver:'1.1')","AspNetCoreEnvironment":"Development","DeveloperMode":"true"}}}}

Logs an incorrect dependency based on the configuration:

.AddDataView("Subscription Expired", "Within Last Year", p => p.ExpiryDate <= today && p.ExpiryDate >= lastYear)

"SELECT *\nFROM [Subscribers]\nWHERE (([Subscribers].[JoinDate] >= @0))\nORDER BY [Subscribers].[Id] DESC\nOFFSET @1 ROWS FETCH NEXT @2 ROWS ONLY","duration"

Expected behavior
Correct filter is used in data view

Environment (please complete the following information):

  • Umbraco Version 10.0.1
  • Product Version1.1.1-beta0015

Using Block list editor fails

Describe the bug
I have created a data type using Block list editor and added it to a string field using the SetDataType method. That results in a javascript error and the three loading dots in the UI.

Expected behavior
Shouldn't we be able to use all data editors? Or is that just me wanting too much?

Screenshots
block-list-editor-console-error

Environment (please complete the following information):
Umbraco 12.2
Umbraco UI builder 12.0.1


This item has been added to our backlog AB#35540

Nullref error when searching a searchable property which has a null value

Describe the bug

If you add a searchable property which is a nullable string and then have data which has null for that value it throws an exception.

Steps To Reproduce
Set up a new UI Builder dashboard, something like this:

public class KonstruktConfigurator : IConfigurator
{
    public void Configure(UIBuilderConfigBuilder builder)
    {
        builder.AddSection("Dealers", sectionConfig => sectionConfig
            .Tree(treeConfig => treeConfig
                .AddCollection<Dealer>(
                    x => x.UniqueId,
                    "Dealer",
                    "Dealers",
                    "List of dealers",
                    "icon-location-near-me",
                    "icon-users",
                    collectionConfig => collectionConfig
                        .SetRepositoryType<DealerKonstruktRepository>()
                        .SetNameProperty(x => x.Name)
                        
                        // Searchable properties
                        .AddSearchableProperty(x => x.Email)

Where Email is of type string?.

Then have data which contains classes where atleast one of them has null for the email property.

In the Repository I have code like this:

protected override PagedResult<Dealer> GetPagedImpl(int pageNumber, int pageSize, Expression<Func<Dealer, bool>> whereClause, Expression<Func<Dealer, object>> orderBy,
    SortDirection orderByDirection)
{
    var allItems = _dealerRepository.GetAllCached().GetAwaiter().GetResult();

    var res = new PagedResult<Dealer>(0, pageNumber, pageSize);

    if (allItems is null)
    {
        return res;
    }

    if (whereClause is not null) // Despite the compiler saying otherwise whereClause can be null
    {
        allItems = allItems.Where(whereClause.Compile());
    }

    if (orderBy is not null) // Despite the compiler saying otherwise orderBy can be null
    {
        allItems = orderByDirection is SortDirection.Ascending 
            ? allItems.OrderBy(orderBy.Compile()) 
            : allItems.OrderByDescending(orderBy.Compile());
    }

    List<Dealer> items;

    var totalCount = items.Count;
    items = items.Skip((pageNumber -1) * pageSize).Take(pageSize).ToList();
    
    return new PagedResult<Dealer>(totalCount, pageNumber, pageSize)
    {
        Items = items
    };
}

It fails on the allItems = allItems.Where(whereClause.Compile()); if the dataset has a searchable property which is null.
If I remove that property as searchable or if I set the value to fx an empty string instead of null it works as expected.

The error it throws is this:

An error occurred
Object reference not set to an instance of an object.

Exception Details
System.NullReferenceException, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e: Object reference not set to an instance of an object.
Stacktrace
at Umbraco.UIBuilder.Persistence.Repository`2.Umbraco.UIBuilder.Persistence.IRepository.GetPaged(Int32 pageNumber, Int32 pageSize, LambdaExpression whereClause, LambdaExpression orderBy, SortDirection orderDirection, Boolean raiseEvents)
   at Umbraco.UIBuilder.Services.EntityService.FindEntities(CollectionConfig collection, Object parentId, Int32 pageNumber, Int32 pageSize, String query, IDictionary`2 filters, String dataViewAlias, String orderBy, String orderDirection)
   at Umbraco.UIBuilder.Web.Controllers.Api.UIBuilderApiController.FindEntities(FindEntitiesPostModel postModel)
   at lambda_method538(Closure, Object, Object[])
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Logged|12_1(ControllerActionInvoker invoker)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)

Expected behavior
I would expect it not to throw and return the relevant search results.

Environment (please complete the following information):

  • Server OS: Windows
  • Browser: Edge, but not relevant I think
  • Umbraco Version: 12.1.2
  • Product Version: 12.0.0

Contentment Data picker not rendering in UI builder actions

Describe the bug
Datatype with a data picker in a custom UI builder action doesn't work. It does not render as supposed to.

Throw following error:
image

Using this code for custom action:

using Umbraco.UIBuilder.Configuration;
using Umbraco.UIBuilder.Configuration.Actions;
using Umbraco.UIBuilder.Configuration.Builders;
using Umbraco.UIBuilder.Services;
using IHostingEnvironment = Umbraco.Cms.Core.Hosting.IHostingEnvironment;

namespace MyProj.Actions.BulkActions
{
	public class TestAction : Umbraco.UIBuilder.Configuration.Actions.Action<TestActionSetting, ActionResult>
    {
        public override string Icon => "icon-edit";
        public override string Alias => "test";
        public override string Name => "Test";
        public override bool ConfirmAction => false;
        private readonly Lazy<UIBuilderConfig> _config;
        private readonly Lazy<EntityService> _entityService;
        private readonly Lazy<IHostingEnvironment> _hostingEnv;

        public TestAction(Lazy<UIBuilderConfig> config, Lazy<EntityService> entityService, Lazy<IHostingEnvironment> hostingEnv)
        {
            _config = config;
            _entityService = entityService;
            _hostingEnv = hostingEnv;
        }

        public override void Configure(SettingsConfigBuilder<TestActionSetting> settingsConfig)
        {
            settingsConfig.AddFieldset("Content", fieldsetConfig =>
            {
                fieldsetConfig.AddField(m => m.TestProperty).SetDataType("Test");
			});
        }

        public override ActionResult Execute(string collectionAlias, object[] entityIds, TestActionSetting settings)
        {
            return new ActionResult(true, new ActionNotification("Test action executed"));
        }

        public override bool IsVisible(ActionVisibilityContext ctx)
        {
            if (ctx.ActionType == ActionType.Row || ctx.ActionType == ActionType.Bulk)
            {
                return true;
            }
           
            return false;
        }
    }

    public class TestActionSetting
    {
        public string TestProperty { get; set; } = string.Empty;
    }
}

Datatype:
image

Collection:
image

Rendering:
image

Steps To Reproduce
Steps to reproduce the behavior:
1, Create a datatype using Data Picker
2. Create a custom action for UI Builder
3. Create a customer Settings Model
4. Add datatype with data picker to the settings model in configure
5. Add action to an UI Builder collection
6. Click on action
7. See property but no editor rendered.

Expected behavior
Expected editor to be rendered.

Environment (please complete the following information):

  • Server OS: Windows
  • Browser Chrome
  • Umbraco Version 13.0.3
  • Product Version 13.0.0

Additional context
Also submitted here: leekelleher/umbraco-contentment#374


This item has been added to our backlog AB#36292

Encrypted Property is not encrypted

Describe the bug
A property that is marked as Encrypted is not being encrypted in the database.

.AddEncryptedProperty(p => p.Password)

[Column("Password")] public string Password { get; set; }

Does anything else need configuring to make sure this works?

How will un-encrypted values be treated if this is fixed and left enabled?

Steps To Reproduce
Steps to reproduce the behavior:

  1. .AddEncryptedProperty(p => p.Password)
  2. Perform action against the entity (e.g. repo.Save(entity);)
  3. Check database
  4. Not encypted

Expected behavior
Property is encrypted seamlessly in the database

Screenshots
If applicable, add screenshots to help explain your problem.

Environment (please complete the following information):

  • Umbraco Version10.3.2
  • Product Version 1.6.1

Patch releases: 12.0.3, 13.0.2

Describe the bug
When accessing a property configured using the Entity Picker Value Converter, the Child Collections are missing.

Expected behavior
The child collections to be accessible when using the Value Converter.


This item has been added to our backlog AB#34772

Upgrade to Konstrukt 1.2+ & Umbraco 10

Describe the bug
On running through the update steps and upgrading of Umbraco/DB to .net 6 and 10, the site (from a front-end point of view, and the core backend works fine) but the Konstrukt section will not load.

On the very first load post-upgrade it did load, but did not load any of the data (all collections were empty). Also, when trying to create an entity it said the 'factory connection string was not configured correctly'

Have reset the value of RuntimeMinification::Version to a different value.

Any ideas on this one?

umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:147 Error: [$compile:multidir] http://errors.angularjs.org/1.8.3/$compile/multidir?p0=konstruktCollectionListView&p1=%20(module%3A%20umbraco.directives)&p2=konstruktCollectionListView&p3=%20(module%3A%20umbraco.directives)&p4=template&p5=%3Cdiv%20collection-alias%3D%22collectionAlias%22%20on-collection-loaded%3D%22onCollectionLoaded(collection)%22%20open-in-infinite-editor%3D%22false%22%3E
    at umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:25:168
    at ba (umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:103:448)
    at aa (umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:96:378)
    at umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:102:238
    at umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:159:454
    at m.$digest (umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:171:67)
    at m.$apply (umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:174:484)
    at HTMLAnchorElement.<anonymous> (umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:218:276)
    at HTMLAnchorElement.dispatch (umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:2:43064)
    at v.handle (umbraco-backoffice-js.js.vc9657c693fd9b486511f4be8ea4f4a1d6ea9d8ef:2:41048)

Screenshots
image

Environment (please complete the following information):

  • Server OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Umbraco Version 10.0.1
  • Product Version1.2.1-beta15

Additional context
Add any other context about the problem here.

Set datatype by guid

It seems currently the SetDataType() has two overload methods:

SetDataType(string name)
SetDataType(int id)

but I think if would be great to have SetDataType(Guid id) as well if having multiple environments, where the id may not be identical and the downside with datatype name is that I guess it will break if the datatype instance is renamed :)

image

Exception on opening dictionary items (or editing them) on Konstrukt 1.1.1

Describe the bug
An exception is throw when trying to update dictionary items.
Due to a package dependency we are stuck on Umbraco v9 for now (and thus Konstrukt 1.1.1). Otherwise I would have upgraded first.

Steps To Reproduce
Setup konstrukt as described in the documentation.
If you add an AddContextAppAfter the dictionary items will not be updateable anymore. Note That the AddContextAppAfter has no special configuration to stop the dictionary items from working.

.AddKonstrukt(cfg => { cfg.AddContextAppAfter("umbContent", "MyAppName", "icon-chat", ctx => {}) });

After adding (and running) the code above, a single click on a dictionary item in the backoffice. If we click a dictionary item to update them we get an exception (see below) thrown by the backoffice.

´´´
at Konstrukt.Web.Factories.KonstruktContextAppFactory.GetContentAppFor(Object source, IEnumerable1 userGroups) at System.Linq.Enumerable.SelectEnumerableIterator2.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator1.ToArray() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.OrderedEnumerable1.ToList()
at Umbraco.Cms.Core.ContentApps.ContentAppFactoryCollection.GetContentAppsFor(Object o, IEnumerable`1 userGroups)
at Umbraco.Cms.Core.Models.Mapping.CommonMapper.GetContentAppsForEntity(IEntity source)
at Umbraco.Cms.Core.Models.Mapping.DictionaryMapDefinition.Map(IDictionaryItem source, DictionaryDisplay target, MapperContext context)
at Umbraco.Cms.Core.Mapping.UmbracoMapper.Map[TTarget](Object source, Type sourceType, MapperContext context)
at Umbraco.Cms.Core.Mapping.UmbracoMapper.Map[TSource,TTarget](TSource source, MapperContext context)
at Umbraco.Cms.Web.BackOffice.Controllers.DictionaryController.GetById(Int32 id)
at lambda_method891(Closure , Object , Object[] )
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
´´´

Expected behavior
An edit box to update the dictionary item, instead you get the as you get the exception: System.NullReferenceException, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e: Object reference not set to an instance of an object.

Screenshots
If applicable, add screenshots to help explain your problem.

Environment (please complete the following information):

  • Server OS: Windows 10
  • Browser: all
  • Umbraco Version 9.5.2
  • Product Version: 1.1.1

Additional context
Add any other context about the problem here.

support for contentment datatypes

hi matt,

we've hit an issue where a contentment datatype isn't loading when set as a field datatype...

the datatype we've been exprimenting with is a datalist reading from an enum and rendering as a radio button list:

image

there are no errors raised in the logs and/or the backoffice, the datatype just doesn't appear to load:

image

appreicate contentment is a 3rd party plugin so it may not be supported but we wanted to run it by you 👍

EncryptedProperty - An error occurred during a cryptographic operation

Describe the bug

On create when encrypted property is enabled:

This exception was originally thrown at this call stack:
    Konstrukt.Web.Models.Mappers.KonstruktEditorMapper.ToEditModel(Konstrukt.Configuration.IFieldsetsConfig, string, object, bool, System.Collections.Generic.IEnumerable<Konstrukt.Configuration.KonstruktPropertyConfig>)
    Konstrukt.Web.Models.Mappers.KonstruktEntityMapper.ToEditModel(Konstrukt.Configuration.IKonstruktCollectionSourceConfig, Konstrukt.Configuration.KonstruktCollectionConfig, object)
    Konstrukt.Web.Controllers.Api.KonstruktApiController.GetEntityScaffold(string)
    Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultTypeMapper, Microsoft.Extensions.Internal.ObjectMethodExecutor, object, object[]) in ActionMethodExecutor.cs
    Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync.__Logged|12_1(Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker)
    System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() in ExceptionDispatchInfo.cs

On edit:

umbraco-backoffice-js.js.ve9bf0a294753f0d315f2945b571183f59d92ae25:152 Possibly unhandled rejection: {"errorMsg":"Failed to get entity by id","data":{"ExceptionMessage":"An error occurred during a cryptographic operation.","ExceptionType":null,"StackTrace":null},"status":500}

Steps To Reproduce
Steps to reproduce the behavior:

  1. configure an encrypted property .AddEncryptedProperty(p => p.SecureValue)
  2. Click on edit/create
  3. record fails to load, or error is thrown
  4. See error

Expected behavior
normal operation of create/edit functionality - unsure how encrypted property is intended to show

Environment (please complete the following information):

  • Server OS: Windows
  • BrowserChrome
  • Umbraco Version 9.5.0
  • Product Version 1.1.1-beta0026

Angular error when adding a custom action in the ContainerMenu

Describe the bug
I've added a custom action that I want to trigger from the containermenu. It gets added just fine, but when I click it and try to execute it throws an error:

angular.js:15697  Error: [$injector:unpr] http://errors.angularjs.org/1.8.3/$injector/unpr?p0=uibMenuActionServiceProvider%20%3C-%20uibMenuActionService
    at angular.js:99:1
    at angular.js:4991:19
    at Object.d [as get] (angular.js:5151:32)
    at angular.js:4996:28
    at Object.d [as get] (angular.js:5151:32)
    at Object.executeMenuAction (umbraco.services.min.js?d=638345992050000000:1:71214)
    at scope.executeMenuItem (umbraco.directives.min.js?d=638345992050000000:1:173214)
    at fn (eval at compile (angular.js:16548:15), <anonymous>:4:238)
    at e (angular.js:29123:13)
    at m.$eval (angular.js:19523:16)

Steps To Reproduce
Steps to reproduce the behavior:

  1. Add a custom action:
public class ImportAction : Umbraco.UIBuilder.Configuration.Actions.Action<ActionResult>
{
    public override string Alias => "importDealers";
    public override string Name => "Import dealers from old site";
    public override string Icon => "icon-page-down";
    
    public override ActionResult Execute(string collectionAlias, object[] entityIds)
    {
        return new ActionResult(true);
    }
}
  1. Set it to the ContainerMenu in the configurator:
.AddAction<ImportAction>(actionConfig => actionConfig
                            .SetVisibility(x => x.ActionType == ActionType.ContainerMenu))
  1. It shows up just fine in the backoffice, but when clicking it the error occurs.
    image

Expected behavior
I'd expect it to hit the action code

Environment (please complete the following information):

  • Server OS: Windows
  • Browser Edge
  • Umbraco Version 12.1.2
  • Product Version 12.0.1

This item has been added to our backlog AB#34766

Tree alias not found when adding virtual sub tree to Vendr Store

Describe the bug
Adding a VirtualSubTree to a store in Vendr throws a Could not retrieve tree alias exception (full trace log below). I've tested this on two separate projects running Umbraco 10.3.2 and 11.2.0 and it happens on both.

Steps To Reproduce
Steps to reproduce the behavior:

  1. Setup project with Vendr and Konstrukt installed
  2. Add the code below to the startup class
  3. Navigate to any store within Vendr and expand it's tree
  4. See error (I've attached it below, beneath the code block)

Expected behavior
I expected the node to be appended to the Store subtree, like this example.

Environment (please complete the following information):

  • Umbraco 10.3.2 and 11.2.0
  • Konstruct 1.6.4
  • Vendr 3.0.10
                .AddKonstrukt(k =>
                {
                    k.WithSection("commerce", sectionConfig => sectionConfig
                        .WithTree("vendr", treeConfig => treeConfig
                            .AddVirtualSubTreeAfter(ctx => Guid.TryParse(ctx.Source.Id, out _), tn => tn.Name == "Analytics", virtualTreeConfig => virtualTreeConfig
                                .AddCollection<Notification>(x => x.Id, x => x.StoreId, "Notification", "Notifications", "A product notification", "icon-bell", "icon-bell", collectionConfig => collectionConfig
                                    .SetNameFormat(p => p.Email)
                                    .SetDateCreatedProperty(x => x.DateCreated)
                                    .DisableCreate()
                                    .AddDataView("Pending", x => x.Status == NotificationStatus.Pending)
                                    .AddDataView("Notified", x => x.Status == NotificationStatus.Notified)
                                    .Editor(editorConfig => editorConfig
                                        .AddTab("General", tabConfig => tabConfig
                                            .Sidebar(sidebarConfig => sidebarConfig
                                                .AddFieldset("Info", fieldsetConfig => fieldsetConfig
                                                    .AddField(p => p.DateCreated).MakeReadOnly()
                                                )
                                            )
                                            .AddFieldset("General", fieldsetConfig => fieldsetConfig
                                                .AddField(p => p.ProductReference).SetDataType("Product Picker")
                                                .AddField(p => p.Email).SetValidationRegex("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+")
                                                .AddField(p => p.Status).SetDataType("Notification Status")
                                            )
                                        )
                                    )
                                )
                            )

                        )
                    );
                })
at Umbraco.Deploy.UI.Tree.TreeIntegration.GetTreeAlias(String treeAliasFromNotification, FormCollection queryString)
   at Umbraco.Deploy.UI.Tree.TreeIntegration.UpdateNodesForDeploy(TreeNodesRenderingNotification notification)
   at Umbraco.Deploy.UI.Tree.TreeIntegrationNotificationHandler.Handle(TreeNodesRenderingNotification notification)
   at Umbraco.Cms.Core.Events.EventAggregator.PublishCore(IEnumerable`1 allHandlers, INotification notification)
   at Umbraco.Cms.Core.Events.NotificationHandlerWrapperImpl`1.Handle(INotification notification, ServiceFactory serviceFactory, Action`2 publish)
   at Umbraco.Cms.Core.Events.EventAggregator.PublishAsync[TNotification](TNotification notification, CancellationToken cancellationToken)
   at Umbraco.Cms.Web.BackOffice.Trees.TreeControllerBase.GetNodes(String id, FormCollection queryStrings)
   at Konstrukt.Web.Events.Handlers.InjectKonstruktVirtualSubTrees.<>c__DisplayClass8_0.<<HandleAsync>b__0>d.MoveNext()
--- End of stack trace from previous location ---
   at Konstrukt.ScopedExecutionContext.ExecuteAsync(Func`3 action, CancellationToken cancellationToken)
   at Konstrukt.Web.Events.Handlers.InjectKonstruktVirtualSubTrees.HandleAsync(TreeNodesRenderingNotification notification, CancellationToken cancellationToken)
   at Umbraco.Cms.Core.Events.EventAggregator.PublishCoreAsync(IEnumerable`1 allHandlers, INotification notification, CancellationToken cancellationToken)
   at Umbraco.Cms.Web.BackOffice.Trees.TreeControllerBase.GetNodes(String id, FormCollection queryStrings)
   at lambda_method1131(Closure , Object )
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)

This item has been added to our backlog AB#34771

'SetConnectionString' appears to be being ignored on a collection

hey there matt,

we've been experimenting the 'SetConnectionString' configuration setting for a collection using the 'creating your first integration' section in the docos.

however, we've run into some difficulties in that the connection string appears to be being ignored. the project set up is as follows with a base install of umbraco 9:

image

the databases are running on a local sql server express 2019:

image

the connections stings are:

"ConnectionStrings": {
  "umbracoDbDSN": "Server=localhost\\sqlexpress2019;Database=KonstruktTesting;Integrated Security=true",
  "dataDbDSN": "Server=localhost\\sqlexpress2019;Database=KonstruktTesting-Data;Integrated Security=true"
}

and the configurator code has:

using Konstrukt.Configuration;
using Konstrukt.Configuration.Builders;

namespace KonstruktTesting.Core
{
	public class MyKonstruktConfigurator : IKonstruktConfigurator
	{
		public void Configure(KonstruktConfigBuilder builder)
		{
			builder.AddSectionAfter("media", "Repositories", sectionConfig => sectionConfig
				.Tree(treeConfig => treeConfig
					.AddCollection<Person>(x => x.Id, "Person", "People", "A person entity", "icon-umb-users", "icon-umb-users", collectionConfig => collectionConfig
						.SetConnectionString("dataDbDSN")
						.SetNameProperty(p => p.Name)
						.ListView(listViewConfig => listViewConfig
							.AddField(p => p.JobTitle).SetHeading("Job Title")
							.AddField(p => p.Email)
						)
						.Editor(editorConfig => editorConfig
							.AddTab("General", tabConfig => tabConfig
								.AddFieldset("General", fieldsetConfig => fieldsetConfig
									.AddField(p => p.JobTitle).MakeRequired()
									.AddField(p => p.Age)
									.AddField(p => p.Email).SetValidationRegex("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+")
									.AddField(p => p.Telephone).SetDescription("inc area code")
								)
								.AddFieldset("Media", fieldsetConfig => fieldsetConfig
									.AddField(p => p.Avatar)
								)
							)
						)
					)
				)
			);
		}
	}
}

the connection string for the collection is being set with .SetConnectionString("dataDbDSN") usign the name set in the app settings.

the backoffice loads fine and the editor displays as expected, however saving records the following error in the logs:

image

System.Data.SqlClient.SqlException (0x80131904): Invalid object name 'Person'.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.ExecuteScalar()
   at Umbraco.Cms.Infrastructure.Persistence.FaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)
   at NPoco.Database.ExecuteScalarHelper(DbCommand cmd)
   at NPoco.Database.ExecuteScalar[T](String sql, CommandType commandType, Object[] args)
   at NPoco.Database.ExecuteScalar[T](Sql Sql)
   at NPoco.Database.ExecuteScalar[T](String sql, Object[] args)
   at NPoco.Database.PageImp[T,TRet](Int64 page, Int64 itemsPerPage, String sql, Object[] args, Func`3 executeQueryFunc)
   at NPoco.Database.Page[T](Int64 page, Int64 itemsPerPage, String sql, Object[] args)
   at NPoco.Database.Page[T](Int64 page, Int64 itemsPerPage, Sql sql)
ClientConnectionId:25763da0-c8b2-4454-967d-3eba02340991
Error Number:208,State:1,Class:16

the reason we think the 'dataDbDSN' is being ignored is that if we create the 'person' table in the umbraco database and run up the code, the editor saves the record without any problems.

do you think there might be a bug or have we messed something up in our configuration?

Saving a node does't close the editor

Describe the bug
Hi @mattbrailsford I'm using your Konstruct app with a custom repository, and that's why I'm not 100% sure if this is a bug or just me using your great package in the wrong way.

But while I was debugging that within the collectionlistview.directive there is a block of code where the editorSerice.Close is commented.

                    if ($scope.openInInfiniteEditor) {
                        editorService.open({
                            collectionAlias: item.collectionAlias,
                            id: item.id,
                            parentId: $scope.parentEntityId,
                            // virtualNodePrefix: $scope.virtualNodePrefix,
                            submit: function (model) {
                                $scope.$broadcast("konstrukt.reloadListView");
                                //editorService.close();
                            },
                            close: function () {
                                editorService.close();
                            },
                            view: "/App_Plugins/Konstrukt/backoffice/konstrukt/edit.html"
                        });
                    } else {
                        $location.path(item.editPath);
                    }
                },```

![image](https://user-images.githubusercontent.com/3866444/234931827-3cc1ff78-ee5d-4c14-b47d-6ab9ac2f5e67.png)


**Steps To Reproduce**
Steps to reproduce the behavior:
1. Edit or create a new entity
2. Click on save 
3. we receive the success but the dialog is not close

**Expected behavior**
Close the dialog once the update/insert is complete

**Screenshots**
![image](https://user-images.githubusercontent.com/3866444/234931827-3cc1ff78-ee5d-4c14-b47d-6ab9ac2f5e67.png)

**Environment (please complete the following information):**
 - Windows 10
 - Browser all
 - Umbraco Version version 10.4.2
 - Product Version1.6.4


---
_This item has been added to our backlog AB#34769_

Boolean property not rendered correctly with .AddFilterableProperty(p => p.BooleanField

Describe the bug
When using FilterableProperty with a boolean type, the rendered UI component is a free text field, which is not suitable.

Steps To Reproduce
Steps to reproduce the behavior:

  1. Configure a bool property with .AddFilterableProperty(p => p.BooleanField)
  2. Field is rendered with a text box

Expected behavior
Should be rendered with a radio/picker suitable for boolean value that binds to a bool property.

Screenshots
If applicable, add screenshots to help explain your problem.

KonstruktFileActionResult downloads corrupted Word DOCX

Describe the bug
I'm unsure if this is unrelated to KonstruktFileActionResult but, using the following code, I am reading a Media file from the Media Library, via a KonstruktAction, using a KonstruktPicker on a "Media Picker" type in the ActionSettings, which then loads the Media file into memory, and is supposed to download it to the user executing the bulk action.

image

If i use the commented code to write to the file system directly, then my file is uncorupted and as expected. But using the FileActionResult mechanism produces the following issues when opening:

image

Selecting yes

image

The contentType it infers is: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"

The resulting file sizes are drastically different on the file system too.

Does the File Action Result set the Content-Length header? I've read that can cause issues.

Environment (please complete the following information):

  • Umbraco Version [10.3.2]
  • Product Version [1.6.4]

Fields in Sidbar are not included when creating item

Fields in Sidebar is not included in form-data when creating a new item.
If field is moved to "standard" fieldset it is included.

image

image

image

  • Umbraco Version 12.2.0
  • Umbraco UI Builder 12.0.2

This item has been added to our backlog AB#36362

Datepicker filter does not send payload on mobile resolution

Describe the bug
When viewing the grid on a mobile resolution, or mobile simulation (Chrome DEV tools tested with) then the date pickers do not get sent with the payload to the FindEntities method, so the grid data set does not get filtered.

.AddFilterableProperty(p => p.LastLogin, filterconfig => filterconfig .SetLabel("Last Logged In") .SetDescription("When the subscriber last logged into the newsletter site") )

Steps To Reproduce
Steps to reproduce the behavior:

  1. Activate Chrome Dev Tools - set mobile device to iPhone 12 Pro
  2. Click on filter funnel and set date range filter
  3. Apply
  4. Data not filtered

Expected behavior
Data filtered as expected by range filter

Screenshots
Payload after filter applied (Chrome Dev: :iPhone 12 Pro)
image

Payload at standard browser res:
image

Payload before filter applied:
image

Environment (please complete the following information):

  • Server OS: [e.g. iOS]
  • Browser Chrome
  • Umbraco Version 10.3.2
  • Product Version 1.6.3-beta0010

Additional context
Add any other context about the problem here.

Entity Picker - The backoffice ordering isn't adhered to in code

Describe the bug
When using the entity picker against a doc type property, selecting the entities and pulling through the IEnumerable of entities in code, it isn't giving us a list of entities in the same order as per how they are selected in the content management section of the backoffice. It appears they're just being brought through as per their default order in the custom table.

Looking in the umbracoPropertyData table, it appears the property value is being stored as an integer comma-delimeted array, and in the correct order.

I've managed to work around this for the time being with some dirty code to look up the raw int array in the umbracoPropertyData table and reordering the IEnumerable based on the order of the Id's within the array. Ideally, I shouldn't need to do this.

Steps To Reproduce
Steps to reproduce the behavior:

  1. Ensure there's at least one repository with data
  2. Apply the entity picker against a doc type property
  3. Add items via the content section in a scattered order
  4. Pull in the selected items via code which should give an IEnumerable<entity> object, loop through the selected items to be shown the items in the wrong order from how they were selected

Expected behavior
The IEnumerable<entity> should match the order of the integer comma-delimeted array.

Environment (please complete the following information):

  • Umbraco Version: 12.0.1
  • Product Version: Konstrukt 1.6.5

SetDeletedProperty hides all entities

Describe the bug
I'm trying to use .SetDeletedProperty(p => p.IsDeleted) on a collection, but it is neither showing records that have a True or False (1, 0) in the grid.

Steps To Reproduce
Steps to reproduce the behavior:

  1. .SetDeletedProperty(p => p.IsDeleted)
  2. View collection
  3. No results shown

Expected behavior
Showing all records with a "True" or "1" value in the list view

Screenshots
image

image

Environment (please complete the following information):
Server OS: Win10
Browser Chrome
Umbraco Version 9.5.0 (Also 9.4)
Product Version 1.1.0 / 1.1.1-beta0025

'System.Data.SqlClient' wasn't found

Describe the bug
Using Konstrukt in an Umbraco 10 website is working fine locally. But when we deployed the site to our staging server on Azure we get an error when trying to load the section in the backoffice.

The specified invariant name 'System.Data.SqlClient' wasn't found in the list of registered .NET Data Providers.

Exception Details
System.ApplicationException, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e: The specified invariant name 'System.Data.SqlClient' wasn't found in the list of registered .NET Data Providers.

Steps To Reproduce
Steps to reproduce the behavior:
Presumably it is environment-specific, but we deployed the site to a standard Azure App Service running on the S1 tier.

Expected behavior
We expected the custom section to load the same on our staging environment as it does on our local machines. We are not aware of any environment-specific configuration or settings we need to apply to ensure the SQL data connection can work?

Screenshots
image

Environment (please complete the following information):

  • Server OS: Azure App Service
  • Browser : Chrome 106.0.5249.103 (Official Build) (64-bit)
  • Umbraco Version : 10.0.0
  • Product Version : 1.6.0

Additional context
Our implementation is using the free version of Konstrukt, with a single collection (which is just a simple SQL table with a few columns)

Built-in import action not working

Describe the bug
When I add the KonstruktImportEntityAction, it gets added to the context menu just fine. However when I click it I get an error.

Steps To Reproduce
Steps to reproduce the behavior:

  1. Add a collection with the import action
  2. Go to the action dropdown on the page, and click the import button

Expected behavior
I'd expect a file upload field to show.

Screenshots
I click the action here:
image
It gives me this error in a popup:
image

Environment (please complete the following information):

  • Server OS: IIS Express on a Windows 11 machine
  • Browser: Edge Version 110.0.1587.57 (Officielt build) (64-bit)
  • Umbraco Version 11.2.0
  • Product Version 1.6.4

Additional context
All I did was add this to my collection:

.AddCollection<LocalizationView>(x => x.Id, "Localization", "Localizations",
                        "Translated dictionary items", collectionConfig => collectionConfig
    .SetRepositoryType<LocalizationRepository>()
    .AddAction<KonstruktExportEntityAction>()
    .AddAction<KonstruktImportEntityAction>()

The full error message:

An error occurred
No data type found with the Name: Upload File

Exception Details
System.ApplicationException, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e: No data type found with the Name: Upload File
Stacktrace
at Konstrukt.Web.Helpers.UmbracoDataTypeHelper.<>c__DisplayClass5_0.<ResolveDataType>b__0()
   at Umbraco.Extensions.AppCacheExtensions.<>c__DisplayClass5_0`1.<GetCacheItem>b__0()
   at Umbraco.Cms.Core.Cache.SafeLazy.<>c__DisplayClass1_0.<GetSafeLazy>b__0()
--- End of stack trace from previous location ---
   at Umbraco.Cms.Core.Cache.ObjectCacheAppCache.Get(String key, Func`1 factory, Nullable`1 timeout, Boolean isSliding, String[] dependentFiles)
   at Umbraco.Cms.Core.Cache.ObjectCacheAppCache.Get(String key, Func`1 factory)
   at Umbraco.Cms.Core.Cache.DeepCloneAppCache.Get(String key, Func`1 factory)
   at Umbraco.Extensions.AppCacheExtensions.GetCacheItem[T](IAppCache provider, String cacheKey, Func`1 getCacheItem)
   at Konstrukt.Web.Helpers.UmbracoDataTypeHelper.ResolveDataType(String dataTypeName, Boolean isReadOnly)
   at Konstrukt.Web.Helpers.UmbracoDataTypeHelper.ResolveDataType(DataTypeReference dataTypeRef, Boolean isReadOnly)
   at Konstrukt.Web.Models.Mappers.UmbracoPropertyMapper.ToContentPropertyDisplayModel(DataTypeReference dataTypeRef, Int32 id, String alias, String label, String description, Object value, Boolean isRequired, String regexPattern, Boolean hideLabel, Boolean isReadOnly)
   at Konstrukt.Web.Models.Mappers.KonstruktEditorMapper.ToEditModel(EditModelMappingContext ctx)
   at Konstrukt.Web.Models.Mappers.KonstruktSettingsMapper.ToEditModel(EditModelMappingContext ctx)
   at Konstrukt.Web.Controllers.Api.KonstruktApiController.GetSettingsScaffold(String collectionAlias, String settingsSourceType, String settingsSourceAlias)
   at lambda_method1637(Closure, Object, Object[])
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Logged|12_1(ControllerActionInvoker invoker)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)

This item has been added to our backlog AB#34770

Error upload file: The specified file type has been disallowed by the administrator

Describe the bug
I have this error when i upload image file.

On Startup.cs i have this code :

.AddFieldset("Media", fieldsetConfig => fieldsetConfig
.AddField(p => p.Avatar).SetDataType("Upload File")
)

Steps To Reproduce
Steps to reproduce the behavior:

  1. Go to 'Repositories'
  2. Click on 'Person'
  3. Select a person
  4. Upload image on Avatar property
  5. Error show red: The specified file type has been disallowed by the administrator

Environment (please complete the following information):

  • Umbraco Version [e.g. 11.1.0]
  • Product Version [e.g. 1.6.3]

Failed to get Entities - Enum filter without data view set

Describe the bug
When performing an Enum Filter on a Collection 500 ERROR is returned. Nothing is logged in the Log Viewer, but DEV console returns:

{"ExceptionMessage":"Sequence contains no elements","ExceptionType":null,"StackTrace":null}

The only difference to other collections where this does work is they have explcit defined Data Views, whereas the two collections that do not error.

image

.AddFilterableProperty(p => p.Brand, filterconfig => filterconfig
      .SetLabel("Newsletter")
      .SetDescription("The magazine brand")
  )
[Column("Brand")]
public Brand Brand { get; set; }

Steps To Reproduce
Steps to reproduce the behavior:

  1. Configure Collection with code as defined above
  2. Click on funnel icon to filter and choose value
  3. Click Apply
  4. See error

Expected behavior
The collection is filtered correctly.

Environment (please complete the following information):

  • Umbraco Version 10.3.2
  • Product Version 1.6.3-beta0008

Dependency issue when installing UIBuilder alongside uSync in a v12 Umbraco website

I have an Umbraco 12 site. I've installed Umbraco.UIBuilder (12.0.0) but now it won't run. This appears to be a dependency issue because uSync (12.1.0) and Umbraco.UIBuilder.Web.StaticAssets (12.0.0) have dependcy on different versions of Microsoft.AspNetCore.Components.Web.

Steps To Reproduce
Steps to reproduce the behavior:

  1. Run a v12 Umbraco site
  2. Install uSync (12.1.0)
  3. Install Umbraco.UIBuilder.Web.StaticAssets (12.0.0)
  4. dotnet run
  5. See the following error...

Screenshot 2023-11-01 170836


This item has been added to our backlog AB#34767

Run server side validation on action settings dialog

Currently when edditing the settings of an action, we can add required validation no problem, but regex validation doesn't work.

On further investigation this looks to be because Umbraco performs regex validation server side and so we need to find a way to perform the server side validation.

I think we may need to add an endpoint explicitly for validating a model and have that run the validation tests and return the results for Konstrukt to check before closing the dialog and continuing.


This item has been added to our backlog AB#34773

.MakeRequired() no longer mandates values when creating

Describe the bug
Updated to both 1.1.0 and the nightly on 1.1.1-beta0060 and using either:

.AddField(p => p.Email, cfg => cfg.MakeRequired())

or

.AddField(p => p.Email).MakeRequired()

results in validation not firing, nor the expected red asterisk on the property/field.

Steps To Reproduce
Steps to reproduce the behavior:

  1. Configure entity with field under fieldset with either .MakeRequired() on the field config extension method, or as method
  2. Click create on entity in backoffice UI
  3. Exception thrown as attempts to save entity with missing required field
  4. See error

Expected behavior
red asterisk marking mandatory field, and validation fired on save attempt.

Screenshots
image

Environment (please complete the following information):

  • Server OS: Win10
  • Browser Chrome
  • Umbraco Version 9.5.0 (Also 9.4)
  • Product Version 1.1.0 / 1.1.1-beta0060

Event Deleted and Deleting notifications cannot obtain the Entity

Describe the bug
When using the events KonstruktEntityDeletingNotification or KonstruktEntityDeletedNotification the .Entity property is of type "object" and so you cannot, as per the docs, obtain details of the Entity - it looks like it is actually a OperationResult under the hood. But you cannot cast to that as it requires a value type, i believe.

public class SubscriberDeletedEventHandler : INotificationHandler<KonstruktEntityDeletingNotification>
    {
        private readonly IMemberService _memberService;

        public void Handle(KonstruktEntityDeletingNotification notification)
        {
            var subscriber = notification.Entity.**After** as SubscriberDto;

Expected behavior
(https://docs.getkonstrukt.net/advanced/events#konstruktentitydeletednotification)

Environment (please complete the following information):

  • Umbraco Version 9.5.0
  • Product Version 1.1.1

Entity Picker used in Konstrukt editor has validation issues

Describe the bug
My IKonstruktConfigurator sets a Field for my Editor, that uses an Entity Picker. Field is required. If you trigger validation such that validation fails, because an entity has not been picker, it is not possible to clear the validation error by subsequently picking an editor.

Worse still, the issue appears to persist when you load another entity in to the Editor that has the property in question populated. The page must be refreshed (F5) to clear the validation errors. Even changes Sections doesn't clear the issue

Steps To Reproduce
Steps to reproduce the behavior:

        treeConfig.AddCollection<ResourceModel>(x => x.Id, "Resource", "Resources", "A resource entity", "icon-book", "icon-books", collectionConfig => collectionConfig
            .SetRepositoryType<ResourcesRepository>()
                .SetNameProperty(p => p.Name)

                .Editor(editorConfig => editorConfig
                    .AddTab("Meta data", tabConfig => tabConfig
                        .AddFieldset("Discover", fieldsetConfig => fieldsetConfig
                            .AddField(p => p.Topics)
                                .SetDataType(Constants.DataTypeNames.TopicsPicker)
                                .SetValueMapper<TopicValueMapper>()
                                .MakeRequired()
                        )
                    )
                )
        )
  1. Create an entity with an Entity Picker field that is required
  2. Try to add a new entity by only entering a name (Entity Picker field is empty)
  3. Receive validation error
  4. Populate the Entity Picker field, and click Save

Expected behavior
Entity should Save

Screenshots

image

Environment (please complete the following information):

  • Server OS: Win 11
  • Browser: Edge
  • Umbraco Version: 11.3.1
  • Product Version: 1.6.5**-beta007**

Additional context
NB: I'm using the beta version still.


This item has been added to our backlog AB#34768

SqlDateTimeOverFlow when only one of the paired FilterableProperty for a DateTime is provided

Describe the bug
When using .AddFilterableProperty(p => p.DateField) on a DateTime field, and when using the filter only the first value is provided the following exception occurs:

image

Nb: When two dates are provided, then the second value is removed, the entities are returned as expected. This only occurs when for the first "apply" of the filter only the first date of the pair is provided:

System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
   at System.Data.SqlTypes.SqlDateTime.FromTimeSpan(TimeSpan value)
   at System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime value)
   at System.Data.SqlClient.MetaType.FromDateTime(DateTime dateTime, Byte cb)
   at System.Data.SqlClient.TdsParser.WriteUnterminatedValue(Object value, MetaType type, Byte scale, Int32 actualLength, Int32 encodingByteSize, Int32 offset, TdsParserStateObject stateObj, Int32 paramSize, Boolean isDataFeed)
   at System.Data.SqlClient.TdsParser.TDSExecuteRPCAddParameter(TdsParserStateObject stateObj, SqlParameter param, MetaType mt, Byte options)
   at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean isCommandProc, Boolean sync, TaskCompletionSource`1 completion, Int32 startRpc, Int32 startParam)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
   at System.Data.SqlClient.SqlCommand.ExecuteScalar()
   at Umbraco.Cms.Infrastructure.Persistence.FaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)
   at NPoco.Database.ExecuteScalarHelper(DbCommand cmd)
   at NPoco.Database.ExecuteScalar[T](String sql, CommandType commandType, Object[] args)
   at NPoco.Database.ExecuteScalar[T](Sql Sql)
   at NPoco.Database.ExecuteScalar[T](String sql, Object[] args)
   at NPoco.Database.PageImp[T,TRet](Int64 page, Int64 itemsPerPage, String sql, Object[] args, Func`3 executeQueryFunc)
   at NPoco.Database.Page[T](Int64 page, Int64 itemsPerPage, String sql, Object[] args)
   at NPoco.Database.Page[T](Int64 page, Int64 itemsPerPage, Sql sql)

Steps To Reproduce
Steps to reproduce the behavior:

  1. Go to Filter tab of collection which includes a DateTime field property
  2. Click on the first of the date pair filter inputs, and choose a date. Do not pick a "to" date value.
  3. Apply filter
  4. See error

Expected behavior
The "from" date value should be used to filter the entity collection

Environment (please complete the following information):

  • Server OS: Win10
  • Browser Chrome
  • Umbraco Version 9.5.0 (Also 9.4)
  • Product Version 1.1.0 / 1.1.1-beta0060

Additional context
This does not occur in reverse, if only the "to" date pair value is supplied but no "from" value is selected.

RTE not rendering anymore

Describe the bug
Using RTE fails after upgrade to latest version. Only displays loading dots when trying to render.
image

Steps To Reproduce
Steps to reproduce the behavior:

  1. Add a property with a RTE datatype
  2. Try to edit the entity
  3. See error

Expected behavior
Render the RTE editor.

Screenshots
image

Environment (please complete the following information):

  • Browser Chrome
  • Umbraco Version 13.0.1
  • Product Version 13.0.0

Additional context
Throws a javascript error "Could not find umbVariantContent" in console when trying to edit an entity with a RTE datatype.
image


This item has been added to our backlog AB#36102

extending an existing section has unexpected results...

Describe the bug
hey there matt,

we've hit an interesting one today related to extending an existing section... it might be a bug, it might how we're setting it up but we thought we'd run it by you 👍

Steps To Reproduce
this is our code - we can't run both at the same time but we've left both uncommented :

namespace BCNAMyJourney.Web.Core.Components
{
	public class KonstruktConfigurator : IKonstruktConfigurator
	{
		public void Configure(KonstruktConfigBuilder builder)
		{
			builder.AddSectionAfter("media", "Search Tracking", sectionConfig => sectionConfig
				.Tree(treeConfig => treeConfig

					.AddCollection<SearchTrackingPoco>(x => x.Id, "Entry", "Entries", "A search entity", "icon-document", "icon-documents", collectionConfig => collectionConfig
						.SetConnectionString("umbracoDbDSN")
						.SetNameProperty(p => p.Query)
						.ListView(listViewConfig => listViewConfig
							.AddField(p => p.Query)
							.AddField(p => p.Frequency)
							.AddField(p => p.LastSearched)
						)
						.Editor(editorConfig => editorConfig
							.AddTab("Data", tabConfig => tabConfig
								.AddFieldset("Content", fieldsetConfig => fieldsetConfig
									.AddField(p => p.Query)
									.AddField(p => p.Frequency)
									.AddField(p => p.LastSearched)
								)
							)
						)
					)
				)
			);

			builder.WithSection("siteAdmin").AddTree("Search Tracking", "icon-folder", treeConfig =>
			{
				treeConfig
					.AddCollection<SearchTrackingPoco>(x => x.Id, "Entry", "Entries", "A search entity", "icon-document", "icon-documents", collectionConfig => collectionConfig
						.SetConnectionString("umbracoDbDSN")
						.SetNameProperty(p => p.Query)
						.ListView(listViewConfig => listViewConfig
							.AddField(p => p.Query)
							.AddField(p => p.Frequency)
							.AddField(p => p.LastSearched)
						)
						.Editor(editorConfig => editorConfig
							.AddTab("Data", tabConfig => tabConfig
								.AddFieldset("Content", fieldsetConfig => fieldsetConfig
									.AddField(p => p.Query)
									.AddField(p => p.Frequency)
									.AddField(p => p.LastSearched)
								)
							)
						)
					);
			});
		}
	}
}

Expected behavior
the first chunk of code works as expected:

image

however the 2nd chunk of code where we're trying to add to our custom siteAdmin section is producing the following:

image

Additional context
the main thing to highlight is that we're trying to add the tree to a existing custom section, not one of the umbraco core sections.

we're still playing with the code but thought we'd run this by you - do you think this is a bug, or have we messed out our code?!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.