Skip to content

Commit 9e1864a

Browse files
authored
Display different column in reference field (#27)
* Display different column in reference * Fix disabled edit
1 parent 4cbfac8 commit 9e1864a

File tree

9 files changed

+43
-32
lines changed

9 files changed

+43
-32
lines changed

spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/AdminGetTables.scala

+7-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@ import play.api.libs.json.{Format, Json}
55
object AdminGetTables {
66
case class Response(data: List[Response.DatabaseTable])
77
object Response {
8-
case class DatabaseTable(name: String, columns: List[TableColumn], primaryKeyName: String, canBeDeleted: Boolean)
8+
case class DatabaseTable(
9+
name: String,
10+
columns: List[TableColumn],
11+
primaryKeyName: String,
12+
canBeDeleted: Boolean,
13+
referenceDisplayField: Option[String]
14+
)
915
case class TableColumn(
1016
name: String,
1117
`type`: String,

spra-play-server/src/main/resources/application.conf

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ dataExplorer {
2828
createFilter {
2929
requiredColumns = ["user_id", "message"]
3030
}
31+
referenceDisplayField = "email"
3132
}
3233
}
3334
}

spra-play-server/src/main/scala/net/wiringbits/spra/admin/config/TableSettings.scala

+5-3
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@ case class TableSettings(
4040
primaryKeyDataType: PrimaryKeyDataType = PrimaryKeyDataType.UUID,
4141
columnTypeOverrides: Map[String, CustomDataType] = Map.empty,
4242
filterableColumns: List[String] = List.empty,
43-
createSettings: CreateSettings = CreateSettings()
43+
createSettings: CreateSettings = CreateSettings(),
44+
referenceDisplayField: Option[String] = None
4445
) {
4546
override def toString: String =
4647
s"""TableSettings(tableName = $tableName, primaryKeyField = $primaryKeyField, referenceField = $referenceField,
4748
hiddenColumns = $hiddenColumns, nonEditableColumns = $nonEditableColumns, canBeDeleted = $canBeDeleted,
4849
primaryKeyDataType = $primaryKeyDataType, columnTypeOverrides = $columnTypeOverrides,
49-
filterableColumns = $filterableColumns, createSettings = $createSettings)"""
50+
filterableColumns = $filterableColumns, createSettings = $createSettings, referenceDisplayField: $referenceDisplayField)"""
5051
}
5152

5253
object TableSettings {
@@ -102,7 +103,8 @@ object TableSettings {
102103
createSettings = CreateSettings(
103104
requiredColumns = getList[String]("createFilter.requiredColumns"),
104105
nonRequiredColumns = getList[String]("createFilter.nonRequiredColumns")
105-
)
106+
),
107+
referenceDisplayField = getOption[String]("referenceDisplayField")
106108
)
107109
}
108110
}

spra-play-server/src/main/scala/net/wiringbits/spra/admin/services/AdminService.scala

+6-14
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import net.wiringbits.spra.admin.config.{CustomDataType, DataExplorerConfig, Tab
44
import net.wiringbits.spra.admin.repositories.DatabaseTablesRepository
55
import net.wiringbits.spra.admin.repositories.models.{ForeignKey, TableData}
66
import net.wiringbits.spra.admin.utils.models.QueryParameters
7-
import net.wiringbits.spra.admin.utils.{MapStringHideExt, contentRangeHeader}
7+
import net.wiringbits.spra.admin.utils.contentRangeHeader
88
import net.wiringbits.spra.api.models.*
99

1010
import java.awt.image.BufferedImage
@@ -78,17 +78,14 @@ class AdminService @Inject() (
7878
name = settings.tableName,
7979
columns = columns,
8080
primaryKeyName = settings.primaryKeyField,
81-
canBeDeleted = settings.canBeDeleted
81+
canBeDeleted = settings.canBeDeleted,
82+
referenceDisplayField = settings.referenceDisplayField
8283
)
8384
}
8485
}
8586
} yield AdminGetTables.Response(items)
8687
}
8788

88-
private def hideData(tableData: TableData, hiddenColumns: List[String]) = {
89-
tableData.data.hideData(hiddenColumns)
90-
}
91-
9289
def tableMetadata(tableName: String, queryParams: QueryParameters): Future[(List[Map[String, String]], String)] = {
9390
val validations = {
9491
for {
@@ -102,9 +99,8 @@ class AdminService @Inject() (
10299
_ <- validateQueryParameters(tableName, queryParams)
103100
tableRows <- databaseTablesRepository.getTableMetadata(settings, queryParams)
104101
numberOfRecords <- databaseTablesRepository.numberOfRecords(tableName)
105-
hiddenTableData = tableRows.map(data => hideData(data, settings.hiddenColumns))
106102
contentRange = contentRangeHeader(tableName, queryParams, numberOfRecords)
107-
} yield (hiddenTableData, contentRange)
103+
} yield (tableRows.map(_.data), contentRange)
108104
}
109105

110106
private def validateQueryParameters(tableName: String, params: QueryParameters): Future[Unit] = {
@@ -129,9 +125,7 @@ class AdminService @Inject() (
129125
_ <- validations
130126
maybe <- databaseTablesRepository.find(tableName, primaryKeyValue)
131127
tableRow = maybe.getOrElse(throw new RuntimeException(s"Cannot find item in $tableName with id $primaryKeyValue"))
132-
settings = dataExplorerConfig.unsafeFindByName(tableName)
133-
hiddenData = hideData(tableRow, settings.hiddenColumns)
134-
} yield hiddenData
128+
} yield tableRow.data
135129
}
136130

137131
def find(tableName: String, primaryKeyValues: List[String]): Future[List[Map[String, String]]] = {
@@ -141,7 +135,6 @@ class AdminService @Inject() (
141135

142136
for {
143137
_ <- validations
144-
settings = dataExplorerConfig.unsafeFindByName(tableName)
145138
tableRows <- Future.sequence {
146139
primaryKeyValues.map { primaryKeyValue =>
147140
for {
@@ -152,8 +145,7 @@ class AdminService @Inject() (
152145
} yield tableData
153146
}
154147
}
155-
maskedTableData = tableRows.map(x => hideData(x, settings.hiddenColumns))
156-
} yield maskedTableData
148+
} yield tableRows.map(_.data)
157149
}
158150

159151
def create(tableName: String, request: AdminCreateTable.Request): Future[String] = {

spra-play-server/src/main/scala/net/wiringbits/spra/admin/utils/package.scala

-6
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,6 @@ package object utils {
1717
}
1818
}
1919

20-
implicit class MapStringHideExt(val data: Map[String, String]) extends AnyVal {
21-
def hideData(columnsToHide: List[String]): Map[String, String] = {
22-
data.filterNot { case (key, _) => columnsToHide.contains(key) }
23-
}
24-
}
25-
2620
def contentRangeHeader(tableName: String, queryParameters: QueryParameters, numberOfRecords: Int): String = {
2721
s"$tableName ${queryParameters.pagination.start}-${queryParameters.pagination.end}/$numberOfRecords"
2822
}

spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/CreateGuesser.scala

+7-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,13 @@ object CreateGuesser {
3838
reference = reference,
3939
isRequired = isRequired,
4040
validate = required
41-
)(SelectInput(optionText = source, isRequired = isRequired, validate = required))
41+
)(
42+
SelectInput(
43+
optionText = props.response.referenceDisplayField.getOrElse(source),
44+
isRequired = isRequired,
45+
validate = required
46+
)
47+
)
4248
}
4349
}
4450
.getOrElse(Fragment())

spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/EditGuesser.scala

+7-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,13 @@ object EditGuesser {
3939
ReferenceInput(
4040
source = field.name,
4141
reference = reference
42-
)(SelectInput(optionText = source, disabled = field.disabled))
42+
)(
43+
SelectInput(
44+
source = source,
45+
optionText = props.response.referenceDisplayField.getOrElse(source),
46+
disabled = field.disabled
47+
)
48+
)
4349
}
4450
}
4551

spra-web/src/main/scala/net/wiringbits/spra/ui/web/components/ListGuesser.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ object ListGuesser {
3535
case Image => ImageField(source = field.name, sx = styles)
3636
case Number => NumberField(source = field.name)
3737
case ColumnType.Reference(reference, source) =>
38-
defaultField(reference, field.name)(TextField(source = source))
38+
defaultField(reference, field.name)(
39+
TextField(source = props.response.referenceDisplayField.getOrElse(source))
40+
)
3941
}
4042
}
4143
}

spra-web/src/main/scala/net/wiringbits/spra/ui/web/facades/reactadmin/SelectInput.scala

+7-5
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,20 @@ import scala.scalajs.js.|
77

88
object SelectInput extends ExternalComponent {
99
case class Props(
10-
optionText: String = "",
10+
source: String = "",
1111
disabled: Boolean = false,
1212
isRequired: Boolean = false,
13-
validate: js.UndefOr[js.Any] = js.undefined
13+
validate: js.UndefOr[js.Any] = js.undefined,
14+
optionText: js.UndefOr[String] = js.undefined
1415
)
1516

1617
def apply(
17-
optionText: String = "",
18+
source: String = "",
1819
disabled: Boolean = false,
1920
isRequired: Boolean = false,
20-
validate: js.UndefOr[js.Any] = js.undefined
21-
): BuildingComponent[_, _] = super.apply(Props(optionText, disabled, isRequired, validate))
21+
validate: js.UndefOr[js.Any] = js.undefined,
22+
optionText: js.UndefOr[String] = js.undefined
23+
): BuildingComponent[_, _] = super.apply(Props(source, disabled, isRequired, validate, optionText))
2224

2325
override val component: String | js.Object = ReactAdmin.SelectInput
2426
}

0 commit comments

Comments
 (0)