-module(butterbee@element). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/butterbee/element.gleam"). -export([define/1, define_list/2, define_table/4, perform/3, perform_on_list/4, perform_on_table/4]). -export_type([node_list/0, node_table/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC( " Define elements for page module using this module.\n" "\n" " Example:\n" "\n" " ```gleam\n" " import butterbee\n" " import butterbee/by\n" " import butterbee/element.{type NodeList, type NodeTable}\n" " import butterbee/webdriver.{type WebDriver}\n" "\n" " pub fn submit_button(\n" " driver: WebDriver(state),\n" " action: fn(_) -> WebDriver(new_state),\n" " ) {\n" " element.define(field: by.css(\"button#submit\"))\n" " |> element.perform(driver, action)\n" " }\n" "\n" " pub fn team_list(\n" " driver: WebDriver(state),\n" " on_element: NodeList,\n" " action: fn(_) -> WebDriver(new_state),\n" " ) {\n" " element.define_list(\n" " list: by.css(\"ul#team\"),\n" " list_item: by.css(\"li\"),\n" " )\n" " |> element.perform_on_list(driver, on_element, action)\n" " }\n" "\n" " pub fn pokemon_dropdown(\n" " driver: WebDriver(state),\n" " action: fn(_) -> WebDriver(new_state),\n" " ) {\n" " element.define(field: by.css(\"select#pokemon\"))\n" " |> element.perform_action(driver, action)\n" " }\n" "\n" " pub fn pokedex_table(\n" " driver: WebDriver(state),\n" " on_element: NodeTable,\n" " action: fn(_) -> WebDriver(new_state),\n" " ) {\n" " element.define_table(\n" " table: by.css(\"table#pokedex\"),\n" " table_row: by.css(\"tr\"),\n" " table_cell: by.css(\"td\"),\n" " table_width: 3,\n" " )\n" " |> element.perform_on_table(driver, on_element, action)\n" " }\n" " ```\n" "\n" " For a more complete example, see the [`page module`](https://hexdocs.pm/butterbee/page-modules.html) guide.\n" ). -type node_list() :: list | {item, integer()}. -type node_table() :: table | {row, integer()} | {cell, integer(), integer()}. -file("src/butterbee/element.gleam", 72). ?DOC(" Define an element for a page module.\n"). -spec define(butterbidi@browsing_context@types@locator:locator()) -> butterbidi@browsing_context@types@locator:locator(). define(Locator) -> Locator. -file("src/butterbee/element.gleam", 77). ?DOC(" Define a list for a page module.\n"). -spec define_list( butterbidi@browsing_context@types@locator:locator(), butterbidi@browsing_context@types@locator:locator() ) -> {butterbidi@browsing_context@types@locator:locator(), butterbidi@browsing_context@types@locator:locator()}. define_list(List_locator, List_item_locator) -> {List_locator, List_item_locator}. -file("src/butterbee/element.gleam", 85). ?DOC(" Define a table for a page module.\n"). -spec define_table( butterbidi@browsing_context@types@locator:locator(), butterbidi@browsing_context@types@locator:locator(), butterbidi@browsing_context@types@locator:locator(), integer() ) -> {butterbidi@browsing_context@types@locator:locator(), butterbidi@browsing_context@types@locator:locator(), butterbidi@browsing_context@types@locator:locator(), integer()}. define_table(Table_locator, Table_row_locator, Table_cell_locator, Table_width) -> {Table_locator, Table_row_locator, Table_cell_locator, Table_width}. -file("src/butterbee/element.gleam", 95). ?DOC(" Perform an action on the defined element.\n"). -spec perform( butterbidi@browsing_context@types@locator:locator(), butterbee@webdriver:web_driver(any()), fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(QFY)) ) -> butterbee@webdriver:web_driver(QFY). perform(Locator, Driver, Action) -> _pipe = butterbee@get:node(Driver, Locator), Action(_pipe). -file("src/butterbee/element.gleam", 105). ?DOC(" Perform an action on the defined list.\n"). -spec perform_on_list( {butterbidi@browsing_context@types@locator:locator(), butterbidi@browsing_context@types@locator:locator()}, butterbee@webdriver:web_driver(any()), node_list(), fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(QGE)) ) -> butterbee@webdriver:web_driver(QGE). perform_on_list(Locator, Driver, On_element, Action) -> {List_locator, List_item_locator} = Locator, _pipe@3 = case On_element of list -> butterbee@get:node(Driver, List_locator); {item, Row} -> _pipe = Driver, _pipe@1 = butterbee@get:node(_pipe, List_locator), _pipe@2 = butterbee@get:nodes_from_node(_pipe@1, List_item_locator), butterbee@get:node_from_nodes(_pipe@2, Row) end, Action(_pipe@3). -file("src/butterbee/element.gleam", 126). ?DOC(" Perform an action on the defined table.\n"). -spec perform_on_table( {butterbidi@browsing_context@types@locator:locator(), butterbidi@browsing_context@types@locator:locator(), butterbidi@browsing_context@types@locator:locator(), integer()}, butterbee@webdriver:web_driver(any()), node_table(), fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(QGK)) ) -> butterbee@webdriver:web_driver(QGK). perform_on_table(Locator, Driver, On_element, Action) -> {Table_locator, Table_row_locator, Table_cell_locator, Table_width} = Locator, _pipe@6 = case On_element of table -> butterbee@get:node(Driver, Table_locator); {row, Row} -> _pipe = Driver, _pipe@1 = butterbee@get:node(_pipe, Table_locator), _pipe@2 = butterbee@get:nodes_from_node(_pipe@1, Table_row_locator), butterbee@get:node_from_nodes(_pipe@2, Row); {cell, Row@1, Column} -> Cell = (Row@1 * Table_width) + Column, _pipe@3 = Driver, _pipe@4 = butterbee@get:node(_pipe@3, Table_locator), _pipe@5 = butterbee@get:nodes_from_node(_pipe@4, Table_cell_locator), butterbee@get:node_from_nodes(_pipe@5, Cell) end, Action(_pipe@6).