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|

This table has no rows yet.

+ Add first {tableNameToModelName tableName}
|]