Skip to content

[NU-2197] save and deploy buttons changes #8130

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 28 commits into from
May 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
40929d1
NU-2197 add save and saveWithComment option
Dzuming May 21, 2025
1c7c574
NU-2197 revert badge changes
Dzuming May 21, 2025
ff414a5
NU-2197 deploy button changes
Dzuming May 21, 2025
df78bd1
NU-2197 add color to the indicator
Dzuming May 21, 2025
fc73b9b
Merge branch 'staging' into NU-2197-save-and-deploy-buttons-changes
Dzuming May 21, 2025
8ed0b6d
NU-2197 fix history
Dzuming May 21, 2025
5ff244a
NU-2197 change indicator position
Dzuming May 21, 2025
e2cb707
Merge branch 'staging' into NU-2197-save-and-deploy-buttons-changes
Dzuming May 21, 2025
4131eb1
NU-2197 resolve issues found during review
Dzuming May 21, 2025
6b340e9
Merge branch 'staging' into NU-2197-save-and-deploy-buttons-changes
Dzuming May 26, 2025
2ece6b0
NU-2197 add loading indicator
Dzuming May 26, 2025
0297039
Merge branch 'staging' into NU-2197-save-and-deploy-buttons-changes
Dzuming May 26, 2025
0070cd2
NU-2197 resolve problems with e2e tests
Dzuming May 26, 2025
1b51c02
NU-2197 update RedeployButton.tsx
Dzuming May 26, 2025
212de9c
NU-2197 set loading state
Dzuming May 26, 2025
b86fbef
NU-2197 hide deploy and redeploy under flag
Dzuming May 26, 2025
065d9d5
NU-2197 hide cancel button name under flag
Dzuming May 26, 2025
29649b4
NU-2197 hide save button under flag
Dzuming May 26, 2025
9133fed
Revert "NU-2197 resolve problems with e2e tests"
Dzuming May 26, 2025
85e258e
NU-2197 fix tests
Dzuming May 26, 2025
910d4fc
NU-2197 fix tests
Dzuming May 27, 2025
99a5928
NU-2197 fix tests
Dzuming May 27, 2025
43daa99
NU-2197 fix issue
Dzuming May 27, 2025
8dc3905
Updated snapshots (#8159)
github-actions[bot] May 28, 2025
bb140eb
NU-2197 remove .only
Dzuming May 28, 2025
1dff419
Merge remote-tracking branch 'origin/NU-2197-save-and-deploy-buttons-…
Dzuming May 28, 2025
5341102
NU-2197 fix tests
Dzuming May 28, 2025
190e8a3
NU-2197 fix tests
Dzuming May 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 4 additions & 2 deletions designer/client/cypress/e2e/compareVersions.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ describe("Compare versions", () => {
cy.contains(/^apply/i)
.should("be.enabled")
.click();
cy.contains(/^save\*$/i).click();
cy.contains(/^save$/i).click();
cy.contains(/^ok$/i).click();
cy.get("[data-testid=window]").should("not.exist");

Expand All @@ -60,7 +60,9 @@ describe("Compare versions", () => {
cy.contains(/^apply/i)
.should("be.enabled")
.click();
cy.contains(/^save\*$/i).click();
cy.get("[data-testid=window]").should("not.exist");
cy.verifySaveIndicator();
cy.contains(/^save$/i).click();
cy.contains(/^ok$/i).click();

// Open the compare dialog and select values to compare
Expand Down
3 changes: 2 additions & 1 deletion designer/client/cypress/e2e/components.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,8 @@ describe("Components list", () => {
},
force: true,
});
cy.contains(/^save\*$/i).click();
cy.verifySaveIndicator();
cy.contains(/^save$/i).click();
cy.contains(/^ok$/i).click();

cy.viewport(1400, 600);
Expand Down
3 changes: 2 additions & 1 deletion designer/client/cypress/e2e/description.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ describe("Description", () => {
cy.contains("description header").should("be.visible");
cy.get("[data-testid=window]").should("be.visible").find("header").find("[name=close]").click();

cy.contains(/^save\*$/i).click();
cy.verifySaveIndicator();
cy.contains(/^save$/i).click();
cy.contains(/^ok$/i).click();

cy.reload();
Expand Down
21 changes: 16 additions & 5 deletions designer/client/cypress/e2e/fragment.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,10 @@ describe("Fragment", () => {
cy.get("@window")
.contains(/^apply$/i)
.click();
cy.contains(/^save\*$/i).click();

cy.get("@window").should("not.exist");
cy.verifySaveIndicator();
cy.contains(/^save$/i).click();
cy.contains(/^ok$/i).click();

exportToFixture("fragmentWithInput");
Expand Down Expand Up @@ -333,7 +336,10 @@ describe("Fragment", () => {
cy.contains(/^apply/i)
.should("be.enabled")
.click();
cy.contains(/^save\*$/i).click();

cy.get("@window").should("not.exist");
cy.verifySaveIndicator();
cy.contains(/^save$/i).click();
cy.contains(/^ok$/i).click();
cy.get("@window").should("not.exist");

Expand All @@ -355,7 +361,10 @@ describe("Fragment", () => {
cy.get("@window")
.contains(/^apply$/i)
.click();
cy.contains(/^save\*$/i).click();

cy.get("@window").should("not.exist");
cy.verifySaveIndicator();
cy.contains(/^save$/i).click();
cy.contains(/^ok$/i).click();

// Go back to the Scenario
Expand Down Expand Up @@ -470,7 +479,8 @@ describe("Fragment", () => {
});
cy.layoutScenario();

cy.contains(/^save\*$/i).click();
cy.verifySaveIndicator();
cy.contains(/^save$/i).click();
cy.contains(/^ok$/i).click();

cy.visitProcess("@fragmentName");
Expand All @@ -494,7 +504,8 @@ describe("Fragment", () => {
cy.get("@output").click({ force: true }).type("{backspace}");
cy.layoutScenario();

cy.contains(/^save\*$/i).click();
cy.verifySaveIndicator();
cy.contains(/^save$/i).click();
cy.contains(/^ok$/i).click();
cy.contains(/^save$/i).should("be.disabled");

Expand Down
3 changes: 2 additions & 1 deletion designer/client/cypress/e2e/nodeWindow.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ describe("Node window", () => {
},
force: true,
});
cy.contains(/^save\*$/i).click();
cy.verifySaveIndicator();
cy.contains(/^save$/i).click();
cy.contains(/^ok$/i).click();

cy.visit("/components/usages/builtin-filter");
Expand Down
3 changes: 2 additions & 1 deletion designer/client/cypress/e2e/process.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,8 @@ describe("Process", () => {
});
cy.get("[data-testid=graphPage]").matchImage(screenshotOptions);
//why save and test snapshot? mistake?
cy.contains(/^save\*$/i).click();
cy.verifySaveIndicator();
cy.contains(/^save$/i).click();
cy.get("[data-testid=window]").contains(/^ok$/i).click();
cy.get("[data-testid=window]").should("not.exist");
cy.get("#nk-graph-main").should("be.visible");
Expand Down
11 changes: 11 additions & 0 deletions designer/client/cypress/support/process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ declare global {
archiveProcess: typeof archiveProcess;
unarchiveProcess: typeof unarchiveProcess;
migrateProcess: typeof migrateProcess;
verifySaveIndicator: typeof verifySaveIndicator;
}
}
}
Expand Down Expand Up @@ -365,6 +366,15 @@ function cancelScenario(comment = "issues/123") {
cy.contains(/^ok$/i).should("be.enabled").click();
}

function verifySaveIndicator() {
cy.contains(/^save$/i)
.find('[data-testid="toolbarButton-label"]')
.then(($el) => {
const afterContent = window.getComputedStyle($el[0], ":after").getPropertyValue("content");
expect(afterContent.includes("*")).to.be.true;
});
}

Cypress.Commands.add("createTestProcess", createTestProcess);
Cypress.Commands.add("deleteTestProcess", deleteTestProcess);
Cypress.Commands.add("getTestProcesses", getTestProcesses);
Expand All @@ -391,4 +401,5 @@ Cypress.Commands.add("getTestProcessName", getTestProcessName);
Cypress.Commands.add("archiveProcess", archiveProcess);
Cypress.Commands.add("unarchiveProcess", unarchiveProcess);
Cypress.Commands.add("migrateProcess", migrateProcess);
Cypress.Commands.add("verifySaveIndicator", verifySaveIndicator);
export default {};
96 changes: 0 additions & 96 deletions designer/client/src/components/modals/SaveProcessDialog.tsx

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { css, cx } from "@emotion/css";
import { Typography } from "@mui/material";
import type { WindowButtonProps, WindowContentProps } from "@touk/window-manager";
import React, { useCallback, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";

import { PromptContent } from "../../../windowManager";
import { LoadingButtonTypes } from "../../../windowManager/LoadingButton";
import { CommentInput } from "../../comment/CommentInput";
import { useSaveScenario } from "./useSaveScenario";

export function SaveScenarioDialog(props: WindowContentProps): JSX.Element {
const { handleSaveScenarioAction } = useSaveScenario();

const [comment, setState] = useState("");

const confirmAction = useCallback(async () => {
await handleSaveScenarioAction(comment);
props.close();
}, [props, handleSaveScenarioAction, comment]);

const { t } = useTranslation();
const buttons: WindowButtonProps[] = useMemo(
() => [
{ title: t("dialog.button.cancel", "Cancel"), action: () => props.close(), classname: LoadingButtonTypes.secondaryButton },
{ title: t("dialog.button.ok", "Ok"), action: () => confirmAction() },
],
[confirmAction, props, t],
);

return (
<PromptContent {...props} buttons={buttons}>
<div className={cx("modalContentDark", css({ minWidth: 600 }))}>
<Typography variant={"h3"}>{props.data.title}</Typography>
<CommentInput
onChange={(e) => setState(e.target.value)}
value={comment}
className={css({
minWidth: 600,
minHeight: 80,
})}
autoFocus
/>
</div>
</PromptContent>
);
}

export default SaveScenarioDialog;
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { useCallback } from "react";
import { useDispatch } from "react-redux";
import { useLocation, useNavigate } from "react-router-dom";

import { displayCurrentProcessVersion, loadProcessToolbarsConfiguration } from "../../../actions/nk";
import { getScenarioActivities } from "../../../actions/nk/scenarioActivities";
import type { ThunkAction } from "../../../actions/reduxTypes";
import { visualizationUrl } from "../../../common/VisualizationUrl";
import HttpService from "../../../http/HttpService";
import {
getProcessName,
getProcessUnsavedNewName,
getScenarioGraph,
getScenarioLabels,
isProcessRenamed,
} from "../../../reducers/selectors/graph";

export const useSaveScenario = () => {
const location = useLocation();
const navigate = useNavigate();
const dispatch = useDispatch();

const saveScenario = useCallback(
(comment = ""): ThunkAction => {
return async (dispatch, getState) => {
const state = getState();
const scenarioGraph = getScenarioGraph(state);
const currentProcessName = getProcessName(state);
const labels = getScenarioLabels(state);

// save changes before rename and force same processName everywhere
await HttpService.saveProcess(currentProcessName, scenarioGraph, comment, labels);

const unsavedNewName = getProcessUnsavedNewName(state);
const isRenamed = isProcessRenamed(state) && (await HttpService.changeProcessName(currentProcessName, unsavedNewName));
const processName = isRenamed ? unsavedNewName : currentProcessName;

await dispatch(displayCurrentProcessVersion(processName));
await dispatch(await getScenarioActivities(processName));

if (isRenamed) {
await dispatch(loadProcessToolbarsConfiguration(unsavedNewName));
navigate(
{
...location,
pathname: location.pathname.replace(visualizationUrl(currentProcessName), visualizationUrl(unsavedNewName)),
},
{ replace: true },
);
}
};
},
[location, navigate],
);

const handleSaveScenarioAction = useCallback(
async (comment = "") => {
await dispatch(saveScenario(comment));
},
[dispatch, saveScenario],
);

return { handleSaveScenarioAction };
};
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export const ButtonRoot = forwardRef<HTMLButtonElement, Omit<ToolbarButtonProps,
color: hasError ? theme.palette.error.main : isActive ? theme.palette.success.main : null,
})}
>
<Badge color="warning" overlap={"circular"} variant={showIndicator ? "dot" : null}>
<Badge color="warning" overlap={"circular"} variant={showIndicator && variant === ButtonsVariant.xs ? "dot" : null}>
<Icon
title={title}
className={"toolbarButton-Icon"}
Expand Down Expand Up @@ -82,6 +82,7 @@ export const ButtonRoot = forwardRef<HTMLButtonElement, Omit<ToolbarButtonProps,
: "overline"
}
className={"toolbarButton-Label"}
data-testid={"toolbarButton-label"}
sx={{
color: "inherit",
display: [ButtonsVariant.small, ButtonsVariant.xs].includes(variant) ? "none" : null,
Expand All @@ -92,6 +93,17 @@ export const ButtonRoot = forwardRef<HTMLButtonElement, Omit<ToolbarButtonProps,
: [ButtonsVariant.horizontal].includes(variant)
? 1
: null,
position: "relative",
...(showIndicator && {
"&::after": {
content: '"*"',
color: "warning.main",
marginLeft: "2px",
position: "absolute",
right: -8, // Position to the right of text
top: 0,
},
}),
}}
>
{name}
Expand Down
Loading