From ca5b7b999ff250c8b285485564a6ee898169d1b6 Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Tue, 14 Jul 2020 22:38:11 +0200 Subject: [PATCH] Update source form to specify folder --- modules/webapp/src/main/elm/App/Data.elm | 6 +- .../webapp/src/main/elm/Comp/ItemDetail.elm | 41 +---- .../webapp/src/main/elm/Comp/SourceForm.elm | 157 ++++++++++++++++-- .../webapp/src/main/elm/Comp/SourceManage.elm | 39 +++-- .../main/elm/Page/CollectiveSettings/Data.elm | 27 +-- .../main/elm/Page/CollectiveSettings/View.elm | 8 +- modules/webapp/src/main/elm/Util/Folder.elm | 53 ++++++ 7 files changed, 245 insertions(+), 86 deletions(-) create mode 100644 modules/webapp/src/main/elm/Util/Folder.elm diff --git a/modules/webapp/src/main/elm/App/Data.elm b/modules/webapp/src/main/elm/App/Data.elm index 58660587..ba9fe730 100644 --- a/modules/webapp/src/main/elm/App/Data.elm +++ b/modules/webapp/src/main/elm/App/Data.elm @@ -60,6 +60,9 @@ init key url flags settings = ( mdm, mdc ) = Page.ManageData.Data.init flags + + ( csm, csc ) = + Page.CollectiveSettings.Data.init flags in ( { flags = flags , key = key @@ -68,7 +71,7 @@ init key url flags settings = , homeModel = Page.Home.Data.init flags , loginModel = Page.Login.Data.emptyModel , manageDataModel = mdm - , collSettingsModel = Page.CollectiveSettings.Data.emptyModel + , collSettingsModel = csm , userSettingsModel = um , queueModel = Page.Queue.Data.emptyModel , registerModel = Page.Register.Data.emptyModel @@ -82,6 +85,7 @@ init key url flags settings = , Cmd.batch [ Cmd.map UserSettingsMsg uc , Cmd.map ManageDataMsg mdc + , Cmd.map CollSettingsMsg csc ] ) diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail.elm b/modules/webapp/src/main/elm/Comp/ItemDetail.elm index f36ca77c..78a65c44 100644 --- a/modules/webapp/src/main/elm/Comp/ItemDetail.elm +++ b/modules/webapp/src/main/elm/Comp/ItemDetail.elm @@ -54,6 +54,7 @@ import Page exposing (Page(..)) import Ports import Set exposing (Set) import Util.File exposing (makeFileId) +import Util.Folder exposing (mkFolderOption) import Util.Http import Util.List import Util.Maybe @@ -131,36 +132,6 @@ 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 @@ -2552,13 +2523,5 @@ isFolderMember model = 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 + Util.Folder.isFolderMember model.allFolders selected diff --git a/modules/webapp/src/main/elm/Comp/SourceForm.elm b/modules/webapp/src/main/elm/Comp/SourceForm.elm index 73e7ee17..a5202ef4 100644 --- a/modules/webapp/src/main/elm/Comp/SourceForm.elm +++ b/modules/webapp/src/main/elm/Comp/SourceForm.elm @@ -1,20 +1,29 @@ module Comp.SourceForm exposing ( Model , Msg(..) - , emptyModel , getSource + , init , isValid , update , view ) +import Api +import Api.Model.FolderItem exposing (FolderItem) +import Api.Model.FolderList exposing (FolderList) +import Api.Model.IdName exposing (IdName) import Api.Model.Source exposing (Source) +import Comp.Dropdown exposing (isDropdownChangeMsg) import Comp.FixedDropdown import Data.Flags exposing (Flags) import Data.Priority exposing (Priority) +import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (onCheck, onInput) +import Http +import Markdown +import Util.Folder exposing (mkFolderOption) type alias Model = @@ -24,6 +33,9 @@ type alias Model = , priorityModel : Comp.FixedDropdown.Model Priority , priority : Priority , enabled : Bool + , folderModel : Comp.Dropdown.Model IdName + , allFolders : List FolderItem + , folderId : Maybe String } @@ -38,9 +50,23 @@ emptyModel = Data.Priority.all , priority = Data.Priority.Low , enabled = False + , folderModel = + Comp.Dropdown.makeSingle + { makeOption = \e -> { value = e.id, text = e.name, additional = "" } + , placeholder = "" + } + , allFolders = [] + , folderId = Nothing } +init : Flags -> ( Model, Cmd Msg ) +init flags = + ( emptyModel + , Api.getFolders flags "" False GetFolderResp + ) + + isValid : Model -> Bool isValid model = model.abbrev /= "" @@ -57,6 +83,7 @@ getSource model = , description = model.description , enabled = model.enabled , priority = Data.Priority.toName model.priority + , folder = model.folderId } @@ -66,10 +93,12 @@ type Msg | SetDescr String | ToggleEnabled | PrioDropdownMsg (Comp.FixedDropdown.Msg Priority) + | GetFolderResp (Result Http.Error FolderList) + | FolderDropdownMsg (Comp.Dropdown.Msg IdName) update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) -update _ msg model = +update flags msg model = case msg of SetSource t -> let @@ -83,19 +112,41 @@ update _ msg model = , description = t.description , priority = t.priority , enabled = t.enabled + , folder = t.folder } + + newModel = + { model + | source = np + , abbrev = t.abbrev + , description = t.description + , priority = + Data.Priority.fromString t.priority + |> Maybe.withDefault Data.Priority.Low + , enabled = t.enabled + , folderId = t.folder + } + + mkIdName id = + List.filterMap + (\f -> + if f.id == id then + Just (IdName id f.name) + + else + Nothing + ) + model.allFolders + + sel = + case Maybe.map mkIdName t.folder of + Just idref -> + idref + + Nothing -> + [] in - ( { model - | source = np - , abbrev = t.abbrev - , description = t.description - , priority = - Data.Priority.fromString t.priority - |> Maybe.withDefault Data.Priority.Low - , enabled = t.enabled - } - , Cmd.none - ) + update flags (FolderDropdownMsg (Comp.Dropdown.SetSelection sel)) newModel ToggleEnabled -> ( { model | enabled = not model.enabled }, Cmd.none ) @@ -127,16 +178,60 @@ update _ msg model = , Cmd.none ) + GetFolderResp (Ok fs) -> + let + model_ = + { model + | allFolders = fs.items + , folderModel = + Comp.Dropdown.setMkOption + (mkFolderOption flags fs.items) + model.folderModel + } -view : Flags -> Model -> Html Msg -view flags model = + mkIdName fitem = + IdName fitem.id fitem.name + + opts = + fs.items + |> List.map mkIdName + |> Comp.Dropdown.SetOptions + in + update flags (FolderDropdownMsg opts) model_ + + GetFolderResp (Err _) -> + ( model, Cmd.none ) + + FolderDropdownMsg m -> + let + ( m2, c2 ) = + Comp.Dropdown.update m model.folderModel + + newModel = + { model | folderModel = m2 } + + idref = + Comp.Dropdown.getSelected m2 |> List.head + + model_ = + if isDropdownChangeMsg m then + { newModel | folderId = Maybe.map .id idref } + + else + newModel + in + ( model_, Cmd.map FolderDropdownMsg c2 ) + + +view : Flags -> UiSettings -> Model -> Html Msg +view flags settings model = let priorityItem = Comp.FixedDropdown.Item model.priority (Data.Priority.toName model.priority) in - div [ class "ui form" ] + div [ class "ui warning form" ] [ div [ classList [ ( "field", True ) @@ -179,6 +274,25 @@ view flags model = model.priorityModel ) ] + , div [ class "field" ] + [ label [] + [ 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. Items created through this +link will be **hidden** from any search results. Use a folder where +you are a member of to make items visible. This message will +disappear then. + """ + ] + ] , urlInfoMessage flags model ] @@ -217,3 +331,14 @@ urlInfoMessage flags model = ] ] ] + + +isFolderMember : Model -> Bool +isFolderMember model = + let + selected = + Comp.Dropdown.getSelected model.folderModel + |> List.head + |> Maybe.map .id + in + Util.Folder.isFolderMember model.allFolders selected diff --git a/modules/webapp/src/main/elm/Comp/SourceManage.elm b/modules/webapp/src/main/elm/Comp/SourceManage.elm index 021f3225..11184e42 100644 --- a/modules/webapp/src/main/elm/Comp/SourceManage.elm +++ b/modules/webapp/src/main/elm/Comp/SourceManage.elm @@ -1,7 +1,7 @@ module Comp.SourceManage exposing ( Model , Msg(..) - , emptyModel + , init , update , view ) @@ -14,6 +14,7 @@ import Comp.SourceForm import Comp.SourceTable import Comp.YesNoDimmer import Data.Flags exposing (Flags) +import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (onClick, onSubmit) @@ -37,15 +38,21 @@ type ViewMode | Form -emptyModel : Model -emptyModel = - { tableModel = Comp.SourceTable.emptyModel - , formModel = Comp.SourceForm.emptyModel - , viewMode = Table - , formError = Nothing - , loading = False - , deleteConfirm = Comp.YesNoDimmer.emptyModel - } +init : Flags -> ( Model, Cmd Msg ) +init flags = + let + ( fm, fc ) = + Comp.SourceForm.init flags + in + ( { tableModel = Comp.SourceTable.emptyModel + , formModel = fm + , viewMode = Table + , formError = Nothing + , loading = False + , deleteConfirm = Comp.YesNoDimmer.emptyModel + } + , Cmd.map FormMsg fc + ) type Msg @@ -187,13 +194,13 @@ update flags msg model = ( { model | deleteConfirm = cm }, cmd ) -view : Flags -> Model -> Html Msg -view flags model = +view : Flags -> UiSettings -> Model -> Html Msg +view flags settings model = if model.viewMode == Table then viewTable model else - div [] (viewForm flags model) + div [] (viewForm flags settings model) viewTable : Model -> Html Msg @@ -215,8 +222,8 @@ viewTable model = ] -viewForm : Flags -> Model -> List (Html Msg) -viewForm flags model = +viewForm : Flags -> UiSettings -> Model -> List (Html Msg) +viewForm flags settings model = let newSource = model.formModel.source.id == "" @@ -236,7 +243,7 @@ viewForm flags model = ] , Html.form [ class "ui attached segment", onSubmit Submit ] [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) - , Html.map FormMsg (Comp.SourceForm.view flags model.formModel) + , Html.map FormMsg (Comp.SourceForm.view flags settings model.formModel) , div [ classList [ ( "ui error message", True ) diff --git a/modules/webapp/src/main/elm/Page/CollectiveSettings/Data.elm b/modules/webapp/src/main/elm/Page/CollectiveSettings/Data.elm index d12aa44f..1b1bd53b 100644 --- a/modules/webapp/src/main/elm/Page/CollectiveSettings/Data.elm +++ b/modules/webapp/src/main/elm/Page/CollectiveSettings/Data.elm @@ -2,7 +2,7 @@ module Page.CollectiveSettings.Data exposing ( Model , Msg(..) , Tab(..) - , emptyModel + , init ) import Api.Model.BasicResult exposing (BasicResult) @@ -11,6 +11,7 @@ import Api.Model.ItemInsights exposing (ItemInsights) import Comp.CollectiveSettingsForm import Comp.SourceManage import Comp.UserManage +import Data.Flags exposing (Flags) import Http @@ -24,15 +25,21 @@ type alias Model = } -emptyModel : Model -emptyModel = - { currentTab = Just InsightsTab - , sourceModel = Comp.SourceManage.emptyModel - , userModel = Comp.UserManage.emptyModel - , settingsModel = Comp.CollectiveSettingsForm.init Api.Model.CollectiveSettings.empty - , insights = Api.Model.ItemInsights.empty - , submitResult = Nothing - } +init : Flags -> ( Model, Cmd Msg ) +init flags = + let + ( sm, sc ) = + Comp.SourceManage.init flags + in + ( { currentTab = Just InsightsTab + , sourceModel = sm + , userModel = Comp.UserManage.emptyModel + , settingsModel = Comp.CollectiveSettingsForm.init Api.Model.CollectiveSettings.empty + , insights = Api.Model.ItemInsights.empty + , submitResult = Nothing + } + , Cmd.map SourceMsg sc + ) type Tab diff --git a/modules/webapp/src/main/elm/Page/CollectiveSettings/View.elm b/modules/webapp/src/main/elm/Page/CollectiveSettings/View.elm index 57209673..92cf739c 100644 --- a/modules/webapp/src/main/elm/Page/CollectiveSettings/View.elm +++ b/modules/webapp/src/main/elm/Page/CollectiveSettings/View.elm @@ -59,7 +59,7 @@ view flags settings model = [ div [ class "" ] (case model.currentTab of Just SourceTab -> - viewSources flags model + viewSources flags settings model Just UserTab -> viewUsers settings model @@ -153,15 +153,15 @@ makeTagStats nc = ] -viewSources : Flags -> Model -> List (Html Msg) -viewSources flags model = +viewSources : Flags -> UiSettings -> Model -> List (Html Msg) +viewSources flags settings model = [ h2 [ class "ui header" ] [ i [ class "ui upload icon" ] [] , div [ class "content" ] [ text "Sources" ] ] - , Html.map SourceMsg (Comp.SourceManage.view flags model.sourceModel) + , Html.map SourceMsg (Comp.SourceManage.view flags settings model.sourceModel) ] diff --git a/modules/webapp/src/main/elm/Util/Folder.elm b/modules/webapp/src/main/elm/Util/Folder.elm new file mode 100644 index 00000000..64ea2572 --- /dev/null +++ b/modules/webapp/src/main/elm/Util/Folder.elm @@ -0,0 +1,53 @@ +module Util.Folder exposing + ( isFolderMember + , mkFolderOption + ) + +import Api.Model.FolderItem exposing (FolderItem) +import Api.Model.IdName exposing (IdName) +import Comp.Dropdown +import Data.Flags exposing (Flags) + + +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 } + + +isFolderMember : List FolderItem -> Maybe String -> Bool +isFolderMember allFolders selected = + let + findFolder id = + List.filter (\e -> e.id == id) allFolders + |> List.head + + folder = + Maybe.andThen findFolder selected + in + Maybe.map .isMember folder + |> Maybe.withDefault True