diff --git a/src/frontend/src/pages/stock/StockDetail.tsx b/src/frontend/src/pages/stock/StockDetail.tsx
index fded8ad13f..1a9c72368f 100644
--- a/src/frontend/src/pages/stock/StockDetail.tsx
+++ b/src/frontend/src/pages/stock/StockDetail.tsx
@@ -631,6 +631,7 @@ export default function StockDetail() {
});
const stockActions = useMemo(() => {
+ const inStock = stockitem.in_stock;
const serial = stockitem.serial;
const serialized =
serial != null &&
@@ -654,13 +655,12 @@ export default function StockDetail() {
/>,
}
actions={[
{
name: t`Count`,
tooltip: t`Count stock`,
- hidden: serialized,
+ hidden: serialized || !inStock,
icon: (
),
@@ -671,7 +671,7 @@ export default function StockDetail() {
{
name: t`Add`,
tooltip: t`Add Stock`,
- hidden: serialized,
+ hidden: serialized || !inStock,
icon: ,
onClick: () => {
stockitem.pk && addStockItem.open();
@@ -680,7 +680,7 @@ export default function StockDetail() {
{
name: t`Remove`,
tooltip: t`Remove Stock`,
- hidden: serialized,
+ hidden: serialized || !inStock,
icon: ,
onClick: () => {
stockitem.pk && removeStockItem.open();
@@ -689,7 +689,10 @@ export default function StockDetail() {
{
name: t`Serialize`,
tooltip: t`Serialize stock`,
- hidden: serialized || stockitem?.part_detail?.trackable != true,
+ hidden:
+ !inStock ||
+ serialized ||
+ stockitem?.part_detail?.trackable != true,
icon: ,
onClick: () => {
serializeStockItem.open();
@@ -698,6 +701,7 @@ export default function StockDetail() {
{
name: t`Transfer`,
tooltip: t`Transfer Stock`,
+ hidden: !inStock,
icon: (
),
@@ -708,7 +712,7 @@ export default function StockDetail() {
{
name: t`Return`,
tooltip: t`Return from customer`,
- hidden: !stockitem.customer,
+ hidden: !stockitem.sales_order,
icon: (
{
// Close the form
await page.getByRole('button', { name: 'Cancel' }).click();
});
+
+/**
+ * Test various 'actions' on the stock detail page
+ */
+test('Stock - Stock Actions', async ({ page }) => {
+ await doQuickLogin(page);
+
+ // Find an in-stock, untracked item
+ await page.goto(
+ `${baseUrl}/stock/location/index/stock-items?in_stock=1&serialized=0`
+ );
+ await page.getByText('530470210').first().click();
+ await page
+ .locator('div')
+ .filter({ hasText: /^Quantity: 270$/ })
+ .first()
+ .waitFor();
+
+ // Check for expected action sections
+ await page.getByLabel('action-menu-barcode-actions').click();
+ await page.getByLabel('action-menu-barcode-actions-link-barcode').click();
+ await page.getByRole('banner').getByRole('button').click();
+
+ await page.getByLabel('action-menu-printing-actions').click();
+ await page.getByLabel('action-menu-printing-actions-print-labels').click();
+ await page.getByRole('button', { name: 'Cancel' }).click();
+
+ await page.getByLabel('action-menu-stock-operations').click();
+ await page.getByLabel('action-menu-stock-operations-count').waitFor();
+ await page.getByLabel('action-menu-stock-operations-add').waitFor();
+ await page.getByLabel('action-menu-stock-operations-remove').waitFor();
+ await page.getByLabel('action-menu-stock-operations-transfer').click();
+ await page.getByLabel('text-field-notes').fill('test notes');
+ await page.getByRole('button', { name: 'Submit' }).click();
+ await page.getByText('This field is required.').first().waitFor();
+ await page.getByRole('button', { name: 'Cancel' }).click();
+
+ // Find an item which has been sent to a customer
+ await page.goto(`${baseUrl}/stock/item/1012/details`);
+ await page.getByText('Batch Code: 2022-11-12').waitFor();
+ await page.getByText('Unavailable').waitFor();
+ await page.getByLabel('action-menu-stock-operations').click();
+ await page.getByLabel('action-menu-stock-operations-return').click();
+
+ await page.waitForTimeout(2500);
+});