diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 96e28fe87a..f168334d9d 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1261,6 +1261,8 @@ projects.column.new_submit = "Create Column" projects.column.new = "New Column" projects.column.set_default = "Set Default" projects.column.set_default_desc = "Set this column as default for uncategorized issues and pulls" +projects.column.unset_default = "Unset Default" +projects.column.unset_default_desc = "Unset this column as default" projects.column.delete = "Delete Column" projects.column.deletion_desc = "Deleting a project column moves all related issues to 'Uncategorized'. Continue?" projects.column.color = "Color" diff --git a/routers/web/org/projects.go b/routers/web/org/projects.go index ed6a2e645f..37212179c9 100644 --- a/routers/web/org/projects.go +++ b/routers/web/org/projects.go @@ -610,6 +610,23 @@ func SetDefaultProjectBoard(ctx *context.Context) { }) } +// UnsetDefaultProjectBoard unset default board for uncategorized issues/pulls +func UnsetDefaultProjectBoard(ctx *context.Context) { + project, _ := CheckProjectBoardChangePermissions(ctx) + if ctx.Written() { + return + } + + if err := project_model.SetDefaultBoard(project.ID, 0); err != nil { + ctx.ServerError("SetDefaultBoard", err) + return + } + + ctx.JSON(http.StatusOK, map[string]interface{}{ + "ok": true, + }) +} + // MoveIssues moves or keeps issues in a column and sorts them inside that column func MoveIssues(ctx *context.Context) { if ctx.Doer == nil { diff --git a/routers/web/repo/projects.go b/routers/web/repo/projects.go index cef6893fbd..72f83f8b31 100644 --- a/routers/web/repo/projects.go +++ b/routers/web/repo/projects.go @@ -576,6 +576,23 @@ func SetDefaultProjectBoard(ctx *context.Context) { }) } +// UnSetDefaultProjectBoard unset default board for uncategorized issues/pulls +func UnSetDefaultProjectBoard(ctx *context.Context) { + project, _ := checkProjectBoardChangePermissions(ctx) + if ctx.Written() { + return + } + + if err := project_model.SetDefaultBoard(project.ID, 0); err != nil { + ctx.ServerError("SetDefaultBoard", err) + return + } + + ctx.JSON(http.StatusOK, map[string]interface{}{ + "ok": true, + }) +} + // MoveIssues moves or keeps issues in a column and sorts them inside that column func MoveIssues(ctx *context.Context) { if ctx.Doer == nil { diff --git a/routers/web/web.go b/routers/web/web.go index 30a8314691..8f0b0b1f45 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -936,6 +936,7 @@ func RegisterRoutes(m *web.Route) { m.Put("", web.Bind(forms.EditProjectBoardForm{}), org.EditProjectBoard) m.Delete("", org.DeleteProjectBoard) m.Post("/default", org.SetDefaultProjectBoard) + m.Post("/unsetdefault", org.UnsetDefaultProjectBoard) m.Post("/move", org.MoveIssues) }) @@ -1292,6 +1293,7 @@ func RegisterRoutes(m *web.Route) { m.Put("", web.Bind(forms.EditProjectBoardForm{}), repo.EditProjectBoard) m.Delete("", repo.DeleteProjectBoard) m.Post("/default", repo.SetDefaultProjectBoard) + m.Post("/unsetdefault", repo.UnSetDefaultProjectBoard) m.Post("/move", repo.MoveIssues) }) diff --git a/templates/projects/view.tmpl b/templates/projects/view.tmpl index 41bbb83f7b..338524d153 100644 --- a/templates/projects/view.tmpl +++ b/templates/projects/view.tmpl @@ -95,10 +95,25 @@ {{$.locale.Tr "repo.projects.column.edit"}} </a> {{if not .Default}} - <a class="item show-modal button" data-modal="#set-default-project-board-modal-{{.ID}}"> + <a class="item show-modal button default-project-board-show" + data-modal="#default-project-board-modal-{{.ID}}" + data-modal-default-project-board-header="{{$.locale.Tr "repo.projects.column.set_default"}}" + data-modal-default-project-board-content="{{$.locale.Tr "repo.projects.column.set_default_desc"}}" + data-modal-default-project-board-submit="{{$.locale.Tr "repo.projects.column.set_default"}}" + data-url="{{$.Link}}/{{.ID}}/default"> {{svg "octicon-pin"}} {{$.locale.Tr "repo.projects.column.set_default"}} </a> + {{else}} + <a class="item show-modal button default-project-board-show" + data-modal="#default-project-board-modal-{{.ID}}" + data-modal-default-project-board-header="{{$.locale.Tr "repo.projects.column.unset_default"}}" + data-modal-default-project-board-content="{{$.locale.Tr "repo.projects.column.unset_default_desc"}}" + data-modal-default-project-board-submit="{{$.locale.Tr "repo.projects.column.unset_default"}}" + data-url="{{$.Link}}/{{.ID}}/unsetdefault"> + {{svg "octicon-pin"}} + {{$.locale.Tr "repo.projects.column.unset_default"}} + </a> {{end}} <a class="item show-modal button" data-modal="#delete-board-modal-{{.ID}}"> {{svg "octicon-trash"}} @@ -134,18 +149,16 @@ </div> </div> - <div class="ui basic modal" id="set-default-project-board-modal-{{.ID}}"> + <div class="ui basic modal default-project-board-modal" id="default-project-board-modal-{{.ID}}"> <div class="ui icon header"> - {{$.locale.Tr "repo.projects.column.set_default"}} + <span id="default-project-board-header"></span> </div> <div class="content center"> - <label> - {{$.locale.Tr "repo.projects.column.set_default_desc"}} - </label> + <label id="default-project-board-content"></label> </div> <div class="text right actions"> <button class="ui cancel button">{{$.locale.Tr "settings.cancel"}}</button> - <button class="ui primary button set-default-project-board" data-url="{{$.Link}}/{{.ID}}/default">{{$.locale.Tr "repo.projects.column.set_default"}}</button> + <button class="ui primary button default-project-board-button" id="default-project-board-submit"></button> </div> </div> diff --git a/templates/repo/projects/view.tmpl b/templates/repo/projects/view.tmpl index acbd0241d4..2ad40d700a 100644 --- a/templates/repo/projects/view.tmpl +++ b/templates/repo/projects/view.tmpl @@ -99,10 +99,27 @@ {{$.locale.Tr "repo.projects.column.edit"}} </a> {{if not .Default}} - <a class="item show-modal button" data-modal="#set-default-project-board-modal-{{.ID}}"> + <a class="item show-modal button default-project-board-show" + data-modal="#default-project-board-modal-{{.ID}}" + data-modal-default-project-board-header="{{$.locale.Tr "repo.projects.column.set_default"}}" + data-modal-default-project-board-content="{{$.locale.Tr "repo.projects.column.set_default_desc"}}" + data-modal-default-project-board-submit="{{$.locale.Tr "repo.projects.column.set_default"}}" + data-type="set_default" + data-url="{{$.Link}}/{{.ID}}/default"> {{svg "octicon-pin"}} {{$.locale.Tr "repo.projects.column.set_default"}} </a> + {{else}} + <a class="item show-modal button default-project-board-show" + data-modal="#default-project-board-modal-{{.ID}}" + data-modal-default-project-board-header="{{$.locale.Tr "repo.projects.column.unset_default"}}" + data-modal-default-project-board-content="{{$.locale.Tr "repo.projects.column.unset_default_desc"}}" + data-modal-default-project-board-submit="{{$.locale.Tr "repo.projects.column.unset_default"}}" + data-type="unset_default" + data-url="{{$.Link}}/{{.ID}}/unsetdefault"> + {{svg "octicon-pin"}} + {{$.locale.Tr "repo.projects.column.unset_default"}} + </a> {{end}} <a class="item show-modal button" data-modal="#delete-board-modal-{{.ID}}"> {{svg "octicon-trash"}} @@ -138,18 +155,16 @@ </div> </div> - <div class="ui basic modal" id="set-default-project-board-modal-{{.ID}}"> + <div class="ui basic modal default-project-board-modal" id="default-project-board-modal-{{.ID}}"> <div class="ui icon header"> - {{$.locale.Tr "repo.projects.column.set_default"}} + <span id="default-project-board-header"></span> </div> <div class="content center"> - <label> - {{$.locale.Tr "repo.projects.column.set_default_desc"}} - </label> + <label id="default-project-board-content"></label> </div> <div class="text right actions"> <button class="ui cancel button">{{$.locale.Tr "settings.cancel"}}</button> - <button class="ui primary button set-default-project-board" data-url="{{$.RepoLink}}/projects/{{$.Project.ID}}/{{.ID}}/default">{{$.locale.Tr "repo.projects.column.set_default"}}</button> + <button class="ui primary button default-project-board-button" id="default-project-board-submit"></button> </div> </div> diff --git a/web_src/js/features/repo-projects.js b/web_src/js/features/repo-projects.js index a1e177e461..a2679130d7 100644 --- a/web_src/js/features/repo-projects.js +++ b/web_src/js/features/repo-projects.js @@ -126,19 +126,30 @@ export function initRepoProject() { }); }); - $(document).on('click', '.set-default-project-board', async function (e) { - e.preventDefault(); + $('.default-project-board-modal').each(function () { + const boardColumn = $(this).closest('.board-column'); + const showButton = $(boardColumn).find('.default-project-board-show'); + const commitButton = $(this).find('.default-project-board-button'); - await $.ajax({ - method: 'POST', - url: $(this).data('url'), - headers: { - 'X-Csrf-Token': csrfToken, - }, - contentType: 'application/json', + if ($(showButton).data('type') === 'unset_default') { + $(commitButton).removeClass('primary'); + $(commitButton).addClass('red'); + } + + $(commitButton).on('click', (e) => { + e.preventDefault(); + + $.ajax({ + method: 'POST', + url: $(showButton).data('url'), + headers: { + 'X-Csrf-Token': csrfToken, + }, + contentType: 'application/json', + }).done(() => { + window.location.reload(); + }); }); - - window.location.reload(); }); $('.delete-project-board').each(function () {