From 7ef3185659d486ed91914f5c8e1985df1c4f91fd Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Thu, 18 Feb 2021 23:20:25 +0100 Subject: [PATCH] Add language to a source Allows to define upload urls for different languages. --- .../scala/docspell/backend/ops/OUpload.scala | 3 +- .../src/main/resources/docspell-openapi.yml | 3 + .../restserver/conv/Conversions.scala | 7 ++- .../db/migration/h2/V1.20.4__source_lang.sql | 2 + .../mariadb/V1.20.4__source_lang.sql | 2 + .../postgresql/V1.20.4__source_lang.sql | 2 + .../docspell/store/records/RSource.scala | 12 ++-- .../webapp/src/main/elm/Comp/SourceForm.elm | 57 ++++++++++++++++++- .../webapp/src/main/elm/Comp/SourceManage.elm | 19 ++++--- 9 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 modules/store/src/main/resources/db/migration/h2/V1.20.4__source_lang.sql create mode 100644 modules/store/src/main/resources/db/migration/mariadb/V1.20.4__source_lang.sql create mode 100644 modules/store/src/main/resources/db/migration/postgresql/V1.20.4__source_lang.sql diff --git a/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala b/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala index 9183868e..12254f08 100644 --- a/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala +++ b/modules/backend/src/main/scala/docspell/backend/ops/OUpload.scala @@ -175,7 +175,8 @@ object OUpload { fileFilter = if (data.meta.fileFilter == Glob.all) src.source.fileFilterOrAll else data.meta.fileFilter, - tags = (data.meta.tags ++ src.tags.map(_.tagId.id)).distinct + tags = (data.meta.tags ++ src.tags.map(_.tagId.id)).distinct, + language = data.meta.language.orElse(src.source.language) ), priority = src.source.priority ) diff --git a/modules/restapi/src/main/resources/docspell-openapi.yml b/modules/restapi/src/main/resources/docspell-openapi.yml index 84ed7417..a523ab14 100644 --- a/modules/restapi/src/main/resources/docspell-openapi.yml +++ b/modules/restapi/src/main/resources/docspell-openapi.yml @@ -4924,6 +4924,9 @@ components: fileFilter: type: string format: glob + language: + type: string + format: language created: description: DateTime type: integer diff --git a/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala b/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala index 90c3e06a..bea03391 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala @@ -583,6 +583,7 @@ trait Conversions { s.source.priority, s.source.folderId, s.source.fileFilter, + s.source.language, s.source.created ), TagList(s.tags.length, s.tags.map(mkTag).toList) @@ -600,7 +601,8 @@ trait Conversions { s.priority, now, s.folder, - s.fileFilter + s.fileFilter, + s.language ) }) @@ -615,7 +617,8 @@ trait Conversions { s.priority, s.created, s.folder, - s.fileFilter + s.fileFilter, + s.language ) // equipment diff --git a/modules/store/src/main/resources/db/migration/h2/V1.20.4__source_lang.sql b/modules/store/src/main/resources/db/migration/h2/V1.20.4__source_lang.sql new file mode 100644 index 00000000..00864231 --- /dev/null +++ b/modules/store/src/main/resources/db/migration/h2/V1.20.4__source_lang.sql @@ -0,0 +1,2 @@ +ALTER TABLE "source" +ADD COLUMN "doc_lang" varchar(254); diff --git a/modules/store/src/main/resources/db/migration/mariadb/V1.20.4__source_lang.sql b/modules/store/src/main/resources/db/migration/mariadb/V1.20.4__source_lang.sql new file mode 100644 index 00000000..0ca1de3d --- /dev/null +++ b/modules/store/src/main/resources/db/migration/mariadb/V1.20.4__source_lang.sql @@ -0,0 +1,2 @@ +ALTER TABLE `source` +ADD COLUMN `doc_lang` varchar(254); diff --git a/modules/store/src/main/resources/db/migration/postgresql/V1.20.4__source_lang.sql b/modules/store/src/main/resources/db/migration/postgresql/V1.20.4__source_lang.sql new file mode 100644 index 00000000..00864231 --- /dev/null +++ b/modules/store/src/main/resources/db/migration/postgresql/V1.20.4__source_lang.sql @@ -0,0 +1,2 @@ +ALTER TABLE "source" +ADD COLUMN "doc_lang" varchar(254); diff --git a/modules/store/src/main/scala/docspell/store/records/RSource.scala b/modules/store/src/main/scala/docspell/store/records/RSource.scala index 25847d50..de8ce7cd 100644 --- a/modules/store/src/main/scala/docspell/store/records/RSource.scala +++ b/modules/store/src/main/scala/docspell/store/records/RSource.scala @@ -19,7 +19,8 @@ case class RSource( priority: Priority, created: Timestamp, folderId: Option[Ident], - fileFilter: Option[Glob] + fileFilter: Option[Glob], + language: Option[Language] ) { def fileFilterOrAll: Glob = @@ -41,6 +42,7 @@ object RSource { val created = Column[Timestamp]("created", this) val folder = Column[Ident]("folder_id", this) val fileFilter = Column[Glob]("file_filter", this) + val language = Column[Language]("doc_lang", this) val all = NonEmptyList.of[Column[_]]( @@ -53,7 +55,8 @@ object RSource { priority, created, folder, - fileFilter + fileFilter, + language ) } @@ -66,7 +69,7 @@ object RSource { DML.insert( table, table.all, - fr"${v.sid},${v.cid},${v.abbrev},${v.description},${v.counter},${v.enabled},${v.priority},${v.created},${v.folderId},${v.fileFilter}" + fr"${v.sid},${v.cid},${v.abbrev},${v.description},${v.counter},${v.enabled},${v.priority},${v.created},${v.folderId},${v.fileFilter},${v.language}" ) def updateNoCounter(v: RSource): ConnectionIO[Int] = @@ -80,7 +83,8 @@ object RSource { table.enabled.setTo(v.enabled), table.priority.setTo(v.priority), table.folder.setTo(v.folderId), - table.fileFilter.setTo(v.fileFilter) + table.fileFilter.setTo(v.fileFilter), + table.language.setTo(v.language) ) ) diff --git a/modules/webapp/src/main/elm/Comp/SourceForm.elm b/modules/webapp/src/main/elm/Comp/SourceForm.elm index 693d5d6f..aee1db57 100644 --- a/modules/webapp/src/main/elm/Comp/SourceForm.elm +++ b/modules/webapp/src/main/elm/Comp/SourceForm.elm @@ -21,6 +21,7 @@ import Comp.Dropdown exposing (isDropdownChangeMsg) import Comp.FixedDropdown import Data.DropdownStyle as DS import Data.Flags exposing (Flags) +import Data.Language exposing (Language) import Data.Priority exposing (Priority) import Data.UiSettings exposing (UiSettings) import Html exposing (..) @@ -47,6 +48,8 @@ type alias Model = , folderId : Maybe String , tagModel : Comp.Dropdown.Model Tag , fileFilter : Maybe String + , languageModel : Comp.Dropdown.Model Language + , language : Maybe String } @@ -70,6 +73,19 @@ emptyModel = , folderId = Nothing , tagModel = Util.Tag.makeDropdownModel2 , fileFilter = Nothing + , languageModel = + Comp.Dropdown.makeSingleList + { makeOption = + \a -> + { value = Data.Language.toName a + , text = Data.Language.toName a + , additional = "" + } + , placeholder = "Select…" + , options = Data.Language.all + , selected = Nothing + } + , language = Nothing } @@ -108,6 +124,7 @@ getSource model = , priority = Data.Priority.toName model.priority , folder = model.folderId , fileFilter = model.fileFilter + , language = model.language } in { st | source = n, tags = TagList (List.length tags) tags } @@ -124,6 +141,7 @@ type Msg | GetTagResp (Result Http.Error TagList) | TagDropdownMsg (Comp.Dropdown.Msg Tag) | SetFileFilter String + | LanguageMsg (Comp.Dropdown.Msg Language) @@ -285,6 +303,28 @@ update flags msg model = , Cmd.none ) + LanguageMsg lm -> + let + ( dm, dc ) = + Comp.Dropdown.update lm model.languageModel + + newModel = + { model | languageModel = dm } + + lang = + Comp.Dropdown.getSelected dm |> List.head + + model_ = + if isDropdownChangeMsg lm then + { newModel | language = Maybe.map Data.Language.toIso3 lang } + + else + newModel + in + ( model_ + , Cmd.map LanguageMsg dc + ) + --- View @@ -426,7 +466,7 @@ isFolderMember model = view2 : Flags -> UiSettings -> Model -> Html Msg -view2 flags settings model = +view2 _ settings model = let priorityItem = Comp.FixedDropdown.Item @@ -581,6 +621,21 @@ disappear then. ] ] ] + , div [ class "mb-4" ] + [ label [ class S.inputLabel ] + [ text "Language:" + ] + , Html.map LanguageMsg + (Comp.Dropdown.view2 + DS.mainStyle + settings + model.languageModel + ) + , div [ class "text-gray-400 text-xs" ] + [ text "Used for text extraction and analysis. The collective's " + , text "default language is used if not specified here." + ] + ] ] diff --git a/modules/webapp/src/main/elm/Comp/SourceManage.elm b/modules/webapp/src/main/elm/Comp/SourceManage.elm index 905a25c5..a756eb0c 100644 --- a/modules/webapp/src/main/elm/Comp/SourceManage.elm +++ b/modules/webapp/src/main/elm/Comp/SourceManage.elm @@ -474,6 +474,18 @@ viewLinks2 flags _ source = [ text source.source.id ] ] + , MB.view + { start = + [ MB.SecondaryButton + { label = "Back" + , icon = Just "fa fa-arrow-left" + , tagger = SetTableView + , title = "Back to list" + } + ] + , end = [] + , rootClasses = "mb-4" + } , p [ class "text-lg pt-2 opacity-75" ] [ text "This source defines URLs that can be used by anyone to send files to " , text "you. There is a web page that you can share or the API url can be used " @@ -565,13 +577,6 @@ viewLinks2 flags _ source = [ qrCodeView apiUrl ] ] - , button - [ class S.secondaryButton - , class "mt-4 mb-2" - , onClick SetTableView - ] - [ text "Back" - ] ]