{-# LANGUAGE ExplicitForAll #-} module View.Category.Category ( view , In(..) ) where import Data.Aeson (FromJSON) import qualified Data.Maybe as Maybe import qualified Data.Text as T import Reflex.Dom (Dynamic, Event, MonadWidget) import qualified Reflex.Dom as R import Common.Model (Category, CategoryPage (..), Currency, User, UserId) import qualified Common.Msg as Msg import qualified Component.Button as Button import qualified Component.Modal as Modal import qualified Component.Pages as Pages import Loadable (Loadable (..)) import qualified Loadable import qualified Util.Ajax as AjaxUtil import qualified Util.Reflex as ReflexUtil import qualified Util.Reflex as ReflexUtil import qualified View.Category.Form as Form import qualified View.Category.Reducer as Reducer import qualified View.Category.Table as Table data In t = In { _in_users :: [User] , _in_currentUser :: UserId , _in_currency :: Currency } view :: forall t m. MonadWidget t m => In t -> m () view input = do rec categoryPage <- Reducer.reducer $ Reducer.In { Reducer._in_page = page , Reducer._in_addCategory = R.leftmost [ headerAddCategory, tableAddCategory ] , Reducer._in_editCategory = editCategory , Reducer._in_deleteCategory = deleteCategory } let eventFromResult :: forall a. ((Event t (), Table.Out t, Pages.Out t) -> Event t a) -> m (Event t a) eventFromResult op = ReflexUtil.flatten $ (Maybe.fromMaybe R.never . fmap op) <$> result page <- eventFromResult $ Pages._out_newPage . (\(_, _, c) -> c) headerAddCategory <- eventFromResult $ (\(a, _, _) -> a) tableAddCategory <- eventFromResult $ Table._out_add . (\(_, b, _) -> b) editCategory <- eventFromResult $ Table._out_edit . (\(_, b, _) -> b) deleteCategory <- eventFromResult $ Table._out_delete . (\(_, b, _) -> b) result <- Loadable.viewShowValueWhileLoading categoryPage $ \(CategoryPage page categories usedCategories count) -> do header <- headerView table <- Table.view $ Table.In { Table._in_currentUser = _in_currentUser input , Table._in_currency = _in_currency input , Table._in_categories = categories , Table._in_usedCategories = usedCategories , Table._in_users = _in_users input } pages <- Pages.view $ Pages.In { Pages._in_total = R.constDyn count , Pages._in_perPage = Reducer.perPage , Pages._in_page = page } return (header, table, pages) return () headerView :: forall t m. MonadWidget t m => m (Event t ()) headerView = R.divClass "withMargin" $ R.divClass "titleButton" $ do R.el "h1" $ R.text $ Msg.get Msg.Category_Title addCategory <- Button._out_clic <$> (Button.view . Button.defaultIn . R.text $ Msg.get Msg.Category_Add) addCategory <- Modal.view $ Modal.In { Modal._in_show = addCategory , Modal._in_content = Form.view $ Form.In { Form._in_operation = Form.New } } return addCategory