Skip to content
Open
Show file tree
Hide file tree
Changes from 28 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
5929442
feat(ui5-flexible-column-layout): expose public layoutsConfiguration …
kineticjs Jun 24, 2024
8df37cf
feat(ui5-flexible-Column-layout): add tests
kineticjs Jun 26, 2024
af27415
feat(ui5-flexible-column-layout): remove json object from jsdoc
kineticjs Jun 27, 2024
64667db
feat(ui5-flexible-column-layout): public layoutsConfiguration property
kineticjs Jul 8, 2024
e881514
feat(ui5-flexible-column-layout): add sample and adjust widths of col…
kineticjs Jul 22, 2024
cb3cc8b
feat(ui5-flexible-column-layout): immediate update of layout configur…
kineticjs Jul 22, 2024
8f6514e
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Jul 22, 2024
853e84b
feat(ui5-flexible-column-layout): add sample
kineticjs Jul 30, 2024
9c4b1b2
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Jul 30, 2024
070f8b4
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Aug 13, 2025
74621e9
feat(ui5-flexible-column-layout): improve type declarations
kineticjs Aug 18, 2025
01fd0eb
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Aug 18, 2025
897be59
feat(ui5-flexible-column-layout): improve documentation
kineticjs Aug 18, 2025
3beb58b
feat(ui5-flexible-column-layout): tmp config to allow sharing a sample
kineticjs Aug 18, 2025
55a1351
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Sep 1, 2025
d9b4dd3
feat(ui5-flexible-column-layout): tests and some refactoring
kineticjs Sep 2, 2025
38227d0
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Sep 2, 2025
06f6489
feat(ui5-flexible-column-layout): fix eslint errors
kineticjs Sep 2, 2025
1b11805
feat(ui5-flexible-column-layout): fix eslint errors
kineticjs Sep 2, 2025
6e6325a
feat(ui5-flexible-column-layout): minor corrections
kineticjs Sep 2, 2025
b8f7bf5
feat(ui5-flexible-column-layout): improve sample
kineticjs Sep 2, 2025
3a57732
feat(ui5-flexible-column-layout): improve sample
kineticjs Sep 2, 2025
65e84dd
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Sep 29, 2025
fd5dd40
feat(ui5-flexible-column-layout): preserve legacy property for backwa…
kineticjs Sep 29, 2025
933ca09
feat(ui5-flexible-column-layout): correct indentation
kineticjs Sep 29, 2025
d7c4ad7
feat(ui5-flexible-column-layout): docu improvement
kineticjs Sep 29, 2025
d1449bf
feat(ui5-flexible-column-layout): docu improvement
kineticjs Sep 29, 2025
a786139
feat(ui5-flexible-column-layout): formatting improvement
kineticjs Sep 29, 2025
63a8404
feat(ui5-flexible-column-layout): formatting improvement
kineticjs Sep 29, 2025
90e285a
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Sep 30, 2025
0a9a26f
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Sep 30, 2025
6afaf64
feat(ui5-flexible-column-layout): correct version
kineticjs Oct 2, 2025
ea8b04d
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Oct 2, 2025
70cd809
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Oct 16, 2025
5d51e09
feat(ui5-flexible-column-layout): add experimental flag
kineticjs Oct 16, 2025
ead4fdf
Merge remote-tracking branch 'origin/main' into fcl-layout-config-api
kineticjs Oct 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
294 changes: 293 additions & 1 deletion packages/fiori/cypress/specs/FCL.cy.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,25 @@ describe("FlexibleColumnLayout Behavior", () => {
cy.get("@fcl")
.should("have.attr", "_visible-columns", "3");

// Assert default column widths
cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--start")
.should("have.attr", "style")
.and("include", "width: 25%");

cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--middle")
.should("have.attr", "style")
.and("include", "width: 50%");

cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--end")
.should("have.attr", "style")
.and("include", "width: 25%");

cy.get("@layoutChangeStub")
.should("not.have.been.called");
});
Expand All @@ -233,6 +252,25 @@ describe("FlexibleColumnLayout Behavior", () => {
cy.get("@fcl")
.should("have.attr", "_visible-columns", "2");

// Assert default column widths for tablet size
cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--start")
.should("have.attr", "style")
.and("include", "width: 0px");

cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--middle")
.should("have.attr", "style")
.and("include", "width: 67%");

cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--end")
.should("have.attr", "style")
.and("include", "width: 33%");

cy.get("@layoutChangeStub")
.should("have.been.calledOnce");
});
Expand Down Expand Up @@ -1116,4 +1154,258 @@ describe("Accessibility with Animation Disabled", () => {
.find(".ui5-fcl-column--middle")
.should("have.attr", "aria-hidden", "true");
});
});
});

