Completed
Last Updated: 14 Nov 2024 09:29 by ADMIN
Release 7.0.0

The TileLayout should not render tabindex="0" on its tiles when Navigable="false".

Here is a test page with a workaround:

@inject IJSRuntime js

<p>Tab through the textboxes:</p>

<input />

<TelerikTileLayout Columns="2"
                   RowHeight="200px"
                   Resizable="false"
                   Reorderable="false"
                   Navigable="false"
                   Class="tilelayout-tabindex-remove">
    <TileLayoutItems>
        <TileLayoutItem HeaderText="Tile 1">
            <Content>
                <p>TileLayout Navigable="false" - will focus the inner textbox and will not focus the tiles.</p>
                <input />
            </Content>
        </TileLayoutItem>
        <TileLayoutItem HeaderText="Tile 2">
            <Content>Tile 2 content.</Content>
        </TileLayoutItem>
    </TileLayoutItems>
</TelerikTileLayout>

<input />

<TelerikTileLayout Columns="2"
                   RowHeight="200px"
                   Resizable="false"
                   Reorderable="false"
                   Navigable="true">
    <TileLayoutItems>
        <TileLayoutItem HeaderText="Tile 1">
            <Content>
                <p>TileLayout Navigable="true" - will not focus the inner textbox and will focus the tiles. Focus the textbox with Enter when on the tile.</p>
                <input />
            </Content>
        </TileLayoutItem>
        <TileLayoutItem HeaderText="Tile 2">
            <Content>Tile 2 content.</Content>
        </TileLayoutItem>
    </TileLayoutItems>
</TelerikTileLayout>

<input />

<script suppress-error="BL9992">

    function removeTabindexFromTiles(selector) {
        var tileLayout = document.querySelector(selector);

        if (!tileLayout) {
            return;
        }

        tileLayout.querySelectorAll(".k-tilelayout-item").forEach(el => {
            el.removeAttribute("tabIndex");
        });
    }

</script>

@code {
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            await Task.Delay(1); // ensure HTML is ready
            await js.InvokeVoidAsync("removeTabindexFromTiles", ".tilelayout-tabindex-remove");
        }

        await base.OnAfterRenderAsync(firstRender);
    }
}

 

Completed
Last Updated: 14 Nov 2024 09:27 by ADMIN
Release 7.0.0

We have a tile layout control within a tab page used on the whole page, we have resizing and moving enabled by dragging. Works well on desktop however on ios safari users are unable to scroll on the page, instead the page either does not move or tiles resize/move. If we disable only resizable or reorderable, the page is still not scrollable.

===

ADMIN EDIT

===

The only option for the time being is to disable resizing and reordering on mobile devices.

Completed
Last Updated: 14 Nov 2024 09:27 by ADMIN
Release 7.0.0

When in a div with display:flex, I cannot resize the tiles to the right as I expect to - they stop resizing before I reach the end of the tile layout.

---

ADMIN EDIT

Here is a sample you can use to observe the issue - try resizing the tiles and change the size of the layout offset. For cleanest results do this in a blank app that has absolutely no other styles (so no other layout is in play).

A short gif is attached at the end of this post that shows the problem.

<TelerikNumericTextBox @bind-Value="@width" Step="20" Min="0" Max="800"></TelerikNumericTextBox>
@code{
    int width { get; set; } = 200;
}
<div style="display:flex; flex-direction: row;">
    <div style="width: @(width)px; background: yellow;">
        some content on the left. When this is here, resizing tiles cannot use the full width of the tile layout
        - it stops short with the offset by this element due to the flex layout.
        Change the width of this element to see the effect - as you increase you will stop being
        able to resize 1column tiles at all. If you decrease, eventually you will be.
    </div>
    <div style="position: relative; display: block;"> @* THE WORKAROUND - REMOVE TO SEE THE PROBLEM *@
        <TelerikTileLayout ColumnWidth="200px"
                           RowHeight="150px"
                           Width="700px"
                           Columns="3"
                           Resizable="true">
            <TileLayoutItems>
                <TileLayoutItem HeaderText="Panel 1">
                    <Content>Regular sized first panel.</Content>
                </TileLayoutItem>
                <TileLayoutItem HeaderText="Panel 2">
                    <Content>You can put components in the tiles too.</Content>
                </TileLayoutItem>
                <TileLayoutItem HeaderText="Panel 3" RowSpan="3">
                    <Content>This tile is three rows tall.</Content>
                </TileLayoutItem>
                <TileLayoutItem HeaderText="Panel 4" RowSpan="2" ColSpan="2">
                    <Content>This tile is two rows tall and two columns wide</Content>
                </TileLayoutItem>
            </TileLayoutItems>
        </TelerikTileLayout>
    </div>
