context("Depends On", () => {
	before(() => {
		cy.login();
		cy.visit("/app/website");
		return cy
			.window()
			.its("jingrow")
			.then((jingrow) => {
				return jingrow.xcall("jingrow.tests.ui_test_helpers.create_child_pagetype", {
					name: "Child Test Depends On",
					fields: [
						{
							label: "Child Test Field",
							fieldname: "child_test_field",
							fieldtype: "Data",
							in_list_view: 1,
						},
						{
							label: "Child Dependant Field",
							fieldname: "child_dependant_field",
							fieldtype: "Data",
							in_list_view: 1,
						},
						{
							label: "Child Display Dependant Field",
							fieldname: "child_display_dependant_field",
							fieldtype: "Data",
							in_list_view: 1,
						},
					],
				});
			})
			.then((jingrow) => {
				return jingrow.xcall("jingrow.tests.ui_test_helpers.create_pagetype", {
					name: "Test Depends On",
					fields: [
						{
							label: "Test Field",
							fieldname: "test_field",
							fieldtype: "Data",
						},
						{
							label: "Dependant Field",
							fieldname: "dependant_field",
							fieldtype: "Data",
							mandatory_depends_on: "eval:pg.test_field=='Some Value'",
							read_only_depends_on: "eval:pg.test_field=='Some Other Value'",
						},
						{
							label: "Display Dependant Field",
							fieldname: "display_dependant_field",
							fieldtype: "Data",
							depends_on: "eval:pg.test_field=='Value'",
						},
						{
							label: "Child Test Depends On Field",
							fieldname: "child_test_depends_on_field",
							fieldtype: "Table",
							read_only_depends_on: "eval:pg.test_field=='Some Other Value'",
							options: "Child Test Depends On",
						},
						{
							label: "Dependent Tab",
							fieldname: "dependent_tab",
							fieldtype: "Tab Break",
							depends_on: "eval:pg.test_field=='Show Tab'",
						},
						{
							fieldname: "tab_section",
							fieldtype: "Section Break",
						},
						{
							label: "Field in Tab",
							fieldname: "field_in_tab",
							fieldtype: "Data",
						},
					],
				});
			});
	});
	it("should show the tab on other setting field value", () => {
		cy.new_form("Test Depends On");
		cy.fill_field("test_field", "Show Tab");
		cy.get("body").click();
		cy.findByRole("tab", { name: "Dependent Tab" }).should("be.visible");
	});
	it("should set the field as mandatory depending on other fields value", () => {
		cy.new_form("Test Depends On");
		cy.fill_field("test_field", "Some Value");
		cy.findByRole("button", { name: "Save" }).click();
		cy.get(".msgprint-dialog .modal-title").contains("Missing Fields").should("be.visible");
		cy.hide_dialog();
		cy.fill_field("test_field", "Random value");
		cy.findByRole("button", { name: "Save" }).click();
		cy.get(".msgprint-dialog .modal-title")
			.contains("Missing Fields")
			.should("not.be.visible");
	});
	it("should set the field as read only depending on other fields value", () => {
		cy.new_form("Test Depends On");
		cy.fill_field("dependant_field", "Some Value");
		cy.fill_field("test_field", "Some Other Value");
		cy.get("body").click();
		cy.get('.control-input [data-fieldname="dependant_field"]').should("be.disabled");
		cy.fill_field("test_field", "Random Value");
		cy.get("body").click();
		cy.get('.control-input [data-fieldname="dependant_field"]').should("not.be.disabled");
	});
	it("should set the table and its fields as read only depending on other fields value", () => {
		cy.new_form("Test Depends On");
		cy.fill_field("dependant_field", "Some Value");
		//cy.fill_field('test_field', 'Some Other Value');
		cy.get('.jingrow-control[data-fieldname="child_test_depends_on_field"]').as("table");
		cy.get("@table").findByRole("button", { name: "Add Row" }).click();
		cy.get("@table").find('[data-idx="1"]').as("row1");
		cy.get("@row1").find(".btn-open-row").click();
		cy.get("@row1").find(".form-in-grid").as("row1-form_in_grid");
		//cy.get('@row1-form_in_grid').find('')
		cy.fill_table_field("child_test_depends_on_field", "1", "child_test_field", "Some Value");
		cy.fill_table_field(
			"child_test_depends_on_field",
			"1",
			"child_dependant_field",
			"Some Other Value"
		);

		cy.get("@row1-form_in_grid").find(".grid-collapse-row").click();

		// set the table to read-only
		cy.fill_field("test_field", "Some Other Value");

		// grid row form fields should be read-only
		cy.get("@row1").find(".btn-open-row").click();

		cy.get("@row1-form_in_grid")
			.find('.control-input [data-fieldname="child_test_field"]')
			.should("be.disabled");
		cy.get("@row1-form_in_grid")
			.find('.control-input [data-fieldname="child_dependant_field"]')
			.should("be.disabled");
	});
	it("should display the field depending on other fields value", () => {
		cy.new_form("Test Depends On");
		cy.get('.control-input [data-fieldname="display_dependant_field"]').should(
			"not.be.visible"
		);
		cy.get('.control-input [data-fieldname="test_field"]').clear();
		cy.fill_field("test_field", "Value");
		cy.get("body").click();
		cy.get('.control-input [data-fieldname="display_dependant_field"]').should("be.visible");
	});
});
