PromucFlow_constructor/app/client/src/utils/replayHelpers.tsx
Ilia d6f249b42d
chore: add blank line eslint rule (#36369)
## Description
Added ESLint rule to force blank lines between statements. 


Fixes #`Issue Number`  
_or_  
Fixes `Issue URL`
> [!WARNING]  
> _If no issue exists, please create an issue first, and check with the
maintainers if the issue is valid._

## Automation

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

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!CAUTION]
> 🔴 🔴 🔴 Some tests have failed.
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/10924926728>
> Commit: 34f57714a1575ee04e94e03cbcaf95e57a96c86c
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=10924926728&attempt=1&selectiontype=test&testsstatus=failed&specsstatus=fail"
target="_blank">Cypress dashboard</a>.
> Tags: @tag.All
> Spec: 
> The following are new failures, please fix them before merging the PR:
<ol>
> <li>cypress/e2e/Regression/ClientSide/Anvil/AnvilModal_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilButtonWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCheckboxGroupWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilCurrencyInputWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilIconButtonWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilInlineButtonWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilInputWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilParagraphWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilPhoneInputWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilStatsWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchGroupWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilSwitchWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilTableWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilToolbarButtonWidgetSnapshot_spec.ts
>
<li>cypress/e2e/Regression/ClientSide/Anvil/Widgets/AnvilZoneSectionWidgetSnapshot_spec.ts</ol>
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/identified-flaky-tests-65890b3c81d7400d08fa9ee3?branch=master"
target="_blank">List of identified flaky tests</a>.
> <hr>Wed, 18 Sep 2024 16:33:36 UTC
<!-- end of auto-generated comment: Cypress test results  -->


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

---------

Co-authored-by: Valera Melnikov <valera@appsmith.com>
2024-09-18 19:35:28 +03:00

204 lines
4.8 KiB
TypeScript

import scrollIntoView from "scroll-into-view-if-needed";
import {
modText,
flashElementsById,
isMacOrIOS,
flashElement,
shiftText,
} from "./helpers";
import localStorage from "./localStorage";
import {
createMessage,
WIDGET_ADDED,
BULK_WIDGET_ADDED,
WIDGET_REMOVED,
BULK_WIDGET_REMOVED,
ACTION_CONFIGURATION_CHANGED,
} from "ee/constants/messages";
import { toast } from "@appsmith/ads";
import { setApiPaneConfigSelectedTabIndex } from "../actions/apiPaneActions";
import { API_EDITOR_TABS } from "../constants/ApiEditorConstants/CommonApiConstants";
import store from "../store";
/**
* process the toast for undo/redo
*
* @param undoRedoToasts
*/
export const processUndoRedoToasts = (
undoRedoToasts: {
isCreated: boolean;
isUndo: boolean;
widgetName: string | undefined;
widgetId: string;
}[],
) => {
const { isCreated, isUndo } = undoRedoToasts[0];
const isMultipleToasts = undoRedoToasts.length > 1;
const widgetName = isMultipleToasts
? `${undoRedoToasts.length}`
: undoRedoToasts[0].widgetName;
if (isCreated)
flashElementsById(
undoRedoToasts.map((toast) => toast.widgetId),
100,
1000,
);
showUndoRedoToast(widgetName, isMultipleToasts, isCreated, !isUndo);
};
// context can be extended.
export enum UndoRedoToastContext {
WIDGET = "widget",
QUERY_TEMPLATES = "query-templates",
}
/**
* shows a toast for undo/redo
*
* @param actionName
* @param isMultiple
* @param isCreated
* @param shouldUndo
* @param toastContext
* @returns
*/
export const showUndoRedoToast = (
actionName: string | undefined,
isMultiple: boolean,
isCreated: boolean,
shouldUndo: boolean,
toastContext = UndoRedoToastContext.WIDGET,
) => {
if (
shouldDisallowToast(shouldUndo) &&
toastContext === UndoRedoToastContext.WIDGET
)
return;
let actionDescription;
let actionText = "";
switch (toastContext) {
case UndoRedoToastContext.WIDGET:
actionDescription = getWidgetDescription(isCreated, isMultiple);
actionText = createMessage(actionDescription, actionName);
break;
case UndoRedoToastContext.QUERY_TEMPLATES:
actionDescription = ACTION_CONFIGURATION_CHANGED;
actionText = createMessage(actionDescription, actionName);
break;
default:
actionText = "";
}
const action = shouldUndo ? "undo" : "redo";
const actionKey = shouldUndo
? `${modText()} Z`
: isMacOrIOS()
? `${modText()} ${shiftText()} Z`
: `${modText()} Y`;
toast.show(`${actionText}. Press ${actionKey} to ${action}`);
};
function getWidgetDescription(isCreated: boolean, isMultiple: boolean) {
if (isCreated) return isMultiple ? BULK_WIDGET_ADDED : WIDGET_ADDED;
else return isMultiple ? BULK_WIDGET_REMOVED : WIDGET_REMOVED;
}
/**
* search the dom with id of element and scroll the page to its position
*
* @param id
*/
export const scrollWidgetIntoView = (id: string) => {
const el = document.getElementById(id);
if (el)
scrollIntoView(el, {
scrollMode: "if-needed",
block: "center",
inline: "center",
});
};
/**
* checks if toast should be shown to user or not
* if the item key is true, then disallowing showing toast
*
* @param shouldUndo
* @returns
*/
export function shouldDisallowToast(shouldUndo: boolean): boolean {
const itemKey = shouldUndo ? "undoToastShown" : "redoToastShown";
const flag = localStorage.getItem(itemKey);
if (flag === null || !flag) {
localStorage.setItem(itemKey, "true");
return false;
}
return true;
}
export function highlightReplayElement(configProperties: Array<string> = []) {
const elements = configProperties
.map((configProperty: string) => {
const replayId = btoa(configProperty);
return document.querySelector(
`[data-location-id="${replayId}"]`,
) as HTMLElement;
})
.filter((el) => Boolean(el));
if (elements.length === 1) {
elements[0].scrollIntoView({ behavior: "smooth" });
}
elements.forEach((element) => flashElement(element));
}
export function switchTab(replayId: string): boolean {
if (!replayId) return false;
const element = document.querySelector(`[id$="${replayId}"]`) as HTMLElement;
if (!element) return false;
if (element.getAttribute("data-state") == "active") return false;
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const index = Object.values(API_EDITOR_TABS).indexOf(replayId);
store.dispatch(setApiPaneConfigSelectedTabIndex(index));
return true;
}
export function expandAccordion(replayId: string): boolean {
if (!replayId) return false;
const element = document.querySelector(
`[data-location-id="section-${replayId}"]`,
);
if (!element) return false;
const accordion = element.querySelector(
".bp3-icon-chevron-down",
) as HTMLElement;
if (!accordion) return false;
accordion.click();
return true;
}