diff --git a/module/gitea/css/binduser.ui.css b/module/gitea/css/binduser.ui.css
new file mode 100644
index 0000000000..08b900dbb6
--- /dev/null
+++ b/module/gitea/css/binduser.ui.css
@@ -0,0 +1 @@
+#featureBar {display: flex; gap: 1rem;}
diff --git a/module/gitea/js/binduser.ui.js b/module/gitea/js/binduser.ui.js
new file mode 100644
index 0000000000..d1537ecfb7
--- /dev/null
+++ b/module/gitea/js/binduser.ui.js
@@ -0,0 +1,16 @@
+window.setUserEmail = function()
+{
+ let email = '';
+ const account = $(this).val();
+ if(account && zentaoUsers[account]) email = zentaoUsers[account].email;
+
+ $(this).closest('.dtable-cell').prev().find('.dtable-cell-content').text(email);
+}
+
+window.renderGitlabUser = function(result, {row})
+{
+ const giteaID = row.data.giteaID;
+ result.push({html: ``});
+
+ return result;
+}
diff --git a/module/gitea/ui/binduser.html.php b/module/gitea/ui/binduser.html.php
new file mode 100644
index 0000000000..1688b2830f
--- /dev/null
+++ b/module/gitea/ui/binduser.html.php
@@ -0,0 +1,61 @@
+
+ * @package gitea
+ * @link http://www.zentao.net
+ */
+
+namespace zin;
+
+/* zin: Define the set::module('compile') feature bar on main menu. */
+featureBar
+(
+ to::leading(array(backBtn(set::icon('back'), set::class('secondary'), $lang->goback))),
+ set::current($type),
+ set::link($this->createLink('gitea', 'binduser', "giteaID=$giteaID&type={key}")),
+);
+
+/* zin: Define the toolbar on main menu. */
+toolbar();
+
+jsVar('zentaoUsers', $zentaoUsers);
+$config->gitea->dtable->bindUser->fieldList['giteaEmail']['onRenderCell'] = jsRaw('renderGitlabUser');
+$config->gitea->dtable->bindUser->fieldList['zentaoUsers']['controlItems'] = $userPairs;
+form
+(
+ setID('bindForm'),
+ setClass('mb-4 h-full'),
+ set::action(createLink('gitea', 'bindUser', "giteaID={$giteaID}")),
+ set::actions(array()),
+ on::change('input[name^="zentaoUsers"]', 'setUserEmail'),
+ dtable
+ (
+ set::cols($config->gitea->dtable->bindUser->fieldList),
+ set::data($userList),
+ set::plugins(array('form')),
+ set::rowHeight(50),
+ set::showToolbarOnChecked(false),
+ set::footer(array('toolbar')),
+ set::rowKey('giteaID'),
+ set::footToolbar(array(
+ 'className' => 'w-full form-actions form-group no-label',
+ 'items' => array(
+ array(
+ 'text' => $lang->save,
+ 'btnType' => 'primary',
+ 'onClick' => jsRaw("() => {\$('#bindForm').trigger('submit')}")
+ ),
+ array(
+ 'text' => $lang->goback,
+ 'btnType' => 'info',
+ 'onClick' => jsRaw('() => {goBack()}'),
+ )
+ )
+ )),
+ )
+);
diff --git a/module/gogs/css/binduser.ui.css b/module/gogs/css/binduser.ui.css
new file mode 100644
index 0000000000..08b900dbb6
--- /dev/null
+++ b/module/gogs/css/binduser.ui.css
@@ -0,0 +1 @@
+#featureBar {display: flex; gap: 1rem;}
diff --git a/module/gogs/js/binduser.ui.js b/module/gogs/js/binduser.ui.js
new file mode 100644
index 0000000000..ed226f7fd7
--- /dev/null
+++ b/module/gogs/js/binduser.ui.js
@@ -0,0 +1,16 @@
+window.setUserEmail = function()
+{
+ let email = '';
+ const account = $(this).val();
+ if(account && zentaoUsers[account]) email = zentaoUsers[account].email;
+
+ $(this).closest('.dtable-cell').prev().find('.dtable-cell-content').text(email);
+}
+
+window.renderGitlabUser = function(result, {row})
+{
+ const gogsID = row.data.gogsID;
+ result.push({html: ``});
+
+ return result;
+}
diff --git a/module/gogs/ui/binduser.html.php b/module/gogs/ui/binduser.html.php
new file mode 100644
index 0000000000..311b44d89e
--- /dev/null
+++ b/module/gogs/ui/binduser.html.php
@@ -0,0 +1,61 @@
+
+ * @package gogs
+ * @link http://www.zentao.net
+ */
+
+namespace zin;
+
+/* zin: Define the set::module('compile') feature bar on main menu. */
+featureBar
+(
+ to::leading(array(backBtn(set::icon('back'), set::class('secondary'), $lang->goback))),
+ set::current($type),
+ set::link($this->createLink('gogs', 'binduser', "gogsID=$gogsID&type={key}")),
+);
+
+/* zin: Define the toolbar on main menu. */
+toolbar();
+
+jsVar('zentaoUsers', $zentaoUsers);
+$config->gogs->dtable->bindUser->fieldList['gogsEmail']['onRenderCell'] = jsRaw('renderGitlabUser');
+$config->gogs->dtable->bindUser->fieldList['zentaoUsers']['controlItems'] = $userPairs;
+form
+(
+ setID('bindForm'),
+ setClass('mb-4 h-full'),
+ set::action(createLink('gogs', 'bindUser', "gogsID={$gogsID}")),
+ set::actions(array()),
+ on::change('input[name^="zentaoUsers"]', 'setUserEmail'),
+ dtable
+ (
+ set::cols($config->gogs->dtable->bindUser->fieldList),
+ set::data($userList),
+ set::plugins(array('form')),
+ set::rowHeight(50),
+ set::showToolbarOnChecked(false),
+ set::footer(array('toolbar')),
+ set::rowKey('gogsID'),
+ set::footToolbar(array(
+ 'className' => 'w-full form-actions form-group no-label',
+ 'items' => array(
+ array(
+ 'text' => $lang->save,
+ 'btnType' => 'primary',
+ 'onClick' => jsRaw("() => {\$('#bindForm').trigger('submit')}")
+ ),
+ array(
+ 'text' => $lang->goback,
+ 'btnType' => 'info',
+ 'onClick' => jsRaw('() => {goBack()}'),
+ )
+ )
+ )),
+ )
+);