diff --git a/templates/repo/create.tmpl b/templates/repo/create.tmpl
index 8509092894..ea6c5b8489 100644
--- a/templates/repo/create.tmpl
+++ b/templates/repo/create.tmpl
@@ -42,6 +42,16 @@
{{ctx.Locale.Tr "repo.repo_name_profile_public_hint"}}
{{ctx.Locale.Tr "repo.repo_name_profile_private_hint"}}
+
+
+
+
+
+ {{svg "octicon-triangle-down" 14 "dropdown icon"}}
+
+
+
diff --git a/web_src/js/features/repo-new.ts b/web_src/js/features/repo-new.ts
index b690ace0f7..e90da08eed 100644
--- a/web_src/js/features/repo-new.ts
+++ b/web_src/js/features/repo-new.ts
@@ -58,6 +58,36 @@ function initRepoNewTemplateSearch(form: HTMLFormElement) {
onChangeOwner();
}
+function initRepoGroupSelector(form: HTMLFormElement) {
+ const inputRepoOwnerUid = form.querySelector('#uid');
+ const elGroupDropdown = form.querySelector('#group_selector');
+ const $dropdown = fomanticQuery(elGroupDropdown);
+ const onChangeRepoOwner = function () {
+ $dropdown.dropdown('setting', {
+ apiSettings: {
+ url: `${appSubUrl}/group/search?uid=${inputRepoOwnerUid.value}&recurse=true`,
+ onResponse(response) {
+ const results = [];
+ results.push({name: '', value: ''}); // empty item means not using template
+ const forEachFn = function({group, subgroups}, depth: number) {
+ results.push({name: group.name, value: String(group.id)});
+ for (const sg of subgroups) {
+ forEachFn(sg, depth + 1);
+ }
+ };
+ for (const g of response.data.subgroups) {
+ forEachFn(g, 0);
+ }
+ return {results};
+ },
+ cache: false,
+ },
+ });
+ };
+ inputRepoOwnerUid.addEventListener('change', onChangeRepoOwner);
+ onChangeRepoOwner();
+}
+
export function initRepoNew() {
const pageContent = document.querySelector('.page-content.repository.new-repo');
if (!pageContent) return;
@@ -96,4 +126,5 @@ export function initRepoNew() {
updateUiRepoName();
initRepoNewTemplateSearch(form);
+ initRepoGroupSelector(form);
}