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|
{typeSelector (Just (column.columnType)) enumNames}
{defaultSelector (column.defaultValue)}
|] 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| {forEach xs renderEnumType} |] 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||]