1111 * SPDX-License-Identifier: MPL-2.0
1212 */
1313
14- import { inject , Injectable , NgZone } from '@angular/core' ;
14+ import { inject , Injectable , Injector , NgZone } from '@angular/core' ;
1515import {
1616 AlertService ,
1717 BrowserService ,
@@ -71,7 +71,7 @@ import {ModelService, RdfService} from '@ame/rdf/services';
7171import { RdfModel } from '@ame/rdf/utils' ;
7272import { OpenApi , ViolationError } from './editor-toolbar' ;
7373import { FILTER_ATTRIBUTES , FilterAttributesService , FiltersService } from '@ame/loader-filters' ;
74- import { ShapeSettingsStateService } from './editor-dialog' ;
74+ import { ShapeSettingsService , ShapeSettingsStateService } from './editor-dialog' ;
7575import { LargeFileWarningService } from './large-file-warning-dialog/large-file-warning-dialog.service' ;
7676import { LoadModelPayload } from './models/load-model-payload.interface' ;
7777import { LanguageTranslationService } from '@ame/translation' ;
@@ -91,21 +91,16 @@ export class EditorService {
9191 private isAllShapesExpandedSubject = new BehaviorSubject < boolean > ( true ) ;
9292
9393 public isAllShapesExpanded$ = this . isAllShapesExpandedSubject . asObservable ( ) ;
94- public loadModel$ = new BehaviorSubject < any > ( null ) ;
9594 public delayedBindings : Array < any > = [ ] ;
9695
97- public get savedRdf$ ( ) {
98- return this . lastSavedRDF$ . asObservable ( ) ;
99- }
100-
101- public get currentCachedFile ( ) : CachedFile {
102- return this . namespaceCacheService . currentCachedFile ;
103- }
104-
10596 private get settings ( ) {
10697 return this . configurationService . getSettings ( ) ;
10798 }
10899
100+ get shapeSettingsService ( ) : ShapeSettingsService {
101+ return this . injector . get ( ShapeSettingsService ) ;
102+ }
103+
109104 constructor (
110105 private mxGraphService : MxGraphService ,
111106 private mxGraphSetupService : MxGraphSetupService ,
@@ -133,6 +128,7 @@ export class EditorService {
133128 private loadingScreenService : LoadingScreenService ,
134129 private translate : LanguageTranslationService ,
135130 private browserService : BrowserService ,
131+ private injector : Injector ,
136132 private ngZone : NgZone ,
137133 ) {
138134 if ( ! environment . production ) {
@@ -262,6 +258,7 @@ export class EditorService {
262258 loadedRdfModel ,
263259 payload . rdfAspectModel ,
264260 payload . namespaceFileName || loadedRdfModel . absoluteAspectModelFileName ,
261+ payload . editElementUrn ,
265262 ) ,
266263 ) ,
267264 tap ( ( ) => {
@@ -343,12 +340,17 @@ export class EditorService {
343340 return this . modelApiService . generateOpenApiSpec ( serializedModel , openApi ) ;
344341 }
345342
346- private loadCurrentModel ( loadedRdfModel : RdfModel , rdfAspectModel : string , namespaceFileName : string ) : Observable < Aspect > {
343+ private loadCurrentModel (
344+ loadedRdfModel : RdfModel ,
345+ rdfAspectModel : string ,
346+ namespaceFileName : string ,
347+ editElementUrn ?: string ,
348+ ) : Observable < Aspect > {
347349 return this . modelService . loadRdfModel ( loadedRdfModel , rdfAspectModel , namespaceFileName ) . pipe (
348350 first ( ) ,
349351 tap ( ( aspect : Aspect ) => {
350352 this . removeOldGraph ( ) ;
351- this . initializeNewGraph ( ) ;
353+ this . initializeNewGraph ( editElementUrn ) ;
352354 this . titleService . updateTitle ( namespaceFileName || aspect ?. aspectModelUrn , aspect ? 'Aspect' : 'Shared' ) ;
353355 } ) ,
354356 catchError ( error => {
@@ -364,7 +366,7 @@ export class EditorService {
364366 this . mxGraphService . deleteAllShapes ( ) ;
365367 }
366368
367- private initializeNewGraph ( ) {
369+ private initializeNewGraph ( editElementUrn ?: string ) : void {
368370 try {
369371 const rdfModel = this . modelService . currentRdfModel ;
370372 const mxGraphRenderer = new MxGraphRenderer (
@@ -376,52 +378,70 @@ export class EditorService {
376378 ) ;
377379
378380 const elements = this . namespaceCacheService . currentCachedFile . getAllElements ( ) ;
379- this . largeFileWarningService
380- . openDialog ( elements . length )
381- . pipe (
382- first ( ) ,
383- filter ( response => response !== 'cancel' ) ,
384- tap ( ( ) => {
385- this . loadingScreenService . close ( ) ;
386- requestAnimationFrame ( ( ) => {
387- this . loadingScreenService . open ( { title : this . translate . language . LOADING_SCREEN_DIALOG . MODEL_GENERATION } ) ;
388- } ) ;
389- } ) ,
390- delay ( 500 ) , // Modal animation waiting before apps is blocked by mxGraph
391- switchMap ( ( ) => {
392- return this . mxGraphService . updateGraph ( ( ) => {
393- this . mxGraphService . firstTimeFold = true ;
394- MxGraphHelper . filterMode = this . filtersService . currentFilter . filterType ;
395- const rootElements = elements . filter ( e => ! e . parents . length ) ;
396- const filtered = this . filtersService . filter ( rootElements ) ;
397-
398- for ( const elementTree of filtered ) {
399- mxGraphRenderer . render ( elementTree , null ) ;
400- }
401-
402- this . mxGraphAttributeService . inCollapsedMode && this . mxGraphService . foldCells ( ) ;
403- } ) ;
404- } ) ,
405- )
406- . subscribe ( {
407- next : ( ) => {
408- this . mxGraphService . formatShapes ( true ) ;
409- this . mxGraphSetupService . centerGraph ( ) ;
410- localStorage . removeItem ( ValidateStatus . validating ) ;
411- this . loadingScreenService . close ( ) ;
412- } ,
413- error : ( ) => {
414- this . loadingScreenService . close ( ) ;
415- } ,
416- } ) ;
381+ this . prepareGraphUpdate ( mxGraphRenderer , elements , editElementUrn ) ;
417382 } catch ( error ) {
418383 console . groupCollapsed ( 'editor.service' , error ) ;
419384 console . groupEnd ( ) ;
420-
421385 throwError ( ( ) => error ) ;
422386 }
423387 }
424388
389+ private prepareGraphUpdate ( mxGraphRenderer : MxGraphRenderer , elements : BaseMetaModelElement [ ] , editElementUrn ?: string ) : void {
390+ this . largeFileWarningService
391+ . openDialog ( elements . length )
392+ . pipe (
393+ first ( ) ,
394+ filter ( response => response !== 'cancel' ) ,
395+ tap ( ( ) => this . toggleLoadingScreen ( ) ) ,
396+ delay ( 500 ) , // Wait for modal animation
397+ switchMap ( ( ) => this . graphUpdateWorkflow ( mxGraphRenderer , elements ) ) ,
398+ )
399+ . subscribe ( {
400+ next : ( ) => this . finalizeGraphUpdate ( editElementUrn ) ,
401+ error : ( ) => this . loadingScreenService . close ( ) ,
402+ } ) ;
403+ }
404+
405+ private toggleLoadingScreen ( ) : void {
406+ this . loadingScreenService . close ( ) ;
407+ requestAnimationFrame ( ( ) => {
408+ this . loadingScreenService . open ( { title : this . translate . language . LOADING_SCREEN_DIALOG . MODEL_GENERATION } ) ;
409+ } ) ;
410+ }
411+
412+ private graphUpdateWorkflow ( mxGraphRenderer : MxGraphRenderer , elements : BaseMetaModelElement [ ] ) : Observable < boolean > {
413+ return this . mxGraphService . updateGraph ( ( ) => {
414+ this . mxGraphService . firstTimeFold = true ;
415+ MxGraphHelper . filterMode = this . filtersService . currentFilter . filterType ;
416+ const rootElements = elements . filter ( e => ! e . parents . length ) ;
417+ const filtered = this . filtersService . filter ( rootElements ) ;
418+
419+ for ( const elementTree of filtered ) {
420+ mxGraphRenderer . render ( elementTree , null ) ;
421+ }
422+
423+ if ( this . mxGraphAttributeService . inCollapsedMode ) {
424+ this . mxGraphService . foldCells ( ) ;
425+ }
426+ } ) ;
427+ }
428+
429+ private finalizeGraphUpdate ( editElementUrn ?: string ) : void {
430+ this . mxGraphService . formatShapes ( true ) ;
431+ this . handleEditOrCenterView ( editElementUrn ) ;
432+ localStorage . removeItem ( ValidateStatus . validating ) ;
433+ this . loadingScreenService . close ( ) ;
434+ }
435+
436+ private handleEditOrCenterView ( editElementUrn : string | null ) : void {
437+ if ( editElementUrn ) {
438+ this . shapeSettingsService . editModelByUrn ( editElementUrn ) ;
439+ this . mxGraphService . navigateToCellByUrn ( editElementUrn ) ;
440+ } else {
441+ this . mxGraphSetupService . centerGraph ( ) ;
442+ }
443+ }
444+
425445 makeDraggable ( element : HTMLDivElement , dragElement : HTMLDivElement ) {
426446 const ds = mxUtils . makeDraggable (
427447 element ,
0 commit comments