chore: git mod - minor fixes (#38563)

## Description
- Fixes initial loading state for status
- Includes module instances and source module count
- Fixes discard flow

## Automation

/ok-to-test tags="@tag.Git"

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/12692930817>
> Commit: 6689c8e113bc4795cecd533fe5b7eff6ee221283
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=12692930817&attempt=4"
target="_blank">Cypress dashboard</a>.
> Tags: `@tag.Git`
> Spec:
> <hr>Fri, 10 Jan 2025 08:32:22 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [ ] No


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **New Features**
	- Introduced a new focus on source modules instead of packages
	- Enhanced tracking of module instances and source module changes

- **Bug Fixes**
- Updated status change calculations to more accurately reflect module
modifications
	- Improved handling of artifact identification in discard operations

- **Refactor**
- Renamed and restructured various status-related interfaces and
functions
- Modified selectors and reducers to support new module tracking
approach

- **Chores**
	- Updated type definitions and selector implementations
	- Removed deprecated package-related tracking mechanisms

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Rudraprasad Das 2025-01-10 12:16:55 +01:00 committed by GitHub
parent 1030275d0d
commit c169d48888
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 49 additions and 88 deletions

View File

@ -272,28 +272,14 @@ function statusThemeTransformer(status: FetchStatusResponseData) {
return tree;
}
function statusPackagesTransformer(status: FetchStatusResponseData) {
const {
modifiedModuleInstances = 0,
modifiedModules = 0,
modifiedPackages = 0,
} = status;
function statusModuleInstancesTransformer(status: FetchStatusResponseData) {
const { modifiedModuleInstances = 0, modifiedSourceModules = 0 } = status;
const tree = [] as StatusTreeStruct[];
if (modifiedPackages > 0) {
if (modifiedSourceModules > 0) {
tree.push(
createTreeNode({
subject: `${modifiedPackages} package${modifiedPackages > 1 ? "s" : ""}`,
verb: "modified",
type: "package",
}),
);
}
if (modifiedModules > 0) {
tree.push(
createTreeNode({
subject: `${modifiedModules} module${modifiedModules > 1 ? "s" : ""}`,
subject: `${modifiedSourceModules} source module${modifiedSourceModules > 1 ? "s" : ""}`,
verb: "modified",
type: "module",
}),
@ -323,7 +309,7 @@ export default function applicationStatusTransformer(
...statusJsLibTransformer(status),
...statusSettingsTransformer(status),
...statusThemeTransformer(status),
...statusPackagesTransformer(status),
...statusModuleInstancesTransformer(status),
] as StatusTreeStruct[];
return tree;

View File

@ -51,7 +51,7 @@ export default function BranchButton({
isAutocommitPolling = false,
isBranchPopupOpen = false,
isProtectedMode = false,
isStatusClean = false,
isStatusClean = true,
isTriggerAutocommitLoading = false,
toggleBranchPopup = noop,
}: BranchButtonProps) {

View File

@ -64,7 +64,7 @@ function QuickActionsView({
isProtectedMode = false,
isPullFailing = false,
isPullLoading = false,
isStatusClean = false,
isStatusClean = true,
isTriggerAutocommitLoading = false,
pull = noop,
statusBehindCount = 0,

View File

@ -8,9 +8,10 @@ export const calcStatusChangeCount = (status: FetchStatusResponseData) => {
modifiedDatasources = 0,
modifiedJSLibs = 0,
modifiedJSObjects = 0,
modifiedModules = 0,
modifiedModuleInstances = 0,
modifiedPages = 0,
modifiedQueries = 0,
modifiedSourceModules = 0,
} = status || {};
const themeCount = modified.includes("theme.json") ? 1 : 0;
const settingsCount = modified.includes("application.json") ? 1 : 0;
@ -20,10 +21,11 @@ export const calcStatusChangeCount = (status: FetchStatusResponseData) => {
modifiedDatasources +
modifiedJSLibs +
modifiedJSObjects +
modifiedModules +
modifiedPages +
modifiedQueries +
themeCount +
modifiedSourceModules +
modifiedModuleInstances +
settingsCount
);
};

View File

@ -31,7 +31,7 @@ function QuickActions() {
const { currentBranch, isBranchPopupOpen, toggleBranchPopup } = useBranches();
const isPullFailing = !!pullError;
const isStatusClean = status?.isClean ?? false;
const isStatusClean = status?.isClean ?? true;
const statusBehindCount = status?.behindCount ?? 0;
const statusChangeCount = useStatusChangeCount(status);

View File

@ -6,16 +6,17 @@ import { useDispatch } from "react-redux";
import useArtifactSelector from "./useArtifactSelector";
export default function useDiscard() {
const { artifactDef } = useGitContext();
const { artifact, artifactDef } = useGitContext();
const artifactId = artifact?.id;
const dispatch = useDispatch();
const discardState = useArtifactSelector(selectDiscardState);
const discard = useCallback(() => {
if (artifactDef) {
dispatch(gitArtifactActions.discardInit({ artifactDef }));
if (artifactDef && artifactId) {
dispatch(gitArtifactActions.discardInit({ artifactDef, artifactId }));
}
}, [artifactDef, dispatch]);
}, [artifactDef, artifactId, dispatch]);
const clearDiscardError = useCallback(() => {
if (artifactDef) {

View File

@ -24,11 +24,10 @@ export interface FetchStatusResponseData {
modifiedDatasources: number;
modifiedJSLibs: number;
modifiedJSObjects: number;
modifiedPackages: number;
modifiedModuleInstances: number;
modifiedModules: number;
modifiedPages: number;
modifiedQueries: number;
modifiedSourceModules: number;
modifiedModuleInstances: number;
pagesAdded: string[];
pagesModified: string[];
pagesRemoved: string[];

View File

@ -4,19 +4,22 @@ import { builderURL } from "ee/RouteBuilder";
import { createMessage, DISCARD_SUCCESS } from "ee/constants/messages";
import discardRequest from "git/requests/discardRequest";
import type { DiscardResponse } from "git/requests/discardRequest.types";
import type { DiscardInitPayload } from "git/store/actions/discardActions";
import { gitArtifactActions } from "git/store/gitArtifactSlice";
import type { GitArtifactPayloadAction } from "git/store/types";
import log from "loglevel";
import { call, delay, put } from "redux-saga/effects";
import { validateResponse } from "sagas/ErrorSagas";
export default function* discardSaga(action: GitArtifactPayloadAction) {
const { artifactDef } = action.payload;
export default function* discardSaga(
action: GitArtifactPayloadAction<DiscardInitPayload>,
) {
const { artifactDef, artifactId } = action.payload;
let response: DiscardResponse | undefined;
try {
response = yield call(discardRequest, artifactDef.baseArtifactId);
response = yield call(discardRequest, artifactId);
const isValidResponse: boolean = yield validateResponse(response);
if (response && isValidResponse) {

View File

@ -1,12 +1,21 @@
import { createArtifactAction } from "../helpers/createArtifactAction";
import type { GitArtifactErrorPayloadAction } from "../types";
import type {
GitArtifactBasePayload,
GitArtifactErrorPayloadAction,
} from "../types";
export const discardInitAction = createArtifactAction((state) => {
state.apiResponses.discard.loading = true;
state.apiResponses.discard.error = null;
export interface DiscardInitPayload extends GitArtifactBasePayload {
artifactId: string;
}
return state;
});
export const discardInitAction = createArtifactAction<DiscardInitPayload>(
(state) => {
state.apiResponses.discard.loading = true;
state.apiResponses.discard.error = null;
return state;
},
);
export const discardSuccessAction = createArtifactAction((state) => {
state.apiResponses.discard.loading = false;

View File

@ -15,7 +15,6 @@ const TitleText = styled(Text)`
export enum StaticChangeKind {
SETTINGS = "SETTINGS",
THEME = "THEME",
PACKAGES = "PACKAGES",
MODULES = "MODULES",
REMOTE_AHEAD = "REMOTE_AHEAD",
REMOTE_BEHIND = "REMOTE_BEHIND",
@ -56,17 +55,10 @@ const allStaticChangeDefs: Record<
message: "Theme modified",
iconName: "sip-line",
}),
[StaticChangeKind.PACKAGES]: (status: GitStatusData) => ({
condition: (status.modifiedPackages ?? 0) > 0,
message: `${status.modifiedPackages ?? 0} ${
(status.modifiedPackages ?? 0) > 0 ? "packages" : "package"
} modified`,
iconName: "package",
}),
[StaticChangeKind.MODULES]: (status: GitStatusData) => ({
condition: (status.modifiedModules ?? 0) > 0,
message: `${status.modifiedModules ?? 0} ${
(status.modifiedModules ?? 0) > 0 ? "modules" : "module"
condition: (status.modifiedSourceModules ?? 0) > 0,
message: `${status.modifiedSourceModules ?? 0} ${
(status.modifiedSourceModules ?? 0) > 0 ? "modules" : "module"
} modified`,
iconName: "package",
}),

View File

@ -342,39 +342,10 @@ describe("GitChangesList", () => {
expect(getByTestId("t--status-change-THEME")).toBeInTheDocument();
});
it("should render Package related changes", () => {
const store = getMockStore({
gitStatus: {
modifiedPackages: 2,
},
});
const { getByTestId, queryByTestId } = render(
<Provider store={store}>
<GitChangesList />
</Provider>,
);
expect(
queryByTestId("t--status-change-DATASOURCES"),
).not.toBeInTheDocument();
expect(queryByTestId("t--status-change-JSLIBS")).not.toBeInTheDocument();
expect(
queryByTestId("t--status-change-REMOTE_AHEAD"),
).not.toBeInTheDocument();
expect(
queryByTestId("t--status-change-REMOTE_BEHIND"),
).not.toBeInTheDocument();
expect(getByTestId("t--status-change-PACKAGES")).toBeInTheDocument();
expect(queryByTestId("t--status-change-MODULES")).not.toBeInTheDocument();
expect(queryByTestId("t--status-change-SETTINGS")).not.toBeInTheDocument();
expect(queryByTestId("t--status-change-THEME")).not.toBeInTheDocument();
});
it("should render Module related changes", () => {
const store = getMockStore({
gitStatus: {
modifiedModules: 2,
modifiedSourceModules: 2,
},
});

View File

@ -50,7 +50,6 @@ export default function GitChangesList() {
<ExpandableChange kind={ExpandableChangeKind.JSLIBS} status={status} />
<StaticChange kind={StaticChangeKind.SETTINGS} status={status} />
<StaticChange kind={StaticChangeKind.THEME} status={status} />
<StaticChange kind={StaticChangeKind.PACKAGES} status={status} />
<StaticChange kind={StaticChangeKind.MODULES} status={status} />
{status?.migrationMessage ? (
<CalloutContainer>

View File

@ -754,8 +754,7 @@ export interface GitStatusData {
modifiedJSObjects: number;
modifiedQueries: number;
modifiedJSLibs: number;
modifiedPackages?: number;
modifiedModules?: number;
modifiedSourceModules?: number;
modifiedModuleInstances?: number;
}

View File

@ -146,10 +146,10 @@ export const getCountOfChangesToCommit = (state: AppState) => {
modifiedDatasources = 0,
modifiedJSLibs = 0,
modifiedJSObjects = 0,
modifiedModules = 0,
modifiedPackages = 0,
modifiedModuleInstances = 0,
modifiedPages = 0,
modifiedQueries = 0,
modifiedSourceModules = 0,
} = gitStatus || {};
const themeCount = modified.includes("theme.json") ? 1 : 0;
const settingsCount = modified.includes("application.json") ? 1 : 0;
@ -159,8 +159,8 @@ export const getCountOfChangesToCommit = (state: AppState) => {
modifiedDatasources +
modifiedJSLibs +
modifiedJSObjects +
modifiedModules +
modifiedPackages +
modifiedSourceModules +
modifiedModuleInstances +
modifiedPages +
modifiedQueries +
themeCount +