diff options
| author | Joris | 2020-01-30 11:35:31 +0000 | 
|---|---|---|
| committer | Joris | 2020-01-30 11:35:31 +0000 | 
| commit | 960fa7cb7ae4c57d01306f78cd349f3a8337d0ab (patch) | |
| tree | 5077cc720525fb025e4dba65a9a8b631862cbcc8 /client/src/View/Income/Table.hs | |
| parent | 14bdbc8c937f5d0b35c61350dba28cb41c3737cd (diff) | |
| parent | 6a04e640955051616c3ad0874605830c448f2d75 (diff) | |
Merge branch 'with-ghcjs' into 'master'
Use Haskell on the frontend
See merge request guyonvarch/shared-cost!2
Diffstat (limited to 'client/src/View/Income/Table.hs')
| -rw-r--r-- | client/src/View/Income/Table.hs | 93 | 
1 files changed, 93 insertions, 0 deletions
| diff --git a/client/src/View/Income/Table.hs b/client/src/View/Income/Table.hs new file mode 100644 index 0000000..7b7940d --- /dev/null +++ b/client/src/View/Income/Table.hs @@ -0,0 +1,93 @@ +module View.Income.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            (Currency, Income (..), 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 Util.Ajax               as Ajax +import qualified Util.Either             as EitherUtil +import qualified View.Income.Form        as Form + +data In t = In +  { _in_currentUser :: UserId +  , _in_currency    :: Currency +  , _in_incomes     :: [Income] +  , _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_incomes input +    , Table._in_cell = cell (_in_users input) (_in_currency input) +    , Table._in_cloneModal = \income -> +      Form.view $ Form.In +        { Form._in_operation = Form.Clone income +        } +    , Table._in_editModal = \income -> +      Form.view $ Form.In +        { Form._in_operation = Form.Edit income +        } +    , Table._in_deleteModal = \income -> +      ConfirmDialog.view $ ConfirmDialog.In +        { ConfirmDialog._in_header  = Msg.get Msg.Income_DeleteConfirm +        , ConfirmDialog._in_confirm = \e -> do +          res <- Ajax.delete +            (R.constDyn $ T.concat ["/api/income/", T.pack . show $ _income_id income]) +            e +          return $ () <$ R.fmapMaybe EitherUtil.eitherToMaybe res +        } +    , Table._in_canEdit = (== (_in_currentUser input)) . _income_userId +    , Table._in_canDelete = (== (_in_currentUser input)) . _income_userId +    } + +  return $ Out +    { _out_add = Table._out_add table +    , _out_edit = Table._out_edit table +    , _out_delete = Table._out_delete table +    } + +data Header +  = UserHeader +  | AmountHeader +  | DateHeader +  deriving (Eq, Show, Bounded, Enum) + +headerLabel :: Header -> Text +headerLabel UserHeader   = Msg.get Msg.Income_Name +headerLabel DateHeader   = Msg.get Msg.Income_Date +headerLabel AmountHeader = Msg.get Msg.Income_Amount + +cell :: forall t m. MonadWidget t m => [User] -> Currency -> Header -> Income -> m () +cell users currency header income = +  case header of +    UserHeader -> +      R.text . Maybe.fromMaybe "" . fmap _user_name $ CM.findUser (_income_userId income) users + +    DateHeader -> +      R.text . Format.longDay . _income_date $ income + +    AmountHeader -> +      R.text . Format.price currency . _income_amount $ income | 
