platform issueshttps://gitlab.simantics.org/simantics/platform/-/issues2024-03-26T14:42:15Zhttps://gitlab.simantics.org/simantics/platform/-/issues/1100Removing a model containing a diagram that is open in an editor does not clos...2024-03-26T14:42:15ZTuukka LehtonenRemoving a model containing a diagram that is open in an editor does not close the diagram editor1. A model with a diagram exists in the database and the diagram is open in the standard diagram editor
2. The user deletes the model
Expected result:
The editor is automatically closed, regardless of how the model is technically remov...1. A model with a diagram exists in the database and the diagram is open in the standard diagram editor
2. The user deletes the model
Expected result:
The editor is automatically closed, regardless of how the model is technically removed.
What happens:
The diagram editor confusingly stays open for the diagram that has been moved into the trash bin.
By default the implementation is `TrashBinRemover` which only moves the model into the trash bin. This still keeps a valid URI for the model.
The editor's input validator only checks if the diagram still has a valid URI or not.
----
Possible fixes:
1. Change [TrashBinRemover](https://gitlab.simantics.org/simantics/platform/-/blob/ce692db4f99b7404f4e80b0b43b4364c6fc9cf60/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/adapter/impl/TrashBinRemover.java) to remove `L0.HasName` from the removed entity to avoid giving it a valid URI. The name can be moved to `L0.HasLabel` if the entity does not already have `L0.HasLabel`.
* Does this cause problems for the trash bin emptying domain resolution logic or not?
* Doesn't look like that ATM
* This will also cause Variables to go invalid which is kind of a good thing since we don't want for data in the trashbin to actually look like it still works.
2. Other ideas?1.60.0Antti VillbergAntti Villberghttps://gitlab.simantics.org/simantics/platform/-/issues/1096Model PDF export creates empty diagram-sized pages in PDF when diagrams are e...2024-03-18T13:05:14ZTuukka LehtonenModel PDF export creates empty diagram-sized pages in PDF when diagrams are excluded and documentation included in the exportThe code in [DiagramPainter](https://gitlab.simantics.org/simantics/platform/-/blob/5fb3e7b1db0b6aa2d21f5bb055f24f16555c4c3b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/pdf/DiagramPrinter.java#L224-227) will always ad...The code in [DiagramPainter](https://gitlab.simantics.org/simantics/platform/-/blob/5fb3e7b1db0b6aa2d21f5bb055f24f16555c4c3b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/pdf/DiagramPrinter.java#L224-227) will always add a new page for every provided diagram (Node) after at least one page is exported into the PDF. This will happen regardless of whether `includeDiagrams` is `true` or `false`. When `includeDiagrams = false` those added pages will stay empty and the documentation printing will start a new page to contain the documentation.
The empty diagram pages should not be added at all when diagrams are not included in the print.1.60.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1092Chart-related subscription history data access and sampling optimization2024-03-08T23:46:30ZTuukka LehtonenChart-related subscription history data access and sampling optimizationThere are several performance-related problems with the subscription history data sampling implemented in https://gitlab.simantics.org/simantics/platform/-/blob/master/bundles/org.simantics.charts/src/org/simantics/charts/Charts.java#L10...There are several performance-related problems with the subscription history data sampling implemented in https://gitlab.simantics.org/simantics/platform/-/blob/master/bundles/org.simantics.charts/src/org/simantics/charts/Charts.java#L103-112.
The worst thing is that the amount of excess work grows linearly with the amount of subscriptions defined in the active model and each `Charts.createHistorySamplerItem2` invocation will always read all the subscription metadata .txt files from disk, which is terribly expensive compared to caching them.
Caching of course makes the `ItemManager` state handling more complex to ensure that up-to-date data for subscriptions is always available. However it is definitely worth it in this case. The simplest way to keep the caches coherent is to invalidate then entirely upon any detection of change (force rebuild). In practice the set of items stored by a HistoryManager doesn't change all that often so cache will hit most often and rebuilds should be few.
Another thing to optimize is the use of `ItemManager.search` to find the history items whose `variableId` matches the item searched for. Currently it just always loops over *all* the item `Bean`s, reads the `variableId` field through `Bean` class mechanisms and compares it to the searched for value. If there are hundreds or thousands of items, the time spent in this will linearly grow as well. Again this data is something that hardly changes and can be heavily cached through adding a mechanism to `ItemManager` to create an multi-map index (`key -> List<Bean>`) of the item beans by a specific field in the beans. This allows the `createHistorySamplerItem2` code to just ensure the index by `variableId` exists (or create it if it's missing) and directly lookup all the beans whose `variableId` matches.
Finally the code will create `LevelItem` instances from all the found item beans. This involves reading `id` and `samplingInterval` fields from the beans. The amount of these beans should always be small so there's not much point in trying to cache even these sorted `LevelItem[]` arrays.1.60.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1091Fix legacy code from diagram monitor loading that can cause unnecessary Asser...2024-03-08T13:10:12ZTuukka LehtonenFix legacy code from diagram monitor loading that can cause unnecessary AssertionErrorsDump from a user's workspace log:
```
!ENTRY org.simantics.utils.ui 4 0 2024-03-07 12:32:27.660
!MESSAGE java.lang.AssertionError
!STACK 0
org.simantics.db.exception.DatabaseException: java.lang.AssertionError
at org.simantics.db.impl....Dump from a user's workspace log:
```
!ENTRY org.simantics.utils.ui 4 0 2024-03-07 12:32:27.660
!MESSAGE java.lang.AssertionError
!STACK 0
org.simantics.db.exception.DatabaseException: java.lang.AssertionError
at org.simantics.db.impl.query.ReadEntry.computeForEach(ReadEntry.java:133)
at org.simantics.db.impl.query.QueryCache.runnerReadEntry(QueryCache.java:697)
at org.simantics.db.impl.graph.ReadGraphImpl.syncRequest(ReadGraphImpl.java:1961)
at org.simantics.modeling.ui.diagram.monitor.MonitorClassFactory2.load(MonitorClassFactory2.java:167)
at org.simantics.diagram.adapter.SyncElementFactory$2.perform(SyncElementFactory.java:52)
at org.simantics.diagram.adapter.SyncElementFactory$2.perform(SyncElementFactory.java:1)
at org.simantics.db.impl.query.ReadEntry.computeForEach(ReadEntry.java:121)
at org.simantics.db.impl.query.QueryCache.runnerReadEntry(QueryCache.java:697)
at org.simantics.db.impl.graph.ReadGraphImpl$24.run0(ReadGraphImpl.java:5190)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:233)
at org.simantics.db.impl.query.QueryProcessor.performPending(QueryProcessor.java:177)
at org.simantics.db.impl.graph.ReadGraphImpl.performPending(ReadGraphImpl.java:6462)
at org.simantics.db.impl.graph.AsyncBarrierImpl.waitBarrier(AsyncBarrierImpl.java:181)
at org.simantics.db.impl.BlockingAsyncProcedure.get(BlockingAsyncProcedure.java:87)
at org.simantics.db.impl.BlockingAsyncProcedure.performSync(BlockingAsyncProcedure.java:170)
at org.simantics.db.impl.query.AsyncReadEntry.computeForEach(AsyncReadEntry.java:165)
at org.simantics.db.impl.query.QueryCache.runnerAsyncReadEntry(QueryCache.java:777)
at org.simantics.db.impl.graph.ReadGraphImpl.syncRequest(ReadGraphImpl.java:2062)
at org.simantics.db.impl.graph.ReadGraphImpl.syncRequest(ReadGraphImpl.java:2042)
at org.simantics.db.impl.graph.ReadGraphImpl.syncRequest(ReadGraphImpl.java:2054)
at org.simantics.diagram.adapter.GraphToDiagramSynchronizer$GraphToDiagramUpdater$4.run(GraphToDiagramSynchronizer.java:1897)
at org.simantics.db.common.request.ReadRequest.perform(ReadRequest.java:21)
at org.simantics.db.impl.query.ReadEntry.computeForEach(ReadEntry.java:121)
at org.simantics.db.impl.query.QueryCache.runnerReadEntry(QueryCache.java:669)
at org.simantics.db.impl.graph.ReadGraphImpl$24.run0(ReadGraphImpl.java:5190)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:233)
at org.simantics.db.impl.query.QueryProcessor.performPending(QueryProcessor.java:177)
at org.simantics.db.impl.graph.ReadGraphImpl.performPending(ReadGraphImpl.java:6462)
at org.simantics.db.impl.graph.AsyncBarrierImpl.waitBarrier(AsyncBarrierImpl.java:181)
at org.simantics.db.impl.BlockingAsyncProcedure.get(BlockingAsyncProcedure.java:87)
at org.simantics.db.impl.BlockingAsyncProcedure.performSync(BlockingAsyncProcedure.java:170)
at org.simantics.db.impl.query.AsyncReadEntry.computeForEach(AsyncReadEntry.java:165)
at org.simantics.db.impl.query.QueryCache.runnerAsyncReadEntry(QueryCache.java:760)
at org.simantics.db.impl.graph.ReadGraphImpl.syncRequest(ReadGraphImpl.java:2062)
at org.simantics.db.impl.graph.ReadGraphImpl.syncRequest(ReadGraphImpl.java:2035)
at org.simantics.diagram.adapter.GraphToDiagramSynchronizer$GraphToDiagramUpdater.process(GraphToDiagramSynchronizer.java:2405)
at org.simantics.diagram.adapter.GraphToDiagramSynchronizer$8.graphUpdate(GraphToDiagramSynchronizer.java:2830)
at org.simantics.diagram.adapter.GraphToDiagramSynchronizer.processGraphUpdates(GraphToDiagramSynchronizer.java:3477)
at org.simantics.diagram.adapter.GraphToDiagramSynchronizer.loadDiagram(GraphToDiagramSynchronizer.java:1332)
at org.simantics.diagram.query.DiagramLoadQuery.perform(DiagramLoadQuery.java:52)
at org.simantics.diagram.query.DiagramLoadQuery.perform(DiagramLoadQuery.java:1)
at org.simantics.modeling.ui.diagramEditor.DiagramViewer.lambda$2(DiagramViewer.java:657)
at fi.vtt.simantics.procore.internal.SessionImplSocket$6.run0(SessionImplSocket.java:1522)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:233)
at fi.vtt.simantics.procore.internal.SessionRequestManager$1.run0(SessionRequestManager.java:127)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:233)
at org.simantics.db.impl.query.QueryThread.run(QueryThread.java:238)
Caused by: java.lang.AssertionError
at org.simantics.db.impl.graph.ReadGraphImpl.getPossibleURI(ReadGraphImpl.java:266)
at org.simantics.modeling.ui.diagram.monitor.ResolveMonitorVariable.perform(ResolveMonitorVariable.java:70)
at org.simantics.modeling.ui.diagram.monitor.ResolveMonitorVariable.perform(ResolveMonitorVariable.java:1)
at org.simantics.db.impl.query.ReadEntry.computeForEach(ReadEntry.java:121)
... 46 more
and
org.simantics.db.exception.DatabaseException: java.lang.AssertionError
at org.simantics.db.impl.query.ReadEntry.computeForEach(ReadEntry.java:133)
at org.simantics.db.impl.query.QueryCache.runnerReadEntry(QueryCache.java:697)
at org.simantics.db.impl.graph.ReadGraphImpl.syncRequest(ReadGraphImpl.java:1961)
at org.simantics.modeling.ui.diagram.monitor.MonitorClassFactory2.load(MonitorClassFactory2.java:167)
at org.simantics.diagram.adapter.SyncElementFactory$2.perform(SyncElementFactory.java:52)
at org.simantics.diagram.adapter.SyncElementFactory$2.perform(SyncElementFactory.java:1)
at org.simantics.db.impl.query.ReadEntry.computeForEach(ReadEntry.java:121)
at org.simantics.db.impl.query.QueryCache.runnerReadEntry(QueryCache.java:697)
at org.simantics.db.impl.graph.ReadGraphImpl$24.run0(ReadGraphImpl.java:5190)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:233)
at org.simantics.db.impl.query.QueryProcessor.performPending(QueryProcessor.java:177)
at org.simantics.db.impl.graph.ReadGraphImpl.performPending(ReadGraphImpl.java:6462)
at org.simantics.db.impl.graph.AsyncBarrierImpl.waitBarrier(AsyncBarrierImpl.java:181)
at org.simantics.db.impl.BlockingAsyncProcedure.get(BlockingAsyncProcedure.java:87)
at org.simantics.db.impl.BlockingAsyncProcedure.performSync(BlockingAsyncProcedure.java:170)
at org.simantics.db.impl.query.AsyncReadEntry$1.recompute(AsyncReadEntry.java:96)
at org.simantics.db.impl.query.QueryProcessor.compareTo(QueryProcessor.java:1372)
at org.simantics.db.impl.query.QueryListening.fireListeners_(QueryListening.java:268)
at org.simantics.db.impl.query.QueryListening.fireListeners(QueryListening.java:227)
at fi.vtt.simantics.procore.internal.State.commitWriteTransaction(State.java:344)
at fi.vtt.simantics.procore.internal.SessionRequestManager$4.run0(SessionRequestManager.java:236)
at org.simantics.db.impl.query.QueryProcessor$SessionTask.run(QueryProcessor.java:233)
at org.simantics.db.impl.query.QueryThread.run(QueryThread.java:238)
Caused by: java.lang.AssertionError
at org.simantics.db.impl.graph.ReadGraphImpl.getPossibleURI(ReadGraphImpl.java:266)
at org.simantics.modeling.ui.diagram.monitor.ResolveMonitorVariable.perform(ResolveMonitorVariable.java:70)
at org.simantics.modeling.ui.diagram.monitor.ResolveMonitorVariable.perform(ResolveMonitorVariable.java:1)
at org.simantics.db.impl.query.ReadEntry.computeForEach(ReadEntry.java:121)
... 22 more
```
The Variable processing code here it very dated and can easily be made both safer and simpler.1.60.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1088Resetting a database index with IndexedRelations.reset does not properly clea...2024-02-29T09:37:44ZTuukka LehtonenResetting a database index with IndexedRelations.reset does not properly clear the IndexedRelationsSearcher cachesKind of similar to #725, `IndexedRelationsImpl.reset` does not call `searcher.bestEffortClear(monitor, processor.getSession())` which it should call to ensure all caches are properly reset. Currently it just deletes the files on disk.
W...Kind of similar to #725, `IndexedRelationsImpl.reset` does not call `searcher.bestEffortClear(monitor, processor.getSession())` which it should call to ensure all caches are properly reset. Currently it just deletes the files on disk.
When index resetting facilities are (usually manually) used, this can cause unexpected behaviour by returning old cached results instead of returning re-indexed results from the actual database.1.60.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1083Remove green color from modelled SWT GridCell2024-02-23T06:54:40ZAntti VillbergRemove green color from modelled SWT GridCellWas about timeWas about time1.59.0Antti VillbergAntti Villberghttps://gitlab.simantics.org/simantics/platform/-/issues/1082Get rid of Java 1.8 requirements in org.simantics.modeling.web etc2024-03-01T11:19:14ZAntti VillbergGet rid of Java 1.8 requirements in org.simantics.modeling.web etc1.59.0Antti VillbergAntti Villberghttps://gitlab.simantics.org/simantics/platform/-/issues/1081Do not crash in MigrationUtils.getMigrationSteps2024-02-22T09:09:54ZAntti VillbergDo not crash in MigrationUtils.getMigrationStepsWhen implementation for some step cannot be resolvedWhen implementation for some step cannot be resolved1.59.0Antti VillbergAntti Villberghttps://gitlab.simantics.org/simantics/platform/-/issues/1079Add remove(ComponentBase) to structural synchronization Solver interface2024-02-22T07:14:34ZTuukka LehtonenAdd remove(ComponentBase) to structural synchronization Solver interface1.59.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1078Simantics/Diagram/rotateDegrees for free rotation of diagram elements2024-02-20T21:09:22ZTuukka LehtonenSimantics/Diagram/rotateDegrees for free rotation of diagram elements1.59.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1076Remove test-related code, data and unnecessary embedded JARs from platform bu...2024-02-22T10:51:02ZTuukka LehtonenRemove test-related code, data and unnecessary embedded JARs from platform bundles* [org.simantics.databoard/testcases](/bundles/org.simantics.databoard/testcases) shouldn't be included in the binary build
* [org.simantics.graph](/bundles/org.simantics.graph) contains testing-related TG files in the src directory, whi...* [org.simantics.databoard/testcases](/bundles/org.simantics.databoard/testcases) shouldn't be included in the binary build
* [org.simantics.graph](/bundles/org.simantics.graph) contains testing-related TG files in the src directory, which are several MB in size
* [org.simantics.spreadsheet.graph](/bundles/org.simantics.spreadsheet.graph) contains apache commons math 3.6.1 which already comes into the platform as a third-party dependency through P2 repositories. It takes around 2 MB.1.59.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1075toString implementations for AcornKeyFile and related classes2024-02-22T07:21:58ZTuukka LehtonentoString implementations for AcornKeyFile and related classes1.59.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1074Null Resource use in RouteGraphUtils.readConnectionStyle2024-02-15T08:54:34ZTuukka LehtonenNull Resource use in RouteGraphUtils.readConnectionStyleIf a diagram connection does not have any connection type at all, [readConnectionStyle](https://gitlab.simantics.org/simantics/platform/-/blob/5058f6a6d0c5d54f35e34df63a2b9939ec637676/bundles/org.simantics.diagram/src/org/simantics/diagr...If a diagram connection does not have any connection type at all, [readConnectionStyle](https://gitlab.simantics.org/simantics/platform/-/blob/5058f6a6d0c5d54f35e34df63a2b9939ec637676/bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/RouteGraphUtils.java#L560) will try to read `DIA.HasConnectionStyle` from a `null` `connectionType`.
The ensuing error will will prevent the connection from getting loaded at all and being visible to the user, but leaves the related terminals non-functional due to the existing connection. It would be better that the connection can be seen and deleted if necessary.1.59.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1073Rapid copy-paste can run into UnsupportedOperationException2024-02-06T14:35:45ZTuukka LehtonenRapid copy-paste can run into UnsupportedOperationExceptionMoving a immediately removing a copy-highlighted element can cause the following exception to occur:
```
Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException
at java.base/java.util.Collections$EmptyMap.compute...Moving a immediately removing a copy-highlighted element can cause the following exception to occur:
```
Exception in thread "AWT-EventQueue-0" java.lang.UnsupportedOperationException
at java.base/java.util.Collections$EmptyMap.computeIfAbsent(Collections.java:4764)
at org.simantics.scenegraph.ParentNode.getOrCreateNode(ParentNode.java:173)
at org.simantics.diagram.handler.HighlightMode.paintSelectionFrames(HighlightMode.java:104)
at org.simantics.diagram.handler.HighlightMode$2.run(HighlightMode.java:152)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
```
The right thing to do would just be to check the parent node disposedness before running `paintSelectionFrames`.1.59.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1072Cache static bindings for GraphExplorerStateBean and all its related bean cla...2024-02-04T09:54:53ZTuukka LehtonenCache static bindings for GraphExplorerStateBean and all its related bean classes1.59.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1071Allow preference-configurability of DisposePolicy for DiagramEditor2024-02-04T09:54:46ZTuukka LehtonenAllow preference-configurability of DisposePolicy for DiagramEditor[DiagramEditor](https://gitlab.simantics.org/simantics/platform/-/blob/master/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramEditor.java#L332-333) currently has a hardcoded default valued DisposingPo...[DiagramEditor](https://gitlab.simantics.org/simantics/platform/-/blob/master/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/DiagramEditor.java#L332-333) currently has a hardcoded default valued DisposingPolicy attached to it.
It would be better if this policy was configurable through preferences.1.59.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1069Set values of NodeStructureRequest and NodeValueRequest to exceptional values...2024-02-22T09:02:50ZTuukka LehtonenSet values of NodeStructureRequest and NodeValueRequest to exceptional values when an exception the underlying node manager throws an exception[NodeValueRequest](https://gitlab.simantics.org/simantics/platform/-/blob/8065ba6e3cdbadf71bee55dd878a8fcf896c0965/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/NodeValueRequest.java#L215-224) should set `this.valu...[NodeValueRequest](https://gitlab.simantics.org/simantics/platform/-/blob/8065ba6e3cdbadf71bee55dd878a8fcf896c0965/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/NodeValueRequest.java#L215-224) should set `this.value` when a `Throwable` is caught to enable [this code](https://gitlab.simantics.org/simantics/platform/-/blob/8065ba6e3cdbadf71bee55dd878a8fcf896c0965/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/NodeValueRequest.java#L208-213) to fail the `equals()` check against the old request value which might not change if/when the request revives to produce a proper result at a later time.1.59.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1067Fix Finish for Publishing action dialog to cancel properly2024-01-31T15:05:34ZTuukka LehtonenFix Finish for Publishing action dialog to cancel properlyTwo problems with the dialog:
![image](/uploads/fd8948a1c121faf92f53e6ccd37bacab/image.png)
1. It handles cancel invalidly by actually proceeding with the publishing when the window is closed from the top-right window button.
2. The li...Two problems with the dialog:
![image](/uploads/fd8948a1c121faf92f53e6ccd37bacab/image.png)
1. It handles cancel invalidly by actually proceeding with the publishing when the window is closed from the top-right window button.
2. The list removes '/' characters from DB root URLs, e.g. `http:/test` which should be `http://test`
Also the list could be more intuitive and less repetitive as a tree.
Consider also the title and texts in the dialog to indicate that it is also possible to continue instead of clearly saying "Cannot do X".1.59.0Tuukka LehtonenTuukka Lehtonenhttps://gitlab.simantics.org/simantics/platform/-/issues/1064Errors in query reference counting with malformed ontology2024-03-01T11:30:10ZAntti VillbergErrors in query reference counting with malformed ontology1.60.0Antti VillbergAntti Villberghttps://gitlab.simantics.org/simantics/platform/-/issues/1063Improve functionality, documentation and usability of Simantics/Profile SCL m...2024-01-18T22:43:02ZTuukka LehtonenImprove functionality, documentation and usability of Simantics/Profile SCL module functions* [X] The documentation `Simantics/Profile` is broken and lacking any descriptions. Add some and fix the garbage.
* [X] `toggleProfileGroup` would be more usable if it accepted also profile labels (`L0.HasLabel`) and not just profile nam...* [X] The documentation `Simantics/Profile` is broken and lacking any descriptions. Add some and fix the garbage.
* [X] `toggleProfileGroup` would be more usable if it accepted also profile labels (`L0.HasLabel`) and not just profile names (`L0.HasName`). Profiles should be defined with locally unique labels in addition to locally unique names to simplify how they are shown in the Profiles view. The profile group/entry names may more complex or even random UUIDs in the database while the UI is showing the human-readable labels which could then be copied from the UI for the `profileName` parameter
* [X] Introduce new functions:
1. `resolveProfileResource :: RuntimeProfile -> [String] -> <ReadGraph,Proc> Resource`
* for resolving profile group or entry Resources based on a resource name/label path starting from the specified top-level profile group and traversing the hierarchy visualized by the Profiles view based on the names shown by the view.
2. `toggleProfileByResource :: Boolean -> RuntimeProfile -> Resource -> <WriteGraph> ()`
* for (de)activating any specified profile group or entry in the specified top-level profile group
3. `setProfileMonitorStackGrowDirection :: ProfileMonitorStackGrowDirection -> Resource -> <WriteGraph> ()`
* for configuring a diagram element's profile monitor stack growth direction
* added for completeness sake because `setProfileMonitorPosition` and `resetProfileMonitorPosition` already exist.1.59.0Tuukka LehtonenTuukka Lehtonen