Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(LayoutManager): Expose objects registration #9661

Merged
merged 7 commits into from Feb 15, 2024

Conversation

asturur
Copy link
Member

@asturur asturur commented Feb 10, 2024

Description

When we stopped running the layout manager from group that comes from a json object, we removed also the object registration part and that broke interactive groups that won't react when the objects are transformed.

This PR fixes the issue by explicitly registering the objects.

This is a temporary fix, the final goal will probably be to deprecate the interactivity property of the group and add a setInteractive method that will also take care of event registration, since it doesn't seems right to have event handler registered anyway for objects that are non interactive.

There are probably other parts in the transform lifecycle where we can handle this but for now we are registering everything every time.

Copy link

codesandbox bot commented Feb 10, 2024

Review or Edit in CodeSandbox

Open the branch in Web EditorVS CodeInsiders

Open Preview

Copy link
Contributor

github-actions bot commented Feb 10, 2024

Build Stats

file / KB (diff) bundled minified
fabric 909.186 (+0.117) 304.524 (+0.117)

}[])(
'$trigger trigger should $action targets and call target hooks',
({ action }) => {
const lifecycle: jest.SpyInstance[] = [];
Copy link
Member Author

@asturur asturur Feb 10, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this 3 tests were failing because i wrote bad code. And it was not immediate to me to understand what they were testing for 2 reasons:
The connection between the array of data and the test variables force me to look up and down every time to understandand what is action and what is trigger, and the lifecycle array was a convoluted way to spell 3 times what has been calle, but without clearly saying with what has been called.

In general we should keep those array method for tests either for simple cases [true, false] or for large cases in which we need to use points or something else.

In the other cases i really prefer to spell clearly what the test is doing

const { target } = context;
this.unsubscribe(object, context);
const disposers = [
object.on('modified', (e) =>
this.performLayout({
trigger: 'modified',
e: { ...e, target: object },
e,
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in the object modified, target is already available in the event, we don't need to repeat it. At leat this says typescript

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

on line 88 ( now 93 ) we do the same for the other event, but in my opinion we shouldn't. If we want to forward the original event that is fine, but we are adding the target itself in the object event, we don't need to copy it in the forwarded event.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I remember something about this.
If you wish to do this you should add tests to verify this.
Notice that we add a target prop to this object.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see that there is a target prop to this object, that is why i don't see any reason to duplicate it on the event.
Probably also e should be called 'triggerEventData' or something that can let us know what 'e' is because is not clear. The only purpose of this 'e' is to be found later inside 'layout:after' event, correct? What else?

Copy link
Contributor

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What I don't like about this is that is makes the API missing
Who knows what context the dev needs to decide if to subscribe/unsubscribe targets?
I do not want to reduce the available context.
I suffer from it when I work with fabric and then need to do complex overriding to provide a missing bit of context.

@asturur
Copy link
Member Author

asturur commented Feb 10, 2024

We can add more context, but the logic should be, we write the minimal code, and we extend if a use case will surface.
Said so, what context are you using right now that you think should be also in subscribe and unsubscribe?

also stopPropagation should have the same treatment. I don't see where are we using it. Either provide an example in some doc/readme of why is there or we need to remove it.

@asturur
Copy link
Member Author

asturur commented Feb 10, 2024

I restored the full context, missing there was just the type: 'LAYOUT_INITIALIZATION'

Copy link
Contributor

Coverage after merging separate-registration-layout-manager into master will be

82.72%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
index.node.ts14.29%100%0%25%23, 26, 29, 41, 44, 47
src
   ClassRegistry.ts100%100%100%100%
   Collection.ts94.85%94.83%87.10%97.14%109, 112, 215–216, 241–242
   CommonMethods.ts96.55%87.50%100%100%9
   Intersection.ts100%100%100%100%
   Observable.ts87.76%85.29%87.50%89.58%134–135, 160–161, 32–33, 41, 50, 78, 89
   Point.ts100%100%100%100%
   Shadow.ts98.55%95.65%100%100%213
   cache.ts97.06%90%100%100%57
   config.ts74.14%65%66.67%82.76%131, 139, 139, 139, 139, 139–141, 152–154, 30
   constants.ts100%100%100%100%
src/LayoutManager
   LayoutManager.ts87.58%89.29%76.92%90.14%151–152, 154–155, 155, 155, 155, 155, 249, 307–308, 319, 51
   constants.ts100%100%100%100%
src/LayoutManager/LayoutStrategies
   ClipPathLayout.ts82.05%72.22%100%88.89%30–31, 42, 54, 57–58, 65
   FitContentLayout.ts100%100%100%100%
   FixedLayout.ts20%0%0%40%20–21, 23, 23, 23, 23, 23
   LayoutStrategy.ts86%64.71%100%96.15%36, 43, 43, 43, 51, 71–72
   utils.ts91.67%85.71%100%100%28, 34
src/Pattern
   Pattern.ts90.54%93.94%80%90.32%119, 130, 139, 32, 36
src/brushes
   BaseBrush.ts100%100%100%100%
   CircleBrush.ts0%0%0%0%108, 108, 108, 110, 112, 114–116, 118–121, 128–129, 13, 136, 138, 23–24, 32–36, 40–44, 51–54, 62–66, 68, 76, 76, 76, 76, 76–77, 79, 79, 79–82, 84, 92–93, 95, 97–99
   PatternBrush.ts97.06%87.50%100%100%21
   PencilBrush.ts91.06%82.35%100%93.81%122–123, 152, 152–154, 176, 176, 276, 280, 285–286, 68–69, 84–85
   SprayBrush.ts0%0%0%0%107, 107, 107, 107, 107–108, 110–111, 118–119, 121, 123–127, 136, 140–141, 141, 148, 148, 148–151, 153–156, 160–161, 163, 165–168, 17, 171, 178–179, 18, 181, 183–184, 186, 193–194, 196–197, 20, 200, 200, 207, 207, 21, 211, 22, 22, 22–24, 28, 32, 39, 46, 53, 60, 67, 84–86, 94–96, 98–99
src/canvas
   Canvas.ts78.66%77.04%82.14%79.33%1001–1003, 1006–1007, 1011–1012, 1123–1125, 1128–1129, 1202, 1314, 1435, 158, 183, 289, 289–294, 299, 322–323, 328–333, 353, 353, 353–354, 354, 354–355, 363, 368–369, 369, 369–370, 372, 381, 387–388, 388, 388, 42, 431, 439, 443, 443, 443–444, 446, 46, 528–529, 529, 529–530, 536, 536, 536–538, 558, 560, 560, 560–561, 561, 561, 564, 564, 564–565, 568, 577–578, 580–581, 583, 583–584, 586–587, 599–600, 600, 600–601, 603–608, 614, 621, 658, 658, 658, 660, 662–667, 673, 679, 679, 679–680, 682, 685, 690, 703, 731, 783–784, 784, 784, 784, 784, 784, 787–788, 791, 791–793, 796–797, 879, 886, 886, 886, 899, 928–929, 929, 929–931, 934–935, 935, 935, 937, 945, 945, 945–947, 947, 947, 954–955, 963–964, 964, 964–965, 971, 973
   CanvasOptions.ts100%100%100%100%
   SelectableCanvas.ts90.22%87.30%94.55%91.74%1004, 1012, 1123, 1125, 1127–1128, 1199, 1220–1221, 1239–1240, 460–461, 463–464, 464, 464, 513–514, 591, 596, 666, 671–672, 699–700, 724, 727–730, 730, 730–731, 731, 731, 737–738, 740, 760–761, 766–770, 772, 807–808, 811, 811, 811–812, 931, 931–932, 935, 955, 955
   StaticCanvas.ts96.44%92.72%98.91%98.27%1045, 1055, 1106–1108, 1111, 1146–1147, 1223, 1232, 1232, 1236, 1236, 1283–1284, 188–189, 205, 585, 597–598, 928–929, 929, 929–930
   StaticCanvasOptions.ts100%100%100%100%
   TextEditingManager.ts86%71.43%91.67%91.67%17, 17, 17–18, 18, 18
src/canvas/DOMManagers
   CanvasDOMManager.ts95.52%70%100%100%21–22, 29
   StaticCanvasDOMManager.ts97.50%88.89%100%100%33
   util.ts86.67%80.56%83.33%93.94%14, 26, 63–64, 67, 67, 74, 93–94
src/color
   Color.ts94.96%91.67%96.30%96.05%233, 258–259, 267–268, 48
   color_map.ts100%100%100%100%
   constants.ts100%100%100%100%
   util.ts85.71%76.92%100%89.74%55–56, 56, 58, 58, 58–59, 61–62, 89
src/controls
   Control.ts94.44%93.10%91.67%96.77%183, 249, 354
   changeWidth.ts100%100%100%100%
   commonControls.ts100%100%100%100%
   controlRendering.ts81.63%78%100%84.78%106, 111, 121, 121, 45, 50, 61, 61, 65–72, 81–82
   drag.ts100%100%100%100%
   fireEvent.ts88.89%75%100%100%13
   polyControl.ts10.87%0%0%16.13%114, 114, 114, 114, 114, 116–119, 119, 122, 129, 24–26, 50–52, 58–59, 61, 71, 77–79, 79, 81, 84, 86, 90–92, 94, 99
   rotate.ts19.57%12.50%50%21.43%41, 45, 51, 51, 51–52, 55–57, 59,

@ShaMan123
Copy link
Contributor

also stopPropagation should have the same treatment. I don't see where are we using it. Either provide an example in some doc/readme of why is there or we need to remove it.

Simple case
If you have a tree and a layout starts bubbling you might want an event handler to be able to stop the bubbling.
Like any DOM event

@ShaMan123
Copy link
Contributor

We are discussing a single flag. IMO it is too much time and resources spent on it.

@asturur
Copy link
Member Author

asturur commented Feb 12, 2024

We are discussing a single flag. IMO it is too much time and resources spent on it.

If you don't have time you don't have time. I'll see what i can do to finish the LayoutManager

@asturur asturur changed the title [draft]: regisrtation on demand [draft]: registration on demand Feb 12, 2024
@asturur asturur changed the title [draft]: registration on demand feat(LayoutManager): Expose objects registration Feb 14, 2024
@asturur asturur merged commit 624d35f into master Feb 15, 2024
2 checks passed
@asturur asturur deleted the separate-registration-layout-manager branch February 15, 2024 00:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants