Giter VIP home page Giter VIP logo

dynamicweb's Introduction

Welcome to the DynamicWeb Community Hub

Here you have the chance to influence the future direction of DynamicWeb. To do this you can go to the Issues tab and submit your wishes and ideas for new functionality in DynamicWeb or Swift.

Before submitting a feature request

If you are unsure if the functionality you are requesting is already available, please consult the DynamicWeb documentation.

Try to see if the wish/idea has already been submitted by someone else, by using the search functionality inside the Issues tab.

Up-voting a Feature Request

If you see a feature request that you also belive is a good idea, then you can upvote that feature request using the +1/"👍" reaction to the issue description. If the feature request has enough upvotes we will look into the idea and potentially add it to the backlog.

dynamicweb's People

Contributors

dw-sha avatar mrbuhl avatar

Watchers

 avatar  avatar  avatar  avatar

dynamicweb's Issues

Swift: Move repository scheduled tasks from Repository to Scheduled Tasks

For Swift installations the scheduling of index build should be moved from each Repository to 'Scheduled tasks'.

We encourage to use Settings > Integration > Scheduled tasks for scheduling the build of indexes. Firstly because this is where we want scheduled tasks to be gathered, secondly because scheduling under Repository is flawed.

Flaw: the time to build the index is added as offset to the next starting time. If build is set to start at HH:MM 00:00 and the build takes two minutes the index will start building at 00:00, 01:02, 02:04...adding a two minute offset each time. We never fixed this.

Collapse all settings on double click of settings section

When I have changed a certain setting somewhere in the settings area, I often end up with a lot of expanded nodes, before I find the relevant setting.

A possibility to "reset" the settigns node, and collapse all nodes would be very helpfull

I think in dw9 I could double click the settings area, which would trigger a "reset" of the view

Data integration job mappings - set suggested column mappings

When creating a new data integration job, when using the XML source provider for instance, the jo will automatically select the left and right columns if the column names match. But it does not always do this, for example if you are using OData provider. It would be very eficient to get an action on the table mapping "set suggested column mappings" that would automatically add all column mappings where the column name on the left and right side is the same. This action could overwrite all column mappings when clicked, but that is ok. Right now creating column mappings is a very slow and tedious process. Most of the time we name the columns the same way, so we just want this to create the table mappings for us automatically.

image

Load balancing OData requests per user

MS are changing the way limitations of OData traffic work from “per company” to “per user” (may already have been changed). This means that rather than having a limitation of e.g., 5 concurrent OData requests on one company, it now supports/will support five concurrent requests per user (i.e., per authentication in Endpoint Management).

F&O also supports the “per user” limitation, and with the increased use of OData in our BC and F&O integrations, and the additional traffic our OData approach entails (requests at least), it would be good to look into how this can be leveraged in DW.

https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/administration/operational-limits-online#FAQsUser
image

In DW terms it means we would be able to store multiple secret keys per authentication and then swap between them to balance the load evenly across the different secret keys. In BC and F&O we would set up multiple users each associated to its unique key.

Improve image optimization to follow the latest recommendations for rendering images on the web (LCP & CLS metrics)

Is your feature request related to a problem? Please describe.
The current partial to render an image(Image.cshtml) does not output an optimized image, but rather an image that uses Bootstrap ratio to fake a ratio. There are unnecessary attributes like decoding with little impact on rendering while other attributes that are recommended are missing: fetchpriority(if image is loaded above the fold), aspect ratio inline style, width and height.

Also, doNotUseGetimage parameter does not make sense if image optimization is prioritized since without passing the required parameters (width, ratio or height) you can never achieve good LCP or CLS scores.

Describe the solution you'd like

  1. Introducing the required attributes and values to improve LCP and CLS: width, height, inline aspect-ratio CSS property, fetchpriority and maybe a ratio attribute that could be used, so the height can be calculated rather than set.
  2. If possible, have a preload link to be rendered if the image is above the fold. With the current AddHeader method, you can not take advantage of preloading images that uses the srcset attribute, since it will always get the lowest image. If you remove the srcset attribute, it will only take the biggest one. I remember hearing that Snippets were not performant in Rapido but AddHeader method makes impossible preloading images in an optimal way. Example:
Dynamicweb.Context.Current.Response.AddHeader("link", $"<{src}>; rel=preload; as=image; imagesizes=100vw; imagesrcset={srcset}")
  1. Generate dynamic srcset values only for widths smaller or equal to the file that is used (this means a width & ratio property wherever an image can be uploaded)
  2. The Image.cshtml take into consideration the GridRowColumnCount to render the sizes attribute, which might not be relevant at all. If you want to have an optimized image, you want the image to be as close as possible to the rendered image. Example: I want to use a 1000px wide image in a 3 column context. This image currently will be rendered with sizes being 33vw. With the current model, the 33vw works because you are upsizing the image to 1920 by default then getting the lower and image by having the 33vw value. This will not work with a more optimized model where you can upload an image and set the width and ratio of the image you want to see in the frontend while not generating srcset attributes higher than the current input width. In this case, the GridRowColumnCount will not get the correct image from srcset.

Describe alternatives you've considered

I've created a file based on Image.cshtml without attributes I do not need. I've kept the column property since it makes sense to have it, but I did not link it to GridRowColumnCount when I used it in a custom Paragraph. This example has no preload link generated for "abovethefold" property, since I did not know how to do that.

@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.FileViewModel>

@functions {
	private static string RenderImageSrcSetAttribute(string src, double width, double ratio, int quality)
	{
		double[] breakpoints = { 412, 768, 1024, 1280, 1600, 1920 };
		string srcUrlEncode = Dynamicweb.Context.Current.Server.UrlEncode(src);
    
		return breakpoints.ToList().Where(x => x <= width).Aggregate("", (current, breakpoint) => current + ("/Admin/Public/GetImage.ashx?width=" + breakpoint + "&height=" + Convert.ToInt32(Math.Floor(breakpoint / ratio)) + "&crop=7&format=webP&quality=" + quality + "&FillCanvas=false&DoNotUpscale=true&image=" + srcUrlEncode + " " + breakpoint + "w,"));
	}

}

@if (!string.IsNullOrEmpty(Model.Path))
{
	string imagePath = Model?.Path ?? "";
	string imagePathUrlEncoded = Dynamicweb.Context.Current.Server.UrlEncode(imagePath);

	string imageQuality = GetViewParameterInt32("quality") > 0 ? $"&quality={GetViewParameterInt32("quality")}" : "";
	double imageWidth = GetViewParameterDouble("width") > 0 ? GetViewParameterDouble("width") : 1920;
	int imageHeight = GetViewParameterInt32("height") > 0 ? GetViewParameterInt32("height") : 1920;
	double imageRatio = GetViewParameterDouble("ratio") > 0 ? GetViewParameterDouble("ratio") : 1;
	int quality = GetViewParameterInt32("quality") > 0 ? GetViewParameterInt32("quality") : 95;

	string imgSizeSelector = "100vw";
	bool isFullScreenWidth = GetViewParameterBoolean("fullwidth");
	if (isFullScreenWidth)
	{
		imgSizeSelector = "100vw";
	}
	else
	{
		int imageColumnCount = GetViewParameterInt32("columns");
		if (imageColumnCount == 1)
		{
			imgSizeSelector = "100vw";
		}
		else if (imageColumnCount == 2)
		{
			imgSizeSelector = "50vw";
		}
		else if (imageColumnCount == 3)
		{
			imgSizeSelector = "33vw";
		}
		else if (imageColumnCount == 4)
		{
			imgSizeSelector = "25vw";
		}
		else if (imageColumnCount == 6)
		{
			imgSizeSelector = "17vw";
		}
	}

	string srcset = RenderImageSrcSetAttribute(imagePath,imageWidth,imageRatio,quality);
	

	@* Image sizes + a fallback image *@
	string imagePathFallBack = $"/Admin/Public/GetImage.ashx?image={imagePathUrlEncoded}&width={imageWidth}&height={imageHeight}&format=webp{imageQuality}&quality={quality}&crop=7&FillCanvas=false&DoNotUpscale=true";

	@* attributes to send to the image tag *@
	string loading = !string.IsNullOrEmpty(GetViewParameterString("abovethefold")) ? "fetchpriority=\"high\"" : "loading=\"lazy\"";
	

	var cssClass = GetViewParameter("cssClass");
	var itemprop = GetViewParameter("itemprop");
	var style = GetViewParameter("style");
	string alt = GetViewParameterString("alt");
	var id = GetViewParameter("id"); //	GetViewParameter returns null if no value is found leaving out the id attribute if no value is present for this parameter.

	if (imagePath.EndsWith(".svg", StringComparison.OrdinalIgnoreCase))
	{
		<div class="icon-auto">
			@ReadFile(Model.Path)
		</div>
	}
	else
	{
		<img srcset="@srcset"
			 src="@imagePathFallBack"
			 sizes="(max-width: 992px) 100vw, @imgSizeSelector"
			 @loading
			 class="@cssClass"
			 style="aspect-ratio: @imageWidth / @imageHeight; @style"
			 alt="@alt"
			 id="@id"
			 itemprop="@itemprop"
			>
	}
}