</div>

---

Declined
Last Updated: 04 Oct 2024 12:54 by ADMIN
Created by: Ian
Comments: 4
Category: TileLayout
Type: Feature Request
3

Here is the scenario I would like to implement:

User has a default dashboard, with Customise functionality which would:

  • Allow the user to move and resize items (same as now)
  • Add / remove item, adding using a drag and drop function from a set of tile types, for example exposed in a TelerikList component. Removing an item with a "delete" button or similar.
  • Customise tiles, for example a time period on a chart.
  • Save the state of the dashboard.

For loading and saving the dashboard with each tile having a specific content the easiest way I can see would be to bind the TelerikTileLayout to a data source:

<TelerikTileLayout Data="@TileData">

<TileConfiguration></TileConfiguration>

</TelerikTileLayout>

The data would be updated as and when the user configures their dashboard. 

For dragging and dropping new tiles a set of events would be necessary, both on the source tile list, e.g. OnDragBegin and on the tile layout OnDrop.

Duplicated
Last Updated: 15 Aug 2024 07:07 by ADMIN
Created by: John
Comments: 8
Category: TileLayout
Type: Feature Request
2

While your existing TileLayout seems to be striving for this it doesn't seem to function as intuitively, or perhaps it is supposed to but has bugs?  Ideally I'd like to have a layout component that mimics what I see in the Azure portal, however I realize from other feedback tickets you're not going to do that.  The ability to have gaps really makes the user experience better.  I understand things have to be 'touching' (eg I can't just place something off into the bottom right corner of the screen by itself) but being able to do something like you see in the attached gridstack_basic_demo_img1.jpg would be great.  

It seems easy to get into an odd state using the TileLayout, even creating gaps where I don't want them and I'm unable to fix it.  For example in telerik_tilelayout_img1.jpg you see your demo page, I have the "Bounce Rate" box with a gap above it and for whatever reason I can't even bring it UP to fill the gap (dragging it up the red arrow path and dropping it gets rejected and the box floats back to where it is in the img). 

I really want to use your TileLayout but I think using it as-is would really frustrate my userbase.  Do you have plans to improve it's functionality and overall user experience?

Thanks for your consideration

 

 

Unplanned
Last Updated: 07 Aug 2024 08:46 by ADMIN
Created by: Adrian
Comments: 3
Category: TileLayout
Type: Feature Request
6

Hi,

Is there a way we could drag the tile on those empty spaces in the tile layout? I've tried the samples in your page and it seems reorderable only reorders the tiles. Is it possible to put an option that we might be able to drag those tiles to the empty spaces instead of dragging them to another tile to switch places? See attached file as reference on what I meant.

Unplanned
Last Updated: 10 May 2024 10:53 by Zachary
Created by: Zachary
Comments: 0
Category: TileLayout
Type: Bug Report
1
I would like the tile layout to stay 4 rows in height, however, when a user reorders one of the tiles in a certain way, it extends it down to a 5th row and displaces one of the tiles in an unpleasing way, which I've shown in the attached image.
Completed
Last Updated: 15 Dec 2023 19:51 by ADMIN
I am using the TileLayout and inside the content of the TileLayoutItem I have a TelerikChart with its height parameter is set to 100%. When I resize the Tile vertically the chart does not pre-render accordingly despite using the Refresh method of its reference.
Unplanned
Last Updated: 30 Jun 2023 08:44 by Matias
Created by: Steven
Comments: 1
Category: TileLayout
Type: Feature Request
8

I want to prevent an individual TileLayoutItem from being resized or reordered when Reorderable and Resizable are enabled on component level.

===

ADMIN EDIT:

