@@ -150,7 +154,7 @@ function renderAccountsList() {
${escapeHtml(a.name)}
-
${escapeHtml(a.base_url)}
+
${escapeHtml(a.base_url)}${a.default_repo ? ' · ' + escapeHtml(a.default_repo) : ''}
@@ -201,6 +205,7 @@ function resetAccountForm() {
$('gitea-acc-name').value = '';
$('gitea-acc-baseurl').value = '';
$('gitea-acc-token').value = '';
+ $('gitea-acc-default-repo').value = '';
setAccountStatus('');
$('gitea-tok-hint').textContent = '';
}
@@ -214,6 +219,7 @@ function editAccount(id) {
$('gitea-acc-name').value = acc.name;
$('gitea-acc-baseurl').value = acc.base_url;
$('gitea-acc-token').value = '';
+ $('gitea-acc-default-repo').value = acc.default_repo || '';
$('gitea-tok-hint').textContent = '(leave blank to keep existing)';
setAccountStatus('');
$('gitea-acc-name').focus();
@@ -240,6 +246,7 @@ async function saveAccount(e) {
name: $('gitea-acc-name').value.trim(),
base_url: $('gitea-acc-baseurl').value.trim(),
token: $('gitea-acc-token').value,
+ default_repo: $('gitea-acc-default-repo').value.trim(),
};
if (!payload.name || !payload.base_url || (!editingAccountId && !payload.token)) {
setAccountStatus('name, base url, and token are required', 'error');
@@ -713,8 +720,9 @@ async function openCreateForm() {
$('gitea-create-form').classList.remove('hidden');
$('gitea-create-form').classList.add('flex');
- // Reset form
- $('gitea-create-repo').value = '';
+ // Reset form — pre-fill default repo if configured
+ const currentAccount = accounts.find(a => a.id === currentAccountId);
+ $('gitea-create-repo').value = currentAccount?.default_repo || '';
$('gitea-create-title').value = '';
$('gitea-create-body').value = '';
setCreateStatus('');
@@ -766,6 +774,8 @@ async function openCreateForm() {
errBox.classList.remove('hidden');
}
}
+
+ if (currentAccount?.default_repo) loadCreateRepoLabels();
}
function updateRepoHint() {
diff --git a/public/plugins/tests/asset-picker.test.js b/public/plugins/tests/asset-picker.test.js
new file mode 100644
index 0000000..207030a
--- /dev/null
+++ b/public/plugins/tests/asset-picker.test.js
@@ -0,0 +1,63 @@
+import { describe, it, afterEach, expect, $, $$, click, sleep, closeAll } from './runner.js?v=4';
+
+async function openEditor() {
+ const card = document.querySelector('#board [data-id]');
+ if (!card) return false;
+ card.dispatchEvent(new MouseEvent('dblclick', { bubbles: true }));
+ for (let i = 0; i < 20; i++) {
+ if ($('#modal')?.classList.contains('open')) return true;
+ await sleep(100);
+ }
+ return false;
+}
+
+async function openPicker() {
+ click('#md-asset-picker');
+ for (let i = 0; i < 30; i++) {
+ if (document.getElementById('asset-picker-flyout')) return true;
+ await sleep(100);
+ }
+ return false;
+}
+
+describe('Asset Picker', () => {
+ afterEach(async () => {
+ document.getElementById('asset-picker-flyout')?.remove();
+ await closeAll();
+ });
+
+ it('toolbar button exists', () => {
+ expect($('#md-asset-picker')).toExist();
+ });
+
+ it('opens flyout with search and grid, toggles closed on second click', async () => {
+ if (!await openEditor()) return;
+ if (!await openPicker()) return;
+
+ expect(document.getElementById('asset-picker-flyout')).toExist();
+ expect(document.getElementById('asset-picker-search')).toExist();
+ expect(document.getElementById('asset-picker-grid')).toExist();
+
+ // Second click closes
+ click('#md-asset-picker');
+ for (let i = 0; i < 20; i++) {
+ if (!document.getElementById('asset-picker-flyout')) break;
+ await sleep(50);
+ }
+ expect(document.getElementById('asset-picker-flyout')).toBe(null);
+ });
+
+ it('search input filters tiles', async () => {
+ if (!await openEditor()) return;
+ if (!await openPicker()) return;
+
+ const search = document.getElementById('asset-picker-search');
+ if (!search) return;
+
+ search.value = 'zzz_nonexistent_zzz';
+ search.dispatchEvent(new Event('input', { bubbles: true }));
+ await sleep(50);
+ const grid = document.getElementById('asset-picker-grid');
+ expect(grid.querySelectorAll('.asset-pick-tile').length).toBe(0);
+ });
+});
diff --git a/public/plugins/tests/runner.js b/public/plugins/tests/runner.js
index 8c5b2f6..0108ec0 100644
--- a/public/plugins/tests/runner.js
+++ b/public/plugins/tests/runner.js
@@ -180,6 +180,7 @@ export async function closeAll() {
document.querySelector('.bucket-picker')?.remove();
document.querySelector('.orphan-lightbox')?.remove();
document.getElementById('bucket-super-popover')?.remove();
+ document.getElementById('asset-picker-flyout')?.remove();
document.getElementById('gitea-overlay')?.classList.remove('open');
// Clear multi-select
document.querySelectorAll('.card-selected').forEach(el => {
diff --git a/public/plugins/tests/tests.js b/public/plugins/tests/tests.js
index b921fab..a5aca57 100644
--- a/public/plugins/tests/tests.js
+++ b/public/plugins/tests/tests.js
@@ -50,6 +50,7 @@ const FILES = [
'./relay.test.js',
'./notifications.test.js',
'./quick-capture.test.js',
+ './asset-picker.test.js',
'./theme.test.js',
];