All variant product numbers indexed in the master product

Hi

9 out of 10 customizations we do related to IndexBuilderExtenders is adding the product numbers of a variant to the master product, so that whenever users search for any variant product number (aka SKU), they find that record.

Since we do it that often, it would probably be a good feature to add to the system.

I would envision a new auto-generated index field (only on master records) that we could then create an expression for search.

Best Regards
Nuno

Purge log data in chunks to avoid ressource issues

If "Delete logs automatically" has not previously been activated, tables like GeneralLog and EcomOrderDebuggingInfo (and others as well depending on the use) may hold millions of records reaching several years back.

When such tables are included to the log/data cleanup, and these have not previously been purged, you may experience SqlCommandTimeout and exploding log files, leading to lack of disk space and/or memory that may pull the site to its knees.

Consider deleting in chunks.

With GeneralLog as example:

DECLARE @year int
SET @year = 2018 --start this year

DECLARE @month int
SET @month = 1

DECLARE @day int
SET @day = 7 -- leave this alone. Used for deleting in chunks of 7 days to avoid log from exploding

WHILE (@year < 2024)
	WHILE (@month <= 12)
	BEGIN
	  WHILE (@day <= 35)
	  BEGIN
		DELETE FROM GeneralLog
		WHERE YEAR(LogDate) = @year
			AND MONTH(LogDate) = @month
			AND DAY(Logdate) <= @day

		SET @day = @day + 7
	  END --day
	  SET @day = 7
	  SET @month = @month + 1
	END --month
	SET @year = @year + 1
END --year

Sitemap: language specific sitemap and sitemap without product links

Today there is a single sitemap for all languages, we are missing an option to call e.g. domain/language/sitemap.xml
The sitemap also contains product catalog URL's. It would be helpful to have some settings on wheter the sitemap will exclude all product catalog URL's.

Admin UI navigation: "Open link in new tab" opens the same page again and not the actual page

image

Today there are cases where having multiple different windows and comparing them side by side can be needed. Clicking open link in new tab on a different area than you are on now, for example being on the content area and clicking open new tab (or mouse clicking) on settings, will always open the content - not the settings, or any other screen. This means that if you want to have 2 different tabs quickly you need to dupplicate your current tab and only then switch to a new one.

All users screen

The users area in DW10
image

Current problems:

  • Can't search all users, need to first know which user group the user is part of
  • When importing a user from integration, if the user is not assigned to at least 1 group - impossible to find the user in the interface

DW10: Order states visualization

When adding additional states to an order flow, this is shown on the order, but it seems that a complete order have gone through all states:

image

Most order would go from new to complete.

User provider as destination: should have the same UI as send recovery email

When going live or when a new user is imported to the platform for the first time, we send out recovery emails to users from the data integration job, for that to work an email template must be chosen in the user provider destination settings

image

This is not the same UI as the "Send recovery" action we have on the edit user screen

image

image

Selecting a page for the email and the recovery page is exactly what we want to do when unboarding new users

Clear all cache

During development or debugging it would be very helpfull to clear all cache at once somehow

File, product selector and user selector: difficult to select a file or user if folder or group has many records

Today when using the file selector, adding an image to a paragraph for example, if the folder where the file is located has more than 20 items - it is very slow and difficult (you have to use cntrl + f) to find the file you are looking for. The list is loading all the files at once with a very long scroll bar:

image

Same exact case with the user selector - when there are a lot of users in the group, the only option available is to keep scrolling to find the user you are looking for

image

Product selector: products where ProductActive is False are not shown

When a prduct is set to inactive - it is not being shown in the product selector

This is a major problem when there is a process where an inactive product is first added to a pargraph for example, and later becomes active (after enrichment or activated from integration). If this restriction is forced, the product active field is then a system field in a way, because it's main purpose at the moment is front end, but after this change, it also has consequences on the back end interface. We then need to tell all customers to only use this field when you don't want to see the product again in the product selector, and setup a different field in the product query for front end visibility, or use product publicaiton.

