module Component.Table ( view , In(..) , Out(..) ) where import Data.Text (Text) import Reflex.Dom (Dynamic, Event, MonadWidget) import qualified Reflex.Dom as R import qualified Component.Pages as Pages data In h r t = In { _in_headerLabel :: h -> Text , _in_rows :: Dynamic t [r] , _in_cell :: h -> r -> Text , _in_perPage :: Int , _in_resetPage :: Event t () } data Out = Out {} view :: forall t m h r. (MonadWidget t m, Bounded h, Enum h) => In h r t -> m (Out) view input = R.divClass "table" $ do rec R.divClass "lines" $ do R.divClass "header" $ flip mapM_ [minBound..] $ \header -> R.divClass "cell" . R.text $ _in_headerLabel input header let rows = getRange (_in_perPage input) <$> (Pages._out_currentPage pages) <*> (_in_rows input) R.simpleList rows $ \r -> R.divClass "row" $ flip mapM_ [minBound..] $ \h -> R.divClass "cell name" $ R.dynText $ R.ffor r (_in_cell input h) pages <- Pages.view $ Pages.In { Pages._in_total = length <$> (_in_rows input) , Pages._in_perPage = _in_perPage input , Pages._in_reset = _in_resetPage input } return () return $ Out {} getRange :: forall a. Int -> Int -> [a] -> [a] getRange perPage currentPage = take perPage . drop ((currentPage - 1) * perPage)