module InputTable.Model exposing (..) {-| This module specifies the model for the InputTable @docs TableState, CheckboxColumnProps, Column, ColumnSubType, DisplayColumnProps, DropdownColumnProps, Row, Sorting, SubDropdownColumnProps, SubDropdownOptionProps, TextColumnProps -} import Html import Dict {-| Holds the state of the table -} type alias TableState rowData sideRowData = { columns : List (Column rowData) , accordionColumns : Maybe (List (AccordionColumn rowData)) , rows : List (Row rowData) , searchText : String , showVisibleColumnsUi : Bool {- specifies whether to show controls to toggle columns -} , sorting : Sorting , pageSize : Maybe Int {- number of rows per page, if nothing then all rows are displayed -} , currentPage : Int , rowsAreSelectable : Bool , sideBarHeaders : Maybe (List (SideBarHeader rowData)) , sideBarRowId : Maybe String , tableAction : Maybe String , hasSideTable : Bool , sideColumns : List (SideColumn sideRowData) , sideRows : List (SideRow sideRowData) , showSideTable : Bool , sideSearchText : String , cannotAssignSideRowsReason : Maybe String , sideTableIsAssigning : Bool , sideTableAction : String , sideTablePreposition : String , focussedRow : Maybe (Row rowData) , rowIdsToTitles : Dict.Dict String String , savingState : SavingState } type SavingState = Saving | Saved | Error | None type SideBarSubTypes rowData = SideBarDropdown (SideBarDropdownColumnProps rowData) | SideBarMenuDropdown (SideBarMenuDropdownColumnProps rowData) | SideBarCheckbox (SideBarHeaderBoolProps rowData) | SideBarTextArea (SideBarHeaderStringProps rowData) | SideBarTextInput (SideBarHeaderStringProps rowData) | SideBarMultiRadioInput (SideBarMultiRadioProps rowData) | SideBarMultiCheckboxInput (SideBarHeaderMultiCheckboxProps rowData) | SideBarMceInputType1 (SideBarHeaderStringProps rowData) | SideBarMceInputType2 (SideBarHeaderStringProps rowData) | SideBarMceInputType3 (SideBarHeaderStringProps rowData) | SideBarMceInputType4 (SideBarHeaderStringProps rowData) type alias SideBarHeaderStringProps rowData = { get : rowData -> String {- function to get data from row data -} , set : rowData -> String -> rowData {- function to set data on row data -} } type alias SideBarHeaderBoolProps rowData = { get : rowData -> Bool {- function to get data from row data -} , set : rowData -> Bool -> rowData {- function to set data on row data -} } type alias SideBarHeaderMultiCheckboxProps rowData = { get : rowData -> List String {- function to get data from row data -} , set : rowData -> String -> rowData {- function to set data on row data -} , options : List String {- dropdown options in select element -} } type alias SideBarMultiRadioProps rowData = { get : rowData -> String {- function to get data from row data -} , set : rowData -> String -> rowData {- function to set data on row data -} , options : List String {- dropdown options in select element -} } type alias SideBarDropdownColumnProps rowData = { get : rowData -> String , set : rowData -> String -> rowData , options : List String {- dropdown options in select element -} } type alias SideBarMenuDropdownColumnProps rowData = { get : rowData -> String , set : rowData -> String -> rowData , options : List String {- dropdown options in select element -} , displayedTextOptions : List String {- dropdown displated text options in select element -} } type alias SideBarHeader rowData = { id : String , title : String , subType : SideBarSubTypes rowData , options : List String , hasNumericalValues : Bool , description : Maybe String } {-| Possible types of sorting on table, with Ints being column ids. -} type Sorting = NoSorting | Asc String {- int represents column id -} | Desc String {-| Models a column on the table -} type alias Column rowData = { id : ColumnId , name : String , visible : Bool , hasNumericalValues : Bool , subType : ColumnSubType rowData {- contains options specific to column sub type -} , description : String } type alias AccordionColumn rowData = { id : ColumnId , name : String , hasNumericalValues : Bool , link : Maybe String , description : String , get : rowData -> String {- function to get data from row data -} } type alias ColumnId = String {-| Defines a column subtype and holds the properties specific to that subtype -} type ColumnSubType rowData = DisplayColumn (DisplayColumnProps rowData) | LinkColumn (LinkColumnProps rowData) | TextColumn (TextColumnProps rowData) | DropdownColumn (DropdownColumnProps rowData) | MenuDropdownColumn (MenuDropdownColumnProps rowData) | SubDropdownColumn (SubDropdownColumnProps rowData) | CheckboxColumn (CheckboxColumnProps rowData) | SideBarButtonColumn (SideBarButtonColumnProps rowData) {-| Specifies state of a display column -} type alias DisplayColumnProps rowData = { get : rowData -> String {- function to get data from row data -} , filter : String {- filter string -} , getSortVal : Maybe (rowData -> String) } type alias SideBarButtonColumnProps rowData = { get : rowData -> String {- function to get data from row data -} , set : rowData -> String -> rowData {- function to set data on row data -} , filter : String } type alias LinkColumnProps rowData = { get : rowData -> String , getLink : Row rowData -> String , filter : String } {-| Specifies state of a text input column -} type alias TextColumnProps rowData = { get : rowData -> String , set : rowData -> String -> rowData {- function to set data on row data -} , filter : String , isTextArea : Bool {- Flag to set to text area, otherwise regular input -} } {-| Specifies state of a dropdown input column -} type alias DropdownColumnProps rowData = { get : rowData -> String , set : rowData -> String -> rowData , filter : String , options : List String {- dropdown options in select element -} } {-| Specifies state of a menu_dropdown input column -} type alias MenuDropdownColumnProps rowData = { get : rowData -> String , set : rowData -> String -> rowData , filter : String , options : List String {- dropdown options in select element -} , displayedTextOptions : List String {- displayed text options in select element -} } {-| Specifies state of a subdropdown input column (dropdown with child dropdowns) -} type alias SubDropdownColumnProps rowData = { get : rowData -> ( String, Maybe String ) , set : rowData -> ( String, Maybe String ) -> rowData , filter : String , options : List SubDropdownOptionProps , focussedRowId : Maybe RowId , focussedOption : Maybe String } {-| Specifies state of a child dropdown within a subdropdown parent) -} type alias SubDropdownOptionProps = { parent : String {- parent level dropdown text -} , isSelectable : Bool {- decides parent can be selected -} , childHeader : Maybe String {- header a top of children list text -} , children : List String {- list of children -} } {-| Specifies state of a checkbox input column -} type alias CheckboxColumnProps rowData = { get : rowData -> Bool , set : rowData -> Bool -> rowData , filter : Maybe Bool } {-| Holds row state, with component user specifying rowData structure -} type alias Row rowData = { id : RowId , data : rowData {- can be whatever data structure you specify, it's up to you how to get/set data from rows -} , checked : Bool , disabledMsg : Maybe String , checkboxDisabledMsg : Maybe String , accordionRows : Maybe (List (AccordionRow rowData)) , accordionExpanded : Bool , rowFocusUrl : Maybe String } type alias AccordionRow rowData = { id : String , data : rowData } type alias RowId = String type alias SideColumn sideRowData = { header : String , get : sideRowData -> String } type alias SideRowId = String type alias SideRow sideRowData = { id : SideRowId , checked : Bool , data : sideRowData }