I will just address some of the possible critisim I already see now:

  1. Just use "Show in product list" for front end visibility and not product active. If we have to do it like this from now on then we need to be very clear about what else does the field "product active" do. I know that it can be used for limiting indexing for instance and now it seems to be also affecting the product selector. But in all my years of projects, we always use the product active fields for front end purposes only, and "show in product list" is ignored. We need a good reason to have an extra layer of activeness for a product just for the back end that would be separate from the front end.
  2. Just use publication on the product. Publication is more complicated to setup from import than a single boolean value. When a customer ticks a checkbox in the ERP system we just get the new true / false value. Publication in most cases is not necessary and is overkill

In my view, we really either need a toggle or a setting to show the inactive products in the product selector, or at least it has to be somehow more clear that such restrictions exist because it can be extremely confusing to see the product in the products area in a group and then in the same exact group in the content area not see the product without an explanation.

Repositories: not possible to copy anything

Today it is not possible to copy: repository, query or facet group. The struggle comes in most with the query, because we always want some sort of base-line when working with Swfit projects. It we want to setup a slightly different product query for example, and the "override default parameters" is not the right choice for it - we have to setup everything completely from scratch each time. Granted, this is not a common procedure to copy a query, but when it is needed - it is a very slow, manual and slightly error prone process

image

Disable autocomplete

DW Version 9.17.3

Editing an endpoint authentication, the user fields in the form is not set to autocomplete=off.
This applies to all the user fields in the different auth types.
This causes e.g. LastPass to overwrite the field when opening the setting.

image

First test issue

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Insufficient log information in live integration

I received an error trying to create an order in BC via DW10 live integration. The request failed, but the log in Dynamicweb wasn't very helpful:

04/22/2024 09:03:18.082 am: ConnectionError: An error occurred while calling CalculateOrder (ID: ORDER701, CreateOrder: True) from Web Service: 'Response status code does not indicate success: 500 (Internal Server Error).'.
04/22/2024 09:03:18.084 am: ConnectionError: Error CalculateOrder Order Id:'ORDER701' CreateOrder:'True' Message:'Response status code does not indicate success: 500 (Internal Server Error).'.
04/22/2024 09:03:18.088 am: Error: Order with ID 'ORDER701' was not created in the ERP system.

I tried submitting the same order via Postman and received a much better response message:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <s:Fault>
            <faultcode xmlns:a="urn:microsoft-dynamics-schemas/error">a:Microsoft.Dynamics.Nav.Types.NavTestFieldException</faultcode>
            <faultstring xml:lang="en-US">Blocked must be equal to 'No'  in Item: No.=10016. Current value is 'Yes'.</faultstring>
            <detail>
                <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">**Blocked must be equal to 'No'  in Item: No.=10016. Current value is 'Yes'.**</string>
            </detail>
        </s:Fault>
    </s:Body>
</s:Envelope>

In earlier versions, we would be able to see this message in the live integration log. We need this information in the log, so we don't have to use third party tools to debug.

Running custom live integration apps in DW10

In DW9 we have the opportunity to have multiple live integration assemblies so we could run different kinds of logic for e.g., different shops in the solution. This followed a standard approach of listing assemblies with specific signature and rendering the ui as a configurable addin like e.g. a discount provider.

In DW10 the live integration setup seems to be very tightly glued together with the standard live integration app.

image

This means, if we need to do a custom integration to other services, we must make a custom version of the live integration project, or make the configuration ui somewhere else.

So, having the opportunity to extend the Integration interface and add our own configurable add-ins would be helpful.

SingleSelect Listboxes auto-set first option

Is your feature request related to a problem? Please describe.
In Grid edit on DW9 the single select auto sets the first options by default, this should not be the case.
Same problem has been reported in DW10

Describe the solution you'd like
I don't want it to auto-select unverified data.

Describe alternatives you've considered
Set "Nothing selected" instead (by default)

Missing fields in Order overview

In DW10 in the backend under Commerce and Orders, it is not possible to add columns I need, like: Total price (without VAT) or Integration Number

Option to reorder the checkout steps

Minor inconvenience, but then adding a new step to an order cart checkout it is only possible to add the the end of the list. So if you have to add a new first step, you have to delete all steps and add it again.

image

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.