module IHP.IDE.SchemaDesigner.View.Columns.EditForeignKey where import IHP.ViewPrelude import IHP.IDE.SchemaDesigner.Types import IHP.IDE.ToolServer.Types import IHP.IDE.SchemaDesigner.View.Layout data EditForeignKeyView = EditForeignKeyView { EditForeignKeyView -> [Statement] statements :: [Statement] , EditForeignKeyView -> Text tableName :: Text , EditForeignKeyView -> Text columnName :: Text , EditForeignKeyView -> [Text] tableNames :: [Text] , EditForeignKeyView -> Text referenceTable :: Text , EditForeignKeyView -> Text constraintName :: Text , EditForeignKeyView -> Text onDelete :: Text } instance View EditForeignKeyView where html :: (?context::ControllerContext, ?view::EditForeignKeyView) => EditForeignKeyView -> Html html EditForeignKeyView { [Text] [Statement] Text $sel:statements:EditForeignKeyView :: EditForeignKeyView -> [Statement] $sel:tableName:EditForeignKeyView :: EditForeignKeyView -> Text $sel:columnName:EditForeignKeyView :: EditForeignKeyView -> Text $sel:tableNames:EditForeignKeyView :: EditForeignKeyView -> [Text] $sel:referenceTable:EditForeignKeyView :: EditForeignKeyView -> Text $sel:constraintName:EditForeignKeyView :: EditForeignKeyView -> Text $sel:onDelete:EditForeignKeyView :: EditForeignKeyView -> Text statements :: [Statement] tableName :: Text columnName :: Text tableNames :: [Text] referenceTable :: Text constraintName :: Text onDelete :: Text .. } = [hsx| <div class="row no-gutters bg-white" id="schema-designer-viewer"> {renderObjectSelector (zip [0..] statements) (Just tableName)} {renderColumnSelector tableName (zip [0..] columns) statements} </div> {migrationStatus} {renderModal modal} |] where table :: Maybe Statement table = Text -> [Statement] -> Maybe Statement forall {t :: * -> *}. Foldable t => Text -> t Statement -> Maybe Statement findStatementByName Text tableName [Statement] statements columns :: [Column] columns = [Column] -> (Statement -> [Column]) -> Maybe Statement -> [Column] forall b a. b -> (a -> b) -> Maybe a -> b maybe [] ((.columns) (CreateTable -> [Column]) -> (Statement -> CreateTable) -> Statement -> [Column] forall b c a. (b -> c) -> (a -> b) -> a -> c forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . Statement -> CreateTable unsafeGetCreateTable) Maybe Statement table modalContent :: Html modalContent = [hsx| <form method="POST" action={UpdateForeignKeyAction}> <input type="hidden" name="tableName" value={tableName}/> <input type="hidden" name="columnName" value={columnName}/> <div class="form-group row"> <label class="col-sm-2 col-form-label">Reference Table:</label> <div class="col-sm-10"> <select name="referenceTable" class="form-control select2" autofocus="autofocus"> {forEach tableNames renderTableNameSelector} </select> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Name:</label> <div class="col-sm-10"> <input name="constraintName" type="text" class="form-control" value={constraintName}/> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">On Delete:</label> <div class="col-sm-10"> <select name="onDelete" class="form-control select2"> {onDeleteSelector "NoAction"} {onDeleteSelector "Restrict"} {onDeleteSelector "SetNull"} {onDeleteSelector "SetDefault"} {onDeleteSelector "Cascade"} </select> </div> </div> <div class="text-right"> <button type="submit" class="btn btn-primary">Edit Constraint</button> </div> </form> {select2} |] where renderTableNameSelector :: Text -> Html renderTableNameSelector Text tableName = if Text tableName Text -> Text -> Bool forall a. Eq a => a -> a -> Bool == Text referenceTable then String -> Html forall a. ToMarkup a => a -> Html preEscapedToHtml [plain|<option selected>#{tableName}</option>|] else String -> Html forall a. ToMarkup a => a -> Html preEscapedToHtml [plain|<option>#{tableName}</option>|] onDeleteSelector :: Text -> Html onDeleteSelector Text option = if Text option Text -> Text -> Bool forall a. Eq a => a -> a -> Bool == Text onDelete then String -> Html forall a. ToMarkup a => a -> Html preEscapedToHtml [plain|<option selected>#{option}</option>|] else String -> Html forall a. ToMarkup a => a -> Html preEscapedToHtml [plain|<option>#{option}</option>|] select2 :: Html select2 = String -> Html forall a. ToMarkup a => a -> Html preEscapedToHtml [plain| <script> $('.select2').select2(); </script> |] modalFooter :: Maybe Html modalFooter = Maybe Html forall a. Monoid a => a mempty modalCloseUrl :: Text modalCloseUrl = TablesController -> Text forall controller. HasPath controller => controller -> Text pathTo ShowTableAction { Text tableName :: Text $sel:tableName:TablesAction :: Text tableName } modalTitle :: Text modalTitle = Text "Edit Foreign Key Constraint" modal :: Modal modal = Modal { Html modalContent :: Html $sel:modalContent:Modal :: Html modalContent, Maybe Html modalFooter :: Maybe Html $sel:modalFooter:Modal :: Maybe Html modalFooter, Text modalCloseUrl :: Text $sel:modalCloseUrl:Modal :: Text modalCloseUrl, Text modalTitle :: Text $sel:modalTitle:Modal :: Text modalTitle }