mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-21 18:08:25 +00:00
@ -442,7 +442,7 @@ object QItem {
|
|||||||
cfields <- Stream.eval(findCustomFieldValuesForItem(item.id))
|
cfields <- Stream.eval(findCustomFieldValuesForItem(item.id))
|
||||||
} yield ListItemWithTags(
|
} yield ListItemWithTags(
|
||||||
item,
|
item,
|
||||||
ftags.toList.sortBy(_.name),
|
RTag.sort(ftags.toList),
|
||||||
attachs.sortBy(_.position),
|
attachs.sortBy(_.position),
|
||||||
cfields.toList
|
cfields.toList
|
||||||
)
|
)
|
||||||
|
@ -164,4 +164,23 @@ object RTag {
|
|||||||
|
|
||||||
def delete(tagId: Ident, coll: Ident): ConnectionIO[Int] =
|
def delete(tagId: Ident, coll: Ident): ConnectionIO[Int] =
|
||||||
DML.delete(T, T.tid === tagId && T.cid === coll)
|
DML.delete(T, T.tid === tagId && T.cid === coll)
|
||||||
|
|
||||||
|
def sort(tags: List[RTag]): List[RTag] =
|
||||||
|
tags match {
|
||||||
|
case Nil => tags
|
||||||
|
case _ =>
|
||||||
|
val byCat = tags
|
||||||
|
.groupBy(_.category)
|
||||||
|
.view
|
||||||
|
.mapValues(_.sortBy(_.name))
|
||||||
|
.toList
|
||||||
|
.sortBy(_._1)
|
||||||
|
|
||||||
|
byCat match {
|
||||||
|
case (None, tags) :: rest =>
|
||||||
|
rest.flatMap(_._2) ++ tags
|
||||||
|
case _ =>
|
||||||
|
byCat.flatMap(_._2)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -257,6 +257,7 @@ viewTable texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ class "flex flex-col"
|
[ class "flex flex-col"
|
||||||
@ -301,7 +302,7 @@ viewForm texts _ _ model =
|
|||||||
|
|
||||||
else
|
else
|
||||||
h1 [ class S.header2 ]
|
h1 [ class S.header2 ]
|
||||||
[ text (Maybe.withDefault "" model.formModel.name)
|
[ text (Comp.BookmarkQueryForm.getName model.formModel |> Maybe.withDefault "")
|
||||||
]
|
]
|
||||||
, MB.view
|
, MB.view
|
||||||
{ start =
|
{ start =
|
||||||
@ -334,6 +335,7 @@ viewForm texts _ _ model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -5,34 +5,40 @@
|
|||||||
-}
|
-}
|
||||||
|
|
||||||
|
|
||||||
module Comp.BookmarkQueryForm exposing (Model, Msg, get, init, initQuery, initWith, update, view)
|
module Comp.BookmarkQueryForm exposing (Model, Msg, get, getName, init, initQuery, initWith, update, view)
|
||||||
|
|
||||||
import Api
|
import Api
|
||||||
import Api.Model.BookmarkedQuery exposing (BookmarkedQuery)
|
import Api.Model.BookmarkedQuery exposing (BookmarkedQuery)
|
||||||
import Comp.Basic as B
|
import Comp.Basic as B
|
||||||
import Comp.PowerSearchInput
|
import Comp.PowerSearchInput
|
||||||
|
import Comp.SimpleTextInput
|
||||||
import Data.Flags exposing (Flags)
|
import Data.Flags exposing (Flags)
|
||||||
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)
|
||||||
import Http
|
import Http
|
||||||
import Messages.Comp.BookmarkQueryForm exposing (Texts)
|
import Messages.Comp.BookmarkQueryForm exposing (Texts)
|
||||||
import Styles as S
|
import Styles as S
|
||||||
import Throttle exposing (Throttle)
|
|
||||||
import Time
|
|
||||||
import Util.Maybe
|
|
||||||
|
|
||||||
|
|
||||||
type alias Model =
|
type alias Model =
|
||||||
{ bookmark : BookmarkedQuery
|
{ bookmark : BookmarkedQuery
|
||||||
, name : Maybe String
|
, name : Comp.SimpleTextInput.Model
|
||||||
, nameExists : Bool
|
, nameExists : Bool
|
||||||
, queryModel : Comp.PowerSearchInput.Model
|
, queryModel : Comp.PowerSearchInput.Model
|
||||||
, isPersonal : Bool
|
, isPersonal : Bool
|
||||||
, nameExistsThrottle : Throttle Msg
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
nameCfg : Comp.SimpleTextInput.Config
|
||||||
|
nameCfg =
|
||||||
|
let
|
||||||
|
c =
|
||||||
|
Comp.SimpleTextInput.defaultConfig
|
||||||
|
in
|
||||||
|
{ c | delay = 600 }
|
||||||
|
|
||||||
|
|
||||||
initQuery : String -> ( Model, Cmd Msg )
|
initQuery : String -> ( Model, Cmd Msg )
|
||||||
initQuery q =
|
initQuery q =
|
||||||
let
|
let
|
||||||
@ -42,11 +48,10 @@ initQuery q =
|
|||||||
Comp.PowerSearchInput.init
|
Comp.PowerSearchInput.init
|
||||||
in
|
in
|
||||||
( { bookmark = Api.Model.BookmarkedQuery.empty
|
( { bookmark = Api.Model.BookmarkedQuery.empty
|
||||||
, name = Nothing
|
, name = Comp.SimpleTextInput.init nameCfg Nothing
|
||||||
, nameExists = False
|
, nameExists = False
|
||||||
, queryModel = res.model
|
, queryModel = res.model
|
||||||
, isPersonal = True
|
, isPersonal = True
|
||||||
, nameExistsThrottle = Throttle.create 1
|
|
||||||
}
|
}
|
||||||
, Cmd.batch
|
, Cmd.batch
|
||||||
[ Cmd.map QueryMsg res.cmd
|
[ Cmd.map QueryMsg res.cmd
|
||||||
@ -66,7 +71,7 @@ initWith bm =
|
|||||||
initQuery bm.query
|
initQuery bm.query
|
||||||
in
|
in
|
||||||
( { m
|
( { m
|
||||||
| name = Just bm.name
|
| name = Comp.SimpleTextInput.init nameCfg <| Just bm.name
|
||||||
, isPersonal = bm.personal
|
, isPersonal = bm.personal
|
||||||
, bookmark = bm
|
, bookmark = bm
|
||||||
}
|
}
|
||||||
@ -78,16 +83,22 @@ isValid : Model -> Bool
|
|||||||
isValid model =
|
isValid model =
|
||||||
List.all identity
|
List.all identity
|
||||||
[ Comp.PowerSearchInput.isValid model.queryModel
|
[ Comp.PowerSearchInput.isValid model.queryModel
|
||||||
, model.name /= Nothing
|
, getName model /= Nothing
|
||||||
, not model.nameExists
|
, not model.nameExists
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
getName : Model -> Maybe String
|
||||||
|
getName model =
|
||||||
|
Comp.SimpleTextInput.getValue model.name
|
||||||
|
|
||||||
|
|
||||||
get : Model -> Maybe BookmarkedQuery
|
get : Model -> Maybe BookmarkedQuery
|
||||||
get model =
|
get model =
|
||||||
let
|
let
|
||||||
qStr =
|
qStr =
|
||||||
Maybe.withDefault "" model.queryModel.input
|
Comp.PowerSearchInput.getSearchString model.queryModel
|
||||||
|
|> Maybe.withDefault ""
|
||||||
|
|
||||||
bm =
|
bm =
|
||||||
model.bookmark
|
model.bookmark
|
||||||
@ -96,7 +107,7 @@ get model =
|
|||||||
Just
|
Just
|
||||||
{ bm
|
{ bm
|
||||||
| query = qStr
|
| query = qStr
|
||||||
, name = Maybe.withDefault "" model.name
|
, name = getName model |> Maybe.withDefault ""
|
||||||
, personal = model.isPersonal
|
, personal = model.isPersonal
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,11 +116,10 @@ get model =
|
|||||||
|
|
||||||
|
|
||||||
type Msg
|
type Msg
|
||||||
= SetName String
|
= SetName Comp.SimpleTextInput.Msg
|
||||||
| QueryMsg Comp.PowerSearchInput.Msg
|
| QueryMsg Comp.PowerSearchInput.Msg
|
||||||
| SetPersonal Bool
|
| SetPersonal Bool
|
||||||
| NameExistsResp (Result Http.Error Bool)
|
| NameExistsResp (Result Http.Error Bool)
|
||||||
| UpdateThrottle
|
|
||||||
|
|
||||||
|
|
||||||
update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
|
update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
|
||||||
@ -117,21 +127,24 @@ update flags msg model =
|
|||||||
let
|
let
|
||||||
nameCheck1 name =
|
nameCheck1 name =
|
||||||
Api.bookmarkNameExists flags name NameExistsResp
|
Api.bookmarkNameExists flags name NameExistsResp
|
||||||
|
|
||||||
throttleSub =
|
|
||||||
Throttle.ifNeeded
|
|
||||||
(Time.every 150 (\_ -> UpdateThrottle))
|
|
||||||
model.nameExistsThrottle
|
|
||||||
in
|
in
|
||||||
case msg of
|
case msg of
|
||||||
SetName n ->
|
SetName lm ->
|
||||||
let
|
let
|
||||||
( newThrottle, cmd ) =
|
result =
|
||||||
Throttle.try (nameCheck1 n) model.nameExistsThrottle
|
Comp.SimpleTextInput.update lm model.name
|
||||||
|
|
||||||
|
cmd =
|
||||||
|
case result.change of
|
||||||
|
Comp.SimpleTextInput.ValueUnchanged ->
|
||||||
|
Cmd.none
|
||||||
|
|
||||||
|
Comp.SimpleTextInput.ValueUpdated v ->
|
||||||
|
Maybe.map nameCheck1 v |> Maybe.withDefault Cmd.none
|
||||||
in
|
in
|
||||||
( { model | name = Util.Maybe.fromString n, nameExistsThrottle = newThrottle }
|
( { model | name = result.model }
|
||||||
, cmd
|
, Cmd.batch [ cmd, Cmd.map SetName result.cmd ]
|
||||||
, throttleSub
|
, Sub.map SetName result.sub
|
||||||
)
|
)
|
||||||
|
|
||||||
SetPersonal flag ->
|
SetPersonal flag ->
|
||||||
@ -153,19 +166,9 @@ update flags msg model =
|
|||||||
, Sub.none
|
, Sub.none
|
||||||
)
|
)
|
||||||
|
|
||||||
NameExistsResp (Err err) ->
|
NameExistsResp (Err _) ->
|
||||||
( model, Cmd.none, Sub.none )
|
( model, Cmd.none, Sub.none )
|
||||||
|
|
||||||
UpdateThrottle ->
|
|
||||||
let
|
|
||||||
( newThrottle, cmd ) =
|
|
||||||
Throttle.update model.nameExistsThrottle
|
|
||||||
in
|
|
||||||
( { model | nameExistsThrottle = newThrottle }
|
|
||||||
, cmd
|
|
||||||
, throttleSub
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--- View
|
--- View
|
||||||
@ -180,7 +183,6 @@ view texts model =
|
|||||||
[ Html.map QueryMsg
|
[ Html.map QueryMsg
|
||||||
(Comp.PowerSearchInput.viewInput
|
(Comp.PowerSearchInput.viewInput
|
||||||
{ placeholder = texts.queryLabel
|
{ placeholder = texts.queryLabel
|
||||||
, extraAttrs = []
|
|
||||||
}
|
}
|
||||||
model.queryModel
|
model.queryModel
|
||||||
)
|
)
|
||||||
@ -198,15 +200,18 @@ view texts model =
|
|||||||
[ text texts.basics.name
|
[ text texts.basics.name
|
||||||
, B.inputRequired
|
, B.inputRequired
|
||||||
]
|
]
|
||||||
, input
|
, Html.map SetName
|
||||||
[ type_ "text"
|
(Comp.SimpleTextInput.view [ placeholder texts.basics.name, class S.textInput, id "bookmark-name" ] model.name)
|
||||||
, onInput SetName
|
|
||||||
, placeholder texts.basics.name
|
-- , input
|
||||||
, value <| Maybe.withDefault "" model.name
|
-- [ type_ "text"
|
||||||
, id "bookmark-name"
|
-- , onInput SetName
|
||||||
, class S.textInput
|
-- , placeholder texts.basics.name
|
||||||
]
|
-- , value <| Maybe.withDefault "" model.name
|
||||||
[]
|
-- , id "bookmark-name"
|
||||||
|
-- , class S.textInput
|
||||||
|
-- ]
|
||||||
|
-- []
|
||||||
, span
|
, span
|
||||||
[ class S.warnMessagePlain
|
[ class S.warnMessagePlain
|
||||||
, class "font-medium text-sm"
|
, class "font-medium text-sm"
|
||||||
|
@ -49,7 +49,8 @@ toSearchQuery model =
|
|||||||
Search pm ->
|
Search pm ->
|
||||||
let
|
let
|
||||||
qstr =
|
qstr =
|
||||||
Maybe.withDefault "" pm.input
|
Comp.PowerSearchInput.getSearchString pm
|
||||||
|
|> Maybe.withDefault ""
|
||||||
in
|
in
|
||||||
if qstr == "" || Comp.PowerSearchInput.isValid pm then
|
if qstr == "" || Comp.PowerSearchInput.isValid pm then
|
||||||
Just (SearchQueryString qstr)
|
Just (SearchQueryString qstr)
|
||||||
@ -258,7 +259,6 @@ view texts settings model =
|
|||||||
|
|
||||||
searchSettings =
|
searchSettings =
|
||||||
{ placeholder = texts.searchPlaceholder
|
{ placeholder = texts.searchPlaceholder
|
||||||
, extraAttrs = []
|
|
||||||
}
|
}
|
||||||
in
|
in
|
||||||
div [ class "flex flex-col" ]
|
div [ class "flex flex-col" ]
|
||||||
|
@ -352,6 +352,7 @@ view2 flags texts settings model =
|
|||||||
]
|
]
|
||||||
, end = []
|
, end = []
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, h2 [ class S.header2 ]
|
, h2 [ class S.header2 ]
|
||||||
[ text texts.documentLanguage
|
[ text texts.documentLanguage
|
||||||
|
@ -416,4 +416,5 @@ viewButtons2 texts model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,9 @@ module Comp.CustomFieldInput exposing
|
|||||||
, Msg
|
, Msg
|
||||||
, UpdateResult
|
, UpdateResult
|
||||||
, init
|
, init
|
||||||
|
, init1
|
||||||
, initWith
|
, initWith
|
||||||
|
, initWith1
|
||||||
, update
|
, update
|
||||||
, updateSearch
|
, updateSearch
|
||||||
, view2
|
, view2
|
||||||
@ -21,6 +23,7 @@ import Api.Model.CustomField exposing (CustomField)
|
|||||||
import Api.Model.ItemFieldValue exposing (ItemFieldValue)
|
import Api.Model.ItemFieldValue exposing (ItemFieldValue)
|
||||||
import Comp.DatePicker
|
import Comp.DatePicker
|
||||||
import Comp.MenuBar as MB
|
import Comp.MenuBar as MB
|
||||||
|
import Comp.SimpleTextInput
|
||||||
import Data.CustomFieldType exposing (CustomFieldType)
|
import Data.CustomFieldType exposing (CustomFieldType)
|
||||||
import Data.Icons as Icons
|
import Data.Icons as Icons
|
||||||
import Data.Money exposing (MoneyParseError(..))
|
import Data.Money exposing (MoneyParseError(..))
|
||||||
@ -32,7 +35,6 @@ import Html.Events exposing (onClick, onInput)
|
|||||||
import Messages.Comp.CustomFieldInput exposing (Texts)
|
import Messages.Comp.CustomFieldInput exposing (Texts)
|
||||||
import Styles as S
|
import Styles as S
|
||||||
import Util.CustomField
|
import Util.CustomField
|
||||||
import Util.Maybe
|
|
||||||
|
|
||||||
|
|
||||||
type alias Model =
|
type alias Model =
|
||||||
@ -48,24 +50,30 @@ type FieldError
|
|||||||
|
|
||||||
|
|
||||||
type alias FloatModel =
|
type alias FloatModel =
|
||||||
|
{ input : Comp.SimpleTextInput.Model
|
||||||
|
, result : Result FieldError Float
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
type alias MoneyModel =
|
||||||
{ input : String
|
{ input : String
|
||||||
, result : Result FieldError Float
|
, result : Result FieldError Float
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
type FieldModel
|
type FieldModel
|
||||||
= TextField (Maybe String)
|
= TextField Comp.SimpleTextInput.Model
|
||||||
| NumberField FloatModel
|
| NumberField FloatModel
|
||||||
| MoneyField FloatModel
|
| MoneyField MoneyModel
|
||||||
| BoolField Bool
|
| BoolField Bool
|
||||||
| DateField (Maybe Date) DatePicker
|
| DateField (Maybe Date) DatePicker
|
||||||
|
|
||||||
|
|
||||||
type Msg
|
type Msg
|
||||||
= NumberMsg String
|
= NumberMsg Comp.SimpleTextInput.Msg
|
||||||
| MoneyMsg String
|
| MoneyMsg String
|
||||||
| DateMsg DatePicker.Msg
|
| DateMsg DatePicker.Msg
|
||||||
| SetText String
|
| SetTextMsg Comp.SimpleTextInput.Msg
|
||||||
| ToggleBool
|
| ToggleBool
|
||||||
| Remove
|
| Remove
|
||||||
|
|
||||||
@ -115,7 +123,7 @@ errorMsg texts model =
|
|||||||
parseMsg True parseError
|
parseMsg True parseError
|
||||||
|
|
||||||
TextField mt ->
|
TextField mt ->
|
||||||
if mt == Nothing then
|
if Comp.SimpleTextInput.getValue mt == Nothing then
|
||||||
Just texts.errorNoValue
|
Just texts.errorNoValue
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -126,7 +134,12 @@ errorMsg texts model =
|
|||||||
|
|
||||||
|
|
||||||
init : CustomField -> ( Model, Cmd Msg )
|
init : CustomField -> ( Model, Cmd Msg )
|
||||||
init field =
|
init =
|
||||||
|
init1 Comp.SimpleTextInput.defaultConfig
|
||||||
|
|
||||||
|
|
||||||
|
init1 : Comp.SimpleTextInput.Config -> CustomField -> ( Model, Cmd Msg )
|
||||||
|
init1 cfg field =
|
||||||
let
|
let
|
||||||
( dm, dc ) =
|
( dm, dc ) =
|
||||||
Comp.DatePicker.init
|
Comp.DatePicker.init
|
||||||
@ -135,13 +148,13 @@ init field =
|
|||||||
, fieldModel =
|
, fieldModel =
|
||||||
case fieldType field of
|
case fieldType field of
|
||||||
Data.CustomFieldType.Text ->
|
Data.CustomFieldType.Text ->
|
||||||
TextField Nothing
|
TextField (Comp.SimpleTextInput.init cfg Nothing)
|
||||||
|
|
||||||
Data.CustomFieldType.Numeric ->
|
Data.CustomFieldType.Numeric ->
|
||||||
NumberField (FloatModel "" (Err NoValue))
|
NumberField (FloatModel (Comp.SimpleTextInput.init cfg Nothing) (Err NoValue))
|
||||||
|
|
||||||
Data.CustomFieldType.Money ->
|
Data.CustomFieldType.Money ->
|
||||||
MoneyField (FloatModel "" (Err NoValue))
|
MoneyField (MoneyModel "" (Err NoValue))
|
||||||
|
|
||||||
Data.CustomFieldType.Boolean ->
|
Data.CustomFieldType.Boolean ->
|
||||||
BoolField False
|
BoolField False
|
||||||
@ -158,7 +171,12 @@ init field =
|
|||||||
|
|
||||||
|
|
||||||
initWith : ItemFieldValue -> ( Model, Cmd Msg )
|
initWith : ItemFieldValue -> ( Model, Cmd Msg )
|
||||||
initWith value =
|
initWith =
|
||||||
|
initWith1 Comp.SimpleTextInput.defaultConfig
|
||||||
|
|
||||||
|
|
||||||
|
initWith1 : Comp.SimpleTextInput.Config -> ItemFieldValue -> ( Model, Cmd Msg )
|
||||||
|
initWith1 cfg value =
|
||||||
let
|
let
|
||||||
field =
|
field =
|
||||||
CustomField value.id value.name value.label value.ftype 0 0
|
CustomField value.id value.name value.label value.ftype 0 0
|
||||||
@ -170,19 +188,22 @@ initWith value =
|
|||||||
, fieldModel =
|
, fieldModel =
|
||||||
case fieldType field of
|
case fieldType field of
|
||||||
Data.CustomFieldType.Text ->
|
Data.CustomFieldType.Text ->
|
||||||
TextField (Just value.value)
|
TextField (Comp.SimpleTextInput.init cfg <| Just value.value)
|
||||||
|
|
||||||
Data.CustomFieldType.Numeric ->
|
Data.CustomFieldType.Numeric ->
|
||||||
let
|
let
|
||||||
( fm, _ ) =
|
fm =
|
||||||
updateFloatModel False value.value string2Float identity
|
Comp.SimpleTextInput.init cfg <| Just value.value
|
||||||
|
|
||||||
|
res =
|
||||||
|
string2Float value.value
|
||||||
in
|
in
|
||||||
NumberField fm
|
NumberField { input = fm, result = res }
|
||||||
|
|
||||||
Data.CustomFieldType.Money ->
|
Data.CustomFieldType.Money ->
|
||||||
let
|
let
|
||||||
( fm, _ ) =
|
( fm, _ ) =
|
||||||
updateFloatModel
|
updateMoneyModel
|
||||||
False
|
False
|
||||||
value.value
|
value.value
|
||||||
(Data.Money.fromString >> Result.mapError NotMoney)
|
(Data.Money.fromString >> Result.mapError NotMoney)
|
||||||
@ -223,6 +244,7 @@ type alias UpdateResult =
|
|||||||
{ model : Model
|
{ model : Model
|
||||||
, cmd : Cmd Msg
|
, cmd : Cmd Msg
|
||||||
, result : FieldResult
|
, result : FieldResult
|
||||||
|
, sub : Sub Msg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -239,30 +261,37 @@ updateSearch =
|
|||||||
update1 : Bool -> Msg -> Model -> UpdateResult
|
update1 : Bool -> Msg -> Model -> UpdateResult
|
||||||
update1 forSearch msg model =
|
update1 forSearch msg model =
|
||||||
case ( msg, model.fieldModel ) of
|
case ( msg, model.fieldModel ) of
|
||||||
( SetText str, TextField _ ) ->
|
( SetTextMsg lm, TextField tm ) ->
|
||||||
let
|
let
|
||||||
newValue =
|
result =
|
||||||
Util.Maybe.fromString str
|
Comp.SimpleTextInput.update lm tm
|
||||||
|
|
||||||
model_ =
|
model_ =
|
||||||
{ model | fieldModel = TextField newValue }
|
{ model | fieldModel = TextField result.model }
|
||||||
in
|
|
||||||
UpdateResult model_ Cmd.none (Maybe.map Value newValue |> Maybe.withDefault NoResult)
|
|
||||||
|
|
||||||
( NumberMsg str, NumberField _ ) ->
|
cmd =
|
||||||
let
|
Cmd.map SetTextMsg result.cmd
|
||||||
( fm, res ) =
|
|
||||||
updateFloatModel forSearch str string2Float identity
|
|
||||||
|
|
||||||
model_ =
|
sub =
|
||||||
{ model | fieldModel = NumberField fm }
|
Sub.map SetTextMsg result.sub
|
||||||
|
|
||||||
|
fres =
|
||||||
|
case result.change of
|
||||||
|
Comp.SimpleTextInput.ValueUpdated v ->
|
||||||
|
Maybe.map Value v |> Maybe.withDefault NoResult
|
||||||
|
|
||||||
|
Comp.SimpleTextInput.ValueUnchanged ->
|
||||||
|
NoResult
|
||||||
in
|
in
|
||||||
UpdateResult model_ Cmd.none res
|
UpdateResult model_ cmd fres sub
|
||||||
|
|
||||||
|
( NumberMsg lm, NumberField tm ) ->
|
||||||
|
updateFloatModel forSearch model lm tm string2Float
|
||||||
|
|
||||||
( MoneyMsg str, MoneyField _ ) ->
|
( MoneyMsg str, MoneyField _ ) ->
|
||||||
let
|
let
|
||||||
( fm, res ) =
|
( fm, res ) =
|
||||||
updateFloatModel
|
updateMoneyModel
|
||||||
forSearch
|
forSearch
|
||||||
str
|
str
|
||||||
(Data.Money.fromString >> Result.mapError NotMoney)
|
(Data.Money.fromString >> Result.mapError NotMoney)
|
||||||
@ -271,7 +300,7 @@ update1 forSearch msg model =
|
|||||||
model_ =
|
model_ =
|
||||||
{ model | fieldModel = MoneyField fm }
|
{ model | fieldModel = MoneyField fm }
|
||||||
in
|
in
|
||||||
UpdateResult model_ Cmd.none res
|
UpdateResult model_ Cmd.none res Sub.none
|
||||||
|
|
||||||
( ToggleBool, BoolField b ) ->
|
( ToggleBool, BoolField b ) ->
|
||||||
let
|
let
|
||||||
@ -281,7 +310,7 @@ update1 forSearch msg model =
|
|||||||
value =
|
value =
|
||||||
Util.CustomField.boolValue (not b)
|
Util.CustomField.boolValue (not b)
|
||||||
in
|
in
|
||||||
UpdateResult model_ Cmd.none (Value value)
|
UpdateResult model_ Cmd.none (Value value) Sub.none
|
||||||
|
|
||||||
( DateMsg lm, DateField old picker ) ->
|
( DateMsg lm, DateField old picker ) ->
|
||||||
let
|
let
|
||||||
@ -309,23 +338,23 @@ update1 forSearch msg model =
|
|||||||
model_ =
|
model_ =
|
||||||
{ model | fieldModel = DateField newDate picker_ }
|
{ model | fieldModel = DateField newDate picker_ }
|
||||||
in
|
in
|
||||||
UpdateResult model_ Cmd.none value
|
UpdateResult model_ Cmd.none value Sub.none
|
||||||
|
|
||||||
( Remove, _ ) ->
|
( Remove, _ ) ->
|
||||||
UpdateResult model Cmd.none RemoveField
|
UpdateResult model Cmd.none RemoveField Sub.none
|
||||||
|
|
||||||
-- no other possibilities, not well encoded here
|
-- no other possibilities, not well encoded here
|
||||||
_ ->
|
_ ->
|
||||||
UpdateResult model Cmd.none NoResult
|
UpdateResult model Cmd.none NoResult Sub.none
|
||||||
|
|
||||||
|
|
||||||
updateFloatModel :
|
updateMoneyModel :
|
||||||
Bool
|
Bool
|
||||||
-> String
|
-> String
|
||||||
-> (String -> Result FieldError Float)
|
-> (String -> Result FieldError Float)
|
||||||
-> (String -> String)
|
-> (String -> String)
|
||||||
-> ( FloatModel, FieldResult )
|
-> ( MoneyModel, FieldResult )
|
||||||
updateFloatModel forSearch msg parse normalize =
|
updateMoneyModel forSearch msg parse normalize =
|
||||||
if forSearch && hasWildCards msg then
|
if forSearch && hasWildCards msg then
|
||||||
( { input = normalize msg
|
( { input = normalize msg
|
||||||
, result = Ok 0
|
, result = Ok 0
|
||||||
@ -350,6 +379,57 @@ updateFloatModel forSearch msg parse normalize =
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
updateFloatModel :
|
||||||
|
Bool
|
||||||
|
-> Model
|
||||||
|
-> Comp.SimpleTextInput.Msg
|
||||||
|
-> FloatModel
|
||||||
|
-> (String -> Result FieldError Float)
|
||||||
|
-> UpdateResult
|
||||||
|
updateFloatModel forSearch model lm fm parse =
|
||||||
|
let
|
||||||
|
result =
|
||||||
|
Comp.SimpleTextInput.update lm fm.input
|
||||||
|
|
||||||
|
( floatModel, fieldResult ) =
|
||||||
|
case result.change of
|
||||||
|
Comp.SimpleTextInput.ValueUnchanged ->
|
||||||
|
( { fm | input = result.model }, NoResult )
|
||||||
|
|
||||||
|
Comp.SimpleTextInput.ValueUpdated v ->
|
||||||
|
let
|
||||||
|
value =
|
||||||
|
Maybe.withDefault "" v
|
||||||
|
in
|
||||||
|
if forSearch && hasWildCards value then
|
||||||
|
( { input = result.model
|
||||||
|
, result = Ok 0
|
||||||
|
}
|
||||||
|
, Value value
|
||||||
|
)
|
||||||
|
|
||||||
|
else
|
||||||
|
case parse value of
|
||||||
|
Ok n ->
|
||||||
|
( { input = result.model
|
||||||
|
, result = Ok n
|
||||||
|
}
|
||||||
|
, Value value
|
||||||
|
)
|
||||||
|
|
||||||
|
Err err ->
|
||||||
|
( { input = result.model
|
||||||
|
, result = Err err
|
||||||
|
}
|
||||||
|
, NoResult
|
||||||
|
)
|
||||||
|
|
||||||
|
model_ =
|
||||||
|
{ model | fieldModel = NumberField floatModel }
|
||||||
|
in
|
||||||
|
UpdateResult model_ (Cmd.map NumberMsg result.cmd) fieldResult (Sub.map NumberMsg result.sub)
|
||||||
|
|
||||||
|
|
||||||
hasWildCards : String -> Bool
|
hasWildCards : String -> Bool
|
||||||
hasWildCards msg =
|
hasWildCards msg =
|
||||||
String.startsWith "*" msg || String.endsWith "*" msg
|
String.startsWith "*" msg || String.endsWith "*" msg
|
||||||
@ -406,14 +486,8 @@ makeInput2 icon model =
|
|||||||
case model.fieldModel of
|
case model.fieldModel of
|
||||||
TextField v ->
|
TextField v ->
|
||||||
div [ class "flex flex-row relative" ]
|
div [ class "flex flex-row relative" ]
|
||||||
[ input
|
[ Html.map SetTextMsg
|
||||||
[ type_ "text"
|
(Comp.SimpleTextInput.view [ class S.textInputSidebar, class "pl-10 pr-10" ] v)
|
||||||
, Maybe.withDefault "" v |> value
|
|
||||||
, onInput SetText
|
|
||||||
, class S.textInputSidebar
|
|
||||||
, class "pl-10 pr-10"
|
|
||||||
]
|
|
||||||
[]
|
|
||||||
, removeButton2 ""
|
, removeButton2 ""
|
||||||
, i
|
, i
|
||||||
[ class (iconOr <| Icons.customFieldType2 Data.CustomFieldType.Text)
|
[ class (iconOr <| Icons.customFieldType2 Data.CustomFieldType.Text)
|
||||||
@ -424,14 +498,8 @@ makeInput2 icon model =
|
|||||||
|
|
||||||
NumberField nm ->
|
NumberField nm ->
|
||||||
div [ class "flex flex-row relative" ]
|
div [ class "flex flex-row relative" ]
|
||||||
[ input
|
[ Html.map NumberMsg
|
||||||
[ type_ "text"
|
(Comp.SimpleTextInput.view [ class S.textInputSidebar, class "pl-10 pr-10" ] nm.input)
|
||||||
, value nm.input
|
|
||||||
, onInput NumberMsg
|
|
||||||
, class S.textInputSidebar
|
|
||||||
, class "pl-10 pr-10"
|
|
||||||
]
|
|
||||||
[]
|
|
||||||
, removeButton2 ""
|
, removeButton2 ""
|
||||||
, i
|
, i
|
||||||
[ class (iconOr <| Icons.customFieldType2 Data.CustomFieldType.Numeric)
|
[ class (iconOr <| Icons.customFieldType2 Data.CustomFieldType.Numeric)
|
||||||
|
@ -233,6 +233,7 @@ viewTable2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg
|
, Html.map TableMsg
|
||||||
(Comp.CustomFieldTable.view2 texts.fieldTable
|
(Comp.CustomFieldTable.view2 texts.fieldTable
|
||||||
|
@ -29,6 +29,7 @@ import Api.Model.CustomFieldList exposing (CustomFieldList)
|
|||||||
import Api.Model.ItemFieldValue exposing (ItemFieldValue)
|
import Api.Model.ItemFieldValue exposing (ItemFieldValue)
|
||||||
import Comp.CustomFieldInput
|
import Comp.CustomFieldInput
|
||||||
import Comp.FixedDropdown
|
import Comp.FixedDropdown
|
||||||
|
import Comp.SimpleTextInput
|
||||||
import Data.CustomFieldChange exposing (CustomFieldChange(..))
|
import Data.CustomFieldChange exposing (CustomFieldChange(..))
|
||||||
import Data.CustomFieldOrder
|
import Data.CustomFieldOrder
|
||||||
import Data.CustomFieldType
|
import Data.CustomFieldType
|
||||||
@ -157,6 +158,7 @@ mkFieldSelect fields =
|
|||||||
type alias UpdateResult =
|
type alias UpdateResult =
|
||||||
{ model : Model
|
{ model : Model
|
||||||
, cmd : Cmd Msg
|
, cmd : Cmd Msg
|
||||||
|
, sub : Sub Msg
|
||||||
, result : CustomFieldChange
|
, result : CustomFieldChange
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,7 +177,7 @@ update1 : Bool -> Flags -> Msg -> Model -> UpdateResult
|
|||||||
update1 forSearch flags msg model =
|
update1 forSearch flags msg model =
|
||||||
case msg of
|
case msg of
|
||||||
CreateNewField ->
|
CreateNewField ->
|
||||||
UpdateResult model Cmd.none FieldCreateNew
|
UpdateResult model Cmd.none Sub.none FieldCreateNew
|
||||||
|
|
||||||
CustomFieldResp (Ok list) ->
|
CustomFieldResp (Ok list) ->
|
||||||
let
|
let
|
||||||
@ -185,10 +187,10 @@ update1 forSearch flags msg model =
|
|||||||
, fieldSelect = mkFieldSelect (currentOptions list.items model.visibleFields)
|
, fieldSelect = mkFieldSelect (currentOptions list.items model.visibleFields)
|
||||||
}
|
}
|
||||||
in
|
in
|
||||||
UpdateResult model_ Cmd.none NoFieldChange
|
UpdateResult model_ Cmd.none Sub.none NoFieldChange
|
||||||
|
|
||||||
CustomFieldResp (Err _) ->
|
CustomFieldResp (Err _) ->
|
||||||
UpdateResult model Cmd.none NoFieldChange
|
UpdateResult model Cmd.none Sub.none NoFieldChange
|
||||||
|
|
||||||
FieldSelectMsg lm ->
|
FieldSelectMsg lm ->
|
||||||
let
|
let
|
||||||
@ -208,15 +210,15 @@ update1 forSearch flags msg model =
|
|||||||
in
|
in
|
||||||
case sel of
|
case sel of
|
||||||
Just field ->
|
Just field ->
|
||||||
update flags (ApplyField field) model
|
update1 forSearch flags (ApplyField field) model
|
||||||
|
|
||||||
Nothing ->
|
Nothing ->
|
||||||
UpdateResult model_ Cmd.none NoFieldChange
|
UpdateResult model_ Cmd.none Sub.none NoFieldChange
|
||||||
|
|
||||||
ApplyField f ->
|
ApplyField f ->
|
||||||
let
|
let
|
||||||
( fm, fc ) =
|
( fm, fc ) =
|
||||||
Comp.CustomFieldInput.init f
|
Comp.CustomFieldInput.init1 (textInputCfg forSearch) f
|
||||||
|
|
||||||
visible =
|
visible =
|
||||||
Dict.insert f.name (VisibleField f fm) model.visibleFields
|
Dict.insert f.name (VisibleField f fm) model.visibleFields
|
||||||
@ -241,7 +243,7 @@ update1 forSearch flags msg model =
|
|||||||
_ ->
|
_ ->
|
||||||
NoFieldChange
|
NoFieldChange
|
||||||
in
|
in
|
||||||
UpdateResult model_ cmd_ change
|
UpdateResult model_ cmd_ Sub.none change
|
||||||
|
|
||||||
RemoveField f ->
|
RemoveField f ->
|
||||||
let
|
let
|
||||||
@ -254,7 +256,7 @@ update1 forSearch flags msg model =
|
|||||||
, fieldSelect = mkFieldSelect (currentOptions model.allFields visible)
|
, fieldSelect = mkFieldSelect (currentOptions model.allFields visible)
|
||||||
}
|
}
|
||||||
in
|
in
|
||||||
UpdateResult model_ Cmd.none (FieldValueRemove f)
|
UpdateResult model_ Cmd.none Sub.none (FieldValueRemove f)
|
||||||
|
|
||||||
CustomFieldInputMsg f lm ->
|
CustomFieldInputMsg f lm ->
|
||||||
let
|
let
|
||||||
@ -280,6 +282,9 @@ update1 forSearch flags msg model =
|
|||||||
cmd_ =
|
cmd_ =
|
||||||
Cmd.map (CustomFieldInputMsg field) res.cmd
|
Cmd.map (CustomFieldInputMsg field) res.cmd
|
||||||
|
|
||||||
|
sub_ =
|
||||||
|
Sub.map (CustomFieldInputMsg field) res.sub
|
||||||
|
|
||||||
result =
|
result =
|
||||||
case res.result of
|
case res.result of
|
||||||
Comp.CustomFieldInput.Value str ->
|
Comp.CustomFieldInput.Value str ->
|
||||||
@ -292,13 +297,13 @@ update1 forSearch flags msg model =
|
|||||||
NoFieldChange
|
NoFieldChange
|
||||||
in
|
in
|
||||||
if res.result == Comp.CustomFieldInput.RemoveField then
|
if res.result == Comp.CustomFieldInput.RemoveField then
|
||||||
update flags (RemoveField field) model_
|
update1 forSearch flags (RemoveField field) model_
|
||||||
|
|
||||||
else
|
else
|
||||||
UpdateResult model_ cmd_ result
|
UpdateResult model_ cmd_ sub_ result
|
||||||
|
|
||||||
Nothing ->
|
Nothing ->
|
||||||
UpdateResult model Cmd.none NoFieldChange
|
UpdateResult model Cmd.none Sub.none NoFieldChange
|
||||||
|
|
||||||
SetValues values ->
|
SetValues values ->
|
||||||
let
|
let
|
||||||
@ -308,7 +313,7 @@ update1 forSearch flags msg model =
|
|||||||
merge fv ( dict, cmds ) =
|
merge fv ( dict, cmds ) =
|
||||||
let
|
let
|
||||||
( fim, fic ) =
|
( fim, fic ) =
|
||||||
Comp.CustomFieldInput.initWith fv
|
Comp.CustomFieldInput.initWith1 (textInputCfg forSearch) fv
|
||||||
|
|
||||||
f =
|
f =
|
||||||
field fv
|
field fv
|
||||||
@ -326,7 +331,16 @@ update1 forSearch flags msg model =
|
|||||||
, visibleFields = modelDict
|
, visibleFields = modelDict
|
||||||
}
|
}
|
||||||
in
|
in
|
||||||
UpdateResult model_ (Cmd.batch cmdList) NoFieldChange
|
UpdateResult model_ (Cmd.batch cmdList) Sub.none NoFieldChange
|
||||||
|
|
||||||
|
|
||||||
|
textInputCfg : Bool -> Comp.SimpleTextInput.Config
|
||||||
|
textInputCfg forSearch =
|
||||||
|
if forSearch then
|
||||||
|
Comp.SimpleTextInput.onEnterOnly
|
||||||
|
|
||||||
|
else
|
||||||
|
Comp.SimpleTextInput.defaultConfig
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -381,7 +395,7 @@ viewMenuBar2 viewSettings model =
|
|||||||
dropdown
|
dropdown
|
||||||
)
|
)
|
||||||
:: (if viewSettings.showAddButton then
|
:: (if viewSettings.showAddButton then
|
||||||
[ addFieldLink2 viewSettings.createCustomFieldTitle "ml-1" model
|
[ addFieldLink viewSettings.createCustomFieldTitle "ml-1" model
|
||||||
]
|
]
|
||||||
|
|
||||||
else
|
else
|
||||||
@ -409,8 +423,8 @@ viewCustomField2 texts viewSettings model field =
|
|||||||
span [] []
|
span [] []
|
||||||
|
|
||||||
|
|
||||||
addFieldLink2 : String -> String -> Model -> Html Msg
|
addFieldLink : String -> String -> Model -> Html Msg
|
||||||
addFieldLink2 titleStr classes _ =
|
addFieldLink titleStr classes _ =
|
||||||
a
|
a
|
||||||
[ class classes
|
[ class classes
|
||||||
, class S.secondaryButton
|
, class S.secondaryButton
|
||||||
|
@ -347,6 +347,7 @@ view texts flags settings model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-2"
|
, rootClasses = "mb-2"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ class (gridStyle model.dashboard)
|
[ class (gridStyle model.dashboard)
|
||||||
|
@ -285,6 +285,7 @@ view texts flags cfg settings model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = ""
|
, rootClasses = ""
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ class S.errorMessage
|
[ class S.errorMessage
|
||||||
|
@ -483,6 +483,7 @@ view2 texts extraClasses settings model =
|
|||||||
[ startOnceBtn
|
[ startOnceBtn
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -296,6 +296,7 @@ viewList2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map ListMsg
|
, Html.map ListMsg
|
||||||
(Comp.DueItemsTaskList.view2 texts.notificationTable
|
(Comp.DueItemsTaskList.view2 texts.notificationTable
|
||||||
|
@ -251,6 +251,7 @@ viewTable2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg
|
, Html.map TableMsg
|
||||||
(Comp.EmailSettingsTable.view2 texts.settingsTable
|
(Comp.EmailSettingsTable.view2 texts.settingsTable
|
||||||
@ -296,6 +297,7 @@ viewForm2 texts settings model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -268,6 +268,7 @@ viewTable2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg
|
, Html.map TableMsg
|
||||||
(Comp.EquipmentTable.view2 texts.equipmentTable
|
(Comp.EquipmentTable.view2 texts.equipmentTable
|
||||||
@ -347,6 +348,7 @@ viewForm2 texts model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -373,91 +373,91 @@ view2 texts flags model =
|
|||||||
texts.basics.no
|
texts.basics.no
|
||||||
in
|
in
|
||||||
div [ class "flex flex-col md:relative" ]
|
div [ class "flex flex-col md:relative" ]
|
||||||
(viewButtons2 texts model
|
([ viewButtons2 texts model
|
||||||
:: [ Html.map DeleteMsg
|
, Html.map DeleteMsg
|
||||||
(Comp.YesNoDimmer.viewN
|
(Comp.YesNoDimmer.viewN
|
||||||
True
|
True
|
||||||
dimmerSettings
|
dimmerSettings
|
||||||
model.deleteDimmer
|
model.deleteDimmer
|
||||||
)
|
)
|
||||||
, div
|
, div
|
||||||
[ class "py-2 text-lg opacity-75"
|
[ class "py-2 text-lg opacity-75"
|
||||||
, classList [ ( "hidden", model.folder.id /= "" ) ]
|
, classList [ ( "hidden", model.folder.id /= "" ) ]
|
||||||
|
]
|
||||||
|
[ text texts.autoOwnerInfo
|
||||||
|
]
|
||||||
|
, div
|
||||||
|
[ class "py-2 text-lg opacity-75"
|
||||||
|
, classList [ ( "hidden", model.folder.id == "" ) ]
|
||||||
|
]
|
||||||
|
[ text texts.modifyInfo
|
||||||
|
]
|
||||||
|
, div
|
||||||
|
[ class S.message
|
||||||
|
, classList [ ( "hidden", model.folder.id == "" || isOwner ) ]
|
||||||
|
]
|
||||||
|
[ text texts.notOwnerInfo
|
||||||
|
]
|
||||||
|
, div [ class "mb-4 flex flex-col" ]
|
||||||
|
[ label
|
||||||
|
[ class S.inputLabel
|
||||||
|
, for "folder-name"
|
||||||
|
]
|
||||||
|
[ text texts.basics.name
|
||||||
|
, B.inputRequired
|
||||||
|
]
|
||||||
|
, div [ class "flex flex-row space-x-2" ]
|
||||||
|
[ input
|
||||||
|
[ type_ "text"
|
||||||
|
, onInput SetName
|
||||||
|
, Maybe.withDefault "" model.name
|
||||||
|
|> value
|
||||||
|
, classList [ ( S.inputErrorBorder, model.name == Nothing ) ]
|
||||||
|
, class S.textInput
|
||||||
|
, id "folder-name"
|
||||||
]
|
]
|
||||||
[ text texts.autoOwnerInfo
|
[]
|
||||||
|
, a
|
||||||
|
[ class S.primaryButton
|
||||||
|
, class "rounded-r -ml-1"
|
||||||
|
, onClick SaveName
|
||||||
|
, href "#"
|
||||||
]
|
]
|
||||||
, div
|
[ i [ class "fa fa-save" ] []
|
||||||
[ class "py-2 text-lg opacity-75"
|
, span [ class "ml-2 hidden sm:inline" ]
|
||||||
, classList [ ( "hidden", model.folder.id == "" ) ]
|
[ text texts.basics.submit
|
||||||
]
|
|
||||||
[ text texts.modifyInfo
|
|
||||||
]
|
|
||||||
, div
|
|
||||||
[ class S.message
|
|
||||||
, classList [ ( "hidden", model.folder.id == "" || isOwner ) ]
|
|
||||||
]
|
|
||||||
[ text texts.notOwnerInfo
|
|
||||||
]
|
|
||||||
, div [ class "mb-4 flex flex-col" ]
|
|
||||||
[ label
|
|
||||||
[ class S.inputLabel
|
|
||||||
, for "folder-name"
|
|
||||||
]
|
|
||||||
[ text texts.basics.name
|
|
||||||
, B.inputRequired
|
|
||||||
]
|
|
||||||
, div [ class "flex flex-row space-x-2" ]
|
|
||||||
[ input
|
|
||||||
[ type_ "text"
|
|
||||||
, onInput SetName
|
|
||||||
, Maybe.withDefault "" model.name
|
|
||||||
|> value
|
|
||||||
, classList [ ( S.inputErrorBorder, model.name == Nothing ) ]
|
|
||||||
, class S.textInput
|
|
||||||
, id "folder-name"
|
|
||||||
]
|
|
||||||
[]
|
|
||||||
, a
|
|
||||||
[ class S.primaryButton
|
|
||||||
, class "rounded-r -ml-1"
|
|
||||||
, onClick SaveName
|
|
||||||
, href "#"
|
|
||||||
]
|
|
||||||
[ i [ class "fa fa-save" ] []
|
|
||||||
, span [ class "ml-2 hidden sm:inline" ]
|
|
||||||
[ text texts.basics.submit
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
, div
|
]
|
||||||
[ classList
|
]
|
||||||
[ ( "hidden", model.formState == FormStateInitial )
|
, div
|
||||||
, ( S.errorMessage, isError model.formState )
|
[ classList
|
||||||
, ( S.successMessage, isSuccess model.formState )
|
[ ( "hidden", model.formState == FormStateInitial )
|
||||||
]
|
, ( S.errorMessage, isError model.formState )
|
||||||
, class "my-4"
|
, ( S.successMessage, isSuccess model.formState )
|
||||||
]
|
]
|
||||||
[ case model.formState of
|
, class "my-4"
|
||||||
FormStateInitial ->
|
]
|
||||||
text ""
|
[ case model.formState of
|
||||||
|
FormStateInitial ->
|
||||||
|
text ""
|
||||||
|
|
||||||
FormStateHttpError err ->
|
FormStateHttpError err ->
|
||||||
text (texts.httpError err)
|
text (texts.httpError err)
|
||||||
|
|
||||||
FormStateGenericError m ->
|
FormStateGenericError m ->
|
||||||
text m
|
text m
|
||||||
|
|
||||||
FormStateFolderCreated ->
|
FormStateFolderCreated ->
|
||||||
text texts.folderCreated
|
text texts.folderCreated
|
||||||
|
|
||||||
FormStateNameChangeSuccessful ->
|
FormStateNameChangeSuccessful ->
|
||||||
text texts.nameChangeSuccessful
|
text texts.nameChangeSuccessful
|
||||||
|
|
||||||
FormStateDeleteSuccessful ->
|
FormStateDeleteSuccessful ->
|
||||||
text texts.deleteSuccessful
|
text texts.deleteSuccessful
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
++ viewMembers2 texts model
|
++ viewMembers2 texts model
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -558,4 +558,5 @@ viewButtons2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
|
@ -265,6 +265,7 @@ viewTable2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg
|
, Html.map TableMsg
|
||||||
(Comp.FolderTable.view2
|
(Comp.FolderTable.view2
|
||||||
|
@ -251,6 +251,7 @@ viewTable2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg
|
, Html.map TableMsg
|
||||||
(Comp.ImapSettingsTable.view2
|
(Comp.ImapSettingsTable.view2
|
||||||
@ -297,6 +298,7 @@ viewForm2 texts settings model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -33,7 +33,6 @@ import Html exposing (..)
|
|||||||
import Html.Attributes exposing (..)
|
import Html.Attributes exposing (..)
|
||||||
import Messages.Comp.ItemCardList exposing (Texts)
|
import Messages.Comp.ItemCardList exposing (Texts)
|
||||||
import Page exposing (Page(..))
|
import Page exposing (Page(..))
|
||||||
import Set exposing (Set)
|
|
||||||
import Styles as S
|
import Styles as S
|
||||||
import Util.ItemDragDrop as DD
|
import Util.ItemDragDrop as DD
|
||||||
import Util.List
|
import Util.List
|
||||||
|
@ -56,6 +56,14 @@ view texts model =
|
|||||||
]
|
]
|
||||||
[ text texts.reset
|
[ text texts.reset
|
||||||
]
|
]
|
||||||
|
, div [ class "flex-grow" ] []
|
||||||
|
, button
|
||||||
|
[ class S.secondaryButton
|
||||||
|
, href "#"
|
||||||
|
, onClick AddFilesToggle
|
||||||
|
]
|
||||||
|
[ text texts.basics.cancel
|
||||||
|
]
|
||||||
]
|
]
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -20,6 +20,7 @@ import Comp.ItemDetail.Model
|
|||||||
, personMatchesOrg
|
, personMatchesOrg
|
||||||
)
|
)
|
||||||
import Comp.KeyInput
|
import Comp.KeyInput
|
||||||
|
import Comp.SimpleTextInput
|
||||||
import Comp.Tabs as TB
|
import Comp.Tabs as TB
|
||||||
import Comp.TagDropdown
|
import Comp.TagDropdown
|
||||||
import Data.DropdownStyle
|
import Data.DropdownStyle
|
||||||
@ -158,14 +159,11 @@ formTabs texts flags settings model =
|
|||||||
, info = Nothing
|
, info = Nothing
|
||||||
, body =
|
, body =
|
||||||
[ div [ class "relative mb-4" ]
|
[ div [ class "relative mb-4" ]
|
||||||
[ input
|
[ Html.map SetNameMsg
|
||||||
[ type_ "text"
|
(Comp.SimpleTextInput.view
|
||||||
, value model.nameModel
|
[ class S.textInputSidebar, class "pr-10" ]
|
||||||
, onInput SetName
|
model.nameInput
|
||||||
, class S.textInputSidebar
|
)
|
||||||
, class "pr-10"
|
|
||||||
]
|
|
||||||
[]
|
|
||||||
, span [ class S.inputLeftIconOnly ]
|
, span [ class S.inputLeftIconOnly ]
|
||||||
[ i
|
[ i
|
||||||
[ classList
|
[ classList
|
||||||
@ -388,7 +386,7 @@ formTabs texts flags settings model =
|
|||||||
, titleRight = []
|
, titleRight = []
|
||||||
, info = Nothing
|
, info = Nothing
|
||||||
, body =
|
, body =
|
||||||
[ div [ class "mb-4" ]
|
[ div [ class "mb-24" ]
|
||||||
[ Html.map DirDropdownMsg
|
[ Html.map DirDropdownMsg
|
||||||
(Comp.Dropdown.view2
|
(Comp.Dropdown.view2
|
||||||
directionCfg
|
directionCfg
|
||||||
|
@ -25,11 +25,10 @@ import Html.Attributes exposing (..)
|
|||||||
import Messages.Comp.ItemDetail.ItemInfoHeader exposing (Texts)
|
import Messages.Comp.ItemDetail.ItemInfoHeader exposing (Texts)
|
||||||
import Page exposing (Page(..))
|
import Page exposing (Page(..))
|
||||||
import Styles as S
|
import Styles as S
|
||||||
import Util.Maybe
|
|
||||||
|
|
||||||
|
|
||||||
view : Texts -> UiSettings -> Model -> Html Msg
|
view : Texts -> UiSettings -> Model -> Html Msg -> Html Msg
|
||||||
view texts settings model =
|
view texts settings model beforeTags =
|
||||||
let
|
let
|
||||||
date =
|
date =
|
||||||
( div
|
( div
|
||||||
@ -45,24 +44,27 @@ view texts settings model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
itemStyle =
|
itemStyle =
|
||||||
"ml-2 sm:ml-4 py-1 whitespace-nowrap "
|
"ml-2 sm:ml-4 py-1 whitespace-nowrap truncate"
|
||||||
|
|
||||||
linkStyle =
|
linkStyle =
|
||||||
"opacity-75 hover:opacity-100"
|
"opacity-75 hover:opacity-100 "
|
||||||
|
|
||||||
duedate =
|
duedate =
|
||||||
( div
|
( div
|
||||||
[ class "ml-2 sm:ml-4 py-1 max-w-min whitespace-nowrap opacity-100"
|
[ class "ml-2 sm:ml-0 py-1 whitespace-nowrap "
|
||||||
, class S.basicLabel
|
, classList
|
||||||
|
[ ( "dark:text-amber-400 text-amber-800 italic underline"
|
||||||
|
, model.item.dueDate /= Nothing
|
||||||
|
)
|
||||||
|
]
|
||||||
, title texts.dueDate
|
, title texts.dueDate
|
||||||
]
|
]
|
||||||
[ Icons.dueDateIcon2 "mr-2"
|
[ Icons.dueDateIcon2 "mr-2"
|
||||||
, Maybe.map texts.formatDate model.item.dueDate
|
, Maybe.map texts.formatDate model.item.dueDate
|
||||||
|> Maybe.withDefault ""
|
|> Maybe.withDefault "-"
|
||||||
|> text
|
|> text
|
||||||
]
|
]
|
||||||
, Data.UiSettings.fieldVisible settings Data.Fields.DueDate
|
, Data.UiSettings.fieldVisible settings Data.Fields.DueDate
|
||||||
&& Util.Maybe.nonEmpty model.item.dueDate
|
|
||||||
)
|
)
|
||||||
|
|
||||||
corr =
|
corr =
|
||||||
@ -126,7 +128,7 @@ view texts settings model =
|
|||||||
model.item.state == "created"
|
model.item.state == "created"
|
||||||
in
|
in
|
||||||
div [ class "flex flex-col pb-2" ]
|
div [ class "flex flex-col pb-2" ]
|
||||||
[ div [ class "flex flex-row items-center text-2xl" ]
|
[ div [ class "flex flex-row items-center text-2xl order-1" ]
|
||||||
[ if isDeleted then
|
[ if isDeleted then
|
||||||
div
|
div
|
||||||
[ classList
|
[ classList
|
||||||
@ -172,34 +174,39 @@ view texts settings model =
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
, ul [ class "flex flex-col sm:flex-row flex-wrap text-base " ]
|
, div [ class "flex flex-col sm:flex-row flex-wrap text-base order-2" ]
|
||||||
(List.filter Tuple.second
|
(List.filter Tuple.second
|
||||||
[ date
|
[ date
|
||||||
, corr
|
, corr
|
||||||
, conc
|
, conc
|
||||||
, itemfolder
|
, itemfolder
|
||||||
, src
|
, src
|
||||||
, duedate
|
|
||||||
]
|
]
|
||||||
|> List.map Tuple.first
|
|> List.map Tuple.first
|
||||||
)
|
)
|
||||||
|
, div [ class "flex flex-col sm:flex-row flex-wrap text-base order-3" ]
|
||||||
|
(List.filter Tuple.second [ duedate ] |> List.map Tuple.first)
|
||||||
|
, div [ class "order-4 md:order-5" ]
|
||||||
|
[ beforeTags
|
||||||
|
]
|
||||||
, renderTagsAndFields settings model
|
, renderTagsAndFields settings model
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
renderTagsAndFields : UiSettings -> Model -> Html Msg
|
renderTagsAndFields : UiSettings -> Model -> Html Msg
|
||||||
renderTagsAndFields settings model =
|
renderTagsAndFields settings model =
|
||||||
div [ class "flex flex-row flex-wrap items-center font-semibold sm:justify-end mt-1 min-h-7" ]
|
div [ class "flex flex-row flex-wrap items-center font-semibold justify-end mt-1 min-h-7 order-5 md:order-4" ]
|
||||||
(renderTags settings model ++ renderCustomValues settings model)
|
(renderTags settings model ++ renderCustomValues settings model)
|
||||||
|
|
||||||
|
|
||||||
renderTags : UiSettings -> Model -> List (Html Msg)
|
renderTags : UiSettings -> Model -> List (Html Msg)
|
||||||
renderTags settings model =
|
renderTags settings model =
|
||||||
let
|
let
|
||||||
tagView t =
|
tagView index t =
|
||||||
Comp.LinkTarget.makeTagLink
|
Comp.LinkTarget.makeTagLink
|
||||||
(IdName t.id t.name)
|
(IdName t.id t.name)
|
||||||
[ ( "label md:text-sm inline-flex ml-2 hover:opacity-90 mt-1 items-center", True )
|
[ ( "label md:text-sm inline-flex hover:opacity-90 mt-1 items-center", True )
|
||||||
|
, ( "mr-0 ml-2", index > 0 )
|
||||||
, ( Data.UiSettings.tagColorString2 t settings, True )
|
, ( Data.UiSettings.tagColorString2 t settings, True )
|
||||||
]
|
]
|
||||||
SetLinkTarget
|
SetLinkTarget
|
||||||
@ -208,7 +215,7 @@ renderTags settings model =
|
|||||||
[]
|
[]
|
||||||
|
|
||||||
else
|
else
|
||||||
List.map tagView model.item.tags
|
List.indexedMap tagView model.item.tags
|
||||||
|
|
||||||
|
|
||||||
renderCustomValues : UiSettings -> Model -> List (Html Msg)
|
renderCustomValues : UiSettings -> Model -> List (Html Msg)
|
||||||
|
@ -53,6 +53,7 @@ import Comp.KeyInput
|
|||||||
import Comp.LinkTarget exposing (LinkTarget)
|
import Comp.LinkTarget exposing (LinkTarget)
|
||||||
import Comp.MarkdownInput
|
import Comp.MarkdownInput
|
||||||
import Comp.SentMails
|
import Comp.SentMails
|
||||||
|
import Comp.SimpleTextInput
|
||||||
import Comp.TagDropdown
|
import Comp.TagDropdown
|
||||||
import Data.Direction exposing (Direction)
|
import Data.Direction exposing (Direction)
|
||||||
import Data.Fields exposing (Field)
|
import Data.Fields exposing (Field)
|
||||||
@ -65,8 +66,6 @@ import Html5.DragDrop as DD
|
|||||||
import Http
|
import Http
|
||||||
import Page exposing (Page(..))
|
import Page exposing (Page(..))
|
||||||
import Set exposing (Set)
|
import Set exposing (Set)
|
||||||
import Throttle exposing (Throttle)
|
|
||||||
import Util.Tag
|
|
||||||
|
|
||||||
|
|
||||||
type alias Model =
|
type alias Model =
|
||||||
@ -83,8 +82,8 @@ type alias Model =
|
|||||||
, folderModel : Comp.Dropdown.Model IdName
|
, folderModel : Comp.Dropdown.Model IdName
|
||||||
, allFolders : List FolderItem
|
, allFolders : List FolderItem
|
||||||
, nameModel : String
|
, nameModel : String
|
||||||
|
, nameInput : Comp.SimpleTextInput.Model
|
||||||
, nameState : SaveNameState
|
, nameState : SaveNameState
|
||||||
, nameSaveThrottle : Throttle Msg
|
|
||||||
, notesModel : Maybe String
|
, notesModel : Maybe String
|
||||||
, notesField : NotesField
|
, notesField : NotesField
|
||||||
, itemModal : Maybe ConfirmModalValue
|
, itemModal : Maybe ConfirmModalValue
|
||||||
@ -114,10 +113,10 @@ type alias Model =
|
|||||||
, keyInputModel : Comp.KeyInput.Model
|
, keyInputModel : Comp.KeyInput.Model
|
||||||
, customFieldsModel : Comp.CustomFieldMultiInput.Model
|
, customFieldsModel : Comp.CustomFieldMultiInput.Model
|
||||||
, customFieldSavingIcon : Dict String String
|
, customFieldSavingIcon : Dict String String
|
||||||
, customFieldThrottle : Throttle Msg
|
|
||||||
, allTags : List Tag
|
, allTags : List Tag
|
||||||
, allPersons : Dict String Person
|
, allPersons : Dict String Person
|
||||||
, attachmentDropdownOpen : Bool
|
, attachmentDropdownOpen : Bool
|
||||||
|
, mobileItemMenuOpen : Bool
|
||||||
, editMenuTabsOpen : Set String
|
, editMenuTabsOpen : Set String
|
||||||
, viewMode : ViewMode
|
, viewMode : ViewMode
|
||||||
, showQrModel : ShowQrModel
|
, showQrModel : ShowQrModel
|
||||||
@ -217,9 +216,9 @@ emptyModel =
|
|||||||
, concEquipModel = Comp.Dropdown.makeSingle
|
, concEquipModel = Comp.Dropdown.makeSingle
|
||||||
, folderModel = Comp.Dropdown.makeSingle
|
, folderModel = Comp.Dropdown.makeSingle
|
||||||
, allFolders = []
|
, allFolders = []
|
||||||
|
, nameInput = Comp.SimpleTextInput.initDefault Nothing
|
||||||
, nameModel = ""
|
, nameModel = ""
|
||||||
, nameState = SaveSuccess
|
, nameState = SaveSuccess
|
||||||
, nameSaveThrottle = Throttle.create 1
|
|
||||||
, notesModel = Nothing
|
, notesModel = Nothing
|
||||||
, notesField = ViewNotes
|
, notesField = ViewNotes
|
||||||
, itemModal = Nothing
|
, itemModal = Nothing
|
||||||
@ -249,10 +248,10 @@ emptyModel =
|
|||||||
, keyInputModel = Comp.KeyInput.init
|
, keyInputModel = Comp.KeyInput.init
|
||||||
, customFieldsModel = Comp.CustomFieldMultiInput.initWith []
|
, customFieldsModel = Comp.CustomFieldMultiInput.initWith []
|
||||||
, customFieldSavingIcon = Dict.empty
|
, customFieldSavingIcon = Dict.empty
|
||||||
, customFieldThrottle = Throttle.create 1
|
|
||||||
, allTags = []
|
, allTags = []
|
||||||
, allPersons = Dict.empty
|
, allPersons = Dict.empty
|
||||||
, attachmentDropdownOpen = False
|
, attachmentDropdownOpen = False
|
||||||
|
, mobileItemMenuOpen = False
|
||||||
, editMenuTabsOpen = Set.empty
|
, editMenuTabsOpen = Set.empty
|
||||||
, viewMode = SimpleView
|
, viewMode = SimpleView
|
||||||
, showQrModel = initShowQrModel
|
, showQrModel = initShowQrModel
|
||||||
@ -283,7 +282,6 @@ type Msg
|
|||||||
| GetOrgResp (Result Http.Error ReferenceList)
|
| GetOrgResp (Result Http.Error ReferenceList)
|
||||||
| GetPersonResp (Result Http.Error PersonList)
|
| GetPersonResp (Result Http.Error PersonList)
|
||||||
| GetEquipResp (Result Http.Error EquipmentList)
|
| GetEquipResp (Result Http.Error EquipmentList)
|
||||||
| SetName String
|
|
||||||
| SetNotes String
|
| SetNotes String
|
||||||
| ToggleEditNotes
|
| ToggleEditNotes
|
||||||
| NotesEditMsg Comp.MarkdownInput.Msg
|
| NotesEditMsg Comp.MarkdownInput.Msg
|
||||||
@ -347,7 +345,6 @@ type Msg
|
|||||||
| StartEditEquipModal
|
| StartEditEquipModal
|
||||||
| ResetHiddenMsg Field (Result Http.Error BasicResult)
|
| ResetHiddenMsg Field (Result Http.Error BasicResult)
|
||||||
| SaveNameResp (Result Http.Error BasicResult)
|
| SaveNameResp (Result Http.Error BasicResult)
|
||||||
| UpdateThrottle
|
|
||||||
| KeyInputMsg Comp.KeyInput.Msg
|
| KeyInputMsg Comp.KeyInput.Msg
|
||||||
| ToggleAttachMenu
|
| ToggleAttachMenu
|
||||||
| UiSettingsUpdated
|
| UiSettingsUpdated
|
||||||
@ -356,6 +353,7 @@ type Msg
|
|||||||
| CustomFieldSaveResp CustomField String (Result Http.Error BasicResult)
|
| CustomFieldSaveResp CustomField String (Result Http.Error BasicResult)
|
||||||
| CustomFieldRemoveResp String (Result Http.Error BasicResult)
|
| CustomFieldRemoveResp String (Result Http.Error BasicResult)
|
||||||
| ToggleAttachmentDropdown
|
| ToggleAttachmentDropdown
|
||||||
|
| ToggleMobileItemMenu
|
||||||
| ToggleAkkordionTab String
|
| ToggleAkkordionTab String
|
||||||
| ToggleOpenAllAkkordionTabs
|
| ToggleOpenAllAkkordionTabs
|
||||||
| RequestReprocessFile String
|
| RequestReprocessFile String
|
||||||
@ -368,6 +366,7 @@ type Msg
|
|||||||
| ToggleShowQrItem String
|
| ToggleShowQrItem String
|
||||||
| ToggleShowQrAttach String
|
| ToggleShowQrAttach String
|
||||||
| PrintElement String
|
| PrintElement String
|
||||||
|
| SetNameMsg Comp.SimpleTextInput.Msg
|
||||||
|
|
||||||
|
|
||||||
type SaveNameState
|
type SaveNameState
|
||||||
|
@ -23,14 +23,13 @@ import Api.Model.FolderList exposing (FolderList)
|
|||||||
import Api.Model.IdName exposing (IdName)
|
import Api.Model.IdName exposing (IdName)
|
||||||
import Api.Model.PersonList exposing (PersonList)
|
import Api.Model.PersonList exposing (PersonList)
|
||||||
import Api.Model.ReferenceList exposing (ReferenceList)
|
import Api.Model.ReferenceList exposing (ReferenceList)
|
||||||
import Api.Model.Tag exposing (Tag)
|
|
||||||
import Api.Model.TagList exposing (TagList)
|
|
||||||
import Comp.CustomFieldMultiInput
|
import Comp.CustomFieldMultiInput
|
||||||
import Comp.DatePicker
|
import Comp.DatePicker
|
||||||
import Comp.DetailEdit
|
import Comp.DetailEdit
|
||||||
import Comp.Dropdown exposing (isDropdownChangeMsg)
|
import Comp.Dropdown exposing (isDropdownChangeMsg)
|
||||||
import Comp.ItemDetail.FieldTabState as FTabState exposing (EditTab(..), tabName)
|
import Comp.ItemDetail.FieldTabState as FTabState exposing (EditTab(..), tabName)
|
||||||
import Comp.ItemDetail.FormChange exposing (FormChange(..))
|
import Comp.ItemDetail.FormChange exposing (FormChange(..))
|
||||||
|
import Comp.SimpleTextInput
|
||||||
import Comp.Tabs as TB
|
import Comp.Tabs as TB
|
||||||
import Comp.TagDropdown
|
import Comp.TagDropdown
|
||||||
import Data.CustomFieldChange exposing (CustomFieldChange(..))
|
import Data.CustomFieldChange exposing (CustomFieldChange(..))
|
||||||
@ -43,24 +42,19 @@ import Data.FolderOrder
|
|||||||
import Data.Icons as Icons
|
import Data.Icons as Icons
|
||||||
import Data.PersonOrder
|
import Data.PersonOrder
|
||||||
import Data.PersonUse
|
import Data.PersonUse
|
||||||
import Data.TagOrder
|
|
||||||
import Data.UiSettings exposing (UiSettings)
|
import Data.UiSettings exposing (UiSettings)
|
||||||
import DatePicker exposing (DatePicker)
|
import DatePicker exposing (DatePicker)
|
||||||
import Html exposing (..)
|
import Html exposing (..)
|
||||||
import Html.Attributes exposing (..)
|
import Html.Attributes exposing (..)
|
||||||
import Html.Events exposing (onClick, onInput)
|
import Html.Events exposing (onClick)
|
||||||
import Http
|
import Http
|
||||||
import Markdown
|
import Markdown
|
||||||
import Messages.Comp.ItemDetail.MultiEditMenu exposing (Texts)
|
import Messages.Comp.ItemDetail.MultiEditMenu exposing (Texts)
|
||||||
import Page exposing (Page(..))
|
import Page exposing (Page(..))
|
||||||
import Set exposing (Set)
|
import Set exposing (Set)
|
||||||
import Styles as S
|
import Styles as S
|
||||||
import Task
|
|
||||||
import Throttle exposing (Throttle)
|
|
||||||
import Time
|
|
||||||
import Util.Folder
|
import Util.Folder
|
||||||
import Util.List
|
import Util.List
|
||||||
import Util.Maybe
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -81,8 +75,7 @@ type TagEditMode
|
|||||||
|
|
||||||
type alias Model =
|
type alias Model =
|
||||||
{ tagModel : Comp.TagDropdown.Model
|
{ tagModel : Comp.TagDropdown.Model
|
||||||
, nameModel : String
|
, nameInput : Comp.SimpleTextInput.Model
|
||||||
, nameSaveThrottle : Throttle Msg
|
|
||||||
, folderModel : Comp.Dropdown.Model IdName
|
, folderModel : Comp.Dropdown.Model IdName
|
||||||
, allFolders : List FolderItem
|
, allFolders : List FolderItem
|
||||||
, directionModel : Comp.Dropdown.Model Direction
|
, directionModel : Comp.Dropdown.Model Direction
|
||||||
@ -104,9 +97,7 @@ type alias Model =
|
|||||||
type Msg
|
type Msg
|
||||||
= ItemDatePickerMsg Comp.DatePicker.Msg
|
= ItemDatePickerMsg Comp.DatePicker.Msg
|
||||||
| DueDatePickerMsg Comp.DatePicker.Msg
|
| DueDatePickerMsg Comp.DatePicker.Msg
|
||||||
| SetName String
|
| SetNameMsg Comp.SimpleTextInput.Msg
|
||||||
| SaveName
|
|
||||||
| UpdateThrottle
|
|
||||||
| RemoveDueDate
|
| RemoveDueDate
|
||||||
| RemoveDate
|
| RemoveDate
|
||||||
| ConfirmMsg Bool
|
| ConfirmMsg Bool
|
||||||
@ -140,8 +131,7 @@ init =
|
|||||||
, concEquipModel = Comp.Dropdown.makeSingle
|
, concEquipModel = Comp.Dropdown.makeSingle
|
||||||
, folderModel = Comp.Dropdown.makeSingle
|
, folderModel = Comp.Dropdown.makeSingle
|
||||||
, allFolders = []
|
, allFolders = []
|
||||||
, nameModel = ""
|
, nameInput = Comp.SimpleTextInput.initDefault Nothing
|
||||||
, nameSaveThrottle = Throttle.create 1
|
|
||||||
, itemDatePicker = Comp.DatePicker.emptyModel
|
, itemDatePicker = Comp.DatePicker.emptyModel
|
||||||
, itemDate = Nothing
|
, itemDate = Nothing
|
||||||
, dueDate = Nothing
|
, dueDate = Nothing
|
||||||
@ -490,51 +480,24 @@ update flags msg model =
|
|||||||
RemoveDueDate ->
|
RemoveDueDate ->
|
||||||
resultNoCmd (DueDateChange Nothing) { model | dueDate = Nothing }
|
resultNoCmd (DueDateChange Nothing) { model | dueDate = Nothing }
|
||||||
|
|
||||||
SetName str ->
|
SetNameMsg lm ->
|
||||||
case Util.Maybe.fromString str of
|
|
||||||
Just newName ->
|
|
||||||
let
|
|
||||||
cmd_ =
|
|
||||||
Task.succeed ()
|
|
||||||
|> Task.perform (\_ -> SaveName)
|
|
||||||
|
|
||||||
( newThrottle, cmd ) =
|
|
||||||
Throttle.try cmd_ model.nameSaveThrottle
|
|
||||||
|
|
||||||
newModel =
|
|
||||||
{ model
|
|
||||||
| nameSaveThrottle = newThrottle
|
|
||||||
, nameModel = newName
|
|
||||||
}
|
|
||||||
|
|
||||||
sub =
|
|
||||||
nameThrottleSub newModel
|
|
||||||
in
|
|
||||||
UpdateResult newModel cmd sub NoFormChange
|
|
||||||
|
|
||||||
Nothing ->
|
|
||||||
resultNone { model | nameModel = str }
|
|
||||||
|
|
||||||
SaveName ->
|
|
||||||
case Util.Maybe.fromString model.nameModel of
|
|
||||||
Just n ->
|
|
||||||
resultNoCmd (NameChange n) model
|
|
||||||
|
|
||||||
Nothing ->
|
|
||||||
resultNone model
|
|
||||||
|
|
||||||
UpdateThrottle ->
|
|
||||||
let
|
let
|
||||||
( newThrottle, cmd ) =
|
result =
|
||||||
Throttle.update model.nameSaveThrottle
|
Comp.SimpleTextInput.update lm model.nameInput
|
||||||
|
|
||||||
newModel =
|
formChange =
|
||||||
{ model | nameSaveThrottle = newThrottle }
|
case result.change of
|
||||||
|
Comp.SimpleTextInput.ValueUpdated v ->
|
||||||
|
NameChange <| Maybe.withDefault "" v
|
||||||
|
|
||||||
sub =
|
Comp.SimpleTextInput.ValueUnchanged ->
|
||||||
nameThrottleSub newModel
|
NoFormChange
|
||||||
in
|
in
|
||||||
UpdateResult newModel cmd sub NoFormChange
|
{ model = { model | nameInput = result.model }
|
||||||
|
, cmd = Cmd.batch [ Cmd.map SetNameMsg result.cmd ]
|
||||||
|
, sub = Sub.map SetNameMsg result.sub
|
||||||
|
, change = formChange
|
||||||
|
}
|
||||||
|
|
||||||
CustomFieldMsg lm ->
|
CustomFieldMsg lm ->
|
||||||
let
|
let
|
||||||
@ -547,6 +510,9 @@ update flags msg model =
|
|||||||
cmd_ =
|
cmd_ =
|
||||||
Cmd.map CustomFieldMsg res.cmd
|
Cmd.map CustomFieldMsg res.cmd
|
||||||
|
|
||||||
|
sub_ =
|
||||||
|
Sub.map CustomFieldMsg res.sub
|
||||||
|
|
||||||
change =
|
change =
|
||||||
case res.result of
|
case res.result of
|
||||||
NoFieldChange ->
|
NoFieldChange ->
|
||||||
@ -561,7 +527,7 @@ update flags msg model =
|
|||||||
FieldCreateNew ->
|
FieldCreateNew ->
|
||||||
NoFormChange
|
NoFormChange
|
||||||
in
|
in
|
||||||
UpdateResult model_ cmd_ Sub.none change
|
UpdateResult model_ cmd_ sub_ change
|
||||||
|
|
||||||
ToggleAkkordionTab name ->
|
ToggleAkkordionTab name ->
|
||||||
let
|
let
|
||||||
@ -575,13 +541,6 @@ update flags msg model =
|
|||||||
UpdateResult { model | openTabs = tabs } Cmd.none Sub.none NoFormChange
|
UpdateResult { model | openTabs = tabs } Cmd.none Sub.none NoFormChange
|
||||||
|
|
||||||
|
|
||||||
nameThrottleSub : Model -> Sub Msg
|
|
||||||
nameThrottleSub model =
|
|
||||||
Throttle.ifNeeded
|
|
||||||
(Time.every 400 (\_ -> UpdateThrottle))
|
|
||||||
model.nameSaveThrottle
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--- View
|
--- View
|
||||||
|
|
||||||
@ -913,13 +872,8 @@ renderEditForm2 texts flags cfg settings model =
|
|||||||
, info = Nothing
|
, info = Nothing
|
||||||
, body =
|
, body =
|
||||||
[ div [ class "relative" ]
|
[ div [ class "relative" ]
|
||||||
[ input
|
[ Html.map SetNameMsg
|
||||||
[ type_ "text"
|
(Comp.SimpleTextInput.view [ class S.textInputSidebar ] model.nameInput)
|
||||||
, value model.nameModel
|
|
||||||
, onInput SetName
|
|
||||||
, class S.textInputSidebar
|
|
||||||
]
|
|
||||||
[]
|
|
||||||
, span [ class S.inputLeftIconOnly ]
|
, span [ class S.inputLeftIconOnly ]
|
||||||
[ i
|
[ i
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -8,13 +8,11 @@
|
|||||||
module Comp.ItemDetail.ShowQrCode exposing (UrlId(..), qrCodeElementId, view, view1)
|
module Comp.ItemDetail.ShowQrCode exposing (UrlId(..), qrCodeElementId, view, view1)
|
||||||
|
|
||||||
import Api
|
import Api
|
||||||
import Comp.Basic as B
|
|
||||||
import Comp.ItemDetail.Model exposing (Model, Msg(..), isShowQrAttach, isShowQrItem)
|
import Comp.ItemDetail.Model exposing (Model, Msg(..), isShowQrAttach, isShowQrItem)
|
||||||
import Comp.MenuBar as MB
|
import Comp.MenuBar as MB
|
||||||
import Data.Flags exposing (Flags)
|
import Data.Flags exposing (Flags)
|
||||||
import Html exposing (..)
|
import Html exposing (..)
|
||||||
import Html.Attributes exposing (..)
|
import Html.Attributes exposing (..)
|
||||||
import Html.Events exposing (onClick)
|
|
||||||
import QRCode
|
import QRCode
|
||||||
import Styles as S
|
import Styles as S
|
||||||
import Svg.Attributes as SvgA
|
import Svg.Attributes as SvgA
|
||||||
@ -72,16 +70,17 @@ view1 flags classes urlId =
|
|||||||
, icon = Just "fa fa-print"
|
, icon = Just "fa fa-print"
|
||||||
, label = "Print"
|
, label = "Print"
|
||||||
}
|
}
|
||||||
]
|
, MB.SecondaryButton
|
||||||
, end =
|
|
||||||
[ MB.SecondaryButton
|
|
||||||
{ tagger = toggleShowQr
|
{ tagger = toggleShowQr
|
||||||
, title = "Close"
|
, title = "Close"
|
||||||
, icon = Just "fa fa-times"
|
, icon = Just "fa fa-times"
|
||||||
, label = "Close"
|
, label = "Close"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
, end =
|
||||||
|
[]
|
||||||
, rootClasses = "w-full mt-2 mb-4"
|
, rootClasses = "w-full mt-2 mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div [ class "flex flex-col sm:flex-row sm:space-x-2" ]
|
, div [ class "flex flex-col sm:flex-row sm:space-x-2" ]
|
||||||
[ div
|
[ div
|
||||||
|
@ -170,13 +170,13 @@ attachHeader texts settings model _ attach =
|
|||||||
in
|
in
|
||||||
div [ class "flex flex-col sm:flex-row items-center w-full" ]
|
div [ class "flex flex-col sm:flex-row items-center w-full" ]
|
||||||
[ attachSelectToggle False
|
[ attachSelectToggle False
|
||||||
, div [ class "text-base font-bold flex-grow w-full text-center sm:text-left break-all" ]
|
, div [ class "text-base font-bold flex-grow w-full text-left break-all" ]
|
||||||
[ text attachName
|
[ text attachName
|
||||||
, text " ("
|
, text " ("
|
||||||
, text (Util.Size.bytesReadable Util.Size.B (toFloat attach.size))
|
, text (Util.Size.bytesReadable Util.Size.B (toFloat attach.size))
|
||||||
, text ")"
|
, text ")"
|
||||||
]
|
]
|
||||||
, div [ class "flex flex-row justify-end items-center" ]
|
, div [ class "flex flex-row justify-end items-center w-full" ]
|
||||||
[ attachSelectToggle True
|
[ attachSelectToggle True
|
||||||
, a
|
, a
|
||||||
[ href fileUrl
|
[ href fileUrl
|
||||||
|
@ -54,6 +54,7 @@ import Comp.MarkdownInput
|
|||||||
import Comp.OrgForm
|
import Comp.OrgForm
|
||||||
import Comp.PersonForm
|
import Comp.PersonForm
|
||||||
import Comp.SentMails
|
import Comp.SentMails
|
||||||
|
import Comp.SimpleTextInput
|
||||||
import Comp.TagDropdown
|
import Comp.TagDropdown
|
||||||
import Data.CustomFieldChange exposing (CustomFieldChange(..))
|
import Data.CustomFieldChange exposing (CustomFieldChange(..))
|
||||||
import Data.Direction
|
import Data.Direction
|
||||||
@ -73,7 +74,6 @@ import Http
|
|||||||
import Page exposing (Page(..))
|
import Page exposing (Page(..))
|
||||||
import Ports
|
import Ports
|
||||||
import Set exposing (Set)
|
import Set exposing (Set)
|
||||||
import Throttle
|
|
||||||
import Time
|
import Time
|
||||||
import Util.File exposing (makeFileId)
|
import Util.File exposing (makeFileId)
|
||||||
import Util.List
|
import Util.List
|
||||||
@ -239,6 +239,7 @@ update key flags inav settings msg model =
|
|||||||
{ model =
|
{ model =
|
||||||
{ lastModel
|
{ lastModel
|
||||||
| item = item
|
| item = item
|
||||||
|
, nameInput = Comp.SimpleTextInput.initDefault (Just item.name)
|
||||||
, nameModel = item.name
|
, nameModel = item.name
|
||||||
, nameState = SaveSuccess
|
, nameState = SaveSuccess
|
||||||
, notesModel = item.notes
|
, notesModel = item.notes
|
||||||
@ -459,29 +460,25 @@ update key flags inav settings msg model =
|
|||||||
in
|
in
|
||||||
resultModelCmd ( newModel, Cmd.batch [ save, Cmd.map ConcEquipMsg c2 ] )
|
resultModelCmd ( newModel, Cmd.batch [ save, Cmd.map ConcEquipMsg c2 ] )
|
||||||
|
|
||||||
SetName str ->
|
SetNameMsg lm ->
|
||||||
case Util.Maybe.fromString str of
|
let
|
||||||
Just newName ->
|
result =
|
||||||
let
|
Comp.SimpleTextInput.update lm model.nameInput
|
||||||
nm =
|
|
||||||
{ model | nameModel = newName }
|
|
||||||
|
|
||||||
cmd_ =
|
( setter, value, save ) =
|
||||||
setName flags nm
|
case result.change of
|
||||||
|
Comp.SimpleTextInput.ValueUpdated v ->
|
||||||
|
( setName flags { model | nameModel = Maybe.withDefault "" v }, v, Saving )
|
||||||
|
|
||||||
( newThrottle, cmd ) =
|
Comp.SimpleTextInput.ValueUnchanged ->
|
||||||
Throttle.try cmd_ nm.nameSaveThrottle
|
( Cmd.none, Nothing, model.nameState )
|
||||||
in
|
in
|
||||||
withSub
|
{ model = { model | nameInput = result.model, nameState = save, nameModel = Maybe.withDefault model.nameModel value }
|
||||||
( { nm
|
, cmd = Cmd.batch [ Cmd.map SetNameMsg result.cmd, setter ]
|
||||||
| nameState = Saving
|
, sub = Sub.map SetNameMsg result.sub
|
||||||
, nameSaveThrottle = newThrottle
|
, linkTarget = Comp.LinkTarget.LinkNone
|
||||||
}
|
, removedItem = Nothing
|
||||||
, cmd
|
}
|
||||||
)
|
|
||||||
|
|
||||||
Nothing ->
|
|
||||||
resultModel { model | nameModel = str, nameState = SaveFailed }
|
|
||||||
|
|
||||||
SetNotes str ->
|
SetNotes str ->
|
||||||
resultModel
|
resultModel
|
||||||
@ -519,10 +516,16 @@ update key flags inav settings msg model =
|
|||||||
resetCmds =
|
resetCmds =
|
||||||
resetHiddenFields settings flags model.item.id ResetHiddenMsg
|
resetHiddenFields settings flags model.item.id ResetHiddenMsg
|
||||||
in
|
in
|
||||||
resultModelCmd ( model, Cmd.batch (Api.setConfirmed flags model.item.id SaveResp :: resetCmds) )
|
resultModelCmd
|
||||||
|
( { model | mobileItemMenuOpen = False }
|
||||||
|
, Cmd.batch (Api.setConfirmed flags model.item.id SaveResp :: resetCmds)
|
||||||
|
)
|
||||||
|
|
||||||
UnconfirmItem ->
|
UnconfirmItem ->
|
||||||
resultModelCmd ( model, Api.setUnconfirmed flags model.item.id SaveResp )
|
resultModelCmd
|
||||||
|
( { model | mobileItemMenuOpen = False }
|
||||||
|
, Api.setUnconfirmed flags model.item.id SaveResp
|
||||||
|
)
|
||||||
|
|
||||||
ItemDatePickerMsg m ->
|
ItemDatePickerMsg m ->
|
||||||
let
|
let
|
||||||
@ -573,7 +576,11 @@ update key flags inav settings msg model =
|
|||||||
resultModel { model | itemModal = Nothing }
|
resultModel { model | itemModal = Nothing }
|
||||||
|
|
||||||
RequestDelete ->
|
RequestDelete ->
|
||||||
resultModel { model | itemModal = Just (ConfirmModalDeleteItem DeleteItemConfirmed) }
|
resultModel
|
||||||
|
{ model
|
||||||
|
| itemModal = Just (ConfirmModalDeleteItem DeleteItemConfirmed)
|
||||||
|
, mobileItemMenuOpen = False
|
||||||
|
}
|
||||||
|
|
||||||
SetCorrOrgSuggestion idname ->
|
SetCorrOrgSuggestion idname ->
|
||||||
resultModelCmd ( model, setCorrOrg flags model (Just idname) )
|
resultModelCmd ( model, setCorrOrg flags model (Just idname) )
|
||||||
@ -819,6 +826,7 @@ update key flags inav settings msg model =
|
|||||||
| mailOpen = newOpen
|
| mailOpen = newOpen
|
||||||
, addFilesOpen = filesOpen
|
, addFilesOpen = filesOpen
|
||||||
, mailSendResult = sendResult
|
, mailSendResult = sendResult
|
||||||
|
, mobileItemMenuOpen = False
|
||||||
}
|
}
|
||||||
|
|
||||||
SendMailResp (Ok br) ->
|
SendMailResp (Ok br) ->
|
||||||
@ -983,6 +991,7 @@ update key flags inav settings msg model =
|
|||||||
resultModel
|
resultModel
|
||||||
{ model
|
{ model
|
||||||
| addFilesOpen = not model.addFilesOpen
|
| addFilesOpen = not model.addFilesOpen
|
||||||
|
, mobileItemMenuOpen = False
|
||||||
, mailOpen =
|
, mailOpen =
|
||||||
if model.addFilesOpen == False then
|
if model.addFilesOpen == False then
|
||||||
False
|
False
|
||||||
@ -1351,19 +1360,6 @@ update key flags inav settings msg model =
|
|||||||
ResetHiddenMsg _ _ ->
|
ResetHiddenMsg _ _ ->
|
||||||
resultModel model
|
resultModel model
|
||||||
|
|
||||||
UpdateThrottle ->
|
|
||||||
let
|
|
||||||
( newSaveName, cmd1 ) =
|
|
||||||
Throttle.update model.nameSaveThrottle
|
|
||||||
|
|
||||||
( newCustomField, cmd2 ) =
|
|
||||||
Throttle.update model.customFieldThrottle
|
|
||||||
in
|
|
||||||
withSub
|
|
||||||
( { model | nameSaveThrottle = newSaveName, customFieldThrottle = newCustomField }
|
|
||||||
, Cmd.batch [ cmd1, cmd2 ]
|
|
||||||
)
|
|
||||||
|
|
||||||
KeyInputMsg lm ->
|
KeyInputMsg lm ->
|
||||||
let
|
let
|
||||||
( km, keys ) =
|
( km, keys ) =
|
||||||
@ -1396,9 +1392,7 @@ update key flags inav settings msg model =
|
|||||||
resultModel model_
|
resultModel model_
|
||||||
|
|
||||||
else
|
else
|
||||||
-- withSub because the keypress may be inside the name
|
resultModelCmd ( model_, Cmd.none )
|
||||||
-- field and requires to activate the throttle
|
|
||||||
withSub ( model_, Cmd.none )
|
|
||||||
|
|
||||||
ToggleAttachMenu ->
|
ToggleAttachMenu ->
|
||||||
resultModel
|
resultModel
|
||||||
@ -1432,10 +1426,13 @@ update key flags inav settings msg model =
|
|||||||
cmd_ =
|
cmd_ =
|
||||||
Cmd.map CustomFieldMsg result.cmd
|
Cmd.map CustomFieldMsg result.cmd
|
||||||
|
|
||||||
|
sub_ =
|
||||||
|
Sub.map CustomFieldMsg result.sub
|
||||||
|
|
||||||
loadingIcon =
|
loadingIcon =
|
||||||
"refresh loading icon"
|
"refresh loading icon"
|
||||||
|
|
||||||
( action_, icons ) =
|
( action, icons ) =
|
||||||
case result.result of
|
case result.result of
|
||||||
NoFieldChange ->
|
NoFieldChange ->
|
||||||
( Cmd.none, model.customFieldSavingIcon )
|
( Cmd.none, model.customFieldSavingIcon )
|
||||||
@ -1466,22 +1463,14 @@ update key flags inav settings msg model =
|
|||||||
else
|
else
|
||||||
Nothing
|
Nothing
|
||||||
|
|
||||||
( throttle, action ) =
|
|
||||||
if action_ == Cmd.none then
|
|
||||||
( model.customFieldThrottle, action_ )
|
|
||||||
|
|
||||||
else
|
|
||||||
Throttle.try action_ model.customFieldThrottle
|
|
||||||
|
|
||||||
model_ =
|
model_ =
|
||||||
{ model
|
{ model
|
||||||
| customFieldsModel = result.model
|
| customFieldsModel = result.model
|
||||||
, customFieldThrottle = throttle
|
|
||||||
, modalEdit = modalEdit
|
, modalEdit = modalEdit
|
||||||
, customFieldSavingIcon = icons
|
, customFieldSavingIcon = icons
|
||||||
}
|
}
|
||||||
in
|
in
|
||||||
withSub ( model_, Cmd.batch [ cmd_, action ] )
|
resultModelCmdSub ( model_, Cmd.batch [ cmd_, action ], sub_ )
|
||||||
|
|
||||||
CustomFieldSaveResp cf fv (Ok res) ->
|
CustomFieldSaveResp cf fv (Ok res) ->
|
||||||
let
|
let
|
||||||
@ -1520,6 +1509,9 @@ update key flags inav settings msg model =
|
|||||||
ToggleAttachmentDropdown ->
|
ToggleAttachmentDropdown ->
|
||||||
resultModel { model | attachmentDropdownOpen = not model.attachmentDropdownOpen }
|
resultModel { model | attachmentDropdownOpen = not model.attachmentDropdownOpen }
|
||||||
|
|
||||||
|
ToggleMobileItemMenu ->
|
||||||
|
resultModel { model | mobileItemMenuOpen = not model.mobileItemMenuOpen }
|
||||||
|
|
||||||
ToggleAkkordionTab name ->
|
ToggleAkkordionTab name ->
|
||||||
let
|
let
|
||||||
tabs =
|
tabs =
|
||||||
@ -1572,6 +1564,7 @@ update key flags inav settings msg model =
|
|||||||
{ model
|
{ model
|
||||||
| attachmentDropdownOpen = False
|
| attachmentDropdownOpen = False
|
||||||
, itemModal = Just (ConfirmModalReprocessItem ReprocessItemConfirmed)
|
, itemModal = Just (ConfirmModalReprocessItem ReprocessItemConfirmed)
|
||||||
|
, mobileItemMenuOpen = False
|
||||||
}
|
}
|
||||||
in
|
in
|
||||||
resultModel model_
|
resultModel model_
|
||||||
@ -1593,7 +1586,7 @@ update key flags inav settings msg model =
|
|||||||
SelectView _ ->
|
SelectView _ ->
|
||||||
( SimpleView, Cmd.none )
|
( SimpleView, Cmd.none )
|
||||||
in
|
in
|
||||||
withSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| viewMode = nextView
|
| viewMode = nextView
|
||||||
}
|
}
|
||||||
@ -1611,7 +1604,7 @@ update key flags inav settings msg model =
|
|||||||
next =
|
next =
|
||||||
{ sqm | item = not sqm.item }
|
{ sqm | item = not sqm.item }
|
||||||
in
|
in
|
||||||
resultModel { model | showQrModel = next }
|
resultModel { model | showQrModel = next, mobileItemMenuOpen = False }
|
||||||
|
|
||||||
ToggleShowQrAttach id ->
|
ToggleShowQrAttach id ->
|
||||||
let
|
let
|
||||||
@ -1760,24 +1753,6 @@ setErrored model fileid =
|
|||||||
Set.insert fileid model.errored
|
Set.insert fileid model.errored
|
||||||
|
|
||||||
|
|
||||||
withSub : ( Model, Cmd Msg ) -> UpdateResult
|
|
||||||
withSub ( m, c ) =
|
|
||||||
{ model = m
|
|
||||||
, cmd = c
|
|
||||||
, sub =
|
|
||||||
Sub.batch
|
|
||||||
[ Throttle.ifNeeded
|
|
||||||
(Time.every 200 (\_ -> UpdateThrottle))
|
|
||||||
m.nameSaveThrottle
|
|
||||||
, Throttle.ifNeeded
|
|
||||||
(Time.every 200 (\_ -> UpdateThrottle))
|
|
||||||
m.customFieldThrottle
|
|
||||||
]
|
|
||||||
, linkTarget = Comp.LinkTarget.LinkNone
|
|
||||||
, removedItem = Nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
resetField : Flags -> String -> (Field -> Result Http.Error BasicResult -> msg) -> Field -> Cmd msg
|
resetField : Flags -> String -> (Field -> Result Http.Error BasicResult -> msg) -> Field -> Cmd msg
|
||||||
resetField flags item tagger field =
|
resetField flags item tagger field =
|
||||||
case field of
|
case field of
|
||||||
|
@ -42,8 +42,9 @@ import Styles as S
|
|||||||
view : Texts -> Flags -> ItemNav -> UiSettings -> Model -> Html Msg
|
view : Texts -> Flags -> ItemNav -> UiSettings -> Model -> Html Msg
|
||||||
view texts flags inav settings model =
|
view texts flags inav settings model =
|
||||||
div [ class "flex flex-col h-full" ]
|
div [ class "flex flex-col h-full" ]
|
||||||
[ header texts settings model
|
[ header texts settings inav model
|
||||||
, menuBar texts inav settings model
|
|
||||||
|
-- , menuBar texts inav settings model
|
||||||
, body texts flags inav settings model
|
, body texts flags inav settings model
|
||||||
, itemModal texts model
|
, itemModal texts model
|
||||||
]
|
]
|
||||||
@ -59,10 +60,14 @@ itemModal texts model =
|
|||||||
span [ class "hidden" ] []
|
span [ class "hidden" ] []
|
||||||
|
|
||||||
|
|
||||||
header : Texts -> UiSettings -> Model -> Html Msg
|
header : Texts -> UiSettings -> ItemNav -> Model -> Html Msg
|
||||||
header texts settings model =
|
header texts settings inav model =
|
||||||
div [ class "my-3" ]
|
div [ class "my-3" ]
|
||||||
[ Comp.ItemDetail.ItemInfoHeader.view texts.itemInfoHeader settings model ]
|
[ Comp.ItemDetail.ItemInfoHeader.view texts.itemInfoHeader
|
||||||
|
settings
|
||||||
|
model
|
||||||
|
(menuBar texts inav settings model)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
menuBar : Texts -> ItemNav -> UiSettings -> Model -> Html Msg
|
menuBar : Texts -> ItemNav -> UiSettings -> Model -> Html Msg
|
||||||
@ -136,6 +141,7 @@ menuBar texts inav settings model =
|
|||||||
[ classList
|
[ classList
|
||||||
[ ( "bg-gray-200 dark:bg-slate-600", model.mailOpen )
|
[ ( "bg-gray-200 dark:bg-slate-600", model.mailOpen )
|
||||||
]
|
]
|
||||||
|
, class "hidden md:block"
|
||||||
, title texts.sendMail
|
, title texts.sendMail
|
||||||
, onClick ToggleMail
|
, onClick ToggleMail
|
||||||
, class S.secondaryBasicButton
|
, class S.secondaryBasicButton
|
||||||
@ -148,6 +154,7 @@ menuBar texts inav settings model =
|
|||||||
[ classList
|
[ classList
|
||||||
[ ( "bg-gray-200 dark:bg-slate-600", model.addFilesOpen )
|
[ ( "bg-gray-200 dark:bg-slate-600", model.addFilesOpen )
|
||||||
]
|
]
|
||||||
|
, class "hidden md:block"
|
||||||
, if model.addFilesOpen then
|
, if model.addFilesOpen then
|
||||||
title texts.close
|
title texts.close
|
||||||
|
|
||||||
@ -164,6 +171,7 @@ menuBar texts inav settings model =
|
|||||||
[ classList
|
[ classList
|
||||||
[ ( "bg-gray-200 dark:bg-slate-600", isShowQrItem model.showQrModel )
|
[ ( "bg-gray-200 dark:bg-slate-600", isShowQrItem model.showQrModel )
|
||||||
]
|
]
|
||||||
|
, class "hidden md:block"
|
||||||
, if isShowQrItem model.showQrModel then
|
, if isShowQrItem model.showQrModel then
|
||||||
title texts.close
|
title texts.close
|
||||||
|
|
||||||
@ -175,6 +183,11 @@ menuBar texts inav settings model =
|
|||||||
]
|
]
|
||||||
[ Icons.showQrIcon ""
|
[ Icons.showQrIcon ""
|
||||||
]
|
]
|
||||||
|
, MB.CustomElement <|
|
||||||
|
div
|
||||||
|
[ class "flex flex-grow md:hidden"
|
||||||
|
]
|
||||||
|
[]
|
||||||
, MB.CustomElement <|
|
, MB.CustomElement <|
|
||||||
a
|
a
|
||||||
[ class S.primaryButton
|
[ class S.primaryButton
|
||||||
@ -183,9 +196,88 @@ menuBar texts inav settings model =
|
|||||||
, title texts.confirmItemMetadata
|
, title texts.confirmItemMetadata
|
||||||
, classList [ ( "hidden", model.item.state /= "created" ) ]
|
, classList [ ( "hidden", model.item.state /= "created" ) ]
|
||||||
]
|
]
|
||||||
[ i [ class "fa fa-check mr-2" ] []
|
[ i [ class "fa fa-check" ] []
|
||||||
, text texts.confirm
|
, span [ class "hidden ml-0 sm:ml-2 sm:inline" ]
|
||||||
|
[ text texts.confirm ]
|
||||||
]
|
]
|
||||||
|
, MB.Dropdown
|
||||||
|
{ linkIcon = "fa fa-bars"
|
||||||
|
, label = ""
|
||||||
|
, linkClass =
|
||||||
|
[ ( "md:hidden", True )
|
||||||
|
, ( S.secondaryBasicButton, True )
|
||||||
|
]
|
||||||
|
, toggleMenu = ToggleMobileItemMenu
|
||||||
|
, menuOpen = model.mobileItemMenuOpen
|
||||||
|
, items =
|
||||||
|
[ { icon = i [ class "fa fa-envelope font-thin" ] []
|
||||||
|
, label = texts.sendMail
|
||||||
|
, disabled = False
|
||||||
|
, attrs =
|
||||||
|
[ href "#"
|
||||||
|
, onClick ToggleMail
|
||||||
|
]
|
||||||
|
}
|
||||||
|
, { icon = Icons.addFilesIcon2 ""
|
||||||
|
, label = texts.addMoreFiles
|
||||||
|
, disabled = False
|
||||||
|
, attrs =
|
||||||
|
[ href "#"
|
||||||
|
, onClick AddFilesToggle
|
||||||
|
]
|
||||||
|
}
|
||||||
|
, { icon = Icons.showQrIcon ""
|
||||||
|
, label = texts.showQrCode
|
||||||
|
, disabled = False
|
||||||
|
, attrs =
|
||||||
|
[ href "#"
|
||||||
|
, onClick (ToggleShowQrItem model.item.id)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
, { icon = i [] []
|
||||||
|
, label = "separator"
|
||||||
|
, disabled = False
|
||||||
|
, attrs =
|
||||||
|
[]
|
||||||
|
}
|
||||||
|
, { icon = i [ class "fa fa-eye-slash font-thin" ] []
|
||||||
|
, label = texts.unconfirmItemMetadata
|
||||||
|
, disabled = False
|
||||||
|
, attrs =
|
||||||
|
[ href "#"
|
||||||
|
, onClick UnconfirmItem
|
||||||
|
, classList [ ( "hidden", model.item.state == "created" ) ]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
, { icon = i [ class "fa fa-redo" ] []
|
||||||
|
, label = texts.reprocessItem
|
||||||
|
, disabled = False
|
||||||
|
, attrs =
|
||||||
|
[ href "#"
|
||||||
|
, onClick RequestReprocessItem
|
||||||
|
]
|
||||||
|
}
|
||||||
|
, if model.item.state == "deleted" then
|
||||||
|
{ icon = i [ class "fa fa-trash-restore" ] []
|
||||||
|
, label = texts.undeleteThisItem
|
||||||
|
, disabled = False
|
||||||
|
, attrs =
|
||||||
|
[ href "#"
|
||||||
|
, onClick RestoreItem
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{ icon = i [ class "fa fa-trash", class "text-red-500 dark:text-orange-500" ] []
|
||||||
|
, label = texts.deleteThisItem
|
||||||
|
, disabled = False
|
||||||
|
, attrs =
|
||||||
|
[ href "#"
|
||||||
|
, onClick RequestDelete
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
, end =
|
, end =
|
||||||
[ MB.CustomElement <|
|
[ MB.CustomElement <|
|
||||||
@ -195,12 +287,14 @@ menuBar texts inav settings model =
|
|||||||
, onClick UnconfirmItem
|
, onClick UnconfirmItem
|
||||||
, title texts.unconfirmItemMetadata
|
, title texts.unconfirmItemMetadata
|
||||||
, classList [ ( "hidden", model.item.state == "created" ) ]
|
, classList [ ( "hidden", model.item.state == "created" ) ]
|
||||||
|
, class "hidden md:block"
|
||||||
]
|
]
|
||||||
[ i [ class "fa fa-eye-slash font-thin" ] []
|
[ i [ class "fa fa-eye-slash font-thin" ] []
|
||||||
]
|
]
|
||||||
, MB.CustomElement <|
|
, MB.CustomElement <|
|
||||||
a
|
a
|
||||||
[ class S.secondaryBasicButton
|
[ class S.secondaryBasicButton
|
||||||
|
, class "hidden md:block"
|
||||||
, href "#"
|
, href "#"
|
||||||
, onClick RequestReprocessItem
|
, onClick RequestReprocessItem
|
||||||
, title texts.reprocessItem
|
, title texts.reprocessItem
|
||||||
@ -211,6 +305,7 @@ menuBar texts inav settings model =
|
|||||||
MB.CustomElement <|
|
MB.CustomElement <|
|
||||||
a
|
a
|
||||||
[ class S.undeleteButton
|
[ class S.undeleteButton
|
||||||
|
, class "hidden md:block"
|
||||||
, href "#"
|
, href "#"
|
||||||
, onClick RestoreItem
|
, onClick RestoreItem
|
||||||
, title texts.undeleteThisItem
|
, title texts.undeleteThisItem
|
||||||
@ -222,6 +317,7 @@ menuBar texts inav settings model =
|
|||||||
MB.CustomElement <|
|
MB.CustomElement <|
|
||||||
a
|
a
|
||||||
[ class S.deleteButton
|
[ class S.deleteButton
|
||||||
|
, class "hidden md:block"
|
||||||
, href "#"
|
, href "#"
|
||||||
, onClick RequestDelete
|
, onClick RequestDelete
|
||||||
, title texts.deleteThisItem
|
, title texts.deleteThisItem
|
||||||
@ -229,21 +325,39 @@ menuBar texts inav settings model =
|
|||||||
[ i [ class "fa fa-trash" ] []
|
[ i [ class "fa fa-trash" ] []
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-2"
|
, rootClasses = "mb-2 md:mt-2"
|
||||||
|
, sticky = False
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
body : Texts -> Flags -> ItemNav -> UiSettings -> Model -> Html Msg
|
body : Texts -> Flags -> ItemNav -> UiSettings -> Model -> Html Msg
|
||||||
body texts flags _ settings model =
|
body texts flags _ settings model =
|
||||||
div [ class "grid gap-2 grid-cols-1 md:grid-cols-3 h-full" ]
|
div [ class "grid gap-2 grid-cols-1 md:grid-cols-3 h-full" ]
|
||||||
[ leftArea texts flags settings model
|
[ div [ class "flex flex-col hidden md:block h-full" ]
|
||||||
, rightArea texts flags settings model
|
[ itemActions texts flags settings model ""
|
||||||
|
, notesAndSentMails texts flags settings model "h-full"
|
||||||
|
]
|
||||||
|
, attachmentView texts flags settings model "order-2 col-span-2"
|
||||||
|
, itemActions texts flags settings model "order-1 md:hidden"
|
||||||
|
, notesAndSentMails texts flags settings model "order-3 md:hidden"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
leftArea : Texts -> Flags -> UiSettings -> Model -> Html Msg
|
attachmentView : Texts -> Flags -> UiSettings -> Model -> String -> Html Msg
|
||||||
leftArea texts flags settings model =
|
attachmentView texts flags settings model classes =
|
||||||
div [ class "w-full md:order-first md:mr-2 flex flex-col" ]
|
div
|
||||||
|
[ class "h-full"
|
||||||
|
, class classes
|
||||||
|
]
|
||||||
|
(attachmentsBody texts flags settings model)
|
||||||
|
|
||||||
|
|
||||||
|
itemActions : Texts -> Flags -> UiSettings -> Model -> String -> Html Msg
|
||||||
|
itemActions texts flags settings model classes =
|
||||||
|
div
|
||||||
|
[ class "w-full md:mr-2 flex flex-col"
|
||||||
|
, class classes
|
||||||
|
]
|
||||||
[ addDetailForm texts settings model
|
[ addDetailForm texts settings model
|
||||||
, sendMailForm texts settings model
|
, sendMailForm texts settings model
|
||||||
, Comp.ItemDetail.AddFilesForm.view texts.addFilesForm model
|
, Comp.ItemDetail.AddFilesForm.view texts.addFilesForm model
|
||||||
@ -251,7 +365,16 @@ leftArea texts flags settings model =
|
|||||||
(S.border ++ " mb-4")
|
(S.border ++ " mb-4")
|
||||||
model
|
model
|
||||||
(Comp.ItemDetail.ShowQrCode.Item model.item.id)
|
(Comp.ItemDetail.ShowQrCode.Item model.item.id)
|
||||||
, Comp.ItemDetail.Notes.view texts.notes model
|
]
|
||||||
|
|
||||||
|
|
||||||
|
notesAndSentMails : Texts -> Flags -> UiSettings -> Model -> String -> Html Msg
|
||||||
|
notesAndSentMails texts _ _ model classes =
|
||||||
|
div
|
||||||
|
[ class "w-full md:mr-2 flex flex-col"
|
||||||
|
, class classes
|
||||||
|
]
|
||||||
|
[ Comp.ItemDetail.Notes.view texts.notes model
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
[ ( "hidden", Comp.SentMails.isEmpty model.sentMails )
|
[ ( "hidden", Comp.SentMails.isEmpty model.sentMails )
|
||||||
@ -268,12 +391,6 @@ leftArea texts flags settings model =
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
rightArea : Texts -> Flags -> UiSettings -> Model -> Html Msg
|
|
||||||
rightArea texts flags settings model =
|
|
||||||
div [ class "md:col-span-2 h-full" ]
|
|
||||||
(attachmentsBody texts flags settings model)
|
|
||||||
|
|
||||||
|
|
||||||
attachmentsBody : Texts -> Flags -> UiSettings -> Model -> List (Html Msg)
|
attachmentsBody : Texts -> Flags -> UiSettings -> Model -> List (Html Msg)
|
||||||
attachmentsBody texts flags settings model =
|
attachmentsBody texts flags settings model =
|
||||||
List.indexedMap (Comp.ItemDetail.SingleAttachment.view texts.singleAttachment flags settings model)
|
List.indexedMap (Comp.ItemDetail.SingleAttachment.view texts.singleAttachment flags settings model)
|
||||||
|
@ -31,7 +31,7 @@ import Data.Flags exposing (Flags)
|
|||||||
import Data.UiSettings exposing (UiSettings)
|
import Data.UiSettings exposing (UiSettings)
|
||||||
import Html exposing (..)
|
import Html exposing (..)
|
||||||
import Html.Attributes exposing (..)
|
import Html.Attributes exposing (..)
|
||||||
import Html.Events exposing (onClick, onFocus, onInput)
|
import Html.Events exposing (onClick, onInput)
|
||||||
import Http
|
import Http
|
||||||
import Messages.Comp.ItemMail exposing (Texts)
|
import Messages.Comp.ItemMail exposing (Texts)
|
||||||
import Styles as S
|
import Styles as S
|
||||||
|
@ -272,6 +272,7 @@ view texts settings model =
|
|||||||
]
|
]
|
||||||
, end = []
|
, end = []
|
||||||
, rootClasses = "my-4"
|
, rootClasses = "my-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, renderFormState texts model
|
, renderFormState texts model
|
||||||
, div [ class "flex-col px-2" ]
|
, div [ class "flex-col px-2" ]
|
||||||
|
@ -41,6 +41,7 @@ type alias MenuBar msg =
|
|||||||
{ start : List (Item msg)
|
{ start : List (Item msg)
|
||||||
, end : List (Item msg)
|
, end : List (Item msg)
|
||||||
, rootClasses : String
|
, rootClasses : String
|
||||||
|
, sticky : Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -125,7 +126,8 @@ view1 classes mb =
|
|||||||
in
|
in
|
||||||
div
|
div
|
||||||
[ class mb.rootClasses
|
[ class mb.rootClasses
|
||||||
, class "flex flex-col sm:flex-row space-y-1 sm:space-y-0 sticky top-0 z-40"
|
, class "flex flex-col md:flex-row space-y-1 md:space-y-0"
|
||||||
|
, classList [ ( "sticky top-0 z-40", mb.sticky ) ]
|
||||||
, class classes
|
, class classes
|
||||||
]
|
]
|
||||||
[ left
|
[ left
|
||||||
@ -296,7 +298,7 @@ makeButton btnType model =
|
|||||||
[]
|
[]
|
||||||
|
|
||||||
else
|
else
|
||||||
[ span [ class (iconMargin ++ " hidden sm:inline") ]
|
[ span [ class (iconMargin ++ " hidden md:inline") ]
|
||||||
[ text model.label
|
[ text model.label
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
@ -391,6 +391,7 @@ viewForm texts settings outerModel model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div [ class "mt-2" ]
|
, div [ class "mt-2" ]
|
||||||
[ viewState texts outerModel
|
[ viewState texts outerModel
|
||||||
@ -445,6 +446,7 @@ viewList texts model =
|
|||||||
[ Comp.ChannelMenu.channelMenu texts.channelType menuModel
|
[ Comp.ChannelMenu.channelMenu texts.channelType menuModel
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg
|
, Html.map TableMsg
|
||||||
(Comp.NotificationChannelTable.view texts.notificationTable
|
(Comp.NotificationChannelTable.view texts.notificationTable
|
||||||
|
@ -358,6 +358,7 @@ viewForm texts settings outerModel model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div [ class "mt-2" ]
|
, div [ class "mt-2" ]
|
||||||
[ viewState texts outerModel
|
[ viewState texts outerModel
|
||||||
@ -409,6 +410,7 @@ viewList texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg
|
, Html.map TableMsg
|
||||||
(Comp.NotificationHookTable.view texts.notificationTable
|
(Comp.NotificationHookTable.view texts.notificationTable
|
||||||
|
@ -126,6 +126,7 @@ view cfg model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-1"
|
, rootClasses = "mb-1"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, case model of
|
, case model of
|
||||||
ModelResp res ->
|
ModelResp res ->
|
||||||
@ -137,7 +138,7 @@ view cfg model =
|
|||||||
[ text (String.join "\n" res.messages)
|
[ text (String.join "\n" res.messages)
|
||||||
]
|
]
|
||||||
|
|
||||||
ModelHttpError err ->
|
ModelHttpError _ ->
|
||||||
div [ class "" ]
|
div [ class "" ]
|
||||||
[]
|
[]
|
||||||
|
|
||||||
|
@ -272,6 +272,7 @@ viewTable2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg (Comp.OrgTable.view2 texts.orgTable model.order model.tableModel)
|
, Html.map TableMsg (Comp.OrgTable.view2 texts.orgTable model.order model.tableModel)
|
||||||
, B.loadingDimmer
|
, B.loadingDimmer
|
||||||
@ -343,6 +344,7 @@ viewForm2 texts settings model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -196,7 +196,7 @@ makeSettings model =
|
|||||||
query =
|
query =
|
||||||
let
|
let
|
||||||
qstr =
|
qstr =
|
||||||
model.queryModel.input
|
Comp.PowerSearchInput.getSearchString model.queryModel
|
||||||
|
|
||||||
bm =
|
bm =
|
||||||
Comp.BookmarkDropdown.getSelectedId model.bookmarkDropdown
|
Comp.BookmarkDropdown.getSelectedId model.bookmarkDropdown
|
||||||
@ -409,7 +409,6 @@ view texts extraClasses settings model =
|
|||||||
[ Html.map QueryMsg
|
[ Html.map QueryMsg
|
||||||
(Comp.PowerSearchInput.viewInput
|
(Comp.PowerSearchInput.viewInput
|
||||||
{ placeholder = texts.queryLabel
|
{ placeholder = texts.queryLabel
|
||||||
, extraAttrs = []
|
|
||||||
}
|
}
|
||||||
model.queryModel
|
model.queryModel
|
||||||
)
|
)
|
||||||
@ -490,6 +489,7 @@ view texts extraClasses settings model =
|
|||||||
[ startOnceBtn
|
[ startOnceBtn
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -16,11 +16,9 @@ module Comp.PeriodicQueryTaskManage exposing
|
|||||||
import Api
|
import Api
|
||||||
import Api.Model.BasicResult exposing (BasicResult)
|
import Api.Model.BasicResult exposing (BasicResult)
|
||||||
import Api.Model.PeriodicQuerySettings exposing (PeriodicQuerySettings)
|
import Api.Model.PeriodicQuerySettings exposing (PeriodicQuerySettings)
|
||||||
import Comp.ChannelMenu
|
|
||||||
import Comp.MenuBar as MB
|
import Comp.MenuBar as MB
|
||||||
import Comp.PeriodicQueryTaskForm
|
import Comp.PeriodicQueryTaskForm
|
||||||
import Comp.PeriodicQueryTaskList
|
import Comp.PeriodicQueryTaskList
|
||||||
import Data.ChannelType exposing (ChannelType)
|
|
||||||
import Data.Flags exposing (Flags)
|
import Data.Flags exposing (Flags)
|
||||||
import Data.UiSettings exposing (UiSettings)
|
import Data.UiSettings exposing (UiSettings)
|
||||||
import Html exposing (..)
|
import Html exposing (..)
|
||||||
@ -305,6 +303,7 @@ viewList2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map ListMsg
|
, Html.map ListMsg
|
||||||
(Comp.PeriodicQueryTaskList.view2 texts.notificationTable
|
(Comp.PeriodicQueryTaskList.view2 texts.notificationTable
|
||||||
|
@ -305,6 +305,7 @@ viewTable2 texts model =
|
|||||||
, label = texts.newPerson
|
, label = texts.newPerson
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
, sticky = True
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
}
|
}
|
||||||
, Html.map TableMsg (Comp.PersonTable.view2 texts.personTable model.order model.tableModel)
|
, Html.map TableMsg (Comp.PersonTable.view2 texts.personTable model.order model.tableModel)
|
||||||
@ -377,6 +378,7 @@ viewForm2 texts settings model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -10,6 +10,7 @@ module Comp.PowerSearchInput exposing
|
|||||||
, Model
|
, Model
|
||||||
, Msg
|
, Msg
|
||||||
, ViewSettings
|
, ViewSettings
|
||||||
|
, getSearchString
|
||||||
, init
|
, init
|
||||||
, initWith
|
, initWith
|
||||||
, isValid
|
, isValid
|
||||||
@ -85,6 +86,11 @@ setSearchString q =
|
|||||||
SetSearch q
|
SetSearch q
|
||||||
|
|
||||||
|
|
||||||
|
getSearchString : Model -> Maybe String
|
||||||
|
getSearchString model =
|
||||||
|
model.input
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--- Update
|
--- Update
|
||||||
|
|
||||||
@ -165,24 +171,21 @@ throttleUpdate model =
|
|||||||
|
|
||||||
type alias ViewSettings =
|
type alias ViewSettings =
|
||||||
{ placeholder : String
|
{ placeholder : String
|
||||||
, extraAttrs : List (Attribute Msg)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
viewInput : ViewSettings -> Model -> Html Msg
|
viewInput : ViewSettings -> Model -> Html Msg
|
||||||
viewInput cfg model =
|
viewInput cfg model =
|
||||||
input
|
input
|
||||||
(cfg.extraAttrs
|
[ type_ "text"
|
||||||
++ [ type_ "text"
|
, placeholder cfg.placeholder
|
||||||
, placeholder cfg.placeholder
|
, onInput SetSearch
|
||||||
, onInput SetSearch
|
, Util.Html.onKeyUpCode KeyUpMsg
|
||||||
, Util.Html.onKeyUpCode KeyUpMsg
|
, Maybe.map value model.input
|
||||||
, Maybe.map value model.input
|
|> Maybe.withDefault (value "")
|
||||||
|> Maybe.withDefault (value "")
|
, class S.textInput
|
||||||
, class S.textInput
|
, class "text-sm "
|
||||||
, class "text-sm "
|
]
|
||||||
]
|
|
||||||
)
|
|
||||||
[]
|
[]
|
||||||
|
|
||||||
|
|
||||||
|
@ -290,6 +290,7 @@ viewInfo texts settings flags model share =
|
|||||||
]
|
]
|
||||||
, end = []
|
, end = []
|
||||||
, rootClasses = "my-4"
|
, rootClasses = "my-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div []
|
, div []
|
||||||
[ Comp.ShareView.view cfg texts.shareView flags share
|
[ Comp.ShareView.view cfg texts.shareView flags share
|
||||||
@ -346,6 +347,7 @@ viewForm texts model =
|
|||||||
]
|
]
|
||||||
, end = []
|
, end = []
|
||||||
, rootClasses = "my-4"
|
, rootClasses = "my-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div []
|
, div []
|
||||||
[ Html.map FormMsg (Comp.ShareForm.view texts.shareForm model.formModel)
|
[ Html.map FormMsg (Comp.ShareForm.view texts.shareForm model.formModel)
|
||||||
|
@ -22,7 +22,6 @@ import Api.Model.IdName exposing (IdName)
|
|||||||
import Api.Model.ImapSettingsList exposing (ImapSettingsList)
|
import Api.Model.ImapSettingsList exposing (ImapSettingsList)
|
||||||
import Api.Model.ScanMailboxSettings exposing (ScanMailboxSettings)
|
import Api.Model.ScanMailboxSettings exposing (ScanMailboxSettings)
|
||||||
import Api.Model.StringList exposing (StringList)
|
import Api.Model.StringList exposing (StringList)
|
||||||
import Api.Model.Tag
|
|
||||||
import Api.Model.TagList exposing (TagList)
|
import Api.Model.TagList exposing (TagList)
|
||||||
import Comp.Basic as B
|
import Comp.Basic as B
|
||||||
import Comp.CalEventInput
|
import Comp.CalEventInput
|
||||||
@ -823,6 +822,7 @@ view2 texts flags extraClasses settings model =
|
|||||||
[ startOnceBtn
|
[ startOnceBtn
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -297,6 +297,7 @@ viewList2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map ListMsg
|
, Html.map ListMsg
|
||||||
(Comp.ScanMailboxList.view2 texts.table
|
(Comp.ScanMailboxList.view2 texts.table
|
||||||
|
@ -446,6 +446,7 @@ linkTargetMsg linkTarget =
|
|||||||
type alias NextState =
|
type alias NextState =
|
||||||
{ model : Model
|
{ model : Model
|
||||||
, cmd : Cmd Msg
|
, cmd : Cmd Msg
|
||||||
|
, sub : Sub Msg
|
||||||
, stateChange : Bool
|
, stateChange : Bool
|
||||||
, dragDrop : DD.DragDropData
|
, dragDrop : DD.DragDropData
|
||||||
}
|
}
|
||||||
@ -479,6 +480,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = set.model
|
{ model = set.model
|
||||||
, cmd = set.cmd
|
, cmd = set.cmd
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = True
|
, stateChange = True
|
||||||
, dragDrop = set.dragDrop
|
, dragDrop = set.dragDrop
|
||||||
}
|
}
|
||||||
@ -520,6 +522,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
, cdp
|
, cdp
|
||||||
, Api.getBookmarks flags AllBookmarksResp
|
, Api.getBookmarks flags AllBookmarksResp
|
||||||
]
|
]
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -527,6 +530,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
ResetForm ->
|
ResetForm ->
|
||||||
{ model = resetModel model
|
{ model = resetModel model
|
||||||
, cmd = Api.itemSearchStats flags Api.Model.ItemQuery.empty GetAllTagsResp
|
, cmd = Api.itemSearchStats flags Api.Model.ItemQuery.empty GetAllTagsResp
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = True
|
, stateChange = True
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -548,6 +552,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
Nothing ->
|
Nothing ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -578,6 +583,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { nextModel | selectedBookmarks = sel }
|
{ model = { nextModel | selectedBookmarks = sel }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = sel /= model.selectedBookmarks
|
, stateChange = sel /= model.selectedBookmarks
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -591,6 +597,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | tagSelectModel = tagSel }
|
{ model = { model | tagSelectModel = tagSel }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -598,6 +605,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
GetAllTagsResp (Err _) ->
|
GetAllTagsResp (Err _) ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -644,7 +652,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
Util.CustomField.statsToFields stats
|
Util.CustomField.statsToFields stats
|
||||||
|
|
||||||
fieldOpts =
|
fieldOpts =
|
||||||
Comp.CustomFieldMultiInput.update flags
|
Comp.CustomFieldMultiInput.updateSearch flags
|
||||||
(Comp.CustomFieldMultiInput.setOptions fields)
|
(Comp.CustomFieldMultiInput.setOptions fields)
|
||||||
model.customFieldModel
|
model.customFieldModel
|
||||||
|> .model
|
|> .model
|
||||||
@ -665,6 +673,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = model_
|
{ model = model_
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -672,6 +681,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
GetStatsResp (Err _) ->
|
GetStatsResp (Err _) ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -686,6 +696,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
GetEquipResp (Err _) ->
|
GetEquipResp (Err _) ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -700,6 +711,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
GetOrgResp (Err _) ->
|
GetOrgResp (Err _) ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -734,6 +746,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
GetPersonResp (Err _) ->
|
GetPersonResp (Err _) ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -749,6 +762,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
, tagSelection = sel
|
, tagSelection = sel
|
||||||
}
|
}
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = sel /= model.tagSelection
|
, stateChange = sel /= model.tagSelection
|
||||||
, dragDrop = ddd
|
, dragDrop = ddd
|
||||||
}
|
}
|
||||||
@ -760,6 +774,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | directionModel = m2 }
|
{ model = { model | directionModel = m2 }
|
||||||
, cmd = Cmd.map DirectionMsg c2
|
, cmd = Cmd.map DirectionMsg c2
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = isDropdownChangeMsg m
|
, stateChange = isDropdownChangeMsg m
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -771,6 +786,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | orgModel = m2 }
|
{ model = { model | orgModel = m2 }
|
||||||
, cmd = Cmd.map OrgMsg c2
|
, cmd = Cmd.map OrgMsg c2
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = isDropdownChangeMsg m
|
, stateChange = isDropdownChangeMsg m
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -782,6 +798,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | corrPersonModel = m2 }
|
{ model = { model | corrPersonModel = m2 }
|
||||||
, cmd = Cmd.map CorrPersonMsg c2
|
, cmd = Cmd.map CorrPersonMsg c2
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = isDropdownChangeMsg m
|
, stateChange = isDropdownChangeMsg m
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -793,6 +810,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | concPersonModel = m2 }
|
{ model = { model | concPersonModel = m2 }
|
||||||
, cmd = Cmd.map ConcPersonMsg c2
|
, cmd = Cmd.map ConcPersonMsg c2
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = isDropdownChangeMsg m
|
, stateChange = isDropdownChangeMsg m
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -804,6 +822,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | concEquipmentModel = m2 }
|
{ model = { model | concEquipmentModel = m2 }
|
||||||
, cmd = Cmd.map ConcEquipmentMsg c2
|
, cmd = Cmd.map ConcEquipmentMsg c2
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = isDropdownChangeMsg m
|
, stateChange = isDropdownChangeMsg m
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -815,6 +834,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | inboxCheckbox = not current }
|
{ model = { model | inboxCheckbox = not current }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = True
|
, stateChange = True
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -833,6 +853,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | searchMode = next }
|
{ model = { model | searchMode = next }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = True
|
, stateChange = True
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -852,6 +873,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | fromDateModel = dp, fromDate = nextDate }
|
{ model = { model | fromDateModel = dp, fromDate = nextDate }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = model.fromDate /= nextDate
|
, stateChange = model.fromDate /= nextDate
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -871,6 +893,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | untilDateModel = dp, untilDate = nextDate }
|
{ model = { model | untilDateModel = dp, untilDate = nextDate }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = model.untilDate /= nextDate
|
, stateChange = model.untilDate /= nextDate
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -890,6 +913,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | fromDueDateModel = dp, fromDueDate = nextDate }
|
{ model = { model | fromDueDateModel = dp, fromDueDate = nextDate }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = model.fromDueDate /= nextDate
|
, stateChange = model.fromDueDate /= nextDate
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -909,6 +933,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | untilDueDateModel = dp, untilDueDate = nextDate }
|
{ model = { model | untilDueDateModel = dp, untilDueDate = nextDate }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = model.untilDueDate /= nextDate
|
, stateChange = model.untilDueDate /= nextDate
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -920,6 +945,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | nameModel = next }
|
{ model = { model | nameModel = next }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -927,6 +953,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
SetTextSearch str ->
|
SetTextSearch str ->
|
||||||
{ model = { model | textSearchModel = updateTextSearch str model.textSearchModel }
|
{ model = { model | textSearchModel = updateTextSearch str model.textSearchModel }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -935,6 +962,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
if flags.config.fullTextSearchEnabled then
|
if flags.config.fullTextSearchEnabled then
|
||||||
{ model = { model | textSearchModel = swapTextSearch model.textSearchModel }
|
{ model = { model | textSearchModel = swapTextSearch model.textSearchModel }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -942,6 +970,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
else
|
else
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -951,6 +980,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
Fulltext _ ->
|
Fulltext _ ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -958,6 +988,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
Names s ->
|
Names s ->
|
||||||
{ model = { model | textSearchModel = Fulltext s }
|
{ model = { model | textSearchModel = Fulltext s }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -967,6 +998,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
Fulltext s ->
|
Fulltext s ->
|
||||||
{ model = { model | textSearchModel = Names s }
|
{ model = { model | textSearchModel = Names s }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -974,6 +1006,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
Names _ ->
|
Names _ ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -981,6 +1014,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
KeyUpMsg (Just Enter) ->
|
KeyUpMsg (Just Enter) ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = True
|
, stateChange = True
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -988,6 +1022,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
KeyUpMsg _ ->
|
KeyUpMsg _ ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -1003,6 +1038,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
, selectedFolder = sel
|
, selectedFolder = sel
|
||||||
}
|
}
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = model.selectedFolder /= sel
|
, stateChange = model.selectedFolder /= sel
|
||||||
, dragDrop = ddd
|
, dragDrop = ddd
|
||||||
}
|
}
|
||||||
@ -1018,6 +1054,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
, customValues = Data.CustomFieldChange.collectValues res.result model.customValues
|
, customValues = Data.CustomFieldChange.collectValues res.result model.customValues
|
||||||
}
|
}
|
||||||
, cmd = Cmd.map CustomFieldMsg res.cmd
|
, cmd = Cmd.map CustomFieldMsg res.cmd
|
||||||
|
, sub = Sub.map CustomFieldMsg res.sub
|
||||||
, stateChange =
|
, stateChange =
|
||||||
Data.CustomFieldChange.isValueChange res.result
|
Data.CustomFieldChange.isValueChange res.result
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
@ -1046,6 +1083,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | sourceModel = next }
|
{ model = { model | sourceModel = next }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -1064,6 +1102,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | openTabs = tabs }
|
{ model = { model | openTabs = tabs }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -1083,6 +1122,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | openTabs = next }
|
{ model = { model | openTabs = next }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -1090,13 +1130,15 @@ updateDrop ddm flags settings msg model =
|
|||||||
AllBookmarksResp (Ok bm) ->
|
AllBookmarksResp (Ok bm) ->
|
||||||
{ model = { model | allBookmarks = Comp.BookmarkChooser.init bm }
|
{ model = { model | allBookmarks = Comp.BookmarkChooser.init bm }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = model.allBookmarks /= Comp.BookmarkChooser.init bm
|
, stateChange = model.allBookmarks /= Comp.BookmarkChooser.init bm
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
AllBookmarksResp (Err err) ->
|
AllBookmarksResp (Err _) ->
|
||||||
{ model = model
|
{ model = model
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = False
|
, stateChange = False
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
@ -1108,6 +1150,7 @@ updateDrop ddm flags settings msg model =
|
|||||||
in
|
in
|
||||||
{ model = { model | allBookmarks = next, selectedBookmarks = sel }
|
{ model = { model | allBookmarks = next, selectedBookmarks = sel }
|
||||||
, cmd = Cmd.none
|
, cmd = Cmd.none
|
||||||
|
, sub = Sub.none
|
||||||
, stateChange = sel /= model.selectedBookmarks || model.allBookmarks /= next
|
, stateChange = sel /= model.selectedBookmarks || model.allBookmarks /= next
|
||||||
, dragDrop = DD.DragDropData ddm Nothing
|
, dragDrop = DD.DragDropData ddm Nothing
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ getShare model =
|
|||||||
( model.share.id
|
( model.share.id
|
||||||
, { name = model.name
|
, { name = model.name
|
||||||
, query =
|
, query =
|
||||||
model.queryModel.input
|
Comp.PowerSearchInput.getSearchString model.queryModel
|
||||||
|> Maybe.withDefault ""
|
|> Maybe.withDefault ""
|
||||||
, enabled = model.enabled
|
, enabled = model.enabled
|
||||||
, password = model.password
|
, password = model.password
|
||||||
@ -211,7 +211,6 @@ view texts model =
|
|||||||
[ Html.map QueryMsg
|
[ Html.map QueryMsg
|
||||||
(Comp.PowerSearchInput.viewInput
|
(Comp.PowerSearchInput.viewInput
|
||||||
{ placeholder = texts.queryLabel
|
{ placeholder = texts.queryLabel
|
||||||
, extraAttrs = []
|
|
||||||
}
|
}
|
||||||
model.queryModel
|
model.queryModel
|
||||||
)
|
)
|
||||||
|
@ -329,6 +329,7 @@ viewTable texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg (Comp.ShareTable.view texts.shareTable model.shares)
|
, Html.map TableMsg (Comp.ShareTable.view texts.shareTable model.shares)
|
||||||
, B.loadingDimmer
|
, B.loadingDimmer
|
||||||
@ -406,6 +407,7 @@ viewForm texts settings flags model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
254
modules/webapp/src/main/elm/Comp/SimpleTextInput.elm
Normal file
254
modules/webapp/src/main/elm/Comp/SimpleTextInput.elm
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
{-
|
||||||
|
Copyright 2020 Eike K. & Contributors
|
||||||
|
|
||||||
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
-}
|
||||||
|
|
||||||
|
|
||||||
|
module Comp.SimpleTextInput exposing
|
||||||
|
( Config
|
||||||
|
, Model
|
||||||
|
, Msg
|
||||||
|
, ValueChange(..)
|
||||||
|
, defaultConfig
|
||||||
|
, getValue
|
||||||
|
, init
|
||||||
|
, initDefault
|
||||||
|
, onEnterOnly
|
||||||
|
, setValue
|
||||||
|
, update
|
||||||
|
, view
|
||||||
|
, viewMap
|
||||||
|
)
|
||||||
|
|
||||||
|
import Html exposing (Attribute, Html, input)
|
||||||
|
import Html.Attributes exposing (type_, value)
|
||||||
|
import Html.Events exposing (onBlur, onInput)
|
||||||
|
import Task
|
||||||
|
import Throttle exposing (Throttle)
|
||||||
|
import Time
|
||||||
|
import Util.Html exposing (KeyCode, onKeyUpCode)
|
||||||
|
import Util.Maybe
|
||||||
|
|
||||||
|
|
||||||
|
type Model
|
||||||
|
= Model InnerModel
|
||||||
|
|
||||||
|
|
||||||
|
type alias Config =
|
||||||
|
{ delay : Float
|
||||||
|
, setOnTyping : Bool
|
||||||
|
, setOnEnter : Bool
|
||||||
|
, setOnBlur : Bool
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
defaultConfig : Config
|
||||||
|
defaultConfig =
|
||||||
|
{ delay = 1500
|
||||||
|
, setOnTyping = True
|
||||||
|
, setOnEnter = True
|
||||||
|
, setOnBlur = True
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
onEnterOnly : Config
|
||||||
|
onEnterOnly =
|
||||||
|
{ defaultConfig | setOnTyping = False, setOnBlur = False }
|
||||||
|
|
||||||
|
|
||||||
|
type alias InnerModel =
|
||||||
|
{ cfg : Config
|
||||||
|
, throttle : Throttle Msg
|
||||||
|
, value : Maybe String
|
||||||
|
, lastPublished : Maybe String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
init : Config -> Maybe String -> Model
|
||||||
|
init cfg str =
|
||||||
|
Model
|
||||||
|
{ cfg = cfg
|
||||||
|
, throttle = Throttle.create 1
|
||||||
|
, value = str
|
||||||
|
, lastPublished = str
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
initDefault : Maybe String -> Model
|
||||||
|
initDefault str =
|
||||||
|
init defaultConfig str
|
||||||
|
|
||||||
|
|
||||||
|
getValue : Model -> Maybe String
|
||||||
|
getValue (Model model) =
|
||||||
|
model.lastPublished
|
||||||
|
|
||||||
|
|
||||||
|
setValue : Model -> String -> ( Model, Sub Msg )
|
||||||
|
setValue (Model model) str =
|
||||||
|
let
|
||||||
|
v =
|
||||||
|
Util.Maybe.fromString str
|
||||||
|
|
||||||
|
inner =
|
||||||
|
{ model | value = v, lastPublished = v }
|
||||||
|
in
|
||||||
|
( Model inner, makeSub inner inner.throttle )
|
||||||
|
|
||||||
|
|
||||||
|
type Msg
|
||||||
|
= SetText String
|
||||||
|
| DelayedSet
|
||||||
|
| UpdateThrottle
|
||||||
|
| KeyPressed (Maybe KeyCode)
|
||||||
|
| FocusRemoved
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--- Update
|
||||||
|
|
||||||
|
|
||||||
|
type ValueChange
|
||||||
|
= ValueUpdated (Maybe String)
|
||||||
|
| ValueUnchanged
|
||||||
|
|
||||||
|
|
||||||
|
type alias Result =
|
||||||
|
{ model : Model
|
||||||
|
, change : ValueChange
|
||||||
|
, cmd : Cmd Msg
|
||||||
|
, sub : Sub Msg
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
update : Msg -> Model -> Result
|
||||||
|
update msg (Model model) =
|
||||||
|
case msg of
|
||||||
|
SetText str ->
|
||||||
|
let
|
||||||
|
maybeStr =
|
||||||
|
Util.Maybe.fromString str
|
||||||
|
|
||||||
|
cmd_ =
|
||||||
|
Task.succeed () |> Task.perform (\_ -> DelayedSet)
|
||||||
|
|
||||||
|
( newThrottle, cmd ) =
|
||||||
|
if model.cfg.setOnTyping then
|
||||||
|
Throttle.try cmd_ model.throttle
|
||||||
|
|
||||||
|
else
|
||||||
|
( model.throttle, Cmd.none )
|
||||||
|
in
|
||||||
|
{ model = Model { model | value = maybeStr, throttle = newThrottle }
|
||||||
|
, change = ValueUnchanged
|
||||||
|
, cmd = cmd
|
||||||
|
, sub = makeSub model newThrottle
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateThrottle ->
|
||||||
|
let
|
||||||
|
( newThrottle, cmd ) =
|
||||||
|
Throttle.update model.throttle
|
||||||
|
in
|
||||||
|
{ model = Model { model | throttle = newThrottle }
|
||||||
|
, change = ValueUnchanged
|
||||||
|
, cmd = cmd
|
||||||
|
, sub = makeSub model newThrottle
|
||||||
|
}
|
||||||
|
|
||||||
|
DelayedSet ->
|
||||||
|
if model.lastPublished == model.value then
|
||||||
|
unit model
|
||||||
|
|
||||||
|
else
|
||||||
|
publishChange model
|
||||||
|
|
||||||
|
FocusRemoved ->
|
||||||
|
if model.cfg.setOnBlur then
|
||||||
|
publishChange model
|
||||||
|
|
||||||
|
else
|
||||||
|
unit model
|
||||||
|
|
||||||
|
KeyPressed (Just Util.Html.Enter) ->
|
||||||
|
if model.cfg.setOnEnter then
|
||||||
|
publishChange model
|
||||||
|
|
||||||
|
else
|
||||||
|
unit model
|
||||||
|
|
||||||
|
KeyPressed _ ->
|
||||||
|
unit model
|
||||||
|
|
||||||
|
|
||||||
|
publishChange : InnerModel -> Result
|
||||||
|
publishChange model =
|
||||||
|
if model.lastPublished == model.value then
|
||||||
|
unit model
|
||||||
|
|
||||||
|
else
|
||||||
|
Result (Model { model | lastPublished = model.value })
|
||||||
|
(ValueUpdated model.value)
|
||||||
|
Cmd.none
|
||||||
|
(makeSub model model.throttle)
|
||||||
|
|
||||||
|
|
||||||
|
unit : InnerModel -> Result
|
||||||
|
unit model =
|
||||||
|
{ model = Model model
|
||||||
|
, change = ValueUnchanged
|
||||||
|
, cmd = Cmd.none
|
||||||
|
, sub = makeSub model model.throttle
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
makeSub : InnerModel -> Throttle Msg -> Sub Msg
|
||||||
|
makeSub model newThrottle =
|
||||||
|
if model.cfg.setOnTyping then
|
||||||
|
Throttle.ifNeeded
|
||||||
|
(Time.every model.cfg.delay (\_ -> UpdateThrottle))
|
||||||
|
newThrottle
|
||||||
|
|
||||||
|
else
|
||||||
|
Sub.none
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--- View
|
||||||
|
|
||||||
|
|
||||||
|
inputAttrs : InnerModel -> List (Attribute Msg)
|
||||||
|
inputAttrs model =
|
||||||
|
List.filterMap identity
|
||||||
|
[ type_ "text" |> Just
|
||||||
|
, onInput SetText |> Just
|
||||||
|
, if model.cfg.setOnEnter then
|
||||||
|
Just (onKeyUpCode KeyPressed)
|
||||||
|
|
||||||
|
else
|
||||||
|
Nothing
|
||||||
|
, onBlur FocusRemoved |> Just
|
||||||
|
, value (Maybe.withDefault "" model.value) |> Just
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
view : List (Attribute Msg) -> Model -> Html Msg
|
||||||
|
view extra (Model model) =
|
||||||
|
let
|
||||||
|
attrs =
|
||||||
|
inputAttrs model
|
||||||
|
in
|
||||||
|
input
|
||||||
|
(attrs ++ extra)
|
||||||
|
[]
|
||||||
|
|
||||||
|
|
||||||
|
viewMap : (Msg -> msg) -> List (Attribute msg) -> Model -> Html msg
|
||||||
|
viewMap f extra (Model model) =
|
||||||
|
let
|
||||||
|
attrs =
|
||||||
|
inputAttrs model
|
||||||
|
|> List.map (Html.Attributes.map f)
|
||||||
|
in
|
||||||
|
input (attrs ++ extra) []
|
@ -261,6 +261,7 @@ viewTable2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg (Comp.SourceTable.view2 texts.sourceTable model.sources)
|
, Html.map TableMsg (Comp.SourceTable.view2 texts.sourceTable model.sources)
|
||||||
, B.loadingDimmer
|
, B.loadingDimmer
|
||||||
@ -302,6 +303,7 @@ viewLinks2 texts flags _ source =
|
|||||||
]
|
]
|
||||||
, end = []
|
, end = []
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, p [ class "text-lg pt-2 opacity-75" ]
|
, p [ class "text-lg pt-2 opacity-75" ]
|
||||||
[ text texts.sourceInfoText
|
[ text texts.sourceInfoText
|
||||||
@ -449,6 +451,7 @@ viewForm2 texts flags settings model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map FormMsg
|
, Html.map FormMsg
|
||||||
(Comp.SourceForm.view2 flags texts.sourceForm settings model.formModel)
|
(Comp.SourceForm.view2 flags texts.sourceForm settings model.formModel)
|
||||||
|
@ -284,6 +284,7 @@ viewTable2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg (Comp.TagTable.view2 texts.tagTable model.order model.tagTableModel)
|
, Html.map TableMsg (Comp.TagTable.view2 texts.tagTable model.order model.tagTableModel)
|
||||||
, div
|
, div
|
||||||
@ -359,6 +360,7 @@ viewForm2 texts settings model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -339,6 +339,7 @@ view2 texts flags _ classes model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div
|
, div
|
||||||
[ classList
|
[ classList
|
||||||
|
@ -271,6 +271,7 @@ viewTable2 texts model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map TableMsg (Comp.UserTable.view2 texts.userTable model.tableModel)
|
, Html.map TableMsg (Comp.UserTable.view2 texts.userTable model.tableModel)
|
||||||
, B.loadingDimmer
|
, B.loadingDimmer
|
||||||
@ -281,7 +282,7 @@ viewTable2 texts model =
|
|||||||
|
|
||||||
|
|
||||||
renderDeleteConfirm : Texts -> UiSettings -> Model -> Html Msg
|
renderDeleteConfirm : Texts -> UiSettings -> Model -> Html Msg
|
||||||
renderDeleteConfirm texts settings model =
|
renderDeleteConfirm texts _ model =
|
||||||
case model.deleteConfirm of
|
case model.deleteConfirm of
|
||||||
DimmerOff ->
|
DimmerOff ->
|
||||||
span [ class "hidden" ] []
|
span [ class "hidden" ] []
|
||||||
@ -397,6 +398,7 @@ viewForm2 texts settings model =
|
|||||||
else
|
else
|
||||||
[]
|
[]
|
||||||
, rootClasses = "mb-4"
|
, rootClasses = "mb-4"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map FormMsg (Comp.UserForm.view2 texts.userForm settings model.formModel)
|
, Html.map FormMsg (Comp.UserForm.view2 texts.userForm settings model.formModel)
|
||||||
, div
|
, div
|
||||||
|
@ -77,7 +77,7 @@ gb =
|
|||||||
, nextItem = "Next item"
|
, nextItem = "Next item"
|
||||||
, sendMail = "Send Mail"
|
, sendMail = "Send Mail"
|
||||||
, addMoreFiles = "Add more files to this item"
|
, addMoreFiles = "Add more files to this item"
|
||||||
, confirmItemMetadata = "Confirm item metadata"
|
, confirmItemMetadata = "Confirm metadata"
|
||||||
, confirm = "Confirm"
|
, confirm = "Confirm"
|
||||||
, unconfirmItemMetadata = "Un-confirm item metadata"
|
, unconfirmItemMetadata = "Un-confirm item metadata"
|
||||||
, reprocessItem = "Reprocess this item"
|
, reprocessItem = "Reprocess this item"
|
||||||
@ -91,7 +91,7 @@ gb =
|
|||||||
, sendingMailNow = "Sending e-mail…"
|
, sendingMailNow = "Sending e-mail…"
|
||||||
, formatDateTime = DF.formatDateTimeLong Messages.UiLanguage.English
|
, formatDateTime = DF.formatDateTimeLong Messages.UiLanguage.English
|
||||||
, mailSendSuccessful = "Mail sent."
|
, mailSendSuccessful = "Mail sent."
|
||||||
, showQrCode = "Show the URL to this page as QR code"
|
, showQrCode = "Show URL as QR code"
|
||||||
, close = "Close"
|
, close = "Close"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,6 +127,6 @@ de =
|
|||||||
, sendingMailNow = "E-Mail wird gesendet…"
|
, sendingMailNow = "E-Mail wird gesendet…"
|
||||||
, formatDateTime = DF.formatDateTimeLong Messages.UiLanguage.German
|
, formatDateTime = DF.formatDateTimeLong Messages.UiLanguage.German
|
||||||
, mailSendSuccessful = "E-Mail wurde versendet."
|
, mailSendSuccessful = "E-Mail wurde versendet."
|
||||||
, showQrCode = "Den Link zu dieser Seite als QR code anzeigen"
|
, showQrCode = "Link als QR code anzeigen"
|
||||||
, close = "Schließen"
|
, close = "Schließen"
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ gb =
|
|||||||
, tagModeRemoveInfo = "Tags chosen here are *removed* from all selected items."
|
, tagModeRemoveInfo = "Tags chosen here are *removed* from all selected items."
|
||||||
, tagModeReplaceInfo = "Tags chosen here *replace* those on selected items."
|
, tagModeReplaceInfo = "Tags chosen here *replace* those on selected items."
|
||||||
, chooseDirection = "Choose a direction…"
|
, chooseDirection = "Choose a direction…"
|
||||||
, confirmUnconfirm = "Confirm/Unconfirm item metadata"
|
, confirmUnconfirm = "Confirm/Unconfirm metadata"
|
||||||
, confirm = "Confirm"
|
, confirm = "Confirm"
|
||||||
, unconfirm = "Unconfirm"
|
, unconfirm = "Unconfirm"
|
||||||
, changeTagMode = "Change tag edit mode"
|
, changeTagMode = "Change tag edit mode"
|
||||||
|
@ -54,6 +54,7 @@ viewSidebar texts visible flags settings model =
|
|||||||
]
|
]
|
||||||
, end = []
|
, end = []
|
||||||
, rootClasses = "text-sm mb-3 "
|
, rootClasses = "text-sm mb-3 "
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map ItemDetailMsg
|
, Html.map ItemDetailMsg
|
||||||
(Comp.ItemDetail.EditForm.view2 texts.editForm flags settings model.detail)
|
(Comp.ItemDetail.EditForm.view2 texts.editForm flags settings model.detail)
|
||||||
|
@ -298,7 +298,7 @@ createQuery : Model -> Maybe Q.ItemQuery
|
|||||||
createQuery model =
|
createQuery model =
|
||||||
Q.and
|
Q.and
|
||||||
[ Comp.SearchMenu.getItemQuery model.searchMenuModel
|
[ Comp.SearchMenu.getItemQuery model.searchMenuModel
|
||||||
, Maybe.map Q.Fragment model.powerSearchInput.input
|
, Maybe.map Q.Fragment (Comp.PowerSearchInput.getSearchString model.powerSearchInput)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ view texts flags settings model =
|
|||||||
]
|
]
|
||||||
, start = []
|
, start = []
|
||||||
, rootClasses = "text-sm w-full bg-blue-50 pt-2 hidden"
|
, rootClasses = "text-sm w-full bg-blue-50 pt-2 hidden"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, div [ class "flex flex-col" ]
|
, div [ class "flex flex-col" ]
|
||||||
(case model.viewMode of
|
(case model.viewMode of
|
||||||
@ -81,6 +82,7 @@ viewSearch texts flags settings model =
|
|||||||
]
|
]
|
||||||
, end = []
|
, end = []
|
||||||
, rootClasses = "my-1 text-xs hidden sm:flex"
|
, rootClasses = "my-1 text-xs hidden sm:flex"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, let
|
, let
|
||||||
searchMenuCfg =
|
searchMenuCfg =
|
||||||
@ -140,6 +142,7 @@ viewEditMenu texts flags svm settings =
|
|||||||
]
|
]
|
||||||
, end = []
|
, end = []
|
||||||
, rootClasses = "mt-2 text-sm"
|
, rootClasses = "mt-2 text-sm"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
, Html.map EditMenuMsg
|
, Html.map EditMenuMsg
|
||||||
(Comp.ItemDetail.MultiEditMenu.view2
|
(Comp.ItemDetail.MultiEditMenu.view2
|
||||||
|
@ -115,7 +115,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
doSearch (SearchParam flags BasicSearch settings.itemSearchPageSize 0 False) newModel
|
doSearch (SearchParam flags BasicSearch settings.itemSearchPageSize 0 False) newModel
|
||||||
|
|
||||||
else
|
else
|
||||||
withSub ( newModel, Cmd.none )
|
resultModelCmd ( newModel, Cmd.none )
|
||||||
in
|
in
|
||||||
{ result
|
{ result
|
||||||
| cmd =
|
| cmd =
|
||||||
@ -124,6 +124,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
, Cmd.map SearchMenuMsg nextState.cmd
|
, Cmd.map SearchMenuMsg nextState.cmd
|
||||||
, dropCmd
|
, dropCmd
|
||||||
]
|
]
|
||||||
|
, sub = Sub.map SearchMenuMsg nextState.sub
|
||||||
}
|
}
|
||||||
|
|
||||||
SetLinkTarget lt ->
|
SetLinkTarget lt ->
|
||||||
@ -166,7 +167,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
Nothing ->
|
Nothing ->
|
||||||
model.itemRowsOpen
|
model.itemRowsOpen
|
||||||
in
|
in
|
||||||
withSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| itemListModel = result.model
|
| itemListModel = result.model
|
||||||
, viewMode = nextView
|
, viewMode = nextView
|
||||||
@ -185,7 +186,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
else
|
else
|
||||||
Set.empty
|
Set.empty
|
||||||
in
|
in
|
||||||
noSub ( { model | itemRowsOpen = itemRows, viewMenuOpen = False }, Cmd.none )
|
resultModelCmd ( { model | itemRowsOpen = itemRows, viewMenuOpen = False }, Cmd.none )
|
||||||
|
|
||||||
ItemSearchResp scroll (Ok list) ->
|
ItemSearchResp scroll (Ok list) ->
|
||||||
let
|
let
|
||||||
@ -226,7 +227,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
update bookmarkId mId key flags texts settings (ItemCardListMsg (Comp.ItemCardList.AddResults list)) m
|
update bookmarkId mId key flags texts settings (ItemCardListMsg (Comp.ItemCardList.AddResults list)) m
|
||||||
|
|
||||||
ItemSearchAddResp (Err _) ->
|
ItemSearchAddResp (Err _) ->
|
||||||
withSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| moreInProgress = False
|
| moreInProgress = False
|
||||||
}
|
}
|
||||||
@ -234,7 +235,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
ItemSearchResp _ (Err _) ->
|
ItemSearchResp _ (Err _) ->
|
||||||
withSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| searchInProgress = False
|
| searchInProgress = False
|
||||||
}
|
}
|
||||||
@ -255,7 +256,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
}
|
}
|
||||||
in
|
in
|
||||||
if model.searchInProgress then
|
if model.searchInProgress then
|
||||||
withSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
else
|
else
|
||||||
doSearch param nm
|
doSearch param nm
|
||||||
@ -271,7 +272,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
}
|
}
|
||||||
in
|
in
|
||||||
if model.searchInProgress then
|
if model.searchInProgress then
|
||||||
withSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
else
|
else
|
||||||
doSearch param model
|
doSearch param model
|
||||||
@ -289,7 +290,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
PublishView q ->
|
PublishView q ->
|
||||||
( PublishView q, Cmd.none )
|
( PublishView q, Cmd.none )
|
||||||
in
|
in
|
||||||
withSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| viewMode = nextView
|
| viewMode = nextView
|
||||||
}
|
}
|
||||||
@ -298,10 +299,10 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
|
|
||||||
LoadMore ->
|
LoadMore ->
|
||||||
if model.moreAvailable then
|
if model.moreAvailable then
|
||||||
doSearchMore flags settings model |> withSub
|
doSearchMore flags settings model |> resultModelCmd
|
||||||
|
|
||||||
else
|
else
|
||||||
withSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
SetBasicSearch str ->
|
SetBasicSearch str ->
|
||||||
let
|
let
|
||||||
@ -322,17 +323,17 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
update bookmarkId mId key flags texts settings (DoSearch model.searchTypeDropdownValue) model
|
update bookmarkId mId key flags texts settings (DoSearch model.searchTypeDropdownValue) model
|
||||||
|
|
||||||
KeyUpSearchbarMsg _ ->
|
KeyUpSearchbarMsg _ ->
|
||||||
withSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
ScrollResult _ ->
|
ScrollResult _ ->
|
||||||
let
|
let
|
||||||
cmd =
|
cmd =
|
||||||
Process.sleep 800 |> Task.perform (always ClearItemDetailId)
|
Process.sleep 800 |> Task.perform (always ClearItemDetailId)
|
||||||
in
|
in
|
||||||
withSub ( model, cmd )
|
resultModelCmd ( model, cmd )
|
||||||
|
|
||||||
ClearItemDetailId ->
|
ClearItemDetailId ->
|
||||||
noSub ( { model | scrollToCard = Nothing }, Cmd.none )
|
resultModelCmd ( { model | scrollToCard = Nothing }, Cmd.none )
|
||||||
|
|
||||||
SelectAllItems ->
|
SelectAllItems ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
@ -344,13 +345,13 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
svm_ =
|
svm_ =
|
||||||
{ svm | ids = Set.union svm.ids visible }
|
{ svm | ids = Set.union svm.ids visible }
|
||||||
in
|
in
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model | viewMode = SelectView svm_ }
|
( { model | viewMode = SelectView svm_ }
|
||||||
, Cmd.none
|
, Cmd.none
|
||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
SelectNoItems ->
|
SelectNoItems ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
@ -359,13 +360,13 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
svm_ =
|
svm_ =
|
||||||
{ svm | ids = Set.empty }
|
{ svm | ids = Set.empty }
|
||||||
in
|
in
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model | viewMode = SelectView svm_ }
|
( { model | viewMode = SelectView svm_ }
|
||||||
, Cmd.none
|
, Cmd.none
|
||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
DeleteSelectedConfirmed ->
|
DeleteSelectedConfirmed ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
@ -374,7 +375,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
cmd =
|
cmd =
|
||||||
Api.deleteAllItems flags svm.ids DeleteAllResp
|
Api.deleteAllItems flags svm.ids DeleteAllResp
|
||||||
in
|
in
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| viewMode =
|
| viewMode =
|
||||||
SelectView
|
SelectView
|
||||||
@ -387,7 +388,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
RestoreSelectedConfirmed ->
|
RestoreSelectedConfirmed ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
@ -396,7 +397,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
cmd =
|
cmd =
|
||||||
Api.restoreAllItems flags svm.ids DeleteAllResp
|
Api.restoreAllItems flags svm.ids DeleteAllResp
|
||||||
in
|
in
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| viewMode =
|
| viewMode =
|
||||||
SelectView
|
SelectView
|
||||||
@ -409,7 +410,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
DeleteAllResp (Ok res) ->
|
DeleteAllResp (Ok res) ->
|
||||||
if res.success then
|
if res.success then
|
||||||
@ -428,16 +429,16 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
doSearch param nm
|
doSearch param nm
|
||||||
|
|
||||||
else
|
else
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
DeleteAllResp (Err _) ->
|
DeleteAllResp (Err _) ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
RequestReprocessSelected ->
|
RequestReprocessSelected ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
SelectView svm ->
|
SelectView svm ->
|
||||||
if svm.ids == Set.empty then
|
if svm.ids == Set.empty then
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
else
|
else
|
||||||
let
|
let
|
||||||
@ -451,15 +452,15 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
in
|
in
|
||||||
noSub ( model_, Cmd.none )
|
resultModelCmd ( model_, Cmd.none )
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
CloseConfirmModal ->
|
CloseConfirmModal ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
SelectView svm ->
|
SelectView svm ->
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| viewMode = SelectView { svm | confirmModal = Nothing, action = NoneAction }
|
| viewMode = SelectView { svm | confirmModal = Nothing, action = NoneAction }
|
||||||
}
|
}
|
||||||
@ -467,20 +468,20 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
ReprocessSelectedConfirmed ->
|
ReprocessSelectedConfirmed ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
SelectView svm ->
|
SelectView svm ->
|
||||||
if svm.ids == Set.empty then
|
if svm.ids == Set.empty then
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
else
|
else
|
||||||
let
|
let
|
||||||
cmd =
|
cmd =
|
||||||
Api.reprocessMultiple flags svm.ids DeleteAllResp
|
Api.reprocessMultiple flags svm.ids DeleteAllResp
|
||||||
in
|
in
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| viewMode =
|
| viewMode =
|
||||||
SelectView
|
SelectView
|
||||||
@ -493,13 +494,13 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
RequestDeleteSelected ->
|
RequestDeleteSelected ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
SelectView svm ->
|
SelectView svm ->
|
||||||
if svm.ids == Set.empty then
|
if svm.ids == Set.empty then
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
else
|
else
|
||||||
let
|
let
|
||||||
@ -513,16 +514,16 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
in
|
in
|
||||||
noSub ( model_, Cmd.none )
|
resultModelCmd ( model_, Cmd.none )
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
RequestRestoreSelected ->
|
RequestRestoreSelected ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
SelectView svm ->
|
SelectView svm ->
|
||||||
if svm.ids == Set.empty then
|
if svm.ids == Set.empty then
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
else
|
else
|
||||||
let
|
let
|
||||||
@ -536,37 +537,37 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
in
|
in
|
||||||
noSub ( model_, Cmd.none )
|
resultModelCmd ( model_, Cmd.none )
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
EditSelectedItems ->
|
EditSelectedItems ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
SelectView svm ->
|
SelectView svm ->
|
||||||
if svm.action == EditSelected then
|
if svm.action == EditSelected then
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model | viewMode = SelectView { svm | action = NoneAction } }
|
( { model | viewMode = SelectView { svm | action = NoneAction } }
|
||||||
, Cmd.none
|
, Cmd.none
|
||||||
)
|
)
|
||||||
|
|
||||||
else if svm.ids == Set.empty then
|
else if svm.ids == Set.empty then
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
else
|
else
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model | viewMode = SelectView { svm | action = EditSelected } }
|
( { model | viewMode = SelectView { svm | action = EditSelected } }
|
||||||
, Cmd.none
|
, Cmd.none
|
||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
MergeSelectedItems ->
|
MergeSelectedItems ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
SelectView svm ->
|
SelectView svm ->
|
||||||
if svm.action == MergeSelected then
|
if svm.action == MergeSelected then
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| viewMode =
|
| viewMode =
|
||||||
SelectView
|
SelectView
|
||||||
@ -579,7 +580,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
else if svm.ids == Set.empty then
|
else if svm.ids == Set.empty then
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
else
|
else
|
||||||
let
|
let
|
||||||
@ -589,7 +590,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
model.searchMenuModel.searchMode
|
model.searchMenuModel.searchMode
|
||||||
(Q.ItemIdIn (Set.toList svm.ids))
|
(Q.ItemIdIn (Set.toList svm.ids))
|
||||||
in
|
in
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| viewMode =
|
| viewMode =
|
||||||
SelectView
|
SelectView
|
||||||
@ -602,7 +603,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
MergeItemsMsg lmsg ->
|
MergeItemsMsg lmsg ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
@ -636,13 +637,13 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
model_
|
model_
|
||||||
|
|
||||||
else
|
else
|
||||||
noSub
|
resultModelCmd
|
||||||
( model_
|
( model_
|
||||||
, Cmd.map MergeItemsMsg result.cmd
|
, Cmd.map MergeItemsMsg result.cmd
|
||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
PublishSelectedItems ->
|
PublishSelectedItems ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
@ -652,7 +653,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
( mm, mc ) =
|
( mm, mc ) =
|
||||||
Comp.PublishItems.init flags
|
Comp.PublishItems.init flags
|
||||||
in
|
in
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| viewMode =
|
| viewMode =
|
||||||
SelectView
|
SelectView
|
||||||
@ -665,7 +666,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
else if svm.ids == Set.empty then
|
else if svm.ids == Set.empty then
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
else
|
else
|
||||||
let
|
let
|
||||||
@ -673,7 +674,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
Comp.PublishItems.initQuery flags
|
Comp.PublishItems.initQuery flags
|
||||||
(Q.ItemIdIn (Set.toList svm.ids))
|
(Q.ItemIdIn (Set.toList svm.ids))
|
||||||
in
|
in
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| viewMode =
|
| viewMode =
|
||||||
SelectView
|
SelectView
|
||||||
@ -686,7 +687,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
PublishItemsMsg lmsg ->
|
PublishItemsMsg lmsg ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
@ -717,13 +718,13 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
model_
|
model_
|
||||||
|
|
||||||
else
|
else
|
||||||
noSub
|
resultModelCmd
|
||||||
( model_
|
( model_
|
||||||
, Cmd.map PublishItemsMsg result.cmd
|
, Cmd.map PublishItemsMsg result.cmd
|
||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
EditMenuMsg lmsg ->
|
EditMenuMsg lmsg ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
@ -773,7 +774,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
MultiUpdateResp change (Ok res) ->
|
MultiUpdateResp change (Ok res) ->
|
||||||
let
|
let
|
||||||
@ -784,13 +785,13 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
SelectView svm ->
|
SelectView svm ->
|
||||||
-- replace changed items in the view
|
-- replace changed items in the view
|
||||||
noSub ( nm, loadChangedItems flags model.searchMenuModel.searchMode svm.ids )
|
resultModelCmd ( nm, loadChangedItems flags model.searchMenuModel.searchMode svm.ids )
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( nm, Cmd.none )
|
resultModelCmd ( nm, Cmd.none )
|
||||||
|
|
||||||
else
|
else
|
||||||
noSub ( nm, Cmd.none )
|
resultModelCmd ( nm, Cmd.none )
|
||||||
|
|
||||||
MultiUpdateResp change (Err _) ->
|
MultiUpdateResp change (Err _) ->
|
||||||
makeResult
|
makeResult
|
||||||
@ -800,10 +801,10 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
ReplaceChangedItemsResp (Ok items) ->
|
ReplaceChangedItemsResp (Ok items) ->
|
||||||
noSub ( replaceItems model items, Cmd.none )
|
resultModelCmd ( replaceItems model items, Cmd.none )
|
||||||
|
|
||||||
ReplaceChangedItemsResp (Err _) ->
|
ReplaceChangedItemsResp (Err _) ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
UiSettingsUpdated ->
|
UiSettingsUpdated ->
|
||||||
let
|
let
|
||||||
@ -841,7 +842,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
cmd =
|
cmd =
|
||||||
Api.saveUserClientSettingsBy flags newSettings ClientSettingsSaveResp
|
Api.saveUserClientSettingsBy flags newSettings ClientSettingsSaveResp
|
||||||
in
|
in
|
||||||
noSub ( { model | viewMenuOpen = False }, cmd )
|
resultModelCmd ( { model | viewMenuOpen = False }, cmd )
|
||||||
|
|
||||||
ClientSettingsSaveResp (Ok res) ->
|
ClientSettingsSaveResp (Ok res) ->
|
||||||
if res.success then
|
if res.success then
|
||||||
@ -852,10 +853,10 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
ClientSettingsSaveResp (Err _) ->
|
ClientSettingsSaveResp (Err _) ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
PowerSearchMsg lm ->
|
PowerSearchMsg lm ->
|
||||||
let
|
let
|
||||||
@ -879,7 +880,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
update bookmarkId mId key flags texts settings (DoSearch model.searchTypeDropdownValue) model
|
update bookmarkId mId key flags texts settings (DoSearch model.searchTypeDropdownValue) model
|
||||||
|
|
||||||
KeyUpPowerSearchbarMsg _ ->
|
KeyUpPowerSearchbarMsg _ ->
|
||||||
withSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
RemoveItem id ->
|
RemoveItem id ->
|
||||||
update bookmarkId mId key flags texts settings (ItemCardListMsg (Comp.ItemCardList.RemoveItem id)) model
|
update bookmarkId mId key flags texts settings (ItemCardListMsg (Comp.ItemCardList.RemoveItem id)) model
|
||||||
@ -891,30 +892,30 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
( pm, pc ) =
|
( pm, pc ) =
|
||||||
Comp.PublishItems.initQuery flags q
|
Comp.PublishItems.initQuery flags q
|
||||||
in
|
in
|
||||||
noSub ( { model | viewMode = PublishView pm, viewMenuOpen = False }, Cmd.map PublishViewMsg pc )
|
resultModelCmd ( { model | viewMode = PublishView pm, viewMenuOpen = False }, Cmd.map PublishViewMsg pc )
|
||||||
|
|
||||||
Nothing ->
|
Nothing ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
ToggleBookmarkCurrentQueryView ->
|
ToggleBookmarkCurrentQueryView ->
|
||||||
case createQuery model of
|
case createQuery model of
|
||||||
Just q ->
|
Just q ->
|
||||||
case model.topWidgetModel of
|
case model.topWidgetModel of
|
||||||
BookmarkQuery _ ->
|
BookmarkQuery _ ->
|
||||||
noSub ( { model | topWidgetModel = TopWidgetHidden, viewMenuOpen = False }, Cmd.none )
|
resultModelCmd ( { model | topWidgetModel = TopWidgetHidden, viewMenuOpen = False }, Cmd.none )
|
||||||
|
|
||||||
TopWidgetHidden ->
|
TopWidgetHidden ->
|
||||||
let
|
let
|
||||||
( qm, qc ) =
|
( qm, qc ) =
|
||||||
Comp.BookmarkQueryManage.init (Q.render q)
|
Comp.BookmarkQueryManage.init (Q.render q)
|
||||||
in
|
in
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model | topWidgetModel = BookmarkQuery qm, viewMenuOpen = False }
|
( { model | topWidgetModel = BookmarkQuery qm, viewMenuOpen = False }
|
||||||
, Cmd.map BookmarkQueryMsg qc
|
, Cmd.map BookmarkQueryMsg qc
|
||||||
)
|
)
|
||||||
|
|
||||||
Nothing ->
|
Nothing ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
BookmarkQueryMsg lm ->
|
BookmarkQueryMsg lm ->
|
||||||
case model.topWidgetModel of
|
case model.topWidgetModel of
|
||||||
@ -952,7 +953,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
TopWidgetHidden ->
|
TopWidgetHidden ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
PublishViewMsg lmsg ->
|
PublishViewMsg lmsg ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
@ -963,22 +964,22 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
in
|
in
|
||||||
case result.outcome of
|
case result.outcome of
|
||||||
Comp.PublishItems.OutcomeInProgress ->
|
Comp.PublishItems.OutcomeInProgress ->
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model | viewMode = PublishView result.model }
|
( { model | viewMode = PublishView result.model }
|
||||||
, Cmd.map PublishViewMsg result.cmd
|
, Cmd.map PublishViewMsg result.cmd
|
||||||
)
|
)
|
||||||
|
|
||||||
Comp.PublishItems.OutcomeDone ->
|
Comp.PublishItems.OutcomeDone ->
|
||||||
noSub
|
resultModelCmd
|
||||||
( { model | viewMode = SearchView }
|
( { model | viewMode = SearchView }
|
||||||
, Cmd.map SearchMenuMsg (Comp.SearchMenu.refreshBookmarks flags)
|
, Cmd.map SearchMenuMsg (Comp.SearchMenu.refreshBookmarks flags)
|
||||||
)
|
)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
noSub ( model, Cmd.none )
|
resultModelCmd ( model, Cmd.none )
|
||||||
|
|
||||||
ToggleViewMenu ->
|
ToggleViewMenu ->
|
||||||
noSub ( { model | viewMenuOpen = not model.viewMenuOpen }, Cmd.none )
|
resultModelCmd ( { model | viewMenuOpen = not model.viewMenuOpen }, Cmd.none )
|
||||||
|
|
||||||
ToggleShowGroups ->
|
ToggleShowGroups ->
|
||||||
let
|
let
|
||||||
@ -988,7 +989,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
cmd =
|
cmd =
|
||||||
Api.saveUserClientSettingsBy flags newSettings ClientSettingsSaveResp
|
Api.saveUserClientSettingsBy flags newSettings ClientSettingsSaveResp
|
||||||
in
|
in
|
||||||
noSub ( { model | viewMenuOpen = False }, cmd )
|
resultModelCmd ( { model | viewMenuOpen = False }, cmd )
|
||||||
|
|
||||||
ToggleArrange am ->
|
ToggleArrange am ->
|
||||||
let
|
let
|
||||||
@ -998,7 +999,7 @@ update bookmarkId mId key flags texts settings msg model =
|
|||||||
cmd =
|
cmd =
|
||||||
Api.saveUserClientSettingsBy flags newSettings ClientSettingsSaveResp
|
Api.saveUserClientSettingsBy flags newSettings ClientSettingsSaveResp
|
||||||
in
|
in
|
||||||
noSub ( { model | viewMenuOpen = False }, cmd )
|
resultModelCmd ( { model | viewMenuOpen = False }, cmd )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1115,7 +1116,7 @@ doSearch param model =
|
|||||||
searchCmd =
|
searchCmd =
|
||||||
doSearchCmd param_ model
|
doSearchCmd param_ model
|
||||||
in
|
in
|
||||||
withSub
|
resultModelCmd
|
||||||
( { model
|
( { model
|
||||||
| searchInProgress = True
|
| searchInProgress = True
|
||||||
, searchOffset = 0
|
, searchOffset = 0
|
||||||
@ -1149,17 +1150,8 @@ doSearchMore flags settings model =
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
withSub : ( Model, Cmd Msg ) -> UpdateResult
|
resultModelCmd : ( Model, Cmd Msg ) -> UpdateResult
|
||||||
withSub ( m, c ) =
|
resultModelCmd ( m, c ) =
|
||||||
makeResult
|
|
||||||
( m
|
|
||||||
, c
|
|
||||||
, Sub.none
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
noSub : ( Model, Cmd Msg ) -> UpdateResult
|
|
||||||
noSub ( m, c ) =
|
|
||||||
makeResult ( m, c, Sub.none )
|
makeResult ( m, c, Sub.none )
|
||||||
|
|
||||||
|
|
||||||
|
@ -250,7 +250,6 @@ defaultMenuBar texts flags settings model =
|
|||||||
[ Html.map PowerSearchMsg
|
[ Html.map PowerSearchMsg
|
||||||
(Comp.PowerSearchInput.viewInput
|
(Comp.PowerSearchInput.viewInput
|
||||||
{ placeholder = texts.powerSearchPlaceholder
|
{ placeholder = texts.powerSearchPlaceholder
|
||||||
, extraAttrs = []
|
|
||||||
}
|
}
|
||||||
model.powerSearchInput
|
model.powerSearchInput
|
||||||
)
|
)
|
||||||
@ -424,6 +423,7 @@ defaultMenuBar texts flags settings model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-2 pt-1 dark:bg-slate-700 items-center text-sm"
|
, rootClasses = "mb-2 pt-1 dark:bg-slate-700 items-center text-sm"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -551,6 +551,7 @@ editMenuBar texts model svm =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-2 pt-2 sticky top-0 text-sm"
|
, rootClasses = "mb-2 pt-2 sticky top-0 text-sm"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,7 +31,6 @@ view texts flags model =
|
|||||||
[ Html.map PowerSearchMsg
|
[ Html.map PowerSearchMsg
|
||||||
(Comp.PowerSearchInput.viewInput
|
(Comp.PowerSearchInput.viewInput
|
||||||
{ placeholder = texts.powerSearchPlaceholder
|
{ placeholder = texts.powerSearchPlaceholder
|
||||||
, extraAttrs = []
|
|
||||||
}
|
}
|
||||||
model.powerSearchInput
|
model.powerSearchInput
|
||||||
)
|
)
|
||||||
@ -151,4 +150,5 @@ view texts flags model =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
, rootClasses = "mb-2 pt-1 dark:bg-slate-700 items-center text-sm"
|
, rootClasses = "mb-2 pt-1 dark:bg-slate-700 items-center text-sm"
|
||||||
|
, sticky = True
|
||||||
}
|
}
|
||||||
|
@ -266,7 +266,7 @@ makeSearchCmd flags doInit model =
|
|||||||
, Maybe.map Q.Fragment <|
|
, Maybe.map Q.Fragment <|
|
||||||
case model.searchMode of
|
case model.searchMode of
|
||||||
SearchBarNormal ->
|
SearchBarNormal ->
|
||||||
model.powerSearchInput.input
|
Comp.PowerSearchInput.getSearchString model.powerSearchInput
|
||||||
|
|
||||||
SearchBarContent ->
|
SearchBarContent ->
|
||||||
if flags.config.fullTextSearchEnabled then
|
if flags.config.fullTextSearchEnabled then
|
||||||
|
@ -87,7 +87,6 @@ elmApp.ports.checkSearchQueryString.subscribe(function(args) {
|
|||||||
messages: []
|
messages: []
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
console.log("Sending: " + answer.success);
|
|
||||||
elmApp.ports.receiveCheckQueryResult.send(answer);
|
elmApp.ports.receiveCheckQueryResult.send(answer);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user