mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 19:38:23 +00:00 
			
		
		
		
	Rename project board -> column to make the UI less confusing (#30170)
This PR split the `Board` into two parts. One is the struct has been renamed to `Column` and the second we have a `Template Type`. But to make it easier to review, this PR will not change the database schemas, they are just renames. The database schema changes could be in future PRs. --------- Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: yp05327 <576951401@qq.com>
This commit is contained in:
		| @@ -34,7 +34,7 @@ const ( | ||||
| // MustEnableProjects check if projects are enabled in settings | ||||
| func MustEnableProjects(ctx *context.Context) { | ||||
| 	if unit.TypeProjects.UnitGlobalDisabled() { | ||||
| 		ctx.NotFound("EnableKanbanBoard", nil) | ||||
| 		ctx.NotFound("EnableProjects", nil) | ||||
| 		return | ||||
| 	} | ||||
| } | ||||
| @@ -42,7 +42,7 @@ func MustEnableProjects(ctx *context.Context) { | ||||
| // Projects renders the home page of projects | ||||
| func Projects(ctx *context.Context) { | ||||
| 	shared_user.PrepareContextForProfileBigAvatar(ctx) | ||||
| 	ctx.Data["Title"] = ctx.Tr("repo.project_board") | ||||
| 	ctx.Data["Title"] = ctx.Tr("repo.projects") | ||||
|  | ||||
| 	sortType := ctx.FormTrim("sort") | ||||
|  | ||||
| @@ -139,7 +139,7 @@ func canWriteProjects(ctx *context.Context) bool { | ||||
| // RenderNewProject render creating a project page | ||||
| func RenderNewProject(ctx *context.Context) { | ||||
| 	ctx.Data["Title"] = ctx.Tr("repo.projects.new") | ||||
| 	ctx.Data["BoardTypes"] = project_model.GetBoardConfig() | ||||
| 	ctx.Data["TemplateConfigs"] = project_model.GetTemplateConfigs() | ||||
| 	ctx.Data["CardTypes"] = project_model.GetCardConfig() | ||||
| 	ctx.Data["CanWriteProjects"] = canWriteProjects(ctx) | ||||
| 	ctx.Data["PageIsViewProjects"] = true | ||||
| @@ -168,12 +168,12 @@ func NewProjectPost(ctx *context.Context) { | ||||
| 	} | ||||
|  | ||||
| 	newProject := project_model.Project{ | ||||
| 		OwnerID:     ctx.ContextUser.ID, | ||||
| 		Title:       form.Title, | ||||
| 		Description: form.Content, | ||||
| 		CreatorID:   ctx.Doer.ID, | ||||
| 		BoardType:   form.BoardType, | ||||
| 		CardType:    form.CardType, | ||||
| 		OwnerID:      ctx.ContextUser.ID, | ||||
| 		Title:        form.Title, | ||||
| 		Description:  form.Content, | ||||
| 		CreatorID:    ctx.Doer.ID, | ||||
| 		TemplateType: form.TemplateType, | ||||
| 		CardType:     form.CardType, | ||||
| 	} | ||||
|  | ||||
| 	if ctx.ContextUser.IsOrganization() { | ||||
| @@ -314,7 +314,7 @@ func EditProjectPost(ctx *context.Context) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ViewProject renders the project board for a project | ||||
| // ViewProject renders the project with board view for a project | ||||
| func ViewProject(ctx *context.Context) { | ||||
| 	project, err := project_model.GetProjectByID(ctx, ctx.ParamsInt64(":id")) | ||||
| 	if err != nil { | ||||
| @@ -326,15 +326,15 @@ func ViewProject(ctx *context.Context) { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	boards, err := project.GetBoards(ctx) | ||||
| 	columns, err := project.GetColumns(ctx) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("GetProjectBoards", err) | ||||
| 		ctx.ServerError("GetProjectColumns", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	issuesMap, err := issues_model.LoadIssuesFromBoardList(ctx, boards) | ||||
| 	issuesMap, err := issues_model.LoadIssuesFromColumnList(ctx, columns) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("LoadIssuesOfBoards", err) | ||||
| 		ctx.ServerError("LoadIssuesOfColumns", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| @@ -377,7 +377,7 @@ func ViewProject(ctx *context.Context) { | ||||
| 	ctx.Data["CanWriteProjects"] = canWriteProjects(ctx) | ||||
| 	ctx.Data["Project"] = project | ||||
| 	ctx.Data["IssuesMap"] = issuesMap | ||||
| 	ctx.Data["Columns"] = boards // TODO: rename boards to columns in backend | ||||
| 	ctx.Data["Columns"] = columns | ||||
| 	shared_user.RenderUserHeader(ctx) | ||||
|  | ||||
| 	err = shared_user.LoadHeaderCount(ctx) | ||||
| @@ -389,8 +389,8 @@ func ViewProject(ctx *context.Context) { | ||||
| 	ctx.HTML(http.StatusOK, tplProjectsView) | ||||
| } | ||||
|  | ||||
| // DeleteProjectBoard allows for the deletion of a project board | ||||
| func DeleteProjectBoard(ctx *context.Context) { | ||||
| // DeleteProjectColumn allows for the deletion of a project column | ||||
| func DeleteProjectColumn(ctx *context.Context) { | ||||
| 	if ctx.Doer == nil { | ||||
| 		ctx.JSON(http.StatusForbidden, map[string]string{ | ||||
| 			"message": "Only signed in users are allowed to perform this action.", | ||||
| @@ -404,36 +404,36 @@ func DeleteProjectBoard(ctx *context.Context) { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	pb, err := project_model.GetBoard(ctx, ctx.ParamsInt64(":boardID")) | ||||
| 	pb, err := project_model.GetColumn(ctx, ctx.ParamsInt64(":columnID")) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("GetProjectBoard", err) | ||||
| 		ctx.ServerError("GetProjectColumn", err) | ||||
| 		return | ||||
| 	} | ||||
| 	if pb.ProjectID != ctx.ParamsInt64(":id") { | ||||
| 		ctx.JSON(http.StatusUnprocessableEntity, map[string]string{ | ||||
| 			"message": fmt.Sprintf("ProjectBoard[%d] is not in Project[%d] as expected", pb.ID, project.ID), | ||||
| 			"message": fmt.Sprintf("ProjectColumn[%d] is not in Project[%d] as expected", pb.ID, project.ID), | ||||
| 		}) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if project.OwnerID != ctx.ContextUser.ID { | ||||
| 		ctx.JSON(http.StatusUnprocessableEntity, map[string]string{ | ||||
| 			"message": fmt.Sprintf("ProjectBoard[%d] is not in Owner[%d] as expected", pb.ID, ctx.ContextUser.ID), | ||||
| 			"message": fmt.Sprintf("ProjectColumn[%d] is not in Owner[%d] as expected", pb.ID, ctx.ContextUser.ID), | ||||
| 		}) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if err := project_model.DeleteBoardByID(ctx, ctx.ParamsInt64(":boardID")); err != nil { | ||||
| 		ctx.ServerError("DeleteProjectBoardByID", err) | ||||
| 	if err := project_model.DeleteColumnByID(ctx, ctx.ParamsInt64(":columnID")); err != nil { | ||||
| 		ctx.ServerError("DeleteProjectColumnByID", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.JSONOK() | ||||
| } | ||||
|  | ||||
| // AddBoardToProjectPost allows a new board to be added to a project. | ||||
| func AddBoardToProjectPost(ctx *context.Context) { | ||||
| 	form := web.GetForm(ctx).(*forms.EditProjectBoardForm) | ||||
| // AddColumnToProjectPost allows a new column to be added to a project. | ||||
| func AddColumnToProjectPost(ctx *context.Context) { | ||||
| 	form := web.GetForm(ctx).(*forms.EditProjectColumnForm) | ||||
|  | ||||
| 	project, err := project_model.GetProjectByID(ctx, ctx.ParamsInt64(":id")) | ||||
| 	if err != nil { | ||||
| @@ -441,21 +441,21 @@ func AddBoardToProjectPost(ctx *context.Context) { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if err := project_model.NewBoard(ctx, &project_model.Board{ | ||||
| 	if err := project_model.NewColumn(ctx, &project_model.Column{ | ||||
| 		ProjectID: project.ID, | ||||
| 		Title:     form.Title, | ||||
| 		Color:     form.Color, | ||||
| 		CreatorID: ctx.Doer.ID, | ||||
| 	}); err != nil { | ||||
| 		ctx.ServerError("NewProjectBoard", err) | ||||
| 		ctx.ServerError("NewProjectColumn", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.JSONOK() | ||||
| } | ||||
|  | ||||
| // CheckProjectBoardChangePermissions check permission | ||||
| func CheckProjectBoardChangePermissions(ctx *context.Context) (*project_model.Project, *project_model.Board) { | ||||
| // CheckProjectColumnChangePermissions check permission | ||||
| func CheckProjectColumnChangePermissions(ctx *context.Context) (*project_model.Project, *project_model.Column) { | ||||
| 	if ctx.Doer == nil { | ||||
| 		ctx.JSON(http.StatusForbidden, map[string]string{ | ||||
| 			"message": "Only signed in users are allowed to perform this action.", | ||||
| @@ -469,62 +469,60 @@ func CheckProjectBoardChangePermissions(ctx *context.Context) (*project_model.Pr | ||||
| 		return nil, nil | ||||
| 	} | ||||
|  | ||||
| 	board, err := project_model.GetBoard(ctx, ctx.ParamsInt64(":boardID")) | ||||
| 	column, err := project_model.GetColumn(ctx, ctx.ParamsInt64(":columnID")) | ||||
| 	if err != nil { | ||||
| 		ctx.ServerError("GetProjectBoard", err) | ||||
| 		ctx.ServerError("GetProjectColumn", err) | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 	if board.ProjectID != ctx.ParamsInt64(":id") { | ||||
| 	if column.ProjectID != ctx.ParamsInt64(":id") { | ||||
| 		ctx.JSON(http.StatusUnprocessableEntity, map[string]string{ | ||||
| 			"message": fmt.Sprintf("ProjectBoard[%d] is not in Project[%d] as expected", board.ID, project.ID), | ||||
| 			"message": fmt.Sprintf("ProjectColumn[%d] is not in Project[%d] as expected", column.ID, project.ID), | ||||
| 		}) | ||||
| 		return nil, nil | ||||
| 	} | ||||
|  | ||||
| 	if project.OwnerID != ctx.ContextUser.ID { | ||||
| 		ctx.JSON(http.StatusUnprocessableEntity, map[string]string{ | ||||
| 			"message": fmt.Sprintf("ProjectBoard[%d] is not in Repository[%d] as expected", board.ID, project.ID), | ||||
| 			"message": fmt.Sprintf("ProjectColumn[%d] is not in Repository[%d] as expected", column.ID, project.ID), | ||||
| 		}) | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 	return project, board | ||||
| 	return project, column | ||||
| } | ||||
|  | ||||
| // EditProjectBoard allows a project board's to be updated | ||||
| func EditProjectBoard(ctx *context.Context) { | ||||
| 	form := web.GetForm(ctx).(*forms.EditProjectBoardForm) | ||||
| 	_, board := CheckProjectBoardChangePermissions(ctx) | ||||
| // EditProjectColumn allows a project column's to be updated | ||||
| func EditProjectColumn(ctx *context.Context) { | ||||
| 	form := web.GetForm(ctx).(*forms.EditProjectColumnForm) | ||||
| 	_, column := CheckProjectColumnChangePermissions(ctx) | ||||
| 	if ctx.Written() { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if form.Title != "" { | ||||
| 		board.Title = form.Title | ||||
| 		column.Title = form.Title | ||||
| 	} | ||||
|  | ||||
| 	board.Color = form.Color | ||||
|  | ||||
| 	column.Color = form.Color | ||||
| 	if form.Sorting != 0 { | ||||
| 		board.Sorting = form.Sorting | ||||
| 		column.Sorting = form.Sorting | ||||
| 	} | ||||
|  | ||||
| 	if err := project_model.UpdateBoard(ctx, board); err != nil { | ||||
| 		ctx.ServerError("UpdateProjectBoard", err) | ||||
| 	if err := project_model.UpdateColumn(ctx, column); err != nil { | ||||
| 		ctx.ServerError("UpdateProjectColumn", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	ctx.JSONOK() | ||||
| } | ||||
|  | ||||
| // SetDefaultProjectBoard set default board for uncategorized issues/pulls | ||||
| func SetDefaultProjectBoard(ctx *context.Context) { | ||||
| 	project, board := CheckProjectBoardChangePermissions(ctx) | ||||
| // SetDefaultProjectColumn set default column for uncategorized issues/pulls | ||||
| func SetDefaultProjectColumn(ctx *context.Context) { | ||||
| 	project, column := CheckProjectColumnChangePermissions(ctx) | ||||
| 	if ctx.Written() { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if err := project_model.SetDefaultBoard(ctx, project.ID, board.ID); err != nil { | ||||
| 		ctx.ServerError("SetDefaultBoard", err) | ||||
| 	if err := project_model.SetDefaultColumn(ctx, project.ID, column.ID); err != nil { | ||||
| 		ctx.ServerError("SetDefaultColumn", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| @@ -550,14 +548,14 @@ func MoveIssues(ctx *context.Context) { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	board, err := project_model.GetBoard(ctx, ctx.ParamsInt64(":boardID")) | ||||
| 	column, err := project_model.GetColumn(ctx, ctx.ParamsInt64(":columnID")) | ||||
| 	if err != nil { | ||||
| 		ctx.NotFoundOrServerError("GetProjectBoard", project_model.IsErrProjectBoardNotExist, err) | ||||
| 		ctx.NotFoundOrServerError("GetProjectColumn", project_model.IsErrProjectColumnNotExist, err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	if board.ProjectID != project.ID { | ||||
| 		ctx.NotFound("BoardNotInProject", nil) | ||||
| 	if column.ProjectID != project.ID { | ||||
| 		ctx.NotFound("ColumnNotInProject", nil) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| @@ -602,8 +600,8 @@ func MoveIssues(ctx *context.Context) { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if err = project_model.MoveIssuesOnProjectBoard(ctx, board, sortedIssueIDs); err != nil { | ||||
| 		ctx.ServerError("MoveIssuesOnProjectBoard", err) | ||||
| 	if err = project_model.MoveIssuesOnProjectColumn(ctx, column, sortedIssueIDs); err != nil { | ||||
| 		ctx.ServerError("MoveIssuesOnProjectColumn", err) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user