Update source form to specify folder

This commit is contained in:
Eike Kettner 2020-07-14 22:38:11 +02:00
parent 5b01c93711
commit ca5b7b999f
7 changed files with 245 additions and 86 deletions

View File

@ -60,6 +60,9 @@ init key url flags settings =
( mdm, mdc ) = ( mdm, mdc ) =
Page.ManageData.Data.init flags Page.ManageData.Data.init flags
( csm, csc ) =
Page.CollectiveSettings.Data.init flags
in in
( { flags = flags ( { flags = flags
, key = key , key = key
@ -68,7 +71,7 @@ init key url flags settings =
, homeModel = Page.Home.Data.init flags , homeModel = Page.Home.Data.init flags
, loginModel = Page.Login.Data.emptyModel , loginModel = Page.Login.Data.emptyModel
, manageDataModel = mdm , manageDataModel = mdm
, collSettingsModel = Page.CollectiveSettings.Data.emptyModel , collSettingsModel = csm
, userSettingsModel = um , userSettingsModel = um
, queueModel = Page.Queue.Data.emptyModel , queueModel = Page.Queue.Data.emptyModel
, registerModel = Page.Register.Data.emptyModel , registerModel = Page.Register.Data.emptyModel
@ -82,6 +85,7 @@ init key url flags settings =
, Cmd.batch , Cmd.batch
[ Cmd.map UserSettingsMsg uc [ Cmd.map UserSettingsMsg uc
, Cmd.map ManageDataMsg mdc , Cmd.map ManageDataMsg mdc
, Cmd.map CollSettingsMsg csc
] ]
) )

View File

@ -54,6 +54,7 @@ import Page exposing (Page(..))
import Ports import Ports
import Set exposing (Set) import Set exposing (Set)
import Util.File exposing (makeFileId) import Util.File exposing (makeFileId)
import Util.Folder exposing (mkFolderOption)
import Util.Http import Util.Http
import Util.List import Util.List
import Util.Maybe import Util.Maybe
@ -131,36 +132,6 @@ isEditNotes field =
False 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 : Model
emptyModel = emptyModel =
{ item = Api.Model.ItemDetail.empty { item = Api.Model.ItemDetail.empty
@ -2552,13 +2523,5 @@ isFolderMember model =
Comp.Dropdown.getSelected model.folderModel Comp.Dropdown.getSelected model.folderModel
|> List.head |> List.head
|> Maybe.map .id |> Maybe.map .id
findFolder id =
List.filter (\e -> e.id == id) model.allFolders
|> List.head
folder =
Maybe.andThen findFolder selected
in in
Maybe.map .isMember folder Util.Folder.isFolderMember model.allFolders selected
|> Maybe.withDefault True

View File

@ -1,20 +1,29 @@
module Comp.SourceForm exposing module Comp.SourceForm exposing
( Model ( Model
, Msg(..) , Msg(..)
, emptyModel
, getSource , getSource
, init
, isValid , isValid
, update , update
, view , 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 Api.Model.Source exposing (Source)
import Comp.Dropdown exposing (isDropdownChangeMsg)
import Comp.FixedDropdown import Comp.FixedDropdown
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.Priority exposing (Priority) import Data.Priority exposing (Priority)
import Data.UiSettings exposing (UiSettings)
import Html exposing (..) import Html exposing (..)
import Html.Attributes exposing (..) import Html.Attributes exposing (..)
import Html.Events exposing (onCheck, onInput) import Html.Events exposing (onCheck, onInput)
import Http
import Markdown
import Util.Folder exposing (mkFolderOption)
type alias Model = type alias Model =
@ -24,6 +33,9 @@ type alias Model =
, priorityModel : Comp.FixedDropdown.Model Priority , priorityModel : Comp.FixedDropdown.Model Priority
, priority : Priority , priority : Priority
, enabled : Bool , enabled : Bool
, folderModel : Comp.Dropdown.Model IdName
, allFolders : List FolderItem
, folderId : Maybe String
} }
@ -38,9 +50,23 @@ emptyModel =
Data.Priority.all Data.Priority.all
, priority = Data.Priority.Low , priority = Data.Priority.Low
, enabled = False , 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 -> Bool
isValid model = isValid model =
model.abbrev /= "" model.abbrev /= ""
@ -57,6 +83,7 @@ getSource model =
, description = model.description , description = model.description
, enabled = model.enabled , enabled = model.enabled
, priority = Data.Priority.toName model.priority , priority = Data.Priority.toName model.priority
, folder = model.folderId
} }
@ -66,10 +93,12 @@ type Msg
| SetDescr String | SetDescr String
| ToggleEnabled | ToggleEnabled
| PrioDropdownMsg (Comp.FixedDropdown.Msg Priority) | PrioDropdownMsg (Comp.FixedDropdown.Msg Priority)
| GetFolderResp (Result Http.Error FolderList)
| FolderDropdownMsg (Comp.Dropdown.Msg IdName)
update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
update _ msg model = update flags msg model =
case msg of case msg of
SetSource t -> SetSource t ->
let let
@ -83,19 +112,41 @@ update _ msg model =
, description = t.description , description = t.description
, priority = t.priority , priority = t.priority
, enabled = t.enabled , 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 in
( { model update flags (FolderDropdownMsg (Comp.Dropdown.SetSelection sel)) newModel
| source = np
, abbrev = t.abbrev
, description = t.description
, priority =
Data.Priority.fromString t.priority
|> Maybe.withDefault Data.Priority.Low
, enabled = t.enabled
}
, Cmd.none
)
ToggleEnabled -> ToggleEnabled ->
( { model | enabled = not model.enabled }, Cmd.none ) ( { model | enabled = not model.enabled }, Cmd.none )
@ -127,16 +178,60 @@ update _ msg model =
, Cmd.none , 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 mkIdName fitem =
view flags model = 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 let
priorityItem = priorityItem =
Comp.FixedDropdown.Item Comp.FixedDropdown.Item
model.priority model.priority
(Data.Priority.toName model.priority) (Data.Priority.toName model.priority)
in in
div [ class "ui form" ] div [ class "ui warning form" ]
[ div [ div
[ classList [ classList
[ ( "field", True ) [ ( "field", True )
@ -179,6 +274,25 @@ view flags model =
model.priorityModel 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 , 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

View File

@ -1,7 +1,7 @@
module Comp.SourceManage exposing module Comp.SourceManage exposing
( Model ( Model
, Msg(..) , Msg(..)
, emptyModel , init
, update , update
, view , view
) )
@ -14,6 +14,7 @@ import Comp.SourceForm
import Comp.SourceTable import Comp.SourceTable
import Comp.YesNoDimmer import Comp.YesNoDimmer
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.UiSettings exposing (UiSettings)
import Html exposing (..) import Html exposing (..)
import Html.Attributes exposing (..) import Html.Attributes exposing (..)
import Html.Events exposing (onClick, onSubmit) import Html.Events exposing (onClick, onSubmit)
@ -37,15 +38,21 @@ type ViewMode
| Form | Form
emptyModel : Model init : Flags -> ( Model, Cmd Msg )
emptyModel = init flags =
{ tableModel = Comp.SourceTable.emptyModel let
, formModel = Comp.SourceForm.emptyModel ( fm, fc ) =
, viewMode = Table Comp.SourceForm.init flags
, formError = Nothing in
, loading = False ( { tableModel = Comp.SourceTable.emptyModel
, deleteConfirm = Comp.YesNoDimmer.emptyModel , formModel = fm
} , viewMode = Table
, formError = Nothing
, loading = False
, deleteConfirm = Comp.YesNoDimmer.emptyModel
}
, Cmd.map FormMsg fc
)
type Msg type Msg
@ -187,13 +194,13 @@ update flags msg model =
( { model | deleteConfirm = cm }, cmd ) ( { model | deleteConfirm = cm }, cmd )
view : Flags -> Model -> Html Msg view : Flags -> UiSettings -> Model -> Html Msg
view flags model = view flags settings model =
if model.viewMode == Table then if model.viewMode == Table then
viewTable model viewTable model
else else
div [] (viewForm flags model) div [] (viewForm flags settings model)
viewTable : Model -> Html Msg viewTable : Model -> Html Msg
@ -215,8 +222,8 @@ viewTable model =
] ]
viewForm : Flags -> Model -> List (Html Msg) viewForm : Flags -> UiSettings -> Model -> List (Html Msg)
viewForm flags model = viewForm flags settings model =
let let
newSource = newSource =
model.formModel.source.id == "" model.formModel.source.id == ""
@ -236,7 +243,7 @@ viewForm flags model =
] ]
, Html.form [ class "ui attached segment", onSubmit Submit ] , Html.form [ class "ui attached segment", onSubmit Submit ]
[ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) [ 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 , div
[ classList [ classList
[ ( "ui error message", True ) [ ( "ui error message", True )

View File

@ -2,7 +2,7 @@ module Page.CollectiveSettings.Data exposing
( Model ( Model
, Msg(..) , Msg(..)
, Tab(..) , Tab(..)
, emptyModel , init
) )
import Api.Model.BasicResult exposing (BasicResult) import Api.Model.BasicResult exposing (BasicResult)
@ -11,6 +11,7 @@ import Api.Model.ItemInsights exposing (ItemInsights)
import Comp.CollectiveSettingsForm import Comp.CollectiveSettingsForm
import Comp.SourceManage import Comp.SourceManage
import Comp.UserManage import Comp.UserManage
import Data.Flags exposing (Flags)
import Http import Http
@ -24,15 +25,21 @@ type alias Model =
} }
emptyModel : Model init : Flags -> ( Model, Cmd Msg )
emptyModel = init flags =
{ currentTab = Just InsightsTab let
, sourceModel = Comp.SourceManage.emptyModel ( sm, sc ) =
, userModel = Comp.UserManage.emptyModel Comp.SourceManage.init flags
, settingsModel = Comp.CollectiveSettingsForm.init Api.Model.CollectiveSettings.empty in
, insights = Api.Model.ItemInsights.empty ( { currentTab = Just InsightsTab
, submitResult = Nothing , 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 type Tab

View File

@ -59,7 +59,7 @@ view flags settings model =
[ div [ class "" ] [ div [ class "" ]
(case model.currentTab of (case model.currentTab of
Just SourceTab -> Just SourceTab ->
viewSources flags model viewSources flags settings model
Just UserTab -> Just UserTab ->
viewUsers settings model viewUsers settings model
@ -153,15 +153,15 @@ makeTagStats nc =
] ]
viewSources : Flags -> Model -> List (Html Msg) viewSources : Flags -> UiSettings -> Model -> List (Html Msg)
viewSources flags model = viewSources flags settings model =
[ h2 [ class "ui header" ] [ h2 [ class "ui header" ]
[ i [ class "ui upload icon" ] [] [ i [ class "ui upload icon" ] []
, div [ class "content" ] , div [ class "content" ]
[ text "Sources" [ text "Sources"
] ]
] ]
, Html.map SourceMsg (Comp.SourceManage.view flags model.sourceModel) , Html.map SourceMsg (Comp.SourceManage.view flags settings model.sourceModel)
] ]

View File

@ -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