describe("Layouts configuration", () => {
const COLUMN_MIN_WIDTH = 248;

it("initial configuration", () => {

cy.mount(
<FlexibleColumnLayout layout="TwoColumnsStartExpanded">
<div slot="startColumn">some content</div>
<div slot="midColumn">some content</div>
<div slot="endColumn">some content</div>
</FlexibleColumnLayout>
);

cy.get("[ui5-flexible-column-layout]")
.as("fcl")
.then($fcl => {
$fcl.get(0).addEventListener("layout-configuration-change", cy.stub().as("layoutConfigChangeStub"));
});

// Assert resulting column widths
cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--start")
.should("have.attr", "style")
.and("include", "width: 67%");

cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--middle")
.should("have.attr", "style")
.and("include", "width: 33%");

cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--end")
.should("have.attr", "style")
.and("include", "width: 0px");

// Assert layoutsConfiguration is initially an empty object
cy.get("@fcl")
.invoke("prop", "layoutsConfiguration")
.should("deep.equal", {});

cy.get("@layoutConfigChangeStub")
.should("not.have.been.called");
});

it("allows set configuration programatically", () => {

cy.mount(
<FlexibleColumnLayout layout="TwoColumnsStartExpanded">
<div slot="startColumn">some content</div>
<div slot="midColumn">some content</div>
<div slot="endColumn">some content</div>
</FlexibleColumnLayout>
);

cy.get("[ui5-flexible-column-layout]")
.as("fcl")
.then($fcl => {
$fcl.get(0).addEventListener("layout-configuration-change", cy.stub().as("layoutConfigChangeStub"));
});

// Set layoutsConfiguration programmatically
cy.get("@fcl")
.invoke("prop", "layoutsConfiguration", {
"desktop": {
"TwoColumnsStartExpanded": {
layout: ["75%", "25%", "0%"]
}
}
});

// Assert resulting column widths
cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--start")
.should("have.attr", "style")
.and("include", "width: 75%");

cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--middle")
.should("have.attr", "style")
.and("include", "width: 25%");

cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--end")
.should("have.attr", "style")
.and("include", "width: 0px");

cy.get("@layoutConfigChangeStub")
.should("not.have.been.called");
});

it("fires layout-configuration-change event when dragging separator within same layout", () => {
cy.mount(
<FlexibleColumnLayout
layout="TwoColumnsStartExpanded">
<div slot="startColumn">Start</div>
<div slot="midColumn">Mid</div>
<div slot="endColumn">End</div>
</FlexibleColumnLayout>
);

cy.get("[ui5-flexible-column-layout]").then(($fcl) => {
const fcl = $fcl[0];
fcl.addEventListener("layout-configuration-change", cy.stub().as("layoutConfigurationChanged"));
});

cy.get("[ui5-flexible-column-layout]").as("fcl");

// resize the columns within the same layout-type
cy.get("@fcl")
.shadow()
.find(".ui5-fcl-separator-start")
.should("be.visible")
.realMouseDown()
.realMouseMove(10, 0)
.realMouseUp();

cy.get("@layoutConfigurationChanged").should("have.been.calledOnce");
cy.get("@fcl").should("have.prop", "layout", "TwoColumnsStartExpanded");

// Check that layoutsConfiguration property has the expected structure
cy.get("@fcl").invoke("prop", "layoutsConfiguration").then((layoutsConfig: any) => {
expect(layoutsConfig).to.have.property("desktop");
expect(layoutsConfig.desktop).to.have.property("TwoColumnsStartExpanded");
expect(layoutsConfig.desktop.TwoColumnsStartExpanded).to.have.property("layout");
expect(layoutsConfig.desktop.TwoColumnsStartExpanded.layout).to.be.an("array");
expect(layoutsConfig.desktop.TwoColumnsStartExpanded.layout).to.have.length(3);
expect(layoutsConfig.desktop.TwoColumnsStartExpanded.layout).to.satisfy((arr: any[]) =>
arr.every(item => typeof item === "string")
);

// Check the exact values of the layout array
const layoutArray = layoutsConfig.desktop.TwoColumnsStartExpanded.layout;

// 1) Calling parseInt on each of them should return a number
const parsedNumbers = layoutArray.map((item: string) => parseInt(item, 10));
expect(parsedNumbers).to.satisfy((nums: number[]) =>
nums.every(num => !isNaN(num))
);

// 2) The last number should be 0
expect(parsedNumbers[2]).to.equal(0);

// 3) The first number should be greater than the second number
expect(parsedNumbers[0]).to.be.greaterThan(parsedNumbers[1]);
});
});

it("fires layout-configuration-change event when dragging separator to update the layout", () => {
cy.mount(
<FlexibleColumnLayout
layout="TwoColumnsStartExpanded">
<div slot="startColumn">Start</div>
<div slot="midColumn">Mid</div>
<div slot="endColumn">End</div>
</FlexibleColumnLayout>
);

cy.get("[ui5-flexible-column-layout]").then(($fcl) => {
const fcl = $fcl[0];
fcl.addEventListener("layout-configuration-change", cy.stub().as("layoutConfigurationChanged"));
});

cy.get("[ui5-flexible-column-layout]").as("fcl");

// resize the columns to a new layout-type
cy.get("@fcl")
.shadow()
.find(".ui5-fcl-separator-start")
.should("be.visible")
.realMouseDown()
.realMouseMove(-400, 0)
.realMouseUp();

cy.get("@layoutConfigurationChanged").should("have.been.calledOnce");
cy.get("@fcl").should("have.prop", "layout", "TwoColumnsMidExpanded");

// Check that layoutsConfiguration property has the expected structure
cy.get("@fcl").invoke("prop", "layoutsConfiguration").then((layoutsConfig: any) => {
expect(layoutsConfig).to.have.property("desktop");
expect(layoutsConfig.desktop).to.have.property("TwoColumnsMidExpanded");
expect(layoutsConfig.desktop.TwoColumnsMidExpanded).to.have.property("layout");
expect(layoutsConfig.desktop.TwoColumnsMidExpanded.layout).to.be.an("array");
expect(layoutsConfig.desktop.TwoColumnsMidExpanded.layout).to.have.length(3);
expect(layoutsConfig.desktop.TwoColumnsMidExpanded.layout).to.satisfy((arr: any[]) =>
arr.every(item => typeof item === "string")
);

// Check the exact values of the layout array
const layoutArray = layoutsConfig.desktop.TwoColumnsMidExpanded.layout;

// 1) Calling parseInt on each of them should return a number
const parsedNumbers = layoutArray.map((item: string) => parseInt(item, 10));
expect(parsedNumbers).to.satisfy((nums: number[]) =>
nums.every(num => !isNaN(num))
);

// 2) The last number should be 0
expect(parsedNumbers[2]).to.equal(0);

// 3) The first number should be smaller than the second number
expect(parsedNumbers[0]).to.be.lessThan(parsedNumbers[1]);
});
});

it("applies min width constraints", () => {

cy.mount(
<FlexibleColumnLayout layout="ThreeColumnsMidExpanded">
<div slot="startColumn">some content</div>
<div slot="midColumn">some content</div>
<div slot="endColumn">some content</div>
</FlexibleColumnLayout>
);

cy.get("[ui5-flexible-column-layout]")
.as("fcl")
.then($fcl => {
$fcl.get(0).addEventListener("layout-configuration-change", cy.stub().as("layoutConfigChangeStub"));
});

// Set layoutsConfiguration programmatically
cy.get("@fcl")
.invoke("prop", "layoutsConfiguration", {
"desktop": {
"ThreeColumnsMidExpanded": {
layout: ["10%", "80%", "10%"]
}
}
});

// Assert resulting column widths respect minimum width constraint
cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--start")
.should("have.prop", "offsetWidth", COLUMN_MIN_WIDTH);

cy.get("@fcl")
.shadow()
.find(".ui5-fcl-column--end")
.should("have.prop", "offsetWidth", COLUMN_MIN_WIDTH);

cy.get("@layoutConfigChangeStub")
.should("not.have.been.called");
});

});

Loading
Loading