module IHP.IDE.SchemaDesigner.View.Columns.Edit where
import IHP.ViewPrelude hiding (primaryKeyColumnNames)
import IHP.IDE.SchemaDesigner.Types
import qualified IHP.IDE.SchemaDesigner.Compiler as Compiler
import IHP.IDE.ToolServer.Types
import IHP.IDE.SchemaDesigner.View.Layout
import Text.Countable (singularize)
data EditColumnView = EditColumnView
{ statements :: [Statement]
, tableName :: Text
, columnId :: Int
, column :: Column
, enumNames :: [Text]
}
instance View EditColumnView where
html EditColumnView { column = column@Column { name }, .. } = [hsx|
{renderObjectSelector (zip [0..] statements) (Just tableName)}
{renderColumnSelector tableName (zip [0..] columns) statements}
{migrationStatus}
{renderModal modal}
|]
where
table = findStatementByName tableName statements
columns = maybe [] ((.columns) . unsafeGetCreateTable) table
primaryKeyColumns = maybe [] (primaryKeyColumnNames . (.primaryKeyConstraint) . unsafeGetCreateTable) table
isArrayType (PArray _) = True
isArrayType _ = False
isPrimaryKey :: Bool
isPrimaryKey = name `elem` primaryKeyColumns
modalContent = [hsx|
|]
modalFooter = mempty
modalCloseUrl = pathTo ShowTableAction { tableName }
modalTitle = "Edit Column"
modal = Modal { modalContent, modalFooter, modalCloseUrl, modalTitle }
typeSelector :: Maybe PostgresType -> [Text] -> Html
typeSelector postgresType enumNames = [hsx|
|]
where
isSelected :: Maybe Text
isSelected = fmap Compiler.compilePostgresType postgresType
renderEnumType enum = option isSelected enum enum
option :: Maybe Text -> Text -> Text -> Html
option selected value text = case selected of
Nothing -> [hsx||]
Just selection ->
if selection == value || selection == value <> "[]"
then [hsx||]
else [hsx||]
customenums [] = [hsx| |]
customenums xs = [hsx|
|]
defaultSelector :: Maybe Expression -> Html
defaultSelector defValue = [hsx|
|]
where
suggestedValues = [Nothing, Just (TextExpression ""), Just (VarExpression "NULL"), Just (CallExpression "NOW" [])]
values = if defValue `elem` suggestedValues then suggestedValues else defValue:suggestedValues
renderValue :: Maybe Expression -> Html
renderValue e@(Just expression) = [hsx||]
where
displayedValue = case expression of
TextExpression "" -> "\"\""
_ -> Compiler.compileExpression expression
renderValue Nothing = [hsx||]