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