mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-05-31 20:42:51 +00:00
Update source form to specify folder
This commit is contained in:
parent
5b01c93711
commit
ca5b7b999f
@ -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
|
||||
]
|
||||
)
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 )
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
]
|
||||
|
||||
|
||||
|
53
modules/webapp/src/main/elm/Util/Folder.elm
Normal file
53
modules/webapp/src/main/elm/Util/Folder.elm
Normal 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
|
Loading…
x
Reference in New Issue
Block a user