aboutsummaryrefslogtreecommitdiff
path: root/src/client/elm/LoggedIn/Category
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/elm/LoggedIn/Category')
-rw-r--r--src/client/elm/LoggedIn/Category/Model.elm36
-rw-r--r--src/client/elm/LoggedIn/Category/Msg.elm9
-rw-r--r--src/client/elm/LoggedIn/Category/Table/View.elm124
-rw-r--r--src/client/elm/LoggedIn/Category/Update.elm24
-rw-r--r--src/client/elm/LoggedIn/Category/View.elm35
5 files changed, 228 insertions, 0 deletions
diff --git a/src/client/elm/LoggedIn/Category/Model.elm b/src/client/elm/LoggedIn/Category/Model.elm
new file mode 100644
index 0000000..7092fc4
--- /dev/null
+++ b/src/client/elm/LoggedIn/Category/Model.elm
@@ -0,0 +1,36 @@
+module LoggedIn.Category.Model exposing
+ ( Model
+ , AddCategory
+ , init
+ , initForm
+ , validation
+ )
+
+import Date exposing (Date)
+
+import Form exposing (Form)
+import Form.Validate as Validate exposing (Validation)
+import Validation
+
+type alias Model =
+ { addCategory : Form String AddCategory
+ }
+
+type alias AddCategory =
+ { amount : Int
+ , date : Date
+ }
+
+init : Model
+init =
+ { addCategory = initForm
+ }
+
+initForm : Form String AddCategory
+initForm = Form.initial [] validation
+
+validation : Validation String AddCategory
+validation =
+ Validate.map2 AddCategory
+ (Validate.field "amount" (Validate.int |> Validate.andThen (Validate.minInt 1)))
+ (Validate.field "date" Validation.date)
diff --git a/src/client/elm/LoggedIn/Category/Msg.elm b/src/client/elm/LoggedIn/Category/Msg.elm
new file mode 100644
index 0000000..3184297
--- /dev/null
+++ b/src/client/elm/LoggedIn/Category/Msg.elm
@@ -0,0 +1,9 @@
+module LoggedIn.Category.Msg exposing
+ ( Msg(..)
+ )
+
+import Form exposing (Form)
+
+type Msg =
+ NoOp
+ | AddCategoryMsg Form.Msg
diff --git a/src/client/elm/LoggedIn/Category/Table/View.elm b/src/client/elm/LoggedIn/Category/Table/View.elm
new file mode 100644
index 0000000..fa7a7b1
--- /dev/null
+++ b/src/client/elm/LoggedIn/Category/Table/View.elm
@@ -0,0 +1,124 @@
+module LoggedIn.Category.Table.View exposing
+ ( view
+ )
+
+import Dict exposing (..)
+import Date exposing (Date)
+import String exposing (append)
+
+import FontAwesome
+import View.Color as Color
+
+import Html exposing (..)
+import Html.Attributes exposing (..)
+import Html.Events exposing (..)
+
+import Dialog
+import Dialog.AddCategory.Model as AddCategory
+import Dialog.AddCategory.View as AddCategory
+
+import Tooltip
+
+import Msg exposing (Msg)
+
+import LoggedData exposing (LoggedData)
+
+import LoggedIn.Msg as LoggedInMsg
+
+import LoggedIn.Category.Model as Category
+import View.Date as Date
+import LoggedIn.View.Format as Format
+
+import Model.User exposing (getUserName)
+import Model.Category as Category exposing (CategoryId, Category)
+import Model.PaymentCategory as PaymentCategory
+import Model.Translations exposing (getMessage)
+
+view : LoggedData -> Category.Model -> Html Msg
+view loggedData categoryModel =
+ let categories =
+ loggedData.categories
+ |> Dict.toList
+ |> List.sortBy (.name << Tuple.second)
+ in div
+ [ class "table" ]
+ [ div
+ [ class "lines" ]
+ ( headerLine loggedData :: List.map (paymentLine loggedData categoryModel) categories)
+ , if List.isEmpty (Dict.toList loggedData.categories)
+ then
+ div
+ [ class "emptyTableMsg" ]
+ [ text <| getMessage loggedData.translations "NoCategories" ]
+ else
+ text ""
+ ]
+
+headerLine : LoggedData -> Html Msg
+headerLine loggedData =
+ div
+ [ class "header" ]
+ [ div [ class "cell name" ] [ text <| getMessage loggedData.translations "Name" ]
+ , div [ class "cell category" ] [ text <| getMessage loggedData.translations "Color" ]
+ , div [ class "cell" ] []
+ , div [ class "cell" ] []
+ , div [ class "cell" ] []
+ ]
+
+paymentLine : LoggedData -> Category.Model -> (CategoryId, Category) -> Html Msg
+paymentLine loggedData categoryModel (categoryId, category) =
+ div
+ [ class "row" ]
+ [ div
+ [ class "cell category" ]
+ [ text category.name ]
+ , div
+ [ class "cell category" ]
+ [ span
+ [ class "tag"
+ , style [("background-color", category.color)]
+ ]
+ [ text category.color ]
+ ]
+ , div
+ [ class "cell button" ]
+ [ let currentDate = Date.fromTime loggedData.currentTime
+ in AddCategory.button
+ loggedData
+ (AddCategory.initialClone loggedData.translations category)
+ "CloneCategory"
+ (FontAwesome.clone Color.chestnutRose 18)
+ (Just (getMessage loggedData.translations "Clone"))
+ ]
+ , div
+ [ class "cell button" ]
+ [ AddCategory.button
+ loggedData
+ (AddCategory.initialEdit loggedData.translations categoryId category)
+ "EditCategory"
+ (FontAwesome.pencil Color.chestnutRose 18)
+ (Just (getMessage loggedData.translations "Edit"))
+ ]
+ , div
+ [ class "cell button" ]
+ [ if PaymentCategory.isCategoryUnused categoryId loggedData.paymentCategories
+ then
+ let dialogConfig =
+ { className = "deleteCategoryDialog"
+ , title = getMessage loggedData.translations "ConfirmCategoryDelete"
+ , body = always <| text ""
+ , confirm = getMessage loggedData.translations "Confirm"
+ , confirmMsg = always <| Msg.Dialog <| Dialog.UpdateAndClose <| Msg.DeleteCategory categoryId
+ , undo = getMessage loggedData.translations "Undo"
+ }
+ in button
+ ( Tooltip.show Msg.Tooltip (getMessage loggedData.translations "Delete")
+ ++ [ onClick (Msg.Dialog <| Dialog.Open dialogConfig) ]
+ )
+ [ FontAwesome.trash Color.chestnutRose 18 ]
+ else
+ span
+ ( Tooltip.show Msg.Tooltip (getMessage loggedData.translations "UsedCategory") )
+ [ FontAwesome.trash Color.silver 18 ]
+ ]
+ ]
diff --git a/src/client/elm/LoggedIn/Category/Update.elm b/src/client/elm/LoggedIn/Category/Update.elm
new file mode 100644
index 0000000..1072ef0
--- /dev/null
+++ b/src/client/elm/LoggedIn/Category/Update.elm
@@ -0,0 +1,24 @@
+module LoggedIn.Category.Update exposing
+ ( update
+ )
+
+import Form exposing (Form)
+
+import LoggedData exposing (LoggedData)
+
+import LoggedIn.Category.Model as Category
+import LoggedIn.Category.Msg as Category
+
+update : LoggedData -> Category.Msg -> Category.Model -> (Category.Model, Cmd Category.Msg)
+update loggedData msg model =
+ case msg of
+
+ Category.NoOp ->
+ ( model
+ , Cmd.none
+ )
+
+ Category.AddCategoryMsg formMsg ->
+ ( { model | addCategory = Form.update Category.validation formMsg model.addCategory }
+ , Cmd.none
+ )
diff --git a/src/client/elm/LoggedIn/Category/View.elm b/src/client/elm/LoggedIn/Category/View.elm
new file mode 100644
index 0000000..4e04fa2
--- /dev/null
+++ b/src/client/elm/LoggedIn/Category/View.elm
@@ -0,0 +1,35 @@
+module LoggedIn.Category.View exposing
+ ( view
+ )
+
+import Html exposing (..)
+import Html.Attributes exposing (..)
+
+import LoggedData exposing (LoggedData)
+
+import Msg exposing (Msg)
+
+import Dialog.AddCategory.Model as AddCategory
+import Dialog.AddCategory.View as AddCategory
+
+import LoggedIn.Category.Model as Category
+import LoggedIn.Category.Table.View as Table
+
+import Model.Translations exposing (getMessage, getParamMessage)
+
+view : LoggedData -> Category.Model -> Html Msg
+view loggedData categoryModel =
+ div
+ [ class "categories" ]
+ [ div
+ [ class "titleButton withMargin" ]
+ [ h1 [] [ text <| getMessage loggedData.translations "Categories" ]
+ , AddCategory.button
+ loggedData
+ (AddCategory.initialAdd loggedData.translations)
+ "AddCategory"
+ (text (getMessage loggedData.translations "AddCategory"))
+ Nothing
+ ]
+ , Table.view loggedData categoryModel
+ ]