## 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>
204 lines
4.8 KiB
TypeScript
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;
|
|
}
|