Here is a possible workaround - prevent pointer events for the tile that should not be resized and reordered. Note that users may still be able to push the "disabled" tile to a new place by reordering the other tiles.

<TelerikTileLayout Columns="3"
                   RowHeight="150px"
                   Resizable="true"
                   Reorderable="true">
    <TileLayoutItems>
        <TileLayoutItem HeaderText="Tile 1">
            <Content>Regular-sized first tile.</Content>
        </TileLayoutItem>
        <TileLayoutItem HeaderText="Tile 2">
            <Content>You can put components in the tiles too.</Content>
        </TileLayoutItem>
        <TileLayoutItem HeaderText="Tile 3" RowSpan="3" Class="disabled-tile">
            <Content>No resizing and no reordering</Content>
        </TileLayoutItem>
        <TileLayoutItem HeaderText="Tile 4" RowSpan="2" ColSpan="2">
            <Content>This tile is two rows tall and two columns wide</Content>
        </TileLayoutItem>
    </TileLayoutItems>
</TelerikTileLayout>

<style>
    .disabled-tile {
        pointer-events: none;
    }
</style>

Unplanned
Last Updated: 21 Apr 2023 11:40 by Víctor
Created by: Víctor
Comments: 0
Category: TileLayout
Type: Feature Request
2
In Kendo React there is an autoFlow parameter that controls how the auto-placement algorithm works, specifying exactly how auto-placed items get flowed.
Unplanned
Last Updated: 21 Apr 2023 11:40 by Víctor
Created by: Víctor
Comments: 0
Category: TileLayout
Type: Feature Request
5
I would like to be able to drag a tile from one TileLayout and drop it in another. 
Unplanned
Last Updated: 03 Apr 2023 14:06 by Víctor
I want to be able to set the initial position of the TileLayoutItem element. Similar to the Row and Col parameters in Kendo UI for Angular.
Completed
Last Updated: 21 Feb 2023 13:08 by ADMIN
Release 4.1.0 (15/03/2023)
Created by: Jörg
Comments: 2
Category: TileLayout
Type: Feature Request
31
I would like to use a Visible parameter for the TileLayoutItem
Completed
Last Updated: 22 Dec 2022 11:36 by ADMIN
Release 3.0.0
Creating the TileLayoutItems in a loop results in an infinite loop. If you manually define the TileLayoutItems (and remove the loop) it would work as expected.
Unplanned
Last Updated: 11 Nov 2022 12:38 by Louis
Created by: Louis
Comments: 0
Category: TileLayout
Type: Feature Request
4

### Description

Add the option to constrain the RowSpan and ColSpan of individual tiles in the TileLayout.

### Specification (if feature)

Add options to the tiles such as MinColSpan, MaxColSpan, MinRowSpan, and MaxRowSpan.


Completed
Last Updated: 04 Jul 2022 08:08 by ADMIN
Release 3.5.0

