From e66c5010563dbd511b7bc4cef95800081e259c4d Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Sat, 11 Jul 2020 17:45:45 +0200 Subject: [PATCH] Extend dropdown to display additional option info Use this to display folder information when setting the folder on an item. --- .../webapp/src/main/elm/Comp/AddressForm.elm | 2 +- .../main/elm/Comp/CollectiveSettingsForm.elm | 1 + .../webapp/src/main/elm/Comp/ContactField.elm | 1 + modules/webapp/src/main/elm/Comp/Dropdown.elm | 16 +++ .../src/main/elm/Comp/EmailSettingsForm.elm | 14 +- .../src/main/elm/Comp/ImapSettingsForm.elm | 14 +- .../webapp/src/main/elm/Comp/ItemDetail.elm | 136 ++++++++++++++---- modules/webapp/src/main/elm/Comp/ItemMail.elm | 4 +- .../src/main/elm/Comp/NotificationForm.elm | 4 +- .../src/main/elm/Comp/ScanMailboxForm.elm | 4 +- .../webapp/src/main/elm/Comp/SearchMenu.elm | 11 +- modules/webapp/src/main/elm/Comp/UserForm.elm | 8 +- modules/webapp/src/main/elm/Util/Tag.elm | 2 +- 13 files changed, 171 insertions(+), 46 deletions(-) diff --git a/modules/webapp/src/main/elm/Comp/AddressForm.elm b/modules/webapp/src/main/elm/Comp/AddressForm.elm index 8c8c4baf..a9d5a1b6 100644 --- a/modules/webapp/src/main/elm/Comp/AddressForm.elm +++ b/modules/webapp/src/main/elm/Comp/AddressForm.elm @@ -49,7 +49,7 @@ emptyModel = , city = "" , country = Comp.Dropdown.makeSingleList - { makeOption = \c -> { value = c.code, text = c.label } + { makeOption = \c -> { value = c.code, text = c.label, additional = "" } , placeholder = "Select Country" , options = countries , selected = Nothing diff --git a/modules/webapp/src/main/elm/Comp/CollectiveSettingsForm.elm b/modules/webapp/src/main/elm/Comp/CollectiveSettingsForm.elm index 04fbe4de..342473c1 100644 --- a/modules/webapp/src/main/elm/Comp/CollectiveSettingsForm.elm +++ b/modules/webapp/src/main/elm/Comp/CollectiveSettingsForm.elm @@ -43,6 +43,7 @@ init settings = \l -> { value = Data.Language.toIso3 l , text = Data.Language.toName l + , additional = "" } , placeholder = "" , options = Data.Language.all diff --git a/modules/webapp/src/main/elm/Comp/ContactField.elm b/modules/webapp/src/main/elm/Comp/ContactField.elm index 987a49a9..c349009a 100644 --- a/modules/webapp/src/main/elm/Comp/ContactField.elm +++ b/modules/webapp/src/main/elm/Comp/ContactField.elm @@ -32,6 +32,7 @@ emptyModel = \ct -> { value = Data.ContactType.toString ct , text = Data.ContactType.toString ct + , additional = "" } , placeholder = "" , options = Data.ContactType.all diff --git a/modules/webapp/src/main/elm/Comp/Dropdown.elm b/modules/webapp/src/main/elm/Comp/Dropdown.elm index 212d28c1..458057d7 100644 --- a/modules/webapp/src/main/elm/Comp/Dropdown.elm +++ b/modules/webapp/src/main/elm/Comp/Dropdown.elm @@ -8,6 +8,8 @@ module Comp.Dropdown exposing , makeMultiple , makeSingle , makeSingleList + , mkOption + , setMkOption , update , view ) @@ -27,9 +29,15 @@ import Util.List type alias Option = { value : String , text : String + , additional : String } +mkOption : String -> String -> Option +mkOption value text = + Option value text "" + + type alias Item a = { value : a , option : Option @@ -63,6 +71,11 @@ type alias Model a = } +setMkOption : (a -> Option) -> Model a -> Model a +setMkOption mkopt model = + { model | makeOption = mkopt } + + makeModel : { multiple : Bool , searchable : Int -> Bool @@ -508,4 +521,7 @@ renderOption item = , onClick (AddItem item) ] [ text item.option.text + , span [ class "small-info right-float" ] + [ text item.option.additional + ] ] diff --git a/modules/webapp/src/main/elm/Comp/EmailSettingsForm.elm b/modules/webapp/src/main/elm/Comp/EmailSettingsForm.elm index 1dc9502e..980da2e3 100644 --- a/modules/webapp/src/main/elm/Comp/EmailSettingsForm.elm +++ b/modules/webapp/src/main/elm/Comp/EmailSettingsForm.elm @@ -51,7 +51,12 @@ emptyModel = , replyTo = Nothing , sslType = Comp.Dropdown.makeSingleList - { makeOption = \s -> { value = Data.SSLType.toString s, text = Data.SSLType.label s } + { makeOption = + \s -> + { value = Data.SSLType.toString s + , text = Data.SSLType.label s + , additional = "" + } , placeholder = "" , options = Data.SSLType.all , selected = Just Data.SSLType.None @@ -74,7 +79,12 @@ init ems = , replyTo = ems.replyTo , sslType = Comp.Dropdown.makeSingleList - { makeOption = \s -> { value = Data.SSLType.toString s, text = Data.SSLType.label s } + { makeOption = + \s -> + { value = Data.SSLType.toString s + , text = Data.SSLType.label s + , additional = "" + } , placeholder = "" , options = Data.SSLType.all , selected = diff --git a/modules/webapp/src/main/elm/Comp/ImapSettingsForm.elm b/modules/webapp/src/main/elm/Comp/ImapSettingsForm.elm index 241d68e3..5a51188b 100644 --- a/modules/webapp/src/main/elm/Comp/ImapSettingsForm.elm +++ b/modules/webapp/src/main/elm/Comp/ImapSettingsForm.elm @@ -47,7 +47,12 @@ emptyModel = , password = Nothing , sslType = Comp.Dropdown.makeSingleList - { makeOption = \s -> { value = Data.SSLType.toString s, text = Data.SSLType.label s } + { makeOption = + \s -> + { value = Data.SSLType.toString s + , text = Data.SSLType.label s + , additional = "" + } , placeholder = "" , options = Data.SSLType.all , selected = Just Data.SSLType.None @@ -68,7 +73,12 @@ init ems = , password = ems.imapPassword , sslType = Comp.Dropdown.makeSingleList - { makeOption = \s -> { value = Data.SSLType.toString s, text = Data.SSLType.label s } + { makeOption = + \s -> + { value = Data.SSLType.toString s + , text = Data.SSLType.label s + , additional = "" + } , placeholder = "" , options = Data.SSLType.all , selected = diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail.elm b/modules/webapp/src/main/elm/Comp/ItemDetail.elm index 67127543..f36ca77c 100644 --- a/modules/webapp/src/main/elm/Comp/ItemDetail.elm +++ b/modules/webapp/src/main/elm/Comp/ItemDetail.elm @@ -74,6 +74,7 @@ type alias Model = , concPersonModel : Comp.Dropdown.Model IdName , concEquipModel : Comp.Dropdown.Model IdName , folderModel : Comp.Dropdown.Model IdName + , allFolders : List FolderItem , nameModel : String , notesModel : Maybe String , notesField : NotesField @@ -130,6 +131,36 @@ isEditNotes field = False +mkFolderOption : Flags -> List FolderItem -> IdName -> Comp.Dropdown.Option +mkFolderOption flags allFolders idref = + let + folder = + List.filter (\e -> e.id == idref.id) allFolders + |> List.head + + isMember = + folder + |> Maybe.map .isMember + |> Maybe.withDefault False + + isOwner = + Maybe.map .owner folder + |> Maybe.map .name + |> (==) (Maybe.map .user flags.account) + + adds = + if isOwner then + "owner" + + else if isMember then + "member" + + else + "" + in + { value = idref.id, text = idref.name, additional = adds } + + emptyModel : Model emptyModel = { item = Api.Model.ItemDetail.empty @@ -143,6 +174,7 @@ emptyModel = \entry -> { value = Data.Direction.toString entry , text = Data.Direction.toString entry + , additional = "" } , options = Data.Direction.all , placeholder = "Choose a direction…" @@ -150,29 +182,30 @@ emptyModel = } , corrOrgModel = Comp.Dropdown.makeSingle - { makeOption = \e -> { value = e.id, text = e.name } + { makeOption = \e -> { value = e.id, text = e.name, additional = "" } , placeholder = "" } , corrPersonModel = Comp.Dropdown.makeSingle - { makeOption = \e -> { value = e.id, text = e.name } + { makeOption = \e -> { value = e.id, text = e.name, additional = "" } , placeholder = "" } , concPersonModel = Comp.Dropdown.makeSingle - { makeOption = \e -> { value = e.id, text = e.name } + { makeOption = \e -> { value = e.id, text = e.name, additional = "" } , placeholder = "" } , concEquipModel = Comp.Dropdown.makeSingle - { makeOption = \e -> { value = e.id, text = e.name } + { makeOption = \e -> { value = e.id, text = e.name, additional = "" } , placeholder = "" } , folderModel = Comp.Dropdown.makeSingle - { makeOption = \e -> { value = e.id, text = e.name } + { makeOption = \e -> { value = e.id, text = e.name, additional = "" } , placeholder = "" } + , allFolders = [] , nameModel = "" , notesModel = Nothing , notesField = ViewNotes @@ -885,12 +918,24 @@ update key flags next msg model = GetFolderResp (Ok fs) -> let + model_ = + { model + | allFolders = fs.items + , folderModel = + Comp.Dropdown.setMkOption + (mkFolderOption flags fs.items) + model.folderModel + } + + mkIdName fitem = + IdName fitem.id fitem.name + opts = fs.items - |> List.map (\e -> IdName e.id e.name) + |> List.map mkIdName |> Comp.Dropdown.SetOptions in - update key flags next (FolderDropdownMsg opts) model + update key flags next (FolderDropdownMsg opts) model_ GetFolderResp (Err _) -> noSub ( model, Cmd.none ) @@ -1450,29 +1495,33 @@ update key flags next msg model = noSub ( { model | attachRename = Nothing }, Cmd.none ) EditAttachNameResp (Ok res) -> - case model.attachRename of - Just m -> - let - changeName a = - if a.id == m.id then - { a | name = Util.Maybe.fromString m.newName } + if res.success then + case model.attachRename of + Just m -> + let + changeName a = + if a.id == m.id then + { a | name = Util.Maybe.fromString m.newName } - else - a + else + a - changeItem i = - { i | attachments = List.map changeName i.attachments } - in - noSub - ( { model - | attachRename = Nothing - , item = changeItem model.item - } - , Cmd.none - ) + changeItem i = + { i | attachments = List.map changeName i.attachments } + in + noSub + ( { model + | attachRename = Nothing + , item = changeItem model.item + } + , Cmd.none + ) - Nothing -> - noSub ( model, Cmd.none ) + Nothing -> + noSub ( model, Cmd.none ) + + else + noSub ( model, Cmd.none ) EditAttachNameResp (Err _) -> noSub ( model, Cmd.none ) @@ -2129,7 +2178,7 @@ renderEditForm settings model = ] in div [ class "ui attached segment" ] - [ div [ class "ui form" ] + [ div [ class "ui form warning" ] [ div [ class "field" ] [ label [] [ Icons.tagsIcon "grey" @@ -2156,6 +2205,18 @@ renderEditForm settings model = , text "Folder" ] , Html.map FolderDropdownMsg (Comp.Dropdown.view settings model.folderModel) + , div + [ classList + [ ( "ui warning message", True ) + , ( "hidden", isFolderMember model ) + ] + ] + [ Markdown.toHtml [] """ +You are **not a member** of this folder. This item will be **hidden** +from any search now. Use a folder where you are a member of to make this +item visible. This message will disappear then. + """ + ] ] , div [ class "field" ] [ label [] @@ -2482,3 +2543,22 @@ renderEditAttachmentName model attach = Nothing -> span [ class "invisible hidden" ] [] + + +isFolderMember : Model -> Bool +isFolderMember model = + let + selected = + Comp.Dropdown.getSelected model.folderModel + |> List.head + |> Maybe.map .id + + findFolder id = + List.filter (\e -> e.id == id) model.allFolders + |> List.head + + folder = + Maybe.andThen findFolder selected + in + Maybe.map .isMember folder + |> Maybe.withDefault True diff --git a/modules/webapp/src/main/elm/Comp/ItemMail.elm b/modules/webapp/src/main/elm/Comp/ItemMail.elm index c8ffd821..83f5ccd8 100644 --- a/modules/webapp/src/main/elm/Comp/ItemMail.elm +++ b/modules/webapp/src/main/elm/Comp/ItemMail.elm @@ -61,7 +61,7 @@ emptyModel : Model emptyModel = { connectionModel = Comp.Dropdown.makeSingle - { makeOption = \a -> { value = a, text = a } + { makeOption = \a -> { value = a, text = a, additional = "" } , placeholder = "Select connection..." } , subject = "" @@ -124,7 +124,7 @@ update flags msg model = cm = Comp.Dropdown.makeSingleList - { makeOption = \a -> { value = a, text = a } + { makeOption = \a -> { value = a, text = a, additional = "" } , placeholder = "Select Connection..." , options = names , selected = List.head names diff --git a/modules/webapp/src/main/elm/Comp/NotificationForm.elm b/modules/webapp/src/main/elm/Comp/NotificationForm.elm index 119cff34..08eccb4a 100644 --- a/modules/webapp/src/main/elm/Comp/NotificationForm.elm +++ b/modules/webapp/src/main/elm/Comp/NotificationForm.elm @@ -139,7 +139,7 @@ init flags = ( { settings = Api.Model.NotificationSettings.empty , connectionModel = Comp.Dropdown.makeSingle - { makeOption = \a -> { value = a, text = a } + { makeOption = \a -> { value = a, text = a, additional = "" } , placeholder = "Select connection..." } , tagInclModel = Util.Tag.makeDropdownModel @@ -290,7 +290,7 @@ update flags msg model = cm = Comp.Dropdown.makeSingleList - { makeOption = \a -> { value = a, text = a } + { makeOption = \a -> { value = a, text = a, additional = "" } , placeholder = "Select Connection..." , options = names , selected = List.head names diff --git a/modules/webapp/src/main/elm/Comp/ScanMailboxForm.elm b/modules/webapp/src/main/elm/Comp/ScanMailboxForm.elm index 61413311..8b2f2c84 100644 --- a/modules/webapp/src/main/elm/Comp/ScanMailboxForm.elm +++ b/modules/webapp/src/main/elm/Comp/ScanMailboxForm.elm @@ -129,7 +129,7 @@ init flags = ( { settings = Api.Model.ScanMailboxSettings.empty , connectionModel = Comp.Dropdown.makeSingle - { makeOption = \a -> { value = a, text = a } + { makeOption = \a -> { value = a, text = a, additional = "" } , placeholder = "Select connection..." } , enabled = False @@ -260,7 +260,7 @@ update flags msg model = cm = Comp.Dropdown.makeSingleList - { makeOption = \a -> { value = a, text = a } + { makeOption = \a -> { value = a, text = a, additional = "" } , placeholder = "Select Connection..." , options = names , selected = List.head names diff --git a/modules/webapp/src/main/elm/Comp/SearchMenu.elm b/modules/webapp/src/main/elm/Comp/SearchMenu.elm index f7539d61..b3411b28 100644 --- a/modules/webapp/src/main/elm/Comp/SearchMenu.elm +++ b/modules/webapp/src/main/elm/Comp/SearchMenu.elm @@ -74,6 +74,7 @@ init = \entry -> { value = Data.Direction.toString entry , text = Data.Direction.toString entry + , additional = "" } , options = Data.Direction.all , placeholder = "Choose a direction…" @@ -83,25 +84,25 @@ init = Comp.Dropdown.makeModel { multiple = False , searchable = \n -> n > 5 - , makeOption = \e -> { value = e.id, text = e.name } + , makeOption = \e -> { value = e.id, text = e.name, additional = "" } , labelColor = \_ -> \_ -> "" , placeholder = "Choose an organization" } , corrPersonModel = Comp.Dropdown.makeSingle - { makeOption = \e -> { value = e.id, text = e.name } + { makeOption = \e -> { value = e.id, text = e.name, additional = "" } , placeholder = "Choose a person" } , concPersonModel = Comp.Dropdown.makeSingle - { makeOption = \e -> { value = e.id, text = e.name } + { makeOption = \e -> { value = e.id, text = e.name, additional = "" } , placeholder = "Choose a person" } , concEquipmentModel = Comp.Dropdown.makeModel { multiple = False , searchable = \n -> n > 5 - , makeOption = \e -> { value = e.id, text = e.name } + , makeOption = \e -> { value = e.id, text = e.name, additional = "" } , labelColor = \_ -> \_ -> "" , placeholder = "Choose an equipment" } @@ -109,7 +110,7 @@ init = Comp.Dropdown.makeModel { multiple = False , searchable = \n -> n > 5 - , makeOption = \e -> { value = e.id, text = e.name } + , makeOption = \e -> { value = e.id, text = e.name, additional = "" } , labelColor = \_ -> \_ -> "" , placeholder = "Only items in folder" } diff --git a/modules/webapp/src/main/elm/Comp/UserForm.elm b/modules/webapp/src/main/elm/Comp/UserForm.elm index 25121d03..a982da0b 100644 --- a/modules/webapp/src/main/elm/Comp/UserForm.elm +++ b/modules/webapp/src/main/elm/Comp/UserForm.elm @@ -41,6 +41,7 @@ emptyModel = \s -> { value = Data.UserState.toString s , text = Data.UserState.toString s + , additional = "" } , placeholder = "" , options = Data.UserState.all @@ -98,7 +99,12 @@ update _ msg model = let state = Comp.Dropdown.makeSingleList - { makeOption = \s -> { value = Data.UserState.toString s, text = Data.UserState.toString s } + { makeOption = + \s -> + { value = Data.UserState.toString s + , text = Data.UserState.toString s + , additional = "" + } , placeholder = "" , options = Data.UserState.all , selected = diff --git a/modules/webapp/src/main/elm/Util/Tag.elm b/modules/webapp/src/main/elm/Util/Tag.elm index 413a09eb..a4bed92a 100644 --- a/modules/webapp/src/main/elm/Util/Tag.elm +++ b/modules/webapp/src/main/elm/Util/Tag.elm @@ -10,7 +10,7 @@ makeDropdownModel = Comp.Dropdown.makeModel { multiple = True , searchable = \n -> n > 5 - , makeOption = \tag -> { value = tag.id, text = tag.name } + , makeOption = \tag -> { value = tag.id, text = tag.name, additional = "" } , labelColor = \tag -> \settings ->