module IHP.IDE.Data.View.ShowTableRows where
import IHP.ViewPrelude
import IHP.IDE.ToolServer.Types
import IHP.IDE.Data.View.ShowDatabase
import IHP.IDE.Data.View.Layout
import qualified Data.ByteString.Char8 as ByteString
data ShowTableRowsView = ShowTableRowsView
{ tableNames :: [Text]
, tableName :: Text
, rows :: [[DynamicField]]
, tableCols :: [ColumnDefinition]
, primaryKeyFields :: [Text]
, pageSize :: Int
, page :: Int
, totalRows :: Int
}
instance View ShowTableRowsView where
html ShowTableRowsView { .. } = [hsx|
{headerNav}
{renderTableSelector tableNames tableName}
{whenNonEmpty rows $ renderRows rows tableBody tableName}
{whenEmpty rows emptyState}
{pageMenu}
|]
where
tableBody = [hsx|{forEach rows renderRow}|]
renderRow fields = [hsx| contextMenuId <> "'); event.stopPropagation();"}>{forEach fields (renderField primaryKey)}
|]
where
contextMenuId = "context-menu-column-" <> tshow primaryKey
primaryKey = intercalate "---" . map (cs . fromMaybe "" . (.fieldValue)) $ filter ((`elem` primaryKeyFields) . cs . (.fieldName)) fields
renderField primaryKey DynamicField { .. }
| fieldName == "id" = [hsx|{renderId (sqlValueToText fieldValue)} | |]
| isBoolField fieldName tableCols && not (isNothing fieldValue) = [hsx| | |]
| otherwise = renderNormalField primaryKey DynamicField { .. }
renderNormalField primaryKey DynamicField { .. } = [hsx|
{sqlValueToText fieldValue}
|
|]
where
isForeignKeyColumn = "_id" `ByteString.isSuffixOf` fieldName
foreignKeyHoverCardUrl = if isForeignKeyColumn
then Just $ pathTo ShowForeignKeyHoverCardAction { tableName, id = primaryKey, columnName = cs fieldName }
else Nothing
columnNames = map (.fieldName) (fromMaybe [] (head rows))
onClick tableName fieldName primaryKey = "window.location.assign(" <> tshow (pathTo (ToggleBooleanFieldAction tableName (cs fieldName) primaryKey)) <> ")"
totalPages = [1..ceiling (fromIntegral(totalRows) / fromIntegral(pageSize))]
pageMenu = when (length totalPages > 1)
[hsx|
{backButton}
{forEach (totalPages) renderPageButton}
{nextButton}
|]
where
backButton = if page > 1
then [hsx| "&page=" <> show (page-1) <> "&rows=" <> show pageSize} class="mx-3 text-muted">{"< Back" :: Text}|]
else [hsx|{"< Back" :: Text}|]
nextButton = if page < length totalPages
then [hsx| "&page=" <> show (page+1) <> "&rows=" <> show pageSize} class="mx-3 text-muted">{"Next >" :: Text}|]
else [hsx|{"Next >" :: Text}|]
renderPageButton :: Int -> Html
renderPageButton nr = [hsx| "&page=" <> show nr <> "&rows=" <> show pageSize} class={classes ["mx-2", (if page==nr then "text-dark font-weight-bold" else "text-muted")]}>{nr}|]
emptyState :: Html
emptyState = [hsx|
|]