diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/id.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/id.eol index a54c0cb3..06b6830e 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/id.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/id.eol @@ -30,3 +30,8 @@ operation Any getId() : String { return r.getId(self); } + +operation String purify() : String { + // e.g. xmiids do not like such characters + return self.replace("::", "/"); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/actor/actorGroupDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/actor/actorGroupDeclaration.eol index ccffbe85..82d840d0 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/actor/actorGroupDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/actor/actorGroupDeclaration.eol @@ -1,19 +1,52 @@ -/* @cached -operation JSL!ActorGroupDeclaration getFqName(): String { - if (self.eContainer.isTypeOf(JSL!ActorGroupDeclaration) or self.eContainer.isTypeOf(JSL!ActorDeclaration)) { - return self.eContainer.getFqName() + "::MenuItemGroup::" + self.name; +operation JSL!UIMenuGroupDeclaration getFqName(): String { + if (self.eContainer.isTypeOf(JSL!UIMenuGroupDeclaration) or self.eContainer.isTypeOf(JSL!UIMenuDeclaration)) { + return self.eContainer.getFqName() + "::" + self.name; } - return self.tag; + return self.name; } @cached -operation JSL!ActorGroupDeclaration getActorDeclaration(): JSL!ActorDeclaration { - if (self.eContainer.isTypeOf(JSL!ActorGroupDeclaration)) { - return self.eContainer.getActorDeclaration(); - } else if (self.eContainer.isTypeOf(JSL!ActorDeclaration)) { - return self.eContainer; +operation JSL!UIMenuGroupDeclaration getRootMenu(): JSL!UIMenuDeclaration { + if (self.eContainer.isDefined()) { + if (self.eContainer.isTypeOf(JSL!UIMenuGroupDeclaration)) { + return self.eContainer.getRootMenu(); + } else if (self.eContainer.isTypeOf(JSL!UIMenuDeclaration)) { + return self.eContainer; + } } return null; } -*/ + +@cached +operation JSL!UIMenuGroupDeclaration getActorDeclaration(): JSL!ActorDeclaration { + var root = self.getRootMenu(); + if (root.isDefined()) { + return root.getActorDeclaration(); + } + return null; +} + +@cached +operation JSL!UIMenuGroupDeclaration getExposedVisualElements(): Set { + var ves = new Set(); + + ves.add(self); + + for (link in self.members.select(m | m.isTypeOf(JSL!UIMenuLinkDeclaration)).asSet()) { + ves.add(link); + ves.addAll(link.getExposedVisualElements()); + } + + for (table in self.members.select(m | m.isTypeOf(JSL!UIMenuTableDeclaration)).asSet()) { + ves.add(table); + ves.addAll(table.getExposedVisualElements()); + } + + for (group in self.members.select(m | m.isTypeOf(JSL!UIMenuGroupDeclaration)).asSet()) { + ves.add(group); + ves.addAll(group.getExposedVisualElements()); + } + + return ves; +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/actor/actorLinkDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/actor/actorLinkDeclaration.eol index cee9fe2a..4bbe4821 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/actor/actorLinkDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/actor/actorLinkDeclaration.eol @@ -1,19 +1,28 @@ -/* @cached -operation JSL!ActorLinkDeclaration getFqName(): String { - if (self.getTransferContainer().isDefined()) { - return self.getTransferContainer().getFqName() + "::" + self.name; +operation JSL!UIMenuLinkDeclaration getFqName(): String { + if (self.eContainer.isTypeOf(JSL!UIMenuGroupDeclaration) or self.eContainer.isTypeOf(JSL!UIMenuDeclaration)) { + return self.eContainer.getFqName() + "::" + self.name; } return self.name; } @cached -operation JSL!ActorLinkDeclaration getActorDeclaration(): JSL!ActorDeclaration { - if (self.eContainer.isTypeOf(JSL!ActorGroupDeclaration)) { - return self.eContainer.getActorDeclaration(); - } else if (self.eContainer.isTypeOf(JSL!ActorDeclaration)) { - return self.eContainer; +operation JSL!UIMenuLinkDeclaration getRootMenu(): JSL!UIMenuDeclaration { + if (self.eContainer.isDefined()) { + if (self.eContainer.isTypeOf(JSL!UIMenuGroupDeclaration)) { + return self.eContainer.getRootMenu(); + } else if (self.eContainer.isTypeOf(JSL!UIMenuDeclaration)) { + return self.eContainer; + } } return null; } -*/ + +@cached +operation JSL!UIMenuLinkDeclaration getActorDeclaration(): JSL!ActorDeclaration { + var root = self.getRootMenu(); + if (root.isDefined()) { + return root.getActorDeclaration(); + } + return null; +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferDeclaration.eol index 0bd8f1fa..edd7f33a 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferDeclaration.eol @@ -82,7 +82,7 @@ operation JSL!TransferDeclaration getAllRelations(): Set { } } - for (member in self.members.select(m | m.isKindOf(JSL!ViewPanelDeclaration))) { + for (member in self.members.select(m | m.isKindOf(JSL!UIViewPanelDeclaration))) { relations.addAll(member.getAllRelations()); } */ @@ -98,16 +98,16 @@ operation JSL!TransferDeclaration getAllRelations(): Set { operation JSL!TransferDeclaration getDirectRelations(): Set { var relations = new Set(); relations.addAll(self.members.select(m | m.isKindOf(JSL!TransferRelationDeclaration))); -/* + if (self.isKindOf(JSL!ActorDeclaration)) { var linkRelations = self.getAllMenuDeclarations(); relations.addAll(linkRelations); } - for (member in self.members.select(m | m.isKindOf(JSL!ViewPanelDeclaration))) { + for (member in self.members.select(m | m.isKindOf(JSL!UIViewPanelDeclaration))) { relations.addAll(member.getDirectRelations()); } -*/ + return relations; } @@ -115,11 +115,11 @@ operation JSL!TransferDeclaration getDirectRelations(): Set { operation JSL!TransferDeclaration getAllPrimitiveFields(): Set { var fields = new Set(); fields.addAll(self.members.select(m | m.isKindOf(JSL!TransferFieldDeclaration) and m.referenceType.isDefined() and m.referenceType.`primitive`.isDefined())); -/* - for (member in self.members.select(m | m.isKindOf(JSL!ViewPanelDeclaration))) { + + for (member in self.members.select(m | m.isKindOf(JSL!UIViewPanelDeclaration))) { fields.addAll(member.getAllPrimitiveFields()); } -*/ + return fields; } diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferFieldDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferFieldDeclaration.eol index b8cd7c5d..b2058277 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferFieldDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferFieldDeclaration.eol @@ -93,5 +93,5 @@ operation JSL!TransferFieldDeclaration getTransferFieldDeclarationEquivalent(): if (self.maps()) { return self.equivalent("CreateMappedTransferAttribute"); } - throw "Could not determinate attribute type: " + s.fqName(); + throw "Could not determinate attribute type: " + self.fqName(); } diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferRelationDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferRelationDeclaration.eol index e563903d..f49d9096 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferRelationDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/data/transferRelationDeclaration.eol @@ -163,8 +163,3 @@ operation JSL!TransferRelationDeclaration getContainerEquivalentClassType(): UI! } return null; } - -@cached -operation JSL!TransferRelationDeclaration getTransferObjectType(): JSL!TransferDeclaration { - return self.referenceType; -} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/namespace/modifiable.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/namespace/modifiable.eol index 0d8c1778..ce6270c5 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/namespace/modifiable.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/namespace/modifiable.eol @@ -147,11 +147,6 @@ operation JSL!Modifiable getRows(): JSL!Modifier { return (self.modifiers.selectOne(m | m.type == "rows")); } -@cached -operation JSL!Modifiable getSelector(): JSL!Modifier { - return (self.modifiers.selectOne(m | m.type == "selector")); -} - @cached operation JSL!Modifiable getCreateFormModifier(): JSL!Modifier { return self.modifiers.selectOne(m | m.isTypeOf(JSL!CreateFormModifier)); @@ -161,3 +156,8 @@ operation JSL!Modifiable getCreateFormModifier(): JSL!Modifier { operation JSL!Modifiable getUpdateViewModifier(): JSL!Modifier { return self.modifiers.selectOne(m | m.isTypeOf(JSL!UpdateViewModifier)); } + +@cached +operation JSL!Modifiable getSelectorTableModifier(): JSL!Modifier { + return self.modifiers.selectOne(m | m.isTypeOf(JSL!SelectorTableModifier)); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/_importUI.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/_importUI.eol index 50aa9482..7847815c 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/_importUI.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/_importUI.eol @@ -3,7 +3,7 @@ import "menuDeclaration.eol"; import "menuLinkDeclaration.eol"; import "menuTableDeclaration.eol"; import "rowColumnDeclaration.eol"; -import "rowLinkDeclaration.eol"; +import "rowDeclaration.eol"; import "viewActionDeclaration.eol"; import "viewDeclaration.eol"; import "viewGroupDeclaration.eol"; diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuDeclaration.eol index d1ec6b4e..6e549c3d 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuDeclaration.eol @@ -13,21 +13,20 @@ operation JSL!UIMenuDeclaration getFqName(): String { @cached operation JSL!UIMenuDeclaration getRootMenu(): JSL!UIMenuDeclaration { - if (self.eContainer.isDefined()) { - if (self.eContainer.isTypeOf(JSL!ModelDeclaration)) { - return self; + return self; +} - } - // todo handle groups traversing upwards? - return self.getRootMenu(); - } - return null; +@cached +operation JSL!UIMenuDeclaration getActorDeclaration(): JSL!ActorDeclaration { + return self.map.actor; } @cached operation JSL!UIMenuDeclaration getExposedVisualElements(): Set { var ves = new Set(); + ves.add(self); + for (link in self.members.select(m | m.isTypeOf(JSL!UIMenuLinkDeclaration)).asSet()) { ves.add(link); ves.addAll(link.getExposedVisualElements()); @@ -38,6 +37,11 @@ operation JSL!UIMenuDeclaration getExposedVisualElements(): Set { ves.addAll(table.getExposedVisualElements()); } + for (group in self.members.select(m | m.isTypeOf(JSL!UIMenuGroupDeclaration)).asSet()) { + ves.add(group); + ves.addAll(group.getExposedVisualElements()); + } + return ves; } diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuLinkDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuLinkDeclaration.eol index 8c6d7c76..375e7279 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuLinkDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuLinkDeclaration.eol @@ -16,15 +16,14 @@ operation JSL!UIMenuLinkDeclaration getExposedVisualElements(): Set { var ves = new Set(); var viewDeclaration = self.referenceType; - for (link in viewDeclaration.members.select(m | m.isTypeOf(JSL!UIMenuLinkDeclaration)).asSet()) { - ves.addAll(link.getExposedVisualElements()); - } + ves.add(self); + ves.add(viewDeclaration); + ves.addAll(viewDeclaration.getExposedVisualElements()); - for (table in viewDeclaration.members.select(m | m.isTypeOf(JSL!UIMenuTableDeclaration)).asSet()) { - ves.addAll(table.getExposedVisualElements()); + if (self.getCreateFormModifier().isDefined()) { + ves.add(self.getCreateFormModifier().form); + ves.addAll(self.getCreateFormModifier().form.getExposedVisualElements()); } - ves.addAll(viewDeclaration.members.select(m | m.isTypeOf(JSL!UIViewWidgetDeclaration)).asSet()); - return ves; } diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuTableDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuTableDeclaration.eol index ed58baf4..4aa7ed97 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuTableDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/menuTableDeclaration.eol @@ -16,6 +16,8 @@ operation JSL!UIMenuTableDeclaration getExposedVisualElements(): Set { var ves = new Set(); var rowDeclaration = self.referenceType; + ves.add(self); + ves.add(rowDeclaration); ves.addAll(rowDeclaration.members.select(m | m.isTypeOf(JSL!UIRowColumnDeclaration)).asSet()); if (self.getCreateFormModifier().isDefined()) { diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/rowColumnDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/rowColumnDeclaration.eol index 19fb3293..63301c08 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/rowColumnDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/rowColumnDeclaration.eol @@ -11,5 +11,5 @@ operation JSL!UIRowColumnDeclaration getTransferFieldDeclarationEquivalent(): UI if (field.maps()) { return field.equivalent("CreateMappedTransferAttribute"); } - throw "Could not determinate attribute type: " + s.fqName(); + throw "Could not determinate attribute type: " + self.fqName(); } diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/rowDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/rowDeclaration.eol new file mode 100644 index 00000000..e7215c46 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/rowDeclaration.eol @@ -0,0 +1,22 @@ +@cached +operation JSL!UIRowDeclaration getId(): String { + return (self.eContainer.getId() + "/" + self.name); +} + +@cached +operation JSL!UIRowDeclaration getFqName(): String { + if (self.eContainer.isDefined()) { + return self.eContainer.getFqName() + "::" + self.name; + } + return self.name; +} + +@cached +operation JSL!UIRowDeclaration getExposedVisualElements(): Set { + var ves = new Set(); + + ves.add(self); + ves.addAll(self.members.select(m | m.isTypeOf(JSL!UIRowColumnDeclaration)).asSet()); + + return ves; +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/rowLinkDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/rowLinkDeclaration.eol deleted file mode 100644 index 2588259b..00000000 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/rowLinkDeclaration.eol +++ /dev/null @@ -1,14 +0,0 @@ -/* -@cached -operation JSL!RowLinkDeclaration getId(): String { - return (self.eContainer.getId() + "/" + self.name); -} - -@cached -operation JSL!RowLinkDeclaration getFqName(): String { - if (self.getTransferContainer().isDefined()) { - return self.getTransferContainer().getFqName() + "::" + self.name; - } - return self.name; -} -*/ diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewDeclaration.eol index 75092310..ea746e77 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewDeclaration.eol @@ -19,15 +19,74 @@ operation JSL!UIViewDeclaration uiContainer() : UI!ui::VisualElement { operation JSL!UIViewDeclaration getExposedVisualElements(): Set { var ves = new Set(); - for (link in self.members.select(m | m.isTypeOf(JSL!UIMenuLinkDeclaration)).asSet()) { + ves.add(self); + ves.addAll(self.members.select(m | m.isTypeOf(JSL!UIViewWidgetDeclaration)).asSet()); + + for (link in self.members.select(m | m.isTypeOf(JSL!UIViewLinkDeclaration)).asSet()) { ves.addAll(link.getExposedVisualElements()); } - for (table in self.members.select(m | m.isTypeOf(JSL!UIMenuTableDeclaration)).asSet()) { + for (table in self.members.select(m | m.isTypeOf(JSL!UIViewTableDeclaration)).asSet()) { ves.addAll(table.getExposedVisualElements()); } - ves.addAll(self.members.select(m | m.isTypeOf(JSL!UIViewWidgetDeclaration)).asSet()); + for (group in self.members.select(m | m.isKindOf(JSL!UIViewGroupDeclaration)).asSet()) { + ves.addAll(group.getExposedVisualElements()); + } + + for (tab in self.members.select(m | m.isKindOf(JSL!UIViewTabsDeclaration)).asSet()) { + ves.addAll(tab.getExposedVisualElements()); + } return ves; } + +@cached +operation JSL!UIViewDeclaration getAllLinks(): Set { + return self.getExposedVisualElements().select(v | v.isKindOf(JSL!UIViewLinkDeclaration)).asSet(); +} + +@cached +operation JSL!UIViewDeclaration getOwnLinks(): Set { + var all = self.getExposedVisualElements().select(v | v.isKindOf(JSL!UIViewLinkDeclaration)).asSet(); + var res = new Set(); + + for (link in all) { + var parent: Any = link.eContainer; + while (not parent.isTypeOf(JSL!UIViewDeclaration) and parent.isDefined()) { + if (not parent.isTypeOf(JSL!UIViewDeclaration)) { + parent = parent.eContainer; + } + } + if (parent == self) { + res.add(link); + } + } + + return res; +} + +@cached +operation JSL!UIViewDeclaration getAllTables(): Set { + return self.getExposedVisualElements().select(v | v.isKindOf(JSL!UIViewTableDeclaration)).asSet(); +} + +@cached +operation JSL!UIViewDeclaration getOwnTables(): Set { + var all = self.getExposedVisualElements().select(v | v.isKindOf(JSL!UIViewTableDeclaration)).asSet(); + var res = new Set(); + + for (table in all) { + var parent: Any = table.eContainer; + while (not parent.isTypeOf(JSL!UIViewDeclaration) and parent.isDefined()) { + if (not parent.isTypeOf(JSL!UIViewDeclaration)) { + parent = parent.eContainer; + } + } + if (parent == self) { + res.add(table); + } + } + + return res; +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewGroupDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewGroupDeclaration.eol index 38d5fbae..f9e688d8 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewGroupDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewGroupDeclaration.eol @@ -1,30 +1,50 @@ -/* @cached -operation JSL!ViewGroupDeclaration getId(): String { +operation JSL!UIViewGroupDeclaration getId(): String { return (self.eContainer.getId() + "/" + self.name); } @cached -operation JSL!ViewGroupDeclaration getFqName(): String { +operation JSL!UIViewGroupDeclaration getFqName(): String { return self.eContainer.getFqName() + "::" + self.name; } @cached -operation JSL!ViewGroupDeclaration getTransferObjectType(): JSL!TransferDeclaration { - var to = self.eContainer; - while (to.isDefined() and not to.isKindOf(JSL!TransferDeclaration)) { - to = to.eContainer; - } - return to; -} - -@cached -operation JSL!ViewGroupDeclaration isFrame(): Boolean { +operation JSL!UIViewGroupDeclaration isFrame(): Boolean { var frame = self.getFrame(); return frame.isDefined() and frame.isTrue(); } -operation JSL!ViewGroupDeclaration uiContainer() : UI!ui::VisualElement { +operation JSL!UIViewGroupDeclaration uiContainer() : UI!ui::VisualElement { return self.equivalent("GroupVisualElement"); } -*/ + +@cached +operation JSL!UIViewGroupDeclaration getExposedVisualElements(): Set { + var ves = new Set(); + + ves.add(self); + + for (link in self.members.select(m | m.isTypeOf(JSL!UIViewLinkDeclaration)).asSet()) { + ves.add(link); + ves.addAll(link.getExposedVisualElements()); + } + + for (table in self.members.select(m | m.isTypeOf(JSL!UIViewTableDeclaration)).asSet()) { + ves.add(table); + ves.addAll(table.getExposedVisualElements()); + } + + for (group in self.members.select(m | m.isKindOf(JSL!UIViewGroupDeclaration)).asSet()) { + ves.add(group); + ves.addAll(group.getExposedVisualElements()); + } + + for (tab in self.members.select(m | m.isKindOf(JSL!UIViewTabsDeclaration)).asSet()) { + ves.add(tab); + ves.addAll(tab.getExposedVisualElements()); + } + + ves.addAll(self.members.select(m | m.isTypeOf(JSL!UIViewWidgetDeclaration)).asSet()); + + return ves; +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewLinkDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewLinkDeclaration.eol index c5be7509..e4444997 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewLinkDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewLinkDeclaration.eol @@ -5,8 +5,8 @@ operation JSL!UIViewLinkDeclaration getId(): String { @cached operation JSL!UIViewLinkDeclaration getFqName(): String { - if (self.getTransferContainer().isDefined()) { - return self.getTransferContainer().getFqName() + "::" + self.name; + if (self.eContainer.isDefined()) { + return self.eContainer.getFqName() + "::" + self.name; } return self.name; } @@ -21,15 +21,19 @@ operation JSL!UIViewLinkDeclaration getExposedVisualElements(): Set { var ves = new Set(); var viewDeclaration = self.referenceType; - for (link in self.members.select(m | m.isTypeOf(JSL!UIViewLinkDeclaration)).asSet()) { - ves.addAll(link.getExposedVisualElements()); - } + ves.add(self); + ves.add(viewDeclaration); + ves.addAll(viewDeclaration.getExposedVisualElements()); - for (table in self.members.select(m | m.isTypeOf(JSL!UIViewTableDeclaration)).asSet()) { - ves.addAll(table.getExposedVisualElements()); + if (self.getCreateFormModifier().isDefined()) { + ves.add(self.getCreateFormModifier().form); + ves.addAll(self.getCreateFormModifier().form.getExposedVisualElements()); } - ves.addAll(self.members.select(m | m.isTypeOf(JSL!UIViewWidgetDeclaration)).asSet()); + if (self.getSelectorTableModifier().isDefined()) { + ves.add(self.getSelectorTableModifier().row); + ves.addAll(self.getSelectorTableModifier().row.getExposedVisualElements()); + } return ves; } diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewPanelDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewPanelDeclaration.eol index 0e19cb2b..17cb1ee3 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewPanelDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewPanelDeclaration.eol @@ -1,20 +1,19 @@ -/* @cached -operation JSL!ViewPanelDeclaration getDirectRelations(): Set { +operation JSL!UIViewPanelDeclaration getDirectRelations(): Set { var relations = new Set(); - if (self.isTypeOf(JSL!ViewGroupDeclaration)) { + if (self.isTypeOf(JSL!UIViewGroupDeclaration)) { var ownRelations = self.members.select(m | m.isKindOf(JSL!TransferRelationDeclaration)); relations.addAll(ownRelations); - for (group in self.members.select(m | m.isKindOf(JSL!ViewGroupDeclaration))) { + for (group in self.members.select(m | m.isKindOf(JSL!UIViewGroupDeclaration))) { relations.addAll(group.getAllRelations()); } - for (tabs in self.members.select(m | m.isKindOf(JSL!ViewTabsDeclaration))) { + for (tabs in self.members.select(m | m.isKindOf(JSL!UIViewTabsDeclaration))) { relations.addAll(tabs.getAllRelations()); } - } else if (self.isTypeOf(JSL!ViewTabsDeclaration)) { - for (group in self.groups) { - relations.addAll(group.getAllRelations()); + } else if (self.isTypeOf(JSL!UIViewTabsDeclaration)) { + for (panel in self.panels) { + relations.addAll(panel.getAllRelations()); } } @@ -22,16 +21,16 @@ operation JSL!ViewPanelDeclaration getDirectRelations(): Set { } @cached -operation JSL!ViewPanelDeclaration getAllRelations(): Set { +operation JSL!UIViewPanelDeclaration getAllRelations(): Set { var relations = new Set(); - if (self.isTypeOf(JSL!ViewGroupDeclaration)) { + if (self.isTypeOf(JSL!UIViewGroupDeclaration)) { var ownRelations = self.members.select(m | m.isKindOf(JSL!UIViewLinkDeclaration)); relations.addAll(ownRelations); - for (group in self.members.select(m | m.isKindOf(JSL!ViewGroupDeclaration))) { + for (group in self.members.select(m | m.isKindOf(JSL!UIViewGroupDeclaration))) { relations.addAll(group.getAllRelations()); } - for (tabs in self.members.select(m | m.isKindOf(JSL!ViewTabsDeclaration))) { + for (tabs in self.members.select(m | m.isKindOf(JSL!UIViewTabsDeclaration))) { relations.addAll(tabs.getAllRelations()); } @@ -39,9 +38,9 @@ operation JSL!ViewPanelDeclaration getAllRelations(): Set { for (member in ownRelations) { relations.addAll(member.referenceType.getAllRelations()); } - } else if (self.isTypeOf(JSL!ViewTabsDeclaration)) { - for (group in self.groups) { - relations.addAll(group.getAllRelations()); + } else if (self.isTypeOf(JSL!UIViewTabsDeclaration)) { + for (panel in self.panels) { + relations.addAll(panel.getAllRelations()); } } @@ -49,20 +48,20 @@ operation JSL!ViewPanelDeclaration getAllRelations(): Set { } @cached -operation JSL!ViewPanelDeclaration getAllPrimitiveFields(): Set { +operation JSL!UIViewPanelDeclaration getAllPrimitiveFields(): Set { var fields = new Set(); - if (self.isTypeOf(JSL!ViewGroupDeclaration)) { + if (self.isTypeOf(JSL!UIViewGroupDeclaration)) { fields.addAll(self.members.select(m | m.isKindOf(JSL!TransferFieldDeclaration) and m.referenceType.isDefined() and m.referenceType.`primitive`.isDefined())); - for (group in self.members.select(m | m.isKindOf(JSL!ViewGroupDeclaration))) { + for (group in self.members.select(m | m.isKindOf(JSL!UIViewGroupDeclaration))) { fields.addAll(group.getAllPrimitiveFields()); } - for (tab in self.members.select(m | m.isKindOf(JSL!ViewTabsDeclaration))) { + for (tab in self.members.select(m | m.isKindOf(JSL!UIViewTabsDeclaration))) { fields.addAll(tab.getAllPrimitiveFields()); } - } else if (self.isTypeOf(JSL!ViewTabsDeclaration)) { - for (group in self.groups) { - fields.addAll(group.getAllPrimitiveFields()); + } else if (self.isTypeOf(JSL!UIViewTabsDeclaration)) { + for (panel in self.panels) { + fields.addAll(panel.getAllPrimitiveFields()); } } @@ -70,13 +69,12 @@ operation JSL!ViewPanelDeclaration getAllPrimitiveFields(): Set { } @cached -operation JSL!ViewPanelDeclaration getTransferContainer(): JSL!TransferDeclaration { - if (self.eContainer.isKindOf(JSL!TransferDeclaration)) { +operation JSL!UIViewPanelDeclaration getViewContainer(): JSL!UIViewDeclaration { + if (self.eContainer.isKindOf(JSL!UIViewDeclaration)) { return self.eContainer; - } else if (self.eContainer.isKindOf(JSL!ViewPanelDeclaration)) { - return self.eContainer.getTransferContainer(); + } else if (self.eContainer.isKindOf(JSL!UIViewPanelDeclaration)) { + return self.eContainer.getViewContainer(); } return null; } -*/ diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewTableDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewTableDeclaration.eol index 1b6c035a..a658724e 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewTableDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewTableDeclaration.eol @@ -5,8 +5,8 @@ operation JSL!UIViewTableDeclaration getId(): String { @cached operation JSL!UIViewTableDeclaration getFqName(): String { - if (self.getTransferContainer().isDefined()) { - return self.getTransferContainer().getFqName() + "::" + self.name; + if (self.eContainer.isDefined()) { + return self.eContainer.getFqName() + "::" + self.name; } return self.name; } @@ -33,7 +33,24 @@ operation JSL!UIViewTableDeclaration getExposedVisualElements(): Set { var ves = new Set(); var rowDeclaration = self.referenceType; + ves.add(self); + ves.add(rowDeclaration); ves.addAll(rowDeclaration.members.select(m | m.isTypeOf(JSL!UIRowColumnDeclaration)).asSet()); + if (self.getCreateFormModifier().isDefined()) { + ves.add(self.getCreateFormModifier().form); + ves.addAll(self.getCreateFormModifier().form.getExposedVisualElements()); + } + + if (self.getUpdateViewModifier().isDefined()) { + ves.add(self.getUpdateViewModifier().view); + ves.addAll(self.getUpdateViewModifier().view.getExposedVisualElements()); + } + + if (self.getSelectorTableModifier().isDefined()) { + ves.add(self.getSelectorTableModifier().row); + ves.addAll(self.getSelectorTableModifier().row.getExposedVisualElements()); + } + return ves; } diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewTabsDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewTabsDeclaration.eol index e028f4ff..3d0f0599 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewTabsDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewTabsDeclaration.eol @@ -1,29 +1,44 @@ -/* @cached -operation JSL!ViewTabsDeclaration getId(): String { +operation JSL!UIViewTabsDeclaration getId(): String { return (self.eContainer.getId() + "/" + self.name); } @cached -operation JSL!ViewTabsDeclaration getFqName(): String { +operation JSL!UIViewTabsDeclaration getFqName(): String { return self.eContainer.getFqName() + "::" + self.name; } @cached -operation JSL!ViewTabsDeclaration getTransferObjectType(): JSL!TransferDeclaration { - var to = self.eContainer; - while (to.isDefined() and not to.isKindOf(JSL!TransferDeclaration)) { - to = to.eContainer; - } - return to; -} - -@cached -operation JSL!ViewTabsDeclaration isFrame(): Boolean { +operation JSL!UIViewTabsDeclaration isFrame(): Boolean { return false; } -operation JSL!ViewTabsDeclaration uiContainer() : UI!ui::VisualElement { +operation JSL!UIViewTabsDeclaration uiContainer() : UI!ui::VisualElement { return self.equivalent("TabBarVisualElement"); } -*/ + +@cached +operation JSL!UIViewTabsDeclaration getExposedVisualElements(): Set { + var ves = new Set(); + + ves.add(self); + ves.addAll(self.panels.select(m | m.isTypeOf(JSL!UIViewWidgetDeclaration)).asSet()); + + for (link in self.panels.select(m | m.isTypeOf(JSL!UIViewLinkDeclaration)).asSet()) { + ves.addAll(link.getExposedVisualElements()); + } + + for (table in self.panels.select(m | m.isTypeOf(JSL!UIViewTableDeclaration)).asSet()) { + ves.addAll(table.getExposedVisualElements()); + } + + for (group in self.panels.select(m | m.isKindOf(JSL!UIViewGroupDeclaration)).asSet()) { + ves.addAll(group.getExposedVisualElements()); + } + + for (tab in self.panels.select(m | m.isKindOf(JSL!UIViewTabsDeclaration)).asSet()) { + ves.addAll(tab.getExposedVisualElements()); + } + + return ves; +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewWidgetDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewWidgetDeclaration.eol index 76a8ef67..ca6de81f 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewWidgetDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/viewWidgetDeclaration.eol @@ -8,28 +8,6 @@ operation JSL!UIViewWidgetDeclaration getFqName(): String { return self.eContainer.getFqName() + "::" + self.name; } -@cached -operation JSL!UIViewWidgetDeclaration getTransferObjectType(): JSL!TransferDeclaration { - /* - var to = self.eContainer; - while (to.isDefined() and not to.isKindOf(JSL!TransferDeclaration)) { - to = to.eContainer; - } - return to; - */ - return self.referenceType.eContainer; -} - -operation JSL!UIViewWidgetDeclaration uiContainer() : UI!ui::VisualElement { - if (self.eContainer.isKindOf(JSL!UIViewDeclaration)) { - if (self.eContainer.form.isDefined() and self.form) { - return self.eContainer.equivalent("FormPageContainerVisualElement"); - } - return self.eContainer.equivalent("ViewPageContainerVisualElement"); - } - throw "Could not map container for uiContainer()"; -} - @cached operation JSL!UIViewWidgetDeclaration getTransferFieldDeclarationEquivalent(): UI!ui::data::AttributeType { var primitive = self.transferField.target; @@ -43,5 +21,5 @@ operation JSL!UIViewWidgetDeclaration getTransferFieldDeclarationEquivalent(): U if (primitive.maps()) { return primitive.equivalent("CreateMappedTransferAttribute"); } - throw "Could not determinate attribute type: " + s.fqName(); + throw "Could not determinate attribute type: " + self.fqName(); } diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/visibleDeclaration.eol b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/visibleDeclaration.eol index 431e7285..940fa133 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/visibleDeclaration.eol +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/operations/jsl/ui/visibleDeclaration.eol @@ -9,3 +9,14 @@ operation JSL!VisibleDeclaration getFqName(): String { return self.eContainer.getFqName() + "::" + self.name; } */ + +operation Any getPos(): Integer { + if (self.eContainer.isKindOf(JSL!UIViewDeclaration)) { + return self.eContainer.members.indexOf(self); + } else if (self.eContainer.isKindOf(JSL!UIViewGroupDeclaration)) { + return self.eContainer.members.indexOf(self); + } else if (self.eContainer.isKindOf(JSL!UIViewTabsDeclaration)) { + return self.eContainer.panels.indexOf(self); + } + return self.~pos.isDefined() ? self.~pos : 0; +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/jslToUi.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/jslToUi.etl index 20b3e2c1..4d619cbc 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/jslToUi.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/jslToUi.etl @@ -2,7 +2,6 @@ import "../../operations/_importAll.eol"; import "modules/application/actorDeclaration.etl"; import "modules/application/actorGroupDeclaration.etl"; -import "modules/application/actorLinkDeclaration.etl"; import "modules/application/modifiable.etl"; import "modules/structure/transferDeclaration.etl"; @@ -14,13 +13,27 @@ import "modules/type/type.etl"; import "modules/view/enumLiteral.etl"; import "modules/view/menuDeclaration.etl"; +import "modules/view/menuLinkDeclaration.etl"; +import "modules/view/menuLinkDeclarationFormPage.etl"; +import "modules/view/menuLinkDeclarationViewPage.etl"; import "modules/view/menuTableDeclaration.etl"; +import "modules/view/menuTableDeclarationAddSelectorPage.etl"; +import "modules/view/menuTableDeclarationFormPage.etl"; +import "modules/view/menuTableDeclarationTablePage.etl"; +import "modules/view/menuTableDeclarationViewPage.etl"; import "modules/view/rowColumnDeclaration.etl"; -import "modules/view/rowLinkDeclaration.etl"; +import "modules/view/rowDeclaration.etl"; import "modules/view/viewDeclaration.etl"; +import "modules/view/viewDeclarationForm.etl"; import "modules/view/viewGroupDeclaration.etl"; import "modules/view/viewLinkDeclaration.etl"; +import "modules/view/viewLinkDeclarationFormPage.etl"; +import "modules/view/viewLinkDeclarationSetSelectorPage.etl"; +import "modules/view/viewLinkDeclarationViewPage.etl"; import "modules/view/viewTableDeclaration.etl"; +import "modules/view/viewTableDeclarationAddSelectorPage.etl"; +import "modules/view/viewTableDeclarationFormPage.etl"; +import "modules/view/viewTableDeclarationViewPage.etl"; import "modules/view/viewTabsDeclaration.etl"; import "modules/view/viewWidgetDeclaration.etl"; @@ -29,27 +42,30 @@ pre { var __cacheMap = new ConcurrentMap(); var __originalMap = new ConcurrentMap(); var System = Native("java.lang.System"); -/* - for (container : JSL!ViewPanelDeclaration in JSL!ViewPanelDeclaration.all()) { - if (container.isTypeOf(JSL!ViewGroupDeclaration)) { + + for (container : JSL!UIViewPanelDeclaration in JSL!UIViewPanelDeclaration.all()) { + if (container.isTypeOf(JSL!UIViewGroupDeclaration)) { for (member in container.members) { member.~pos = container.members.indexOf(member) + 1; } - } else if (container.isTypeOf(JSL!ViewTabsDeclaration)) { - for (group in container.groups) { - group.~pos = container.groups.indexOf(group) + 1; + } else if (container.isTypeOf(JSL!UIViewTabsDeclaration)) { + for (panel in container.panels) { + panel.~pos = container.panels.indexOf(panel) + 1; } } } - for (visible : JSL!VisibleDeclaration in JSL!VisibleDeclaration.all()) { - if (visible.isTypeOf(JSL!ViewDeclaration) or visible.isTypeOf(JSL!RowDeclaration)) { - for (member in visible.members) { - member.~pos = visible.members.indexOf(member) + 1; - } + for (visible : JSL!UIRowDeclaration in JSL!UIRowDeclaration.all()) { + for (member in visible.members) { + member.~pos = visible.members.indexOf(member) + 1; + } + } + + for (visible : JSL!UIViewDeclaration in JSL!UIViewDeclaration.all()) { + for (member in visible.members) { + member.~pos = visible.members.indexOf(member) + 1; } } -*/ } post { diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/application/actorDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/application/actorDeclaration.etl index 832b6fec..fa15b52b 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/application/actorDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/application/actorDeclaration.etl @@ -1,11 +1,10 @@ - rule Actor transform s: JSL!ActorDeclaration to t: UI!ui::data::ClassType { guard: s = actorDeclaration t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/Actor"); - t.name = s.getFqName() + "::ClassType"; + t.name = s.getFqName(); t.simpleName = s.name; //t.setPackageNameTokens(s); t.packageNameTokens.add(0, defaultModelName); diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/application/actorGroupDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/application/actorGroupDeclaration.etl index e69de29b..ef813468 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/application/actorGroupDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/application/actorGroupDeclaration.etl @@ -0,0 +1,33 @@ +rule MenuItemGroup + transform s: JSL!UIMenuGroupDeclaration + to t : UI!ui::NavigationItem { + guard: s.getRootMenu() == rootMenu + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/MenuItemGroup"); + t.name = s.getFqName(); + + log.debug("Create Navigation Group: " + s.name ); + + var label = s.getLabelModifier(); + if (label.isDefined()) { + t.label = label.value.value; + } + + var icon = s.getIconModifier(); + if (icon.isDefined()) { + t.icon = icon.equivalent("IconModifierIcon"); + } + + /*if (s.hiddenBy.isDefined()) { + t.hiddenBy = s.hiddenBy.name; + }*/ + + if (s.eContainer.isKindOf(JSL!UIMenuGroupDeclaration)) { + s.eContainer.equivalent("MenuItemGroup").items.add(t); + t.~pos = s.eContainer.members.indexOf(s); + } else { + var navigationController = rootMenu.equivalent("Application").navigationController; + navigationController.items.add(t); + t.~pos = s.eContainer.members.indexOf(s); + } +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/application/actorLinkDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/application/actorLinkDeclaration.etl deleted file mode 100644 index e69de29b..00000000 diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/structure/transferDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/structure/transferDeclaration.etl index 847ac910..a9107fa7 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/structure/transferDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/structure/transferDeclaration.etl @@ -6,7 +6,7 @@ rule ClassType t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ClassType"); - t.name = s.getFqName() + "::ClassType"; + t.name = s.getFqName(); t.transferObjectTypeName = s.name; t.simpleName = s.name; //t.setPackageNameTokens(s); diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/structure/transferFieldDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/structure/transferFieldDeclaration.etl index 7c375879..bdb5feb7 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/structure/transferFieldDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/structure/transferFieldDeclaration.etl @@ -3,7 +3,7 @@ rule AbstractCreateTransferAttribute transform s: JSL!TransferFieldDeclaration to t: UI!ui::data::AttributeType { guard: s.referenceType.isKindOf(JSL!PrimitiveDeclaration) - and actorDeclaration.getExposedTransferObjects().includes(s.getTransferContainer()) + and actorDeclaration.getExposedTransferObjects().includes(s.eContainer) t.name = s.name; diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/type/type.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/type/type.etl index c620d7b5..223264ac 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/type/type.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/type/type.etl @@ -4,7 +4,7 @@ rule CreateNumericType to t: UI!ui::data::NumericType { guard: s.`primitive` == "numeric" - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/CreateNumericType"); + t.setId(rootMenu.name + "/(jsl/" + s.getId().purify() + ")/CreateNumericType"); t.name = s.name; t.precision = s.getPrecision().value.intValue(); t.scale = s.getScale().value.intValue(); @@ -19,7 +19,7 @@ rule CreateDateType to t: UI!ui::data::DateType { guard: s.`primitive` == "date" - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/CreateDateType"); + t.setId(rootMenu.name + "/(jsl/" + s.getId().purify() + ")/CreateDateType"); t.name = s.name; t.operator = actorDeclaration.equivalent("NumericOperation"); rootMenu.equivalent("Application").dataTypes.add(t); @@ -32,7 +32,7 @@ rule CreateTimeType to t: UI!ui::data::TimeType { guard: s.`primitive` == "time" - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/CreateTimeType"); + t.setId(rootMenu.name + "/(jsl/" + s.getId().purify() + ")/CreateTimeType"); t.name = s.name; t.operator = actorDeclaration.equivalent("NumericOperation"); rootMenu.equivalent("Application").dataTypes.add(t); @@ -45,7 +45,7 @@ rule CreateTimestampType to t: UI!ui::data::TimestampType { guard: s.`primitive` == "timestamp" - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/CreateTimestampType"); + t.setId(rootMenu.name + "/(jsl/" + s.getId().purify() + ")/CreateTimestampType"); t.name = s.name; t.operator = actorDeclaration.equivalent("NumericOperation"); rootMenu.equivalent("Application").dataTypes.add(t); @@ -56,7 +56,7 @@ rule CreateTimestampType rule CreateEnumerationType transform s: JSL!EnumDeclaration to t: UI!ui::data::EnumerationType { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/CreateEnumerationType"); + t.setId(rootMenu.name + "/(jsl/" + s.getId().purify() + ")/CreateEnumerationType"); t.name = s.name; t.operator = actorDeclaration.equivalent("EnumerationOperation"); rootMenu.equivalent("Application").dataTypes.add(t); @@ -67,7 +67,7 @@ rule CreateEnumerationType rule CreateEnumerationMember transform s: JSL!EnumLiteral to t: UI!ui::data::EnumerationMember { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/CreateEnumerationMember"); + t.setId(rootMenu.name + "/(jsl/" + s.getId().purify() + ")/CreateEnumerationMember"); t.name = s.name; t.ordinal = s.value.intValue(); s.eContainer.equivalent("CreateEnumerationType").members.add(t); @@ -80,7 +80,7 @@ rule CreateBooleanType to t : UI!ui::data::BooleanType { guard: s.`primitive` == "boolean" - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/CreateBooleanType"); + t.setId(rootMenu.name + "/(jsl/" + s.getId().purify() + ")/CreateBooleanType"); t.name = s.name; rootMenu.equivalent("Application").dataTypes.add(t); t.operator = actorDeclaration.equivalent("BooleanOperation"); @@ -93,7 +93,7 @@ rule CreateStringType to t : UI!ui::data::StringType { guard: s.`primitive` == "string" - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/CreateStringType"); + t.setId(rootMenu.name + "/(jsl/" + s.getId().purify() + ")/CreateStringType"); t.name = s.name; t.maxLength = s.getMaxSize().value.intValue(); @@ -126,7 +126,7 @@ rule CreateBinaryType to t : UI!ui::data::BinaryType { guard: s.`primitive` == "binary" - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/CreateBinaryType"); + t.setId(rootMenu.name + "/(jsl/" + s.getId().purify() + ")/CreateBinaryType"); t.name = s.name; if (s.getMimeType().isDefined()) { diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuLinkDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuLinkDeclaration.etl new file mode 100644 index 00000000..4e23e979 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuLinkDeclaration.etl @@ -0,0 +1,31 @@ +rule MenuLinkNavigationItem + transform s: JSL!UIMenuLinkDeclaration + to t : UI!ui::NavigationItem { + guard: rootMenu.containsVisualElement(s) + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/MenuLinkNavigationItem"); + t.name = s.getFqName(); + + var label = s.getLabelModifier(); + if (label.isDefined()) { + t.label = label.value.value; + } + + var icon = s.getIconModifier(); + if (icon.isDefined()) { + t.icon = icon.equivalent("IconModifierIcon"); + } + + t.target = s.equivalent("AccessViewPageDefinition"); + + if (s.eContainer.isKindOf(JSL!UIMenuGroupDeclaration)) { + s.eContainer.equivalent("MenuItemGroup").items.add(t); + t.~pos = s.eContainer.members.indexOf(s); + } else { + var navigationController = rootMenu.equivalent("Application").navigationController; + navigationController.items.add(t); + t.~pos = s.eContainer.members.indexOf(s); + } + + log.debug("MenuLinkNavigationItem: " + s.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuLinkDeclarationFormPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuLinkDeclarationFormPage.etl new file mode 100644 index 00000000..015eac0d --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuLinkDeclarationFormPage.etl @@ -0,0 +1,56 @@ +rule AccessLinkCreateFormPageDefinition + transform s: JSL!UIMenuLinkDeclaration + to t: UI!ui::PageDefinition { + guard: rootMenu.containsVisualElement(s) and s.getCreateFormModifier().isDefined() + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewCreateFormPageDefinition"); + t.openInDialog = true; + t.name = s.getFqName() + "::AccessFormPage"; + t.container = s.getCreateFormModifier().form.equivalent("FormPageContainer"); + t.dataElement = s.actorAccess.target.equivalent("RelationType"); + t.dataElement.memberType = UI!ui::data::MemberType#ACCESS; + + t.actions.add(s.equivalent("AccessLinkCreateFormBackAction")); + t.actions.add(s.equivalent("AccessLinkCreateFormCreateAction")); + if (s.actorAccess.target.isTemplateAllowed()) { + t.actions.add(s.equivalent("AccessLinkCreateFormGetTemplateAction")); + } + + rootMenu.equivalent("Application").pages.add(t); + + log.debug("Create AccessViewCreateFormPageDefinition: " + t.name); +} + +@lazy +rule AccessLinkCreateFormBackAction + transform s: JSL!UIMenuLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessLinkCreateFormBackAction"); + t.name = s.name + "::Back"; + t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerBackActionDefinition"); + + log.debug("AccessLinkCreateFormBackAction: " + t.name); +} + +@lazy +rule AccessLinkCreateFormGetTemplateAction + transform s: JSL!UIMenuLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessLinkCreateFormGetTemplateAction"); + t.name = s.name + "::GetTemplate"; + t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerGetTemplateActionDefinition"); + log.debug("AccessLinkCreateFormGetTemplateAction: " + t.name); +} + +@lazy +rule AccessLinkCreateFormCreateAction + transform s: JSL!UIMenuLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessLinkCreateFormCreateAction"); + t.name = s.name + "::Create"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerCreateActionDefinition"); + t.targetPageDefinition = s.getCreateFormModifier().form.equivalent("AccessLinkViewPageDefinition"); + + log.debug("AccessLinkCreateFormCreateAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuLinkDeclarationViewPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuLinkDeclarationViewPage.etl new file mode 100644 index 00000000..ad567f35 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuLinkDeclarationViewPage.etl @@ -0,0 +1,130 @@ +rule AccessViewPageDefinition + transform s: JSL!UIMenuLinkDeclaration + to t: UI!ui::PageDefinition { + guard: rootMenu.containsVisualElement(s) + + var relation = s.actorAccess.target; + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewPageDefinition"); + t.name = s.getFqName() + "::AccessViewPage"; + t.container = s.referenceType.equivalent("ViewPageContainer"); + + rootMenu.equivalent("Application").pages.add(t); + + t.dataElement = relation.equivalent("RelationType"); + + /* + log.info("==================="); + log.info(t.name + ":"); + log.info(relations.collect(r | r.name).concat(", ")); + log.info("==================="); + */ + + for (link in s.referenceType.getOwnLinks()) { + var lRelation = link.transferRelation.target; + + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenPageAction", s.getId())); + if (lRelation.isRefreshAllowed() and not lRelation.isEager()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationRefreshAction", s.getId())); + } + if (link.getCreateFormModifier().isDefined()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenFormAction", s.getId())); + } + if (lRelation.isDeleteAllowed()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationRowDeleteAction", s.getId())); + } + if (link.getSelectorTableModifier().isDefined()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenSetSelectorDialogAction", s.getId())); + } + if (link.getSelectorTableModifier().isDefined()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationUnsetAction", s.getId())); + } + } + + for (table in s.referenceType.getOwnTables()) { + var tRelation = table.transferRelation.target; + + if (table.getUpdateViewModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenPageAction", s.getId())); + } + if (tRelation.isFilterSupported()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationFilterAction", s.getId())); + } + if (tRelation.isRefreshAllowed()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationRefreshAction", s.getId())); + } + if (table.getCreateFormModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenCreateAction", s.getId())); + } + if (tRelation.isDeleteAllowed()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationRowDeleteAction", s.getId())); + } + if (table.getSelectorTableModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenAddSelectorAction", s.getId())); + } + if (table.getSelectorTableModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationClearAction", s.getId())); + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationBulkRemoveAction", s.getId())); + } + } + + t.actions.add(s.equivalent("AccessViewBackAction")); + if (relation.isRefreshAllowed()) { + t.actions.add(s.equivalent("AccessViewRefreshAction")); + } + if (relation.isUpdateAllowed()) { + t.actions.add(s.equivalent("AccessViewUpdateAction")); + } + if (relation.isDeleteAllowed()) { + t.actions.add(s.equivalent("AccessViewDeleteAction")); + } + + log.debug("Create AccessViewPageDefinition: " + t.name); +} + +@lazy +rule AccessViewBackAction + transform s: JSL!UIMenuLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewBackAction"); + t.name = s.name + "::Back"; + t.actionDefinition = s.referenceType.equivalent("ViewPageContainerBackActionDefinition"); + + log.debug("AccessViewBackAction: " + t.name); +} + +@lazy +rule AccessViewRefreshAction + transform s: JSL!UIMenuLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewRefreshAction"); + t.name = s.name + "::Refresh"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.referenceType.equivalent("ViewPageContainerRefreshActionDefinition"); + + log.debug("AccessViewRefreshAction: " + t.name); +} + +@lazy +rule AccessViewUpdateAction + transform s: JSL!UIMenuLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewUpdateAction"); + t.name = s.name + "::Update"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.referenceType.equivalent("ViewPageContainerUpdateActionDefinition"); + + log.debug("AccessViewUpdateAction: " + t.name); +} + +@lazy +rule AccessViewDeleteAction + transform s: JSL!UIMenuLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewDeleteAction"); + t.name = s.name + "::Delete"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.referenceType.equivalent("ViewPageContainerDeleteActionDefinition"); + + log.debug("AccessViewDeleteAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclaration.etl index 5c2cf004..9d3d2569 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclaration.etl @@ -14,7 +14,10 @@ rule MenuTableNavigationItem t.target = s.equivalent("AccessTablePageDefinition"); - if (s.eContainer.isTypeOf(JSL!UIMenuDeclaration)) { + if (s.eContainer.isKindOf(JSL!UIMenuGroupDeclaration)) { + s.eContainer.equivalent("MenuItemGroup").items.add(t); + t.~pos = s.eContainer.members.indexOf(s); + } else { var navigationController = rootMenu.equivalent("Application").navigationController; navigationController.items.add(t); t.~pos = s.eContainer.members.indexOf(s); @@ -22,1106 +25,3 @@ rule MenuTableNavigationItem log.debug("MenuTableNavigationItem: " + s.name); } - -rule AccessTablePageDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::PageDefinition { - guard: rootMenu.containsVisualElement(s) - - var relation = s.actorAccess.target; - - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTablePageDefinition"); - t.name = s.getFqName() + "::AccessTablePage"; - t.container = s.equivalent("AccessTablePageContainer"); - t.dataElement = relation.equivalent("RelationType"); - t.dataElement.memberType = UI!ui::data::MemberType#ACCESS; - - t.actions.add(s.equivalent("AccessTableRowOpenPageAction")); - if (relation.isRefreshAllowed()) { - t.actions.add(s.equivalent("AccessTableTableRefreshAction")); - } - if (relation.isDeleteAllowed()) { - t.actions.add(s.equivalent("AccessTableRowDeleteAction")); - } - if (relation.isFilterSupported()) { - t.actions.add(s.equivalent("AccessTableTableFilterAction")); - } - if (relation.isCreateAllowed()) { - t.actions.add(s.equivalent("AccessTableTableOpenCreateAction")); - } - if (relation.isAddReferenceAllowed()) { - t.actions.add(table.equivalent("ViewTableDeclarationOpenAddSelectorAction")); - } - if (relation.isRemoveReferenceAllowed()) { - t.actions.add(table.equivalent("AccessTableTableClearAction")); - t.actions.add(table.equivalent("AccessTableTableBulkRemoveAction")); - } - - rootMenu.equivalent("Application").pages.add(t); - - log.debug("Create AccessTablePageDefinition: " + t.name); -} - -@lazy -rule AccessTableBackAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableBackAction"); - t.name = s.name + "::Back"; - t.actionDefinition = s.equivalent("AccessTablePageContainerBackActionDefinition"); - - log.debug("AccessTableBackAction: " + t.name); -} - -rule AccessTablePageContainer - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::PageContainer { - guard: rootMenu.containsVisualElement(s) - - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTablePageContainer"); - t.name = s.getFqName() + "::Table::PageContainer"; - t.label = s.getLabelWithNameFallback(); - t.titleFrom = UI!ui::TitleFrom#LABEL; - t.type = UI!ui::PageContainerType#TABLE; - t.children.add(s.equivalent("AccessTablePageContainerVisualElement")); - t.actionButtonGroup = s.equivalent("AccessTablePageContainerButtonGroup"); - t.dataElement = s.actorAccess.target.referenceType.equivalent("ClassType"); - t.onInit = s.equivalent("AccessTableTableRefreshActionDefinition"); - - rootMenu.equivalent("Application").pageContainers.add(t); - - /* - for (dataFeature in s.additionalMaskFeatures) { - var attributeType = dataFeature.getMember().mapAttributeType(s.eContainer.equivalent("ClassType")); - t.additionalMaskAttributes.add(attributeType); - } - */ - - log.debug("Create AccessTablePageDefinition: " + t.name); -} - -@lazy -rule AccessTablePageContainerButtonGroup - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::ButtonGroup { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTablePageContainerButtonGroup"); - t.name = s.getFqName() + "::PageActions"; - t.label = "Actions"; - - t.buttons.add(s.equivalent("AccessTablePageContainerBackButton")); - - log.debug("AccessTablePageContainerButtonGroup: " + t.name); -} - -@lazy -rule AccessTablePageContainerBackButtonIcon - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Icon { - t.iconName = "arrow-left"; - t.name = s.name + "BackIcon"; - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTablePageContainerBackButtonIcon"); -} - -@lazy -rule AccessTablePageContainerBackActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::BackActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTablePageContainerBackActionDefinition"); - t.name = s.getFqName() + "::Back"; - log.debug("AccessTablePageContainerBackActionDefinition: " + t.name); -} - -@lazy -rule AccessTablePageContainerBackButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTablePageContainerBackButton"); - t.name = s.getFqName() + "::Back"; - t.label = "Back"; - t.buttonStyle = "text"; - t.icon = s.equivalent("AccessTablePageContainerBackButtonIcon"); - t.actionDefinition = s.equivalent("AccessTablePageContainerBackActionDefinition"); - log.debug("AccessTablePageContainerBackButton: " + t.name); -} - -@lazy -rule AccessTablePageContainerVisualElement - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Flex { - t.~pos = 0; - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTablePageContainerVisualElement"); - t.name = s.name; - t.direction = UI!Axis#VERTICAL; - t.mainAxisAlignment = UI!ui::MainAxisAlignment#START; - t.crossAxisAlignment = UI!ui::CrossAxisAlignment#STRETCH; - t.col = 12d; - t.children.add(s.equivalent("AccessTableTable")); - t.frame = s.equivalent("ViewLinkDeclarationSetSelectorFrame"); - - log.debug("AccessTablePageContainerVisualElement: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorFrame - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Frame { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorFrame"); -} - -@lazy -rule AccessTableTable - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Table { - var id = rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTable"; - t.setId(id); - t.col = 12d; - t.label = s.getLabelWithNameFallback(); - t.name = s.name + "::Table"; - t.dataElement = s.actorAccess.target.referenceType.equivalent("ClassType"); - t.relationName = ""; - if (t.~pos.isUndefined()) { - t.~pos = 0; - } - - var rowDeclaration = s.referenceType; - var primitiveFields = rowDeclaration.members.select(m | m.transferField.isDefined() and m.transferField.target.referenceType.`primitive`.isDefined()); - - for (field in primitiveFields) { - var col = field.equivalentDiscriminated("RowColumnDeclarationPrimitiveColumn", id); - t.columns.add(col); - if (col.attributeType.isFilterable) { - t.filters.add(field.equivalentDiscriminated("RowColumnDeclarationPrimitiveColumnFilter", id)); - } - } - - t.tableActionButtonGroup = s.equivalent("AccessTableTableButtonGroup"); - t.rowActionButtonGroup = s.equivalent("AccessTableRowButtonGroup"); - - // TODO transform selector row per page - t.selectorRowsPerPage = 10; - - log.debug("AccessTableTable: " + t.name); -} - -@lazy -rule AccessTableTableButtonGroup - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::ButtonGroup { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableButtonGroup"); - t.name = s.name + "::InlineViewTableButtonGroup"; - t.label = "Actions"; - - // TODO add buttons - - var relation = s.actorAccess.target; - - if (relation.isFilterSupported()) { - t.buttons.add(s.equivalent("AccessTableTableFilterButton")); - } - if (relation.isRefreshAllowed()) { - t.buttons.add(s.equivalent("AccessTableTableRefreshButton")); - } - if (relation.isCreateAllowed()) { - t.buttons.add(s.equivalent("AccessTableTableOpenCreateButton")); - } - if (relation.isAddReferenceAllowed()) { - t.buttons.add(s.equivalent("AccessTableTableOpenAddSelectorButton")); - } - if (relation.isRemoveReferenceAllowed()) { - t.buttons.add(s.equivalent("AccessTableTableClearButton")); - t.buttons.add(s.equivalent("AccessTableTableBulkRemoveButton")); - } - - log.debug("AccessTableTableButtonGroup: " + t.name); -} - -@lazy -rule AccessTableRowButtonGroup - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::ButtonGroup { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableRowButtonGroup"); - t.name = s.name + "InlineViewTableRowButtonGroup"; - t.label = "Actions"; - - // TODO add buttons - - if (s.getUpdateViewModifier().isDefined()) { - t.buttons.add(s.equivalent("AccessTableRowOpenPageButton")); - } - if (s.actorAccess.target.isDeleteAllowed()) { - t.buttons.add(s.equivalent("AccessTableRowDeleteButton")); - } - - log.debug("AccessTableRowButtonGroup: " + t.name); -} - - -@lazy -rule AccessTableTableFilterButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableFilterButton"); - t.name = s.name + "::Filter"; - t.icon = s.equivalent("AccessTableTableFilterButtonIcon"); - t.label = "Filter"; - t.buttonStyle = "text"; - t.actionDefinition = s.equivalent("AccessTableTableFilterActionDefinition"); - - log.debug("AccessTableTableFilterButton: " + t.name); -} - -@lazy -rule AccessTableTableFilterButtonIcon - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Icon { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableFilterButtonIcon"); - t.name = s.name + "FilterIcon"; - t.iconName = "filter"; - - log.debug("AccessTableTableFilterButtonIcon: " + t.name); -} - -@lazy -rule AccessTableTableFilterActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::FilterActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableFilterActionDefinition"); - t.name = s.name + "::Filter"; - t.targetType = s.referenceType.equivalent("ClassType"); - - log.debug("AccessTableTableFilterActionDefinition: " + t.name); -} - -@lazy -rule AccessTableTableFilterAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableFilterAction"); - t.name = s.name + "::Filter"; - t.actionDefinition = s.equivalent("AccessTableTableFilterActionDefinition"); - - log.debug("AccessTableTableFilterAction: " + t.name); -} - -@lazy -rule AccessTableTableRefreshButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableRefreshButton"); - t.name = s.name + "::Refresh"; - t.icon = s.equivalent("AccessTableTableRefreshButtonIcon"); - t.label = "Refresh"; - t.buttonStyle = "text"; - t.actionDefinition = s.equivalent("AccessTableTableRefreshActionDefinition"); - - log.debug("AccessTableTableRefreshButton: " + t.name); -} - -@lazy -rule AccessTableTableRefreshButtonIcon - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Icon { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableRefreshButtonIcon"); - t.name = s.name + "RefreshIcon"; - t.iconName = "refresh"; - - log.debug("AccessTableTableRefreshButtonIcon: " + t.name); -} - -@lazy -rule AccessTableTableRefreshActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::RefreshActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableRefreshActionDefinition"); - t.name = s.name + "::Refresh"; - t.targetType = s.referenceType.equivalent("ClassType"); - - log.debug("AccessTableTableRefreshActionDefinition: " + t.name); -} - -@lazy -rule AccessTableTableRefreshAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableRefreshAction"); - t.name = s.name + "::Refresh"; - t.actionDefinition = s.equivalent("AccessTableTableRefreshActionDefinition"); - - log.debug("AccessTableTableRefreshAction: " + t.name); -} - -@lazy -rule AccessTableTableOpenCreateButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableOpenCreateButton"); - t.name = s.name + "::OpenCreate"; - t.icon = s.equivalent("AccessTableTableOpenCreateButtonIcon"); - t.label = "Create"; - t.buttonStyle = "text"; - t.actionDefinition = s.equivalent("AccessTableTableOpenCreateActionDefinition"); - - log.debug("AccessTableTableOpenCreateButton: " + t.name); -} - -@lazy -rule AccessTableTableOpenCreateButtonIcon - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Icon { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableOpenCreateButtonIcon"); - t.name = s.name + "OpenCreateIcon"; - t.iconName = "file-document-plus"; - - log.debug("AccessTableTableFilterButtonIcon: " + t.name); -} - -@lazy -rule AccessTableTableOpenCreateActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::OpenCreateFormActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableOpenCreateActionDefinition"); - t.name = s.name + "::OpenCreate"; - t.targetType = s.getCreateFormModifier().form.map.transfer.equivalent("ClassType"); - - log.debug("AccessTableTableOpenCreateActionDefinition: " + t.name); -} - -@lazy -rule AccessTableTableOpenCreateAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableOpenCreateAction"); - t.name = s.name + "::OpenCreate"; - t.actionDefinition = s.equivalent("AccessTableTableOpenCreateActionDefinition"); - - t.targetPageDefinition = s.equivalent("AccessTableCreateFormPageDefinition"); - - log.debug("AccessTableTableOpenCreateAction: " + t.name); -} - -@lazy -rule AccessTableRowOpenPageButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableRowOpenPageButton"); - t.name = s.name + "::View"; - t.icon = s.equivalent("AccessTableRowOpenPageButtonIcon"); - t.label = "View"; - t.buttonStyle = "contained"; - t.actionDefinition = s.equivalent("AccessTableRowOpenPageActionDefinition"); - - log.debug("AccessTableRowOpenPageButton: " + t.name); -} - -@lazy -rule AccessTableRowOpenPageButtonIcon - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Icon { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableRowOpenPageButtonIcon"); - t.name = s.name + "RowOpenIcon"; - t.iconName = "visibility"; - - log.debug("AccessTableRowOpenPageButtonIcon: " + t.name); -} - -@lazy -rule AccessTableRowOpenPageActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::OpenPageActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableRowOpenPageActionDefinition"); - t.name = s.name + "::View"; - t.targetType = s.getUpdateViewModifier().view.map.transfer.equivalent("ClassType"); - - //var rowLinks = s.referenceType.members.select(m | m.isTypeOf(JSL!RowLinkDeclaration)); - - //t.linkRelation = rowLinks.selectOne(l | l.getDetail().isDefined()).equivalent("RelationType"); - - log.debug("AccessTableRowOpenPageActionDefinition: " + t.name); -} - -@lazy -rule AccessTableRowOpenPageAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableRowOpenPageAction"); - - t.name = s.name + "::OpenPage"; - t.actionDefinition = s.equivalent("AccessTableRowOpenPageActionDefinition"); - - t.targetPageDefinition = s.equivalent("AccessTableViewPageDefinition"); - - log.debug("AccessTableRowOpenPageAction: " + t.name); -} - -@lazy -rule AccessTableRowDeleteButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableRowDeleteButton"); - t.name = s.name + "::RowDelete"; - t.icon = s.equivalent("AccessTableRowDeleteButtonIcon"); - t.label = "Delete"; - t.buttonStyle = "contained"; - t.actionDefinition = s.equivalent("AccessTableRowDeleteActionDefinition"); - - log.debug("AccessTableRowDeleteButton: " + t.name); -} - -@lazy -rule AccessTableRowDeleteButtonIcon - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Icon { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableRowDeleteButtonIcon"); - t.name = s.name + "RowDeleteIcon"; - t.iconName = "delete_forever"; - - log.debug("AccessTableRowDeleteButtonIcon: " + t.name); -} - -@lazy -rule AccessTableRowDeleteActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::RowDeleteActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableRowDeleteActionDefinition"); - t.name = s.name + "::RowDelete"; - t.targetType = s.referenceType.map.transfer.equivalent("ClassType"); - - log.debug("AccessTableRowDeleteActionDefinition: " + t.name); -} - -@lazy -rule AccessTableRowDeleteAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableRowDeleteAction"); - t.name = s.name + "::RowDelete"; - t.actionDefinition = s.equivalent("AccessTableRowDeleteActionDefinition"); - - log.debug("AccessTableRowDeleteAction: " + t.name); -} - -@lazy -rule AccessTableTableOpenAddSelectorButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableOpenAddSelectorButton"); - t.name = s.name + "::OpenAddSelector"; - t.icon = s.equivalent("AccessTableTableOpenAddSelectorButtonIcon"); - t.label = "Add"; - t.buttonStyle = "text"; - t.actionDefinition = s.equivalent("AccessTableTableOpenAddSelectorActionDefinition"); - - log.debug("AccessTableTableOpenAddSelectorButton: " + t.name); -} - -@lazy -rule AccessTableTableOpenAddSelectorButtonIcon - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Icon { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableOpenAddSelectorButtonIcon"); - t.name = s.name + "OpenAddSelectorIcon"; - t.iconName = "attachment-plus"; - - log.debug("AccessTableTableOpenAddSelectorButtonIcon: " + t.name); -} - -@lazy -rule AccessTableTableOpenAddSelectorActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::OpenAddSelectorActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableOpenAddSelectorActionDefinition"); - t.name = s.name + "::OpenAddSelector"; - t.isContainedRelationAction = true; - t.selectorFor = s.equivalent("AccessTableTableAddSelectorActionDefinition"); - - log.debug("AccessTableTableOpenAddSelectorActionDefinition: " + t.name); -} - -@lazy -rule AccessTableTableOpenAddSelectorAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableOpenAddSelectorAction"); - t.name = s.name + "::OpenAddSelector"; - t.actionDefinition = s.equivalent("AccessTableTableOpenAddSelectorActionDefinition"); - - t.targetPageDefinition = s.equivalent("AccessTableTableAddSelectorPageDefinition"); - - log.debug("AccessTableTableOpenAddSelectorAction: " + t.name); -} - -@lazy -rule AccessTableTableBulkRemoveButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableBulkRemoveButton"); - t.name = s.name + "::BulkRemove"; - t.icon = s.equivalent("AccessTableTableBulkRemoveButtonIcon"); - t.label = "Remove"; - t.buttonStyle = "text"; - t.actionDefinition = s.equivalent("AccessTableTableBulkRemoveActionDefinition"); - - log.debug("AccessTableTableBulkRemoveButton: " + t.name); -} - -@lazy -rule AccessTableTableBulkRemoveButtonIcon - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Icon { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableBulkRemoveButtonIcon"); - t.name = s.name + "RemoveIcon"; - t.iconName = "link-off"; - - log.debug("AccessTableTableBulkRemoveButtonIcon: " + t.name); -} - -@lazy -rule AccessTableTableBulkRemoveActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::BulkRemoveActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableBulkRemoveActionDefinition"); - t.name = s.name + "::BulkRemove"; - t.targetType = s.referenceType.map.transfer.equivalent("ClassType"); - t.isContainedRelationAction = true; - t.isBulk = true; - - log.debug("AccessTableTableBulkRemoveActionDefinition: " + t.name); -} - -@lazy -rule AccessTableTableBulkRemoveAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableBulkRemoveAction"); - t.name = s.name + "::BulkRemove"; - t.actionDefinition = s.equivalent("AccessTableTableBulkRemoveActionDefinition"); - - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.targetDataElement = s.actorAccess.target.equivalent("RelationType"); - - log.debug("AccessTableTableBulkRemoveAction: " + t.name); -} - -@lazy -rule AccessTableTableClearButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableClearButton"); - t.name = s.name + "::Clear"; - t.icon = s.equivalent("AccessTableTableClearButtonIcon"); - t.label = "Clear"; - t.buttonStyle = "text"; - t.actionDefinition = s.equivalent("AccessTableTableClearActionDefinition"); - - log.debug("AccessTableTableClearButton: " + t.name); -} - -@lazy -rule AccessTableTableClearButtonIcon - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Icon { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableClearButtonIcon"); - t.name = s.name + "ClearIcon"; - t.iconName = "link-off"; - - log.debug("AccessTableTableClearButtonIcon: " + t.name); -} - -@lazy -rule AccessTableTableClearActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::ClearActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableClearActionDefinition"); - t.name = s.name + "::Clear"; - t.isContainedRelationAction = true; - - log.debug("AccessTableTableClearActionDefinition: " + t.name); -} - -@lazy -rule AccessTableTableClearAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableClearAction"); - t.name = s.name + "::Clear"; - t.actionDefinition = s.equivalent("AccessTableTableClearActionDefinition"); - - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.targetDataElement = s.actorAccess.target.equivalent("RelationType"); - - log.debug("AccessTableTableClearAction: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorPageDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::PageDefinition { - - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorPageDefinition"); - - t.name = s.getFqName() + "::AddSelectorPage"; - - t.container = s.equivalent("AccessTableTableAddSelectorPageContainer"); - t.dataElement = s.actorAccess.target.equivalent("RelationType"); - t.dataElement.memberType = UI!ui::data::MemberType#ACCESS; - t.openInDialog = true; - t.dialogSize = UI!ui::DialogSize#MD; - - t.actions.add(s.equivalent("AccessTableTableAddSelectorAddAction")); - t.actions.add(s.equivalent("AccessTableTableAddSelectorBackAction")); - t.actions.add(s.equivalent("AccessTableTableAddSelectorTableFilterAction")); - t.actions.add(s.equivalent("AccessTableTableAddSelectorTableRangeAction")); - - rootMenu.equivalent("Application").pages.add(t); - - log.debug("AccessTableTableAddSelectorPageDefinition: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorAddAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorAddAction"); - t.name = s.getFqName() + "::AddSelector::Add"; - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.actionDefinition = s.equivalent("AccessTableTableAddSelectorTableAddSelectorAddActionDefinition"); - - log.debug("AccessTableTableAddSelectorAddAction: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorBackAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorBackAction"); - t.name = s.getFqName() + "::AddSelector::Back"; - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.actionDefinition = s.equivalent("AccessTableTableAddSelectorTableBackActionDefinition"); - - log.debug("AccessTableTableAddSelectorBackAction: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableFilterAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableFilterAction"); - t.name = s.getFqName() + "::AddSelector::Table::Filter"; - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.targetDataElement = s.actorAccess.target.equivalent("RelationType"); - t.actionDefinition = s.equivalent("AccessTableTableAddSelectorTableTableFilterActionDefinition"); - - log.debug("AccessTableTableAddSelectorTableFilterAction: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableRangeAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableRangeAction"); - t.name = s.getFqName() + "::AddSelector::Table::Range"; - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.targetDataElement = s.actorAccess.target.equivalent("RelationType"); - t.actionDefinition = s.equivalent("AccessTableTableAddSelectorTableRangeActionDefinition"); - - log.debug("AccessTableTableAddSelectorTableRangeAction: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorPageContainer - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::PageContainer { - - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorPageContainer"); - - t.name = s.getFqName() + "::AddSelector::PageContainer"; - t.label = s.getLabelWithNameFallback(); - t.titleFrom = UI!ui::TitleFrom#LABEL; - t.type = UI!ui::PageContainerType#TABLE; - t.onInit = s.equivalent("AccessTableTableAddSelectorTableRangeActionDefinition"); - - t.children.add(s.equivalent("AccessTableTableAddSelectorTableAddSelectorVisualElement")); - t.actionButtonGroup = s.equivalent("AccessTableTableAddSelectorTableAddSelectorButtonGroup"); - t.dataElement = s.actorAccess.target.referenceType.equivalent("ClassType"); - t.isSelector = true; - t.isRelationSelector = true; - - rootMenu.equivalent("Application").pageContainers.add(t); - - log.debug("AccessTableTableAddSelectorPageContainer: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableRangeActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::SelectorRangeActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableRangeActionDefinition"); - - t.name = s.getFqName() + "::AddSelector::Table::Range"; - t.targetType = s.referenceType.map.transfer.equivalent("ClassType"); - - log.debug("AccessTableTableAddSelectorTableRangeActionDefinition: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableAddSelectorButtonGroup - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::ButtonGroup { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableAddSelectorButtonGroup"); - t.name = s.getFqName() + "::AddSelectorTableAddSelectorButtonGroup"; - t.label = "Actions"; - - t.buttons.add(s.equivalent("AccessTableTableAddSelectorTableAddSelectorBackButton")); - t.buttons.add(s.equivalent("AccessTableTableAddSelectorTableAddSelectorAddButton")); - - log.debug("AccessTableTableAddSelectorTableAddSelectorButtonGroup: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableAddSelectorBackButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableAddSelectorBackButton"); - t.name = s.getFqName() + "::Back"; - t.label = "Back"; - t.buttonStyle = "text"; - t.icon = "arrow-left".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("AccessTableTableAddSelectorTableBackActionDefinition"); - - log.debug("AccessTableTableAddSelectorTableAddSelectorBackButton: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableBackActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::BackActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableBackActionDefinition"); - t.name = s.getFqName() + "::Back"; - log.debug("AccessTableTableAddSelectorTableBackActionDefinition: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableAddSelectorAddButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableAddSelectorAddButton"); - t.name = s.getFqName() + "::Add"; - t.label = "Add"; - t.buttonStyle = "contained"; - t.icon = "attachment-plus".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("AccessTableTableAddSelectorTableAddSelectorAddActionDefinition"); - - log.debug("AccessTableTableAddSelectorTableAddSelectorAddButton: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableAddSelectorAddActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::AddActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableAddSelectorAddActionDefinition"); - t.name = s.getFqName() + "::Add"; - t.targetType = s.referenceType.map.transfer.equivalent("ClassType"); - log.debug("AccessTableTableAddSelectorTableAddSelectorAddActionDefinition: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableAddSelectorVisualElement - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Flex { - t.~pos = 0; - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableAddSelectorVisualElement"); - t.name = s.name; - t.direction = UI!Axis#VERTICAL; - t.mainAxisAlignment = UI!ui::MainAxisAlignment#START; - t.crossAxisAlignment = UI!ui::CrossAxisAlignment#STRETCH; - t.col = 12d; - t.children.add(s.equivalent("AccessTableTableAddSelectorTableTable")); - t.frame = s.equivalent("AccessTableTableAddSelectorTableAddSelectorFrame"); - - log.debug("AccessTableTableAddSelectorTableAddSelectorVisualElement: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableAddSelectorFrame - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Frame { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableAddSelectorFrame"); -} - -@lazy -rule AccessTableTableAddSelectorTableTable - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Table { - var id = rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableTable"; - t.setId(id); - t.col = 12d; - t.label = s.getLabelWithNameFallback(); - t.isSelectorTable = true; - t.isRelationSelectorTable = true; - t.allowSelectMultiple = true; - t.name = s.name + "::Add::Selector"; - t.relationName = ""; - t.dataElement = s.referenceType.map.transfer.equivalent("ClassType"); - t.tableActionButtonGroup = s.equivalent("AccessTableTableAddSelectorTableTableButtonGroup"); - t.~pos = s.~pos; - t.showTotalCount = false; - t.selectorRowsPerPage = 10; - - if (s.getRows().isDefined()) { - t.rowsPerPage = s.getRows().value.asInteger(); - } else { - t.rowsPerPage = 10; - } - if (t.~pos.isUndefined()) { - t.~pos = 0; - } - - // TODO eventually selector should work? - var rowDeclaration = s.referenceType; - - var primitiveFields = rowDeclaration.members.select(m | m.isTypeOf(JSL!RowFieldDeclaration) and m.referenceType.`primitive`.isDefined()); - // var links = rowDeclaration.members.select(m | m.isTypeOf(JSL!RowLinkDeclaration)); - - for (field in primitiveFields) { - var col = field.equivalentDiscriminated("TablePrimitiveColumn", id); - t.columns.add(col); - if (col.attributeType.isFilterable) { - t.filters.add(field.equivalentDiscriminated("TablePrimitiveColumnFilter", id)); - } - } -/* - for (link in links) { - if (link.getDetail().isUndefined()) { - var col = link.equivalentDiscriminated("RowLinkDerivedColumn", id); - t.columns.add(col); - if (col.attributeType.isFilterable) { - t.filters.add(link.equivalentDiscriminated("RowLinkDerivedColumnFilter", id)); - } - } else { - // TODO generate open action from link with detail modifier - } - - } -*/ - log.debug("AccessTableTableAddSelectorTableTable: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableTableButtonGroup - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::ButtonGroup { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableTableButtonGroup"); - t.name = s.getFqName() + "::AddSelectorTableActions"; - t.label = "Actions"; - - t.buttons.add(s.equivalent("AccessTableTableAddSelectorTableTableFilterButton")); - t.buttons.add(s.equivalent("TransferObjectTableAddSelectorTableRefreshButton")); - - log.debug("AccessTableTableAddSelectorTableTableButtonGroup: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableTableFilterButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableTableFilterButton"); - t.name = s.getFqName() + "::AddSelector::Table::Filter"; - t.label = "Set Filters"; - t.buttonStyle = "text"; - t.icon = "filter".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("AccessTableTableAddSelectorTableTableFilterActionDefinition"); - - log.debug("AccessTableTableAddSelectorTableTableFilterButton: " + t.name); -} - -@lazy -rule AccessTableTableAddSelectorTableTableFilterActionDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::FilterActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableTableFilterActionDefinition"); - t.name = s.getFqName() + "::Table::Filter"; - log.debug("AccessTableTableAddSelectorTableTableFilterActionDefinition: " + t.name); -} - -@lazy -rule TransferObjectTableAddSelectorTableRefreshButton - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TransferObjectTableAddSelectorTableRefreshButton"); - t.name = s.getFqName() + "::AddSelector::Table::Refresh"; - t.label = "Refresh"; - t.buttonStyle = "text"; - t.icon = "refresh".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("AccessTableTableAddSelectorTableRangeActionDefinition"); - - log.debug("TransferObjectTableAddSelectorTableRefreshButton: " + t.name); -} - -rule AccessTableCreateFormPageDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::PageDefinition { - guard: rootMenu.containsVisualElement(s) and s.getCreateFormModifier().isDefined() - - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableCreateFormPageDefinition"); - t.openInDialog = true; - t.name = s.getFqName() + "::AccessFormPage"; - t.container = s.getCreateFormModifier().form.equivalent("FormPageContainer"); - t.dataElement = s.actorAccess.target.equivalent("RelationType"); - t.dataElement.memberType = UI!ui::data::MemberType#ACCESS; - - t.actions.add(s.equivalent("AccessTableCreateFormBackAction")); - t.actions.add(s.equivalent("AccessTableCreateFormCreateAction")); - if (s.actorAccess.target.isTemplateAllowed()) { - t.actions.add(s.equivalent("AccessTableCreateFormGetTemplateAction")); - } - - rootMenu.equivalent("Application").pages.add(t); - - log.debug("Create AccessTableCreateFormPageDefinition: " + t.name); -} - -@lazy -rule AccessTableCreateFormBackAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableCreateFormBackAction"); - t.name = s.name + "::Back"; - t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerBackActionDefinition"); - - log.debug("AccessTableCreateFormBackAction: " + t.name); -} - -@lazy -rule AccessTableCreateFormGetTemplateAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableCreateFormGetTemplateAction"); - t.name = s.name + "::GetTemplate"; - t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerGetTemplateActionDefinition"); - log.debug("AccessTableCreateFormGetTemplateAction: " + t.name); -} - -@lazy -rule AccessTableCreateFormCreateAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableCreateFormCreateAction"); - t.name = s.name + "::Create"; - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerCreateActionDefinition"); - t.targetPageDefinition = s.getCreateFormModifier().form.equivalent("AccessTableViewPageDefinition"); - - log.debug("AccessTableCreateFormCreateAction: " + t.name); -} - -rule AccessTableViewPageDefinition - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::PageDefinition { - guard: rootMenu.containsVisualElement(s) and s.getCreateFormModifier().isDefined() - - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableViewPageDefinition"); - - t.name = s.getFqName() + "::AccessViewPage"; - t.container = s.getUpdateViewModifier().view.equivalent("ViewPageContainer"); - - rootMenu.equivalent("Application").pages.add(t); - - t.dataElement = s.actorAccess.target.equivalent("RelationType"); - t.dataElement.memberType = UI!ui::data::MemberType#ACCESS; - - // var relations = s.referenceType.getDirectRelations(); - - /* - log.info("==================="); - log.info(t.name + ":"); - log.info(relations.collect(r | r.name).concat(", ")); - log.info("==================="); - */ - /* - for (link in relations.select(r | r.isKindOf(JSL!UIViewLinkDeclaration))) { - t.actions.add(link.equivalent("ViewLinkDeclarationOpenPageAction")); - } - - for (table in relations.select(r | r.isKindOf(JSL!UIViewTableDeclaration))) { - var detailLink = table.getDetailLink(); - - if (detailLink.isDefined()) { - t.actions.add(table.equivalent("ViewTableDeclarationOpenPageAction")); - } - } - */ - - t.actions.add(s.equivalent("AccessViewBackAction")); - if (s.actorAccess.target.isRefreshAllowed()) { - t.actions.add(s.equivalent("AccessViewRefreshAction")); - } - if (s.actorAccess.target.isUpdateAllowed()) { - t.actions.add(s.equivalent("AccessViewCancelAction")); - t.actions.add(s.equivalent("AccessViewUpdateAction")); - } - if (s.actorAccess.target.isDeleteAllowed()) { - t.actions.add(s.equivalent("AccessViewDeleteAction")); - } - - log.debug("Create AccessTableViewPageDefinition: " + t.name); -} - -@lazy -rule AccessViewBackAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewBackAction"); - t.name = s.getFqName() + "::Back"; - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerBackActionDefinition"); - - log.debug("AccessViewBackAction: " + t.name); -} - -@lazy -rule AccessViewRefreshAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewRefreshAction"); - t.name = s.getFqName() + "::Refresh"; - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerRefreshActionDefinition"); - - log.debug("AccessViewRefreshAction: " + t.name); -} - -@lazy -rule AccessViewCancelAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewCancelAction"); - t.name = s.getFqName() + "::Cancel"; - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerCancelActionDefinition"); - - log.debug("AccessViewCancelAction: " + t.name); -} - -@lazy -rule AccessViewUpdateAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewUpdateAction"); - t.name = s.getFqName() + "::Update"; - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerUpdateActionDefinition"); - - log.debug("AccessViewUpdateAction: " + t.name); -} - -@lazy -rule AccessViewDeleteAction - transform s: JSL!UIMenuTableDeclaration - to t: UI!ui::Action { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessViewDeleteAction"); - t.name = s.getFqName() + "::Delete"; - t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); - t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerDeleteActionDefinition"); - - log.debug("AccessViewDeleteAction: " + t.name); -} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationAddSelectorPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationAddSelectorPage.etl new file mode 100644 index 00000000..54a3578a --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationAddSelectorPage.etl @@ -0,0 +1,306 @@ +@lazy +rule AccessTableTableAddSelectorPageDefinition + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::PageDefinition { + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorPageDefinition"); + + t.name = s.getFqName() + "::AddSelectorPage"; + + t.container = s.referenceType.equivalent("TableAddSelectorPageContainer"); + t.dataElement = s.actorAccess.target.equivalent("RelationType"); + t.dataElement.memberType = UI!ui::data::MemberType#ACCESS; + t.openInDialog = true; + t.dialogSize = UI!ui::DialogSize#MD; + + t.actions.add(s.equivalent("AccessTableTableAddSelectorAddAction")); + t.actions.add(s.equivalent("AccessTableTableAddSelectorBackAction")); + t.actions.add(s.equivalent("AccessTableTableAddSelectorTableFilterAction")); + t.actions.add(s.equivalent("AccessTableTableAddSelectorTableRangeAction")); + + rootMenu.equivalent("Application").pages.add(t); + + log.debug("AccessTableTableAddSelectorPageDefinition: " + t.name); +} + +@lazy +rule TableAddSelectorPageContainer + transform s: JSL!UIRowDeclaration + to t: UI!ui::PageContainer { + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorPageContainer"); + + t.name = s.getFqName() + "::AddSelector::PageContainer"; + t.label = s.getLabelWithNameFallback(); + t.titleFrom = UI!ui::TitleFrom#LABEL; + t.type = UI!ui::PageContainerType#TABLE; + t.onInit = s.equivalent("TableAddSelectorTableRangeActionDefinition"); + + t.children.add(s.equivalent("TableAddSelectorVisualElement")); + t.actionButtonGroup = s.equivalent("TableAddSelectorButtonGroup"); + t.dataElement = s.actorAccess.target.referenceType.equivalent("ClassType"); + t.isSelector = true; + t.isRelationSelector = true; + + rootMenu.equivalent("Application").pageContainers.add(t); + + log.debug("TableAddSelectorPageContainer: " + t.name); +} + +@lazy +rule TableAddSelectorTableRangeActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::SelectorRangeActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorTableRangeActionDefinition"); + + t.name = s.getFqName() + "::AddSelector::Table::Range"; + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); + + log.debug("TableAddSelectorTableRangeActionDefinition: " + t.name); +} + +@lazy +rule TableAddSelectorButtonGroup + transform s: JSL!UIRowDeclaration + to t: UI!ui::ButtonGroup { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorButtonGroup"); + t.name = s.getFqName() + "::AddSelectorTableAddSelectorButtonGroup"; + t.label = "Actions"; + + t.buttons.add(s.equivalent("TableAddSelectorBackButton")); + t.buttons.add(s.equivalent("TableAddSelectorAddButton")); + + log.debug("TableAddSelectorButtonGroup: " + t.name); +} + +@lazy +rule TableAddSelectorBackButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorBackButton"); + t.name = s.getFqName() + "::Back"; + t.label = "Back"; + t.buttonStyle = "text"; + t.icon = "arrow-left".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("TableAddSelectorTableBackActionDefinition"); + + log.debug("TableAddSelectorBackButton: " + t.name); +} + +@lazy +rule TableAddSelectorTableBackActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::BackActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorTableBackActionDefinition"); + t.name = s.getFqName() + "::Back"; + log.debug("TableAddSelectorTableBackActionDefinition: " + t.name); +} + +@lazy +rule TableAddSelectorAddButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorAddButton"); + t.name = s.getFqName() + "::Add"; + t.label = "Add"; + t.buttonStyle = "contained"; + t.icon = "attachment-plus".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("TableAddSelectorAddActionDefinition"); + + log.debug("TableAddSelectorAddButton: " + t.name); +} + +@lazy +rule TableAddSelectorAddActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::AddActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorAddActionDefinition"); + t.name = s.getFqName() + "::Add"; + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); + + log.debug("TableAddSelectorAddActionDefinition: " + t.name); +} + +@lazy +rule TableAddSelectorVisualElement + transform s: JSL!UIRowDeclaration + to t: UI!ui::Flex { + t.~pos = 0; + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorVisualElement"); + t.name = s.name; + t.direction = UI!Axis#VERTICAL; + t.mainAxisAlignment = UI!ui::MainAxisAlignment#START; + t.crossAxisAlignment = UI!ui::CrossAxisAlignment#STRETCH; + t.col = 12d; + t.children.add(s.equivalent("TableAddSelectorTableTable")); + t.frame = s.equivalent("TableAddSelectorFrame"); + + log.debug("TableAddSelectorVisualElement: " + t.name); +} + +@lazy +rule TableAddSelectorFrame + transform s: JSL!UIRowDeclaration + to t: UI!ui::Frame { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorFrame"); +} + +@lazy +rule TableAddSelectorTableTable + transform s: JSL!UIRowDeclaration + to t: UI!ui::Table { + var id = rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorTableTable"; + t.setId(id); + t.col = 12d; + t.label = s.getLabelWithNameFallback(); + t.isSelectorTable = true; + t.isRelationSelectorTable = true; + t.allowSelectMultiple = true; + t.name = s.name + "::Add::Selector"; + t.relationName = ""; + t.dataElement = s.referenceType.map.transfer.equivalent("ClassType"); + t.tableActionButtonGroup = s.equivalent("TableAddSelectorTableTableButtonGroup"); + t.~pos = s.~pos; + t.showTotalCount = false; + t.selectorRowsPerPage = 10; + + if (s.getRows().isDefined()) { + t.rowsPerPage = s.getRows().value.asInteger(); + } else { + t.rowsPerPage = 10; + } + if (t.~pos.isUndefined()) { + t.~pos = 0; + } + + // TODO eventually selector should work? + var rowDeclaration = s.referenceType; + + var primitiveFields = s.members.select(m | m.isTypeOf(JSL!UIRowColumnDeclaration) and m.referenceType.`primitive`.isDefined()); + // var links = s.members.select(m | m.isTypeOf(JSL!RowLinkDeclaration)); + + for (field in primitiveFields) { + var col = field.transferField.target.equivalentDiscriminated("TablePrimitiveColumn", id); + t.columns.add(col); + if (col.attributeType.isFilterable) { + t.filters.add(field.transferField.target.equivalentDiscriminated("TablePrimitiveColumnFilter", id)); + } + } +/* + for (link in links) { + if (link.getDetail().isUndefined()) { + var col = link.equivalentDiscriminated("RowLinkDerivedColumn", id); + t.columns.add(col); + if (col.attributeType.isFilterable) { + t.filters.add(link.equivalentDiscriminated("RowLinkDerivedColumnFilter", id)); + } + } else { + // TODO generate open action from link with detail modifier + } + + } +*/ + log.debug("TableAddSelectorTableTable: " + t.name); +} + +@lazy +rule TableAddSelectorTableTableButtonGroup + transform s: JSL!UIRowDeclaration + to t: UI!ui::ButtonGroup { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorTableTableButtonGroup"); + t.name = s.getFqName() + "::AddSelectorTableActions"; + t.label = "Actions"; + + t.buttons.add(s.equivalent("TableAddSelectorTableTableFilterButton")); + t.buttons.add(s.equivalent("TransferObjectTableAddSelectorTableRefreshButton")); + + log.debug("TableAddSelectorTableTableButtonGroup: " + t.name); +} + +@lazy +rule TableAddSelectorTableTableFilterButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorTableTableFilterButton"); + t.name = s.getFqName() + "::AddSelector::Table::Filter"; + t.label = "Set Filters"; + t.buttonStyle = "text"; + t.icon = "filter".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("TableAddSelectorTableTableFilterActionDefinition"); + + log.debug("TableAddSelectorTableTableFilterButton: " + t.name); +} + +@lazy +rule TableAddSelectorTableTableFilterActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::FilterActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableAddSelectorTableTableFilterActionDefinition"); + t.name = s.getFqName() + "::Table::Filter"; + log.debug("TableAddSelectorTableTableFilterActionDefinition: " + t.name); +} + +@lazy +rule TransferObjectTableAddSelectorTableRefreshButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TransferObjectTableAddSelectorTableRefreshButton"); + t.name = s.getFqName() + "::AddSelector::Table::Refresh"; + t.label = "Refresh"; + t.buttonStyle = "text"; + t.icon = "refresh".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("TableAddSelectorTableRangeActionDefinition"); + + log.debug("TransferObjectTableAddSelectorTableRefreshButton: " + t.name); +} + + +@lazy +rule AccessTableTableAddSelectorAddAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorAddAction"); + t.name = s.getFqName() + "::AddSelector::Add"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.referenceType.equivalent("TableAddSelectorAddActionDefinition"); + + log.debug("AccessTableTableAddSelectorAddAction: " + t.name); +} + +@lazy +rule AccessTableTableAddSelectorBackAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorBackAction"); + t.name = s.getFqName() + "::AddSelector::Back"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.referenceType.equivalent("TableAddSelectorTableBackActionDefinition"); + + log.debug("AccessTableTableAddSelectorBackAction: " + t.name); +} + +@lazy +rule AccessTableTableAddSelectorTableFilterAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableFilterAction"); + t.name = s.getFqName() + "::AddSelector::Table::Filter"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.targetDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.referenceType.equivalent("TableAddSelectorTableTableFilterActionDefinition"); + + log.debug("AccessTableTableAddSelectorTableFilterAction: " + t.name); +} + +@lazy +rule AccessTableTableAddSelectorTableRangeAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableAddSelectorTableRangeAction"); + t.name = s.getFqName() + "::AddSelector::Table::Range"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.targetDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.referenceType.equivalent("TableAddSelectorTableRangeActionDefinition"); + + log.debug("AccessTableTableAddSelectorTableRangeAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationFormPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationFormPage.etl new file mode 100644 index 00000000..e33d5aa4 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationFormPage.etl @@ -0,0 +1,56 @@ +rule AccessTableCreateFormPageDefinition + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::PageDefinition { + guard: rootMenu.containsVisualElement(s) and s.getCreateFormModifier().isDefined() + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableCreateFormPageDefinition"); + t.openInDialog = true; + t.name = s.getFqName() + "::AccessFormPage"; + t.container = s.getCreateFormModifier().form.equivalent("FormPageContainer"); + t.dataElement = s.actorAccess.target.equivalent("RelationType"); + t.dataElement.memberType = UI!ui::data::MemberType#ACCESS; + + t.actions.add(s.equivalent("AccessTableCreateFormBackAction")); + t.actions.add(s.equivalent("AccessTableCreateFormCreateAction")); + if (s.actorAccess.target.isTemplateAllowed()) { + t.actions.add(s.equivalent("AccessTableCreateFormGetTemplateAction")); + } + + rootMenu.equivalent("Application").pages.add(t); + + log.debug("Create AccessTableCreateFormPageDefinition: " + t.name); +} + +@lazy +rule AccessTableCreateFormBackAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableCreateFormBackAction"); + t.name = s.name + "::Back"; + t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerBackActionDefinition"); + + log.debug("AccessTableCreateFormBackAction: " + t.name); +} + +@lazy +rule AccessTableCreateFormGetTemplateAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableCreateFormGetTemplateAction"); + t.name = s.name + "::GetTemplate"; + t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerGetTemplateActionDefinition"); + log.debug("AccessTableCreateFormGetTemplateAction: " + t.name); +} + +@lazy +rule AccessTableCreateFormCreateAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableCreateFormCreateAction"); + t.name = s.name + "::Create"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerCreateActionDefinition"); + t.targetPageDefinition = s.getCreateFormModifier().form.equivalent("AccessTableViewPageDefinition"); + + log.debug("AccessTableCreateFormCreateAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationTablePage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationTablePage.etl new file mode 100644 index 00000000..4d7f37bc --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationTablePage.etl @@ -0,0 +1,139 @@ + +rule AccessTablePageDefinition + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::PageDefinition { + guard: rootMenu.containsVisualElement(s) + + var relation = s.actorAccess.target; + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTablePageDefinition"); + t.name = s.getFqName() + "::AccessTablePage"; + t.container = s.referenceType.equivalent("TablePageContainer"); + t.dataElement = relation.equivalent("RelationType"); + t.dataElement.memberType = UI!ui::data::MemberType#ACCESS; + + if (s.getUpdateViewModifier().isDefined()) { + t.actions.add(s.equivalent("AccessTableOpenPageAction")); + } + if (relation.isRefreshAllowed()) { + t.actions.add(s.equivalent("AccessTableTableRefreshAction")); + } + if (relation.isDeleteAllowed()) { + t.actions.add(s.equivalent("AccessTableRowDeleteAction")); + } + if (relation.isFilterSupported()) { + t.actions.add(s.equivalent("AccessTableTableFilterAction")); + } + if (s.getCreateFormModifier().isDefined()) { + t.actions.add(s.equivalent("AccessTableTableOpenCreateAction")); + } + if (s.getSelectorTableModifier().isDefined()) { + t.actions.add(table.equivalent("ViewTableDeclarationOpenAddSelectorAction")); + } + if (s.getSelectorTableModifier().isDefined()) { + t.actions.add(table.equivalent("AccessTableTableClearAction")); + t.actions.add(table.equivalent("AccessTableTableBulkRemoveAction")); + } + + rootMenu.equivalent("Application").pages.add(t); + + log.debug("Create AccessTablePageDefinition: " + t.name); +} + +@lazy +rule AccessTableBackAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableBackAction"); + t.name = s.name + "::Back"; + t.actionDefinition = s.referenceType.equivalent("TablePageContainerBackActionDefinition"); + + log.debug("AccessTableBackAction: " + t.name); +} + +@lazy +rule AccessTableTableOpenCreateAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableOpenCreateAction"); + t.name = s.name + "::OpenCreate"; + t.actionDefinition = s.referenceType.equivalent("TableTableOpenCreateActionDefinition"); + t.targetPageDefinition = s.equivalent("AccessTableCreateFormPageDefinition"); + + log.debug("AccessTableTableOpenCreateAction: " + t.name); +} + +@lazy +rule AccessTableTableRefreshAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableRefreshAction"); + t.name = s.name + "::Refresh"; + t.actionDefinition = s.referenceType.equivalent("TableTableRefreshActionDefinition"); + + log.debug("AccessTableTableRefreshAction: " + t.name); +} + +@lazy +rule AccessTableTableFilterAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableFilterAction"); + t.name = s.name + "::Filter"; + t.actionDefinition = s.referenceType.equivalent("TableTableFilterActionDefinition"); + + log.debug("AccessTableTableFilterAction: " + t.name); +} + +@lazy +rule AccessTableOpenPageAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableOpenPageAction"); + + t.name = s.name + "::OpenPage"; + t.actionDefinition = s.referenceType.equivalent("TableOpenPageActionDefinition"); + + t.targetPageDefinition = s.equivalent("AccessTableViewPageDefinition"); + + log.debug("AccessTableOpenPageAction: " + t.name); +} + +@lazy +rule AccessTableRowDeleteAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableRowDeleteAction"); + t.name = s.name + "::RowDelete"; + t.actionDefinition = s.referenceType.equivalent("TableRowDeleteActionDefinition"); + + log.debug("AccessTableRowDeleteAction: " + t.name); +} + +@lazy +rule AccessTableTableBulkRemoveAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableBulkRemoveAction"); + t.name = s.name + "::BulkRemove"; + t.actionDefinition = s.equivalent("AccessTableTableBulkRemoveActionDefinition"); + + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.targetDataElement = s.actorAccess.target.equivalent("RelationType"); + + log.debug("AccessTableTableBulkRemoveAction: " + t.name); +} + +@lazy +rule AccessTableTableClearAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableTableClearAction"); + t.name = s.name + "::Clear"; + t.actionDefinition = s.equivalent("AccessTableTableClearActionDefinition"); + + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.targetDataElement = s.actorAccess.target.equivalent("RelationType"); + + log.debug("AccessTableTableClearAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationViewPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationViewPage.etl new file mode 100644 index 00000000..7b87ba1a --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/menuTableDeclarationViewPage.etl @@ -0,0 +1,112 @@ + +rule AccessTableViewPageDefinition + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::PageDefinition { + guard: rootMenu.containsVisualElement(s) and s.getUpdateViewModifier().isDefined() + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableViewPageDefinition"); + + t.name = s.getFqName() + "::AccessTableViewPage"; + t.container = s.getUpdateViewModifier().view.equivalent("ViewPageContainer"); + + rootMenu.equivalent("Application").pages.add(t); + + t.dataElement = s.actorAccess.target.equivalent("RelationType"); + t.dataElement.memberType = UI!ui::data::MemberType#ACCESS; + + // var relations = s.referenceType.getDirectRelations(); + + /* + log.info("==================="); + log.info(t.name + ":"); + log.info(relations.collect(r | r.name).concat(", ")); + log.info("==================="); + */ + /* + for (link in relations.select(r | r.isKindOf(JSL!UIViewLinkDeclaration))) { + t.actions.add(link.equivalent("ViewLinkDeclarationOpenPageAction")); + } + + for (table in relations.select(r | r.isKindOf(JSL!UIViewTableDeclaration))) { + var detailLink = table.getDetailLink(); + + if (detailLink.isDefined()) { + t.actions.add(table.equivalent("ViewTableDeclarationOpenPageAction")); + } + } + */ + + t.actions.add(s.equivalent("AccessTableViewBackAction")); + if (s.actorAccess.target.isRefreshAllowed()) { + t.actions.add(s.equivalent("AccessTableViewRefreshAction")); + } + if (s.actorAccess.target.isUpdateAllowed()) { + t.actions.add(s.equivalent("AccessTableViewCancelAction")); + t.actions.add(s.equivalent("AccessTableViewUpdateAction")); + } + if (s.actorAccess.target.isDeleteAllowed()) { + t.actions.add(s.equivalent("AccessTableViewDeleteAction")); + } + + log.debug("Create AccessTableViewPageDefinition: " + t.name); +} + +@lazy +rule AccessTableViewBackAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableViewBackAction"); + t.name = s.name + "::Back"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerBackActionDefinition"); + + log.debug("AccessTableViewBackAction: " + t.name); +} + +@lazy +rule AccessTableViewRefreshAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableViewRefreshAction"); + t.name = s.name + "::Refresh"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerRefreshActionDefinition"); + + log.debug("AccessTableViewRefreshAction: " + t.name); +} + +@lazy +rule AccessTableViewCancelAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableViewCancelAction"); + t.name = s.name + "::Cancel"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerCancelActionDefinition"); + + log.debug("AccessTableViewCancelAction: " + t.name); +} + +@lazy +rule AccessTableViewUpdateAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableViewUpdateAction"); + t.name = s.name + "::Update"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerUpdateActionDefinition"); + + log.debug("AccessTableViewUpdateAction: " + t.name); +} + +@lazy +rule AccessTableViewDeleteAction + transform s: JSL!UIMenuTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/AccessTableViewDeleteAction"); + t.name = s.getFqName() + "::Delete"; + t.ownerDataElement = s.actorAccess.target.equivalent("RelationType"); + t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerDeleteActionDefinition"); + + log.debug("AccessTableViewDeleteAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/rowDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/rowDeclaration.etl new file mode 100644 index 00000000..798c1e50 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/rowDeclaration.etl @@ -0,0 +1,458 @@ +rule TablePageContainer + transform s: JSL!UIRowDeclaration + to t: UI!ui::PageContainer { + guard: rootMenu.containsVisualElement(s) + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TablePageContainer"); + t.name = s.getFqName() + "::Table::PageContainer"; + t.label = s.getLabelWithNameFallback(); + t.titleFrom = UI!ui::TitleFrom#LABEL; + t.type = UI!ui::PageContainerType#TABLE; + t.children.add(s.equivalent("TablePageContainerVisualElement")); + t.actionButtonGroup = s.equivalent("TablePageContainerButtonGroup"); + t.dataElement = s.map.transfer.equivalent("ClassType"); + t.onInit = s.equivalent("TableTableRefreshActionDefinition"); + + rootMenu.equivalent("Application").pageContainers.add(t); + + /* + for (dataFeature in s.additionalMaskFeatures) { + var attributeType = dataFeature.getMember().mapAttributeType(s.eContainer.equivalent("ClassType")); + t.additionalMaskAttributes.add(attributeType); + } + */ + + log.debug("Create TablePageContainer: " + t.name); +} + + +@lazy +rule TablePageContainerButtonGroup + transform s: JSL!UIRowDeclaration + to t: UI!ui::ButtonGroup { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TablePageContainerButtonGroup"); + t.name = s.getFqName() + "::PageActions"; + t.label = "Actions"; + + t.buttons.add(s.equivalent("TablePageContainerBackButton")); + + log.debug("TablePageContainerButtonGroup: " + t.name); +} + +@lazy +rule TablePageContainerBackButtonIcon + transform s: JSL!UIRowDeclaration + to t: UI!ui::Icon { + t.iconName = "arrow-left"; + t.name = s.name + "BackIcon"; + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TablePageContainerBackButtonIcon"); +} + +@lazy +rule TablePageContainerBackActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::BackActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TablePageContainerBackActionDefinition"); + t.name = s.getFqName() + "::Back"; + log.debug("TablePageContainerBackActionDefinition: " + t.name); +} + +@lazy +rule TablePageContainerBackButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TablePageContainerBackButton"); + t.name = s.getFqName() + "::Back"; + t.label = "Back"; + t.buttonStyle = "text"; + t.icon = s.equivalent("TablePageContainerBackButtonIcon"); + t.actionDefinition = s.equivalent("TablePageContainerBackActionDefinition"); + log.debug("TablePageContainerBackButton: " + t.name); +} + +@lazy +rule TablePageContainerVisualElement + transform s: JSL!UIRowDeclaration + to t: UI!ui::Flex { + t.~pos = 0; + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TablePageContainerVisualElement"); + t.name = s.name; + t.direction = UI!Axis#VERTICAL; + t.mainAxisAlignment = UI!ui::MainAxisAlignment#START; + t.crossAxisAlignment = UI!ui::CrossAxisAlignment#STRETCH; + t.col = 12d; + t.children.add(s.equivalent("TableTable")); + t.frame = s.equivalent("TableFrame"); + + log.debug("TablePageContainerVisualElement: " + t.name); +} + +@lazy +rule TableFrame + transform s: JSL!UIRowDeclaration + to t: UI!ui::Frame { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableFrame"); +} + +@lazy +rule TableTable + transform s: JSL!UIRowDeclaration + to t: UI!ui::Table { + var id = rootMenu.name + "/(jsl/" + s.getId() + ")/TableTable"; + t.setId(id); + t.col = 12d; + t.label = s.getLabelWithNameFallback(); + t.name = s.name + "::Table"; + t.dataElement = s.map.transfer.equivalent("ClassType"); + t.relationName = ""; + if (t.~pos.isUndefined()) { + t.~pos = 0; + } + + var primitiveFields = s.members.select(m | m.transferField.isDefined() and m.transferField.target.referenceType.`primitive`.isDefined()); + + for (field in primitiveFields) { + var col = field.equivalentDiscriminated("RowColumnDeclarationPrimitiveColumn", id); + t.columns.add(col); + if (col.attributeType.isFilterable) { + t.filters.add(field.equivalentDiscriminated("RowColumnDeclarationPrimitiveColumnFilter", id)); + } + } + + t.tableActionButtonGroup = s.equivalent("TableTableButtonGroup"); + t.rowActionButtonGroup = s.equivalent("TableRowButtonGroup"); + + // TODO transform selector row per page + t.selectorRowsPerPage = 10; + + log.debug("TableTable: " + t.name); +} + +@lazy +rule TableTableButtonGroup + transform s: JSL!UIRowDeclaration + to t: UI!ui::ButtonGroup { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableButtonGroup"); + t.name = s.name + "::TableTableButtonGroup"; + t.label = "Actions"; + + // TODO add buttons + + t.buttons.add(s.equivalent("TableTableFilterButton")); + t.buttons.add(s.equivalent("TableTableRefreshButton")); + t.buttons.add(s.equivalent("TableTableOpenCreateButton")); + t.buttons.add(s.equivalent("TableTableOpenAddSelectorButton")); + t.buttons.add(s.equivalent("TableTableClearButton")); + t.buttons.add(s.equivalent("TableTableBulkRemoveButton")); + + log.debug("TableTableButtonGroup: " + t.name); +} + +@lazy +rule TableRowButtonGroup + transform s: JSL!UIRowDeclaration + to t: UI!ui::ButtonGroup { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableRowButtonGroup"); + t.name = s.name + "TableRowButtonGroup"; + t.label = "Actions"; + + // TODO add buttons + + t.buttons.add(s.equivalent("TableOpenPageButton")); + t.buttons.add(s.equivalent("TableRowDeleteButton")); + + log.debug("TableRowButtonGroup: " + t.name); +} + + +@lazy +rule TableTableFilterButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableFilterButton"); + t.name = s.name + "::Filter"; + t.icon = s.equivalent("TableTableFilterButtonIcon"); + t.label = "Filter"; + t.buttonStyle = "text"; + t.actionDefinition = s.equivalent("TableTableFilterActionDefinition"); + + log.debug("TableTableFilterButton: " + t.name); +} + +@lazy +rule TableTableFilterButtonIcon + transform s: JSL!UIRowDeclaration + to t: UI!ui::Icon { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableFilterButtonIcon"); + t.name = s.name + "FilterIcon"; + t.iconName = "filter"; + + log.debug("TableTableFilterButtonIcon: " + t.name); +} + +@lazy +rule TableTableFilterActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::FilterActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableFilterActionDefinition"); + t.name = s.name + "::Filter"; + t.targetType = s.map.transfer.equivalent("ClassType"); + + log.debug("TableTableFilterActionDefinition: " + t.name); +} + +@lazy +rule TableTableRefreshButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableRefreshButton"); + t.name = s.name + "::Refresh"; + t.icon = s.equivalent("TableTableRefreshButtonIcon"); + t.label = "Refresh"; + t.buttonStyle = "text"; + t.actionDefinition = s.equivalent("TableTableRefreshActionDefinition"); + + log.debug("TableTableRefreshButton: " + t.name); +} + +@lazy +rule TableTableRefreshButtonIcon + transform s: JSL!UIRowDeclaration + to t: UI!ui::Icon { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableRefreshButtonIcon"); + t.name = s.name + "RefreshIcon"; + t.iconName = "refresh"; + + log.debug("TableTableRefreshButtonIcon: " + t.name); +} + +@lazy +rule TableTableRefreshActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::RefreshActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableRefreshActionDefinition"); + t.name = s.name + "::Refresh"; + t.targetType = s.map.transfer.equivalent("ClassType"); + + log.debug("TableTableRefreshActionDefinition: " + t.name); +} + +@lazy +rule TableTableOpenCreateButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableOpenCreateButton"); + t.name = s.name + "::OpenCreate"; + t.icon = s.equivalent("TableTableOpenCreateButtonIcon"); + t.label = "Create"; + t.buttonStyle = "text"; + t.actionDefinition = s.equivalent("TableTableOpenCreateActionDefinition"); + + log.debug("TableTableOpenCreateButton: " + t.name); +} + +@lazy +rule TableTableOpenCreateButtonIcon + transform s: JSL!UIRowDeclaration + to t: UI!ui::Icon { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableOpenCreateButtonIcon"); + t.name = s.name + "OpenCreateIcon"; + t.iconName = "file-document-plus"; + + log.debug("TableTableFilterButtonIcon: " + t.name); +} + +@lazy +rule TableTableOpenCreateActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::OpenCreateFormActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableOpenCreateActionDefinition"); + t.name = s.name + "::OpenCreate"; + t.targetType = s.map.transfer.equivalent("ClassType"); + + log.debug("TableTableOpenCreateActionDefinition: " + t.name); +} + +@lazy +rule TableOpenPageButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableOpenPageButton"); + t.name = s.name + "::View"; + t.icon = s.equivalent("TableOpenPageButtonIcon"); + t.label = "View"; + t.buttonStyle = "contained"; + t.actionDefinition = s.equivalent("TableOpenPageActionDefinition"); + + log.debug("TableOpenPageButton: " + t.name); +} + +@lazy +rule TableOpenPageButtonIcon + transform s: JSL!UIRowDeclaration + to t: UI!ui::Icon { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableOpenPageButtonIcon"); + t.name = s.name + "OpenPageIcon"; + t.iconName = "visibility"; + + log.debug("TableOpenPageButtonIcon: " + t.name); +} + +@lazy +rule TableOpenPageActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::OpenPageActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableOpenPageActionDefinition"); + t.name = s.name + "::View"; + t.targetType = s.map.transfer.equivalent("ClassType"); + + log.debug("TableOpenPageActionDefinition: " + t.name); +} + +@lazy +rule TableRowDeleteButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableRowDeleteButton"); + t.name = s.name + "::RowDelete"; + t.icon = s.equivalent("TableRowDeleteButtonIcon"); + t.label = "Delete"; + t.buttonStyle = "contained"; + t.actionDefinition = s.equivalent("TableRowDeleteActionDefinition"); + + log.debug("TableRowDeleteButton: " + t.name); +} + +@lazy +rule TableRowDeleteButtonIcon + transform s: JSL!UIRowDeclaration + to t: UI!ui::Icon { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableRowDeleteButtonIcon"); + t.name = s.name + "RowDeleteIcon"; + t.iconName = "delete_forever"; + + log.debug("TableRowDeleteButtonIcon: " + t.name); +} + +@lazy +rule TableRowDeleteActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::RowDeleteActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableRowDeleteActionDefinition"); + t.name = s.name + "::RowDelete"; + t.targetType = s.map.transfer.equivalent("ClassType"); + + log.debug("TableRowDeleteActionDefinition: " + t.name); +} + +@lazy +rule TableTableOpenAddSelectorButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableOpenAddSelectorButton"); + t.name = s.name + "::OpenAddSelector"; + t.icon = s.equivalent("TableTableOpenAddSelectorButtonIcon"); + t.label = "Add"; + t.buttonStyle = "text"; + t.actionDefinition = s.equivalent("TableTableOpenAddSelectorActionDefinition"); + + log.debug("TableTableOpenAddSelectorButton: " + t.name); +} + +@lazy +rule TableTableOpenAddSelectorButtonIcon + transform s: JSL!UIRowDeclaration + to t: UI!ui::Icon { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableOpenAddSelectorButtonIcon"); + t.name = s.name + "OpenAddSelectorIcon"; + t.iconName = "attachment-plus"; + + log.debug("TableTableOpenAddSelectorButtonIcon: " + t.name); +} + +@lazy +rule TableTableOpenAddSelectorActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::OpenAddSelectorActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableOpenAddSelectorActionDefinition"); + t.name = s.name + "::OpenAddSelector"; + t.isContainedRelationAction = true; + t.selectorFor = s.equivalent("TableTableAddSelectorActionDefinition"); + + log.debug("TableTableOpenAddSelectorActionDefinition: " + t.name); +} + +@lazy +rule TableTableBulkRemoveButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableBulkRemoveButton"); + t.name = s.name + "::BulkRemove"; + t.icon = s.equivalent("TableTableBulkRemoveButtonIcon"); + t.label = "Remove"; + t.buttonStyle = "text"; + t.actionDefinition = s.equivalent("TableTableBulkRemoveActionDefinition"); + + log.debug("TableTableBulkRemoveButton: " + t.name); +} + +@lazy +rule TableTableBulkRemoveButtonIcon + transform s: JSL!UIRowDeclaration + to t: UI!ui::Icon { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableBulkRemoveButtonIcon"); + t.name = s.name + "RemoveIcon"; + t.iconName = "link-off"; + + log.debug("TableTableBulkRemoveButtonIcon: " + t.name); +} + +@lazy +rule TableTableBulkRemoveActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::BulkRemoveActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableBulkRemoveActionDefinition"); + t.name = s.name + "::BulkRemove"; + t.targetType = s.map.transfer.equivalent("ClassType"); + t.isContainedRelationAction = true; + t.isBulk = true; + + log.debug("TableTableBulkRemoveActionDefinition: " + t.name); +} + +@lazy +rule TableTableClearButton + transform s: JSL!UIRowDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableClearButton"); + t.name = s.name + "::Clear"; + t.icon = s.equivalent("TableTableClearButtonIcon"); + t.label = "Clear"; + t.buttonStyle = "text"; + t.actionDefinition = s.equivalent("TableTableClearActionDefinition"); + + log.debug("TableTableClearButton: " + t.name); +} + +@lazy +rule TableTableClearButtonIcon + transform s: JSL!UIRowDeclaration + to t: UI!ui::Icon { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableClearButtonIcon"); + t.name = s.name + "ClearIcon"; + t.iconName = "link-off"; + + log.debug("TableTableClearButtonIcon: " + t.name); +} + +@lazy +rule TableTableClearActionDefinition + transform s: JSL!UIRowDeclaration + to t: UI!ui::ClearActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableTableClearActionDefinition"); + t.name = s.name + "::Clear"; + t.isContainedRelationAction = true; + + log.debug("TableTableClearActionDefinition: " + t.name); +} + diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/rowLinkDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/rowLinkDeclaration.etl deleted file mode 100644 index 6a4e6f9e..00000000 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/rowLinkDeclaration.etl +++ /dev/null @@ -1,132 +0,0 @@ -/* -rule RowLinkPageDefinition - transform s: JSL!RowLinkDeclaration - to t: UI!ui::PageDefinition { - guard: actorDeclaration.getAllRelations().contains(s) - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/RowLinkPageDefinition"); - - t.name = s.getFqName() + "::ViewPage"; - t.container = s.referenceType.equivalent("TransferDeclarationPageContainer"); - - actorDeclaration.equivalent("Application").pages.add(t); - - t.dataElement = s.equivalent("RelationType"); - - var relations = s.referenceType.getDirectRelations(); - - for (link in relations.select(r | r.isKindOf(JSL!UIViewLinkDeclaration))) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenPageAction", "RowLinkPageDefinition")); - - if (link.isRefreshAllowed() and not link.isEager()) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationRefreshAction", "RowLinkPageDefinition")); - } - if (link.isCreateAllowed()) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenFormAction", "RowLinkPageDefinition")); - } - if (link.isDeleteAllowed()) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationRowDeleteAction", "RowLinkPageDefinition")); - } - if (link.isSetReferenceAllowed()) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenSetSelectorDialogAction", "RowLinkPageDefinition")); - } - if (link.isUnsetReferenceAllowed()) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationUnsetAction", "RowLinkPageDefinition")); - } - } - - for (table in relations.select(r | r.isKindOf(JSL!UIViewTableDeclaration))) { - var detailLink = table.getDetailLink(); - - if (table.isFilterSupported()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationFilterAction", "RowLinkPageDefinition")); - } - if (table.isRefreshAllowed()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationRefreshAction", "RowLinkPageDefinition")); - } - if (table.isCreateAllowed()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenCreateAction", "RowLinkPageDefinition")); - } - if (table.isDeleteAllowed()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationRowDeleteAction", "RowLinkPageDefinition")); - } - if (table.isAddReferenceAllowed()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenAddSelectorAction", "RowLinkPageDefinition")); - } - if (table.isRemoveReferenceAllowed()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationClearAction", "RowLinkPageDefinition")); - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationBulkRemoveAction", "RowLinkPageDefinition")); - } - if (detailLink.isDefined()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenPageAction", "RowLinkPageDefinition")); - } - } - - t.actions.add(s.equivalent("RowLinkPageDefinitionBackAction")); - if (s.isRefreshAllowed()) { - t.actions.add(s.equivalent("RowLinkPageDefinitionRefreshAction")); - } - if (s.isUpdateAllowed()) { - t.actions.add(s.equivalent("RowLinkPageDefinitionUpdateAction")); - } - if (s.isDeleteAllowed()) { - t.actions.add(s.equivalent("RowLinkPageDefinitionDeleteAction")); - } - - log.debug("Create RowLinkPageDefinition: " + t.name); -} - -@lazy -@greedy -rule RowLinkPageDefinitionRefreshAction - transform s: JSL!RowLinkDeclaration - to t: UI!ui::Action { - guard: actorDeclaration.getAllRelations().contains(s) - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/RowLinkPageDefinitionRefreshAction"); - t.name = s.name + "::Refresh"; - t.actionDefinition = s.referenceType.equivalent("TransferDeclarationRefreshActionDefinition"); - - log.debug("RowLinkPageDefinitionRefreshAction: " + t.name); -} - -@lazy -@greedy -rule RowLinkPageDefinitionBackAction - transform s: JSL!RowLinkDeclaration - to t: UI!ui::Action { - guard: actorDeclaration.getAllRelations().contains(s) - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/RowLinkPageDefinitionBackAction"); - t.name = s.name + "::Back"; - t.actionDefinition = s.referenceType.equivalent("TransferDeclarationBackActionDefinition"); - - log.debug("RowLinkPageDefinitionBackAction: " + t.name); -} - -@lazy -@greedy -rule RowLinkPageDefinitionUpdateAction - transform s: JSL!RowLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/RowLinkPageDefinitionUpdateAction"); - - t.name = s.name + "::Update"; - t.actionDefinition = s.referenceType.equivalent("TransferDeclarationUpdateActionDefinition"); - - log.debug("RowLinkPageDefinitionUpdateAction: " + t.name); -} - -@lazy -@greedy -rule RowLinkPageDefinitionDeleteAction - transform s: JSL!RowLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/RowLinkPageDefinitionDeleteAction"); - - t.name = s.name + "::Delete"; - t.actionDefinition = s.referenceType.equivalent("TransferDeclarationDeleteActionDefinition"); - - log.debug("RowLinkPageDefinitionDeleteAction: " + t.name); -} -*/ diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewDeclaration.etl index 6a24c18f..a4787d59 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewDeclaration.etl @@ -1,44 +1,3 @@ -rule FormPageContainer - transform s: JSL!UIViewDeclaration - to t: UI!ui::PageContainer { - guard: rootMenu.containsVisualElement(s) and s.form.isDefined() and s.form - - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainer"); - if (t.~pos.isUndefined()) { - t.~pos = 0; - } - t.label = s.getLabelWithNameFallback(); - t.name = s.getFqName() + "::Create::PageContainer"; - t.children.add(s.equivalent("FormPageContainerVisualElement")); - t.actionButtonGroup = s.equivalent("FormPageContainerButtonGroup"); - t.dataElement = s.map.transfer.equivalent("ClassType"); - t.type = UI!ui::PageContainerType#FORM; - t.onInit = s.equivalent("FormPageContainerGetTemplateActionDefinition"); - t.templateAction = s.equivalent("FormPageContainerGetTemplateActionDefinition"); - - rootMenu.equivalent("Application").pageContainers.add(t); - - log.debug("Create FormPageContainer: " + t.name); -} - -@lazy -rule FormPageContainerVisualElement - transform s: JSL!UIViewDeclaration - to t: UI!ui::Flex { - guard: rootMenu.containsVisualElement(s) and s.form.isDefined() and s.form - - t.~pos = 0; - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerVisualElement"); - t.name = s.name; - t.direction = UI!Axis#VERTICAL; - t.mainAxisAlignment = UI!ui::MainAxisAlignment#START; - t.crossAxisAlignment = UI!ui::CrossAxisAlignment#STRETCH; - t.col = 12d; - - log.debug("FormPageContainerVisualElement: " + t.name); -} - - rule ViewPageContainer transform s: JSL!UIViewDeclaration to t: UI!ui::PageContainer { @@ -273,101 +232,3 @@ rule ViewPageContainerCancelButton log.debug("ViewPageContainerCancelButton: " + t.name); } - -@lazy -rule FormPageContainerButtonGroup - transform s: JSL!UIViewDeclaration - to t: UI!ui::ButtonGroup { - var id = rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerButtonGroup"; - t.setId(id); - t.name = s.getFqName() + "::PageActions"; - t.label = "Actions"; - t.buttons.add(s.equivalent("FormPageContainerBackButton")); - t.buttons.add(s.equivalent("FormPageContainerCreateButton")); - - log.debug("FormPageContainerButtonGroup: " + t.name); -} - -@lazy -rule FormPageContainerBackActionDefinition - transform s: JSL!UIViewDeclaration - to t: UI!ui::BackActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerBackActionDefinition"); - t.name = s.getFqName() + "::Back"; - log.debug("FormPageContainerBackActionDefinition: " + t.name); -} - -@lazy -rule FormPageContainerBackButtonIcon - transform s: JSL!UIViewDeclaration - to t: UI!ui::Icon { - t.iconName = "arrow-left"; - t.name = s.name + "BackButtonIcon"; - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerBackButtonIcon"); -} - -@lazy -rule FormPageContainerBackButton - transform s: JSL!UIViewDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerBackButton"); - t.name = s.getFqName() + "::Back"; - t.label = "Back"; - t.buttonStyle = "text"; - t.icon = s.equivalent("FormPageContainerBackButtonIcon"); - t.actionDefinition = s.equivalent("FormPageContainerBackActionDefinition"); - - log.debug("FormPageContainerBackButton: " + t.name); -} - -@lazy -rule FormPageContainerCreateButtonIcon - transform s: JSL!UIViewDeclaration - to t: UI!ui::Icon { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerCreateButtonIcon"); - t.name = s.name + "CreateButtonIcon"; - t.iconName = "content-save"; - - log.debug("FormPageContainerCreateButtonIcon: " + t.name); -} - -@lazy -rule FormPageContainerCreateButton - transform s: JSL!UIViewDeclaration - to t: UI!ui::Button { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerCreateButton"); - t.name = s.getFqName() + "::Create"; - t.label = "Create"; - t.buttonStyle = "contained"; - t.icon = s.equivalent("FormPageContainerCreateButtonIcon"); - t.actionDefinition = s.equivalent("FormPageContainerCreateActionDefinition"); - - log.debug("FormPageContainerCreateButton: " + t.name); -} - -@lazy -rule FormPageContainerCreateActionDefinition - transform s: JSL!UIViewDeclaration - to t: UI!ui::CreateActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerCreateActionDefinition"); - t.name = s.getFqName() + "::Create"; - - /* - if (s.autoOpenAfterCreate.isDefined()) { - t.autoOpenAfterCreate = s.autoOpenAfterCreate; - } - */ - - log.debug("FormPageContainerCreateActionDefinition: " + t.name); -} - -@lazy -rule FormPageContainerGetTemplateActionDefinition - transform s: JSL!UIViewDeclaration - to t: UI!ui::GetTemplateActionDefinition { - t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerGetTemplateActionDefinition"); - t.name = s.getFqName() + "::GetTemplate"; - t.targetType = s.map.transfer.equivalent("ClassType"); - - log.debug("FormPageContainerGetTemplateActionDefinition: " + t.name); -} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewDeclarationForm.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewDeclarationForm.etl new file mode 100644 index 00000000..345a824a --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewDeclarationForm.etl @@ -0,0 +1,137 @@ +rule FormPageContainer + transform s: JSL!UIViewDeclaration + to t: UI!ui::PageContainer { + guard: rootMenu.containsVisualElement(s) and s.form.isDefined() and s.form + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainer"); + if (t.~pos.isUndefined()) { + t.~pos = 0; + } + t.label = s.getLabelWithNameFallback(); + t.name = s.getFqName() + "::Create::PageContainer"; + t.children.add(s.equivalent("FormPageContainerVisualElement")); + t.actionButtonGroup = s.equivalent("FormPageContainerButtonGroup"); + t.dataElement = s.map.transfer.equivalent("ClassType"); + t.type = UI!ui::PageContainerType#FORM; + t.onInit = s.equivalent("FormPageContainerGetTemplateActionDefinition"); + t.templateAction = s.equivalent("FormPageContainerGetTemplateActionDefinition"); + + rootMenu.equivalent("Application").pageContainers.add(t); + + log.debug("Create FormPageContainer: " + t.name); +} + +@lazy +rule FormPageContainerVisualElement + transform s: JSL!UIViewDeclaration + to t: UI!ui::Flex { + guard: rootMenu.containsVisualElement(s) and s.form.isDefined() and s.form + + t.~pos = 0; + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerVisualElement"); + t.name = s.name; + t.direction = UI!Axis#VERTICAL; + t.mainAxisAlignment = UI!ui::MainAxisAlignment#START; + t.crossAxisAlignment = UI!ui::CrossAxisAlignment#STRETCH; + t.col = 12d; + + log.debug("FormPageContainerVisualElement: " + t.name); +} + +@lazy +rule FormPageContainerButtonGroup + transform s: JSL!UIViewDeclaration + to t: UI!ui::ButtonGroup { + var id = rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerButtonGroup"; + t.setId(id); + t.name = s.getFqName() + "::PageActions"; + t.label = "Actions"; + t.buttons.add(s.equivalent("FormPageContainerBackButton")); + t.buttons.add(s.equivalent("FormPageContainerCreateButton")); + + log.debug("FormPageContainerButtonGroup: " + t.name); +} + +@lazy +rule FormPageContainerBackActionDefinition + transform s: JSL!UIViewDeclaration + to t: UI!ui::BackActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerBackActionDefinition"); + t.name = s.getFqName() + "::Back"; + log.debug("FormPageContainerBackActionDefinition: " + t.name); +} + +@lazy +rule FormPageContainerBackButtonIcon + transform s: JSL!UIViewDeclaration + to t: UI!ui::Icon { + t.iconName = "arrow-left"; + t.name = s.name + "BackButtonIcon"; + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerBackButtonIcon"); +} + +@lazy +rule FormPageContainerBackButton + transform s: JSL!UIViewDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerBackButton"); + t.name = s.getFqName() + "::Back"; + t.label = "Back"; + t.buttonStyle = "text"; + t.icon = s.equivalent("FormPageContainerBackButtonIcon"); + t.actionDefinition = s.equivalent("FormPageContainerBackActionDefinition"); + + log.debug("FormPageContainerBackButton: " + t.name); +} + +@lazy +rule FormPageContainerCreateButtonIcon + transform s: JSL!UIViewDeclaration + to t: UI!ui::Icon { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerCreateButtonIcon"); + t.name = s.name + "CreateButtonIcon"; + t.iconName = "content-save"; + + log.debug("FormPageContainerCreateButtonIcon: " + t.name); +} + +@lazy +rule FormPageContainerCreateButton + transform s: JSL!UIViewDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerCreateButton"); + t.name = s.getFqName() + "::Create"; + t.label = "Create"; + t.buttonStyle = "contained"; + t.icon = s.equivalent("FormPageContainerCreateButtonIcon"); + t.actionDefinition = s.equivalent("FormPageContainerCreateActionDefinition"); + + log.debug("FormPageContainerCreateButton: " + t.name); +} + +@lazy +rule FormPageContainerCreateActionDefinition + transform s: JSL!UIViewDeclaration + to t: UI!ui::CreateActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerCreateActionDefinition"); + t.name = s.getFqName() + "::Create"; + + /* + if (s.autoOpenAfterCreate.isDefined()) { + t.autoOpenAfterCreate = s.autoOpenAfterCreate; + } + */ + + log.debug("FormPageContainerCreateActionDefinition: " + t.name); +} + +@lazy +rule FormPageContainerGetTemplateActionDefinition + transform s: JSL!UIViewDeclaration + to t: UI!ui::GetTemplateActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/FormPageContainerGetTemplateActionDefinition"); + t.name = s.getFqName() + "::GetTemplate"; + t.targetType = s.map.transfer.equivalent("ClassType"); + + log.debug("FormPageContainerGetTemplateActionDefinition: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewGroupDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewGroupDeclaration.etl index 9ebbe5c9..f0c3137d 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewGroupDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewGroupDeclaration.etl @@ -1,7 +1,6 @@ -/* @abstract rule AbstractViewGroupDeclaration - transform s: JSL!ViewGroupDeclaration + transform s: JSL!UIViewGroupDeclaration to t: UI!ui::Flex { t.name = s.name; t.label = s.getLabelWithNameFallback(); @@ -18,11 +17,7 @@ rule AbstractViewGroupDeclaration } t.col = s.getWidth().isDefined() ? s.getWidth().value.asReal() : 12d; - - - if (t.~pos.isUndefined()) { - t.~pos = 0; - } + t.~pos = s.getPos(); if (s.getOrientationModifier().isDefined()) { t.direction = s.getOrientationModifier().isVertical() ? UI!Axis#VERTICAL : UI!Axis#HORIZONTAL; @@ -64,14 +59,14 @@ rule AbstractViewGroupDeclaration } rule GroupVisualElement - transform s: JSL!ViewGroupDeclaration + transform s: JSL!UIViewGroupDeclaration to t: UI!ui::Flex extends AbstractViewGroupDeclaration { - guard: s.getTransferObjectType().isGenerated() + guard: rootMenu.containsVisualElement(s) - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/GroupVisualElement"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/GroupVisualElement"); - if (not s.eContainer.isKindOf(JSL!ViewTabsDeclaration)) { + if (not s.eContainer.isKindOf(JSL!UIViewTabsDeclaration)) { var holder = t; if (s.isFrame()) { holder.frame = s.equivalent("GroupFrame"); @@ -86,18 +81,31 @@ rule GroupVisualElement @lazy @greedy rule GroupFrame - transform s: JSL!ViewGroupDeclaration + transform s: JSL!UIViewGroupDeclaration to t: UI!ui::Frame { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/GroupFrame"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/GroupFrame"); } @lazy @greedy rule GroupIcon - transform s: JSL!ViewGroupDeclaration + transform s: JSL!UIViewGroupDeclaration to t: UI!ui::Icon { t.iconName = s.getIconModifier().value.value; t.name = s.name + "GroupIcon"; - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/GroupIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/GroupIcon"); +} + +@greedy +rule TabGroup + transform s: JSL!UIViewGroupDeclaration + to t: UI!ui::Tab { + guard: s.eContainer.isKindOf(JSL!UIViewTabsDeclaration) and rootMenu.containsVisualElement(s) + + s.eContainer.equivalent("TabBarVisualElement").tabs.add(t); + t.element = s.equivalent("GroupVisualElement"); + t.name = t.element.name; + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TabGroup"); + + log.debug("TabGroup: " + t.name); } -*/ diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclaration.etl index 5a5b5057..1710e9a6 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclaration.etl @@ -1,227 +1,11 @@ -rule ViewLinkPageDefinition - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::PageDefinition { - guard: actorDeclaration.getAllRelations().contains(s) - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkPageDefinition"); - - t.name = s.getFqName() + "::ViewPage"; - t.container = s.referenceType.equivalent("TransferDeclarationPageContainer"); - - actorDeclaration.equivalent("Application").pages.add(t); - - t.dataElement = s.equivalent("RelationType"); - - var relations = s.referenceType.getDirectRelations(); - - /* - log.info("==================="); - log.info(t.name + ":"); - log.info(relations.collect(r | r.name).concat(", ")); - log.info("==================="); - */ - - for (link in relations.select(r | r.isKindOf(JSL!UIViewLinkDeclaration))) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenPageAction", "ViewLinkPageDefinition")); - - if (link.isRefreshAllowed() and not link.isEager()) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationRefreshAction", "ViewLinkPageDefinition")); - } - if (link.isCreateAllowed()) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenFormAction", "ViewLinkPageDefinition")); - } - if (link.isDeleteAllowed()) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationRowDeleteAction", "ViewLinkPageDefinition")); - } - if (link.isSetReferenceAllowed()) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenSetSelectorDialogAction", "ViewLinkPageDefinition")); - } - if (link.isUnsetReferenceAllowed()) { - t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationUnsetAction", "ViewLinkPageDefinition")); - } - } - - for (table in relations.select(r | r.isKindOf(JSL!UIViewTableDeclaration))) { - var detailLink = table.getDetailLink(); - - if (detailLink.isDefined()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenPageAction", "ViewLinkPageDefinition")); - } - if (table.isFilterSupported()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationFilterAction", "ViewLinkPageDefinition")); - } - if (table.isRefreshAllowed()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationRefreshAction", "ViewLinkPageDefinition")); - } - if (table.isCreateAllowed()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenCreateAction", "ViewLinkPageDefinition")); - } - if (table.isDeleteAllowed()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationRowDeleteAction", "ViewLinkPageDefinition")); - } - if (table.isAddReferenceAllowed()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenAddSelectorAction", "ViewLinkPageDefinition")); - } - if (table.isRemoveReferenceAllowed()) { - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationClearAction", "ViewLinkPageDefinition")); - t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationBulkRemoveAction", "ViewLinkPageDefinition")); - } - } - - t.actions.add(s.equivalent("ViewLinkPageDefinitionBackAction")); - if (s.isRefreshAllowed()) { - t.actions.add(s.equivalent("ViewLinkPageDefinitionRefreshAction")); - } - if (s.isUpdateAllowed()) { - t.actions.add(s.equivalent("ViewLinkPageDefinitionUpdateAction")); - } - if (s.isDeleteAllowed()) { - t.actions.add(s.equivalent("ViewLinkPageDefinitionDeleteAction")); - } - - log.debug("Create ViewLinkPageDefinition: " + t.name); -} - -@lazy -@greedy -rule ViewLinkPageDefinitionRefreshAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - guard: actorDeclaration.getAllRelations().contains(s) - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkPageDefinitionRefreshAction"); - t.name = s.name + "::Refresh"; - t.actionDefinition = s.referenceType.equivalent("TransferDeclarationRefreshActionDefinition"); - - log.debug("ViewLinkPageDefinitionRefreshAction: " + t.name); -} - -@lazy -@greedy -rule ViewLinkPageDefinitionBackAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - guard: actorDeclaration.getAllRelations().contains(s) - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkPageDefinitionBackAction"); - t.name = s.name + "::Back"; - t.actionDefinition = s.referenceType.equivalent("TransferDeclarationBackActionDefinition"); - - log.debug("ViewLinkPageDefinitionBackAction: " + t.name); -} - -@lazy -@greedy -rule ViewLinkPageDefinitionUpdateAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkPageDefinitionUpdateAction"); - - t.name = s.name + "::Update"; - t.actionDefinition = s.referenceType.equivalent("TransferDeclarationUpdateActionDefinition"); - - log.debug("ViewLinkPageDefinitionUpdateAction: " + t.name); -} - -@lazy -@greedy -rule ViewLinkPageDefinitionDeleteAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkPageDefinitionDeleteAction"); - - t.name = s.name + "::Delete"; - t.actionDefinition = s.referenceType.equivalent("TransferDeclarationDeleteActionDefinition"); - - log.debug("ViewLinkPageDefinitionDeleteAction: " + t.name); -} - -@greedy -rule ViewLinkCreateFormPageDefinition - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::PageDefinition { - guard: actorDeclaration.getAllRelations().contains(s) and s.isFormRelation() - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkCreateFormPageDefinition"); - - t.name = s.getFqName() + "::FormPage"; - - var targetCreateEvent = s.referenceType.getCreateEventDeclaration(); - var targetContainer = targetCreateEvent.parameterType; - t.container = targetContainer.equivalent("TransferDeclarationPageContainer"); - - actorDeclaration.equivalent("Application").pages.add(t); - - t.dataElement = s.equivalent("FormRelationType"); - - // var relations = s.referenceType.getDirectRelations(); - - /* - log.info("==================="); - log.info(t.name + ":"); - log.info(relations.collect(r | r.name).concat(", ")); - log.info("==================="); - */ - /* - for (link in relations.select(r | r.isKindOf(JSL!UIViewLinkDeclaration))) { - t.actions.add(link.equivalent("ViewLinkDeclarationOpenPageAction")); - } - - for (table in relations.select(r | r.isKindOf(JSL!UIViewTableDeclaration))) { - var detailLink = table.getDetailLink(); - - if (detailLink.isDefined()) { - t.actions.add(table.equivalent("ViewTableDeclarationOpenPageAction")); - } - } - */ - - t.actions.add(s.equivalent("ViewLinkCreateFormBackAction")); - t.actions.add(s.equivalent("ViewLinkCreateFormCreateAction")); - - log.debug("Create ViewLinkCreateFormPageDefinition: " + t.name); -} - -@greedy -@lazy -rule ViewLinkCreateFormCreateAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkCreateFormCreateAction"); - - var targetCreateEvent = s.referenceType.getCreateEventDeclaration(); - var targetContainer = targetCreateEvent.parameterType.isDefined() ? targetCreateEvent.parameterType : s.referenceType; - - t.name = s.name + "::Create"; - t.actionDefinition = targetContainer.equivalent("TransferDeclarationCreateActionDefinition"); - - log.debug("ViewLinkCreateFormCreateAction: " + t.name); -} - -@greedy -@lazy -rule ViewLinkCreateFormBackAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkCreateFormBackAction"); - - var targetCreateEvent = s.referenceType.getCreateEventDeclaration(); - var targetContainer = targetCreateEvent.parameterType.isDefined() ? targetCreateEvent.parameterType : s.referenceType; - - t.name = s.name + "::Back"; - t.actionDefinition = targetContainer.equivalent("TransferDeclarationBackActionDefinition"); - - log.debug("ViewLinkCreateFormBackAction: " + t.name); -} - @abstract rule AbstractViewLinkDeclaration transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Link { - guard: actorDeclaration.getAllRelations().contains(s) + guard: rootMenu.containsVisualElement(s) t.name = s.name; - t.relationName = s.name; + t.relationName = s.transferRelation.target.name; t.label = s.getLabelWithNameFallback(); if (s.getIconModifier().isDefined()) { t.icon = s.equivalent("LinkIcon"); @@ -229,13 +13,13 @@ rule AbstractViewLinkDeclaration t.row = 1d; t.col = s.width.isDefined() ? s.width.asReal() : 12d; t.~pos = s.~pos; - t.isEager = s.isEager(); + t.isEager = s.transferRelation.target.isEager(); if (t.~pos.isUndefined()) { t.~pos = 0; } - if (s.isEager()) { - // TODO finish additional mas attributes + if (t.isEager) { + // TODO finish additional mask attributes /* for (dataFeature in s.additionalMaskFeatures) { var attributeType = dataFeature.getMember().mapAttributeType(s.getRoot().getTransferObjectType().equivalent("ClassType")); @@ -252,18 +36,16 @@ rule LinkIcon to t: UI!ui::Icon { t.iconName = s.getIconModifier().value.value; t.name = s.name + "ViewLinkIcon"; - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/LinkIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/LinkIcon"); } rule InlineViewLink transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Link extends AbstractViewLinkDeclaration { - guard: s.getTransferObjectType().isGenerated() - - var id = actorDeclaration.name + "/(jsl/" + s.getId() + ")/InlineViewLink"; + var id = rootMenu.name + "/(jsl/" + s.getId() + ")/InlineViewLink"; t.setId(id); - t.dataElement = s.equivalent("RelationType"); + t.dataElement = s.transferRelation.target.equivalent("RelationType"); s.eContainer.uiContainer().children.add(t); @@ -276,12 +58,10 @@ rule InlineViewLink t.actionButtonGroup = s.equivalent("InlineViewLinkButtonGroup"); - /* - t.autocompleteRangeActionDefinition = s.equivalent("TabularReferenceFieldLinkAutocompleteRangeActionDefinition"); - t.autocompleteSetActionDefinition = s.equivalent("TabularReferenceFieldLinkAutocompleteSetActionDefinition"); - */ + t.autocompleteRangeActionDefinition = s.equivalent("ViewLinkDeclarationAutocompleteRangeActionDefinition"); + t.autocompleteSetActionDefinition = s.equivalent("ViewLinkDeclarationAutocompleteSetActionDefinition"); - if (s.isRefreshAllowed() and not s.isEager()) { + if (s.transferRelation.target.isRefreshAllowed() and not s.transferRelation.target.isEager()) { t.refreshActionDefinition = s.equivalent("ViewLinkDeclarationRefreshActionDefinition"); } @@ -292,45 +72,32 @@ rule InlineViewLink rule ViewLinkDeclarationRefreshActionDefinition transform s: JSL!UIViewLinkDeclaration to t: UI!ui::RefreshActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationRefreshActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationRefreshActionDefinition"); t.name = s.name + "::Refresh"; t.isContainedRelationAction = true; log.debug("ViewLinkDeclarationOpenPageActionDefinitionViewLinkDeclarationRefreshActionDefinition: " + t.name); } -@greedy -@lazy -rule ViewLinkDeclarationRefreshAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationRefreshAction"); - t.name = s.name + "::Refresh"; - t.actionDefinition = s.equivalent("ViewLinkDeclarationRefreshActionDefinition"); - - log.debug("ViewLinkDeclarationRefreshAction: " + t.name); -} - @lazy rule InlineViewLinkButtonGroup transform s: JSL!UIViewLinkDeclaration to t: UI!ui::ButtonGroup { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/InlineViewLinkButtonGroup"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/InlineViewLinkButtonGroup"); t.name = s.name + "::Actions"; t.label = "Actions"; t.buttons.add(s.equivalent("ViewLinkDeclarationOpenPageButton")); - - if (s.isCreateAllowed()) { + if (s.getCreateFormModifier().isDefined()) { t.buttons.add(s.equivalent("ViewLinkDeclarationOpenFormButton")); } - if (s.isDeleteAllowed()) { + if (s.transferRelation.target.isDeleteAllowed()) { t.buttons.add(s.equivalent("ViewLinkDeclarationDeleteButton")); } - if (s.isSetReferenceAllowed()) { + if (s.getSelectorTableModifier().isDefined()) { t.buttons.add(s.equivalent("ViewLinkDeclarationOpenSetSelectorButton")); } - if (s.isUnsetReferenceAllowed()) { + if (s.getSelectorTableModifier().isDefined()) { t.buttons.add(s.equivalent("ViewLinkDeclarationUnsetButton")); } @@ -341,9 +108,9 @@ rule InlineViewLinkButtonGroup rule ViewLinkDeclarationRepresentationColumn transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Column { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationRepresentationColumn"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationRepresentationColumn"); - var firstStringFromTarget = s.referenceType.getAllPrimitiveFields().selectOne(f | f.referenceType.isDefined() and f.referenceType.`primitive` == "string"); + var firstStringFromTarget = s.referenceType.map.transfer.getAllPrimitiveFields().selectOne(f | f.referenceType.isDefined() and f.referenceType.`primitive` == "string"); if (firstStringFromTarget.isUndefined()) { throw "Could not get string type field from relation target to use for representation: " + s.referenceType.name; @@ -364,7 +131,7 @@ rule ViewLinkDeclarationRepresentationColumn rule ViewLinkDeclarationOpenPageButton transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenPageButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenPageButton"); t.name = s.name + "::View"; t.buttonStyle = "contained"; t.label = "View"; @@ -378,7 +145,7 @@ rule ViewLinkDeclarationOpenPageButton rule ViewLinkDeclarationOpenPageButtonIcon transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenPageButtonIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenPageButtonIcon"); t.iconName = "eye"; t.name = s.name + "OpenPageIcon"; @@ -389,35 +156,19 @@ rule ViewLinkDeclarationOpenPageButtonIcon rule ViewLinkDeclarationOpenPageActionDefinition transform s: JSL!UIViewLinkDeclaration to t: UI!ui::OpenPageActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenPageActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenPageActionDefinition"); t.name = s.name + "::View"; t.isContainedRelationAction = true; - t.targetType = s.referenceType.equivalent("ClassType"); + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); log.debug("ViewLinkDeclarationOpenPageActionDefinition: " + t.name); } -@greedy -@lazy -rule ViewLinkDeclarationOpenPageAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenPageAction"); - - t.name = s.name + "::OpenPage"; - t.actionDefinition = s.equivalent("ViewLinkDeclarationOpenPageActionDefinition"); - - t.targetPageDefinition = s.equivalent("ViewLinkPageDefinition"); - - log.debug("ViewLinkDeclarationOpenPageAction: " + t.name); -} - - @lazy rule ViewLinkDeclarationOpenFormButton transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenFormButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenFormButton"); t.name = s.name + "::Create::Open"; t.buttonStyle = "contained"; t.label = "Create"; @@ -431,7 +182,7 @@ rule ViewLinkDeclarationOpenFormButton rule ViewLinkDeclarationOpenFormButtonIcon transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenFormButtonIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenFormButtonIcon"); t.iconName = "note-add"; t.name = s.name + "OpenFormIcon"; @@ -442,41 +193,18 @@ rule ViewLinkDeclarationOpenFormButtonIcon rule ViewLinkDeclarationOpenCreateFormActionDefinition transform s: JSL!UIViewLinkDeclaration to t: UI!ui::OpenCreateFormActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenCreateFormActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenCreateFormActionDefinition"); t.name = s.name + "::OpenCreate"; t.isContainedRelationAction = true; - var targetCreateEvent = s.referenceType.getCreateEventDeclaration(); - - if (targetCreateEvent.parameterType.isDefined() and targetCreateEvent.parameterType.isKindOf(JSL!TransferDeclaration)) { - t.targetType = targetCreateEvent.parameterType.equivalent("ClassType"); - } else { - t.targetType = s.referenceType.equivalent("ClassType"); - } - log.debug("ViewLinkDeclarationOpenCreateFormActionDefinition: " + t.name); } -@greedy -@lazy -rule ViewLinkDeclarationOpenFormAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenFormAction"); - - t.name = s.name + "::OpenForm"; - t.actionDefinition = s.equivalent("ViewLinkDeclarationOpenCreateFormActionDefinition"); - - t.targetPageDefinition = s.equivalent("ViewLinkCreateFormPageDefinition"); - - log.debug("ViewLinkDeclarationOpenFormAction: " + t.name); -} - @lazy rule ViewLinkDeclarationDeleteButton transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationDeleteButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationDeleteButton"); t.name = s.name + "::Delete"; t.buttonStyle = "contained"; t.label = "Delete"; @@ -490,7 +218,7 @@ rule ViewLinkDeclarationDeleteButton rule ViewLinkDeclarationDeleteButtonIcon transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationDeleteButtonIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationDeleteButtonIcon"); t.iconName = "delete_forever"; t.name = s.name + "DeleteIcon"; @@ -501,32 +229,19 @@ rule ViewLinkDeclarationDeleteButtonIcon rule ViewLinkDeclarationRowDeleteActionDefinition transform s: JSL!UIViewLinkDeclaration to t: UI!ui::RowDeleteActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationRowDeleteActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationRowDeleteActionDefinition"); t.name = s.name + "::Delete"; t.isContainedRelationAction = true; - t.targetType = s.referenceType.equivalent("ClassType"); + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); log.debug("ViewLinkDeclarationRowDeleteActionDefinition: " + t.name); } -@greedy -@lazy -rule ViewLinkDeclarationRowDeleteAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationRowDeleteAction"); - - t.name = s.name + "::RowDelete"; - t.actionDefinition = s.equivalent("ViewLinkDeclarationRowDeleteActionDefinition"); - - log.debug("ViewLinkDeclarationRowDeleteAction: " + t.name); -} - @lazy rule ViewLinkDeclarationUnsetButton transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationUnsetButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationUnsetButton"); t.name = s.name + "::Unset"; t.label = "Unset"; t.buttonStyle = "contained"; @@ -540,30 +255,19 @@ rule ViewLinkDeclarationUnsetButton rule ViewLinkDeclarationUnsetActionDefinition transform s: JSL!UIViewLinkDeclaration to t: UI!ui::UnsetActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationUnsetActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationUnsetActionDefinition"); t.name = s.name + "::Unset"; t.isContainedRelationAction = true; - t.targetType = s.referenceType.equivalent("ClassType"); + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); log.debug("ViewLinkDeclarationUnsetActionDefinition: " + t.name); } -@lazy -rule ViewLinkDeclarationUnsetAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationUnsetAction"); - t.name = s.name + "::Unset"; - t.actionDefinition = s.equivalent("ViewLinkDeclarationUnsetActionDefinition"); - - log.debug("ViewLinkDeclarationUnsetAction: " + t.name); -} - @lazy rule ViewLinkDeclarationOpenSetSelectorButton transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenSetSelectorButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenSetSelectorButton"); t.name = s.name + "::OpenSetSelector"; t.label = "Set"; t.buttonStyle = "contained"; @@ -577,7 +281,7 @@ rule ViewLinkDeclarationOpenSetSelectorButton rule ViewLinkDeclarationOpenSetSelectorActionDefinition transform s: JSL!UIViewLinkDeclaration to t: UI!ui::OpenSetSelectorActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenSetSelectorActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenSetSelectorActionDefinition"); t.name = s.name + "::OpenSetSelector"; t.isContainedRelationAction = true; t.selectorFor = s.equivalent("ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition"); @@ -586,299 +290,51 @@ rule ViewLinkDeclarationOpenSetSelectorActionDefinition } @lazy -rule ViewLinkDeclarationOpenSetSelectorDialogAction +rule ViewLinkDeclarationAutocompleteRangeAction transform s: JSL!UIViewLinkDeclaration to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenSetSelectorDialogAction"); - t.name = s.name + "::OpenSetSelector"; - t.actionDefinition = s.equivalent("ViewLinkDeclarationOpenSetSelectorActionDefinition"); - t.targetPageDefinition = s.equivalent("ViewLinkDeclarationSetSelectorPageDefinition"); - - log.debug("ViewLinkDeclarationOpenSetSelectorDialogAction: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorPageDefinition - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::PageDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorPageDefinition"); - t.name = s.getFqName() + "::SetSelectorPage"; - t.container = s.equivalent("ViewLinkDeclarationSetSelectorPageContainer"); - t.dataElement = s.equivalent("RelationType"); - t.openInDialog = true; - t.dialogSize = UI!ui::DialogSize#MD; - - t.actions.add(s.equivalent("ViewLinkDeclarationSetSelectorSetAction")); - t.actions.add(s.equivalent("ViewLinkDeclarationSetSelectorBackAction")); - t.actions.add(s.equivalent("ViewLinkDeclarationSetSelectorTableFilterAction")); - t.actions.add(s.equivalent("ViewLinkDeclarationSetSelectorTableRangeAction")); - - actorDeclaration.equivalent("Application").pages.add(t); - - log.debug("ViewLinkDeclarationSetSelectorPageDefinition: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorSetAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorSetAction"); - t.name = s.getFqName() + "::SetSelector::Set"; - t.ownerDataElement = s.equivalent("RelationType"); - t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition"); - - log.debug("ViewLinkDeclarationSetSelectorSetAction: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorBackAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorBackAction"); - t.name = s.getFqName() + "::SetSelector::Back"; - t.ownerDataElement = s.equivalent("RelationType"); - t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorBackActionDefinition"); - - log.debug("ViewLinkDeclarationSetSelectorBackAction: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorTableFilterAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableFilterAction"); - t.name = s.getFqName() + "::SetSelector::Table::Filter"; + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationAutocompleteRangeAction"); + t.name = s.name + "::AutocompleteRangeAction"; + t.actionDefinition = s.equivalent("ViewLinkDeclarationAutocompleteRangeActionDefinition"); t.ownerDataElement = s.equivalent("RelationType"); t.targetDataElement = s.equivalent("RelationType"); - t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorTableFilterActionDefinition"); - - log.debug("ViewLinkDeclarationSetSelectorTableFilterAction: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorTableRangeAction - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableRangeAction"); - t.name = s.getFqName() + "::SetSelector::Table::Range"; - t.ownerDataElement = s.equivalent("RelationType"); - t.targetDataElement = s.equivalent("RelationType"); - t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorTableRangeActionDefinition"); - - log.debug("ViewLinkDeclarationSetSelectorTableRangeAction: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorPageContainer - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::PageContainer { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorPageContainer"); - t.name = s.getFqName() + "::SetSelector::PageContainer"; - t.label = s.getLabelWithNameFallback(); - t.titleFrom = UI!ui::TitleFrom#LABEL; - t.type = UI!ui::PageContainerType#TABLE; - t.onInit = s.equivalent("ViewLinkDeclarationSetSelectorTableRangeActionDefinition"); - - t.children.add(s.equivalent("ViewLinkDeclarationSetSelectorVisualElement")); - t.actionButtonGroup = s.equivalent("ViewLinkDeclarationSetSelectorButtonGroup"); - t.dataElement = s.referenceType.equivalent("ClassType"); - t.isSelector = true; - t.isRelationSelector = true; - - actorDeclaration.equivalent("Application").pageContainers.add(t); - - log.debug("ViewLinkDeclarationSetSelectorPageContainer: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorVisualElement - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Flex { - t.~pos = 0; - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorVisualElement"); - t.name = s.name; - t.direction = UI!Axis#VERTICAL; - t.mainAxisAlignment = UI!ui::MainAxisAlignment#START; - t.crossAxisAlignment = UI!ui::CrossAxisAlignment#STRETCH; - t.col = 12d; - t.children.add(s.equivalent("ViewLinkDeclarationSetSelectorTable")); - t.frame = s.equivalent("ViewLinkDeclarationSetSelectorFrame"); - - log.debug("ViewLinkDeclarationSetSelectorVisualElement: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorFrame - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Frame { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorFrame"); -} - -@lazy -rule ViewLinkDeclarationSetSelectorTable - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Table { - var id = actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTable"; - t.setId(id); - t.col = 12d; - t.label = s.getLabelWithNameFallback(); - t.isSelectorTable = true; - t.isRelationSelectorTable = true; - t.allowSelectMultiple = false; - t.name = s.name + "::Set::Selector"; - t.relationName = s.name; - t.dataElement = s.referenceType.equivalent("ClassType"); - t.tableActionButtonGroup = s.equivalent("ViewLinkDeclarationSetSelectorTableButtonGroup"); - t.~pos = s.~pos; - t.showTotalCount = false; - t.selectorRowsPerPage = 10; - - if (s.getRows().isDefined()) { - t.rowsPerPage = s.getRows().value.asInteger(); - } else { - t.rowsPerPage = 10; - } - if (t.~pos.isUndefined()) { - t.~pos = 0; - } - - // TODO eventually selector should work? - var targetDeclaration = s.referenceType; - - var primitiveFields = targetDeclaration.members.select(m | m.isTypeOf(JSL!UIViewWidgetDeclaration) and m.referenceType.`primitive`.isDefined()); - for (field in primitiveFields) { - var col = field.equivalentDiscriminated("TablePrimitiveColumn", id); - t.columns.add(col); - if (col.attributeType.isFilterable) { - t.filters.add(field.equivalentDiscriminated("TablePrimitiveColumnFilter", id)); - } - } - - log.debug("ViewLinkDeclarationSetSelectorTable: " + t.name); + log.debug("ViewLinkDeclarationAutocompleteRangeAction: " + t.name); } @lazy -rule ViewLinkDeclarationSetSelectorTableButtonGroup +rule ViewLinkDeclarationAutocompleteRangeActionDefinition transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::ButtonGroup { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableButtonGroup"); - t.name = s.getFqName() + "::SetSelectorTableActions"; - t.label = "Actions"; - - t.buttons.add(s.equivalent("ViewLinkDeclarationSetSelectorTableFilterButton")); - t.buttons.add(s.equivalent("ViewLinkDeclarationSetSelectorTableRefreshButton")); - - log.debug("ViewLinkDeclarationSetSelectorTableButtonGroup: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorTableFilterButton - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableFilterButton"); - t.name = s.getFqName() + "::SetSelector::Table::Filter"; - t.label = "Set Filters"; - t.buttonStyle = "text"; - t.icon = "filter".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorTableFilterActionDefinition"); - - log.debug("ViewLinkDeclarationSetSelectorTableFilterButton: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorTableFilterActionDefinition - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::FilterActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableFilterActionDefinition"); - t.name = s.getFqName() + "::Table::Filter"; - log.debug("ViewLinkDeclarationSetSelectorTableFilterActionDefinition: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorTableRefreshButton - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableRefreshButton"); - t.name = s.getFqName() + "::SetSelector::Table::Refresh"; - t.label = "Refresh"; - t.buttonStyle = "text"; - t.icon = "refresh".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorTableRangeActionDefinition"); - - log.debug("ViewLinkDeclarationSetSelectorTableRefreshButton: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorTableRangeActionDefinition - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::SelectorRangeActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableRangeActionDefinition"); - - t.name = s.getFqName() + "::SetSelector::Table::Range"; - t.targetType = s.referenceType.equivalent("ClassType"); - - log.debug("ViewLinkDeclarationSetSelectorTableRangeActionDefinition: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorButtonGroup - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::ButtonGroup { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorButtonGroup"); - t.name = s.getFqName() + "::SetSelectorButtonGroup"; - t.label = "Actions"; - - t.buttons.add(s.equivalent("ViewLinkDeclarationSetSelectorSetSelectorBackButton")); - t.buttons.add(s.equivalent("ViewLinkDeclarationSetSelectorSetSelectorSetButton")); - - log.debug("ViewLinkDeclarationSetSelectorButtonGroup: " + t.name); -} - -@lazy -rule ViewLinkDeclarationSetSelectorSetSelectorBackButton - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorSetSelectorBackButton"); - t.name = s.getFqName() + "::Back"; - t.label = "Back"; - t.buttonStyle = "text"; - t.icon = "arrow-left".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorBackActionDefinition"); - - log.debug("ViewLinkDeclarationSetSelectorSetSelectorBackButton: " + t.name); -} + to t: UI!ui::AutocompleteRangeActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationAutocompleteRangeActionDefinition"); + t.name = s.name + "::Autocomplete"; + t.isContainedRelationAction = true; + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); -@lazy -rule ViewLinkDeclarationSetSelectorBackActionDefinition - transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::BackActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorBackActionDefinition"); - t.name = s.getFqName() + "::Back"; - log.debug("ViewLinkDeclarationSetSelectorBackActionDefinition: " + t.name); + log.debug("ViewLinkDeclarationAutocompleteRangeActionDefinition: " + t.name); } @lazy -rule ViewLinkDeclarationSetSelectorSetSelectorSetButton +rule ViewLinkDeclarationAutocompleteSetAction transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorSetSelectorSetButton"); - t.name = s.getFqName() + "::Set"; - t.label = "Set"; - t.buttonStyle = "contained"; - t.icon = "attachment-plus".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition"); + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TViewLinkDeclarationAutocompleteSetAction"); + t.name = s.name + "::AutocompleteSetAction"; + t.actionDefinition = s.equivalent("ViewLinkDeclarationAutocompleteSetActionDefinition"); + t.ownerDataElement = s.equivalent("RelationType"); + t.targetDataElement = s.equivalent("RelationType"); - log.debug("ViewLinkDeclarationSetSelectorSetSelectorSetButton: " + t.name); + log.debug("TViewLinkDeclarationAutocompleteSetAction: " + t.name); } @lazy -rule ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition +rule ViewLinkDeclarationAutocompleteSetActionDefinition transform s: JSL!UIViewLinkDeclaration - to t: UI!ui::SetActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition"); - t.name = s.getFqName() + "::Set"; - t.targetType = s.referenceType.equivalent("ClassType"); + to t: UI!ui::AutocompleteSetActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationAutocompleteSetActionDefinition"); + t.name = s.name + "::AutocompleteSet"; + t.isContainedRelationAction = true; + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); - log.debug("ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition: " + t.name); + log.debug("ViewLinkDeclarationAutocompleteSetActionDefinition: " + t.name); } diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclarationFormPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclarationFormPage.etl new file mode 100644 index 00000000..d89dff07 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclarationFormPage.etl @@ -0,0 +1,65 @@ +@greedy +rule ViewLinkCreateFormPageDefinition + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::PageDefinition { + guard: rootMenu.containsVisualElement(s) and s.getCreateFormModifier().isDefined() + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkCreateFormPageDefinition"); + t.name = s.getFqName() + "::FormPage"; + t.container = s.getCreateFormModifier().form.equivalent("FormPageContainer"); + t.openInDialog = true; + + rootMenu.equivalent("Application").pages.add(t); + + t.dataElement = s.transferRelation.target.equivalent("RelationType"); + + /* + log.info("==================="); + log.info(t.name + ":"); + log.info(relations.collect(r | r.name).concat(", ")); + log.info("==================="); + */ + +/* + for (link in s.getCreateFormModifier().form.getAllLinks()) { + t.actions.add(link.equivalent("ViewLinkDeclarationOpenPageAction")); + } + + for (table in s.getCreateFormModifier().form.getAllLinks()) { + var detailLink = table.getDetailLink(); + + if (detailLink.isDefined()) { + t.actions.add(table.equivalent("ViewTableDeclarationOpenPageAction")); + } + } +*/ + + t.actions.add(s.equivalent("ViewLinkCreateFormBackAction")); + t.actions.add(s.equivalent("ViewLinkCreateFormCreateAction")); + + log.debug("Create ViewLinkCreateFormPageDefinition: " + t.name); +} + +@greedy +@lazy +rule ViewLinkCreateFormCreateAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkCreateFormCreateAction"); + t.name = s.name + "::Create"; + t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerCreateActionDefinition"); + + log.debug("ViewLinkCreateFormCreateAction: " + t.name); +} + +@greedy +@lazy +rule ViewLinkCreateFormBackAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkCreateFormBackAction"); + t.name = s.name + "::Back"; + t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerBackActionDefinition"); + + log.debug("ViewLinkCreateFormBackAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclarationSetSelectorPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclarationSetSelectorPage.etl new file mode 100644 index 00000000..519d1593 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclarationSetSelectorPage.etl @@ -0,0 +1,286 @@ +@lazy +rule ViewLinkDeclarationSetSelectorPageDefinition + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::PageDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorPageDefinition"); + t.name = s.getFqName() + "::SetSelectorPage"; + t.container = s.equivalent("ViewLinkDeclarationSetSelectorPageContainer"); + t.dataElement = s.transferRelation.target.equivalent("RelationType"); + t.openInDialog = true; + t.dialogSize = UI!ui::DialogSize#MD; + + t.actions.add(s.equivalent("ViewLinkDeclarationSetSelectorSetAction")); + t.actions.add(s.equivalent("ViewLinkDeclarationSetSelectorBackAction")); + t.actions.add(s.equivalent("ViewLinkDeclarationSetSelectorTableFilterAction")); + t.actions.add(s.equivalent("ViewLinkDeclarationSetSelectorTableRangeAction")); + + rootMenu.equivalent("Application").pages.add(t); + + log.debug("ViewLinkDeclarationSetSelectorPageDefinition: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorPageContainer + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::PageContainer { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorPageContainer"); + t.name = s.getFqName() + "::SetSelector::PageContainer"; + t.label = s.getLabelWithNameFallback(); + t.titleFrom = UI!ui::TitleFrom#LABEL; + t.type = UI!ui::PageContainerType#TABLE; + t.onInit = s.equivalent("ViewLinkDeclarationSetSelectorTableRangeActionDefinition"); + + t.children.add(s.equivalent("ViewLinkDeclarationSetSelectorVisualElement")); + t.actionButtonGroup = s.equivalent("ViewLinkDeclarationSetSelectorButtonGroup"); + t.dataElement = s.transferRelation.target.referenceType.equivalent("ClassType"); + t.isSelector = true; + t.isRelationSelector = true; + + rootMenu.equivalent("Application").pageContainers.add(t); + + log.debug("ViewLinkDeclarationSetSelectorPageContainer: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorVisualElement + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Flex { + t.~pos = 0; + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorVisualElement"); + t.name = s.name; + t.direction = UI!Axis#VERTICAL; + t.mainAxisAlignment = UI!ui::MainAxisAlignment#START; + t.crossAxisAlignment = UI!ui::CrossAxisAlignment#STRETCH; + t.col = 12d; + t.children.add(s.equivalent("ViewLinkDeclarationSetSelectorTable")); + t.frame = s.equivalent("ViewLinkDeclarationSetSelectorFrame"); + + log.debug("ViewLinkDeclarationSetSelectorVisualElement: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorFrame + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Frame { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorFrame"); +} + +@lazy +rule ViewLinkDeclarationSetSelectorTable + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Table { + var id = rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTable"; + t.setId(id); + t.col = 12d; + t.label = s.getLabelWithNameFallback(); + t.isSelectorTable = true; + t.isRelationSelectorTable = true; + t.allowSelectMultiple = false; + t.name = s.name + "::Set::Selector"; + t.relationName = s.transferRelation.target.name; + t.dataElement = s.transferRelation.target.referenceType.equivalent("ClassType"); + t.tableActionButtonGroup = s.equivalent("ViewLinkDeclarationSetSelectorTableButtonGroup"); + t.~pos = s.~pos; + t.showTotalCount = false; + t.selectorRowsPerPage = 10; + + if (s.getRows().isDefined()) { + t.rowsPerPage = s.getRows().value.asInteger(); + } else { + t.rowsPerPage = 10; + } + if (t.~pos.isUndefined()) { + t.~pos = 0; + } + + // TODO eventually selector should work? + var targetDeclaration = s.referenceType; + var rowDeclaration = s.getSelectorTableModifier().row; + + var columns = rowDeclaration.members.select(m | m.isTypeOf(JSL!UIRowColumnDeclaration) and m.referenceType.`primitive`.isDefined()); + + for (column in columns) { + var col = column.equivalentDiscriminated("TablePrimitiveColumn", id); + t.columns.add(col); + if (col.attributeType.isFilterable) { + t.filters.add(column.equivalentDiscriminated("TablePrimitiveColumnFilter", id)); + } + } + + log.debug("ViewLinkDeclarationSetSelectorTable: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorTableButtonGroup + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::ButtonGroup { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableButtonGroup"); + t.name = s.getFqName() + "::SetSelectorTableActions"; + t.label = "Actions"; + + t.buttons.add(s.equivalent("ViewLinkDeclarationSetSelectorTableFilterButton")); + t.buttons.add(s.equivalent("ViewLinkDeclarationSetSelectorTableRefreshButton")); + + log.debug("ViewLinkDeclarationSetSelectorTableButtonGroup: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorTableFilterButton + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableFilterButton"); + t.name = s.getFqName() + "::SetSelector::Table::Filter"; + t.label = "Set Filters"; + t.buttonStyle = "text"; + t.icon = "filter".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorTableFilterActionDefinition"); + + log.debug("ViewLinkDeclarationSetSelectorTableFilterButton: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorTableFilterActionDefinition + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::FilterActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableFilterActionDefinition"); + t.name = s.getFqName() + "::Table::Filter"; + log.debug("ViewLinkDeclarationSetSelectorTableFilterActionDefinition: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorTableRefreshButton + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableRefreshButton"); + t.name = s.getFqName() + "::SetSelector::Table::Refresh"; + t.label = "Refresh"; + t.buttonStyle = "text"; + t.icon = "refresh".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorTableRangeActionDefinition"); + + log.debug("ViewLinkDeclarationSetSelectorTableRefreshButton: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorTableRangeActionDefinition + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::SelectorRangeActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableRangeActionDefinition"); + + t.name = s.getFqName() + "::SetSelector::Table::Range"; + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); + + log.debug("ViewLinkDeclarationSetSelectorTableRangeActionDefinition: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorButtonGroup + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::ButtonGroup { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorButtonGroup"); + t.name = s.getFqName() + "::SetSelectorButtonGroup"; + t.label = "Actions"; + + t.buttons.add(s.equivalent("ViewLinkDeclarationSetSelectorSetSelectorBackButton")); + t.buttons.add(s.equivalent("ViewLinkDeclarationSetSelectorSetSelectorSetButton")); + + log.debug("ViewLinkDeclarationSetSelectorButtonGroup: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorSetSelectorBackButton + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorSetSelectorBackButton"); + t.name = s.getFqName() + "::Back"; + t.label = "Back"; + t.buttonStyle = "text"; + t.icon = "arrow-left".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorBackActionDefinition"); + + log.debug("ViewLinkDeclarationSetSelectorSetSelectorBackButton: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorBackActionDefinition + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::BackActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorBackActionDefinition"); + t.name = s.getFqName() + "::Back"; + log.debug("ViewLinkDeclarationSetSelectorBackActionDefinition: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorSetSelectorSetButton + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorSetSelectorSetButton"); + t.name = s.getFqName() + "::Set"; + t.label = "Set"; + t.buttonStyle = "contained"; + t.icon = "attachment-plus".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition"); + + log.debug("ViewLinkDeclarationSetSelectorSetSelectorSetButton: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::SetActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition"); + t.name = s.getFqName() + "::Set"; + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); + + log.debug("ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorSetAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorSetAction"); + t.name = s.getFqName() + "::SetSelector::Set"; + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorSetSelectorSetActionDefinition"); + + log.debug("ViewLinkDeclarationSetSelectorSetAction: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorBackAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorBackAction"); + t.name = s.getFqName() + "::SetSelector::Back"; + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorBackActionDefinition"); + + log.debug("ViewLinkDeclarationSetSelectorBackAction: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorTableFilterAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableFilterAction"); + t.name = s.getFqName() + "::SetSelector::Table::Filter"; + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorTableFilterActionDefinition"); + + log.debug("ViewLinkDeclarationSetSelectorTableFilterAction: " + t.name); +} + +@lazy +rule ViewLinkDeclarationSetSelectorTableRangeAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationSetSelectorTableRangeAction"); + t.name = s.getFqName() + "::SetSelector::Table::Range"; + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + t.actionDefinition = s.equivalent("ViewLinkDeclarationSetSelectorTableRangeActionDefinition"); + + log.debug("ViewLinkDeclarationSetSelectorTableRangeAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclarationViewPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclarationViewPage.etl new file mode 100644 index 00000000..72e53da9 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewLinkDeclarationViewPage.etl @@ -0,0 +1,219 @@ +rule ViewLinkPageDefinition + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::PageDefinition { + guard: rootMenu.containsVisualElement(s) + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkPageDefinition"); + t.name = s.getFqName() + "::ViewPage"; + t.container = s.referenceType.equivalent("ViewPageContainer"); + + rootMenu.equivalent("Application").pages.add(t); + + t.dataElement = s.transferRelation.target.equivalent("RelationType"); + + /* + log.info("==================="); + log.info(t.name + ":"); + log.info(relations.collect(r | r.name).concat(", ")); + log.info("==================="); + */ + + for (link in s.referenceType.getOwnLinks()) { + var lRelation = link.transferRelation.target; + + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenPageAction", s.getId())); + if (lRelation.isRefreshAllowed() and not lRelation.isEager()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationRefreshAction", s.getId())); + } + if (link.getCreateFormModifier().isDefined()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenFormAction", s.getId())); + } + if (lRelation.isDeleteAllowed()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationRowDeleteAction", s.getId())); + } + if (link.getSelectorTableModifier().isDefined()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenSetSelectorDialogAction", s.getId())); + } + if (link.getSelectorTableModifier().isDefined()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationUnsetAction", s.getId())); + } + if (lRelation.isGetRangeAllowed()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationAutocompleteRangeAction", s.getId())); + } + if (lRelation.isSetReferenceAllowed()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationAutocompleteSetAction", s.getId())); + } + } + + for (table in s.referenceType.getOwnTables()) { + var tRelation = table.transferRelation.target; + + if (table.getUpdateViewModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenPageAction", s.getId())); + } + if (tRelation.isFilterSupported()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationFilterAction", s.getId())); + } + if (tRelation.isRefreshAllowed()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationRefreshAction", s.getId())); + } + if (table.getCreateFormModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenCreateAction", s.getId())); + } + if (tRelation.isDeleteAllowed()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationRowDeleteAction", s.getId())); + } + if (table.getSelectorTableModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenAddSelectorAction", s.getId())); + } + if (table.getSelectorTableModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationClearAction", s.getId())); + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationBulkRemoveAction", s.getId())); + } + } + + t.actions.add(s.equivalent("ViewLinkPageDefinitionBackAction")); + if (s.transferRelation.target.isRefreshAllowed()) { + t.actions.add(s.equivalent("ViewLinkPageDefinitionRefreshAction")); + } + if (s.transferRelation.target.isUpdateAllowed()) { + t.actions.add(s.equivalent("ViewLinkPageDefinitionUpdateAction")); + } + if (s.transferRelation.target.isDeleteAllowed()) { + t.actions.add(s.equivalent("ViewLinkPageDefinitionDeleteAction")); + } + + log.debug("Create ViewLinkPageDefinition: " + t.name); +} + +@lazy +@greedy +rule ViewLinkPageDefinitionRefreshAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + guard: rootMenu.containsVisualElement(s) + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkPageDefinitionRefreshAction"); + t.name = s.name + "::Refresh"; + t.actionDefinition = s.referenceType.equivalent("ViewPageContainerRefreshActionDefinition"); + + log.debug("ViewLinkPageDefinitionRefreshAction: " + t.name); +} + +@lazy +@greedy +rule ViewLinkPageDefinitionBackAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + guard: rootMenu.containsVisualElement(s) + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkPageDefinitionBackAction"); + t.name = s.name + "::Back"; + t.actionDefinition = s.referenceType.equivalent("ViewPageContainerBackActionDefinition"); + + log.debug("ViewLinkPageDefinitionBackAction: " + t.name); +} + +@lazy +@greedy +rule ViewLinkPageDefinitionUpdateAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkPageDefinitionUpdateAction"); + t.name = s.name + "::Update"; + t.actionDefinition = s.referenceType.equivalent("ViewPageContainerUpdateActionDefinition"); + + log.debug("ViewLinkPageDefinitionUpdateAction: " + t.name); +} + +@lazy +@greedy +rule ViewLinkPageDefinitionDeleteAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkPageDefinitionDeleteAction"); + t.name = s.name + "::Delete"; + t.actionDefinition = s.referenceType.equivalent("ViewPageContainerDeleteActionDefinition"); + + log.debug("ViewLinkPageDefinitionDeleteAction: " + t.name); +} + +@greedy +@lazy +rule ViewLinkDeclarationRefreshAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationRefreshAction"); + t.name = s.name + "::Refresh"; + t.actionDefinition = s.equivalent("ViewLinkDeclarationRefreshActionDefinition"); + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewLinkDeclarationRefreshAction: " + t.name); +} + +@greedy +@lazy +rule ViewLinkDeclarationOpenPageAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenPageAction"); + t.name = s.name + "::OpenPage"; + t.actionDefinition = s.equivalent("ViewLinkDeclarationOpenPageActionDefinition"); + t.targetPageDefinition = s.equivalent("ViewLinkPageDefinition"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewLinkDeclarationOpenPageAction: " + t.name); +} + +@greedy +@lazy +rule ViewLinkDeclarationOpenFormAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenFormAction"); + t.name = s.name + "::OpenForm"; + t.actionDefinition = s.equivalent("ViewLinkDeclarationOpenCreateFormActionDefinition"); + t.targetPageDefinition = s.equivalent("ViewLinkCreateFormPageDefinition"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewLinkDeclarationOpenFormAction: " + t.name); +} + +@greedy +@lazy +rule ViewLinkDeclarationRowDeleteAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationRowDeleteAction"); + t.name = s.name + "::RowDelete"; + t.actionDefinition = s.equivalent("ViewLinkDeclarationRowDeleteActionDefinition"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewLinkDeclarationRowDeleteAction: " + t.name); +} + +@lazy +rule ViewLinkDeclarationUnsetAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationUnsetAction"); + t.name = s.name + "::Unset"; + t.actionDefinition = s.equivalent("ViewLinkDeclarationUnsetActionDefinition"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewLinkDeclarationUnsetAction: " + t.name); +} + +@lazy +rule ViewLinkDeclarationOpenSetSelectorDialogAction + transform s: JSL!UIViewLinkDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewLinkDeclarationOpenSetSelectorDialogAction"); + t.name = s.name + "::OpenSetSelector"; + t.actionDefinition = s.equivalent("ViewLinkDeclarationOpenSetSelectorActionDefinition"); + t.targetPageDefinition = s.equivalent("ViewLinkDeclarationSetSelectorPageDefinition"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewLinkDeclarationOpenSetSelectorDialogAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclaration.etl index e3b7cda8..afc46939 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclaration.etl @@ -1,89 +1,11 @@ -@greedy -rule ViewTableCreateFormPageDefinition - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::PageDefinition { - guard: actorDeclaration.getAllRelations().contains(s) and s.isFormRelation() - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableCreateFormPageDefinition"); - - t.name = s.getFqName() + "::FormPage"; - - var targetCreateEvent = s.referenceType.getCreateEventDeclaration(); - var targetContainer = targetCreateEvent.parameterType; - t.container = targetContainer.equivalent("TransferDeclarationPageContainer"); - - actorDeclaration.equivalent("Application").pages.add(t); - - t.dataElement = s.equivalent("FormRelationType"); - - // var relations = s.referenceType.getDirectRelations(); - - /* - log.info("==================="); - log.info(t.name + ":"); - log.info(relations.collect(r | r.name).concat(", ")); - log.info("==================="); - */ - /* - for (link in relations.select(r | r.isKindOf(JSL!UIViewLinkDeclaration))) { - t.actions.add(link.equivalent("ViewLinkDeclarationOpenPageAction")); - } - - for (table in relations.select(r | r.isKindOf(JSL!UIViewTableDeclaration))) { - var detailLink = table.getDetailLink(); - - if (detailLink.isDefined()) { - t.actions.add(table.equivalent("ViewTableDeclarationOpenPageAction")); - } - } - */ - - t.actions.add(s.equivalent("ViewTableCreateFormBackAction")); - t.actions.add(s.equivalent("ViewTableCreateFormCreateAction")); - - log.debug("Create ViewTableCreateFormPageDefinition: " + t.name); -} - -@greedy -@lazy -rule ViewTableCreateFormCreateAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableCreateFormCreateAction"); - - var targetCreateEvent = s.referenceType.getCreateEventDeclaration(); - var targetContainer = targetCreateEvent.parameterType.isDefined() ? targetCreateEvent.parameterType : s.referenceType; - - t.name = s.name + "::Create"; - t.actionDefinition = targetContainer.equivalent("TransferDeclarationCreateActionDefinition"); - - log.debug("ViewTableCreateFormCreateAction: " + t.name); -} - -@greedy -@lazy -rule ViewTableCreateFormBackAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableCreateFormBackAction"); - - var targetCreateEvent = s.referenceType.getCreateEventDeclaration(); - var targetContainer = targetCreateEvent.parameterType.isDefined() ? targetCreateEvent.parameterType : s.referenceType; - - t.name = s.name + "::Back"; - t.actionDefinition = targetContainer.equivalent("TransferDeclarationBackActionDefinition"); - - log.debug("ViewTableCreateFormBackAction: " + t.name); -} - @abstract rule AbstractViewTableDeclaration transform s: JSL!UIViewTableDeclaration to t: UI!ui::Table { - guard: actorDeclaration.getAllRelations().contains(s) + guard: rootMenu.containsVisualElement(s) t.name = s.name; - t.relationName = s.name; + t.relationName = s.transferRelation.target.name; t.label = s.getLabelWithNameFallback(); if (s.getIconModifier().isDefined()) { t.icon = s.equivalent("TableIcon"); @@ -101,7 +23,7 @@ rule AbstractViewTableDeclaration rule TableIcon transform s: JSL!UIViewTableDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/TableIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TableIcon"); t.name = s.name + "TableIcon"; t.iconName = s.getIconModifier().value.value; } @@ -110,24 +32,25 @@ rule InlineViewTable transform s: JSL!UIViewTableDeclaration to t: UI!ui::Table extends AbstractViewTableDeclaration { - guard: s.getTransferObjectType().isGenerated() + guard: rootMenu.containsVisualElement(s) - var id = actorDeclaration.name + "/(jsl/" + s.getId() + ")/InlineViewTable"; + var id = rootMenu.name + "/(jsl/" + s.getId() + ")/InlineViewTable"; t.setId(id); - t.dataElement = s.equivalent("RelationType"); + t.dataElement = s.transferRelation.target.equivalent("RelationType"); s.eContainer.uiContainer().children.add(t); - var primitiveFields = s.referenceType.members.select(m | m.isTypeOf(JSL!RowFieldDeclaration) and m.referenceType.`primitive`.isDefined()); + var columns = s.referenceType.members.select(m | m.isTypeOf(JSL!UIRowColumnDeclaration) and m.referenceType.`primitive`.isDefined()); // var links = s.referenceType.members.select(m | m.isTypeOf(JSL!RowLinkDeclaration)); - for (field in primitiveFields) { - var col = field.equivalentDiscriminated("TablePrimitiveColumn", id); + for (column in columns) { + var col = column.equivalentDiscriminated("TablePrimitiveColumn", id); t.columns.add(col); if (col.attributeType.isFilterable) { - t.filters.add(field.equivalentDiscriminated("TablePrimitiveColumnFilter", id)); + t.filters.add(column.equivalentDiscriminated("TablePrimitiveColumnFilter", id)); } } + /* for (link in links) { if (link.getDetail().isUndefined()) { @@ -154,9 +77,9 @@ rule InlineViewTable @lazy @greedy rule TablePrimitiveColumn - transform s: JSL!TransferFieldDeclaration + transform s: JSL!UIRowColumnDeclaration to t: UI!ui::Column { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/TablePrimitiveColumn"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TablePrimitiveColumn"); t.name = s.name; t.format = "%s"; t.label = s.getLabelWithNameFallback(); @@ -172,12 +95,12 @@ rule TablePrimitiveColumn @lazy @greedy rule ColumnIcon - transform s: JSL!TransferFieldDeclaration + transform s: JSL!UIRowColumnDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ColumnIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ColumnIcon"); t.iconName = s.getIconModifier().value.value; t.name = s.name + "FieldIcon"; - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ColumnIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ColumnIcon"); log.debug("ColumnIcon: " + t.name); } @@ -185,9 +108,9 @@ rule ColumnIcon @lazy @greedy rule TablePrimitiveColumnFilter - transform s: JSL!TransferFieldDeclaration + transform s: JSL!UIRowColumnDeclaration to t: UI!ui::Filter { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/TablePrimitiveColumnFilter"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TablePrimitiveColumnFilter"); t.name = s.name + "Filter"; t.attributeType = s.getTransferFieldDeclarationEquivalent(); t.label = s.getLabelWithNameFallback(); @@ -199,7 +122,7 @@ rule TablePrimitiveColumnFilter rule RowLinkDerivedColumn transform s: JSL!RowLinkDeclaration to t: UI!ui::Column { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/RowLinkDerivedColumn"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/RowLinkDerivedColumn"); // we keep the name of the link it self because the relation won't be present in the visual elements only in the data model t.name = s.name; t.format = "%s"; @@ -219,7 +142,7 @@ rule RowLinkDerivedColumn rule RowLinkDerivedColumnIcon transform s: JSL!RowLinkDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/RowLinkDerivedColumnIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/RowLinkDerivedColumnIcon"); t.iconName = s.getIconModifier().value.value; t.name = s.name + "DerivedColumnIcon"; @@ -231,7 +154,7 @@ rule RowLinkDerivedColumnIcon rule RowLinkDerivedColumnFilter transform s: JSL!RowLinkDeclaration to t: UI!ui::Filter { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/RowLinkDerivedColumnFilter"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/RowLinkDerivedColumnFilter"); t.name = s.name + "Filter"; t.attributeType = s.equivalent("RowLinkDerivedAttributeType"); t.label = s.getLabelWithNameFallback(); @@ -243,7 +166,7 @@ rule RowLinkDerivedColumnFilter rule RowLinkDerivedAttributeType transform s: JSL!RowLinkDeclaration to t: UI!ui::data::AttributeType { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/RowLinkDerivedAttributeType"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/RowLinkDerivedAttributeType"); t.memberType = UI!ui::data::MemberType#DERIVED; t.isReadOnly = true; t.name = "_text_" + s.name; @@ -251,7 +174,7 @@ rule RowLinkDerivedAttributeType t.isFilterable = true; // TODO investigate if it really does not matter which string type we pick - t.dataType = actorDeclaration.equivalent("Application").dataTypes.selectOne(d | d.isTypeOf(UI!ui::data::StringType)); + t.dataType = rootMenu.equivalent("Application").dataTypes.selectOne(d | d.isTypeOf(UI!ui::data::StringType)); s.getContainerEquivalentClassType().attributes.add(t); log.debug("Created RowLinkDerivedAttributeType for ViewLinkDeclaration: [" + t.name + "] for [" + s.name + "]"); @@ -261,25 +184,27 @@ rule RowLinkDerivedAttributeType rule InlineViewTableButtonGroup transform s: JSL!UIViewTableDeclaration to t: UI!ui::ButtonGroup { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/InlineViewTableButtonGroup"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/InlineViewTableButtonGroup"); t.name = s.name + "::InlineViewTableButtonGroup"; t.label = "Actions"; // TODO add buttons - if (s.isFilterSupported()) { + var relation = s.transferRelation.target; + + if (relation.isFilterSupported()) { t.buttons.add(s.equivalent("ViewTableDeclarationFilterButton")); } - if (s.isRefreshAllowed()) { + if (relation.isRefreshAllowed()) { t.buttons.add(s.equivalent("ViewTableDeclarationRefreshButton")); } - if (s.isCreateAllowed()) { + if (s.getCreateFormModifier().isDefined()) { t.buttons.add(s.equivalent("ViewTableDeclarationOpenCreateButton")); } - if (s.isAddReferenceAllowed()) { + if (s.getSelectorTableModifier().isDefined()) { t.buttons.add(s.equivalent("ViewTableDeclarationOpenAddSelectorButton")); } - if (s.isRemoveReferenceAllowed()) { + if (s.getSelectorTableModifier().isDefined()) { t.buttons.add(s.equivalent("ViewTableDeclarationClearButton")); t.buttons.add(s.equivalent("ViewTableDeclarationBulkRemoveButton")); } @@ -291,17 +216,16 @@ rule InlineViewTableButtonGroup rule InlineViewTableRowButtonGroup transform s: JSL!UIViewTableDeclaration to t: UI!ui::ButtonGroup { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/InlineViewTableRowButtonGroup"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/InlineViewTableRowButtonGroup"); t.name = s.name + "InlineViewTableRowButtonGroup"; t.label = "Actions"; // TODO add buttons - var rowLinks = s.referenceType.members.select(m | m.isTypeOf(JSL!RowLinkDeclaration)); - if (rowLinks.selectOne(l | l.getDetail().isDefined()).isDefined()) { - t.buttons.add(s.equivalent("ViewTableDeclarationRowOpenPageButton")); + if (s.getUpdateViewModifier().isDefined()) { + t.buttons.add(s.equivalent("ViewTableDeclarationOpenPageButton")); } - if (s.isDeleteAllowed()) { + if (s.transferRelation.target.isDeleteAllowed()) { t.buttons.add(s.equivalent("ViewTableDeclarationRowDeleteButton")); } @@ -312,7 +236,7 @@ rule InlineViewTableRowButtonGroup rule ViewTableDeclarationFilterButton transform s: JSL!UIViewTableDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationFilterButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationFilterButton"); t.name = s.name + "::Filter"; t.icon = s.equivalent("ViewTableDeclarationFilterButtonIcon"); t.label = "Filter"; @@ -326,7 +250,7 @@ rule ViewTableDeclarationFilterButton rule ViewTableDeclarationFilterButtonIcon transform s: JSL!UIViewTableDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationFilterButtonIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationFilterButtonIcon"); t.name = s.name + "FilterIcon"; t.iconName = "filter"; @@ -337,29 +261,18 @@ rule ViewTableDeclarationFilterButtonIcon rule ViewTableDeclarationFilterActionDefinition transform s: JSL!UIViewTableDeclaration to t: UI!ui::FilterActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationFilterActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationFilterActionDefinition"); t.name = s.name + "::Filter"; - t.targetType = s.referenceType.equivalent("ClassType"); + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); log.debug("ViewTableDeclarationFilterActionDefinition: " + t.name); } -@lazy -rule ViewTableDeclarationFilterAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationFilterAction"); - t.name = s.name + "::Filter"; - t.actionDefinition = s.equivalent("ViewTableDeclarationFilterActionDefinition"); - - log.debug("ViewTableDeclarationFilterAction: " + t.name); -} - @lazy rule ViewTableDeclarationRefreshButton transform s: JSL!UIViewTableDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRefreshButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRefreshButton"); t.name = s.name + "::Refresh"; t.icon = s.equivalent("ViewTableDeclarationRefreshButtonIcon"); t.label = "Refresh"; @@ -373,7 +286,7 @@ rule ViewTableDeclarationRefreshButton rule ViewTableDeclarationRefreshButtonIcon transform s: JSL!UIViewTableDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRefreshButtonIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRefreshButtonIcon"); t.name = s.name + "RefreshIcon"; t.iconName = "refresh"; @@ -384,29 +297,18 @@ rule ViewTableDeclarationRefreshButtonIcon rule ViewTableDeclarationRefreshActionDefinition transform s: JSL!UIViewTableDeclaration to t: UI!ui::RefreshActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRefreshActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRefreshActionDefinition"); t.name = s.name + "::Refresh"; - t.targetType = s.referenceType.equivalent("ClassType"); + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); log.debug("ViewTableDeclarationRefreshActionDefinition: " + t.name); } -@lazy -rule ViewTableDeclarationRefreshAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRefreshAction"); - t.name = s.name + "::Refresh"; - t.actionDefinition = s.equivalent("ViewTableDeclarationRefreshActionDefinition"); - - log.debug("ViewTableDeclarationRefreshAction: " + t.name); -} - @lazy rule ViewTableDeclarationOpenCreateButton transform s: JSL!UIViewTableDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenCreateButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenCreateButton"); t.name = s.name + "::OpenCreate"; t.icon = s.equivalent("ViewTableDeclarationOpenCreateButtonIcon"); t.label = "Create"; @@ -420,7 +322,7 @@ rule ViewTableDeclarationOpenCreateButton rule ViewTableDeclarationOpenCreateButtonIcon transform s: JSL!UIViewTableDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenCreateButtonIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenCreateButtonIcon"); t.name = s.name + "OpenCreateIcon"; t.iconName = "file-document-plus"; @@ -431,87 +333,53 @@ rule ViewTableDeclarationOpenCreateButtonIcon rule ViewTableDeclarationOpenCreateActionDefinition transform s: JSL!UIViewTableDeclaration to t: UI!ui::OpenCreateFormActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenCreateActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenCreateActionDefinition"); t.name = s.name + "::OpenCreate"; - t.targetType = s.referenceType.equivalent("ClassType"); log.debug("ViewTableDeclarationOpenCreateActionDefinition: " + t.name); } @lazy -rule ViewTableDeclarationOpenCreateAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenCreateAction"); - t.name = s.name + "::OpenCreate"; - t.actionDefinition = s.equivalent("ViewTableDeclarationOpenCreateActionDefinition"); - - t.targetPageDefinition = s.equivalent("ViewTableCreateFormPageDefinition"); - - log.debug("ViewTableDeclarationOpenCreateAction: " + t.name); -} - -@lazy -rule ViewTableDeclarationRowOpenPageButton +rule ViewTableDeclarationOpenPageButton transform s: JSL!UIViewTableDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowOpenPageButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenPageButton"); t.name = s.name + "::View"; - t.icon = s.equivalent("ViewTableDeclarationRowOpenPageButtonIcon"); + t.icon = s.equivalent("ViewTableDeclarationOpenPageButtonIcon"); t.label = "View"; t.buttonStyle = "contained"; - t.actionDefinition = s.equivalent("ViewTableDeclarationRowOpenPageActionDefinition"); + t.actionDefinition = s.equivalent("ViewTableDeclarationOpenPageActionDefinition"); - log.debug("ViewTableDeclarationRowOpenPageButton: " + t.name); + log.debug("ViewTableDeclarationOpenPageButton: " + t.name); } @lazy -rule ViewTableDeclarationRowOpenPageButtonIcon +rule ViewTableDeclarationOpenPageButtonIcon transform s: JSL!UIViewTableDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowOpenPageButtonIcon"); - t.name = s.name + "RowOpenIcon"; + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenPageButtonIcon"); + t.name = s.name + "OpenPageIcon"; t.iconName = "visibility"; - log.debug("ViewTableDeclarationRowOpenPageButtonIcon: " + t.name); + log.debug("ViewTableDeclarationOpenPageButtonIcon: " + t.name); } @lazy -rule ViewTableDeclarationRowOpenPageActionDefinition +rule ViewTableDeclarationOpenPageActionDefinition transform s: JSL!UIViewTableDeclaration - to t: UI!ui::RowOpenPageActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowOpenPageActionDefinition"); + to t: UI!ui::OpenPageActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenPageActionDefinition"); t.name = s.name + "::View"; - t.targetType = s.referenceType.equivalent("ClassType"); + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); - var rowLinks = s.referenceType.members.select(m | m.isTypeOf(JSL!RowLinkDeclaration)); - - t.linkRelation = rowLinks.selectOne(l | l.getDetail().isDefined()).equivalent("RelationType"); - - log.debug("ViewTableDeclarationRowOpenPageActionDefinition: " + t.name); -} - -@lazy -rule ViewTableDeclarationOpenPageAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - var row = s.referenceType; - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenPageAction"); - - t.name = s.name + "::OpenPage"; - t.actionDefinition = s.equivalent("ViewTableDeclarationRowOpenPageActionDefinition"); - - t.targetPageDefinition = s.getDetailLink().equivalent("RowLinkPageDefinition"); - - log.debug("ViewTableDeclarationOpenPageAction: " + t.name); + log.debug("ViewTableDeclarationOpenPageActionDefinition: " + t.name); } @lazy rule ViewTableDeclarationRowDeleteButton transform s: JSL!UIViewTableDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowDeleteButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowDeleteButton"); t.name = s.name + "::RowDelete"; t.icon = s.equivalent("ViewTableDeclarationRowDeleteButtonIcon"); t.label = "Delete"; @@ -525,7 +393,7 @@ rule ViewTableDeclarationRowDeleteButton rule ViewTableDeclarationRowDeleteButtonIcon transform s: JSL!UIViewTableDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowDeleteButtonIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowDeleteButtonIcon"); t.name = s.name + "RowDeleteIcon"; t.iconName = "delete_forever"; @@ -536,29 +404,18 @@ rule ViewTableDeclarationRowDeleteButtonIcon rule ViewTableDeclarationRowDeleteActionDefinition transform s: JSL!UIViewTableDeclaration to t: UI!ui::RowDeleteActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowDeleteActionDefinition"); - t.name = s.name + "::RowDelete"; - t.targetType = s.referenceType.equivalent("ClassType"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowDeleteActionDefinition"); + t.name = s.name + "::RowDelete"; + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); log.debug("ViewTableDeclarationRowDeleteActionDefinition: " + t.name); } -@lazy -rule ViewTableDeclarationRowDeleteAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowDeleteAction"); - t.name = s.name + "::RowDelete"; - t.actionDefinition = s.equivalent("ViewTableDeclarationRowDeleteActionDefinition"); - - log.debug("ViewTableDeclarationRowDeleteAction: " + t.name); -} - @lazy rule ViewTableDeclarationOpenAddSelectorButton transform s: JSL!UIViewTableDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenAddSelectorButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenAddSelectorButton"); t.name = s.name + "::OpenAddSelector"; t.icon = s.equivalent("ViewTableDeclarationOpenAddSelectorButtonIcon"); t.label = "Add"; @@ -572,7 +429,7 @@ rule ViewTableDeclarationOpenAddSelectorButton rule ViewTableDeclarationOpenAddSelectorButtonIcon transform s: JSL!UIViewTableDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenAddSelectorButtonIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenAddSelectorButtonIcon"); t.name = s.name + "OpenAddSelectorIcon"; t.iconName = "attachment-plus"; @@ -583,7 +440,7 @@ rule ViewTableDeclarationOpenAddSelectorButtonIcon rule ViewTableDeclarationOpenAddSelectorActionDefinition transform s: JSL!UIViewTableDeclaration to t: UI!ui::OpenAddSelectorActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenAddSelectorActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenAddSelectorActionDefinition"); t.name = s.name + "::OpenAddSelector"; t.isContainedRelationAction = true; t.selectorFor = s.equivalent("ViewTableDeclarationAddSelectorActionDefinition"); @@ -591,24 +448,11 @@ rule ViewTableDeclarationOpenAddSelectorActionDefinition log.debug("ViewTableDeclarationOpenAddSelectorActionDefinition: " + t.name); } -@lazy -rule ViewTableDeclarationOpenAddSelectorAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenAddSelectorAction"); - t.name = s.name + "::OpenAddSelector"; - t.actionDefinition = s.equivalent("ViewTableDeclarationOpenAddSelectorActionDefinition"); - - t.targetPageDefinition = s.equivalent("ViewTableDeclarationAddSelectorPageDefinition"); - - log.debug("ViewTableDeclarationOpenAddSelectorAction: " + t.name); -} - @lazy rule ViewTableDeclarationBulkRemoveButton transform s: JSL!UIViewTableDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationBulkRemoveButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationBulkRemoveButton"); t.name = s.name + "::BulkRemove"; t.icon = s.equivalent("ViewTableDeclarationBulkRemoveButtonIcon"); t.label = "Remove"; @@ -622,7 +466,7 @@ rule ViewTableDeclarationBulkRemoveButton rule ViewTableDeclarationBulkRemoveButtonIcon transform s: JSL!UIViewTableDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationBulkRemoveButtonIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationBulkRemoveButtonIcon"); t.name = s.name + "RemoveIcon"; t.iconName = "link-off"; @@ -633,34 +477,20 @@ rule ViewTableDeclarationBulkRemoveButtonIcon rule ViewTableDeclarationBulkRemoveActionDefinition transform s: JSL!UIViewTableDeclaration to t: UI!ui::BulkRemoveActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationBulkRemoveActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationBulkRemoveActionDefinition"); t.name = s.name + "::BulkRemove"; - t.targetType = s.referenceType.equivalent("ClassType"); + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); t.isContainedRelationAction = true; t.isBulk = true; log.debug("ViewTableDeclarationBulkRemoveActionDefinition: " + t.name); } -@lazy -rule ViewTableDeclarationBulkRemoveAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationBulkRemoveAction"); - t.name = s.name + "::BulkRemove"; - t.actionDefinition = s.equivalent("ViewTableDeclarationBulkRemoveActionDefinition"); - - t.ownerDataElement = s.equivalent("RelationType"); - t.targetDataElement = s.equivalent("RelationType"); - - log.debug("ViewTableDeclarationBulkRemoveAction: " + t.name); -} - @lazy rule ViewTableDeclarationClearButton transform s: JSL!UIViewTableDeclaration to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationClearButton"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationClearButton"); t.name = s.name + "::Clear"; t.icon = s.equivalent("ViewTableDeclarationClearButtonIcon"); t.label = "Clear"; @@ -674,7 +504,7 @@ rule ViewTableDeclarationClearButton rule ViewTableDeclarationClearButtonIcon transform s: JSL!UIViewTableDeclaration to t: UI!ui::Icon { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationClearButtonIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationClearButtonIcon"); t.name = s.name + "ClearIcon"; t.iconName = "link-off"; @@ -685,327 +515,9 @@ rule ViewTableDeclarationClearButtonIcon rule ViewTableDeclarationClearActionDefinition transform s: JSL!UIViewTableDeclaration to t: UI!ui::ClearActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationClearActionDefinition"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationClearActionDefinition"); t.name = s.name + "::Clear"; t.isContainedRelationAction = true; log.debug("ViewTableDeclarationClearActionDefinition: " + t.name); } - -@lazy -rule ViewTableDeclarationClearAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationClearAction"); - t.name = s.name + "::Clear"; - t.actionDefinition = s.equivalent("ViewTableDeclarationClearActionDefinition"); - - t.ownerDataElement = s.equivalent("RelationType"); - t.targetDataElement = s.equivalent("RelationType"); - - log.debug("ViewTableDeclarationClearAction: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorPageDefinition - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::PageDefinition { - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorPageDefinition"); - - t.name = s.getFqName() + "::AddSelectorPage"; - - t.container = s.equivalent("ViewTableDeclarationAddSelectorPageContainer"); - t.dataElement = s.equivalent("RelationType"); - t.openInDialog = true; - t.dialogSize = UI!ui::DialogSize#MD; - - t.actions.add(s.equivalent("ViewTableDeclarationAddSelectorAddAction")); - t.actions.add(s.equivalent("ViewTableDeclarationAddSelectorBackAction")); - t.actions.add(s.equivalent("ViewTableDeclarationAddSelectorTableFilterAction")); - t.actions.add(s.equivalent("ViewTableDeclarationAddSelectorTableRangeAction")); - - actorDeclaration.equivalent("Application").pages.add(t); - - log.debug("ViewTableDeclarationAddSelectorPageDefinition: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorAddAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorAddAction"); - t.name = s.getFqName() + "::AddSelector::Add"; - t.ownerDataElement = s.equivalent("RelationType"); - t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorAddActionDefinition"); - - log.debug("ViewTableDeclarationAddSelectorAddAction: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorBackAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorBackAction"); - t.name = s.getFqName() + "::AddSelector::Back"; - t.ownerDataElement = s.equivalent("RelationType"); - t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableBackActionDefinition"); - - log.debug("ViewTableDeclarationAddSelectorBackAction: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableFilterAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableFilterAction"); - t.name = s.getFqName() + "::AddSelector::Table::Filter"; - t.ownerDataElement = s.equivalent("RelationType"); - t.targetDataElement = s.equivalent("RelationType"); - t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableTableFilterActionDefinition"); - - log.debug("ViewTableDeclarationAddSelectorTableFilterAction: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableRangeAction - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Action { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableRangeAction"); - t.name = s.getFqName() + "::AddSelector::Table::Range"; - t.ownerDataElement = s.equivalent("RelationType"); - t.targetDataElement = s.equivalent("RelationType"); - t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableRangeActionDefinition"); - - log.debug("ViewTableDeclarationAddSelectorTableRangeAction: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorPageContainer - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::PageContainer { - - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorPageContainer"); - - t.name = s.getFqName() + "::AddSelector::PageContainer"; - t.label = s.getLabelWithNameFallback(); - t.titleFrom = UI!ui::TitleFrom#LABEL; - t.type = UI!ui::PageContainerType#TABLE; - t.onInit = s.equivalent("ViewTableDeclarationAddSelectorTableRangeActionDefinition"); - - t.children.add(s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorVisualElement")); - t.actionButtonGroup = s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorButtonGroup"); - t.dataElement = s.referenceType.equivalent("ClassType"); - t.isSelector = true; - t.isRelationSelector = true; - - actorDeclaration.equivalent("Application").pageContainers.add(t); - - log.debug("ViewTableDeclarationAddSelectorPageContainer: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableRangeActionDefinition - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::SelectorRangeActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableRangeActionDefinition"); - - t.name = s.getFqName() + "::AddSelector::Table::Range"; - t.targetType = s.referenceType.equivalent("ClassType"); - - log.debug("ViewTableDeclarationAddSelectorTableRangeActionDefinition: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableAddSelectorButtonGroup - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::ButtonGroup { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorButtonGroup"); - t.name = s.getFqName() + "::AddSelectorTableAddSelectorButtonGroup"; - t.label = "Actions"; - - t.buttons.add(s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorBackButton")); - t.buttons.add(s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorAddButton")); - - log.debug("ViewTableDeclarationAddSelectorTableAddSelectorButtonGroup: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableAddSelectorBackButton - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorBackButton"); - t.name = s.getFqName() + "::Back"; - t.label = "Back"; - t.buttonStyle = "text"; - t.icon = "arrow-left".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableBackActionDefinition"); - - log.debug("ViewTableDeclarationAddSelectorTableAddSelectorBackButton: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableBackActionDefinition - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::BackActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableBackActionDefinition"); - t.name = s.getFqName() + "::Back"; - log.debug("ViewTableDeclarationAddSelectorTableBackActionDefinition: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableAddSelectorAddButton - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorAddButton"); - t.name = s.getFqName() + "::Add"; - t.label = "Add"; - t.buttonStyle = "contained"; - t.icon = "attachment-plus".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorAddActionDefinition"); - - log.debug("ViewTableDeclarationAddSelectorTableAddSelectorAddButton: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableAddSelectorAddActionDefinition - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::AddActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorAddActionDefinition"); - t.name = s.getFqName() + "::Add"; - t.targetType = s.referenceType.equivalent("ClassType"); - log.debug("ViewTableDeclarationAddSelectorTableAddSelectorAddActionDefinition: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableAddSelectorVisualElement - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Flex { - t.~pos = 0; - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorVisualElement"); - t.name = s.name; - t.direction = UI!Axis#VERTICAL; - t.mainAxisAlignment = UI!ui::MainAxisAlignment#START; - t.crossAxisAlignment = UI!ui::CrossAxisAlignment#STRETCH; - t.col = 12d; - t.children.add(s.equivalent("ViewTableDeclarationAddSelectorTableTable")); - t.frame = s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorFrame"); - - log.debug("ViewTableDeclarationAddSelectorTableAddSelectorVisualElement: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableAddSelectorFrame - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Frame { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorFrame"); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableTable - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Table { - var id = actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableTable"; - t.setId(id); - t.col = 12d; - t.label = s.getLabelWithNameFallback(); - t.isSelectorTable = true; - t.isRelationSelectorTable = true; - t.allowSelectMultiple = true; - t.name = s.name + "::Add::Selector"; - t.relationName = s.name; - t.dataElement = s.referenceType.equivalent("ClassType"); - t.tableActionButtonGroup = s.equivalent("ViewTableDeclarationAddSelectorTableTableButtonGroup"); - t.~pos = s.~pos; - t.showTotalCount = false; - t.selectorRowsPerPage = 10; - - if (s.getRows().isDefined()) { - t.rowsPerPage = s.getRows().value.asInteger(); - } else { - t.rowsPerPage = 10; - } - if (t.~pos.isUndefined()) { - t.~pos = 0; - } - - // TODO eventually selector should work? - var rowDeclaration = s.referenceType; - - var primitiveFields = rowDeclaration.members.select(m | m.isTypeOf(JSL!RowFieldDeclaration) and m.referenceType.`primitive`.isDefined()); - var links = rowDeclaration.members.select(m | m.isTypeOf(JSL!RowLinkDeclaration)); - - for (field in primitiveFields) { - var col = field.equivalentDiscriminated("TablePrimitiveColumn", id); - t.columns.add(col); - if (col.attributeType.isFilterable) { - t.filters.add(field.equivalentDiscriminated("TablePrimitiveColumnFilter", id)); - } - } - - for (link in links) { - if (link.getDetail().isUndefined()) { - var col = link.equivalentDiscriminated("RowLinkDerivedColumn", id); - t.columns.add(col); - if (col.attributeType.isFilterable) { - t.filters.add(link.equivalentDiscriminated("RowLinkDerivedColumnFilter", id)); - } - } else { - // TODO generate open action from link with detail modifier - } - - } - - log.debug("ViewTableDeclarationAddSelectorTableTable: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableTableButtonGroup - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::ButtonGroup { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableTableButtonGroup"); - t.name = s.getFqName() + "::AddSelectorTableActions"; - t.label = "Actions"; - - t.buttons.add(s.equivalent("ViewTableDeclarationAddSelectorTableTableFilterButton")); - t.buttons.add(s.equivalent("TransferObjectTableAddSelectorTableRefreshButton")); - - log.debug("ViewTableDeclarationAddSelectorTableTableButtonGroup: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableTableFilterButton - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableTableFilterButton"); - t.name = s.getFqName() + "::AddSelector::Table::Filter"; - t.label = "Set Filters"; - t.buttonStyle = "text"; - t.icon = "filter".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableTableFilterActionDefinition"); - - log.debug("ViewTableDeclarationAddSelectorTableTableFilterButton: " + t.name); -} - -@lazy -rule ViewTableDeclarationAddSelectorTableTableFilterActionDefinition - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::FilterActionDefinition { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableTableFilterActionDefinition"); - t.name = s.getFqName() + "::Table::Filter"; - log.debug("ViewTableDeclarationAddSelectorTableTableFilterActionDefinition: " + t.name); -} - -@lazy -rule TransferObjectTableAddSelectorTableRefreshButton - transform s: JSL!UIViewTableDeclaration - to t: UI!ui::Button { - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/TransferObjectTableAddSelectorTableRefreshButton"); - t.name = s.getFqName() + "::AddSelector::Table::Refresh"; - t.label = "Refresh"; - t.buttonStyle = "text"; - t.icon = "refresh".createSyntheticIcon(s.getId(), s.getFqName()); - t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableRangeActionDefinition"); - - log.debug("TransferObjectTableAddSelectorTableRefreshButton: " + t.name); -} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclarationAddSelectorPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclarationAddSelectorPage.etl new file mode 100644 index 00000000..00f1b7f5 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclarationAddSelectorPage.etl @@ -0,0 +1,303 @@ +@lazy +rule ViewTableDeclarationAddSelectorPageDefinition + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::PageDefinition { + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorPageDefinition"); + + t.name = s.getFqName() + "::AddSelectorPage"; + + t.container = s.equivalent("ViewTableDeclarationAddSelectorPageContainer"); + t.dataElement = s.transferRelation.target.equivalent("RelationType"); + t.openInDialog = true; + t.dialogSize = UI!ui::DialogSize#MD; + + t.actions.add(s.equivalent("ViewTableDeclarationAddSelectorAddAction")); + t.actions.add(s.equivalent("ViewTableDeclarationAddSelectorBackAction")); + t.actions.add(s.equivalent("ViewTableDeclarationAddSelectorTableFilterAction")); + t.actions.add(s.equivalent("ViewTableDeclarationAddSelectorTableRangeAction")); + + rootMenu.equivalent("Application").pages.add(t); + + log.debug("ViewTableDeclarationAddSelectorPageDefinition: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorPageContainer + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::PageContainer { + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorPageContainer"); + + t.name = s.getFqName() + "::AddSelector::PageContainer"; + t.label = s.getLabelWithNameFallback(); + t.titleFrom = UI!ui::TitleFrom#LABEL; + t.type = UI!ui::PageContainerType#TABLE; + t.onInit = s.equivalent("ViewTableDeclarationAddSelectorTableRangeActionDefinition"); + + t.children.add(s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorVisualElement")); + t.actionButtonGroup = s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorButtonGroup"); + t.dataElement = s.referenceType.map.transfer.equivalent("ClassType"); + t.isSelector = true; + t.isRelationSelector = true; + + rootMenu.equivalent("Application").pageContainers.add(t); + + log.debug("ViewTableDeclarationAddSelectorPageContainer: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableRangeActionDefinition + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::SelectorRangeActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableRangeActionDefinition"); + + t.name = s.getFqName() + "::AddSelector::Table::Range"; + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); + + log.debug("ViewTableDeclarationAddSelectorTableRangeActionDefinition: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableAddSelectorButtonGroup + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::ButtonGroup { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorButtonGroup"); + t.name = s.getFqName() + "::AddSelectorTableAddSelectorButtonGroup"; + t.label = "Actions"; + + t.buttons.add(s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorBackButton")); + t.buttons.add(s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorAddButton")); + + log.debug("ViewTableDeclarationAddSelectorTableAddSelectorButtonGroup: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableAddSelectorBackButton + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorBackButton"); + t.name = s.getFqName() + "::Back"; + t.label = "Back"; + t.buttonStyle = "text"; + t.icon = "arrow-left".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableBackActionDefinition"); + + log.debug("ViewTableDeclarationAddSelectorTableAddSelectorBackButton: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableBackActionDefinition + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::BackActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableBackActionDefinition"); + t.name = s.getFqName() + "::Back"; + log.debug("ViewTableDeclarationAddSelectorTableBackActionDefinition: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableAddSelectorAddButton + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorAddButton"); + t.name = s.getFqName() + "::Add"; + t.label = "Add"; + t.buttonStyle = "contained"; + t.icon = "attachment-plus".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorAddActionDefinition"); + + log.debug("ViewTableDeclarationAddSelectorTableAddSelectorAddButton: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableAddSelectorAddActionDefinition + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::AddActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorAddActionDefinition"); + t.name = s.getFqName() + "::Add"; + t.targetType = s.transferRelation.target.referenceType.equivalent("ClassType"); + log.debug("ViewTableDeclarationAddSelectorTableAddSelectorAddActionDefinition: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableAddSelectorVisualElement + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Flex { + t.~pos = 0; + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorVisualElement"); + t.name = s.name; + t.direction = UI!Axis#VERTICAL; + t.mainAxisAlignment = UI!ui::MainAxisAlignment#START; + t.crossAxisAlignment = UI!ui::CrossAxisAlignment#STRETCH; + t.col = 12d; + t.children.add(s.equivalent("ViewTableDeclarationAddSelectorTableTable")); + t.frame = s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorFrame"); + + log.debug("ViewTableDeclarationAddSelectorTableAddSelectorVisualElement: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableAddSelectorFrame + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Frame { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableAddSelectorFrame"); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableTable + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Table { + var id = rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableTable"; + t.setId(id); + t.col = 12d; + t.label = s.getLabelWithNameFallback(); + t.isSelectorTable = true; + t.isRelationSelectorTable = true; + t.allowSelectMultiple = true; + t.name = s.name + "::Add::Selector"; + t.relationName = s.transferRelation.target.name; + t.dataElement = s.referenceType.map.transfer.equivalent("ClassType"); + t.tableActionButtonGroup = s.equivalent("ViewTableDeclarationAddSelectorTableTableButtonGroup"); + t.~pos = s.~pos; + t.showTotalCount = false; + t.selectorRowsPerPage = 10; + + if (s.getRows().isDefined()) { + t.rowsPerPage = s.getRows().value.asInteger(); + } else { + t.rowsPerPage = 10; + } + if (t.~pos.isUndefined()) { + t.~pos = 0; + } + + // TODO eventually selector should work? + var rowDeclaration = s.getSelectorTableModifier().row; + + var columns = rowDeclaration.members.select(m | m.isTypeOf(JSL!UIRowColumnDeclaration) and m.referenceType.`primitive`.isDefined()); + // var links = rowDeclaration.members.select(m | m.isTypeOf(JSL!RowLinkDeclaration)); + + for (column in columns) { + var col = column.equivalentDiscriminated("TablePrimitiveColumn", id); + t.columns.add(col); + if (col.attributeType.isFilterable) { + t.filters.add(column.equivalentDiscriminated("TablePrimitiveColumnFilter", id)); + } + } +/* + for (link in links) { + if (link.getDetail().isUndefined()) { + var col = link.equivalentDiscriminated("RowLinkDerivedColumn", id); + t.columns.add(col); + if (col.attributeType.isFilterable) { + t.filters.add(link.equivalentDiscriminated("RowLinkDerivedColumnFilter", id)); + } + } else { + // TODO generate open action from link with detail modifier + } + + } +*/ + log.debug("ViewTableDeclarationAddSelectorTableTable: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableTableButtonGroup + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::ButtonGroup { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableTableButtonGroup"); + t.name = s.getFqName() + "::AddSelectorTableActions"; + t.label = "Actions"; + + t.buttons.add(s.equivalent("ViewTableDeclarationAddSelectorTableTableFilterButton")); + t.buttons.add(s.equivalent("TransferObjectTableAddSelectorTableRefreshButton")); + + log.debug("ViewTableDeclarationAddSelectorTableTableButtonGroup: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableTableFilterButton + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableTableFilterButton"); + t.name = s.getFqName() + "::AddSelector::Table::Filter"; + t.label = "Set Filters"; + t.buttonStyle = "text"; + t.icon = "filter".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableTableFilterActionDefinition"); + + log.debug("ViewTableDeclarationAddSelectorTableTableFilterButton: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableTableFilterActionDefinition + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::FilterActionDefinition { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableTableFilterActionDefinition"); + t.name = s.getFqName() + "::Table::Filter"; + log.debug("ViewTableDeclarationAddSelectorTableTableFilterActionDefinition: " + t.name); +} + +@lazy +rule TransferObjectTableAddSelectorTableRefreshButton + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Button { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TransferObjectTableAddSelectorTableRefreshButton"); + t.name = s.getFqName() + "::AddSelector::Table::Refresh"; + t.label = "Refresh"; + t.buttonStyle = "text"; + t.icon = "refresh".createSyntheticIcon(s.getId(), s.getFqName()); + t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableRangeActionDefinition"); + + log.debug("TransferObjectTableAddSelectorTableRefreshButton: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorAddAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorAddAction"); + t.name = s.getFqName() + "::AddSelector::Add"; + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableAddSelectorAddActionDefinition"); + + log.debug("ViewTableDeclarationAddSelectorAddAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorBackAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorBackAction"); + t.name = s.getFqName() + "::AddSelector::Back"; + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableBackActionDefinition"); + + log.debug("ViewTableDeclarationAddSelectorBackAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableFilterAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableFilterAction"); + t.name = s.getFqName() + "::AddSelector::Table::Filter"; + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableTableFilterActionDefinition"); + + log.debug("ViewTableDeclarationAddSelectorTableFilterAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationAddSelectorTableRangeAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationAddSelectorTableRangeAction"); + t.name = s.getFqName() + "::AddSelector::Table::Range"; + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + t.actionDefinition = s.equivalent("ViewTableDeclarationAddSelectorTableRangeActionDefinition"); + + log.debug("ViewTableDeclarationAddSelectorTableRangeAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclarationFormPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclarationFormPage.etl new file mode 100644 index 00000000..89f1c808 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclarationFormPage.etl @@ -0,0 +1,65 @@ +@greedy +rule ViewTableCreateFormPageDefinition + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::PageDefinition { + guard: rootMenu.containsVisualElement(s) and s.getCreateFormModifier().isDefined() + + rootMenu.equivalent("Application").pages.add(t); + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableCreateFormPageDefinition"); + t.name = s.getFqName() + "::FormPage"; + t.container = s.getCreateFormModifier().form.equivalent("FormPageContainer"); + t.dataElement = s.transferRelation.target.equivalent("RelationType"); + t.openInDialog = true; + + // var relations = s.referenceType.getDirectRelations(); + + /* + log.info("==================="); + log.info(t.name + ":"); + log.info(relations.collect(r | r.name).concat(", ")); + log.info("==================="); + */ + /* + for (link in relations.select(r | r.isKindOf(JSL!UIViewLinkDeclaration))) { + t.actions.add(link.equivalent("ViewLinkDeclarationOpenPageAction")); + } + + for (table in relations.select(r | r.isKindOf(JSL!UIViewTableDeclaration))) { + var detailLink = table.getDetailLink(); + + if (detailLink.isDefined()) { + t.actions.add(table.equivalent("ViewTableDeclarationOpenPageAction")); + } + } + */ + + t.actions.add(s.equivalent("ViewTableCreateFormBackAction")); + t.actions.add(s.equivalent("ViewTableCreateFormCreateAction")); + + log.debug("Create ViewTableCreateFormPageDefinition: " + t.name); +} + +@greedy +@lazy +rule ViewTableCreateFormCreateAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableCreateFormCreateAction"); + t.name = s.name + "::Create"; + t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerCreateActionDefinition"); + + log.debug("ViewTableCreateFormCreateAction: " + t.name); +} + +@greedy +@lazy +rule ViewTableCreateFormBackAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableCreateFormBackAction"); + t.name = s.name + "::Back"; + t.actionDefinition = s.getCreateFormModifier().form.equivalent("FormPageContainerBackActionDefinition"); + + log.debug("ViewTableCreateFormBackAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclarationViewPage.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclarationViewPage.etl new file mode 100644 index 00000000..99749a25 --- /dev/null +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTableDeclarationViewPage.etl @@ -0,0 +1,236 @@ +rule ViewTableViewPageDefinition + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::PageDefinition { + guard: rootMenu.containsVisualElement(s) and s.getUpdateViewModifier().isDefined() + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableViewPageDefinition"); + t.name = s.getFqName() + "::ViewPage"; + t.container = s.getUpdateViewModifier().view.equivalent("ViewPageContainer"); + + rootMenu.equivalent("Application").pages.add(t); + + t.dataElement = s.transferRelation.target.equivalent("RelationType"); + + /* + log.info("==================="); + log.info(t.name + ":"); + log.info(relations.collect(r | r.name).concat(", ")); + log.info("==================="); + */ + + for (link in s.getUpdateViewModifier().view.getOwnLinks()) { + var lRelation = link.transferRelation.target; + + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenPageAction", s.getId())); + if (lRelation.isRefreshAllowed() and not lRelation.isEager()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationRefreshAction", s.getId())); + } + if (link.getCreateFormModifier().isDefined()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenFormAction", s.getId())); + } + if (lRelation.isDeleteAllowed()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationRowDeleteAction", s.getId())); + } + if (link.getSelectorTableModifier().isDefined()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationOpenSetSelectorDialogAction", s.getId())); + } + if (link.getSelectorTableModifier().isDefined()) { + t.actions.add(link.equivalentDiscriminated("ViewLinkDeclarationUnsetAction", s.getId())); + } + } + + for (table in s.getUpdateViewModifier().view.getOwnTables()) { + var tRelation = table.transferRelation.target; + + if (table.getUpdateViewModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenPageAction", s.getId())); + } + if (tRelation.isFilterSupported()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationFilterAction", s.getId())); + } + if (tRelation.isRefreshAllowed()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationRefreshAction", s.getId())); + } + if (table.getCreateFormModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenCreateAction", s.getId())); + } + if (tRelation.isDeleteAllowed()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationRowDeleteAction", s.getId())); + } + if (table.getSelectorTableModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationOpenAddSelectorAction", s.getId())); + } + if (table.getSelectorTableModifier().isDefined()) { + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationClearAction", s.getId())); + t.actions.add(table.equivalentDiscriminated("ViewTableDeclarationBulkRemoveAction", s.getId())); + } + } + + t.actions.add(s.equivalent("ViewTableViewPageDefinitionBackAction")); + if (s.transferRelation.target.isRefreshAllowed()) { + t.actions.add(s.equivalent("ViewTableViewPageDefinitionRefreshAction")); + } + if (s.transferRelation.target.isUpdateAllowed()) { + t.actions.add(s.equivalent("ViewTableViewPageDefinitionUpdateAction")); + } + if (s.transferRelation.target.isDeleteAllowed()) { + t.actions.add(s.equivalent("ViewTableViewPageDefinitionDeleteAction")); + } + + log.debug("Create ViewTableViewPageDefinition: " + t.name); +} + +@lazy +@greedy +rule ViewTableViewPageDefinitionRefreshAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + guard: rootMenu.containsVisualElement(s) + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableViewPageDefinitionRefreshAction"); + t.name = s.name + "::Refresh"; + t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerRefreshActionDefinition"); + + log.debug("ViewTableViewPageDefinitionRefreshAction: " + t.name); +} + +@lazy +@greedy +rule ViewTableViewPageDefinitionBackAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + guard: rootMenu.containsVisualElement(s) + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableViewPageDefinitionBackAction"); + t.name = s.name + "::Back"; + t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerBackActionDefinition"); + + log.debug("ViewTableViewPageDefinitionBackAction: " + t.name); +} + +@lazy +@greedy +rule ViewTableViewPageDefinitionUpdateAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableViewPageDefinitionUpdateAction"); + t.name = s.name + "::Update"; + t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerUpdateActionDefinition"); + + log.debug("ViewTableViewPageDefinitionUpdateAction: " + t.name); +} + +@lazy +@greedy +rule ViewTableViewPageDefinitionDeleteAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableViewPageDefinitionDeleteAction"); + t.name = s.name + "::Delete"; + t.actionDefinition = s.getUpdateViewModifier().view.equivalent("ViewPageContainerDeleteActionDefinition"); + + log.debug("ViewTableViewPageDefinitionDeleteAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationFilterAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationFilterAction"); + t.name = s.name + "::Filter"; + t.actionDefinition = s.equivalent("ViewTableDeclarationFilterActionDefinition"); + + log.debug("ViewTableDeclarationFilterAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationRefreshAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRefreshAction"); + t.name = s.name + "::Refresh"; + t.actionDefinition = s.equivalent("ViewTableDeclarationRefreshActionDefinition"); + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewTableDeclarationRefreshAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationOpenCreateAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenCreateAction"); + t.name = s.name + "::OpenCreate"; + t.actionDefinition = s.equivalent("ViewTableDeclarationOpenCreateActionDefinition"); + t.targetPageDefinition = s.equivalent("ViewTableCreateFormPageDefinition"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewTableDeclarationOpenCreateAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationOpenPageAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + var row = s.referenceType; + + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenPageAction"); + t.name = s.name + "::OpenPage"; + t.actionDefinition = s.equivalent("ViewTableDeclarationOpenPageActionDefinition"); + t.targetPageDefinition = s.equivalent("ViewTableViewPageDefinition"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewTableDeclarationOpenPageAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationRowDeleteAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationRowDeleteAction"); + t.name = s.name + "::RowDelete"; + t.actionDefinition = s.equivalent("ViewTableDeclarationRowDeleteActionDefinition"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewTableDeclarationRowDeleteAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationOpenAddSelectorAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationOpenAddSelectorAction"); + t.name = s.name + "::OpenAddSelector"; + t.actionDefinition = s.equivalent("ViewTableDeclarationOpenAddSelectorActionDefinition"); + t.targetPageDefinition = s.equivalent("ViewTableDeclarationAddSelectorPageDefinition"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewTableDeclarationOpenAddSelectorAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationBulkRemoveAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationBulkRemoveAction"); + t.name = s.name + "::BulkRemove"; + t.actionDefinition = s.equivalent("ViewTableDeclarationBulkRemoveActionDefinition"); + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewTableDeclarationBulkRemoveAction: " + t.name); +} + +@lazy +rule ViewTableDeclarationClearAction + transform s: JSL!UIViewTableDeclaration + to t: UI!ui::Action { + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/ViewTableDeclarationClearAction"); + t.name = s.name + "::Clear"; + t.actionDefinition = s.equivalent("ViewTableDeclarationClearActionDefinition"); + t.ownerDataElement = s.transferRelation.target.equivalent("RelationType"); + t.targetDataElement = s.transferRelation.target.equivalent("RelationType"); + + log.debug("ViewTableDeclarationClearAction: " + t.name); +} diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTabsDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTabsDeclaration.etl index 441b10af..3f96aeb3 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTabsDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewTabsDeclaration.etl @@ -1,12 +1,11 @@ -/* rule TabBarVisualElement - transform s: JSL!ViewTabsDeclaration + transform s: JSL!UIViewTabsDeclaration to t: UI!ui::TabController { - guard: s.getTransferObjectType().isGenerated() + guard: rootMenu.containsVisualElement(s) - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/TabBarVisualElement"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TabBarVisualElement"); t.name = s.name; - t.~pos = s.~pos; + t.~pos = s.getPos(); t.col = s.getWidth().isDefined() ? s.getWidth().value.asReal() : 12d; t.label = s.getLabelWithNameFallback(); if (s.getIconModifier().isDefined()) { @@ -25,26 +24,26 @@ rule TabBarVisualElement log.debug("TabBarVisualElement: " + t.name); } -rule GroupTab - transform s: JSL!ViewGroupDeclaration +@greedy +rule SubTab + transform s: JSL!UIViewTabsDeclaration to t: UI!ui::Tab { - guard: s.eContainer.isKindOf(JSL!ViewTabsDeclaration) and s.getTransferObjectType().isGenerated() + guard: s.eContainer.isKindOf(JSL!UIViewTabsDeclaration) and rootMenu.containsVisualElement(s) s.eContainer.equivalent("TabBarVisualElement").tabs.add(t); - t.element = s.equivalent("GroupVisualElement"); + t.element = s.equivalent("TabBarVisualElement"); t.name = t.element.name; - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/GroupTab"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/SubTab"); - log.debug("GroupTab: " + t.name); + log.debug("SubTab: " + t.name); } @lazy @greedy rule TabsIcon - transform s: JSL!ViewTabsDeclaration + transform s: JSL!UIViewTabsDeclaration to t: UI!ui::Icon { t.iconName = s.getIconModifier().value.value; t.name = s.name + "TabsIcon"; - t.setId(actorDeclaration.name + "/(jsl/" + s.getId() + ")/TabsIcon"); + t.setId(rootMenu.name + "/(jsl/" + s.getId() + ")/TabsIcon"); } -*/ diff --git a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewWidgetDeclaration.etl b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewWidgetDeclaration.etl index 7c56cd1c..2952258c 100644 --- a/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewWidgetDeclaration.etl +++ b/judo-tatami-jsl-jsl2ui/src/main/epsilon/transformations/ui/modules/view/viewWidgetDeclaration.etl @@ -10,12 +10,19 @@ rule AbstractViewWidgetDeclaration t.icon = s.equivalent("ViewWidgetIcon"); } t.attributeType = s.getTransferFieldDeclarationEquivalent(); + t.isReadOnly = s.bind.isUndefined(); + /* if (s.eContainer.isKindOf(JSL!UIViewDeclaration)) { t.~pos = s.eContainer.members.indexOf(s); + } else if (s.eContainer.isKindOf(JSL!UIViewGroupDeclaration)) { + t.~pos = s.eContainer.members.indexOf(s); + } else if (s.eContainer.isKindOf(JSL!UIViewTabsDeclaration)) { + t.~pos = s.eContainer.panels.indexOf(s); } else { t.~pos = s.~pos.isDefined() ? s.~pos : 0; } - + */ + t.~pos = s.getPos(); } @lazy @@ -118,7 +125,7 @@ rule EnumerationTypeRadio to t: UI!ui::EnumerationRadio extends AbstractViewWidgetDeclaration { guard: s.enumWidget == ESM!esm::ui::EnumWidget#RADIO - and s.getTransferObjectType().isGenerated() + and rootMenu.containsVisualElement(s) and not s.dataFeature.getMember().isQuery and s.dataFeature.getMember().getDataType().isTypeOf(ESM!esm::type::EnumerationType) diff --git a/judo-tatami-jsl-jsl2ui/src/test/java/hu/blackbelt/judo/tatami/jsl/jsl2ui/application/JslModel2UiApplicationTest.java b/judo-tatami-jsl-jsl2ui/src/test/java/hu/blackbelt/judo/tatami/jsl/jsl2ui/application/JslModel2UiApplicationTest.java index 80cbf854..a97309df 100644 --- a/judo-tatami-jsl-jsl2ui/src/test/java/hu/blackbelt/judo/tatami/jsl/jsl2ui/application/JslModel2UiApplicationTest.java +++ b/judo-tatami-jsl-jsl2ui/src/test/java/hu/blackbelt/judo/tatami/jsl/jsl2ui/application/JslModel2UiApplicationTest.java @@ -47,416 +47,443 @@ static void prepareTestFolders() throws IOException { } } -// @Test -// void testActors() throws Exception { -// jslModel = JslParser.getModelFromStrings("ApplicationTestModel", List.of(""" -// model ApplicationTestModel; -// -// actor AppActor human; -// """)); -// -// transform(); -// -// List apps = uiModelWrapper.getStreamOfUiApplication().toList(); -// -// assertEquals(1, apps.size()); -// -// Application app1 = apps.get(0); -// -// assertEquals("AppActor::Application", app1.getName()); -// assertEquals("ApplicationTestModel", app1.getModelName()); -// assertEquals("judo-color-logo.png", app1.getLogo()); -// assertEquals("en-US", app1.getDefaultLanguage()); -// -// assertNotNull(app1.getActor()); -// -// ClassType actor = app1.getActor(); -// -// assertEquals("ApplicationTestModel::AppActor::ClassType", actor.getName()); -// assertEquals("AppActor", actor.getSimpleName()); -// assertTrue(actor.isIsActor()); -// -// assertNotNull(app1.getTheme()); -// -// Theme theme = app1.getTheme(); -// -// assertEquals("#3C4166FF", theme.getPrimaryColor()); -// assertEquals("#E7501DFF", theme.getSecondaryColor()); -// assertEquals("#17191DFF", theme.getTextPrimaryColor()); -// assertEquals("#434448FF", theme.getTextSecondaryColor()); -// assertEquals("#FAFAFAFF", theme.getBackgroundColor()); -// assertEquals("#8C8C8C", theme.getSubtitleColor()); -// } -// -// @Test -// void testMenu() throws Exception { -// jslModel = JslParser.getModelFromStrings("MenuTestModel", List.of(""" -// model MenuTestModel; -// -// import judo::types; -// -// entity User { -// identifier String userName required; -// } -// -// view UserListView { -// table UserRow[] users <= User.all(); -// } -// -// row UserRow(User user) { -// field String userName <= user.userName label:"Username"; -// } -// -// entity Product { -// identifier String name required; -// field Integer price required; -// } -// -// view ProductListView { -// table ProductRow[] products <= Product.all(); -// } -// -// row ProductRow(Product product) { -// field String name <= product.name label:"Name"; -// field String price <= product.price.asString() + " HUF" label:"Price"; -// } -// -// actor MenuActor human { -// group first label:"Group1" { -// group second label:"Group2" { -// link ProductListView products label:"Products" icon:"close"; -// } -// link ProductListView products2 label:"Products2"; -// } -// link UserListView users label:"Users" icon:"account-multiple"; -// } -// """)); -// -// transform(); -// -// List apps = uiModelWrapper.getStreamOfUiApplication().toList(); -// -// assertEquals(1, apps.size()); -// -// Application app1 = apps.get(0); -// -// NavigationController navigationController = app1.getNavigationController(); -// -// assertNotNull(navigationController); -// -// List firstLevelMenus = navigationController.getItems(); -// -// assertEquals(2, firstLevelMenus.size()); -// -// NavigationItem first1 = firstLevelMenus.get(0); -// NavigationItem first2 = firstLevelMenus.get(1); -// -// assertEquals("MenuTestModel::MenuActor::MenuItemGroup::first", first1.getName()); -// assertEquals("Group1", first1.getLabel()); -// assertEquals("MenuTestModel::MenuActor::users", first2.getName()); -// assertEquals("Users", first2.getLabel()); -// -// List secondLevelMenus = first1.getItems(); -// -// assertEquals(2, secondLevelMenus.size()); -// -// NavigationItem second1 = secondLevelMenus.get(0); -// NavigationItem second2 = secondLevelMenus.get(1); -// -// assertEquals("MenuTestModel::MenuActor::MenuItemGroup::first::MenuItemGroup::second", second1.getName()); -// assertEquals("Group2", second1.getLabel()); -// assertEquals("MenuTestModel::MenuActor::products2", second2.getName()); -// assertEquals("Products2", second2.getLabel()); -// -// List thirdLevelMenus = second1.getItems(); -// -// assertEquals(1, thirdLevelMenus.size()); -// -// NavigationItem third1 = thirdLevelMenus.get(0); -// -// assertEquals("MenuTestModel::MenuActor::products", third1.getName()); -// assertEquals("Products", third1.getLabel()); -// assertEquals("close", third1.getIcon().getIconName()); -// } -// -// @Test -// void testMultipleActors() throws Exception { -// jslModel = JslParser.getModelFromStrings("MultipleActorsTestModel", List.of(""" -// model MultipleActorsTestModel; -// -// import judo::types; -// -// entity User { -// identifier String userName required; -// } -// -// entity User2 { -// identifier String userName2 required; -// } -// -// entity Product { -// identifier String name required; -// field Integer price required; -// } -// -// entity Product2 { -// identifier String name2 required; -// field Integer price2 required; -// } -// -// view ProductListView { -// table ProductRow[] productsOnList <= Product.all(); -// } -// -// view ProductListView2 { -// table ProductRow2[] products2OnList <= Product2.all(); -// } -// -// view ProductDetailView(Product product) { -// field String name <= product.name; -// field Integer priceNumber <= product.price; -// field String price <= product.price.asString() + " HUF"; -// } -// -// view ProductDetailView2(Product2 product2) { -// field String name2 <= product2.name2; -// field Integer priceNumber2 <= product2.price2; -// field String price2 <= product2.price2.asString() + " HUF"; -// } -// -// row ProductRow(Product product) { -// link ProductDetailView detail <= product eager detail; -// field String name <= product.name label:"Name"; -// field String price <= product.price.asString() + " HUF" label:"Price"; -// } -// -// row ProductRow2(Product2 product2) { -// link ProductDetailView2 detail2 <= product2 eager detail; -// field String name2 <= product2.name2 label:"Name 2"; -// field String price2 <= product2.price2.asString() + " HUF" label:"Price 2"; -// } -// -// actor Actor1 human { -// group first label:"Group1" { -// link ProductListView products1 label:"Products1"; -// } -// link ProductListView allProducts label:"All Products" icon:"tools"; -// } -// -// actor Actor2 human { -// group first label:"Group2" { -// link ProductListView2 products2 label:"Products2"; -// } -// link ProductListView2 allProducts2 label:"All Products 2" icon:"tools"; -// } -// """)); -// -// transform(); -// -// List apps = uiModelWrapper.getStreamOfUiApplication().toList(); -// -// // Apps -// -// assertEquals(2, apps.size()); -// -// Application app1 = apps.get(0); -// Application app2 = apps.get(1); -// -// assertEquals("Actor1::Application", app1.getName()); -// assertEquals("MultipleActorsTestModel", app1.getModelName()); -// assertEquals("judo-color-logo.png", app1.getLogo()); -// assertEquals("en-US", app1.getDefaultLanguage()); -// -// assertNotNull(app1.getActor()); -// -// ClassType actor = app1.getActor(); -// -// assertEquals("MultipleActorsTestModel::Actor1::ClassType", actor.getName()); -// assertEquals("Actor1", actor.getSimpleName()); -// assertTrue(actor.isIsActor()); -// -// assertEquals("Actor1::Application", app1.getName()); -// assertEquals("MultipleActorsTestModel", app1.getModelName()); -// assertEquals("judo-color-logo.png", app1.getLogo()); -// assertEquals("en-US", app1.getDefaultLanguage()); -// -// assertNotNull(app2.getActor()); -// -// ClassType actor2 = app2.getActor(); -// -// assertEquals("MultipleActorsTestModel::Actor2::ClassType", actor2.getName()); -// assertEquals("Actor2", actor2.getSimpleName()); -// assertTrue(actor2.isIsActor()); -// -// assertEquals("Actor2::Application", app2.getName()); -// assertEquals("MultipleActorsTestModel", app2.getModelName()); -// assertEquals("judo-color-logo.png", app2.getLogo()); -// assertEquals("en-US", app2.getDefaultLanguage()); -// -// // Menus -// -// NavigationController navigationController = app1.getNavigationController(); -// assertNotNull(navigationController); -// -// List firstLevelMenus = navigationController.getItems(); -// -// NavigationItem first1 = firstLevelMenus.get(0); -// NavigationItem first2 = firstLevelMenus.get(1); -// -// assertEquals("MultipleActorsTestModel::Actor1::MenuItemGroup::first", first1.getName()); -// assertEquals("Group1", first1.getLabel()); -// assertEquals("MultipleActorsTestModel::Actor1::allProducts", first2.getName()); -// assertEquals("All Products", first2.getLabel()); -// -// NavigationController navigationController2 = app2.getNavigationController(); -// assertNotNull(navigationController2); -// -// List firstLevelMenus2 = navigationController2.getItems(); -// -// NavigationItem first21 = firstLevelMenus2.get(0); -// NavigationItem first22 = firstLevelMenus2.get(1); -// -// assertEquals("MultipleActorsTestModel::Actor2::MenuItemGroup::first", first21.getName()); -// assertEquals("Group2", first21.getLabel()); -// assertEquals("MultipleActorsTestModel::Actor2::allProducts2", first22.getName()); -// assertEquals("All Products 2", first22.getLabel()); -// -// // Data Elements -// -// List classTypes = app1.getClassTypes(); -// List relationTypes = app1.getRelationTypes(); -// -// assertEquals(4, classTypes.size()); -// assertEquals(4, relationTypes.size()); -// -// Set class1Names = classTypes.stream().map(c -> c.getName()).collect(Collectors.toSet()); -// Set relations1Names = relationTypes.stream().map(c -> c.getFQName()).collect(Collectors.toSet()); -// -// assertEquals(Set.of( -// "MultipleActorsTestModel::Actor1::ClassType", -// "MultipleActorsTestModel::ProductDetailView::ClassType", -// "MultipleActorsTestModel::ProductListView::ClassType", -// "MultipleActorsTestModel::ProductRow::ClassType" -// ), class1Names); -// -// assertEquals(Set.of( -// "Actor1::Application::MultipleActorsTestModel::Actor1::ClassType::products1", -// "Actor1::Application::MultipleActorsTestModel::Actor1::ClassType::allProducts", -// "Actor1::Application::MultipleActorsTestModel::ProductListView::ClassType::productsOnList", -// "Actor1::Application::MultipleActorsTestModel::ProductRow::ClassType::detail" -// ), relations1Names); -// -// List dataTypes1 = app1.getDataTypes(); -// -// Set dataTypes1Names = dataTypes1.stream().map(c -> c.getName()).collect(Collectors.toSet()); -// -// assertEquals(Set.of( -// "Integer", -// "String" -// ), dataTypes1Names); -// assertTrue(getXMIID(dataTypes1.get(0)).contains("judo::types")); -// assertTrue(getXMIID(dataTypes1.get(1)).contains("judo::types")); -// -// List classTypes2 = app2.getClassTypes(); -// List relationsTypes2 = app2.getRelationTypes(); -// -// assertEquals(4, classTypes2.size()); -// assertEquals(4, relationsTypes2.size()); -// -// Set class2Names = classTypes2.stream().map(c -> c.getName()).collect(Collectors.toSet()); -// Set relations2Names = relationsTypes2.stream().map(c -> c.getFQName()).collect(Collectors.toSet()); -// -// assertEquals(Set.of( -// "MultipleActorsTestModel::Actor2::ClassType", -// "MultipleActorsTestModel::ProductDetailView2::ClassType", -// "MultipleActorsTestModel::ProductListView2::ClassType", -// "MultipleActorsTestModel::ProductRow2::ClassType" -// ), class2Names); -// -// assertEquals(Set.of( -// "Actor2::Application::MultipleActorsTestModel::Actor2::ClassType::products2", -// "Actor2::Application::MultipleActorsTestModel::Actor2::ClassType::allProducts2", -// "Actor2::Application::MultipleActorsTestModel::ProductListView2::ClassType::products2OnList", -// "Actor2::Application::MultipleActorsTestModel::ProductRow2::ClassType::detail2" -// ), relations2Names); -// -// // Pages -// -// List pages = app1.getPages(); -// -// assertEquals(Set.of( -// "MultipleActorsTestModel::Actor1::products1::View::PageDefinition", -// "MultipleActorsTestModel::Actor1::allProducts::View::PageDefinition", -// "MultipleActorsTestModel::ProductRow::detail::View::PageDefinition", -// "MultipleActorsTestModel::Actor1::DashboardPage" -// ), pages.stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// List pages2 = app2.getPages(); -// -// assertEquals(Set.of( -// "MultipleActorsTestModel::Actor2::products2::View::PageDefinition", -// "MultipleActorsTestModel::Actor2::allProducts2::View::PageDefinition", -// "MultipleActorsTestModel::ProductRow2::detail2::View::PageDefinition", -// "MultipleActorsTestModel::Actor2::DashboardPage" -// ), pages2.stream().map(NamedElement::getName).collect(Collectors.toSet())); -// } -// -// @Test -// void testSecurity() throws Exception { -// jslModel = JslParser.getModelFromStrings("SecurityTestModel", List.of(""" -// model SecurityTestModel; -// -// import judo::types; -// -// entity User { -// identifier String email required; -// } -// -// transfer UserTransfer maps User as u { -// field String email <= u.email bind; -// } -// -// actor Actor human realm:"COMPANY" claim:"email" identity:UserTransfer::email; -// """)); -// -// transform(); -// -// List apps = uiModelWrapper.getStreamOfUiApplication().toList(); -// -// // Apps -// -// assertEquals(1, apps.size()); -// -// // Authentication -// -// Authentication authentication = apps.get(0).getAuthentication(); -// -// assertNotNull(authentication); -// -// assertEquals("COMPANY", authentication.getRealm()); -// -// // Actor -// -// ClassType actor = apps.get(0).getActor(); -// -// assertNotNull(actor); -// assertEquals("SecurityTestModel::Actor::ClassType", actor.getName()); -// assertEquals("Actor", actor.getSimpleName()); -// -// // Principal -// -// ClassType principal = apps.get(0).getPrincipal(); -// -// assertNotNull(principal); -// assertEquals("SecurityTestModel::UserTransfer::ClassType", principal.getName()); -// assertEquals("UserTransfer", principal.getSimpleName()); -// assertTrue(principal.isIsPrincipal()); -// -// // Claim -// -// assertEquals(1, authentication.getClaims().size()); -// assertEquals("UNDEFINED", authentication.getClaims().get(0).getType().getName()); -// assertEquals(principal.getAttributes().stream().filter(a -> a.getName().equals("email")).findFirst().orElse(null), authentication.getClaims().get(0).getAttributeType()); -// -// } + @Test + void testActors() throws Exception { + jslModel = JslParser.getModelFromStrings("ApplicationTestModel", List.of(""" + model ApplicationTestModel; + + actor AppActor; + + menu AppMenu(AppActor a) { + } + """)); + + transform(); + + List apps = uiModelWrapper.getStreamOfUiApplication().toList(); + + assertEquals(1, apps.size()); + + Application app1 = apps.get(0); + + assertEquals("AppActor", app1.getName()); + assertEquals("ApplicationTestModel", app1.getModelName()); + assertEquals("judo-color-logo.png", app1.getLogo()); + assertEquals("en-US", app1.getDefaultLanguage()); + + assertNotNull(app1.getActor()); + + ClassType actor = app1.getActor(); + + assertEquals("ApplicationTestModel::AppActor", actor.getName()); + assertEquals("AppActor", actor.getSimpleName()); + assertTrue(actor.isIsActor()); + + assertNotNull(app1.getTheme()); + + Theme theme = app1.getTheme(); + + assertEquals("#3C4166FF", theme.getPrimaryColor()); + assertEquals("#E7501DFF", theme.getSecondaryColor()); + assertEquals("#17191DFF", theme.getTextPrimaryColor()); + assertEquals("#434448FF", theme.getTextSecondaryColor()); + assertEquals("#FAFAFAFF", theme.getBackgroundColor()); + assertEquals("#8C8C8C", theme.getSubtitleColor()); + } + + @Test + void testMenu() throws Exception { + jslModel = JslParser.getModelFromStrings("MenuTestModel", List.of(""" + model MenuTestModel; + + import judo::types; + + entity User { + identifier String userName required; + } + + entity Product { + identifier String name required; + field Integer price required; + } + + transfer UserTransfer(User u) { + field String userName <= u.userName required; + } + + transfer ProductTransfer(Product p) { + field String name <= p.name required; + field String price <= p.price.asString() + " HUF"; + } + + table UsersTable(UserTransfer u) { + column String userName <= u.userName label:"Username"; + } + + table ProductsTable(ProductTransfer p) { + column String name <= p.name label:"Name"; + column String price <= p.price label:"Price"; + } + + actor Actor { + access ProductTransfer[] products <= Product.all(); + access ProductTransfer[] products2 <= Product.all(); + access UserTransfer[] users <= User.all(); + } + + menu MenuActor(Actor usr) { + group first label:"Group1" { + group second label:"Group2" { + table ProductsTable products <= usr.products label:"Products" icon:"close"; + } + table ProductsTable products2 <= usr.products2 label:"Products2"; + } + table UsersTable users <= usr.users label:"Users" icon:"account-multiple"; + } + """)); + + transform(); + + List apps = uiModelWrapper.getStreamOfUiApplication().toList(); + + assertEquals(1, apps.size()); + + Application app1 = apps.get(0); + + NavigationController navigationController = app1.getNavigationController(); + + assertNotNull(navigationController); + + List firstLevelMenus = navigationController.getItems(); + + assertEquals(2, firstLevelMenus.size()); + + NavigationItem first1 = firstLevelMenus.get(0); + NavigationItem first2 = firstLevelMenus.get(1); + + assertEquals("MenuTestModel::MenuActor::first", first1.getName()); + assertEquals("Group1", first1.getLabel()); + assertEquals("MenuTestModel::MenuActor::users", first2.getName()); + assertEquals("Users", first2.getLabel()); + + List secondLevelMenus = first1.getItems(); + + assertEquals(2, secondLevelMenus.size()); + + NavigationItem second1 = secondLevelMenus.get(0); + NavigationItem second2 = secondLevelMenus.get(1); + + assertEquals("MenuTestModel::MenuActor::first::second", second1.getName()); + assertEquals("Group2", second1.getLabel()); + assertEquals("MenuTestModel::MenuActor::first::products2", second2.getName()); + assertEquals("Products2", second2.getLabel()); + + List thirdLevelMenus = second1.getItems(); + + assertEquals(1, thirdLevelMenus.size()); + + NavigationItem third1 = thirdLevelMenus.get(0); + + assertEquals("MenuTestModel::MenuActor::first::second::products", third1.getName()); + assertEquals("Products", third1.getLabel()); + assertEquals("close", third1.getIcon().getIconName()); + } + + @Test + void testMultipleActors() throws Exception { + jslModel = JslParser.getModelFromStrings("MultipleActorsTestModel", List.of(""" + model MultipleActorsTestModel; + + import judo::types; + + entity User { + identifier String userName required; + } + + entity User2 { + identifier String userName2 required; + } + + entity Product { + identifier String name required; + field Integer price required; + } + + entity Product2 { + identifier String name2 required; + field Integer price2 required; + } + + transfer UserTransfer(User u) { + field String userName <= u.userName; + } + + transfer User2Transfer(User2 u) { + field String userName2 <= u.userName2; + } + + transfer ProductTransfer(Product p) { + field String name required; + field Integer priceOriginal <= p.price; + field String price <= p.price.asString() + " HUF"; + + event update onUpdate; + } + + transfer Product2Transfer(Product2 p) { + field String name2 required; + field Integer price2Original <= p.price2; + field String price2 <= p.price2.asString() + " HUF"; + + event update onUpdate; + } + + view ProductView(ProductTransfer product) { + widget String name <= product.name; + widget String price <= product.price; + } + + view Product2View(Product2Transfer product2) { + widget String name2 <= product2.name2; + widget String price2 <= product2.price2; + } + + table ProductsTable(ProductTransfer product) { + column String name <= product.name label:"Name"; + column String price <= product.price label:"Price"; + } + + table ProductsTable2(Product2Transfer product2) { + column String name2 <= product2.name2 label:"Name 2"; + column String price2 <= product2.price2 label:"Price 2"; + } + + actor Actor1 { + access ProductTransfer[] products <= Product.all() update; + } + + actor Actor2 { + access Product2Transfer[] products2 <= Product2.all() update; + } + + menu App1(Actor1 a) { + group first label:"Group1" { + table ProductsTable products1 <= a.products label:"Products1" view:ProductView; + } + table ProductsTable allProducts <= a.products label:"All Products" icon:"tools" view:ProductView; + } + + menu App2(Actor2 a) { + group first label:"Group2" { + table ProductsTable2 products2 <= a.products2 label:"Products2" view:Product2View; + } + table ProductsTable2 allProducts2 <= a.products2 label:"All Products 2" icon:"tools" view:Product2View; + } + """)); + + transform(); + + List apps = uiModelWrapper.getStreamOfUiApplication().toList(); + + // Apps + + assertEquals(2, apps.size()); + + Application app1 = apps.get(0); + Application app2 = apps.get(1); + + assertEquals("Actor1", app1.getName()); + assertEquals("MultipleActorsTestModel", app1.getModelName()); + assertEquals("judo-color-logo.png", app1.getLogo()); + assertEquals("en-US", app1.getDefaultLanguage()); + + assertNotNull(app1.getActor()); + + ClassType actor = app1.getActor(); + + assertEquals("MultipleActorsTestModel::Actor1", actor.getName()); + assertEquals("Actor1", actor.getSimpleName()); + assertTrue(actor.isIsActor()); + + assertEquals("Actor1", app1.getName()); + assertEquals("MultipleActorsTestModel", app1.getModelName()); + assertEquals("judo-color-logo.png", app1.getLogo()); + assertEquals("en-US", app1.getDefaultLanguage()); + + assertNotNull(app2.getActor()); + + ClassType actor2 = app2.getActor(); + + assertEquals("MultipleActorsTestModel::Actor2", actor2.getName()); + assertEquals("Actor2", actor2.getSimpleName()); + assertTrue(actor2.isIsActor()); + + assertEquals("Actor2", app2.getName()); + assertEquals("MultipleActorsTestModel", app2.getModelName()); + assertEquals("judo-color-logo.png", app2.getLogo()); + assertEquals("en-US", app2.getDefaultLanguage()); + + // Menus + + NavigationController navigationController = app1.getNavigationController(); + assertNotNull(navigationController); + + List firstLevelMenus = navigationController.getItems(); + + NavigationItem first1 = firstLevelMenus.get(0); + NavigationItem first2 = firstLevelMenus.get(1); + + assertEquals("MultipleActorsTestModel::App1::first", first1.getName()); + assertEquals("Group1", first1.getLabel()); + assertEquals("MultipleActorsTestModel::App1::allProducts", first2.getName()); + assertEquals("All Products", first2.getLabel()); + + NavigationController navigationController2 = app2.getNavigationController(); + assertNotNull(navigationController2); + + List firstLevelMenus2 = navigationController2.getItems(); + + NavigationItem first21 = firstLevelMenus2.get(0); + NavigationItem first22 = firstLevelMenus2.get(1); + + assertEquals("MultipleActorsTestModel::App2::first", first21.getName()); + assertEquals("Group2", first21.getLabel()); + assertEquals("MultipleActorsTestModel::App2::allProducts2", first22.getName()); + assertEquals("All Products 2", first22.getLabel()); + + // Data Elements + + List classTypes = app1.getClassTypes(); + List relationTypes = app1.getRelationTypes(); + + assertEquals(2, classTypes.size()); + assertEquals(1, relationTypes.size()); + + Set class1Names = classTypes.stream().map(c -> c.getName()).collect(Collectors.toSet()); + Set relations1Names = relationTypes.stream().map(c -> c.getFQName()).collect(Collectors.toSet()); + + assertEquals(Set.of( + "MultipleActorsTestModel::ProductTransfer", + "MultipleActorsTestModel::Actor1" + ), class1Names); + + assertEquals(Set.of( + "Actor1::MultipleActorsTestModel::Actor1::products" + ), relations1Names); + + List dataTypes1 = app1.getDataTypes(); + + Set dataTypes1Names = dataTypes1.stream().map(c -> c.getName()).collect(Collectors.toSet()); + + assertEquals(Set.of( + "StringOperation", + "Integer", + "EnumerationOperation", + "BooleanOperation", + "String", + "NumericOperation" + ), dataTypes1Names); + + List classTypes2 = app2.getClassTypes(); + List relationsTypes2 = app2.getRelationTypes(); + + assertEquals(2, classTypes2.size()); + assertEquals(1, relationsTypes2.size()); + + Set class2Names = classTypes2.stream().map(c -> c.getName()).collect(Collectors.toSet()); + Set relations2Names = relationsTypes2.stream().map(c -> c.getFQName()).collect(Collectors.toSet()); + + assertEquals(Set.of( + "MultipleActorsTestModel::Product2Transfer", + "MultipleActorsTestModel::Actor2" + ), class2Names); + + assertEquals(Set.of( + "Actor2::MultipleActorsTestModel::Actor2::products2" + ), relations2Names); + + // Pages + + List pages = app1.getPages(); + + assertEquals(Set.of( + "MultipleActorsTestModel::App1::allProducts::AccessTablePage", + "MultipleActorsTestModel::App1::allProducts::AccessTableViewPage", + "MultipleActorsTestModel::App1::DashboardPage", + "MultipleActorsTestModel::App1::first::products1::AccessTableViewPage", + "MultipleActorsTestModel::App1::first::products1::AccessTablePage" + ), pages.stream().map(NamedElement::getName).collect(Collectors.toSet())); + + List pages2 = app2.getPages(); + + assertEquals(Set.of( + "MultipleActorsTestModel::App2::allProducts2::AccessTablePage", + "MultipleActorsTestModel::App2::allProducts2::AccessTableViewPage", + "MultipleActorsTestModel::App2::DashboardPage", + "MultipleActorsTestModel::App2::first::products2::AccessTablePage", + "MultipleActorsTestModel::App2::first::products2::AccessTableViewPage" + ), pages2.stream().map(NamedElement::getName).collect(Collectors.toSet())); + } + + @Test + void testSecurity() throws Exception { + jslModel = JslParser.getModelFromStrings("SecurityTestModel", List.of(""" + model SecurityTestModel; + + import judo::types; + + entity User { + identifier String email required; + } + + transfer UserTransfer(User u) { + field String email <=> u.email; + } + + actor Actor realm:"COMPANY" claim:"email" identity:UserTransfer::email; + + menu ActorApp(Actor usr) { + } + """)); + + transform(); + + List apps = uiModelWrapper.getStreamOfUiApplication().toList(); + + // Apps + + assertEquals(1, apps.size()); + + // Authentication + + Authentication authentication = apps.get(0).getAuthentication(); + + assertNotNull(authentication); + + assertEquals("COMPANY", authentication.getRealm()); + + // Actor + + ClassType actor = apps.get(0).getActor(); + + assertNotNull(actor); + assertEquals("SecurityTestModel::Actor", actor.getName()); + assertEquals("Actor", actor.getSimpleName()); + + // Principal + + ClassType principal = apps.get(0).getPrincipal(); + + assertNotNull(principal); + assertEquals("SecurityTestModel::UserTransfer", principal.getName()); + assertEquals("UserTransfer", principal.getSimpleName()); + assertTrue(principal.isIsPrincipal()); + + // Claim + + assertEquals(1, authentication.getClaims().size()); + assertEquals("UNDEFINED", authentication.getClaims().get(0).getType().getName()); + assertEquals(principal.getAttributes().stream().filter(a -> a.getName().equals("email")).findFirst().orElse(null), authentication.getClaims().get(0).getAttributeType()); + + } } diff --git a/judo-tatami-jsl-jsl2ui/src/test/java/hu/blackbelt/judo/tatami/jsl/jsl2ui/application/JslModel2UiCRUDTest.java b/judo-tatami-jsl-jsl2ui/src/test/java/hu/blackbelt/judo/tatami/jsl/jsl2ui/application/JslModel2UiCRUDTest.java index c44a4f2b..84c2ff09 100644 --- a/judo-tatami-jsl-jsl2ui/src/test/java/hu/blackbelt/judo/tatami/jsl/jsl2ui/application/JslModel2UiCRUDTest.java +++ b/judo-tatami-jsl-jsl2ui/src/test/java/hu/blackbelt/judo/tatami/jsl/jsl2ui/application/JslModel2UiCRUDTest.java @@ -17,7 +17,9 @@ import java.util.Set; import java.util.stream.Collectors; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + @Slf4j public class JslModel2UiCRUDTest extends AbstractTest { @@ -47,886 +49,1031 @@ private static String createModelString(String name) { entity User { identifier String email required; field Integer numeric; - - field Related related; + + relation Related related; relation Related[] relatedCollection; } - + entity Related { field String first; field Integer second; - field Jumper theJumper; + relation Jumper theJumper; relation Jumper[] theJumpersCollection; } - + entity Jumper { field String first; field String second; } - - view UserView(User u) { - field String email <= u.email label:"Email"; - group level { - link RelatedView related <= u.related eager:true icon:"related" label:"Related" width:6 create:true update:true delete:true; - table RelatedRow[] relatedCollection <= u.relatedCollection icon:"relatedCollection" label:"Related Collection"; - } - + + transfer UserTransfer(User u) { + field String email <= u.email; + relation RelatedTransfer related <= u.related choices:Related.all() eager create update delete; + relation RelatedTransfer[] relatedCollection <= u.relatedCollection create update; + + event create onCreate; event update onUpdate; event delete onDelete; } - - row RelatedRow(Related r) { - field String first <= r.first label:"First"; - field Integer second <= r.second label:"Second"; - link RelatedView detail <= r detail:true; + + transfer RelatedTransfer(Related r) { + field String first <= r.first; + field Integer second <= r.second; + relation JumperTransfer theJumper <= r.theJumper create update delete choices:Jumper.all(); + relation JumperTransfer[] theJumpersCollection <= r.theJumpersCollection create update delete choices:Jumper.all(); + + event create onCreate; + event update onUpdate; + event delete onDelete; } - - view RelatedView(Related r) { - field String first <= r.first label:"First"; - field Integer second <= r.second label:"Second"; - group g1 { - link JumperView readOnlyJumper <= r.theJumper eager:false icon:"jumping" label:"Read only Jumper"; - link JumperView myJumper <= r.theJumper eager:false icon:"jumping" label:"My Jumper" width:6 create:true update:true delete:true; - table JumperRow[] myJumpers <= r.theJumpersCollection eager:false icon:"jumping-all" label:"My Jumpers" width:6 create:true update:true delete:true; - } - - event create onCreate(RelatedForm form); + + transfer JumperTransfer(Jumper j) { + field String first <=j.first; + field String second <= j.second; + + event create onCreate; event update onUpdate; event delete onDelete; } - - view RelatedForm(Related r) { + + view UserView(UserTransfer u) { + widget String email <= u.email label:"Email"; + group level { + link RelatedView related <= u.related icon:"related" label:"Related" width:6 form:RelatedForm selector:RelatedTable; + table RelatedTable relatedCollection <= u.relatedCollection icon:"relatedCollection" label:"Related Collection" view:RelatedView; + } + } + + table RelatedTable(RelatedTransfer r) { + column String first <= r.first label:"First"; + column Integer second <= r.second label:"Second"; + } + + view RelatedView(RelatedTransfer r) { + widget String first <= r.first label:"First"; + widget Integer second <= r.second label:"Second"; + group g1 { + link JumperView readOnlyJumper <= r.theJumper icon:"jumping" label:"Read only Jumper" form:JumperForm view:JumperView selector:JumperTable; + link JumperView myJumper <= r.theJumper icon:"jumping" label:"My Jumper" width:6 form:JumperForm selector:JumperTable; + table JumperTable myJumpers <= r.theJumpersCollection icon:"jumping-all" label:"My Jumpers" width:6 view:JumperView form:JumperForm selector:JumperTable; + } + } + + form RelatedForm(RelatedTransfer r) { group one label:"Group 1" { - field String first <= r.first label:"First"; + widget String first <= r.first label:"First"; } } - - view JumperView(Jumper j) { - field String first <= j.first label:"First"; - - event create onCreate(JumperForm form); - event update onUpdate; - event delete onDelete; + + view JumperView(JumperTransfer j) { + widget String first <= j.first label:"First"; } - - row JumperRow(Jumper j) { - field String second <= j.second label:"Second"; - link JumperView jumperRowDetail <= j detail:true; - - event create onCreate(JumperForm form); - event update onUpdate; - event delete onDelete; + + table JumperTable(JumperTransfer j) { + column String second <= j.second label:"Second"; } - - view JumperForm(Jumper j) { + + form JumperForm(JumperTransfer j) { group one label:"Group 1" { - field String firstOnForm <= j.first label:"First on form"; + widget String firstOnForm <= j.first label:"First on form"; } } - - actor NavigationActor human { - link UserView user <= User.any() label:"User" icon:"tools" update:true delete:true; + + actor NavigationActor { + access UserTransfer user <= User.any() update delete; + } + + menu NavigationApp(NavigationActor a) { + link UserView user <= a.user label:"User" icon:"tools" view:UserView; } """.formatted(name); } -// @BeforeAll -// static void prepareTestFolders() throws IOException { -// if (!Files.exists(Paths.get(TARGET_TEST_CLASSES))) { -// Files.createDirectories(Paths.get(TARGET_TEST_CLASSES)); -// } -// } -// -// @Test -// void testSummaryCRUD() throws Exception { -// jslModel = JslParser.getModelFromStrings("SummaryCRUD", List.of(createModelString("SummaryCRUD"))); -// -// transform(); -// -// List apps = uiModelWrapper.getStreamOfUiApplication().toList(); -// -// assertEquals(1, apps.size()); -// -// Application application = apps.get(0); -// -// List relationTypes = application.getRelationTypes(); -// List classTypes = application.getClassTypes(); -// List pageContainers = application.getPageContainers(); -// List pages = application.getPages(); -// List links = application.getLinks(); -// List tables = application.getTables(); -// List allActions = application.getPages().stream().flatMap(ps -> ps.getActions().stream()).toList(); -// -// assertEquals(11, relationTypes.size()); -// assertEquals(8, classTypes.size()); -// assertEquals(11, pageContainers.size()); -// assertEquals(13, pages.size()); -// assertEquals(3, links.size()); -// assertEquals(5, tables.size()); -// assertEquals(76, allActions.size()); -// -// PageDefinition actorDashboardPage = pages.stream().filter(p -> p.getName().equals("SummaryCRUD::NavigationActor::DashboardPage")).findFirst().orElseThrow(); -// -// assertEquals(Set.of( -// "jumperRowDetail", -// "user", -// "detail", -// "myJumper", -// "myJumperForm", -// "myJumpers", -// "myJumpersForm", -// "readOnlyJumper", -// "related", -// "relatedForm", -// "relatedCollection" -// ), relationTypes.stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// assertEquals(Set.of( -// "SummaryCRUD::NavigationActor::ClassType", -// "SummaryCRUD::JumperRow::ClassType", -// "SummaryCRUD::RelatedForm::ClassType", -// "SummaryCRUD::RelatedRow::ClassType", -// "SummaryCRUD::UserView::ClassType", -// "SummaryCRUD::JumperView::ClassType", -// "SummaryCRUD::RelatedView::ClassType", -// "SummaryCRUD::JumperForm::ClassType" -// ), classTypes.stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// assertEquals(Set.of( -// "SummaryCRUD::NavigationActor::Dashboard", -// "SummaryCRUD::UserView::PageContainer", -// "SummaryCRUD::UserView::related::SetSelector::PageContainer", -// "SummaryCRUD::RelatedView::PageContainer", -// "SummaryCRUD::JumperView::PageContainer", -// "SummaryCRUD::RelatedForm::PageContainer", -// "SummaryCRUD::RelatedRow::PageContainer", -// "SummaryCRUD::JumperRow::PageContainer", -// "SummaryCRUD::JumperForm::PageContainer", -// "SummaryCRUD::RelatedView::myJumper::SetSelector::PageContainer", -// "SummaryCRUD::RelatedView::myJumpers::AddSelector::PageContainer" -// ), pageContainers.stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// assertEquals(Set.of( -// "SummaryCRUD::NavigationActor::DashboardPage", -// "SummaryCRUD::NavigationActor::user::View::PageDefinition", -// "SummaryCRUD::UserView::related::Create::PageDefinition", -// "SummaryCRUD::UserView::related::View::PageDefinition", -// "SummaryCRUD::UserView::related::SetSelector::PageDefinition", -// "SummaryCRUD::RelatedView::readOnlyJumper::View::PageDefinition", -// "SummaryCRUD::RelatedView::myJumper::View::PageDefinition", -// "SummaryCRUD::RelatedView::myJumper::Create::PageDefinition", -// "SummaryCRUD::RelatedView::myJumpers::Create::PageDefinition", -// "SummaryCRUD::JumperRow::jumperRowDetail::View::PageDefinition", -// "SummaryCRUD::RelatedRow::detail::View::PageDefinition", -// "SummaryCRUD::RelatedView::myJumper::SetSelector::PageDefinition", -// "SummaryCRUD::RelatedView::myJumpers::AddSelector::PageDefinition" -// ), pages.stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// assertEquals(Set.of( -// "myJumper", -// "readOnlyJumper", -// "related" -// ), links.stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// assertEquals(Set.of( -// "relatedCollection", -// "related::Set::Selector", -// "myJumpers", -// "myJumpers::Add::Selector", -// "myJumper::Set::Selector" -// ), tables.stream().map(NamedElement::getName).collect(Collectors.toSet())); -// } -// -// @Test -// void testAccessViewCRUD() throws Exception { -// jslModel = JslParser.getModelFromStrings("AccessViewCRUD", List.of(createModelString("AccessViewCRUD"))); -// -// transform(); -// -// List apps = uiModelWrapper.getStreamOfUiApplication().toList(); -// -// Application application = apps.get(0); -// -// List pages = application.getPages(); -// -// PageDefinition pageDefinition = pages.stream().filter(p -> p.getName().equals("AccessViewCRUD::NavigationActor::user::View::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition userViewRelatedViewPageDefinition = pages.stream().filter(p -> p.getName().equals("AccessViewCRUD::UserView::related::View::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition userViewRelatedCreatePageDefinition = pages.stream().filter(p -> p.getName().equals("AccessViewCRUD::UserView::related::Create::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition relatedRowDetailViewPageDefinition = pages.stream().filter(p -> p.getName().equals("AccessViewCRUD::RelatedRow::detail::View::PageDefinition")).findFirst().orElseThrow(); -// -// PageContainer pageContainer = pageDefinition.getContainer(); -// -// assertEquals(12, pageDefinition.getActions().size()); -// assertEquals(1, pageContainer.getLinks().size()); -// assertEquals(1, pageContainer.getTables().size()); -// -// assertEquals(Set.of( -// "related::OpenPage", -// "related::OpenForm", -// "related::RowDelete", -// "related::OpenSetSelector", -// "related::Unset", -// "relatedCollection::OpenPage", -// "relatedCollection::Filter", -// "relatedCollection::Refresh", -// "user::Back", -// "user::Refresh", -// "user::Update", -// "user::Delete" -// ), pageDefinition.getActions().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Action backAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("user::Back")).findFirst().orElseThrow(); -// assertTrue(backAction.getIsBackAction()); -// -// Action updateAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("user::Update")).findFirst().orElseThrow(); -// assertTrue(updateAction.getIsUpdateAction()); -// -// Action deleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("user::Delete")).findFirst().orElseThrow(); -// assertTrue(deleteAction.getIsDeleteAction()); -// -// Action relatedOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::OpenPage")).findFirst().orElseThrow(); -// assertTrue(relatedOpenPageAction.getIsOpenPageAction()); -// assertEquals(userViewRelatedViewPageDefinition, relatedOpenPageAction.getTargetPageDefinition()); -// -// Action relatedOpenFormAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::OpenForm")).findFirst().orElseThrow(); -// assertTrue(relatedOpenFormAction.getIsOpenFormAction()); -// assertEquals(userViewRelatedCreatePageDefinition, relatedOpenFormAction.getTargetPageDefinition()); -// -// Action relatedRowDeleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::RowDelete")).findFirst().orElseThrow(); -// assertTrue(relatedRowDeleteAction.getIsRowDeleteAction()); -// -// Action relatedCollectionOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("relatedCollection::OpenPage")).findFirst().orElseThrow(); -// assertTrue(relatedCollectionOpenPageAction.getIsRowOpenPageAction()); -// assertEquals(relatedRowDetailViewPageDefinition, relatedCollectionOpenPageAction.getTargetPageDefinition()); -// -// Action relatedCollectionFilterAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("relatedCollection::Filter")).findFirst().orElseThrow(); -// assertTrue(relatedCollectionFilterAction.getIsFilterAction()); -// -// Action relatedCollectionRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("relatedCollection::Refresh")).findFirst().orElseThrow(); -// assertTrue(relatedCollectionRefreshAction.getIsRefreshAction()); -// -// // - Link - related -// -// Link related = (Link) pageContainer.getLinks().stream().filter(l -> ((Link) l).getName().equals("related")).findFirst().orElseThrow(); -// assertEquals("related", related.getDataElement().getName()); -// assertEquals(Set.of( -// "related::Create::Open", -// "related::View", -// "related::Delete", -// "related::OpenSetSelector", -// "related::Unset" -// ), related.getActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button relatedCreateOpen = related.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("related::Create::Open")).findFirst().orElseThrow(); -// assertTrue(relatedCreateOpen.getActionDefinition().getIsOpenCreateFormAction()); -// assertButtonVisuals(relatedCreateOpen, "Create", "note-add", "contained"); -// assertEquals(relatedOpenFormAction.getActionDefinition(), relatedCreateOpen.getActionDefinition()); -// -// Button relatedView = related.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("related::View")).findFirst().orElseThrow(); -// assertTrue(relatedView.getActionDefinition().getIsOpenPageAction()); -// assertButtonVisuals(relatedView, "View", "eye", "contained"); -// assertEquals(relatedOpenPageAction.getActionDefinition(), relatedView.getActionDefinition()); -// assertEquals(userViewRelatedViewPageDefinition, relatedOpenPageAction.getTargetPageDefinition()); -// -// Button relatedDelete = related.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("related::Delete")).findFirst().orElseThrow(); -// assertTrue(relatedDelete.getActionDefinition().getIsRowDeleteAction()); -// assertButtonVisuals(relatedDelete, "Delete", "delete_forever", "contained"); -// assertEquals(relatedRowDeleteAction.getActionDefinition(), relatedDelete.getActionDefinition()); -// -// // - Table - relatedCollection -// -// Table relatedCollection = (Table) pageContainer.getTables().stream().filter(t -> ((Table) t).getName().equals("relatedCollection")).findFirst().orElseThrow(); -// assertEquals("relatedCollection", relatedCollection.getDataElement().getName()); -// -// assertEquals(Set.of( -// "relatedCollection::Filter", -// "relatedCollection::Refresh" -// ), relatedCollection.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button relatedCollectionFilter = relatedCollection.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("relatedCollection::Filter")).findFirst().orElseThrow(); -// assertTrue(relatedCollectionFilter.getActionDefinition().getIsFilterAction()); -// assertButtonVisuals(relatedCollectionFilter, "Filter", "filter", "text"); -// assertEquals(relatedCollectionFilterAction.getActionDefinition(), relatedCollectionFilter.getActionDefinition()); -// -// Button relatedCollectionRefresh = relatedCollection.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("relatedCollection::Refresh")).findFirst().orElseThrow(); -// assertTrue(relatedCollectionRefresh.getActionDefinition().getIsRefreshAction()); -// assertButtonVisuals(relatedCollectionRefresh, "Refresh", "refresh", "text"); -// assertEquals(relatedCollectionRefreshAction.getActionDefinition(), relatedCollectionRefresh.getActionDefinition()); -// -// assertEquals(Set.of( -// "relatedCollection::View" -// ), relatedCollection.getRowActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button relatedCollectionView = relatedCollection.getRowActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("relatedCollection::View")).findFirst().orElseThrow(); -// assertTrue(relatedCollectionView.getActionDefinition().getIsRowOpenPageAction()); -// assertButtonVisuals(relatedCollectionView, "View", "visibility", "contained"); -// assertEquals(relatedCollectionOpenPageAction.getActionDefinition(), relatedCollectionView.getActionDefinition()); -// assertEquals(userViewRelatedViewPageDefinition, relatedOpenPageAction.getTargetPageDefinition()); -// -// } -// -// @Test -// void testSingleRelationViewCRUD() throws Exception { -// jslModel = JslParser.getModelFromStrings("SingleRelationViewCRUD", List.of(createModelString("SingleRelationViewCRUD"))); -// -// transform(); -// -// List apps = uiModelWrapper.getStreamOfUiApplication().toList(); -// -// Application application = apps.get(0); -// List pages = application.getPages(); -// -// PageDefinition pageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::UserView::related::View::PageDefinition")).findFirst().orElseThrow(); -// PageContainer pageContainer = pageDefinition.getContainer(); -// -// PageDefinition readOnlyJumperViewPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::readOnlyJumper::View::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition relatedSetSelectorPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::UserView::related::SetSelector::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition myJumperViewPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::myJumper::View::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition myJumperCreatePageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::myJumper::Create::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition myJumperSetSelectorPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition jumperRowDetailViewPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::JumperRow::jumperRowDetail::View::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition myJumpersCreatePageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::myJumpers::Create::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition myJumpersAddSelectorPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::PageDefinition")).findFirst().orElseThrow(); -// PageContainer myJumpersAddSelectorPageContainer = myJumpersAddSelectorPageDefinition.getContainer(); -// PageContainer myJumperSetSelectorPageContainer = myJumperSetSelectorPageDefinition.getContainer(); -// -// assertEquals(20, pageDefinition.getActions().size()); -// assertEquals(4, myJumpersAddSelectorPageDefinition.getActions().size()); -// assertEquals(2, pageContainer.getLinks().size()); -// assertEquals(1, pageContainer.getTables().size()); -// -// assertEquals(Set.of( -// "related::Back", -// "related::Refresh", -// "related::Update", -// "related::Delete", -// "readOnlyJumper::OpenPage", -// "readOnlyJumper::Refresh", -// "myJumper::OpenPage", -// "myJumper::Refresh", -// "myJumper::OpenForm", -// "myJumper::RowDelete", -// "myJumper::OpenSetSelector", -// "myJumper::Unset", -// "myJumpers::OpenPage", -// "myJumpers::OpenCreate", -// "myJumpers::OpenAddSelector", -// "myJumpers::Filter", -// "myJumpers::Refresh", -// "myJumpers::Clear", -// "myJumpers::BulkRemove", -// "myJumpers::RowDelete" -// ), pageDefinition.getActions().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Action BackAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::Back")).findFirst().orElseThrow(); -// assertTrue(BackAction.getIsBackAction()); -// -// Action refreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::Refresh")).findFirst().orElseThrow(); -// assertTrue(refreshAction.getIsRefreshAction()); -// -// Action updateAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::Update")).findFirst().orElseThrow(); -// assertTrue(updateAction.getIsUpdateAction()); -// -// Action deleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::Delete")).findFirst().orElseThrow(); -// assertTrue(deleteAction.getIsDeleteAction()); -// -// Action readOnlyJumperOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("readOnlyJumper::OpenPage")).findFirst().orElseThrow(); -// assertTrue(readOnlyJumperOpenPageAction.getIsOpenPageAction()); -// assertEquals(readOnlyJumperViewPageDefinition, readOnlyJumperOpenPageAction.getTargetPageDefinition()); -// -// Action readOnlyJumperRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("readOnlyJumper::Refresh")).findFirst().orElseThrow(); -// assertTrue(readOnlyJumperRefreshAction.getIsRefreshAction()); -// -// Action myJumperOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::OpenPage")).findFirst().orElseThrow(); -// assertTrue(myJumperOpenPageAction.getIsOpenPageAction()); -// assertEquals(myJumperViewPageDefinition, myJumperOpenPageAction.getTargetPageDefinition()); -// -// Action myJumperOpenFormAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::OpenForm")).findFirst().orElseThrow(); -// assertTrue(myJumperOpenFormAction.getIsOpenFormAction()); -// assertEquals(myJumperCreatePageDefinition, myJumperOpenFormAction.getTargetPageDefinition()); -// -// Action myJumperRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::Refresh")).findFirst().orElseThrow(); -// assertTrue(myJumperRefreshAction.getIsRefreshAction()); -// -// Action myJumperRowDeleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::RowDelete")).findFirst().orElseThrow(); -// assertTrue(myJumperRowDeleteAction.getIsRowDeleteAction()); -// -// Action myJumperOpenSetSelectorAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::OpenSetSelector")).findFirst().orElseThrow(); -// assertTrue(myJumperOpenSetSelectorAction.isOpenSetSelectorAction()); -// assertEquals(myJumperSetSelectorPageDefinition, myJumperOpenSetSelectorAction.getTargetPageDefinition()); -// -// Action myJumperUnsetAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::Unset")).findFirst().orElseThrow(); -// assertTrue(myJumperUnsetAction.getIsUnsetAction()); -// -// Action myJumpersOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenPage")).findFirst().orElseThrow(); -// assertTrue(myJumpersOpenPageAction.getIsRowOpenPageAction()); -// assertEquals(jumperRowDetailViewPageDefinition, myJumpersOpenPageAction.getTargetPageDefinition()); -// -// Action myJumpersFilterAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::Filter")).findFirst().orElseThrow(); -// assertTrue(myJumpersFilterAction.getIsFilterAction()); -// -// Action myJumpersRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::Refresh")).findFirst().orElseThrow(); -// assertTrue(myJumpersRefreshAction.getIsRefreshAction()); -// -// Action myJumpersOpenCreateAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenCreate")).findFirst().orElseThrow(); -// assertTrue(myJumpersOpenCreateAction.isOpenCreateFormAction()); -// assertEquals(myJumpersCreatePageDefinition, myJumpersOpenCreateAction.getTargetPageDefinition()); -// -// Action myJumpersRowDeleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::RowDelete")).findFirst().orElseThrow(); -// assertTrue(myJumpersRowDeleteAction.getIsRowDeleteAction()); -// -// Action myJumpersClearAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::Clear")).findFirst().orElseThrow(); -// assertTrue(myJumpersClearAction.getIsClearAction()); -// -// Action myJumpersBulkRemoveAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::BulkRemove")).findFirst().orElseThrow(); -// assertTrue(myJumpersBulkRemoveAction.getIsBulkRemoveAction()); -// -// Action myJumpersOpenAddSelectorAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenAddSelector")).findFirst().orElseThrow(); -// assertTrue(myJumpersOpenAddSelectorAction.isOpenAddSelectorAction()); -// assertEquals(myJumpersAddSelectorPageDefinition, myJumpersOpenAddSelectorAction.getTargetPageDefinition()); -// -// // - link readOnlyJumper -// -// Link readOnlyJumper = (Link) pageContainer.getLinks().stream().filter(l -> ((Link) l).getName().equals("readOnlyJumper")).findFirst().orElseThrow(); -// assertEquals("readOnlyJumper", readOnlyJumper.getDataElement().getName()); -// assertEquals(Set.of( -// "readOnlyJumper::View" -// ), readOnlyJumper.getActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button readOnlyJumperView = readOnlyJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("readOnlyJumper::View")).findFirst().orElseThrow(); -// assertTrue(readOnlyJumperView.getActionDefinition().getIsOpenPageAction()); -// assertButtonVisuals(readOnlyJumperView, "View", "eye", "contained"); -// assertEquals(readOnlyJumperOpenPageAction.getActionDefinition(), readOnlyJumperView.getActionDefinition()); -// assertEquals(readOnlyJumperViewPageDefinition, readOnlyJumperOpenPageAction.getTargetPageDefinition()); -// -// // - Link - myJumper -// -// Link myJumper = (Link) pageContainer.getLinks().stream().filter(l -> ((Link) l).getName().equals("myJumper")).findFirst().orElseThrow(); -// assertEquals("myJumper", myJumper.getDataElement().getName()); -// assertEquals(Set.of( -// "myJumper::Create::Open", -// "myJumper::View", -// "myJumper::Delete", -// "myJumper::OpenSetSelector", -// "myJumper::Unset" -// ), myJumper.getActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button myJumperCreateOpen = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::Create::Open")).findFirst().orElseThrow(); -// assertTrue(myJumperCreateOpen.getActionDefinition().getIsOpenCreateFormAction()); -// assertButtonVisuals(myJumperCreateOpen, "Create", "note-add", "contained"); -// assertEquals(myJumperOpenFormAction.getActionDefinition(), myJumperCreateOpen.getActionDefinition()); -// -// Button myJumperView = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::View")).findFirst().orElseThrow(); -// assertTrue(myJumperView.getActionDefinition().getIsOpenPageAction()); -// assertButtonVisuals(myJumperView, "View", "eye", "contained"); -// assertEquals(myJumperOpenPageAction.getActionDefinition(), myJumperView.getActionDefinition()); -// assertEquals(myJumperViewPageDefinition, myJumperOpenPageAction.getTargetPageDefinition()); -// -// Button myJumperDelete = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::Delete")).findFirst().orElseThrow(); -// assertTrue(myJumperDelete.getActionDefinition().getIsRowDeleteAction()); -// assertButtonVisuals(myJumperDelete, "Delete", "delete_forever", "contained"); -// assertEquals(myJumperRowDeleteAction.getActionDefinition(), myJumperDelete.getActionDefinition()); -// -// Button myJumperOpenSetSelector = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::OpenSetSelector")).findFirst().orElseThrow(); -// assertTrue(myJumperOpenSetSelector.getActionDefinition().getIsOpenSelectorAction()); -// assertButtonVisuals(myJumperOpenSetSelector, "Set", "link", "contained"); -// assertEquals(myJumperOpenSetSelectorAction.getActionDefinition(), myJumperOpenSetSelector.getActionDefinition()); -// -// Button myJumperUnset = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::Unset")).findFirst().orElseThrow(); -// assertTrue(myJumperUnset.getActionDefinition().getIsUnsetAction()); -// assertButtonVisuals(myJumperUnset, "Unset", "link-off", "contained"); -// assertEquals(myJumperUnsetAction.getActionDefinition(), myJumperUnset.getActionDefinition()); -// -// // - Table - myJumpers -// -// Table myJumpers = (Table) pageContainer.getTables().stream().filter(t -> ((Table) t).getName().equals("myJumpers")).findFirst().orElseThrow(); -// assertEquals("myJumpers", myJumpers.getDataElement().getName()); -// -// assertEquals(Set.of( -// "myJumpers::Filter", -// "myJumpers::Refresh", -// "myJumpers::OpenCreate", -// "myJumpers::OpenAddSelector", -// "myJumpers::Clear", -// "myJumpers::BulkRemove" -// ), myJumpers.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button myJumpersFilter = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Filter")).findFirst().orElseThrow(); -// assertTrue(myJumpersFilter.getActionDefinition().getIsFilterAction()); -// assertButtonVisuals(myJumpersFilter, "Filter", "filter", "text"); -// assertEquals(myJumpersFilterAction.getActionDefinition(), myJumpersFilter.getActionDefinition()); -// -// Button myJumpersRefresh = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Refresh")).findFirst().orElseThrow(); -// assertTrue(myJumpersRefresh.getActionDefinition().getIsRefreshAction()); -// assertButtonVisuals(myJumpersRefresh, "Refresh", "refresh", "text"); -// assertEquals(myJumpersRefreshAction.getActionDefinition(), myJumpersRefresh.getActionDefinition()); -// -// Button myJumpersOpenCreate = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::OpenCreate")).findFirst().orElseThrow(); -// assertTrue(myJumpersOpenCreate.getActionDefinition().getIsOpenCreateFormAction()); -// assertButtonVisuals(myJumpersOpenCreate, "Create", "file-document-plus", "text"); -// assertEquals(myJumpersOpenCreateAction.getActionDefinition(), myJumpersOpenCreate.getActionDefinition()); -// -// Button myJumpersClear = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Clear")).findFirst().orElseThrow(); -// assertTrue(myJumpersClear.getActionDefinition().getIsClearAction()); -// assertButtonVisuals(myJumpersClear, "Clear", "link-off", "text"); -// assertEquals(myJumpersClearAction.getActionDefinition(), myJumpersClear.getActionDefinition()); -// -// Button myJumpersBulkRemove = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::BulkRemove")).findFirst().orElseThrow(); -// assertTrue(myJumpersBulkRemove.getActionDefinition().getIsBulkRemoveAction()); -// assertButtonVisuals(myJumpersBulkRemove, "Remove", "link-off", "text"); -// assertEquals(myJumpersBulkRemoveAction.getActionDefinition(), myJumpersBulkRemove.getActionDefinition()); -// -// Button myJumpersOpenAddSelector = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::OpenAddSelector")).findFirst().orElseThrow(); -// assertTrue(myJumpersOpenAddSelector.getActionDefinition().getIsOpenAddSelectorAction()); -// assertButtonVisuals(myJumpersOpenAddSelector, "Add", "attachment-plus", "text"); -// assertEquals(myJumpersOpenAddSelectorAction.getActionDefinition(), myJumpersOpenAddSelector.getActionDefinition()); -// -// assertEquals(Set.of( -// "myJumpers::View", -// "myJumpers::RowDelete" -// ), myJumpers.getRowActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button myJumpersView = myJumpers.getRowActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::View")).findFirst().orElseThrow(); -// assertTrue(myJumpersView.getActionDefinition().getIsRowOpenPageAction()); -// assertButtonVisuals(myJumpersView, "View", "visibility", "contained"); -// assertEquals(myJumpersOpenPageAction.getActionDefinition(), myJumpersView.getActionDefinition()); -// assertEquals(jumperRowDetailViewPageDefinition, myJumpersOpenPageAction.getTargetPageDefinition()); -// -// Button myJumpersRowDelete = myJumpers.getRowActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::RowDelete")).findFirst().orElseThrow(); -// assertTrue(myJumpersRowDelete.getActionDefinition().getIsRowDeleteAction()); -// assertButtonVisuals(myJumpersRowDelete, "Delete", "delete_forever", "contained"); -// assertEquals(myJumpersRowDeleteAction.getActionDefinition(), myJumpersRowDelete.getActionDefinition()); -// -// // add selector - myJumpers -// -// assertEquals(Set.of( -// "SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Add", -// "SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Table::Filter", -// "SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Table::Range", -// "SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Back" -// ), myJumpersAddSelectorPageDefinition.getActions().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Action myJumpersAddSelectorAddAction = myJumpersAddSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Add")).findFirst().orElseThrow(); -// assertTrue(myJumpersAddSelectorAddAction.getActionDefinition().getIsAddAction()); -// -// Action myJumpersAddSelectorFilterAction = myJumpersAddSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Table::Filter")).findFirst().orElseThrow(); -// assertTrue(myJumpersAddSelectorFilterAction.getActionDefinition().getIsFilterAction()); -// -// Action myJumpersAddSelectorrangeAction = myJumpersAddSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Table::Range")).findFirst().orElseThrow(); -// assertTrue(myJumpersAddSelectorrangeAction.getActionDefinition().getIsSelectorRangeAction()); -// -// Action myJumpersAddSelectorBackAction = myJumpersAddSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Back")).findFirst().orElseThrow(); -// assertTrue(myJumpersAddSelectorBackAction.getActionDefinition().getIsBackAction()); -// -// Table myJumpersAddSelector = (Table) myJumpersAddSelectorPageContainer.getTables().stream().filter(t -> ((Table) t).getName().equals("myJumpers::Add::Selector")).findFirst().orElseThrow(); -// assertEquals("SingleRelationViewCRUD::JumperRow::ClassType", myJumpersAddSelector.getDataElement().getName()); -// assertTrue(myJumpersAddSelector.isAllowSelectMultiple()); -// assertTrue(myJumpersAddSelector.isIsRelationSelectorTable()); -// assertTrue(myJumpersAddSelector.isIsSelectorTable()); -// -// assertEquals(Set.of( -// "SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Table::Filter", -// "SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Table::Refresh" -// ), myJumpersAddSelector.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button myJumpersAddSelectorFilter = myJumpersAddSelector.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("SingleRelationViewCRUD::RelatedView::myJumpers::AddSelector::Table::Filter")).findFirst().orElseThrow(); -// assertTrue(myJumpersAddSelectorFilter.getActionDefinition().getIsFilterAction()); -// assertButtonVisuals(myJumpersAddSelectorFilter, "Set Filters", "filter", "text"); -// assertEquals(myJumpersAddSelectorFilterAction.getActionDefinition(), myJumpersAddSelectorFilter.getActionDefinition()); -// -// // set selector - myJumper -// -// assertEquals(Set.of( -// "SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Table::Filter", -// "SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Table::Range", -// "SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Set", -// "SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Back" -// ), myJumperSetSelectorPageDefinition.getActions().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Action myJumperSetSelectorFilterAction = myJumperSetSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Table::Filter")).findFirst().orElseThrow(); -// assertTrue(myJumperSetSelectorFilterAction.getActionDefinition().getIsFilterAction()); -// -// Action myJumperSetSelectorrangeAction = myJumperSetSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Table::Range")).findFirst().orElseThrow(); -// assertTrue(myJumperSetSelectorrangeAction.getActionDefinition().getIsSelectorRangeAction()); -// -// Action myJumperSetSelectorSetAction = myJumperSetSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Set")).findFirst().orElseThrow(); -// assertTrue(myJumperSetSelectorSetAction.getActionDefinition().getIsSetAction()); -// -// Action myJumperSetSelectorBackAction = myJumperSetSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Back")).findFirst().orElseThrow(); -// assertTrue(myJumperSetSelectorBackAction.getActionDefinition().getIsBackAction()); -// -// Table myJumperSetSelector = (Table) myJumperSetSelectorPageContainer.getTables().stream().filter(t -> ((Table) t).getName().equals("myJumper::Set::Selector")).findFirst().orElseThrow(); -// assertEquals("SingleRelationViewCRUD::JumperRow::ClassType", myJumpersAddSelector.getDataElement().getName()); -// assertTrue(myJumpersAddSelector.isAllowSelectMultiple()); -// assertTrue(myJumpersAddSelector.isIsRelationSelectorTable()); -// assertTrue(myJumpersAddSelector.isIsSelectorTable()); -// -// assertEquals(Set.of( -// "SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Table::Filter", -// "SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Table::Refresh" -// ), myJumperSetSelector.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button myJumperSetSelectorFilter = myJumperSetSelector.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("SingleRelationViewCRUD::RelatedView::myJumper::SetSelector::Table::Filter")).findFirst().orElseThrow(); -// assertTrue(myJumperSetSelectorFilter.getActionDefinition().getIsFilterAction()); -// assertButtonVisuals(myJumperSetSelectorFilter, "Set Filters", "filter", "text"); -// assertEquals(myJumperSetSelectorFilterAction.getActionDefinition(), myJumperSetSelectorFilter.getActionDefinition()); -// } -// -// @Test -// void testRelatedRowDetailViewCRUD() throws Exception { -// jslModel = JslParser.getModelFromStrings("RelatedRowDetailViewCRUD", List.of(createModelString("RelatedRowDetailViewCRUD"))); -// -// transform(); -// -// List apps = uiModelWrapper.getStreamOfUiApplication().toList(); -// -// Application application = apps.get(0); -// List pages = application.getPages(); -// -// PageDefinition pageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedRow::detail::View::PageDefinition")).findFirst().orElseThrow(); -// PageContainer pageContainer = pageDefinition.getContainer(); -// -// PageDefinition readOnlyJumperViewPageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::readOnlyJumper::View::PageDefinition")).findFirst().orElseThrow(); -// -// PageDefinition myJumperViewPageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::myJumper::View::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition myJumperCreatePageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::myJumper::Create::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition myJumpersCreatePageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::myJumpers::Create::PageDefinition")).findFirst().orElseThrow(); -// PageDefinition myJumpersAddSelectorPageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::myJumpers::AddSelector::PageDefinition")).findFirst().orElseThrow(); -// -// PageDefinition jumperRowDetailViewPageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::JumperRow::jumperRowDetail::View::PageDefinition")).findFirst().orElseThrow(); -// -// assertEquals(18, pageDefinition.getActions().size()); -// assertEquals(2, pageContainer.getLinks().size()); -// assertEquals(1, pageContainer.getTables().size()); -// -// assertEquals(Set.of( -// "detail::Back", -// "detail::Refresh", -// "readOnlyJumper::OpenPage", -// "readOnlyJumper::Refresh", -// "myJumper::OpenPage", -// "myJumper::Refresh", -// "myJumper::OpenForm", -// "myJumper::RowDelete", -// "myJumper::OpenSetSelector", -// "myJumper::Unset", -// "myJumpers::OpenPage", -// "myJumpers::OpenCreate", -// "myJumpers::Filter", -// "myJumpers::Refresh", -// "myJumpers::RowDelete", -// "myJumpers::BulkRemove", -// "myJumpers::Clear", -// "myJumpers::OpenAddSelector" -// ), pageDefinition.getActions().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Action BackAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("detail::Back")).findFirst().orElseThrow(); -// assertTrue(BackAction.getIsBackAction()); -// -// Action refreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("detail::Refresh")).findFirst().orElseThrow(); -// assertTrue(refreshAction.getIsRefreshAction()); -// -// Action readOnlyJumperOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("readOnlyJumper::OpenPage")).findFirst().orElseThrow(); -// assertTrue(readOnlyJumperOpenPageAction.getIsOpenPageAction()); -// assertEquals(readOnlyJumperViewPageDefinition, readOnlyJumperOpenPageAction.getTargetPageDefinition()); -// -// Action readOnlyJumperRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("readOnlyJumper::Refresh")).findFirst().orElseThrow(); -// assertTrue(readOnlyJumperRefreshAction.getIsRefreshAction()); -// -// Action myJumperOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::OpenPage")).findFirst().orElseThrow(); -// assertTrue(myJumperOpenPageAction.getIsOpenPageAction()); -// assertEquals(myJumperViewPageDefinition, myJumperOpenPageAction.getTargetPageDefinition()); -// -// Action myJumperOpenFormAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::OpenForm")).findFirst().orElseThrow(); -// assertTrue(myJumperOpenFormAction.getIsOpenFormAction()); -// assertEquals(myJumperCreatePageDefinition, myJumperOpenFormAction.getTargetPageDefinition()); -// -// Action myJumperRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::Refresh")).findFirst().orElseThrow(); -// assertTrue(myJumperRefreshAction.getIsRefreshAction()); -// -// Action myJumperRowDeleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::RowDelete")).findFirst().orElseThrow(); -// assertTrue(myJumperRowDeleteAction.getIsRowDeleteAction()); -// -// Action myJumpersOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenPage")).findFirst().orElseThrow(); -// assertTrue(myJumpersOpenPageAction.getIsRowOpenPageAction()); -// assertEquals(jumperRowDetailViewPageDefinition, myJumpersOpenPageAction.getTargetPageDefinition()); -// -// Action myJumpersFilterAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::Filter")).findFirst().orElseThrow(); -// assertTrue(myJumpersFilterAction.getIsFilterAction()); -// -// Action myJumpersRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::Refresh")).findFirst().orElseThrow(); -// assertTrue(myJumpersRefreshAction.getIsRefreshAction()); -// -// Action myJumpersOpenCreateAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenCreate")).findFirst().orElseThrow(); -// assertTrue(myJumpersOpenCreateAction.getIsOpenFormAction()); -// assertEquals(myJumpersCreatePageDefinition, myJumpersOpenCreateAction.getTargetPageDefinition()); -// -// Action myJumpersRowDeleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::RowDelete")).findFirst().orElseThrow(); -// assertTrue(myJumpersRowDeleteAction.getIsRowDeleteAction()); -// -// Action myJumpersOpenAddSelectorAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenAddSelector")).findFirst().orElseThrow(); -// assertTrue(myJumpersOpenAddSelectorAction.isOpenAddSelectorAction()); -// assertEquals(myJumpersAddSelectorPageDefinition, myJumpersOpenAddSelectorAction.getTargetPageDefinition()); -// -// // - link readOnlyJumper -// -// Link readOnlyJumper = (Link) pageContainer.getLinks().stream().filter(l -> ((Link) l).getName().equals("readOnlyJumper")).findFirst().orElseThrow(); -// assertEquals("readOnlyJumper", readOnlyJumper.getDataElement().getName()); -// assertEquals(Set.of( -// "readOnlyJumper::View" -// ), readOnlyJumper.getActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button readOnlyJumperView = readOnlyJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("readOnlyJumper::View")).findFirst().orElseThrow(); -// assertTrue(readOnlyJumperView.getActionDefinition().getIsOpenPageAction()); -// assertButtonVisuals(readOnlyJumperView, "View", "eye", "contained"); -// assertEquals(readOnlyJumperOpenPageAction.getActionDefinition(), readOnlyJumperView.getActionDefinition()); -// assertEquals(readOnlyJumperViewPageDefinition, readOnlyJumperOpenPageAction.getTargetPageDefinition()); -// -// // - Link - myJumper -// -// Link myJumper = (Link) pageContainer.getLinks().stream().filter(l -> ((Link) l).getName().equals("myJumper")).findFirst().orElseThrow(); -// assertEquals("myJumper", myJumper.getDataElement().getName()); -// assertEquals(Set.of( -// "myJumper::Create::Open", -// "myJumper::View", -// "myJumper::Delete", -// "myJumper::OpenSetSelector", -// "myJumper::Unset" -// ), myJumper.getActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button myJumperCreateOpen = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::Create::Open")).findFirst().orElseThrow(); -// assertTrue(myJumperCreateOpen.getActionDefinition().getIsOpenCreateFormAction()); -// assertButtonVisuals(myJumperCreateOpen, "Create", "note-add", "contained"); -// assertEquals(myJumperOpenFormAction.getActionDefinition(), myJumperCreateOpen.getActionDefinition()); -// -// Button myJumperView = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::View")).findFirst().orElseThrow(); -// assertTrue(myJumperView.getActionDefinition().getIsOpenPageAction()); -// assertButtonVisuals(myJumperView, "View", "eye", "contained"); -// assertEquals(myJumperOpenPageAction.getActionDefinition(), myJumperView.getActionDefinition()); -// assertEquals(myJumperViewPageDefinition, myJumperOpenPageAction.getTargetPageDefinition()); -// -// Button myJumperDelete = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::Delete")).findFirst().orElseThrow(); -// assertTrue(myJumperDelete.getActionDefinition().getIsRowDeleteAction()); -// assertButtonVisuals(myJumperDelete, "Delete", "delete_forever", "contained"); -// assertEquals(myJumperRowDeleteAction.getActionDefinition(), myJumperDelete.getActionDefinition()); -// -// // - Table - myJumpers -// -// Table myJumpers = (Table) pageContainer.getTables().stream().filter(t -> ((Table) t).getName().equals("myJumpers")).findFirst().orElseThrow(); -// assertEquals("myJumpers", myJumpers.getDataElement().getName()); -// -// assertEquals(Set.of( -// "myJumpers::Filter", -// "myJumpers::Refresh", -// "myJumpers::OpenCreate", -// "myJumpers::OpenAddSelector", -// "myJumpers::Clear", -// "myJumpers::BulkRemove" -// ), myJumpers.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button myJumpersFilter = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Filter")).findFirst().orElseThrow(); -// assertTrue(myJumpersFilter.getActionDefinition().getIsFilterAction()); -// assertButtonVisuals(myJumpersFilter, "Filter", "filter", "text"); -// assertEquals(myJumpersFilterAction.getActionDefinition(), myJumpersFilter.getActionDefinition()); -// -// Button myJumpersRefresh = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Refresh")).findFirst().orElseThrow(); -// assertTrue(myJumpersRefresh.getActionDefinition().getIsRefreshAction()); -// assertButtonVisuals(myJumpersRefresh, "Refresh", "refresh", "text"); -// assertEquals(myJumpersRefreshAction.getActionDefinition(), myJumpersRefresh.getActionDefinition()); -// -// Button myJumpersOpenCreate = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::OpenCreate")).findFirst().orElseThrow(); -// assertTrue(myJumpersOpenCreate.getActionDefinition().getIsOpenCreateFormAction()); -// assertButtonVisuals(myJumpersOpenCreate, "Create", "file-document-plus", "text"); -// assertEquals(myJumpersOpenCreateAction.getActionDefinition(), myJumpersOpenCreate.getActionDefinition()); -// -// Button myJumpersOpenAddSelector = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::OpenAddSelector")).findFirst().orElseThrow(); -// assertTrue(myJumpersOpenAddSelector.getActionDefinition().getIsOpenAddSelectorAction()); -// assertButtonVisuals(myJumpersOpenAddSelector, "Add", "attachment-plus", "text"); -// assertEquals(myJumpersOpenAddSelectorAction.getActionDefinition(), myJumpersOpenAddSelector.getActionDefinition()); -// -// Button myJumpersClear = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Clear")).findFirst().orElseThrow(); -// assertTrue(myJumpersClear.getActionDefinition().getIsClearAction()); -// assertButtonVisuals(myJumpersClear, "Clear", "link-off", "text"); -// assertEquals(myJumpersClear.getActionDefinition(), myJumpersClear.getActionDefinition()); -// -// Button myJumpersBulkRemove = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::BulkRemove")).findFirst().orElseThrow(); -// assertTrue(myJumpersBulkRemove.getActionDefinition().getIsBulkRemoveAction()); -// assertButtonVisuals(myJumpersBulkRemove, "Remove", "link-off", "text"); -// assertEquals(myJumpersBulkRemove.getActionDefinition(), myJumpersBulkRemove.getActionDefinition()); -// -// assertEquals(Set.of( -// "myJumpers::View", -// "myJumpers::RowDelete" -// ), myJumpers.getRowActionButtonGroup().getButtons().stream().map(NamedElement::getName).collect(Collectors.toSet())); -// -// Button myJumpersView = myJumpers.getRowActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::View")).findFirst().orElseThrow(); -// assertTrue(myJumpersView.getActionDefinition().getIsRowOpenPageAction()); -// assertButtonVisuals(myJumpersView, "View", "visibility", "contained"); -// assertEquals(myJumpersOpenPageAction.getActionDefinition(), myJumpersView.getActionDefinition()); -// assertEquals(jumperRowDetailViewPageDefinition, myJumpersOpenPageAction.getTargetPageDefinition()); -// -// Button myJumpersRowDelete = myJumpers.getRowActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::RowDelete")).findFirst().orElseThrow(); -// assertTrue(myJumpersRowDelete.getActionDefinition().getIsRowDeleteAction()); -// assertButtonVisuals(myJumpersRowDelete, "Delete", "delete_forever", "contained"); -// assertEquals(myJumpersRowDeleteAction.getActionDefinition(), myJumpersRowDelete.getActionDefinition()); -// } -// -// @Test -// void testRelatedFormCRUD() throws Exception { -// jslModel = JslParser.getModelFromStrings("RelatedFormCRUD", List.of(createModelString("RelatedFormCRUD"))); -// -// transform(); -// -// List apps = uiModelWrapper.getStreamOfUiApplication().toList(); -// -// Application application = apps.get(0); -// List pages = application.getPages(); -// -// PageDefinition pageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedFormCRUD::UserView::related::Create::PageDefinition")).findFirst().orElseThrow(); -// PageContainer pageContainer = pageDefinition.getContainer(); -// List
tables = application.getTables(); + List allActions = application.getPages().stream().flatMap(ps -> ps.getActions().stream()).toList(); + + PageDefinition actorDashboardPage = pages.stream().filter(p -> p.getName().equals("SummaryCRUD::NavigationApp::DashboardPage")).findFirst().orElseThrow(); + + assertEquals(Set.of( + "NavigationActor::SummaryCRUD::NavigationActor::user", + "NavigationActor::SummaryCRUD::RelatedTransfer::theJumpersCollection", + "NavigationActor::SummaryCRUD::RelatedTransfer::theJumper", + "NavigationActor::SummaryCRUD::UserTransfer::relatedCollection", + "NavigationActor::SummaryCRUD::UserTransfer::related" + ), relationTypes.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::SummaryCRUD::NavigationActor", + "NavigationActor::SummaryCRUD::RelatedTransfer", + "NavigationActor::SummaryCRUD::JumperTransfer", + "NavigationActor::SummaryCRUD::UserTransfer" + ), classTypes.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::SummaryCRUD::NavigationApp::Dashboard", + "NavigationActor::SummaryCRUD::UserView::View::PageContainer", + "NavigationActor::SummaryCRUD::UserView::level::related::SetSelector::PageContainer", + "NavigationActor::SummaryCRUD::RelatedTable::Table::PageContainer", + "NavigationActor::SummaryCRUD::RelatedForm::Create::PageContainer", + "NavigationActor::SummaryCRUD::RelatedView::View::PageContainer", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::SetSelector::PageContainer", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::AddSelector::PageContainer", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelector::PageContainer", + "NavigationActor::SummaryCRUD::JumperTable::Table::PageContainer", + "NavigationActor::SummaryCRUD::JumperView::View::PageContainer", + "NavigationActor::SummaryCRUD::JumperForm::Create::PageContainer" + ), pageContainers.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::SummaryCRUD::NavigationApp::DashboardPage", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage", + "NavigationActor::SummaryCRUD::UserView::level::related::FormPage", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage", + "NavigationActor::SummaryCRUD::UserView::level::related::SetSelectorPage", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::ViewPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::AddSelectorPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::FormPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::ViewPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::FormPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::SetSelectorPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::ViewPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::FormPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelectorPage" + ), pages.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::SummaryCRUD::UserView::View::PageContainer::UserView::level::related", + "NavigationActor::SummaryCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper", + "NavigationActor::SummaryCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper" + ), links.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::SummaryCRUD::UserView::View::PageContainer::UserView::level::relatedCollection", + "NavigationActor::SummaryCRUD::UserView::level::related::SetSelector::PageContainer::related::related::Set::Selector", + "NavigationActor::SummaryCRUD::JumperTable::Table::PageContainer::JumperTable::JumperTable::Table", + "NavigationActor::SummaryCRUD::RelatedTable::Table::PageContainer::RelatedTable::RelatedTable::Table", + "NavigationActor::SummaryCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::SetSelector::PageContainer::myJumper::myJumper::Set::Selector", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::AddSelector::PageContainer::myJumpers::myJumpers::Add::Selector", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelector::PageContainer::readOnlyJumper::readOnlyJumper::Set::Selector" + ), tables.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::SummaryCRUD::UserView::level::related::SetSelectorPage::SummaryCRUD::UserView::level::related::SetSelector::Set", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::readOnlyJumper::AutocompleteRangeAction", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::readOnlyJumper::AutocompleteSetAction", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::FormPage::readOnlyJumper::Back", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::FormPage::myJumpers::Back", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::AddSelectorPage::SummaryCRUD::RelatedView::g1::myJumpers::AddSelector::Table::Filter", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::ViewPage::readOnlyJumper::Delete", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::AddSelectorPage::SummaryCRUD::RelatedView::g1::myJumpers::AddSelector::Table::Range", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::FormPage::myJumper::Back", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::ViewPage::myJumper::Update", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumper::AutocompleteRangeAction", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumper::AutocompleteSetAction", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::readOnlyJumper::RowDelete", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumpers::OpenCreate", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumpers::OpenPage", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::related::Refresh", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::ViewPage::myJumpers::Refresh", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumper::RowDelete", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::ViewPage::myJumpers::Delete", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::user::Back", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::readOnlyJumper::Unset", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::ViewPage::myJumper::Delete", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumpers::OpenAddSelector", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::relatedCollection::Back", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::related::OpenForm", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::ViewPage::myJumpers::Update", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::ViewPage::myJumper::Refresh", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::AddSelectorPage::SummaryCRUD::RelatedView::g1::myJumpers::AddSelector::Back", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumpers::RowDelete", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::ViewPage::readOnlyJumper::Update", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::SetSelectorPage::SummaryCRUD::RelatedView::g1::myJumper::SetSelector::Set", + "NavigationActor::SummaryCRUD::UserView::level::related::FormPage::related::Create", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumper::OpenForm", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::SetSelectorPage::SummaryCRUD::RelatedView::g1::myJumper::SetSelector::Back", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::related::OpenSetSelector", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::readOnlyJumper::Refresh", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::related::Update", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumpers::Filter", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::FormPage::myJumpers::Create", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::relatedCollection::Refresh", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::FormPage::readOnlyJumper::Create", + "NavigationActor::SummaryCRUD::UserView::level::related::SetSelectorPage::SummaryCRUD::UserView::level::related::SetSelector::Back", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumper::OpenForm", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::ViewPage::myJumpers::Back", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::FormPage::myJumper::Create", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::ViewPage::readOnlyJumper::Refresh", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumpers::OpenCreate", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumpers::Filter", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumpers::Clear", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::user::Refresh", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::related::RowDelete", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::relatedCollection::Refresh", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::relatedCollection::Update", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelectorPage::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelector::Table::Range", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumpers::OpenAddSelector", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumpers::OpenPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::SetSelectorPage::SummaryCRUD::RelatedView::g1::myJumper::SetSelector::Table::Range", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::related::OpenPage", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::user::Update", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::readOnlyJumper::Refresh", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::readOnlyJumper::OpenForm", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::readOnlyJumper::OpenSetSelector", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumper::RowDelete", + "NavigationActor::SummaryCRUD::UserView::level::related::FormPage::related::Back", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumper::OpenSetSelector", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::user::Delete", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::readOnlyJumper::Unset", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::related::Back", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelectorPage::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelector::Table::Filter", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::readOnlyJumper::OpenPage", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumper::Refresh", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelectorPage::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelector::Back", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::readOnlyJumper::RowDelete", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::related::Delete", + "NavigationActor::SummaryCRUD::UserView::level::related::SetSelectorPage::SummaryCRUD::UserView::level::related::SetSelector::Table::Filter", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::readOnlyJumper::OpenForm", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumpers::Refresh", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumper::OpenPage", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::readOnlyJumper::OpenPage", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumpers::BulkRemove", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumpers::RowDelete", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::ViewPage::readOnlyJumper::Back", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumpers::Refresh", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::ViewPage::myJumper::Back", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::relatedCollection::OpenPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumper::SetSelectorPage::SummaryCRUD::RelatedView::g1::myJumper::SetSelector::Table::Filter", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumpers::Clear", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::relatedCollection::Filter", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::readOnlyJumper::OpenSetSelector", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumper::Unset", + "NavigationActor::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelectorPage::SummaryCRUD::RelatedView::g1::readOnlyJumper::SetSelector::Set", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumper::OpenSetSelector", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumper::Unset", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumper::OpenPage", + "NavigationActor::SummaryCRUD::RelatedView::g1::myJumpers::AddSelectorPage::SummaryCRUD::RelatedView::g1::myJumpers::AddSelector::Add", + "NavigationActor::SummaryCRUD::UserView::level::related::SetSelectorPage::SummaryCRUD::UserView::level::related::SetSelector::Table::Range", + "NavigationActor::SummaryCRUD::UserView::level::relatedCollection::ViewPage::myJumpers::BulkRemove", + "NavigationActor::SummaryCRUD::NavigationApp::user::AccessViewPage::related::Unset", + "NavigationActor::SummaryCRUD::UserView::level::related::ViewPage::myJumper::Refresh" + ), allActions.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + } + + @Test + void testAccessViewCRUD() throws Exception { + jslModel = JslParser.getModelFromStrings("AccessViewCRUD", List.of(createModelString("AccessViewCRUD"))); + + transform(); + + List apps = uiModelWrapper.getStreamOfUiApplication().toList(); + + Application application = apps.get(0); + + List pages = application.getPages(); + + PageDefinition pageDefinition = pages.stream().filter(p -> p.getName().equals("AccessViewCRUD::NavigationApp::user::AccessViewPage")).findFirst().orElseThrow(); + PageDefinition userViewRelatedViewPageDefinition = pages.stream().filter(p -> p.getName().equals("AccessViewCRUD::UserView::level::related::ViewPage")).findFirst().orElseThrow(); + PageDefinition userViewRelatedCreatePageDefinition = pages.stream().filter(p -> p.getName().equals("AccessViewCRUD::UserView::level::related::FormPage")).findFirst().orElseThrow(); + PageDefinition relatedRowDetailViewPageDefinition = pages.stream().filter(p -> p.getName().equals("AccessViewCRUD::UserView::level::relatedCollection::ViewPage")).findFirst().orElseThrow(); + + PageContainer pageContainer = pageDefinition.getContainer(); + + assertEquals(Set.of( + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::user::Back", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::user::Refresh", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::user::Delete", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::user::Update", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::relatedCollection::Filter", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::relatedCollection::Refresh", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::relatedCollection::OpenPage", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::related::OpenForm", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::related::OpenPage", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::related::RowDelete", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::related::Unset", + "NavigationActor::AccessViewCRUD::NavigationApp::user::AccessViewPage::related::OpenSetSelector" + ), pageDefinition.getActions().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::AccessViewCRUD::UserView::View::PageContainer::UserView::level::related" + ), pageContainer.getLinks().stream().map(l -> ((Link) l).getFQName()).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::AccessViewCRUD::UserView::View::PageContainer::UserView::level::relatedCollection" + ), pageContainer.getTables().stream().map(t -> ((Table) t).getFQName()).collect(Collectors.toSet())); + + Action backAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("user::Back")).findFirst().orElseThrow(); + assertTrue(backAction.getIsBackAction()); + + Action updateAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("user::Update")).findFirst().orElseThrow(); + assertTrue(updateAction.getIsUpdateAction()); + + Action deleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("user::Delete")).findFirst().orElseThrow(); + assertTrue(deleteAction.getIsDeleteAction()); + + Action relatedOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::OpenPage")).findFirst().orElseThrow(); + assertTrue(relatedOpenPageAction.getIsOpenPageAction()); + assertEquals(userViewRelatedViewPageDefinition, relatedOpenPageAction.getTargetPageDefinition()); + + Action relatedOpenFormAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::OpenForm")).findFirst().orElseThrow(); + assertTrue(relatedOpenFormAction.getIsOpenFormAction()); + assertEquals(userViewRelatedCreatePageDefinition, relatedOpenFormAction.getTargetPageDefinition()); + + Action relatedRowDeleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::RowDelete")).findFirst().orElseThrow(); + assertTrue(relatedRowDeleteAction.getIsRowDeleteAction()); + + Action relatedCollectionOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("relatedCollection::OpenPage")).findFirst().orElseThrow(); + assertTrue(relatedCollectionOpenPageAction.getIsOpenPageAction()); + assertEquals(relatedRowDetailViewPageDefinition, relatedCollectionOpenPageAction.getTargetPageDefinition()); + + Action relatedCollectionFilterAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("relatedCollection::Filter")).findFirst().orElseThrow(); + assertTrue(relatedCollectionFilterAction.getIsFilterAction()); + + Action relatedCollectionRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("relatedCollection::Refresh")).findFirst().orElseThrow(); + assertTrue(relatedCollectionRefreshAction.getIsRefreshAction()); + + // - Link - related + + Link related = (Link) pageContainer.getLinks().stream().filter(l -> ((Link) l).getName().equals("related")).findFirst().orElseThrow(); + assertEquals("related", related.getDataElement().getName()); + assertEquals(Set.of( + "NavigationActor::AccessViewCRUD::UserView::View::PageContainer::UserView::level::related::related::Actions::related::OpenSetSelector", + "NavigationActor::AccessViewCRUD::UserView::View::PageContainer::UserView::level::related::related::Actions::related::Create::Open", + "NavigationActor::AccessViewCRUD::UserView::View::PageContainer::UserView::level::related::related::Actions::related::Delete", + "NavigationActor::AccessViewCRUD::UserView::View::PageContainer::UserView::level::related::related::Actions::related::View", + "NavigationActor::AccessViewCRUD::UserView::View::PageContainer::UserView::level::related::related::Actions::related::Unset" + ), related.getActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button relatedCreateOpen = related.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("related::Create::Open")).findFirst().orElseThrow(); + assertTrue(relatedCreateOpen.getActionDefinition().getIsOpenCreateFormAction()); + assertButtonVisuals(relatedCreateOpen, "Create", "note-add", "contained"); + assertEquals(relatedOpenFormAction.getActionDefinition(), relatedCreateOpen.getActionDefinition()); + + Button relatedView = related.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("related::View")).findFirst().orElseThrow(); + assertTrue(relatedView.getActionDefinition().getIsOpenPageAction()); + assertButtonVisuals(relatedView, "View", "eye", "contained"); + assertEquals(relatedOpenPageAction.getActionDefinition(), relatedView.getActionDefinition()); + assertEquals(userViewRelatedViewPageDefinition, relatedOpenPageAction.getTargetPageDefinition()); + + Button relatedDelete = related.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("related::Delete")).findFirst().orElseThrow(); + assertTrue(relatedDelete.getActionDefinition().getIsRowDeleteAction()); + assertButtonVisuals(relatedDelete, "Delete", "delete_forever", "contained"); + assertEquals(relatedRowDeleteAction.getActionDefinition(), relatedDelete.getActionDefinition()); + + // - Table - relatedCollection + + Table relatedCollection = (Table) pageContainer.getTables().stream().filter(t -> ((Table) t).getName().equals("relatedCollection")).findFirst().orElseThrow(); + assertEquals("relatedCollection", relatedCollection.getDataElement().getName()); + + assertEquals(Set.of( + "NavigationActor::AccessViewCRUD::UserView::View::PageContainer::UserView::level::relatedCollection::relatedCollection::InlineViewTableButtonGroup::relatedCollection::Filter", + "NavigationActor::AccessViewCRUD::UserView::View::PageContainer::UserView::level::relatedCollection::relatedCollection::InlineViewTableButtonGroup::relatedCollection::Refresh" + ), relatedCollection.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button relatedCollectionFilter = relatedCollection.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("relatedCollection::Filter")).findFirst().orElseThrow(); + assertTrue(relatedCollectionFilter.getActionDefinition().getIsFilterAction()); + assertButtonVisuals(relatedCollectionFilter, "Filter", "filter", "text"); + assertEquals(relatedCollectionFilterAction.getActionDefinition(), relatedCollectionFilter.getActionDefinition()); + + Button relatedCollectionRefresh = relatedCollection.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("relatedCollection::Refresh")).findFirst().orElseThrow(); + assertTrue(relatedCollectionRefresh.getActionDefinition().getIsRefreshAction()); + assertButtonVisuals(relatedCollectionRefresh, "Refresh", "refresh", "text"); + assertEquals(relatedCollectionRefreshAction.getActionDefinition(), relatedCollectionRefresh.getActionDefinition()); + + assertEquals(Set.of( + "NavigationActor::AccessViewCRUD::UserView::View::PageContainer::UserView::level::relatedCollection::relatedCollectionInlineViewTableRowButtonGroup::relatedCollection::View" + ), relatedCollection.getRowActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button relatedCollectionView = relatedCollection.getRowActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("relatedCollection::View")).findFirst().orElseThrow(); + assertTrue(relatedCollectionView.getActionDefinition().getIsOpenPageAction()); + assertButtonVisuals(relatedCollectionView, "View", "visibility", "contained"); + assertEquals(relatedCollectionOpenPageAction.getActionDefinition(), relatedCollectionView.getActionDefinition()); + assertEquals(userViewRelatedViewPageDefinition, relatedOpenPageAction.getTargetPageDefinition()); + + } + + @Test + void testSingleRelationViewCRUD() throws Exception { + jslModel = JslParser.getModelFromStrings("SingleRelationViewCRUD", List.of(createModelString("SingleRelationViewCRUD"))); + + transform(); + + List apps = uiModelWrapper.getStreamOfUiApplication().toList(); + + Application application = apps.get(0); + List pages = application.getPages(); + + PageDefinition pageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::UserView::level::related::ViewPage")).findFirst().orElseThrow(); + PageContainer pageContainer = pageDefinition.getContainer(); + + PageDefinition readOnlyJumperViewPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::g1::readOnlyJumper::ViewPage")).findFirst().orElseThrow(); + PageDefinition relatedSetSelectorPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::UserView::level::related::SetSelectorPage")).findFirst().orElseThrow(); + PageDefinition myJumperViewPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumper::ViewPage")).findFirst().orElseThrow(); + PageDefinition myJumperCreatePageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumper::FormPage")).findFirst().orElseThrow(); + PageDefinition myJumperSetSelectorPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelectorPage")).findFirst().orElseThrow(); + PageDefinition jumperRowDetailViewPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumpers::ViewPage")).findFirst().orElseThrow(); + PageDefinition myJumpersCreatePageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumpers::FormPage")).findFirst().orElseThrow(); + PageDefinition myJumpersAddSelectorPageDefinition = pages.stream().filter(p -> p.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelectorPage")).findFirst().orElseThrow(); + PageContainer myJumpersAddSelectorPageContainer = myJumpersAddSelectorPageDefinition.getContainer(); + PageContainer myJumperSetSelectorPageContainer = myJumperSetSelectorPageDefinition.getContainer(); + + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumper::OpenForm", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumper::OpenPage", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumper::OpenSetSelector", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumper::Refresh", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumper::RowDelete", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumper::Unset", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumper::AutocompleteRangeAction", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumper::AutocompleteSetAction", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumpers::BulkRemove", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumpers::Clear", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumpers::Filter", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumpers::OpenAddSelector", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumpers::OpenCreate", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumpers::OpenPage", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumpers::Refresh", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::myJumpers::RowDelete", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::OpenForm", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::OpenPage", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::OpenSetSelector", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::Refresh", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::RowDelete", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::Unset", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::AutocompleteRangeAction", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::AutocompleteSetAction", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::related::Back", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::related::Delete", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::related::Refresh", + "NavigationActor::SingleRelationViewCRUD::UserView::level::related::ViewPage::related::Update" + ), pageDefinition.getActions().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper" + ), pageContainer.getLinks().stream().map(l -> ((Link) l).getFQName()).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers" + ), pageContainer.getTables().stream().map(t -> ((Table) t).getFQName()).collect(Collectors.toSet())); + + Action BackAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::Back")).findFirst().orElseThrow(); + assertTrue(BackAction.getIsBackAction()); + + Action refreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::Refresh")).findFirst().orElseThrow(); + assertTrue(refreshAction.getIsRefreshAction()); + + Action updateAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::Update")).findFirst().orElseThrow(); + assertTrue(updateAction.getIsUpdateAction()); + + Action deleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::Delete")).findFirst().orElseThrow(); + assertTrue(deleteAction.getIsDeleteAction()); + + Action readOnlyJumperOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("readOnlyJumper::OpenPage")).findFirst().orElseThrow(); + assertTrue(readOnlyJumperOpenPageAction.getIsOpenPageAction()); + assertEquals(readOnlyJumperViewPageDefinition, readOnlyJumperOpenPageAction.getTargetPageDefinition()); + + Action readOnlyJumperRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("readOnlyJumper::Refresh")).findFirst().orElseThrow(); + assertTrue(readOnlyJumperRefreshAction.getIsRefreshAction()); + + Action myJumperOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::OpenPage")).findFirst().orElseThrow(); + assertTrue(myJumperOpenPageAction.getIsOpenPageAction()); + assertEquals(myJumperViewPageDefinition, myJumperOpenPageAction.getTargetPageDefinition()); + + Action myJumperOpenFormAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::OpenForm")).findFirst().orElseThrow(); + assertTrue(myJumperOpenFormAction.getIsOpenFormAction()); + assertEquals(myJumperCreatePageDefinition, myJumperOpenFormAction.getTargetPageDefinition()); + + Action myJumperRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::Refresh")).findFirst().orElseThrow(); + assertTrue(myJumperRefreshAction.getIsRefreshAction()); + + Action myJumperRowDeleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::RowDelete")).findFirst().orElseThrow(); + assertTrue(myJumperRowDeleteAction.getIsRowDeleteAction()); + + Action myJumperOpenSetSelectorAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::OpenSetSelector")).findFirst().orElseThrow(); + assertTrue(myJumperOpenSetSelectorAction.isOpenSetSelectorAction()); + assertEquals(myJumperSetSelectorPageDefinition, myJumperOpenSetSelectorAction.getTargetPageDefinition()); + + Action myJumperUnsetAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::Unset")).findFirst().orElseThrow(); + assertTrue(myJumperUnsetAction.getIsUnsetAction()); + + Action myJumpersOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenPage")).findFirst().orElseThrow(); + assertTrue(myJumpersOpenPageAction.getIsOpenPageAction()); + assertEquals(jumperRowDetailViewPageDefinition, myJumpersOpenPageAction.getTargetPageDefinition()); + + Action myJumpersFilterAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::Filter")).findFirst().orElseThrow(); + assertTrue(myJumpersFilterAction.getIsFilterAction()); + + Action myJumpersRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::Refresh")).findFirst().orElseThrow(); + assertTrue(myJumpersRefreshAction.getIsRefreshAction()); + + Action myJumpersOpenCreateAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenCreate")).findFirst().orElseThrow(); + assertTrue(myJumpersOpenCreateAction.isOpenCreateFormAction()); + assertEquals(myJumpersCreatePageDefinition, myJumpersOpenCreateAction.getTargetPageDefinition()); + + Action myJumpersRowDeleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::RowDelete")).findFirst().orElseThrow(); + assertTrue(myJumpersRowDeleteAction.getIsRowDeleteAction()); + + Action myJumpersClearAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::Clear")).findFirst().orElseThrow(); + assertTrue(myJumpersClearAction.getIsClearAction()); + + Action myJumpersBulkRemoveAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::BulkRemove")).findFirst().orElseThrow(); + assertTrue(myJumpersBulkRemoveAction.getIsBulkRemoveAction()); + + Action myJumpersOpenAddSelectorAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenAddSelector")).findFirst().orElseThrow(); + assertTrue(myJumpersOpenAddSelectorAction.isOpenAddSelectorAction()); + assertEquals(myJumpersAddSelectorPageDefinition, myJumpersOpenAddSelectorAction.getTargetPageDefinition()); + + // - link readOnlyJumper + + Link readOnlyJumper = (Link) pageContainer.getLinks().stream().filter(l -> ((Link) l).getName().equals("readOnlyJumper")).findFirst().orElseThrow(); + assertEquals("theJumper", readOnlyJumper.getDataElement().getName()); + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper::readOnlyJumper::Actions::readOnlyJumper::OpenSetSelector", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper::readOnlyJumper::Actions::readOnlyJumper::View", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper::readOnlyJumper::Actions::readOnlyJumper::Delete", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper::readOnlyJumper::Actions::readOnlyJumper::Unset", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper::readOnlyJumper::Actions::readOnlyJumper::Create::Open" + ), readOnlyJumper.getActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button readOnlyJumperView = readOnlyJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("readOnlyJumper::View")).findFirst().orElseThrow(); + assertTrue(readOnlyJumperView.getActionDefinition().getIsOpenPageAction()); + assertButtonVisuals(readOnlyJumperView, "View", "eye", "contained"); + assertEquals(readOnlyJumperOpenPageAction.getActionDefinition(), readOnlyJumperView.getActionDefinition()); + assertEquals(readOnlyJumperViewPageDefinition, readOnlyJumperOpenPageAction.getTargetPageDefinition()); + + // - Link - myJumper + + Link myJumper = (Link) pageContainer.getLinks().stream().filter(l -> ((Link) l).getName().equals("myJumper")).findFirst().orElseThrow(); + assertEquals("theJumper", myJumper.getDataElement().getName()); + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper::myJumper::Actions::myJumper::Create::Open", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper::myJumper::Actions::myJumper::View", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper::myJumper::Actions::myJumper::OpenSetSelector", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper::myJumper::Actions::myJumper::Unset", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper::myJumper::Actions::myJumper::Delete" + ), myJumper.getActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button myJumperCreateOpen = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::Create::Open")).findFirst().orElseThrow(); + assertTrue(myJumperCreateOpen.getActionDefinition().getIsOpenCreateFormAction()); + assertButtonVisuals(myJumperCreateOpen, "Create", "note-add", "contained"); + assertEquals(myJumperOpenFormAction.getActionDefinition(), myJumperCreateOpen.getActionDefinition()); + + Button myJumperView = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::View")).findFirst().orElseThrow(); + assertTrue(myJumperView.getActionDefinition().getIsOpenPageAction()); + assertButtonVisuals(myJumperView, "View", "eye", "contained"); + assertEquals(myJumperOpenPageAction.getActionDefinition(), myJumperView.getActionDefinition()); + assertEquals(myJumperViewPageDefinition, myJumperOpenPageAction.getTargetPageDefinition()); + + Button myJumperDelete = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::Delete")).findFirst().orElseThrow(); + assertTrue(myJumperDelete.getActionDefinition().getIsRowDeleteAction()); + assertButtonVisuals(myJumperDelete, "Delete", "delete_forever", "contained"); + assertEquals(myJumperRowDeleteAction.getActionDefinition(), myJumperDelete.getActionDefinition()); + + Button myJumperOpenSetSelector = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::OpenSetSelector")).findFirst().orElseThrow(); + assertTrue(myJumperOpenSetSelector.getActionDefinition().getIsOpenSelectorAction()); + assertButtonVisuals(myJumperOpenSetSelector, "Set", "link", "contained"); + assertEquals(myJumperOpenSetSelectorAction.getActionDefinition(), myJumperOpenSetSelector.getActionDefinition()); + + Button myJumperUnset = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::Unset")).findFirst().orElseThrow(); + assertTrue(myJumperUnset.getActionDefinition().getIsUnsetAction()); + assertButtonVisuals(myJumperUnset, "Unset", "link-off", "contained"); + assertEquals(myJumperUnsetAction.getActionDefinition(), myJumperUnset.getActionDefinition()); + + // - Table - myJumpers + + Table myJumpers = (Table) pageContainer.getTables().stream().filter(t -> ((Table) t).getName().equals("myJumpers")).findFirst().orElseThrow(); + assertEquals("theJumpersCollection", myJumpers.getDataElement().getName()); + + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::Clear", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::BulkRemove", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::Filter", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::Refresh", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::OpenAddSelector", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::OpenCreate" + ), myJumpers.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button myJumpersFilter = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Filter")).findFirst().orElseThrow(); + assertTrue(myJumpersFilter.getActionDefinition().getIsFilterAction()); + assertButtonVisuals(myJumpersFilter, "Filter", "filter", "text"); + assertEquals(myJumpersFilterAction.getActionDefinition(), myJumpersFilter.getActionDefinition()); + + Button myJumpersRefresh = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Refresh")).findFirst().orElseThrow(); + assertTrue(myJumpersRefresh.getActionDefinition().getIsRefreshAction()); + assertButtonVisuals(myJumpersRefresh, "Refresh", "refresh", "text"); + assertEquals(myJumpersRefreshAction.getActionDefinition(), myJumpersRefresh.getActionDefinition()); + + Button myJumpersOpenCreate = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::OpenCreate")).findFirst().orElseThrow(); + assertTrue(myJumpersOpenCreate.getActionDefinition().getIsOpenCreateFormAction()); + assertButtonVisuals(myJumpersOpenCreate, "Create", "file-document-plus", "text"); + assertEquals(myJumpersOpenCreateAction.getActionDefinition(), myJumpersOpenCreate.getActionDefinition()); + + Button myJumpersClear = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Clear")).findFirst().orElseThrow(); + assertTrue(myJumpersClear.getActionDefinition().getIsClearAction()); + assertButtonVisuals(myJumpersClear, "Clear", "link-off", "text"); + assertEquals(myJumpersClearAction.getActionDefinition(), myJumpersClear.getActionDefinition()); + + Button myJumpersBulkRemove = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::BulkRemove")).findFirst().orElseThrow(); + assertTrue(myJumpersBulkRemove.getActionDefinition().getIsBulkRemoveAction()); + assertButtonVisuals(myJumpersBulkRemove, "Remove", "link-off", "text"); + assertEquals(myJumpersBulkRemoveAction.getActionDefinition(), myJumpersBulkRemove.getActionDefinition()); + + Button myJumpersOpenAddSelector = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::OpenAddSelector")).findFirst().orElseThrow(); + assertTrue(myJumpersOpenAddSelector.getActionDefinition().getIsOpenAddSelectorAction()); + assertButtonVisuals(myJumpersOpenAddSelector, "Add", "attachment-plus", "text"); + assertEquals(myJumpersOpenAddSelectorAction.getActionDefinition(), myJumpersOpenAddSelector.getActionDefinition()); + + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpersInlineViewTableRowButtonGroup::myJumpers::View", + "NavigationActor::SingleRelationViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpersInlineViewTableRowButtonGroup::myJumpers::RowDelete" + ), myJumpers.getRowActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button myJumpersView = myJumpers.getRowActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::View")).findFirst().orElseThrow(); + assertTrue(myJumpersView.getActionDefinition().getIsOpenPageAction()); + assertButtonVisuals(myJumpersView, "View", "visibility", "contained"); + assertEquals(myJumpersOpenPageAction.getActionDefinition(), myJumpersView.getActionDefinition()); + assertEquals(jumperRowDetailViewPageDefinition, myJumpersOpenPageAction.getTargetPageDefinition()); + + Button myJumpersRowDelete = myJumpers.getRowActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::RowDelete")).findFirst().orElseThrow(); + assertTrue(myJumpersRowDelete.getActionDefinition().getIsRowDeleteAction()); + assertButtonVisuals(myJumpersRowDelete, "Delete", "delete_forever", "contained"); + assertEquals(myJumpersRowDeleteAction.getActionDefinition(), myJumpersRowDelete.getActionDefinition()); + + // add selector - myJumpers + + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelectorPage::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Add", + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelectorPage::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Table::Range", + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelectorPage::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Back", + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelectorPage::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Table::Filter" + ), myJumpersAddSelectorPageDefinition.getActions().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Action myJumpersAddSelectorAddAction = myJumpersAddSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Add")).findFirst().orElseThrow(); + assertTrue(myJumpersAddSelectorAddAction.getActionDefinition().getIsAddAction()); + + Action myJumpersAddSelectorFilterAction = myJumpersAddSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Table::Filter")).findFirst().orElseThrow(); + assertTrue(myJumpersAddSelectorFilterAction.getActionDefinition().getIsFilterAction()); + + Action myJumpersAddSelectorrangeAction = myJumpersAddSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Table::Range")).findFirst().orElseThrow(); + assertTrue(myJumpersAddSelectorrangeAction.getActionDefinition().getIsSelectorRangeAction()); + + Action myJumpersAddSelectorBackAction = myJumpersAddSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Back")).findFirst().orElseThrow(); + assertTrue(myJumpersAddSelectorBackAction.getActionDefinition().getIsBackAction()); + + Table myJumpersAddSelector = (Table) myJumpersAddSelectorPageContainer.getTables().stream().filter(t -> ((Table) t).getName().equals("myJumpers::Add::Selector")).findFirst().orElseThrow(); + assertEquals("SingleRelationViewCRUD::JumperTransfer", myJumpersAddSelector.getDataElement().getName()); + assertTrue(myJumpersAddSelector.isAllowSelectMultiple()); + assertTrue(myJumpersAddSelector.isIsRelationSelectorTable()); + assertTrue(myJumpersAddSelector.isIsSelectorTable()); + + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::PageContainer::myJumpers::myJumpers::Add::Selector::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelectorTableActions::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Table::Refresh", + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::PageContainer::myJumpers::myJumpers::Add::Selector::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelectorTableActions::SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Table::Filter" + ), myJumpersAddSelector.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button myJumpersAddSelectorFilter = myJumpersAddSelector.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumpers::AddSelector::Table::Filter")).findFirst().orElseThrow(); + assertTrue(myJumpersAddSelectorFilter.getActionDefinition().getIsFilterAction()); + assertButtonVisuals(myJumpersAddSelectorFilter, "Set Filters", "filter", "text"); + assertEquals(myJumpersAddSelectorFilterAction.getActionDefinition(), myJumpersAddSelectorFilter.getActionDefinition()); + + // set selector - myJumper + + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelectorPage::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Table::Filter", + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelectorPage::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Back", + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelectorPage::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Set", + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelectorPage::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Table::Range" + ), myJumperSetSelectorPageDefinition.getActions().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Action myJumperSetSelectorFilterAction = myJumperSetSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Table::Filter")).findFirst().orElseThrow(); + assertTrue(myJumperSetSelectorFilterAction.getActionDefinition().getIsFilterAction()); + + Action myJumperSetSelectorrangeAction = myJumperSetSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Table::Range")).findFirst().orElseThrow(); + assertTrue(myJumperSetSelectorrangeAction.getActionDefinition().getIsSelectorRangeAction()); + + Action myJumperSetSelectorSetAction = myJumperSetSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Set")).findFirst().orElseThrow(); + assertTrue(myJumperSetSelectorSetAction.getActionDefinition().getIsSetAction()); + + Action myJumperSetSelectorBackAction = myJumperSetSelectorPageDefinition.getActions().stream().filter(a -> a.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Back")).findFirst().orElseThrow(); + assertTrue(myJumperSetSelectorBackAction.getActionDefinition().getIsBackAction()); + + Table myJumperSetSelector = (Table) myJumperSetSelectorPageContainer.getTables().stream().filter(t -> ((Table) t).getName().equals("myJumper::Set::Selector")).findFirst().orElseThrow(); + assertEquals("SingleRelationViewCRUD::JumperTransfer", myJumpersAddSelector.getDataElement().getName()); + assertTrue(myJumpersAddSelector.isAllowSelectMultiple()); + assertTrue(myJumpersAddSelector.isIsRelationSelectorTable()); + assertTrue(myJumpersAddSelector.isIsSelectorTable()); + + assertEquals(Set.of( + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::PageContainer::myJumper::myJumper::Set::Selector::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelectorTableActions::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Table::Refresh", + "NavigationActor::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::PageContainer::myJumper::myJumper::Set::Selector::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelectorTableActions::SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Table::Filter" + ), myJumperSetSelector.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button myJumperSetSelectorFilter = myJumperSetSelector.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Table::Filter")).findFirst().orElseThrow(); + assertTrue(myJumperSetSelectorFilter.getActionDefinition().getIsFilterAction()); + assertButtonVisuals(myJumperSetSelectorFilter, "Set Filters", "filter", "text"); + assertEquals(myJumperSetSelectorFilterAction.getActionDefinition(), myJumperSetSelectorFilter.getActionDefinition()); + + Button myJumperSetSelectorRefresh = myJumperSetSelector.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("SingleRelationViewCRUD::RelatedView::g1::myJumper::SetSelector::Table::Refresh")).findFirst().orElseThrow(); + assertTrue(myJumperSetSelectorRefresh.getActionDefinition().getIsSelectorRangeAction()); + assertButtonVisuals(myJumperSetSelectorRefresh, "Refresh", "refresh", "text"); + assertEquals(myJumperSetSelectorrangeAction.getActionDefinition(), myJumperSetSelectorRefresh.getActionDefinition()); + } + + @Test + void testRelatedRowDetailViewCRUD() throws Exception { + jslModel = JslParser.getModelFromStrings("RelatedRowDetailViewCRUD", List.of(createModelString("RelatedRowDetailViewCRUD"))); + + transform(); + + List apps = uiModelWrapper.getStreamOfUiApplication().toList(); + + Application application = apps.get(0); + List pages = application.getPages(); + + PageDefinition pageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::UserView::level::related::ViewPage")).findFirst().orElseThrow(); + PageContainer pageContainer = pageDefinition.getContainer(); + + PageDefinition readOnlyJumperViewPageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::g1::readOnlyJumper::ViewPage")).findFirst().orElseThrow(); + + PageDefinition myJumperViewPageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::g1::myJumper::ViewPage")).findFirst().orElseThrow(); + PageDefinition myJumperCreatePageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::g1::myJumper::FormPage")).findFirst().orElseThrow(); + PageDefinition myJumpersCreatePageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::g1::myJumpers::FormPage")).findFirst().orElseThrow(); + PageDefinition myJumpersAddSelectorPageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::g1::myJumpers::AddSelectorPage")).findFirst().orElseThrow(); + + PageDefinition jumperRowDetailViewPageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedRowDetailViewCRUD::RelatedView::g1::myJumpers::ViewPage")).findFirst().orElseThrow(); + + assertEquals(2, pageContainer.getLinks().size()); + assertEquals(1, pageContainer.getTables().size()); + + assertEquals(Set.of( + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumper::OpenForm", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumper::OpenPage", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumper::OpenSetSelector", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumper::Refresh", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumper::RowDelete", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumper::Unset", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumper::AutocompleteRangeAction", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumper::AutocompleteSetAction", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumpers::BulkRemove", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumpers::Clear", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumpers::Filter", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumpers::OpenAddSelector", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumpers::OpenCreate", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumpers::OpenPage", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumpers::Refresh", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::myJumpers::RowDelete", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::OpenForm", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::OpenPage", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::OpenSetSelector", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::Refresh", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::RowDelete", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::AutocompleteRangeAction", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::AutocompleteSetAction", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::readOnlyJumper::Unset", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::related::Back", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::related::Delete", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::related::Refresh", + "NavigationActor::RelatedRowDetailViewCRUD::UserView::level::related::ViewPage::related::Update" + ), pageDefinition.getActions().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Action BackAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::Back")).findFirst().orElseThrow(); + assertTrue(BackAction.getIsBackAction()); + + Action refreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("related::Refresh")).findFirst().orElseThrow(); + assertTrue(refreshAction.getIsRefreshAction()); + + Action readOnlyJumperOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("readOnlyJumper::OpenPage")).findFirst().orElseThrow(); + assertTrue(readOnlyJumperOpenPageAction.getIsOpenPageAction()); + assertEquals(readOnlyJumperViewPageDefinition, readOnlyJumperOpenPageAction.getTargetPageDefinition()); + + Action readOnlyJumperRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("readOnlyJumper::Refresh")).findFirst().orElseThrow(); + assertTrue(readOnlyJumperRefreshAction.getIsRefreshAction()); + + Action myJumperOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::OpenPage")).findFirst().orElseThrow(); + assertTrue(myJumperOpenPageAction.getIsOpenPageAction()); + assertEquals(myJumperViewPageDefinition, myJumperOpenPageAction.getTargetPageDefinition()); + + Action myJumperOpenFormAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::OpenForm")).findFirst().orElseThrow(); + assertTrue(myJumperOpenFormAction.getIsOpenFormAction()); + assertEquals(myJumperCreatePageDefinition, myJumperOpenFormAction.getTargetPageDefinition()); + + Action myJumperRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::Refresh")).findFirst().orElseThrow(); + assertTrue(myJumperRefreshAction.getIsRefreshAction()); + + Action myJumperRowDeleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumper::RowDelete")).findFirst().orElseThrow(); + assertTrue(myJumperRowDeleteAction.getIsRowDeleteAction()); + + Action myJumpersOpenPageAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenPage")).findFirst().orElseThrow(); + assertTrue(myJumpersOpenPageAction.getIsOpenPageAction()); + assertEquals(jumperRowDetailViewPageDefinition, myJumpersOpenPageAction.getTargetPageDefinition()); + + Action myJumpersFilterAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::Filter")).findFirst().orElseThrow(); + assertTrue(myJumpersFilterAction.getIsFilterAction()); + + Action myJumpersRefreshAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::Refresh")).findFirst().orElseThrow(); + assertTrue(myJumpersRefreshAction.getIsRefreshAction()); + + Action myJumpersOpenCreateAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenCreate")).findFirst().orElseThrow(); + assertTrue(myJumpersOpenCreateAction.getIsOpenFormAction()); + assertEquals(myJumpersCreatePageDefinition, myJumpersOpenCreateAction.getTargetPageDefinition()); + + Action myJumpersRowDeleteAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::RowDelete")).findFirst().orElseThrow(); + assertTrue(myJumpersRowDeleteAction.getIsRowDeleteAction()); + + Action myJumpersOpenAddSelectorAction = pageDefinition.getActions().stream().filter(a -> a.getName().equals("myJumpers::OpenAddSelector")).findFirst().orElseThrow(); + assertTrue(myJumpersOpenAddSelectorAction.isOpenAddSelectorAction()); + assertEquals(myJumpersAddSelectorPageDefinition, myJumpersOpenAddSelectorAction.getTargetPageDefinition()); + + // - link readOnlyJumper + + Link readOnlyJumper = (Link) pageContainer.getLinks().stream().filter(l -> ((Link) l).getName().equals("readOnlyJumper")).findFirst().orElseThrow(); + assertEquals("theJumper", readOnlyJumper.getDataElement().getName()); + assertEquals(Set.of( + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper::readOnlyJumper::Actions::readOnlyJumper::Delete", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper::readOnlyJumper::Actions::readOnlyJumper::Create::Open", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper::readOnlyJumper::Actions::readOnlyJumper::OpenSetSelector", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper::readOnlyJumper::Actions::readOnlyJumper::Unset", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::readOnlyJumper::readOnlyJumper::Actions::readOnlyJumper::View" + ), readOnlyJumper.getActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button readOnlyJumperView = readOnlyJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("readOnlyJumper::View")).findFirst().orElseThrow(); + assertTrue(readOnlyJumperView.getActionDefinition().getIsOpenPageAction()); + assertButtonVisuals(readOnlyJumperView, "View", "eye", "contained"); + assertEquals(readOnlyJumperOpenPageAction.getActionDefinition(), readOnlyJumperView.getActionDefinition()); + assertEquals(readOnlyJumperViewPageDefinition, readOnlyJumperOpenPageAction.getTargetPageDefinition()); + + // - Link - myJumper + + Link myJumper = (Link) pageContainer.getLinks().stream().filter(l -> ((Link) l).getName().equals("myJumper")).findFirst().orElseThrow(); + assertEquals("theJumper", myJumper.getDataElement().getName()); + assertEquals(Set.of( + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper::myJumper::Actions::myJumper::Delete", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper::myJumper::Actions::myJumper::Create::Open", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper::myJumper::Actions::myJumper::OpenSetSelector", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper::myJumper::Actions::myJumper::Unset", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumper::myJumper::Actions::myJumper::View" + ), myJumper.getActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button myJumperCreateOpen = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::Create::Open")).findFirst().orElseThrow(); + assertTrue(myJumperCreateOpen.getActionDefinition().getIsOpenCreateFormAction()); + assertButtonVisuals(myJumperCreateOpen, "Create", "note-add", "contained"); + assertEquals(myJumperOpenFormAction.getActionDefinition(), myJumperCreateOpen.getActionDefinition()); + + Button myJumperView = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::View")).findFirst().orElseThrow(); + assertTrue(myJumperView.getActionDefinition().getIsOpenPageAction()); + assertButtonVisuals(myJumperView, "View", "eye", "contained"); + assertEquals(myJumperOpenPageAction.getActionDefinition(), myJumperView.getActionDefinition()); + assertEquals(myJumperViewPageDefinition, myJumperOpenPageAction.getTargetPageDefinition()); + + Button myJumperDelete = myJumper.getActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumper::Delete")).findFirst().orElseThrow(); + assertTrue(myJumperDelete.getActionDefinition().getIsRowDeleteAction()); + assertButtonVisuals(myJumperDelete, "Delete", "delete_forever", "contained"); + assertEquals(myJumperRowDeleteAction.getActionDefinition(), myJumperDelete.getActionDefinition()); + + // - Table - myJumpers + + Table myJumpers = (Table) pageContainer.getTables().stream().filter(t -> ((Table) t).getName().equals("myJumpers")).findFirst().orElseThrow(); + assertEquals("theJumpersCollection", myJumpers.getDataElement().getName()); + + assertEquals(Set.of( + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::Filter", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::Refresh", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::Clear", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::BulkRemove", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::OpenAddSelector", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpers::InlineViewTableButtonGroup::myJumpers::OpenCreate" + ), myJumpers.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button myJumpersFilter = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Filter")).findFirst().orElseThrow(); + assertTrue(myJumpersFilter.getActionDefinition().getIsFilterAction()); + assertButtonVisuals(myJumpersFilter, "Filter", "filter", "text"); + assertEquals(myJumpersFilterAction.getActionDefinition(), myJumpersFilter.getActionDefinition()); + + Button myJumpersRefresh = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Refresh")).findFirst().orElseThrow(); + assertTrue(myJumpersRefresh.getActionDefinition().getIsRefreshAction()); + assertButtonVisuals(myJumpersRefresh, "Refresh", "refresh", "text"); + assertEquals(myJumpersRefreshAction.getActionDefinition(), myJumpersRefresh.getActionDefinition()); + + Button myJumpersOpenCreate = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::OpenCreate")).findFirst().orElseThrow(); + assertTrue(myJumpersOpenCreate.getActionDefinition().getIsOpenCreateFormAction()); + assertButtonVisuals(myJumpersOpenCreate, "Create", "file-document-plus", "text"); + assertEquals(myJumpersOpenCreateAction.getActionDefinition(), myJumpersOpenCreate.getActionDefinition()); + + Button myJumpersOpenAddSelector = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::OpenAddSelector")).findFirst().orElseThrow(); + assertTrue(myJumpersOpenAddSelector.getActionDefinition().getIsOpenAddSelectorAction()); + assertButtonVisuals(myJumpersOpenAddSelector, "Add", "attachment-plus", "text"); + assertEquals(myJumpersOpenAddSelectorAction.getActionDefinition(), myJumpersOpenAddSelector.getActionDefinition()); + + Button myJumpersClear = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::Clear")).findFirst().orElseThrow(); + assertTrue(myJumpersClear.getActionDefinition().getIsClearAction()); + assertButtonVisuals(myJumpersClear, "Clear", "link-off", "text"); + assertEquals(myJumpersClear.getActionDefinition(), myJumpersClear.getActionDefinition()); + + Button myJumpersBulkRemove = myJumpers.getTableActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::BulkRemove")).findFirst().orElseThrow(); + assertTrue(myJumpersBulkRemove.getActionDefinition().getIsBulkRemoveAction()); + assertButtonVisuals(myJumpersBulkRemove, "Remove", "link-off", "text"); + assertEquals(myJumpersBulkRemove.getActionDefinition(), myJumpersBulkRemove.getActionDefinition()); + + assertEquals(Set.of( + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpersInlineViewTableRowButtonGroup::myJumpers::RowDelete", + "NavigationActor::RelatedRowDetailViewCRUD::RelatedView::View::PageContainer::RelatedView::g1::myJumpers::myJumpersInlineViewTableRowButtonGroup::myJumpers::View" + ), myJumpers.getRowActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button myJumpersView = myJumpers.getRowActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::View")).findFirst().orElseThrow(); + assertTrue(myJumpersView.getActionDefinition().getIsOpenPageAction()); + assertButtonVisuals(myJumpersView, "View", "visibility", "contained"); + assertEquals(myJumpersOpenPageAction.getActionDefinition(), myJumpersView.getActionDefinition()); + assertEquals(jumperRowDetailViewPageDefinition, myJumpersOpenPageAction.getTargetPageDefinition()); + + Button myJumpersRowDelete = myJumpers.getRowActionButtonGroup().getButtons().stream().filter(b -> b.getName().equals("myJumpers::RowDelete")).findFirst().orElseThrow(); + assertTrue(myJumpersRowDelete.getActionDefinition().getIsRowDeleteAction()); + assertButtonVisuals(myJumpersRowDelete, "Delete", "delete_forever", "contained"); + assertEquals(myJumpersRowDeleteAction.getActionDefinition(), myJumpersRowDelete.getActionDefinition()); + } + + @Test + void testRelatedFormCRUD() throws Exception { + jslModel = JslParser.getModelFromStrings("RelatedFormCRUD", List.of(createModelString("RelatedFormCRUD"))); + + transform(); + + List apps = uiModelWrapper.getStreamOfUiApplication().toList(); + + Application application = apps.get(0); + List pages = application.getPages(); + + PageDefinition pageDefinition = pages.stream().filter(p -> p.getName().equals("RelatedFormCRUD::UserView::level::related::FormPage")).findFirst().orElseThrow(); + PageContainer pageContainer = pageDefinition.getContainer(); + List
tables = application.getTables(); -// List pages = application.getPages(); -// -// assertEquals(6, classTypes.size()); -// assertEquals(2, links.size()); -// assertEquals(2, tables.size()); -// assertEquals(6, pages.size()); -// assertEquals(7, relationTypes.size()); -// -// ClassType relatedRowClassType = classTypes.stream().filter(c -> c.getName().equals("NavigationTestModel::RelatedRow::ClassType")).findFirst().orElseThrow(); -// ClassType relatedViewClassType = classTypes.stream().filter(c -> c.getName().equals("NavigationTestModel::RelatedView::ClassType")).findFirst().orElseThrow(); -// ClassType jumperRowClassType = classTypes.stream().filter(c -> c.getName().equals("NavigationTestModel::JumperRow::ClassType")).findFirst().orElseThrow(); -// ClassType jumperViewClassType = classTypes.stream().filter(c -> c.getName().equals("NavigationTestModel::JumperView::ClassType")).findFirst().orElseThrow(); -// -// RelationType detailRelation = (RelationType) application.getRelationTypes().stream().filter(r -> ((RelationType) r).getName().equals("detail")).findFirst().orElseThrow(); -// RelationType jumperRowDetailRelation = (RelationType) application.getRelationTypes().stream().filter(r -> ((RelationType) r).getName().equals("jumperRowDetail")).findFirst().orElseThrow(); -// -// // Relations -// -// assertEquals(Set.of( -// "NavigationActor::Application::NavigationTestModel::JumperRow::ClassType::jumperRowDetail", -// "NavigationActor::Application::NavigationTestModel::NavigationActor::ClassType::user", -// "NavigationActor::Application::NavigationTestModel::RelatedRow::ClassType::detail", -// "NavigationActor::Application::NavigationTestModel::RelatedView::ClassType::myJumper", -// "NavigationActor::Application::NavigationTestModel::RelatedView::ClassType::myJumpers", -// "NavigationActor::Application::NavigationTestModel::UserView::ClassType::related", -// "NavigationActor::Application::NavigationTestModel::UserView::ClassType::relatedCollection" -// ), relationTypes.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); -// -// // Tables -// -// // - relatedCollection -// -// Table relatedCollectionTable = tables.stream().filter(t -> t.getName().equals("relatedCollection")).findFirst().orElseThrow(); -// -// List
tables = application.getTables(); + List pages = application.getPages(); + + assertEquals(Set.of( + "NavigationActor::NavigationTestModel::RelatedTransfer", + "NavigationActor::NavigationTestModel::JumperTransfer", + "NavigationActor::NavigationTestModel::UserTransfer", + "NavigationActor::NavigationTestModel::NavigationActor" + ), classTypes.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + assertEquals(Set.of( + "NavigationActor::NavigationTestModel::NavigationApp::DashboardPage", + "NavigationActor::NavigationTestModel::NavigationApp::user::AccessViewPage", + "NavigationActor::NavigationTestModel::UserView::level1::relatedCollection::ViewPage", + "NavigationActor::NavigationTestModel::UserView::level1::related::ViewPage", + "NavigationActor::NavigationTestModel::RelatedView::myJumpers::ViewPage", + "NavigationActor::NavigationTestModel::RelatedView::myJumper::ViewPage" + ), pages.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + ClassType relatedTransferClassType = classTypes.stream().filter(c -> c.getName().equals("NavigationTestModel::RelatedTransfer")).findFirst().orElseThrow(); + ClassType jumperTransferClassType = classTypes.stream().filter(c -> c.getName().equals("NavigationTestModel::JumperTransfer")).findFirst().orElseThrow(); + + // Relations + + assertEquals(Set.of( + "NavigationActor::NavigationTestModel::RelatedTransfer::theJumper", + "NavigationActor::NavigationTestModel::RelatedTransfer::theJumpersCollection", + "NavigationActor::NavigationTestModel::UserTransfer::related", + "NavigationActor::NavigationTestModel::UserTransfer::relatedCollection", + "NavigationActor::NavigationTestModel::NavigationActor::user" + ), relationTypes.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + // Tables + + assertEquals(Set.of( + "NavigationActor::NavigationTestModel::RelatedView::View::PageContainer::RelatedView::myJumpers", + "NavigationActor::NavigationTestModel::UserView::View::PageContainer::UserView::level1::relatedCollection", + "NavigationActor::NavigationTestModel::JumperTable::Table::PageContainer::JumperTable::JumperTable::Table", + "NavigationActor::NavigationTestModel::RelatedTable::Table::PageContainer::RelatedTable::RelatedTable::Table" + ), tables.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + // - relatedCollection + + Table relatedCollectionTable = tables.stream().filter(t -> t.getName().equals("relatedCollection")).findFirst().orElseThrow(); + + List
tables = application.getTables(); -// -// // Links -// -// assertEquals(2 , links.size()); -// -// ClassType relatedViewClassType = classTypes.stream().filter(c -> c.getName().equals("RelationWidgetsTestModel::RelatedView::ClassType")).findFirst().orElseThrow(); -// -// Link related = links.stream().filter(l -> l.getName().equals("related")).findFirst().orElseThrow(); -// RelationType relatedRelation = (RelationType) related.getDataElement(); -// -// assertEquals("Related", related.getLabel()); -// assertEquals("related", related.getIcon().getIconName()); -// assertEquals("related", related.getRelationName()); -// assertTrue(related.isIsEager()); -// assertEquals("related", relatedRelation.getName()); -// assertEquals(relatedViewClassType, relatedRelation.getTarget()); -// -// Link relatedAssociation = links.stream().filter(l -> l.getName().equals("relatedAssociation")).findFirst().orElseThrow(); -// RelationType relatedAssociationAttribute = (RelationType) relatedAssociation.getDataElement(); -// -// assertEquals("Related Association", relatedAssociation.getLabel()); -// assertEquals("related-association", relatedAssociation.getIcon().getIconName()); -// assertEquals("relatedAssociation", relatedAssociation.getRelationName()); -// assertFalse(relatedAssociation.isIsEager()); -// assertEquals("relatedAssociation", relatedAssociationAttribute.getName()); -// assertEquals(relatedViewClassType, relatedAssociationAttribute.getTarget()); -// -// // Tables -// -// assertEquals(4 , tables.size()); -// -// Table table = tables.stream().filter(t -> t.getName().equals("relatedCollection")).findFirst().orElseThrow(); -// RelationType tableRelation = (RelationType) table.getDataElement(); -// ClassType relatedRowClassType = classTypes.stream().filter(c -> c.getName().equals("RelationWidgetsTestModel::RelatedRow::ClassType")).findFirst().orElseThrow(); -// -// assertEquals("Related Collection", table.getLabel()); -// assertEquals(12, table.getCol()); -// assertEquals("relatedCollection", table.getRelationName()); -// assertEquals("relatedCollection", tableRelation.getName()); -// assertEquals(relatedRowClassType, tableRelation.getTarget()); -// -// Table relatedCollectionAddSelector = tables.stream().filter(t -> t.getName().equals("relatedCollection::Add::Selector")).findFirst().orElseThrow(); -// assertTrue(relatedCollectionAddSelector.getDataElement() instanceof ClassType); -// -// assertEquals("Related Collection", relatedCollectionAddSelector.getLabel()); -// assertEquals(12, relatedCollectionAddSelector.getCol()); -// assertEquals("relatedCollection", relatedCollectionAddSelector.getRelationName()); -// -// Table relatedSetSelector = tables.stream().filter(t -> t.getName().equals("related::Set::Selector")).findFirst().orElseThrow(); -// assertTrue(relatedSetSelector.getDataElement() instanceof ClassType); -// -// assertEquals("Related", relatedSetSelector.getLabel()); -// assertEquals(12, relatedSetSelector.getCol()); -// assertEquals("related", relatedSetSelector.getRelationName()); -// -// Table relatedAssociationSetSelector = tables.stream().filter(t -> t.getName().equals("relatedAssociation::Set::Selector")).findFirst().orElseThrow(); -// assertTrue(relatedAssociationSetSelector.getDataElement() instanceof ClassType); -// -// assertEquals("Related Association", relatedAssociationSetSelector.getLabel()); -// assertEquals(12, relatedAssociationSetSelector.getCol()); -// assertEquals("relatedAssociation", relatedAssociationSetSelector.getRelationName()); -// -// // Columns -// -// List columns = table.getColumns(); -// -// assertEquals(3, columns.size()); -// -// Column firstColumn = columns.stream().filter(c -> c.getName().equals("first")).findFirst().orElseThrow(); -// AttributeType firstAttribute = relatedRowClassType.getAttributes().stream().filter(a -> a.getName().equals("first")).findFirst().orElseThrow(); -// Column secondColumn = columns.stream().filter(c -> c.getName().equals("second")).findFirst().orElseThrow(); -// AttributeType secondAttribute = relatedRowClassType.getAttributes().stream().filter(a -> a.getName().equals("second")).findFirst().orElseThrow(); -// Column nonDetailLinkColumn = columns.stream().filter(c -> c.getName().equals("nonDetailLink")).findFirst().orElseThrow(); -// AttributeType nonDetailLinkAttribute = relatedRowClassType.getAttributes().stream().filter(a -> a.getName().equals("_text_nonDetailLink")).findFirst().orElseThrow(); -// RelationType nonDetailLinkRepresentsRelation = relatedRowClassType.getRelations().stream().filter(a -> a.getName().equals("nonDetailLink")).findFirst().orElseThrow(); -// -// assertEquals("First", firstColumn.getLabel()); -// assertEquals("%s", firstColumn.getFormat()); -// assertEquals("120", firstColumn.getWidth()); -// assertEquals(firstAttribute, firstColumn.getAttributeType()); -// assertTrue(firstAttribute.getIsMemberTypeDerived()); -// assertTrue(firstAttribute.isIsFilterable()); -// assertEquals("String", firstAttribute.getDataType().getName()); -// -// assertEquals("Second", secondColumn.getLabel()); -// assertEquals("%s", secondColumn.getFormat()); -// assertEquals("120", secondColumn.getWidth()); -// assertEquals(secondAttribute, secondColumn.getAttributeType()); -// assertTrue(secondAttribute.getIsMemberTypeDerived()); -// assertTrue(secondAttribute.isIsFilterable()); -// assertEquals("Numeric", secondAttribute.getDataType().getName()); -// -// assertEquals("Non Detail Link", nonDetailLinkColumn.getLabel()); -// assertEquals("%s", nonDetailLinkColumn.getFormat()); -// assertEquals("120", nonDetailLinkColumn.getWidth()); -// assertEquals(nonDetailLinkAttribute, nonDetailLinkColumn.getAttributeType()); -// assertTrue(nonDetailLinkAttribute.getIsMemberTypeDerived()); -// assertTrue(nonDetailLinkAttribute.isIsFilterable()); -// assertEquals("String", nonDetailLinkAttribute.getDataType().getName()); -// assertEquals(nonDetailLinkRepresentsRelation, nonDetailLinkColumn.getRepresentsRelation()); -// assertEquals(relatedViewClassType, nonDetailLinkRepresentsRelation.getTarget()); -// -// List relatedAddSelectorColumns = relatedCollectionAddSelector.getColumns(); -// assertEquals(List.of("First", "Second", "Non Detail Link"), relatedAddSelectorColumns.stream().map(LabeledElement::getLabel).toList()); -// assertEquals(List.of("first", "second", "_text_nonDetailLink"), relatedAddSelectorColumns.stream().map(c -> c.getAttributeType().getName()).toList()); -// assertEquals(List.of("String", "Numeric", "String"), relatedAddSelectorColumns.stream().map(c -> c.getAttributeType().getDataType().getName()).toList()); -// -// List relatedSetSelectorColumns = relatedSetSelector.getColumns(); -// assertEquals(List.of("First", "Second"), relatedSetSelectorColumns.stream().map(LabeledElement::getLabel).toList()); -// assertEquals(List.of("first", "second"), relatedSetSelectorColumns.stream().map(c -> c.getAttributeType().getName()).toList()); -// assertEquals(List.of("String", "Numeric"), relatedSetSelectorColumns.stream().map(c -> c.getAttributeType().getDataType().getName()).toList()); -// -// List relatedAssociationSetSelectorColumns = relatedSetSelector.getColumns(); -// assertEquals(List.of("First", "Second"), relatedAssociationSetSelectorColumns.stream().map(LabeledElement::getLabel).toList()); -// assertEquals(List.of("first", "second"), relatedAssociationSetSelectorColumns.stream().map(c -> c.getAttributeType().getName()).toList()); -// assertEquals(List.of("String", "Numeric"), relatedAssociationSetSelectorColumns.stream().map(c -> c.getAttributeType().getDataType().getName()).toList()); -// -// // Filters -// -// List filters = table.getFilters(); -// -// assertEquals(3, filters.size()); -// -// Filter firstFilter = filters.stream().filter(c -> c.getName().equals("firstFilter")).findFirst().orElseThrow(); -// Filter secondFilter = filters.stream().filter(c -> c.getName().equals("secondFilter")).findFirst().orElseThrow(); -// Filter nonDetailLinkFilter = filters.stream().filter(c -> c.getName().equals("nonDetailLinkFilter")).findFirst().orElseThrow(); -// -// assertEquals("First", firstFilter.getLabel()); -// assertEquals(firstAttribute, firstFilter.getAttributeType()); -// -// assertEquals("Second", secondFilter.getLabel()); -// assertEquals(secondAttribute, secondFilter.getAttributeType()); -// -// assertEquals("Non Detail Link", nonDetailLinkFilter.getLabel()); -// assertEquals(nonDetailLinkAttribute, nonDetailLinkFilter.getAttributeType()); -// -// List relatedAddSelectorFilters = relatedCollectionAddSelector.getFilters(); -// -// assertEquals(List.of("First", "Second", "Non Detail Link"), relatedAddSelectorFilters.stream().map(LabeledElement::getLabel).toList()); -// assertEquals(List.of("first", "second", "_text_nonDetailLink"), relatedAddSelectorFilters.stream().map(c -> c.getAttributeType().getName()).toList()); -// assertEquals(List.of("String", "Numeric", "String"), relatedAddSelectorFilters.stream().map(c -> c.getAttributeType().getDataType().getName()).toList()); -// assertEquals(List.of(true, true, true), relatedAddSelectorFilters.stream().map(c -> c.getAttributeType().isIsFilterable()).toList()); -// -// List relatedSetSelectorFilters = relatedSetSelector.getFilters(); -// -// assertEquals(List.of("First", "Second"), relatedSetSelectorFilters.stream().map(LabeledElement::getLabel).toList()); -// assertEquals(List.of("first", "second"), relatedSetSelectorFilters.stream().map(c -> c.getAttributeType().getName()).toList()); -// assertEquals(List.of("String", "Numeric"), relatedSetSelectorFilters.stream().map(c -> c.getAttributeType().getDataType().getName()).toList()); -// assertEquals(List.of(true, true), relatedSetSelectorFilters.stream().map(c -> c.getAttributeType().isIsFilterable()).toList()); -// -// List relatedAssociationSetSelectorFilters = relatedAssociationSetSelector.getFilters(); -// -// assertEquals(List.of("First", "Second"), relatedAssociationSetSelectorFilters.stream().map(LabeledElement::getLabel).toList()); -// assertEquals(List.of("first", "second"), relatedAssociationSetSelectorFilters.stream().map(c -> c.getAttributeType().getName()).toList()); -// assertEquals(List.of("String", "Numeric"), relatedAssociationSetSelectorFilters.stream().map(c -> c.getAttributeType().getDataType().getName()).toList()); -// assertEquals(List.of(true, true), relatedAssociationSetSelectorFilters.stream().map(c -> c.getAttributeType().isIsFilterable()).toList()); -// } + @BeforeAll + static void prepareTestFolders() throws IOException { + if (!Files.exists(Paths.get(TARGET_TEST_CLASSES))) { + Files.createDirectories(Paths.get(TARGET_TEST_CLASSES)); + } + } + + @Test + void testBasicWidgets() throws Exception { + jslModel = JslParser.getModelFromStrings("BasicWidgetsTestModel", List.of(""" + model BasicWidgetsTestModel; + + type binary Binary max-file-size: 1MB mime-type: ["image/*"]; + type boolean Boolean; + type date Date; + type numeric Numeric scale: 0 precision: 9; + type string String min-size: 0 max-size: 255; + type time Time; + type timestamp Timestamp; + + enum MyEnum { + Atomic = 0; + Bombastic = 1; + Crazy = 2; + } + + entity User { + identifier String email required; + field Binary binary; + field String string; + field Boolean boolean; + field Date date; + field Numeric numeric; + field Time time; + field Timestamp timestamp; + field MyEnum `enum` default:MyEnum#Bombastic; + } + + transfer UserTransfer(User u) { + field String email <=> u.email required; + field Binary binary <= u.binary; + field String string <= u.string; + field Boolean boolean <= u.boolean; + field Date date <= u.date; + field Numeric numeric <= u.numeric; + field Time time <= u.time; + field Timestamp timestamp <= u.timestamp; + field MyEnum `enum` <=> u.`enum` default:MyEnum#Crazy; + + event create onCreate; + event update onUpdate; + event delete onDelete; + } + + view UserView(UserTransfer u) { + group level1 label:"Yo" icon:"text" { + group level2 width:12 frame:true icon:"unicorn" label:"Level 2" stretch:true { + widget String email <= u.email icon:"text" label: "My Email"; + widget Binary binaryDerived <= u.binary icon:"binary" label:"Binary Derived"; + widget String stringDerived <= u.string icon:"string" label:"String Derived"; + } + + group level22 width:6 frame:true icon:"dog" label:"Level 2 - 2" orientation:horizontal { + widget Boolean booleanDerived <= u.boolean icon:"boolean" label:"Boolean Derived"; + widget Date dateDerived <= u.date icon:"date" label:"Date Derived"; + widget Numeric numericDerived <= u.numeric icon:"numeric" label:"Numeric Derived"; + } + + tabs tabs0 orientation:horizontal width:6 { + group tab1 label:"Tab1" icon:"numbers" h-align:left { + widget Time timeDerived <= u.time icon:"time" label:"Time Derived"; + } + + group tab2 label:"Tab2" icon:"numbers" h-align:right { + widget Timestamp timestampDerived <= u.timestamp icon:"timestamp" label:"Timestamp Derived"; + widget MyEnum mappedEnum <= u.`enum` icon:"enum" label:"Mapped Enum"; + } + } + } + } + + form UserForm(UserTransfer u) { + widget String email <= u.email icon:"text" label: "My Email"; + group level1 label:"Yo" icon:"text" { + widget Timestamp timestampDerived <= u.timestamp icon:"timestamp" label:"Timestamp Derived"; + } + } + + actor WidgetsActor { + access UserTransfer user <= User.any() create delete update; + } + + menu WidgetsApp(WidgetsActor a) { + link UserView user <= a.user label:"User" icon:"tools" form:UserForm; + } + """)); + + transform(); + + List apps = uiModelWrapper.getStreamOfUiApplication().toList(); + + assertEquals(1, apps.size()); + + Application app = apps.get(0); + + List pageContainers = app.getPageContainers(); + + assertEquals(Set.of( + "WidgetsActor::BasicWidgetsTestModel::UserView::View::PageContainer", + "WidgetsActor::BasicWidgetsTestModel::UserForm::Create::PageContainer", + "WidgetsActor::BasicWidgetsTestModel::WidgetsApp::Dashboard" + ), pageContainers.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + PageContainer dashboard = pageContainers.stream().filter(c -> c.getName().equals("BasicWidgetsTestModel::WidgetsApp::Dashboard")).findFirst().orElseThrow(); + PageContainer userView = pageContainers.stream().filter(c -> c.getName().equals("BasicWidgetsTestModel::UserView::View::PageContainer")).findFirst().orElseThrow(); + PageContainer userForm = pageContainers.stream().filter(c -> c.getName().equals("BasicWidgetsTestModel::UserForm::Create::PageContainer")).findFirst().orElseThrow(); + + // Dashboard + assertEquals(0, dashboard.getChildren().size()); + + // User + + assertEquals(1, userView.getChildren().size()); + + // Root Flex + Flex rootFlex = (Flex) userView.getChildren().get(0); + + assertEquals("UserView", rootFlex.getName()); + assertNull(rootFlex.getLabel()); + assertEquals(12, rootFlex.getCol()); + assertEquals(Axis.VERTICAL, rootFlex.getDirection()); + assertEquals(1, rootFlex.getChildren().size()); + + // level1 + + Flex level1 = (Flex) rootFlex.getChildren().get(0); + + assertEquals("level1", level1.getName()); + assertEquals("Yo", level1.getLabel()); + assertEquals("text", level1.getIcon().getIconName()); + assertEquals(12, level1.getCol()); + assertEquals(Axis.VERTICAL, level1.getDirection()); + assertEquals(3, level1.getChildren().size()); + + // level2 + + Flex level2 = (Flex) level1.getChildren().stream().filter(c -> c.getName().equals("level2")).findFirst().orElseThrow(); + + assertEquals("level2", level2.getName()); + assertEquals("Level 2", level2.getLabel()); + assertEquals("unicorn", level2.getIcon().getIconName()); + assertEquals(12, level2.getCol()); + assertEquals(Axis.VERTICAL, level2.getDirection()); + assertNotNull(level2.getFrame()); + assertNotNull(level2.getStretch()); + assertEquals(3, level2.getChildren().size()); + + // level2 -> children + + TextInput email = (TextInput) level2.getChildren().stream().filter(c -> c.getName().equals("email")).findFirst().orElseThrow(); + + assertEquals("email", email.getName()); + assertEquals("My Email", email.getLabel()); + assertEquals("text", email.getIcon().getIconName()); + assertEquals("String", email.getAttributeType().getDataType().getName()); + assertTrue(email.getAttributeType().isIsRequired()); + assertFalse(email.getAttributeType().isIsReadOnly()); + + BinaryTypeInput binaryDerived = (BinaryTypeInput) level2.getChildren().stream().filter(c -> c.getName().equals("binaryDerived")).findFirst().orElseThrow(); + + assertEquals("binaryDerived", binaryDerived.getName()); + assertEquals("Binary Derived", binaryDerived.getLabel()); + assertEquals("binary", binaryDerived.getIcon().getIconName()); + assertEquals("Binary", binaryDerived.getAttributeType().getDataType().getName()); + assertFalse(binaryDerived.getAttributeType().isIsRequired()); + assertTrue(binaryDerived.getAttributeType().isIsReadOnly()); + + TextInput stringDerived = (TextInput) level2.getChildren().stream().filter(c -> c.getName().equals("stringDerived")).findFirst().orElseThrow(); + + assertEquals("stringDerived", stringDerived.getName()); + assertEquals("String Derived", stringDerived.getLabel()); + assertEquals("string", stringDerived.getIcon().getIconName()); + assertEquals("String", stringDerived.getAttributeType().getDataType().getName()); + assertFalse(stringDerived.getAttributeType().isIsRequired()); + assertTrue(stringDerived.getAttributeType().isIsReadOnly()); + + // level2 - 2 + + Flex level22 = (Flex) level1.getChildren().stream().filter(c -> c.getName().equals("level22")).findFirst().orElseThrow(); + + assertEquals("level22", level22.getName()); + assertEquals("Level 2 - 2", level22.getLabel()); + assertEquals("dog", level22.getIcon().getIconName()); + assertEquals(6, level22.getCol()); + assertEquals(Axis.HORIZONTAL, level22.getDirection()); + assertEquals(3, level22.getChildren().size()); + + // level2 - 2 -> children + + TrinaryLogicCombo booleanDerived = (TrinaryLogicCombo) level22.getChildren().stream().filter(c -> c.getName().equals("booleanDerived")).findFirst().orElseThrow(); + + assertEquals("booleanDerived", booleanDerived.getName()); + assertEquals("Boolean Derived", booleanDerived.getLabel()); + assertEquals("boolean", booleanDerived.getIcon().getIconName()); + assertEquals("Boolean", booleanDerived.getAttributeType().getDataType().getName()); + assertFalse(booleanDerived.getAttributeType().isIsRequired()); + assertTrue(booleanDerived.getAttributeType().isIsReadOnly()); + + DateInput dateDerived = (DateInput) level22.getChildren().stream().filter(c -> c.getName().equals("dateDerived")).findFirst().orElseThrow(); + + assertEquals("dateDerived", dateDerived.getName()); + assertEquals("Date Derived", dateDerived.getLabel()); + assertEquals("date", dateDerived.getIcon().getIconName()); + assertEquals("Date", dateDerived.getAttributeType().getDataType().getName()); + assertFalse(dateDerived.getAttributeType().isIsRequired()); + assertTrue(dateDerived.getAttributeType().isIsReadOnly()); + + NumericInput numericDerived = (NumericInput) level22.getChildren().stream().filter(c -> c.getName().equals("numericDerived")).findFirst().orElseThrow(); + + assertEquals("numericDerived", numericDerived.getName()); + assertEquals("Numeric Derived", numericDerived.getLabel()); + assertEquals("numeric", numericDerived.getIcon().getIconName()); + assertEquals("Numeric", numericDerived.getAttributeType().getDataType().getName()); + assertFalse(numericDerived.getAttributeType().isIsRequired()); + assertTrue(numericDerived.getAttributeType().isIsReadOnly()); + + // tabs 0 + + TabController tabs0 = (TabController) level1.getChildren().stream().filter(c -> c.getName().equals("tabs0")).findFirst().orElseThrow(); + + assertEquals("tabs0", tabs0.getName()); + assertEquals(6, tabs0.getCol()); + assertEquals(TabOrientation.HORIZONTAL, tabs0.getOrientation()); + assertEquals(2, tabs0.getTabs().size()); + + // tab1 + + Tab tab1 = tabs0.getTabs().stream().filter(t -> t.getName().equals("tab1")).findFirst().orElseThrow(); + Flex tab1Element = (Flex) tab1.getElement(); + + assertEquals("tab1", tab1Element.getName()); + assertEquals(12, tab1Element.getCol()); + assertEquals("Tab1", tab1Element.getLabel()); + assertEquals("numbers", tab1Element.getIcon().getIconName()); + assertEquals(Axis.VERTICAL, tab1Element.getDirection()); + assertEquals(CrossAxisAlignment.START, tab1Element.getCrossAxisAlignment()); + assertEquals(1, tab1Element.getChildren().size()); + + // tab1 -> children + + TimeInput timeDerived = (TimeInput) tab1Element.getChildren().stream().filter(c -> c.getName().equals("timeDerived")).findFirst().orElseThrow(); + + assertEquals("timeDerived", timeDerived.getName()); + assertEquals("Time Derived", timeDerived.getLabel()); + assertEquals("time", timeDerived.getIcon().getIconName()); + assertEquals("Time", timeDerived.getAttributeType().getDataType().getName()); + assertFalse(timeDerived.getAttributeType().isIsRequired()); + assertTrue(timeDerived.getAttributeType().isIsReadOnly()); + + // tab2 + + Tab tab2 = tabs0.getTabs().stream().filter(t -> t.getName().equals("tab2")).findFirst().orElseThrow(); + Flex tab2Element = (Flex) tab2.getElement(); + + assertEquals("tab2", tab2Element.getName()); + assertEquals(12, tab2Element.getCol()); + assertEquals("Tab2", tab2Element.getLabel()); + assertEquals("numbers", tab2Element.getIcon().getIconName()); + assertEquals(Axis.VERTICAL, tab2Element.getDirection()); + assertEquals(CrossAxisAlignment.END, tab2Element.getCrossAxisAlignment()); + assertEquals(2, tab2Element.getChildren().size()); + + // tab2 -> children + + DateTimeInput timestampDerived = (DateTimeInput) tab2Element.getChildren().stream().filter(c -> c.getName().equals("timestampDerived")).findFirst().orElseThrow(); + + assertEquals("timestampDerived", timestampDerived.getName()); + assertEquals("Timestamp Derived", timestampDerived.getLabel()); + assertEquals("timestamp", timestampDerived.getIcon().getIconName()); + assertEquals("Timestamp", timestampDerived.getAttributeType().getDataType().getName()); + assertFalse(timestampDerived.getAttributeType().isIsRequired()); + assertTrue(timestampDerived.getAttributeType().isIsReadOnly()); + + EnumerationCombo mappedEnum = (EnumerationCombo) tab2Element.getChildren().stream().filter(c -> c.getName().equals("mappedEnum")).findFirst().orElseThrow(); + + assertEquals("mappedEnum", mappedEnum.getName()); + assertEquals("Mapped Enum", mappedEnum.getLabel()); + assertEquals("enum", mappedEnum.getIcon().getIconName()); + assertEquals("MyEnum", mappedEnum.getAttributeType().getDataType().getName()); + assertFalse(mappedEnum.getAttributeType().isIsRequired()); + assertFalse(mappedEnum.getAttributeType().isIsReadOnly()); + + // User Form + + Flex formFlex = (Flex) userForm.getChildren().get(0); + + assertNotNull(formFlex); + + assertEquals(Set.of( + "WidgetsActor::BasicWidgetsTestModel::UserForm::Create::PageContainer::UserForm::level1", + "WidgetsActor::BasicWidgetsTestModel::UserForm::Create::PageContainer::UserForm::email" + ), formFlex.getChildren().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + VisualElement formEmail = formFlex.getChildren().get(0); + assertEquals("email", formEmail.getName()); + assertTrue(formEmail instanceof TextInput); + + VisualElement formLevel1Group = formFlex.getChildren().get(1); + assertEquals("level1", formLevel1Group.getName()); + assertTrue(formLevel1Group instanceof Flex); + + assertEquals(Set.of( + "WidgetsActor::BasicWidgetsTestModel::UserForm::Create::PageContainer::UserForm::level1::timestampDerived" + ), ((Flex) formLevel1Group).getChildren().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + VisualElement formLevel1Timestamp = ((Flex) formLevel1Group).getChildren().get(0); + assertEquals("timestampDerived", formLevel1Timestamp.getName()); + assertTrue(formLevel1Timestamp instanceof DateTimeInput); + } + + @Test + void testRelationWidgets() throws Exception { + jslModel = JslParser.getModelFromStrings("RelationWidgetsTestModel", List.of(""" + model RelationWidgetsTestModel; + + type numeric Numeric scale: 0 precision: 9; + type string String min-size: 0 max-size: 255; + + entity User { + identifier String email required; + field Numeric numeric; + field Related related; + relation Related relatedAssociation; + relation Related[] relatedCollection; + } + + entity Related { + field String first; + field Numeric second; + } + + transfer UserTransfer(User u) { + field String emailReadOnly <= u.email; + field String emailWritable <=> u.email required; + field Numeric numeric <= u.numeric; + + relation RelatedTransfer related <= u.related eager create update delete; + relation RelatedTransfer relatedAssociation <= u.relatedAssociation choices:Related.all() create update delete; + relation RelatedTransfer[] relatedCollection <= u.relatedCollection choices:Related.all() create update delete; + + event create onCreate; + event update onUpdate; + event delete onDelete; + } + + transfer RelatedTransfer(Related r) { + field String first <= r.first; + field Numeric second <= r.second; + + event create onCreate; + event update onUpdate; + event delete onDelete; + } + + table UserTable(UserTransfer u) { + column String email <= u.emailReadOnly; + } + + view UserView(UserTransfer u) { + group level1 label:"Yo" icon:"text" { + group level2 width:12 frame:true icon:"unicorn" label:"Level 2" stretch:true { + link RelatedView related <= u.related icon:"related" label:"Related" width:6 form:RelatedForm; + link RelatedView relatedAssociation <= u.relatedAssociation icon:"related-association" label:"Related Association" width:6 selector:RelatedTable form:RelatedForm; + } + + tabs tabs0 orientation:horizontal width:6 { + group tab1 label:"Tab1" icon:"numbers" h-align:left { + widget String email <= u.emailReadOnly icon:"text" label:"My Email"; + } + + group tab2 label:"Tab2" icon:"numbers" h-align:right { + table RelatedTable relatedCollection <= u.relatedCollection icon:"relatedCollection" label:"Related Collection" width:6 selector:RelatedTable view:RelatedView form:RelatedForm; + } + } + } + } + + form UserForm(UserTransfer u) { + widget String emailReadOnly <= u.emailReadOnly icon:"text" label:"Readonly Email"; + widget String emailWritable <=> u.emailWritable icon:"text" label:"Writable Email"; + group level1 label:"Yo" icon:"text" { + link RelatedView related <= u.related icon:"related" label:"Related" width:6 form:RelatedForm; + } + table RelatedTable relatedCollection <= u.relatedCollection icon:"relatedCollection" label:"Related Collection" width:6 selector:RelatedTable view:RelatedView form:RelatedForm; + } + + table RelatedTable(RelatedTransfer r) { + column String first <= r.first label:"First"; + column Numeric second <= r.second label:"Second"; + } + + view RelatedView(RelatedTransfer r) { + widget String first <= r.first label: "First"; + widget Numeric second <= r.second label: "Second"; + } + + form RelatedForm(RelatedTransfer r) { + widget String first <= r.first label: "First"; + widget Numeric second <= r.second label: "Second"; + } + + actor RelationWidgetsActor { + access UserTransfer user <= User.any() create; + access UserTransfer[] users <= User.all() create; + } + + menu RelationWidgets(RelationWidgetsActor a) { + link UserView user <= a.user label:"User" icon:"tools"; + table UserTable users <= a.users label:"Users" icon:"tools" form:UserForm; + } + """)); + + transform(); + + List apps = uiModelWrapper.getStreamOfUiApplication().toList(); + + assertEquals(1, apps.size()); + + Application application = apps.get(0); + + List classTypes = application.getClassTypes(); + List links = application.getLinks(); + List
tables = application.getTables(); + List pages = application.getPages(); + + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserTransfer", + "RelationWidgetsActor::RelationWidgetsTestModel::RelatedTransfer", + "RelationWidgetsActor::RelationWidgetsTestModel::RelationWidgetsActor" + ), classTypes.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + assertEquals(Set.of( + "RelationWidgetsTestModel::RelationWidgets::user::AccessViewPage", + "RelationWidgetsTestModel::UserForm::relatedCollection::ViewPage", + "RelationWidgetsTestModel::UserForm::relatedCollection::FormPage", + "RelationWidgetsTestModel::UserForm::level1::related::FormPage", + "RelationWidgetsTestModel::UserForm::level1::related::ViewPage", + "RelationWidgetsTestModel::UserView::level1::level2::related::ViewPage", + "RelationWidgetsTestModel::UserView::level1::level2::related::FormPage", + "RelationWidgetsTestModel::UserView::level1::level2::relatedAssociation::FormPage", + "RelationWidgetsTestModel::UserView::level1::level2::relatedAssociation::ViewPage", + "RelationWidgetsTestModel::UserView::level1::level2::relatedAssociation::SetSelectorPage", + "RelationWidgetsTestModel::UserView::level1::tabs0::tab2::relatedCollection::FormPage", + "RelationWidgetsTestModel::UserView::level1::tabs0::tab2::relatedCollection::AddSelectorPage", + "RelationWidgetsTestModel::UserView::level1::tabs0::tab2::relatedCollection::ViewPage", + "RelationWidgetsTestModel::RelationWidgets::users::AccessTablePage", + "RelationWidgetsTestModel::RelationWidgets::users::AccessFormPage", + "RelationWidgetsTestModel::RelationWidgets::DashboardPage" + ), pages.stream().map(PageDefinition::getName).collect(Collectors.toSet())); + + // Links + + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::level1::related", + "RelationWidgetsActor::RelationWidgetsTestModel::UserView::View::PageContainer::UserView::level1::level2::related", + "RelationWidgetsActor::RelationWidgetsTestModel::UserView::View::PageContainer::UserView::level1::level2::relatedAssociation" + ), links.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + ClassType relatedViewClassType = classTypes.stream().filter(c -> c.getName().equals("RelationWidgetsTestModel::RelatedTransfer")).findFirst().orElseThrow(); + + Link related = links.stream().filter(l -> l.getName().equals("related")).findFirst().orElseThrow(); + RelationType relatedRelation = (RelationType) related.getDataElement(); + + assertEquals("Related", related.getLabel()); + assertEquals("related", related.getIcon().getIconName()); + assertEquals("related", related.getRelationName()); + assertTrue(related.isIsEager()); + assertEquals("related", relatedRelation.getName()); + assertEquals(relatedViewClassType, relatedRelation.getTarget()); + + Link relatedAssociation = links.stream().filter(l -> l.getName().equals("relatedAssociation")).findFirst().orElseThrow(); + RelationType relatedAssociationAttribute = (RelationType) relatedAssociation.getDataElement(); + + assertEquals("Related Association", relatedAssociation.getLabel()); + assertEquals("related-association", relatedAssociation.getIcon().getIconName()); + assertEquals("relatedAssociation", relatedAssociation.getRelationName()); + assertFalse(relatedAssociation.isIsEager()); + assertEquals("relatedAssociation", relatedAssociationAttribute.getName()); + assertEquals(relatedViewClassType, relatedAssociationAttribute.getTarget()); + + // Tables + + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserTable::Table::PageContainer::UserTable::UserTable::Table", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection", + "RelationWidgetsActor::RelationWidgetsTestModel::UserView::level1::level2::relatedAssociation::SetSelector::PageContainer::relatedAssociation::relatedAssociation::Set::Selector", + "RelationWidgetsActor::RelationWidgetsTestModel::RelatedTable::Table::PageContainer::RelatedTable::RelatedTable::Table", + "RelationWidgetsActor::RelationWidgetsTestModel::UserView::level1::tabs0::tab2::relatedCollection::AddSelector::PageContainer::relatedCollection::relatedCollection::Add::Selector", + "RelationWidgetsActor::RelationWidgetsTestModel::UserView::View::PageContainer::UserView::level1::tabs0::tab2::tab2::relatedCollection" + ), tables.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + PageDefinition userView = application.getPages().stream().filter(p -> p.getName().equals("RelationWidgetsTestModel::RelationWidgets::user::AccessViewPage")).findFirst().orElseThrow(); + + Table userViewTable = ((Collection
) userView.getContainer().getTables()).stream().filter(t -> t.getName().equals("relatedCollection")).findFirst().orElseThrow(); + RelationType tableRelation = (RelationType) userViewTable.getDataElement(); + ClassType relatedRowClassType = classTypes.stream().filter(c -> c.getName().equals("RelationWidgetsTestModel::RelatedTransfer")).findFirst().orElseThrow(); + + assertEquals("Related Collection", userViewTable.getLabel()); + assertEquals(12, userViewTable.getCol()); + assertEquals("relatedCollection", userViewTable.getRelationName()); + assertEquals("relatedCollection", tableRelation.getName()); + assertEquals(relatedRowClassType, tableRelation.getTarget()); + + Table relatedCollectionAddSelector = tables.stream().filter(t -> t.getName().equals("relatedCollection::Add::Selector")).findFirst().orElseThrow(); + assertTrue(relatedCollectionAddSelector.getDataElement() instanceof ClassType); + + assertEquals("Related Collection", relatedCollectionAddSelector.getLabel()); + assertEquals(12, relatedCollectionAddSelector.getCol()); + assertEquals("relatedCollection", relatedCollectionAddSelector.getRelationName()); + + Table relatedAssociationSetSelector = tables.stream().filter(t -> t.getName().equals("relatedAssociation::Set::Selector")).findFirst().orElseThrow(); + assertTrue(relatedAssociationSetSelector.getDataElement() instanceof ClassType); + + assertEquals("Related Association", relatedAssociationSetSelector.getLabel()); + assertEquals(12, relatedAssociationSetSelector.getCol()); + assertEquals("relatedAssociation", relatedAssociationSetSelector.getRelationName()); + + // Columns + + List columns = userViewTable.getColumns(); + + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserView::View::PageContainer::UserView::level1::tabs0::tab2::tab2::relatedCollection::second", + "RelationWidgetsActor::RelationWidgetsTestModel::UserView::View::PageContainer::UserView::level1::tabs0::tab2::tab2::relatedCollection::first" + ), columns.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + + Column firstColumn = columns.stream().filter(c -> c.getName().equals("first")).findFirst().orElseThrow(); + AttributeType firstAttribute = relatedRowClassType.getAttributes().stream().filter(a -> a.getName().equals("first")).findFirst().orElseThrow(); + Column secondColumn = columns.stream().filter(c -> c.getName().equals("second")).findFirst().orElseThrow(); + AttributeType secondAttribute = relatedRowClassType.getAttributes().stream().filter(a -> a.getName().equals("second")).findFirst().orElseThrow(); + + assertEquals("First", firstColumn.getLabel()); + assertEquals("%s", firstColumn.getFormat()); + assertEquals("120", firstColumn.getWidth()); + assertEquals(firstAttribute, firstColumn.getAttributeType()); + assertTrue(firstAttribute.getIsMemberTypeDerived()); + assertTrue(firstAttribute.isIsFilterable()); + assertEquals("String", firstAttribute.getDataType().getName()); + + assertEquals("Second", secondColumn.getLabel()); + assertEquals("%s", secondColumn.getFormat()); + assertEquals("120", secondColumn.getWidth()); + assertEquals(secondAttribute, secondColumn.getAttributeType()); + assertTrue(secondAttribute.getIsMemberTypeDerived()); + assertTrue(secondAttribute.isIsFilterable()); + assertEquals("Numeric", secondAttribute.getDataType().getName()); + + List relatedAddSelectorColumns = relatedCollectionAddSelector.getColumns(); + assertEquals(List.of("First", "Second"), relatedAddSelectorColumns.stream().map(LabeledElement::getLabel).toList()); + assertEquals(List.of("first", "second"), relatedAddSelectorColumns.stream().map(c -> c.getAttributeType().getName()).toList()); + assertEquals(List.of("String", "Numeric"), relatedAddSelectorColumns.stream().map(c -> c.getAttributeType().getDataType().getName()).toList()); + + // Filters + + List filters = userViewTable.getFilters(); + + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserView::View::PageContainer::UserView::level1::tabs0::tab2::tab2::relatedCollection::firstFilter", + "RelationWidgetsActor::RelationWidgetsTestModel::UserView::View::PageContainer::UserView::level1::tabs0::tab2::tab2::relatedCollection::secondFilter" + ), filters.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Filter firstFilter = filters.stream().filter(c -> c.getName().equals("firstFilter")).findFirst().orElseThrow(); + Filter secondFilter = filters.stream().filter(c -> c.getName().equals("secondFilter")).findFirst().orElseThrow(); + + assertEquals("First", firstFilter.getLabel()); + assertEquals(firstAttribute, firstFilter.getAttributeType()); + + assertEquals("Second", secondFilter.getLabel()); + assertEquals(secondAttribute, secondFilter.getAttributeType()); + + List relatedAddSelectorFilters = relatedCollectionAddSelector.getFilters(); + + assertEquals(List.of("First", "Second"), relatedAddSelectorFilters.stream().map(LabeledElement::getLabel).toList()); + assertEquals(List.of("first", "second"), relatedAddSelectorFilters.stream().map(c -> c.getAttributeType().getName()).toList()); + assertEquals(List.of("String", "Numeric"), relatedAddSelectorFilters.stream().map(c -> c.getAttributeType().getDataType().getName()).toList()); + assertEquals(List.of(true, true), relatedAddSelectorFilters.stream().map(c -> c.getAttributeType().isIsFilterable()).toList()); + + List relatedAssociationSetSelectorFilters = relatedAssociationSetSelector.getFilters(); + + assertEquals(List.of("First", "Second"), relatedAssociationSetSelectorFilters.stream().map(LabeledElement::getLabel).toList()); + assertEquals(List.of("first", "second"), relatedAssociationSetSelectorFilters.stream().map(c -> c.getAttributeType().getName()).toList()); + assertEquals(List.of("String", "Numeric"), relatedAssociationSetSelectorFilters.stream().map(c -> c.getAttributeType().getDataType().getName()).toList()); + assertEquals(List.of(true, true), relatedAssociationSetSelectorFilters.stream().map(c -> c.getAttributeType().isIsFilterable()).toList()); + + // User Form + + PageDefinition usersForm = application.getPages().stream().filter(p -> p.getName().equals("RelationWidgetsTestModel::RelationWidgets::users::AccessFormPage")).findFirst().orElseThrow(); + + List formChildren = ((Flex) usersForm.getContainer().getChildren().get(0)).getChildren(); + + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::emailReadOnly", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::emailWritable", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::level1", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection" + ), formChildren.stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + // primitives + + TextInput formEmailReadonly = (TextInput) formChildren.get(0); + assertEquals("emailReadOnly", formEmailReadonly.getName()); + assertEquals("Readonly Email", formEmailReadonly.getLabel()); + assertEquals("text", formEmailReadonly.getIcon().getIconName()); + assertTrue(formEmailReadonly.isIsReadOnly()); + + TextInput formEmailWritable = (TextInput) formChildren.get(1); + assertEquals("emailWritable", formEmailWritable.getName()); + assertEquals("Writable Email", formEmailWritable.getLabel()); + assertEquals("text", formEmailWritable.getIcon().getIconName()); + assertFalse(formEmailWritable.isIsReadOnly()); + + // group level1 + + Flex formLevel1 = (Flex) formChildren.get(2); + assertEquals("level1", formLevel1.getName()); + assertEquals("Yo", formLevel1.getLabel()); + assertEquals("text", formLevel1.getIcon().getIconName()); + + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::level1::related" + ), formLevel1.getChildren().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Link formLevel1Related = (Link) formLevel1.getChildren().get(0); + assertEquals("related", formLevel1Related.getName()); + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::level1::related::related::Actions::related::Delete", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::level1::related::related::Actions::related::View", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::level1::related::related::Actions::related::Create::Open" + ), formLevel1Related.getActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button userFormRelatedView = formLevel1Related.getActionButtonGroup().getButtons().get(0); + assertEquals("related::View", userFormRelatedView.getName()); + assertEquals("View", userFormRelatedView.getLabel()); + assertEquals("contained", userFormRelatedView.getButtonStyle()); + assertTrue(userFormRelatedView.getActionDefinition().getIsOpenPageAction()); + + Button userFormRelatedCreateOpen = formLevel1Related.getActionButtonGroup().getButtons().get(1); + assertEquals("related::Create::Open", userFormRelatedCreateOpen.getName()); + assertEquals("Create", userFormRelatedCreateOpen.getLabel()); + assertEquals("contained", userFormRelatedCreateOpen.getButtonStyle()); + assertTrue(userFormRelatedCreateOpen.getActionDefinition().getIsOpenCreateFormAction()); + + Button userFormRelatedDelete = formLevel1Related.getActionButtonGroup().getButtons().get(2); + assertEquals("related::Delete", userFormRelatedDelete.getName()); + assertEquals("Delete", userFormRelatedDelete.getLabel()); + assertEquals("contained", userFormRelatedDelete.getButtonStyle()); + assertTrue(userFormRelatedDelete.getActionDefinition().getIsRowDeleteAction()); + + // table + + Table formRelatedCollection = (Table) formChildren.get(3); + assertEquals("relatedCollection", formRelatedCollection.getName()); + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::first", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::second" + ), formRelatedCollection.getColumns().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::firstFilter", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::secondFilter" + ), formRelatedCollection.getFilters().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::relatedCollection::InlineViewTableButtonGroup::relatedCollection::Clear", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::relatedCollection::InlineViewTableButtonGroup::relatedCollection::OpenAddSelector", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::relatedCollection::InlineViewTableButtonGroup::relatedCollection::Refresh", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::relatedCollection::InlineViewTableButtonGroup::relatedCollection::BulkRemove", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::relatedCollection::InlineViewTableButtonGroup::relatedCollection::Filter", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::relatedCollection::InlineViewTableButtonGroup::relatedCollection::OpenCreate" + ), formRelatedCollection.getTableActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button formRelatedCollectionFilter = formRelatedCollection.getTableActionButtonGroup().getButtons().get(0); + assertEquals("relatedCollection::Filter", formRelatedCollectionFilter.getName()); + assertEquals("Filter", formRelatedCollectionFilter.getLabel()); + assertEquals("text", formRelatedCollectionFilter.getButtonStyle()); + assertTrue(formRelatedCollectionFilter.getActionDefinition().getIsFilterAction()); + + Button formRelatedCollectionRefresh = formRelatedCollection.getTableActionButtonGroup().getButtons().get(1); + assertEquals("relatedCollection::Refresh", formRelatedCollectionRefresh.getName()); + assertEquals("Refresh", formRelatedCollectionRefresh.getLabel()); + assertEquals("text", formRelatedCollectionRefresh.getButtonStyle()); + assertTrue(formRelatedCollectionRefresh.getActionDefinition().getIsRefreshAction()); + + Button formRelatedCollectionOpenCreate = formRelatedCollection.getTableActionButtonGroup().getButtons().get(2); + assertEquals("relatedCollection::OpenCreate", formRelatedCollectionOpenCreate.getName()); + assertEquals("Create", formRelatedCollectionOpenCreate.getLabel()); + assertEquals("text", formRelatedCollectionOpenCreate.getButtonStyle()); + assertTrue(formRelatedCollectionOpenCreate.getActionDefinition().getIsOpenCreateFormAction()); + + Button formRelatedCollectionOpenAddSelector = formRelatedCollection.getTableActionButtonGroup().getButtons().get(3); + assertEquals("relatedCollection::OpenAddSelector", formRelatedCollectionOpenAddSelector.getName()); + assertEquals("Add", formRelatedCollectionOpenAddSelector.getLabel()); + assertEquals("text", formRelatedCollectionOpenAddSelector.getButtonStyle()); + assertTrue(formRelatedCollectionOpenAddSelector.getActionDefinition().getIsOpenAddSelectorAction()); + + Button formRelatedCollectionClear = formRelatedCollection.getTableActionButtonGroup().getButtons().get(4); + assertEquals("relatedCollection::Clear", formRelatedCollectionClear.getName()); + assertEquals("Clear", formRelatedCollectionClear.getLabel()); + assertEquals("text", formRelatedCollectionClear.getButtonStyle()); + assertTrue(formRelatedCollectionClear.getActionDefinition().getIsClearAction()); + + Button formRelatedCollectionBulkRemove = formRelatedCollection.getTableActionButtonGroup().getButtons().get(5); + assertEquals("relatedCollection::BulkRemove", formRelatedCollectionBulkRemove.getName()); + assertEquals("Remove", formRelatedCollectionBulkRemove.getLabel()); + assertEquals("text", formRelatedCollectionBulkRemove.getButtonStyle()); + assertTrue(formRelatedCollectionBulkRemove.getActionDefinition().getIsBulkRemoveAction()); + + assertEquals(Set.of( + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::relatedCollectionInlineViewTableRowButtonGroup::relatedCollection::RowDelete", + "RelationWidgetsActor::RelationWidgetsTestModel::UserForm::Create::PageContainer::UserForm::relatedCollection::relatedCollectionInlineViewTableRowButtonGroup::relatedCollection::View" + ), formRelatedCollection.getRowActionButtonGroup().getButtons().stream().map(NamedElement::getFQName).collect(Collectors.toSet())); + + Button formRelatedCollectionRowView = formRelatedCollection.getRowActionButtonGroup().getButtons().get(0); + assertEquals("relatedCollection::View", formRelatedCollectionRowView.getName()); + assertEquals("View", formRelatedCollectionRowView.getLabel()); + assertEquals("contained", formRelatedCollectionRowView.getButtonStyle()); + assertTrue(formRelatedCollectionRowView.getActionDefinition().getIsOpenPageAction()); + + Button formRelatedCollectionRowDelete = formRelatedCollection.getRowActionButtonGroup().getButtons().get(1); + assertEquals("relatedCollection::RowDelete", formRelatedCollectionRowDelete.getName()); + assertEquals("Delete", formRelatedCollectionRowDelete.getLabel()); + assertEquals("contained", formRelatedCollectionRowDelete.getButtonStyle()); + assertTrue(formRelatedCollectionRowDelete.getActionDefinition().getIsRowDeleteAction()); + } } diff --git a/pom.xml b/pom.xml index 38e5621a..3bdcf5c7 100644 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ 3.3.0 - 1.0.3.20240924_131227_3d1a936c_develop + 1.0.3.20240925_122018_18faac23_develop 1.0.2.20240612_080018_05e004e9_develop 1.0.4.20240410_091349_e488ea5d_develop 1.1.0.20240924_131344_9b264a1d_develop