1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
module View.Statistics.Statistics
( view
, In(..)
) where
import Control.Monad (void)
import Data.Map (Map)
import qualified Data.Map as M
import qualified Data.Text as T
import Data.Time.Calendar (Day)
import qualified Data.Time.Calendar as Calendar
import Loadable (Loadable)
import qualified Loadable
import Reflex.Dom (Dynamic, MonadWidget)
import qualified Reflex.Dom as R
import qualified Util.Ajax as AjaxUtil
import qualified View.Statistics.Chart as Chart
import Common.Model (Category (..), Currency, PaymentStats)
import qualified Common.Msg as Msg
import qualified Common.View.Format as Format
data In = In
{ _in_currency :: Currency
}
view :: forall t m. MonadWidget t m => In -> m ()
view input = do
categories <- AjaxUtil.getNow "api/allCategories"
statistics <- AjaxUtil.getNow "api/statistics"
let categoriesAndStatistics = (\c s -> (,) <$> c <*> s) <$> categories <*> statistics
R.divClass "withMargin" $
R.divClass "titleButton" $
R.el "h1" $
R.text $ Msg.get Msg.Statistics_Title
void . R.dyn . R.ffor categoriesAndStatistics . Loadable.viewHideValueWhileLoading $
stats (_in_currency input)
stats :: forall t m. MonadWidget t m => Currency -> ([Category], PaymentStats) -> m ()
stats currency (categories, stats) =
Chart.view $ Chart.In
{ Chart._in_title = Msg.get (Msg.Statistics_ByMonthsAndMean averageEachMonth)
, Chart._in_labels = map (Format.monthAndYear . fst) stats
, Chart._in_datasets =
Chart.Dataset
{ Chart._dataset_label = Msg.get Msg.Statistics_Total
, Chart._dataset_data = totalSeries
, Chart._dataset_color = "#555555"
} : (map categoryDataset categories)
}
where
averageEachMonth =
Format.price currency $ sum totalSeries `div` length stats
totalSeries =
map (sum . map snd . M.toList . snd) stats
categoryDataset category =
Chart.Dataset
{ Chart._dataset_label = _category_name category
, Chart._dataset_data = map (M.findWithDefault 0 (_category_id category) . snd) stats
, Chart._dataset_color = _category_color category
}
|