diff --git a/modules/restapi/src/main/resources/docspell-openapi.yml b/modules/restapi/src/main/resources/docspell-openapi.yml index 01ecdfb1..84ed7417 100644 --- a/modules/restapi/src/main/resources/docspell-openapi.yml +++ b/modules/restapi/src/main/resources/docspell-openapi.yml @@ -5069,6 +5069,8 @@ components: description: DateTime type: integer format: date-time + shortName: + type: string OrganizationList: description: | A list of full organization values. 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 00c5957b..90c3e06a 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/conv/Conversions.scala @@ -386,7 +386,8 @@ trait Conversions { Address(ro.street, ro.zip, ro.city, ro.country), v.contacts.map(mkContact).toList, ro.notes, - ro.created + ro.created, + ro.shortName ) } @@ -407,7 +408,8 @@ trait Conversions { v.address.country, v.notes, now, - now + now, + v.shortName ) } yield OOrganization.OrgAndContacts(org, cont) } @@ -431,7 +433,8 @@ trait Conversions { v.address.country, v.notes, v.created, - now + now, + v.shortName ) } yield OOrganization.OrgAndContacts(org, cont) } diff --git a/modules/store/src/main/resources/db/migration/h2/V1.20.2__org_shortname.sql b/modules/store/src/main/resources/db/migration/h2/V1.20.2__org_shortname.sql new file mode 100644 index 00000000..d3ac8559 --- /dev/null +++ b/modules/store/src/main/resources/db/migration/h2/V1.20.2__org_shortname.sql @@ -0,0 +1,2 @@ +ALTER TABLE "organization" +ADD COLUMN "short_name" varchar(254); diff --git a/modules/store/src/main/resources/db/migration/mariadb/V1.20.2__org_shortname.sql b/modules/store/src/main/resources/db/migration/mariadb/V1.20.2__org_shortname.sql new file mode 100644 index 00000000..40cb7611 --- /dev/null +++ b/modules/store/src/main/resources/db/migration/mariadb/V1.20.2__org_shortname.sql @@ -0,0 +1,2 @@ +ALTER TABLE `organization` +ADD COLUMN `short_name` varchar(254); diff --git a/modules/store/src/main/resources/db/migration/postgresql/V1.20.2__org_shortname.sql b/modules/store/src/main/resources/db/migration/postgresql/V1.20.2__org_shortname.sql new file mode 100644 index 00000000..d3ac8559 --- /dev/null +++ b/modules/store/src/main/resources/db/migration/postgresql/V1.20.2__org_shortname.sql @@ -0,0 +1,2 @@ +ALTER TABLE "organization" +ADD COLUMN "short_name" varchar(254); diff --git a/modules/store/src/main/scala/docspell/store/queries/QOrganization.scala b/modules/store/src/main/scala/docspell/store/queries/QOrganization.scala index a966c90a..05415b5b 100644 --- a/modules/store/src/main/scala/docspell/store/queries/QOrganization.scala +++ b/modules/store/src/main/scala/docspell/store/queries/QOrganization.scala @@ -25,7 +25,7 @@ object QOrganization { ): Stream[ConnectionIO, (ROrganization, Vector[RContact])] = { val valFilter = query.map { q => val v = s"%$q%" - c.value.like(v) || org.name.like(v) || org.notes.like(v) + c.value.like(v) || org.name.like(v) || org.shortName.like(v) || org.notes.like(v) } val sql = Select( select(org.all, c.all), diff --git a/modules/store/src/main/scala/docspell/store/records/ROrganization.scala b/modules/store/src/main/scala/docspell/store/records/ROrganization.scala index 0e8efafd..339c07e3 100644 --- a/modules/store/src/main/scala/docspell/store/records/ROrganization.scala +++ b/modules/store/src/main/scala/docspell/store/records/ROrganization.scala @@ -21,7 +21,8 @@ case class ROrganization( country: String, notes: Option[String], created: Timestamp, - updated: Timestamp + updated: Timestamp, + shortName: Option[String] ) {} object ROrganization { @@ -31,16 +32,17 @@ object ROrganization { final case class Table(alias: Option[String]) extends TableDef { val tableName = "organization" - val oid = Column[Ident]("oid", this) - val cid = Column[Ident]("cid", this) - val name = Column[String]("name", this) - val street = Column[String]("street", this) - val zip = Column[String]("zip", this) - val city = Column[String]("city", this) - val country = Column[String]("country", this) - val notes = Column[String]("notes", this) - val created = Column[Timestamp]("created", this) - val updated = Column[Timestamp]("updated", this) + val oid = Column[Ident]("oid", this) + val cid = Column[Ident]("cid", this) + val name = Column[String]("name", this) + val street = Column[String]("street", this) + val zip = Column[String]("zip", this) + val city = Column[String]("city", this) + val country = Column[String]("country", this) + val notes = Column[String]("notes", this) + val created = Column[Timestamp]("created", this) + val updated = Column[Timestamp]("updated", this) + val shortName = Column[String]("short_name", this) val all = NonEmptyList.of[Column[_]]( oid, @@ -52,7 +54,8 @@ object ROrganization { country, notes, created, - updated + updated, + shortName ) } @@ -64,7 +67,7 @@ object ROrganization { DML.insert( T, T.all, - fr"${v.oid},${v.cid},${v.name},${v.street},${v.zip},${v.city},${v.country},${v.notes},${v.created},${v.updated}" + fr"${v.oid},${v.cid},${v.name},${v.street},${v.zip},${v.city},${v.country},${v.notes},${v.created},${v.updated},${v.shortName}" ) def update(v: ROrganization): ConnectionIO[Int] = { @@ -80,7 +83,8 @@ object ROrganization { T.city.setTo(v.city), T.country.setTo(v.country), T.notes.setTo(v.notes), - T.updated.setTo(now) + T.updated.setTo(now), + T.shortName.setTo(v.shortName) ) ) for { @@ -106,7 +110,11 @@ object ROrganization { } def findLike(coll: Ident, orgName: String): ConnectionIO[Vector[IdRef]] = - run(select(T.oid, T.name), from(T), T.cid === coll && T.name.like(orgName)) + run( + select(T.oid, T.name), + from(T), + T.cid === coll && (T.name.like(orgName) || T.shortName.like(orgName)) + ) .query[IdRef] .to[Vector] @@ -141,7 +149,9 @@ object ROrganization { nameQ: Option[String], order: Table => Column[_] ): ConnectionIO[Vector[IdRef]] = { - val nameFilter = nameQ.map(s => T.name.like(s"%${s.toLowerCase}%")) + val nameFilter = nameQ.map(s => + T.name.like(s"%${s.toLowerCase}%") || T.shortName.like(s"%${s.toLowerCase}%") + ) val sql = Select(select(T.oid, T.name), from(T), T.cid === coll &&? nameFilter) .orderBy(order(T)) sql.build.query[IdRef].to[Vector] diff --git a/modules/webapp/src/main/elm/Comp/OrgForm.elm b/modules/webapp/src/main/elm/Comp/OrgForm.elm index 1f3603dc..58522d17 100644 --- a/modules/webapp/src/main/elm/Comp/OrgForm.elm +++ b/modules/webapp/src/main/elm/Comp/OrgForm.elm @@ -20,6 +20,7 @@ import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (onInput) import Styles as S +import Util.Maybe type alias Model = @@ -28,6 +29,7 @@ type alias Model = , addressModel : Comp.AddressForm.Model , contactModel : Comp.ContactField.Model , notes : Maybe String + , shortName : Maybe String } @@ -38,6 +40,7 @@ emptyModel = , addressModel = Comp.AddressForm.emptyModel , contactModel = Comp.ContactField.emptyModel , notes = Nothing + , shortName = Nothing } @@ -57,6 +60,7 @@ getOrg model = , address = Comp.AddressForm.getAddress model.addressModel , contacts = Comp.ContactField.getContacts model.contactModel , notes = model.notes + , shortName = model.shortName } @@ -66,6 +70,7 @@ type Msg | AddressMsg Comp.AddressForm.Msg | ContactMsg Comp.ContactField.Msg | SetNotes String + | SetShortName String update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) @@ -79,7 +84,14 @@ update flags msg model = ( m2, c2 ) = update flags (ContactMsg (Comp.ContactField.SetItems t.contacts)) m1 in - ( { m2 | org = t, name = t.name, notes = t.notes }, Cmd.batch [ c1, c2 ] ) + ( { m2 + | org = t + , name = t.name + , notes = t.notes + , shortName = t.shortName + } + , Cmd.batch [ c1, c2 ] + ) AddressMsg am -> let @@ -99,14 +111,12 @@ update flags msg model = ( { model | name = n }, Cmd.none ) SetNotes str -> - ( { model - | notes = - if str == "" then - Nothing + ( { model | notes = Util.Maybe.fromString str } + , Cmd.none + ) - else - Just str - } + SetShortName str -> + ( { model | shortName = Util.Maybe.fromString str } , Cmd.none ) @@ -184,6 +194,25 @@ view2 mobile settings model = ] [] ] + , div + [ class "mb-4" ] + [ label + [ for "org-short-name" + , class S.inputLabel + ] + [ text "Short Name" + ] + , input + [ type_ "text" + , onInput SetShortName + , placeholder "Abbreviation" + , Maybe.withDefault "" model.shortName + |> value + , name "org-short-name" + , class S.textInput + ] + [] + ] , div [ class "mb-4" ] [ h3 [ class S.header3 ] [ text "Address"