PromucFlow_constructor/app/client/src/utils/replayHelpers.tsx
albinAppsmith 629999f124
feat: [epic] appsmith design system version 2 deduplication (#22030)
## Description

### Fixes
- [x] https://github.com/appsmithorg/appsmith/issues/19383
- [x] https://github.com/appsmithorg/appsmith/issues/19384
- [x] https://github.com/appsmithorg/appsmith/issues/19385
- [x] https://github.com/appsmithorg/appsmith/issues/19386
- [x] https://github.com/appsmithorg/appsmith/issues/19387
- [x] https://github.com/appsmithorg/appsmith/issues/19388
- [x] https://github.com/appsmithorg/appsmith/issues/19389
- [x] https://github.com/appsmithorg/appsmith/issues/19390
- [x] https://github.com/appsmithorg/appsmith/issues/19391
- [x] https://github.com/appsmithorg/appsmith/issues/19392
- [x] https://github.com/appsmithorg/appsmith/issues/19393
- [x] https://github.com/appsmithorg/appsmith/issues/19394
- [x] https://github.com/appsmithorg/appsmith/issues/19395
- [x] https://github.com/appsmithorg/appsmith/issues/19396
- [x] https://github.com/appsmithorg/appsmith/issues/19397
- [x] https://github.com/appsmithorg/appsmith/issues/19398
- [x] https://github.com/appsmithorg/appsmith/issues/19399
- [x] https://github.com/appsmithorg/appsmith/issues/19400
- [x] https://github.com/appsmithorg/appsmith/issues/19401
- [x] https://github.com/appsmithorg/appsmith/issues/19402
- [x] https://github.com/appsmithorg/appsmith/issues/19403
- [x] https://github.com/appsmithorg/appsmith/issues/19404
- [x] https://github.com/appsmithorg/appsmith/issues/19405
- [x] https://github.com/appsmithorg/appsmith/issues/19406
- [x] https://github.com/appsmithorg/appsmith/issues/19407
- [x] https://github.com/appsmithorg/appsmith/issues/19408
- [x] https://github.com/appsmithorg/appsmith/issues/19409

Fixes # (issue)
> if no issue exists, please create an issue and ask the maintainers
about this first


Media
> A video or a GIF is preferred. when using Loom, don’t embed because it
looks like it’s a GIF. instead, just link to the video


## Type of change

> Please delete options that are not relevant.

- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)
- Breaking change (fix or feature that would cause existing
functionality to not work as expected)
- Chore (housekeeping or task changes that don't impact user perception)
- This change requires a documentation update


## How Has This Been Tested?
> Please describe the tests that you ran to verify your changes. Provide
instructions, so we can reproduce.
> Please also list any relevant details for your test configuration.
> Delete anything that is not important

- Manual
- Jest
- Cypress

### Test Plan
> Add Testsmith test cases links that relate to this PR

### Issues raised during DP testing
> Link issues raised during DP testing for better visiblity and tracking
(copy link from comments dropped on this PR)


## Checklist:
### Dev activity
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag


### QA activity:
- [ ] Test plan has been approved by relevant developers
- [ ] Test plan has been peer reviewed by QA
- [ ] Cypress test cases have been added and approved by either SDET or
manual QA
- [ ] Organized project review call with relevant stakeholders after
Round 1/2 of QA
- [ ] Added Test Plan Approved label after reveiwing all Cypress test

---------

Co-authored-by: Ankita Kinger <ankita@appsmith.com>
Co-authored-by: akash-codemonk <67054171+akash-codemonk@users.noreply.github.com>
Co-authored-by: Tanvi Bhakta <tanvi@appsmith.com>
Co-authored-by: Arsalan <arsalanyaldram0211@outlook.com>
Co-authored-by: Aman Agarwal <aman@appsmith.com>
Co-authored-by: Rohit Agarwal <rohit_agarwal@live.in>
Co-authored-by: Nilesh Sarupriya <nilesh@appsmith.com>
Co-authored-by: Nilesh Sarupriya <20905988+nsarupr@users.noreply.github.com>
Co-authored-by: Tanvi Bhakta <tanvibhakta@gmail.com>
Co-authored-by: Aishwarya UR <aishwarya@appsmith.com>
Co-authored-by: Parthvi Goswami <parthvigoswami@Parthvis-MacBook-Pro.local>
Co-authored-by: Vijetha-Kaja <vijetha@appsmith.com>
Co-authored-by: Parthvi <80334441+Parthvi12@users.noreply.github.com>
Co-authored-by: Apple <nandan@thinkify.io>
Co-authored-by: Saroj <43822041+sarojsarab@users.noreply.github.com>
Co-authored-by: Sangeeth Sivan <74818788+berzerkeer@users.noreply.github.com>
Co-authored-by: Ashok Kumar M <35134347+marks0351@users.noreply.github.com>
Co-authored-by: Aishwarya-U-R <91450662+Aishwarya-U-R@users.noreply.github.com>
Co-authored-by: rahulramesha <rahul@appsmith.com>
Co-authored-by: Aswath K <aswath.sana@gmail.com>
Co-authored-by: Preet Sidhu <preetsidhu.bits@gmail.com>
Co-authored-by: Vijetha-Kaja <119562824+Vijetha-Kaja@users.noreply.github.com>
Co-authored-by: Shrikant Sharat Kandula <shrikant@appsmith.com>
2023-05-20 00:07:06 +05:30

160 lines
4.2 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,
} from "@appsmith/constants/messages";
import { toast } from "design-system";
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);
};
/**
* shows a toast for undo/redo
*
* @param widgetName
* @param isMultiple
* @param isCreated
* @param shouldUndo
* @returns
*/
export const showUndoRedoToast = (
widgetName: string | undefined,
isMultiple: boolean,
isCreated: boolean,
shouldUndo: boolean,
) => {
if (shouldDisallowToast(shouldUndo)) return;
const actionDescription = getActionDescription(isCreated, isMultiple);
const widgetText = createMessage(actionDescription, widgetName);
const action = shouldUndo ? "undo" : "redo";
const actionKey = shouldUndo
? `${modText()} Z`
: isMacOrIOS()
? `REDO (${modText()} ${shiftText()} Z)`
: `REDO (${modText()} Y)`;
toast.show(`${widgetText} Press ${actionKey} to ${action}`);
};
function getActionDescription(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-replay-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-replay-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;
}