module View.Category.Table ( view , In(..) , Out(..) ) where import qualified Data.Maybe as Maybe import Data.Text (Text) import qualified Data.Text as T import Reflex.Dom (Dynamic, Event, MonadWidget) import qualified Reflex.Dom as R import Common.Model (Category (..), CategoryId, Currency, User (..), UserId) import qualified Common.Model as CM import qualified Common.Msg as Msg import qualified Common.View.Format as Format import qualified Component.ConfirmDialog as ConfirmDialog import qualified Component.Table as Table import qualified Component.Tag as Tag import qualified Util.Ajax as Ajax import qualified Util.Either as EitherUtil import qualified View.Category.Form as Form data In t = In { _in_currentUser :: UserId , _in_currency :: Currency , _in_categories :: [Category] , _in_usedCategories :: [CategoryId] , _in_users :: [User] } data Out t = Out { _out_add :: Event t () , _out_edit :: Event t () , _out_delete :: Event t () } view :: forall t m. MonadWidget t m => In t -> m (Out t) view input = do table <- Table.view $ Table.In { Table._in_headerLabel = headerLabel , Table._in_rows = _in_categories input , Table._in_cell = cell (_in_users input) (_in_currency input) , Table._in_cloneModal = \category -> Form.view $ Form.In { Form._in_operation = Form.Clone category } , Table._in_editModal = \category -> Form.view $ Form.In { Form._in_operation = Form.Edit category } , Table._in_deleteModal = \category -> ConfirmDialog.view $ ConfirmDialog.In { ConfirmDialog._in_header = Msg.get Msg.Category_DeleteConfirm , ConfirmDialog._in_confirm = \e -> do res <- Ajax.delete (R.constDyn $ T.concat ["/api/category/", T.pack . show $ _category_id category]) e return $ () <$ R.fmapMaybe EitherUtil.eitherToMaybe res } , Table._in_canEdit = const True , Table._in_canDelete = not . flip elem (_in_usedCategories input) . _category_id } return $ Out { _out_add = Table._out_add table , _out_edit = Table._out_edit table , _out_delete = Table._out_delete table } data Header = NameHeader | ColorHeader deriving (Eq, Show, Bounded, Enum) headerLabel :: Header -> Text headerLabel NameHeader = Msg.get Msg.Category_Name headerLabel ColorHeader = Msg.get Msg.Category_Color cell :: forall t m. MonadWidget t m => [User] -> Currency -> Header -> Category -> m () cell users currency header category = case header of NameHeader -> R.text $ _category_name category ColorHeader -> Tag.view $ Tag.In { Tag._in_text = _category_name category , Tag._in_color = _category_color category }