diff --git a/src/backend/InvenTree/InvenTree/fields.py b/src/backend/InvenTree/InvenTree/fields.py index bc501fec46..95a04636ed 100644 --- a/src/backend/InvenTree/InvenTree/fields.py +++ b/src/backend/InvenTree/InvenTree/fields.py @@ -38,7 +38,7 @@ class InvenTreeRestURLField(RestURLField): if not strict_urls and data is not empty and data is not None: data = str(data).strip() - if '://' not in data: + if data and '://' not in data: # Validate as if there were a schema provided data = 'http://' + data diff --git a/src/frontend/tests/pages/pui_part.spec.ts b/src/frontend/tests/pages/pui_part.spec.ts index f201563bc3..64ec6289a8 100644 --- a/src/frontend/tests/pages/pui_part.spec.ts +++ b/src/frontend/tests/pages/pui_part.spec.ts @@ -113,6 +113,30 @@ test('Parts - BOM', async ({ browser }) => { await page.getByRole('button', { name: 'Close' }).click(); }); +test('Part - Editing', async ({ browser }) => { + const page = await doCachedLogin(browser, { url: 'part/104/details' }); + + await page.getByText('A square table - with blue paint').first().waitFor(); + + // Open part edit dialog + await page.keyboard.press('Control+E'); + + const keywords = await page.getByLabel('text-field-keywords').inputValue(); + await page + .getByLabel('text-field-keywords') + .fill(keywords ? '' : 'table furniture'); + + // Test URL validation + await page.getByLabel('text-field-link').fill('htxp-??QQQ++'); + await page.getByRole('button', { name: 'Submit' }).click(); + await page.getByText('Enter a valid URL.').waitFor(); + + // Fill with an empty URL + await page.getByLabel('text-field-link').fill(''); + await page.getByRole('button', { name: 'Submit' }).click(); + await page.getByText('Item Updated').waitFor(); +}); + test('Parts - Locking', async ({ browser }) => { const page = await doCachedLogin(browser, { url: 'part/104/bom' }); await loadTab(page, 'Bill of Materials');