From 2b37b1094c9ff937a6186d3d4742bfc970c4a12c Mon Sep 17 00:00:00 2001 From: HesterG Date: Mon, 27 Mar 2023 17:05:03 +0800 Subject: [PATCH 01/72] save changes --- modules/structs/miscellaneous.go | 5 +++++ routers/web/repo/issue.go | 28 ++++++++++++++++++++++++++++ routers/web/web.go | 5 ++++- web_src/js/features/common-issue.js | 11 +++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/modules/structs/miscellaneous.go b/modules/structs/miscellaneous.go index 8acea84d6cc17..717c1593559ed 100644 --- a/modules/structs/miscellaneous.go +++ b/modules/structs/miscellaneous.go @@ -77,3 +77,8 @@ type APIError struct { Message string `json:"message"` URL string `json:"url"` } + +type UserSearchResults struct { + OK bool `json:"ok"` + Data []*User `json:"data"` +} diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 3715320f10c84..d87af96b14a6d 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -3300,3 +3300,31 @@ func handleTeamMentions(ctx *context.Context) { ctx.Data["MentionableTeamsOrg"] = ctx.Repo.Owner.Name ctx.Data["MentionableTeamsOrgAvatar"] = ctx.Repo.Owner.AvatarLink(ctx) } + +func IssuePosters(ctx *context.Context) { + fmt.Println("IssuePostersIssuePostersIssuePostersIssuePosters") + var err error + repo := ctx.Repo.Repository + fmt.Println(repo) + isPullList := ctx.Params(":type") == "pulls" + fmt.Println(ctx.Params(":type")) + fmt.Println(isPullList) + isPullOption := util.OptionalBoolOf(isPullList) + posters, err := repo_model.GetIssuePosters(ctx, repo, isPullOption.IsTrue()) + fmt.Println("posters") + fmt.Println(posters) + if err != nil { + ctx.JSON(http.StatusInternalServerError, api.SearchError{ + OK: false, + Error: err.Error(), + }) + return + } + results := make([]*api.User, len(posters)) + fmt.Println("results") + fmt.Println(results) + ctx.JSON(http.StatusOK, api.UserSearchResults{ + OK: true, + Data: results, + }) +} diff --git a/routers/web/web.go b/routers/web/web.go index 4bd2f76c571f1..9a6dbb55e1dd9 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1227,7 +1227,10 @@ func RegisterRoutes(m *web.Route) { m.Group("/{username}/{reponame}", func() { m.Group("", func() { - m.Get("/{type:issues|pulls}", repo.Issues) + m.Group("/{type:issues|pulls}", func() { + m.Get("", repo.Issues) + m.Get("/posters", repo.IssuePosters) + }) m.Get("/{type:issues|pulls}/{index}", repo.ViewIssue) m.Group("/{type:issues|pulls}/{index}/content-history", func() { m.Get("/overview", repo.GetContentHistoryOverview) diff --git a/web_src/js/features/common-issue.js b/web_src/js/features/common-issue.js index ebc851d676336..92ef8a3d4813d 100644 --- a/web_src/js/features/common-issue.js +++ b/web_src/js/features/common-issue.js @@ -2,7 +2,17 @@ import $ from 'jquery'; import {updateIssuesMeta} from './repo-issue.js'; import {toggleElem} from '../utils/dom.js'; +async function fetchData() { + const res = await fetch("/hester/testRepo/issues/posters", { + method: 'GET' + }); + const json = await res.json(); + console.log(res) + console.log(json) +} + export function initCommonIssue() { + console.log('initCommonIssue') const $issueSelectAllWrapper = $('.issue-checkbox-all'); const $issueSelectAll = $('.issue-checkbox-all input'); const $issueCheckboxes = $('.issue-checkbox input'); @@ -24,6 +34,7 @@ export function initCommonIssue() { toggleElem($('#issue-actions'), anyChecked); // there are two panels but only one select-all checkbox, so move the checkbox to the visible panel $('#issue-filters, #issue-actions').filter(':visible').find('.column:first').prepend($issueSelectAllWrapper); + fetchData(); }; $issueCheckboxes.on('change', syncIssueSelectionState); From b7371213831df25d44bcdf897f77ff60ce2c7a5b Mon Sep 17 00:00:00 2001 From: HesterG Date: Tue, 28 Mar 2023 09:31:54 +0800 Subject: [PATCH 02/72] save --- routers/web/repo/issue.go | 34 +++++++++++++++++++++++++++-- web_src/js/features/common-issue.js | 7 +++--- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index d87af96b14a6d..c283e585d267e 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -12,10 +12,12 @@ import ( "math/big" "net/http" "net/url" + "reflect" "sort" "strconv" "strings" "time" + "unsafe" activities_model "code.gitea.io/gitea/models/activities" "code.gitea.io/gitea/models/db" @@ -3301,18 +3303,46 @@ func handleTeamMentions(ctx *context.Context) { ctx.Data["MentionableTeamsOrgAvatar"] = ctx.Repo.Owner.AvatarLink(ctx) } +func printContextInternals(ctx interface{}, inner bool) { + contextValues := reflect.ValueOf(ctx).Elem() + contextKeys := reflect.TypeOf(ctx).Elem() + + if !inner { + fmt.Printf("\nFields for %s.%s\n", contextKeys.PkgPath(), contextKeys.Name()) + } + + if contextKeys.Kind() == reflect.Struct { + for i := 0; i < contextValues.NumField(); i++ { + reflectValue := contextValues.Field(i) + reflectValue = reflect.NewAt(reflectValue.Type(), unsafe.Pointer(reflectValue.UnsafeAddr())).Elem() + + reflectField := contextKeys.Field(i) + + if reflectField.Name == "Context" { + printContextInternals(reflectValue.Interface(), true) + } else { + fmt.Printf("field name: %+v\n", reflectField.Name) + fmt.Printf("value: %+v\n", reflectValue.Interface()) + } + } + } else { + fmt.Printf("context is empty (int)\n") + } +} + func IssuePosters(ctx *context.Context) { fmt.Println("IssuePostersIssuePostersIssuePostersIssuePosters") var err error repo := ctx.Repo.Repository - fmt.Println(repo) + // fmt.Println(repo) + printContextInternals(ctx, true) isPullList := ctx.Params(":type") == "pulls" fmt.Println(ctx.Params(":type")) fmt.Println(isPullList) isPullOption := util.OptionalBoolOf(isPullList) posters, err := repo_model.GetIssuePosters(ctx, repo, isPullOption.IsTrue()) fmt.Println("posters") - fmt.Println(posters) + // fmt.Println(posters) if err != nil { ctx.JSON(http.StatusInternalServerError, api.SearchError{ OK: false, diff --git a/web_src/js/features/common-issue.js b/web_src/js/features/common-issue.js index 92ef8a3d4813d..ae240cedc1430 100644 --- a/web_src/js/features/common-issue.js +++ b/web_src/js/features/common-issue.js @@ -3,7 +3,8 @@ import {updateIssuesMeta} from './repo-issue.js'; import {toggleElem} from '../utils/dom.js'; async function fetchData() { - const res = await fetch("/hester/testRepo/issues/posters", { + console.log('fetch Data') + const res = await fetch('/hester/testRepo/issues/posters', { method: 'GET' }); const json = await res.json(); @@ -12,7 +13,8 @@ async function fetchData() { } export function initCommonIssue() { - console.log('initCommonIssue') + console.log('initCommonIssue'); + fetchData(); const $issueSelectAllWrapper = $('.issue-checkbox-all'); const $issueSelectAll = $('.issue-checkbox-all input'); const $issueCheckboxes = $('.issue-checkbox input'); @@ -34,7 +36,6 @@ export function initCommonIssue() { toggleElem($('#issue-actions'), anyChecked); // there are two panels but only one select-all checkbox, so move the checkbox to the visible panel $('#issue-filters, #issue-actions').filter(':visible').find('.column:first').prepend($issueSelectAllWrapper); - fetchData(); }; $issueCheckboxes.on('change', syncIssueSelectionState); From 62c030c0536b1b54207d68831fd28ae2e7844da4 Mon Sep 17 00:00:00 2001 From: HesterG Date: Wed, 29 Mar 2023 08:59:16 +0800 Subject: [PATCH 03/72] save changes --- modules/structs/miscellaneous.go | 5 --- modules/structs/user.go | 12 +++++++ routers/web/repo/issue.go | 50 ++++++++++++++--------------- services/convert/user.go | 13 ++++++++ templates/repo/issue/list.tmpl | 11 ++++--- web_src/js/features/common-issue.js | 12 ------- web_src/js/features/repo-issue.js | 49 ++++++++++++++++++++++++++++ 7 files changed, 104 insertions(+), 48 deletions(-) diff --git a/modules/structs/miscellaneous.go b/modules/structs/miscellaneous.go index 717c1593559ed..8acea84d6cc17 100644 --- a/modules/structs/miscellaneous.go +++ b/modules/structs/miscellaneous.go @@ -77,8 +77,3 @@ type APIError struct { Message string `json:"message"` URL string `json:"url"` } - -type UserSearchResults struct { - OK bool `json:"ok"` - Data []*User `json:"data"` -} diff --git a/modules/structs/user.go b/modules/structs/user.go index f68b92ac069e2..c41c16ae8722d 100644 --- a/modules/structs/user.go +++ b/modules/structs/user.go @@ -54,6 +54,18 @@ type User struct { StarredRepos int `json:"starred_repos_count"` } +// UserBrief represents user info needed when using search dropdown +type UserBrief struct { + // the user's id + ID int64 `json:"id"` + // the user's username + UserName string `json:"username"` + // URL to the user's avatar + AvatarURL string `json:"avatar_url"` + // the user's full name + FullName string `json:"full_name"` +} + // MarshalJSON implements the json.Marshaler interface for User, adding field(s) for backward compatibility func (u User) MarshalJSON() ([]byte, error) { // Re-declaring User to avoid recursion diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index c283e585d267e..258b14deaafec 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -311,11 +311,11 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti return } - ctx.Data["Posters"], err = repo_model.GetIssuePosters(ctx, repo, isPullOption.IsTrue()) - if err != nil { - ctx.ServerError("GetIssuePosters", err) - return - } + // ctx.Data["Posters"], err = repo_model.GetIssuePosters(ctx, repo, isPullOption.IsTrue()) + // if err != nil { + // ctx.ServerError("GetIssuePosters", err) + // return + // } handleTeamMentions(ctx) if ctx.Written() { @@ -3331,30 +3331,28 @@ func printContextInternals(ctx interface{}, inner bool) { } func IssuePosters(ctx *context.Context) { - fmt.Println("IssuePostersIssuePostersIssuePostersIssuePosters") - var err error repo := ctx.Repo.Repository - // fmt.Println(repo) printContextInternals(ctx, true) isPullList := ctx.Params(":type") == "pulls" - fmt.Println(ctx.Params(":type")) - fmt.Println(isPullList) isPullOption := util.OptionalBoolOf(isPullList) - posters, err := repo_model.GetIssuePosters(ctx, repo, isPullOption.IsTrue()) - fmt.Println("posters") - // fmt.Println(posters) - if err != nil { - ctx.JSON(http.StatusInternalServerError, api.SearchError{ - OK: false, - Error: err.Error(), - }) - return + var allPosters []*user_model.User + for i := 1; i < 200; i++ { + var err error + posters, err := repo_model.GetIssuePosters(ctx, repo, isPullOption.IsTrue()) + if err != nil { + ctx.JSON(http.StatusInternalServerError, api.SearchError{ + OK: false, + Error: err.Error(), + }) + return + } + allPosters = append(allPosters, posters...) } - results := make([]*api.User, len(posters)) - fmt.Println("results") - fmt.Println(results) - ctx.JSON(http.StatusOK, api.UserSearchResults{ - OK: true, - Data: results, - }) + + results := make([]*api.UserBrief, len(allPosters)) + for i, poster := range allPosters { + results[i] = convert.ToUserBrief(ctx, poster) + } + // fmt.Println(results) + ctx.JSON(http.StatusOK, results) } diff --git a/services/convert/user.go b/services/convert/user.go index 79fcba0176f9a..d169c62a77ed5 100644 --- a/services/convert/user.go +++ b/services/convert/user.go @@ -26,6 +26,19 @@ func ToUser(ctx context.Context, user, doer *user_model.User) *api.User { return toUser(ctx, user, signed, authed) } +func ToUserBrief(ctx context.Context, user *user_model.User) *api.UserBrief { + if user == nil { + return nil + } + result := &api.UserBrief{ + ID: user.ID, + UserName: user.Name, + FullName: user.FullName, + AvatarURL: user.AvatarLink(ctx), + } + return result +} + // ToUsers convert list of user_model.User to list of api.User func ToUsers(ctx context.Context, doer *user_model.User, users []*user_model.User) []*api.User { result := make([]*api.User, len(users)) diff --git a/templates/repo/issue/list.tmpl b/templates/repo/issue/list.tmpl index 38ed3873ba4c8..c3c3c89684f4f 100644 --- a/templates/repo/issue/list.tmpl +++ b/templates/repo/issue/list.tmpl @@ -119,22 +119,23 @@ - + + - diff --git a/web_src/js/features/repo-common.js b/web_src/js/features/repo-common.js index e7728faf2b4cb..62ba3be0140db 100644 --- a/web_src/js/features/repo-common.js +++ b/web_src/js/features/repo-common.js @@ -133,7 +133,7 @@ export async function initPostersDropdown() { const {id, avatar_url, username, full_name} = postersJson[i]; const $a = document.createElement('a'); setAttributes($a, { - 'class': `item gt-df poster-item${posterID === id ? ' active selected' : ''}`, + 'class': `item gt-df poster-item${+posterID === id ? ' active selected' : ''}`, 'href': `${posterGeneralHref}${id}`, }); const $img = document.createElement('img'); @@ -158,7 +158,29 @@ export async function initPostersDropdown() { posterList.appendChild($a); } delete $('#author-search')[0]['_giteaAriaPatchDropdown']; - $('#author-search').dropdown(); + $('#author-search').dropdown({ + fullTextSearch: 'exact', + selectOnKeydown: false, + action: 'hide', + onShow() { + // hide associated tooltip while dropdown is open + this._tippy?.hide(); + this._tippy?.disable(); + }, + onHide() { + this._tippy?.enable(); + + // hide all tippy elements of items after a while. eg: use Enter to click "Copy Link" in the Issue Context Menu + setTimeout(() => { + const $dropdown = $(this); + if ($dropdown.dropdown('is hidden')) { + $(this).find('.menu > .item').each((_, item) => { + item._tippy?.hide(); + }); + } + }, 2000); + }, + }); } } @@ -171,10 +193,12 @@ export async function initPostersDropdownTest() { const url = $autherSearch.getAttribute('data-url'); const posterID = $autherSearch.getAttribute('data-poster-id'); const isShowFullName = $autherSearch.getAttribute('data-show-fullname'); - const posterGeneralHref = $autherSearch.getAttribute('data-general-poster-href'); + const noFilterUrl = $autherSearch.getAttribute('data-no-filter-url'); + const posterGeneralUrl = $autherSearch.getAttribute('data-general-poster-url'); + const noSelectText = $autherSearch.getAttribute('data-no-select-text'); const posterList = document.querySelector('.poster-list'); - console.log('url', `${appSubUrl}${url}`) $('#author-search-1').dropdown({ + selectOnKeydown: false, apiSettings: { fullTextSearch: 'exact', saveRemoteData: false, @@ -183,16 +207,22 @@ export async function initPostersDropdownTest() { onResponse(response) { console.log(response) const formattedResponse = {success: true, results: []}; + formattedResponse.results.push({ + name: `${noSelectText}`, + value: '000', + }) + // Parse the response from the api to work with our dropdown $.each(response, (_, poster) => { const {id, avatar_url, username, full_name} = poster; console.log(poster) formattedResponse.results.push({ - name: ` + name: ` ${username}${isShowFullName === 'true' ? ` ${full_name}`: ''} - `, + `, value: id, + class: `item gt-df${posterID === id ? ' active selected' : ''}` }); }); return formattedResponse; @@ -200,8 +230,10 @@ export async function initPostersDropdownTest() { cache: false, }, // fields: { - // the remote api has a different structure than expected, which we can adjust - // remoteValues: 'item' + // // the remote api has a different structure than expected, which we can adjust + // remoteValues: 'posters' // } }); } + +// href="${posterGeneralUrl}${id}" \ No newline at end of file diff --git a/web_src/js/index.js b/web_src/js/index.js index 3e29380c3a2e4..052742a71221f 100644 --- a/web_src/js/index.js +++ b/web_src/js/index.js @@ -185,7 +185,7 @@ $(document).ready(() => { initRepoWikiForm(); initRepository(); initRepositoryActionView(); - // initPostersDropdown(); + initPostersDropdown(); initPostersDropdownTest(); initCommitStatuses(); From e94588ff1a1fa1c8e07a9bd5e8df1fa13e51a053 Mon Sep 17 00:00:00 2001 From: HesterG Date: Wed, 29 Mar 2023 17:59:11 +0800 Subject: [PATCH 10/72] fomantic dropdown demo --- web_src/js/features/repo-common.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/web_src/js/features/repo-common.js b/web_src/js/features/repo-common.js index 62ba3be0140db..009c7c5ec8df2 100644 --- a/web_src/js/features/repo-common.js +++ b/web_src/js/features/repo-common.js @@ -217,12 +217,12 @@ export async function initPostersDropdownTest() { const {id, avatar_url, username, full_name} = poster; console.log(poster) formattedResponse.results.push({ - name: ` + name: ` ${username}${isShowFullName === 'true' ? ` ${full_name}`: ''} + `, value: id, - class: `item gt-df${posterID === id ? ' active selected' : ''}` }); }); return formattedResponse; @@ -235,5 +235,3 @@ export async function initPostersDropdownTest() { // } }); } - -// href="${posterGeneralUrl}${id}" \ No newline at end of file From f45d666d99f781b92c4d9a5e65c280fb883e2b5a Mon Sep 17 00:00:00 2001 From: HesterG Date: Wed, 29 Mar 2023 18:03:56 +0800 Subject: [PATCH 11/72] comment --- web_src/js/features/repo-common.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web_src/js/features/repo-common.js b/web_src/js/features/repo-common.js index 009c7c5ec8df2..2ae4987ce3e4a 100644 --- a/web_src/js/features/repo-common.js +++ b/web_src/js/features/repo-common.js @@ -108,6 +108,7 @@ export function initRepoCommonLanguageStats() { } } +// native js approach export async function initPostersDropdown() { console.log('fetch posters data'); const $autherSearch = document.getElementById('author-search'); @@ -184,6 +185,7 @@ export async function initPostersDropdown() { } } +// fomantic dropdown approach export async function initPostersDropdownTest() { console.log('fetch posters data 1'); const $autherSearch = document.getElementById('author-search-1'); From 37e82feecde96cee556195cd70a21c28c4ad4386 Mon Sep 17 00:00:00 2001 From: HesterG Date: Wed, 29 Mar 2023 18:16:39 +0800 Subject: [PATCH 12/72] comment --- web_src/js/features/repo-common.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web_src/js/features/repo-common.js b/web_src/js/features/repo-common.js index 2ae4987ce3e4a..1c69be6f0690e 100644 --- a/web_src/js/features/repo-common.js +++ b/web_src/js/features/repo-common.js @@ -109,6 +109,7 @@ export function initRepoCommonLanguageStats() { } // native js approach +// generate dropdown options using fetched data (posters) export async function initPostersDropdown() { console.log('fetch posters data'); const $autherSearch = document.getElementById('author-search'); @@ -186,6 +187,7 @@ export async function initPostersDropdown() { } // fomantic dropdown approach +// generate dropdown options using fetched data (posters) export async function initPostersDropdownTest() { console.log('fetch posters data 1'); const $autherSearch = document.getElementById('author-search-1'); From fefb59ecffb1d20c56d7007ad9ffecc0db8ac954 Mon Sep 17 00:00:00 2001 From: HesterG Date: Thu, 30 Mar 2023 14:56:14 +0800 Subject: [PATCH 13/72] use dropdown setting --- templates/repo/issue/list.tmpl | 28 +----- web_src/js/features/repo-common.js | 139 +++++------------------------ web_src/js/index.js | 1 - 3 files changed, 24 insertions(+), 144 deletions(-) diff --git a/templates/repo/issue/list.tmpl b/templates/repo/issue/list.tmpl index 8b02bc343d3ca..29eea315d77b3 100644 --- a/templates/repo/issue/list.tmpl +++ b/templates/repo/issue/list.tmpl @@ -119,41 +119,19 @@ - - - - - - diff --git a/web_src/js/features/repo-common.js b/web_src/js/features/repo-common.js index a45aed664567c..8a3ea040b0be5 100644 --- a/web_src/js/features/repo-common.js +++ b/web_src/js/features/repo-common.js @@ -1,7 +1,7 @@ import $ from 'jquery'; -import {hideElem, showElem, toggleElem, setAttributes} from '../utils/dom.js'; +import {hideElem, showElem, toggleElem} from '../utils/dom.js'; -const {appSubUrl, csrfToken} = window.config; +const {csrfToken} = window.config; function getArchive($target, url, first) { $.ajax({ @@ -108,11 +108,10 @@ export function initRepoCommonLanguageStats() { } } -// fomantic dropdown approach -// generate dropdown options using fetched data (posters) +// generate dropdown options for authors search dropdown using fetched data export async function initPostersDropdown() { console.log('fetch posters data'); - const $authorSearchDropdown = $('#author-search'); + const $authorSearchDropdown = $('.author-search'); if (!$authorSearchDropdown.length) { return; } diff --git a/web_src/js/index.js b/web_src/js/index.js index e1437bc3818d9..be93335721ef8 100644 --- a/web_src/js/index.js +++ b/web_src/js/index.js @@ -64,7 +64,7 @@ import {initRepoTemplateSearch} from './features/repo-template.js'; import {initRepoCodeView} from './features/repo-code.js'; import {initSshKeyFormParser} from './features/sshkey-helper.js'; import {initUserSettings} from './features/user-settings.js'; -import {initRepoArchiveLinks, initPostersDropdown, initPostersDropdownTest} from './features/repo-common.js'; +import {initRepoArchiveLinks, initPostersDropdown} from './features/repo-common.js'; import {initRepoMigrationStatusChecker} from './features/repo-migrate.js'; import { initRepoSettingGitHook, diff --git a/web_src/js/utils/dom.js b/web_src/js/utils/dom.js index 5cd0396994245..d94d4cb092210 100644 --- a/web_src/js/utils/dom.js +++ b/web_src/js/utils/dom.js @@ -67,9 +67,3 @@ export function hideElem(el) { export function toggleElem(el, force) { elementsCall(el, toggleShown, force); } - -export function setAttributes(el, options) { - for (const key of Object.keys(options)) { - el.setAttribute(key, options[key]); - } -} From d352b421e1d73bfcb988582ed6f24df0cdf8090b Mon Sep 17 00:00:00 2001 From: HesterG Date: Thu, 30 Mar 2023 15:25:59 +0800 Subject: [PATCH 15/72] remove console logs --- web_src/js/features/repo-common.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/web_src/js/features/repo-common.js b/web_src/js/features/repo-common.js index 8a3ea040b0be5..33d91f91784d6 100644 --- a/web_src/js/features/repo-common.js +++ b/web_src/js/features/repo-common.js @@ -110,7 +110,6 @@ export function initRepoCommonLanguageStats() { // generate dropdown options for authors search dropdown using fetched data export async function initPostersDropdown() { - console.log('fetch posters data'); const $authorSearchDropdown = $('.author-search'); if (!$authorSearchDropdown.length) { return; @@ -128,16 +127,13 @@ export async function initPostersDropdown() { const isShowFullName = $authorSearchDropdown.attr('data-show-fullname'); const posterGeneralUrl = $authorSearchDropdown.attr('data-general-poster-url'); const values = $authorSearchDropdown.dropdown('setting values'); - let $defaultMenu = $(values[0]).find('.menu'); - console.dir(values) + const $defaultMenu = $(values[0]).find('.menu'); for (let i = 0; i < postersJson.length; i++) { const {id, avatar_url, username, full_name} = postersJson[i]; $defaultMenu.append(` - ${username}${isShowFullName === 'true' ? ` ${full_name}`: ''} + ${username}${isShowFullName === 'true' ? ` ${full_name}` : ''} `); } - console.log('new values') - console.dir(values) $authorSearchDropdown.dropdown('setting', 'values', values); } From c6c485d4b21a85883fcbfc9bf53054bde0abfbab Mon Sep 17 00:00:00 2001 From: HesterG Date: Thu, 30 Mar 2023 17:19:18 +0800 Subject: [PATCH 16/72] remove test --- routers/web/repo/issue.go | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index ea8a4b934c794..d28856e9250ae 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -3355,20 +3355,6 @@ func IssuePosters(ctx *context.Context) { repo := ctx.Repo.Repository isPullList := ctx.Params(":type") == "pulls" isPullOption := util.OptionalBoolOf(isPullList) - var allPosters []*user_model.User - // test sending more posters to frontend - for i := 1; i < 300; i++ { - var err error - posters, err := repo_model.GetIssuePosters(ctx, repo, isPullOption.IsTrue()) - if err != nil { - ctx.JSON(http.StatusInternalServerError, api.SearchError{ - OK: false, - Error: err.Error(), - }) - return - } - allPosters = append(allPosters, posters...) - } var err error posters, err := repo_model.GetIssuePosters(ctx, repo, isPullOption.IsTrue()) if err != nil { @@ -3378,9 +3364,8 @@ func IssuePosters(ctx *context.Context) { }) return } - allPosters = append(allPosters, posters...) - results := make([]*api.UserSearchInfo, len(allPosters)) - for i, poster := range allPosters { + results := make([]*api.UserSearchInfo, len(posters)) + for i, poster := range posters { results[i] = convert.ToUserSearchInfo(ctx, poster) } // fmt.Println(results) From e619f6a0a5213d99b63a1096d0647b31c6d9eb10 Mon Sep 17 00:00:00 2001 From: HesterG Date: Thu, 30 Mar 2023 17:22:12 +0800 Subject: [PATCH 17/72] remove comments --- routers/web/repo/issue.go | 1 - 1 file changed, 1 deletion(-) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index d28856e9250ae..fdd4f20be6bb2 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -3368,6 +3368,5 @@ func IssuePosters(ctx *context.Context) { for i, poster := range posters { results[i] = convert.ToUserSearchInfo(ctx, poster) } - // fmt.Println(results) ctx.JSON(http.StatusOK, results) } From d30b3b4c5bf37f8fe94cecbb6b3a66079ec5d209 Mon Sep 17 00:00:00 2001 From: HesterG Date: Thu, 30 Mar 2023 17:55:57 +0800 Subject: [PATCH 18/72] add aria --- web_src/js/features/repo-common.js | 5 ++++- web_src/js/modules/aria/dropdown.js | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/web_src/js/features/repo-common.js b/web_src/js/features/repo-common.js index 33d91f91784d6..1d4d354c62f08 100644 --- a/web_src/js/features/repo-common.js +++ b/web_src/js/features/repo-common.js @@ -1,6 +1,6 @@ import $ from 'jquery'; import {hideElem, showElem, toggleElem} from '../utils/dom.js'; - +import {updateMenuItem, ariaPatchKey} from '../modules/aria/dropdown.js'; const {csrfToken} = window.config; function getArchive($target, url, first) { @@ -135,5 +135,8 @@ export async function initPostersDropdown() { ${username}${isShowFullName === 'true' ? ` ${full_name}` : ''} `); } + const $items = $defaultMenu.find('> .item'); + $items.each((_, item) => updateMenuItem($authorSearchDropdown[0], item)); + $authorSearchDropdown[0][ariaPatchKey].deferredRefreshAriaActiveItem(); $authorSearchDropdown.dropdown('setting', 'values', values); } diff --git a/web_src/js/modules/aria/dropdown.js b/web_src/js/modules/aria/dropdown.js index e4c881b6af3ce..3072dec7b3946 100644 --- a/web_src/js/modules/aria/dropdown.js +++ b/web_src/js/modules/aria/dropdown.js @@ -1,7 +1,7 @@ import $ from 'jquery'; import {generateAriaId} from './base.js'; -const ariaPatchKey = '_giteaAriaPatchDropdown'; +export const ariaPatchKey = '_giteaAriaPatchDropdown'; const fomanticDropdownFn = $.fn.dropdown; // use our own `$().dropdown` function to patch Fomantic's dropdown module @@ -34,7 +34,7 @@ function ariaDropdownFn(...args) { // make the item has role=option/menuitem, add an id if there wasn't one yet, make items as non-focusable // the elements inside the dropdown menu item should not be focusable, the focus should always be on the dropdown primary element. -function updateMenuItem(dropdown, item) { +export function updateMenuItem(dropdown, item) { if (!item.id) item.id = generateAriaId(); item.setAttribute('role', dropdown[ariaPatchKey].listItemRole); item.setAttribute('tabindex', '-1'); From ad83d135c683240882956264163148503125e0aa Mon Sep 17 00:00:00 2001 From: HesterG Date: Fri, 31 Mar 2023 09:33:53 +0800 Subject: [PATCH 19/72] onresponse demo --- templates/repo/issue/list.tmpl | 17 +++++++ web_src/js/features/repo-common.js | 70 +++++++++++++++++++++++++++++ web_src/js/index.js | 5 ++- web_src/js/modules/aria/dropdown.js | 18 ++++++++ 4 files changed, 108 insertions(+), 2 deletions(-) diff --git a/templates/repo/issue/list.tmpl b/templates/repo/issue/list.tmpl index 534115a2c02e4..ad5bd1b645d94 100644 --- a/templates/repo/issue/list.tmpl +++ b/templates/repo/issue/list.tmpl @@ -133,6 +133,23 @@ + + +