You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

control_link.js 10 KiB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. context("Control Link", () => {
  2. before(() => {
  3. cy.login();
  4. cy.visit("/app/website");
  5. });
  6. beforeEach(() => {
  7. cy.visit("/app/website");
  8. cy.create_records({
  9. doctype: "ToDo",
  10. description: "this is a test todo for link",
  11. }).as("todos");
  12. });
  13. function get_dialog_with_link() {
  14. return cy.dialog({
  15. title: "Link",
  16. fields: [
  17. {
  18. label: "Select ToDo",
  19. fieldname: "link",
  20. fieldtype: "Link",
  21. options: "ToDo",
  22. },
  23. ],
  24. });
  25. }
  26. function get_dialog_with_gender_link() {
  27. return cy.dialog({
  28. title: "Link",
  29. fields: [
  30. {
  31. label: "Select Gender",
  32. fieldname: "link",
  33. fieldtype: "Link",
  34. options: "Gender",
  35. },
  36. ],
  37. });
  38. }
  39. it("should set the valid value", () => {
  40. get_dialog_with_link().as("dialog");
  41. cy.insert_doc(
  42. "Property Setter",
  43. {
  44. doctype: "Property Setter",
  45. doc_type: "ToDo",
  46. property: "show_title_field_in_link",
  47. property_type: "Check",
  48. doctype_or_field: "DocType",
  49. value: "0",
  50. },
  51. true
  52. );
  53. cy.intercept("POST", "/api/method/xhiveframework.desk.search.search_link").as("search_link");
  54. cy.get(".xhiveframework-control[data-fieldname=link] input").focus().as("input");
  55. cy.wait("@search_link");
  56. cy.get("@input").type("todo for link", { delay: 200 });
  57. cy.wait("@search_link");
  58. cy.get(".xhiveframework-control[data-fieldname=link]").findByRole("listbox").should("be.visible");
  59. cy.get(".xhiveframework-control[data-fieldname=link] input").type("{enter}", { delay: 100 });
  60. cy.get(".xhiveframework-control[data-fieldname=link] input").blur();
  61. cy.get("@dialog").then((dialog) => {
  62. cy.get("@todos").then((todos) => {
  63. let value = dialog.get_value("link");
  64. expect(value).to.eq(todos[0]);
  65. });
  66. });
  67. });
  68. it("should unset invalid value", () => {
  69. get_dialog_with_link().as("dialog");
  70. cy.intercept("POST", "/api/method/xhiveframework.client.validate_link").as("validate_link");
  71. cy.get(".xhiveframework-control[data-fieldname=link] input")
  72. .type("invalid value", { delay: 100 })
  73. .blur();
  74. cy.wait("@validate_link");
  75. cy.get(".xhiveframework-control[data-fieldname=link] input").should("have.value", "");
  76. });
  77. it("should be possible set empty value explicitly", () => {
  78. get_dialog_with_link().as("dialog");
  79. cy.intercept("POST", "/api/method/xhiveframework.client.validate_link").as("validate_link");
  80. cy.get(".xhiveframework-control[data-fieldname=link] input").type(" ", { delay: 100 }).blur();
  81. cy.wait("@validate_link");
  82. cy.get(".xhiveframework-control[data-fieldname=link] input").should("have.value", "");
  83. cy.window()
  84. .its("cur_dialog")
  85. .then((dialog) => {
  86. expect(dialog.get_value("link")).to.equal("");
  87. });
  88. });
  89. it("should route to form on arrow click", () => {
  90. get_dialog_with_link().as("dialog");
  91. cy.intercept("POST", "/api/method/xhiveframework.client.validate_link").as("validate_link");
  92. cy.intercept("POST", "/api/method/xhiveframework.desk.search.search_link").as("search_link");
  93. cy.get("@todos").then((todos) => {
  94. cy.get(".xhiveframework-control[data-fieldname=link] input").as("input");
  95. cy.get("@input").focus();
  96. cy.wait("@search_link");
  97. cy.get("@input").type(todos[0]).blur();
  98. cy.wait("@validate_link");
  99. cy.get("@input").focus();
  100. cy.wait(500); // wait for arrow to show
  101. cy.get(".xhiveframework-control[data-fieldname=link] .btn-open").should("be.visible").click();
  102. cy.location("pathname").should("eq", `/app/todo/${todos[0]}`);
  103. });
  104. });
  105. it("show title field in link", () => {
  106. cy.insert_doc(
  107. "Property Setter",
  108. {
  109. doctype: "Property Setter",
  110. doc_type: "ToDo",
  111. property: "show_title_field_in_link",
  112. property_type: "Check",
  113. doctype_or_field: "DocType",
  114. value: "1",
  115. },
  116. true
  117. );
  118. cy.clear_cache();
  119. cy.wait(500);
  120. get_dialog_with_link().as("dialog");
  121. cy.window()
  122. .its("xhiveframework")
  123. .then((xhiveframework) => {
  124. if (!xhiveframework.boot) {
  125. xhiveframework.boot = {
  126. link_title_doctypes: ["ToDo"],
  127. };
  128. } else {
  129. xhiveframework.boot.link_title_doctypes = ["ToDo"];
  130. }
  131. });
  132. cy.intercept("POST", "/api/method/xhiveframework.desk.search.search_link").as("search_link");
  133. cy.get(".xhiveframework-control[data-fieldname=link] input").focus().as("input");
  134. cy.wait("@search_link");
  135. cy.get("@input").type("todo for link");
  136. cy.wait("@search_link");
  137. cy.get(".xhiveframework-control[data-fieldname=link] ul").should("be.visible");
  138. cy.get(".xhiveframework-control[data-fieldname=link] input").type("{enter}", { delay: 100 });
  139. cy.get(".xhiveframework-control[data-fieldname=link] input").blur();
  140. cy.get("@dialog").then((dialog) => {
  141. cy.get("@todos").then((todos) => {
  142. let field = dialog.get_field("link");
  143. let value = field.get_value();
  144. let label = field.get_label_value();
  145. expect(value).to.eq(todos[0]);
  146. expect(label).to.eq("this is a test todo for link");
  147. });
  148. });
  149. });
  150. it("should update dependant fields (via fetch_from)", () => {
  151. cy.get("@todos").then((todos) => {
  152. cy.visit(`/app/todo/${todos[0]}`);
  153. cy.intercept("POST", "/api/method/xhiveframework.desk.search.search_link").as("search_link");
  154. cy.intercept("POST", "/api/method/xhiveframework.client.validate_link").as("validate_link");
  155. cy.get(".xhiveframework-control[data-fieldname=assigned_by] input").focus().as("input");
  156. cy.get("@input").type(cy.config("testUser"), { delay: 100 }).blur();
  157. cy.wait("@validate_link");
  158. cy.get(".xhiveframework-control[data-fieldname=assigned_by_full_name] .control-value").should(
  159. "contain",
  160. "XhiveFramework"
  161. );
  162. cy.window().its("cur_frm.doc.assigned_by").should("eq", cy.config("testUser"));
  163. // invalid input
  164. cy.get("@input").clear().type("invalid input", { delay: 100 }).blur();
  165. cy.get(".xhiveframework-control[data-fieldname=assigned_by_full_name] .control-value").should(
  166. "contain",
  167. ""
  168. );
  169. cy.window().its("cur_frm.doc.assigned_by").should("eq", null);
  170. // set valid value again
  171. cy.get("@input").clear().focus();
  172. cy.wait("@search_link");
  173. cy.get("@input").type(cy.config("testUser"), { delay: 100 }).blur();
  174. cy.wait("@validate_link");
  175. cy.window().its("cur_frm.doc.assigned_by").should("eq", cy.config("testUser"));
  176. // clear input
  177. cy.get("@input").clear().blur();
  178. cy.get(".xhiveframework-control[data-fieldname=assigned_by_full_name] .control-value").should(
  179. "contain",
  180. ""
  181. );
  182. cy.window().its("cur_frm.doc.assigned_by").should("eq", "");
  183. });
  184. });
  185. it("should set default values", () => {
  186. cy.insert_doc(
  187. "Property Setter",
  188. {
  189. doctype_or_field: "DocField",
  190. doc_type: "ToDo",
  191. field_name: "assigned_by",
  192. property: "default",
  193. property_type: "Text",
  194. value: "Administrator",
  195. },
  196. true
  197. );
  198. cy.reload();
  199. cy.new_form("ToDo");
  200. cy.fill_field("description", "new", "Text Editor").wait(200);
  201. cy.save();
  202. cy.get(".xhiveframework-control[data-fieldname=assigned_by_full_name] .control-value").should(
  203. "contain",
  204. "Administrator"
  205. );
  206. // if user clears default value explicitly, system should not reset default again
  207. cy.get_field("assigned_by").clear().blur();
  208. cy.save();
  209. cy.get_field("assigned_by").should("have.value", "");
  210. cy.get(".xhiveframework-control[data-fieldname=assigned_by_full_name] .control-value").should(
  211. "contain",
  212. ""
  213. );
  214. });
  215. it("show translated text for Gender link field with language de with input in de", () => {
  216. cy.call("xhiveframework.tests.ui_test_helpers.insert_translations").then(() => {
  217. cy.window()
  218. .its("xhiveframework")
  219. .then((xhiveframework) => {
  220. cy.set_value("User", xhiveframework.user.name, { language: "de" });
  221. });
  222. cy.clear_cache();
  223. cy.wait(500);
  224. get_dialog_with_gender_link().as("dialog");
  225. cy.intercept("POST", "/api/method/xhiveframework.desk.search.search_link").as("search_link");
  226. cy.get(".xhiveframework-control[data-fieldname=link] input").focus().as("input");
  227. cy.wait("@search_link");
  228. cy.get("@input").type("Sonstiges", { delay: 100 });
  229. cy.wait("@search_link");
  230. cy.get(".xhiveframework-control[data-fieldname=link] ul").should("be.visible");
  231. cy.get(".xhiveframework-control[data-fieldname=link] input").type("{enter}", { delay: 100 });
  232. cy.get(".xhiveframework-control[data-fieldname=link] input").blur();
  233. cy.get("@dialog").then((dialog) => {
  234. let field = dialog.get_field("link");
  235. let value = field.get_value();
  236. let label = field.get_label_value();
  237. expect(value).to.eq("Other");
  238. expect(label).to.eq("Sonstiges");
  239. });
  240. });
  241. });
  242. it("show text for Gender link field with language en", () => {
  243. cy.window()
  244. .its("xhiveframework")
  245. .then((xhiveframework) => {
  246. cy.set_value("User", xhiveframework.user.name, { language: "en" });
  247. });
  248. cy.clear_cache();
  249. cy.wait(500);
  250. get_dialog_with_gender_link().as("dialog");
  251. cy.intercept("POST", "/api/method/xhiveframework.desk.search.search_link").as("search_link");
  252. cy.get(".xhiveframework-control[data-fieldname=link] input").focus().as("input");
  253. cy.wait("@search_link");
  254. cy.get("@input").type("Non-Conforming", { delay: 100 });
  255. cy.wait("@search_link");
  256. cy.get(".xhiveframework-control[data-fieldname=link] ul").should("be.visible");
  257. cy.get(".xhiveframework-control[data-fieldname=link] input").type("{enter}", { delay: 100 });
  258. cy.get(".xhiveframework-control[data-fieldname=link] input").blur();
  259. cy.get("@dialog").then((dialog) => {
  260. let field = dialog.get_field("link");
  261. let value = field.get_value();
  262. let label = field.get_label_value();
  263. expect(value).to.eq("Non-Conforming");
  264. expect(label).to.eq("Non-Conforming");
  265. });
  266. });
  267. it("show custom link option", () => {
  268. cy.window()
  269. .its("xhiveframework")
  270. .then((xhiveframework) => {
  271. xhiveframework.ui.form.ControlLink.link_options = (link) => {
  272. return [
  273. {
  274. html:
  275. "<span class='text-primary custom-link-option'>" +
  276. "<i class='fa fa-search' style='margin-right: 5px;'></i> " +
  277. "Custom Link Option" +
  278. "</span>",
  279. label: "Custom Link Option",
  280. value: "custom__link_option",
  281. action: () => {},
  282. },
  283. ];
  284. };
  285. get_dialog_with_link().as("dialog");
  286. cy.get(".xhiveframework-control[data-fieldname=link] input").focus().as("input");
  287. cy.get("@input").type("custom", { delay: 100 });
  288. cy.get(".custom-link-option").should("be.visible");
  289. });
  290. });
  291. });