Compare commits
4 Commits
f4632e3412
...
49b68ea475
Author | SHA1 | Date |
---|---|---|
Snorf Yang | 49b68ea475 | |
Marcel Mraz | 6e5aeb112d | |
Marcel Mraz | 4d83d1c91e | |
SnorfYang | 59018ecc26 |
|
@ -0,0 +1,17 @@
|
|||
github_checks:
|
||||
annotations: true
|
||||
|
||||
codecov:
|
||||
require_ci_to_pass: yes
|
||||
|
||||
coverage:
|
||||
precision: 2
|
||||
round: down
|
||||
range: 65...100
|
||||
|
||||
status:
|
||||
# Learn more at https://docs.codecov.io/docs/commit-status
|
||||
project:
|
||||
default:
|
||||
target: 65%
|
||||
threshold: 0.05 # allow this much decrease on project
|
|
@ -0,0 +1,21 @@
|
|||
name: Tests coverage
|
||||
|
||||
on: pull_request
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup Node.js 14.x
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: 14.x
|
||||
- name: Install and test
|
||||
run: |
|
||||
yarn --frozen-lockfile
|
||||
yarn test:app --coverage
|
||||
- name: Test Coverage
|
||||
uses: codecov/codecov-action@v3
|
||||
with:
|
||||
fail_ci_if_error: true
|
|
@ -4166,6 +4166,11 @@ class App extends React.Component<AppProps, AppState> {
|
|||
originSnapOffset: null,
|
||||
activeEmbeddable: null,
|
||||
} as const;
|
||||
|
||||
if (nextActiveTool.type === "freedraw") {
|
||||
this.store.shouldCaptureIncrement();
|
||||
}
|
||||
|
||||
if (nextActiveTool.type !== "selection") {
|
||||
return {
|
||||
...prevState,
|
||||
|
|
|
@ -22,7 +22,7 @@ export const getObservedAppState = (appState: AppState): ObservedAppState => {
|
|||
selectedLinearElementId: appState.selectedLinearElement?.elementId || null,
|
||||
};
|
||||
|
||||
Object.defineProperty(observedAppState, hiddenObservedAppStateProp, {
|
||||
Reflect.defineProperty(observedAppState, hiddenObservedAppStateProp, {
|
||||
value: true,
|
||||
enumerable: false,
|
||||
});
|
||||
|
@ -33,7 +33,7 @@ export const getObservedAppState = (appState: AppState): ObservedAppState => {
|
|||
const isObservedAppState = (
|
||||
appState: AppState | ObservedAppState,
|
||||
): appState is ObservedAppState =>
|
||||
Object.hasOwn(appState, hiddenObservedAppStateProp);
|
||||
!!Reflect.get(appState, hiddenObservedAppStateProp);
|
||||
|
||||
export type StoreActionType = "capture" | "update" | "none";
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -6570,12 +6570,27 @@ History {
|
|||
"delta": Delta {
|
||||
"deleted": {
|
||||
"selectedElementIds": {},
|
||||
"selectedLinearElementId": null,
|
||||
},
|
||||
"inserted": {
|
||||
"selectedElementIds": {
|
||||
"id6": true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"elementsChange": ElementsChange {
|
||||
"added": Map {},
|
||||
"removed": Map {},
|
||||
"updated": Map {},
|
||||
},
|
||||
},
|
||||
HistoryEntry {
|
||||
"appStateChange": AppStateChange {
|
||||
"delta": Delta {
|
||||
"deleted": {
|
||||
"selectedLinearElementId": null,
|
||||
},
|
||||
"inserted": {
|
||||
"selectedLinearElementId": "id6",
|
||||
},
|
||||
},
|
||||
|
|
|
@ -15,7 +15,11 @@ import { createUndoAction, createRedoAction } from "../actions/actionHistory";
|
|||
import { EXPORT_DATA_TYPES, MIME_TYPES } from "../constants";
|
||||
import { AppState, ExcalidrawImperativeAPI } from "../types";
|
||||
import { arrayToMap, resolvablePromise } from "../utils";
|
||||
import { COLOR_PALETTE } from "../colors";
|
||||
import {
|
||||
COLOR_PALETTE,
|
||||
DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX,
|
||||
DEFAULT_ELEMENT_STROKE_COLOR_INDEX,
|
||||
} from "../colors";
|
||||
import { KEYS } from "../keys";
|
||||
import { newElementWith } from "../element/mutateElement";
|
||||
import {
|
||||
|
@ -67,10 +71,11 @@ const checkpoint = (name: string) => {
|
|||
const renderStaticScene = vi.spyOn(StaticScene, "renderStaticScene");
|
||||
|
||||
const transparent = COLOR_PALETTE.transparent;
|
||||
const red = COLOR_PALETTE.red[1];
|
||||
const blue = COLOR_PALETTE.blue[1];
|
||||
const yellow = COLOR_PALETTE.yellow[1];
|
||||
const violet = COLOR_PALETTE.violet[1];
|
||||
const black = COLOR_PALETTE.black;
|
||||
const red = COLOR_PALETTE.red[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX];
|
||||
const blue = COLOR_PALETTE.blue[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX];
|
||||
const yellow = COLOR_PALETTE.yellow[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX];
|
||||
const violet = COLOR_PALETTE.violet[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX];
|
||||
|
||||
describe("history", () => {
|
||||
beforeEach(() => {
|
||||
|
@ -973,6 +978,69 @@ describe("history", () => {
|
|||
]);
|
||||
});
|
||||
|
||||
it("should create entry when selecting freedraw", async () => {
|
||||
await render(<Excalidraw handleKeyboardGlobally={true} />);
|
||||
|
||||
UI.clickTool("rectangle");
|
||||
mouse.down(-10, -10);
|
||||
mouse.up(10, 10);
|
||||
|
||||
UI.clickTool("freedraw");
|
||||
mouse.down(40, -20);
|
||||
mouse.up(50, 10);
|
||||
|
||||
const rectangle = h.elements[0];
|
||||
const freedraw1 = h.elements[1];
|
||||
|
||||
expect(API.getUndoStack().length).toBe(3);
|
||||
expect(API.getRedoStack().length).toBe(0);
|
||||
expect(API.getSelectedElements().length).toBe(0);
|
||||
expect(h.elements).toEqual([
|
||||
expect.objectContaining({ id: rectangle.id }),
|
||||
expect.objectContaining({ id: freedraw1.id, strokeColor: black }),
|
||||
]);
|
||||
|
||||
Keyboard.undo();
|
||||
expect(API.getUndoStack().length).toBe(2);
|
||||
expect(API.getRedoStack().length).toBe(1);
|
||||
expect(API.getSelectedElements().length).toBe(0);
|
||||
expect(h.elements).toEqual([
|
||||
expect.objectContaining({ id: rectangle.id }),
|
||||
expect.objectContaining({
|
||||
id: freedraw1.id,
|
||||
strokeColor: black,
|
||||
isDeleted: true,
|
||||
}),
|
||||
]);
|
||||
|
||||
togglePopover("Stroke");
|
||||
UI.clickOnTestId("color-red");
|
||||
mouse.down(40, -20);
|
||||
mouse.up(50, 10);
|
||||
|
||||
const freedraw2 = h.elements[2];
|
||||
|
||||
expect(API.getUndoStack().length).toBe(3);
|
||||
expect(API.getRedoStack().length).toBe(0);
|
||||
expect(h.elements).toEqual([
|
||||
expect.objectContaining({ id: rectangle.id }),
|
||||
expect.objectContaining({
|
||||
id: freedraw1.id,
|
||||
strokeColor: black,
|
||||
isDeleted: true,
|
||||
}),
|
||||
expect.objectContaining({
|
||||
id: freedraw2.id,
|
||||
strokeColor: COLOR_PALETTE.red[DEFAULT_ELEMENT_STROKE_COLOR_INDEX],
|
||||
}),
|
||||
]);
|
||||
|
||||
// ensure we don't end up with duplicated entries
|
||||
UI.clickTool("freedraw");
|
||||
expect(API.getUndoStack().length).toBe(3);
|
||||
expect(API.getRedoStack().length).toBe(0);
|
||||
});
|
||||
|
||||
it("should support duplication of groups, appstate group selection and editing group", async () => {
|
||||
await render(<Excalidraw handleKeyboardGlobally={true} />);
|
||||
const rect1 = API.createElement({
|
||||
|
|
Loading…
Reference in New Issue