noredink-ui/styleguide-app/Examples/SortableTable.elm

160 lines
4.8 KiB
Elm
Raw Normal View History

2020-03-31 22:43:32 +03:00
module Examples.SortableTable exposing (Msg, State, example)
2019-07-11 22:46:22 +03:00
{-|
2020-03-31 22:43:32 +03:00
@docs Msg, State, example
2019-07-11 22:46:22 +03:00
-}
import Category exposing (Category(..))
2022-03-30 21:49:11 +03:00
import Css exposing (..)
2020-03-31 23:20:03 +03:00
import Example exposing (Example)
2022-03-30 21:49:11 +03:00
import Html.Styled as Html exposing (..)
import Html.Styled.Attributes exposing (css)
2022-03-31 00:21:48 +03:00
import Nri.Ui.Colors.V1 as Colors
import Nri.Ui.Heading.V2 as Heading
import Nri.Ui.SortableTable.V2 as SortableTable
2022-03-31 00:23:10 +03:00
import Nri.Ui.Svg.V1 as Svg exposing (Svg)
2022-03-30 21:49:11 +03:00
import Nri.Ui.Table.V5 as Table
2022-03-31 00:21:48 +03:00
import Nri.Ui.UiIcon.V1 as UiIcon
2019-07-11 22:46:22 +03:00
type Column
= FirstName
| LastName
| Coins
{-| -}
type Msg
2022-03-15 21:06:13 +03:00
= SetSortState (SortableTable.State Column)
2019-07-11 22:46:22 +03:00
{-| -}
type alias State =
{ sortState : SortableTable.State Column }
{-| -}
2020-03-31 23:20:03 +03:00
example : Example State Msg
2020-03-31 22:43:32 +03:00
example =
2020-09-09 21:43:10 +03:00
{ name = "SortableTable"
, version = 2
2021-11-12 01:56:04 +03:00
, categories = [ Layout ]
, keyboardSupport = []
2020-03-31 22:43:32 +03:00
, state = init
, update = update
2020-03-31 22:48:26 +03:00
, subscriptions = \_ -> Sub.none
2022-03-30 21:49:11 +03:00
, preview =
let
2022-03-31 00:21:48 +03:00
header name =
div
2022-03-30 21:49:11 +03:00
[ css
[ Css.displayFlex
2022-03-31 00:21:48 +03:00
, Css.justifyContent Css.spaceBetween
2022-03-30 21:49:11 +03:00
, Css.alignItems Css.center
]
]
2022-03-31 00:21:48 +03:00
[ text name
, div
[ css
[ Css.displayFlex
, Css.flexDirection Css.column
, Css.marginTop (Css.px -4)
]
]
2022-03-31 00:23:10 +03:00
[ renderPreviewArrow UiIcon.sortArrow
, renderPreviewArrow UiIcon.sortArrowDown
2022-03-31 00:21:48 +03:00
]
2022-03-30 21:49:11 +03:00
]
2022-03-31 00:23:10 +03:00
renderPreviewArrow : Svg -> Html msg
renderPreviewArrow arrow =
arrow
|> Svg.withColor Colors.gray75
|> Svg.withWidth (Css.px 12)
|> Svg.withHeight (Css.px 12)
|> Svg.toHtml
2022-03-30 21:49:11 +03:00
in
[ Table.view
[ Table.custom
2022-03-31 00:21:48 +03:00
{ header = header "X"
, view = .x >> Html.text
2022-03-30 21:49:11 +03:00
, width = px 50
, cellStyles = always []
}
, Table.custom
2022-03-31 00:21:48 +03:00
{ header = header "Y"
, view = .y >> Html.text
2022-03-30 21:49:11 +03:00
, width = px 50
, cellStyles = always []
}
]
[ { x = "Row 1 X"
, y = "Row 1 Y"
2022-03-30 21:49:11 +03:00
}
, { x = "Row 2 X"
, y = "Row 2 Y"
2022-03-30 21:49:11 +03:00
}
]
]
2020-03-31 22:43:32 +03:00
, view =
\ellieLinkConfig { sortState } ->
2020-03-31 22:43:32 +03:00
let
config =
{ updateMsg = SetSortState
, columns =
[ SortableTable.string
{ id = FirstName
, header = "First name"
, value = .firstName
, width = 125
, cellStyles = \_ -> []
2020-03-31 22:43:32 +03:00
}
, SortableTable.string
{ id = LastName
, header = "Last name"
, value = .lastName
, width = 125
, cellStyles = \_ -> []
2020-03-31 22:43:32 +03:00
}
, SortableTable.custom
{ id = Coins
, header = Html.text "Coins"
, view = .coins >> String.fromInt >> Html.text
, sorter = SortableTable.simpleSort .coins
, width = 125
, cellStyles = \_ -> []
2020-03-31 22:43:32 +03:00
}
]
}
data =
[ { firstName = "First1", lastName = "Last1", coins = 1 }
, { firstName = "First2", lastName = "Last2", coins = 2 }
, { firstName = "First3", lastName = "Last3", coins = 3 }
, { firstName = "First4", lastName = "Last4", coins = 4 }
, { firstName = "First5", lastName = "Last5", coins = 5 }
2019-07-11 22:46:22 +03:00
]
2020-03-31 22:43:32 +03:00
in
2022-04-14 23:38:33 +03:00
[ Heading.h2 [ Heading.style Heading.Subhead ] [ Html.text "With sortable headers" ]
2020-03-31 22:43:32 +03:00
, SortableTable.view config sortState data
2022-04-14 23:38:33 +03:00
, Heading.h2 [ Heading.style Heading.Subhead ] [ Html.text "Loading" ]
2020-03-31 22:43:32 +03:00
, SortableTable.viewLoading config sortState
]
2019-07-11 22:46:22 +03:00
}
{-| -}
init : State
init =
{ sortState = SortableTable.init FirstName }
{-| -}
update : Msg -> State -> ( State, Cmd Msg )
update msg state =
case msg of
SetSortState sortState ->
( { state | sortState = sortState }, Cmd.none )