Currently, only `RowSpan` `ColSpan` and `HeaderText` parameters cause a `TileLayout` to rerender when changed.  I use `Class` changes for a lot of styling (in particular it's useful for hiding/showing a `TileLayoutItem` without losing its position in the layout) and have to manually detect and call `StateHasChanged()` when the `Class` parameter changes on `TileLayoutItem`.

Please allow dynamic change of the TileLayoutItem Class property.

Duplicated
Last Updated: 03 May 2022 11:40 by ADMIN

Hi,

We would like to request a feature wherein we can drag the tile on empty spaces and triggers the reordering of tiles. To make it some kind of docking feature on the TileLayout.

So far the workaround we see to put the tiles on those empty spaces is when you drag the tile in between tiles (between conversion rate and page views tiles) and if you drag it again on the same row it will reorder fine. Another one is to drag the tile on another tile (drag into most viewed pages tile) it will reorder the dragged tile on that empty space beside the existing tile.

https://demos.telerik.com/blazor-ui/tilelayout/overview

Here's a sample of what we did:

Unplanned
Last Updated: 27 Mar 2022 10:03 by ADMIN
Created by: Andrea
Comments: 1
Category: TileLayout
Type: Feature Request
1

In TelerikTileLayout the TileLayoutItem have the possibility to have have a HeaderText or even a HeaderTemplate, and behave as a TelerikCard, only without a footer.

Having the possibility to have a FooterTemplate would grant a better managment of the layout.

Unplanned
Last Updated: 14 Feb 2022 12:41 by Paul Bursch
Created by: Paul Bursch
Comments: 0
Category: TileLayout
Type: Feature Request
10

I am using a couple buttons in the HeaderTemplate of the tiles. It looks like their click events are sometimes not honored due to a mix up with the draggable event of the tiles when they are reorderable. Please prevent the component from stopping the click event in the tile header.

---

ADMIN EDIT

---

As a workaround for the time being, you can stop the propagation of the container wrapping the clickable elements:

 

<!-- suppress-error allows the script tag to be in a Razor file -->
<script suppress-error="BL9992">
  window.stopPropagation = (e) => {
    e.stopPropagation();
  }
</script>

<TelerikTileLayout Columns="3"
                   RowHeight="150px"
                   Resizable="true"
                   Reorderable="true">
    <TileLayoutItems>
        @{
            foreach (var tile in Tiles)
            {
                <TileLayoutItem @key="@tile">
                    <HeaderTemplate>
                        <div class="d-flex flex-col w-100 justify-content-between">
                            <div class="d-flex flex-row w-75">
                                <div class="p-2"><strong>@tile.Title</strong></div>
                            </div>
                            <div onpointerdown="stopPropagation(event)"
                                 class="d-flex flex-row w-25 justify-content-end">
                                <TelerikButton Icon="edit" Title="Edit Tile" Class="k-flat"
                                       OnClick="@(()=>EditTile(tile))">
                                </TelerikButton>
                                <TelerikButton Icon="close" Title="Delete Tile" Class="k-flat"
                                       OnClick="@(()=>DeleteTile(tile))">
                                </TelerikButton>
                            </div>
                        </div>
                    </HeaderTemplate>
                    <Content>@tile.Content</Content>
                </TileLayoutItem>
            }
        }
    </TileLayoutItems>
</TelerikTileLayout>

Event log: <TelerikButton Icon="clear" OnClick="@ClearLog">Clear Log</TelerikButton>

@if (EventLog != null)
{
    <ul>
        @foreach (string log in EventLog)
        {
            <li>
                @log
            </li>
        }
    </ul>
}

@code {
    private List<TileData> Tiles { get; set; }

    List<string> EventLog { get; set; } = new List<string>();

    async void EditTile(TileData tile)
    {
        EventLog.Add("Edit fired for " + tile.Title);        
    }

    async void DeleteTile(TileData tile)
    {
        EventLog.Add("Delete fired for " + tile.Title);
    }

    void ClearLog()
    {
        EventLog = new List<string>();
    }
    protected override void OnInitialized()
    {
        Tiles = new List<TileData>()
        {
            new TileData { Title = "Tile 1", Content = "1 - Lorem Ipsum" },
            new TileData { Title = "Tile 2", Content = "2 - Lorem Ipsum" },
            new TileData { Title = "Tile 3", Content = "3 - Lorem Ipsum" },
            new TileData { Title = "Tile 4", Content = "4 - Lorem Ipsum" },
            new TileData { Title = "Tile 5", Content = "5 - Lorem Ipsum" },
            new TileData { Title = "Tile 6", Content = "6 - Lorem Ipsum" },
        };

        base.OnInitialized();
    }

    public partial class TileData
    {
        public string Title { get; set; }
        public string Content { get; set; }

    }
}

 

Unplanned
Last Updated: 31 Jan 2022 09:16 by ADMIN
Created by: Matt
Comments: 1
Category: TileLayout
Type: Feature Request
3

I am trying to resize a TextBox inside of a TileLayoutItem on resize of the tile. I have the resize handler implemented, and is accurately firing. However, I am not seeing the ColSpan actually change on the item, which would give me a point of reference to resize the textbox.


void OnResizeHandler(TileLayoutResizeEventArgs args)
    {
        if (args.Id == "commentTile")
        {
            if (CommentLI.ColSpan==1)
            {
                CommentWidth = "270px";
            }
            else
            {
                CommentWidth = (270 + (300 * (CommentLI.ColSpan - 1))).ToString() + "px";
            }
        }
    }

1 2