Mise à niveau vers la version 18 d'Angular

Sterling Store Engagement est mis à jour vers la version 18 d'Angular. Assurez-vous de migrer vos extensions vers la version 18 d'Angular.

Avant de commencer

Note : Si vous ne pouvez pas migrer vers la version 18 d'Angular, mais que vous souhaitez modifier vos extensions dans la version 15 d'Angular, vous pouvez continuer à construire vos personnalisations avec la boîte à outils du développeur 24.3.9.2-10.0.2409.2. Pour bénéficier des fonctionnalités, améliorations et corrections les plus récentes, vous devez passer à la version 18 d'Angular.
  • Vous devez disposer d'un espace de travail Angular version 15 à partir de 24.3.9.2-10.0.2409.2 ou de n'importe quel kit de développement Angular version 15.
  • Assurez-vous que vous êtes sur node.js version 18.20.0.

A propos de cette tâche

Le processus de migration se déroule en trois étapes. Premièrement, mise à niveau de la version 15 à la version 16 d'Angular, deuxièmement mise à niveau de la version 16 à la version 17, et troisièmement mise à niveau de la version 17 à la version 18.
Remarque : veillez à exécuter toutes les commandes à partir du dossier « <WORKSPACE>/store-frontend-src ».

Procédure

  1. Mettez à jour le nœud-sass vers la version 8.0.0 dans les fichiers packages/libs/styles/package.json et extensions/libs/styles/package.json , puis exécutez l'une des commandes suivantes :
    yarn bootstrap
  2. Mettez à niveau le noyau Angular et l'interface de ligne de commande (CLI) vers la version 16 en exécutant la commande suivante :
    ng update @angular/core@16 @angular/cli@16 --allow-dirty --force
  3. Mettez à niveau le noyau Angular et l'interface de ligne de commande vers la version 17 en exécutant la commande suivante :
    ng update @angular/core@17 @angular/cli@17 --allow-dirty --force
  4. Mettez à niveau le noyau Angular et l'interface de ligne de commande (CLI) vers la version 18 en exécutant la commande suivante :
    ng update @angular/core@18 @angular/cli@18 --allow-dirty --force
    Remarque : lorsque vous exécutez cette commande, vous rencontrez une migration facultative pour utiliser le générateur d'applications use-application-builder, appuyez sur Entrée pour continuer
  5. Recherchez et remplacez le code existant par le nouveau code dans toutes les méthodes de construction de app.component.ts dans le répertoire d'extension. S'il n'y a pas d'occurrence de cet extrait de code, passez à l'étape 6.
    Le code suivant illustre le code existant :
    this.router.events.subscribe((event: RouterEvent) => {
        this.routingStateService.navigationInterceptor(event);
    });
    Le code suivant illustre le nouveau code :
    this.router.events.pipe(
        filter((event: Event | RouterEvent): event is RouterEvent => event instanceof RouterEvent)
    ).subscribe((event: RouterEvent) => {
        this.routingStateService.navigationInterceptor(event);
    });
    Ensuite, importez Event depuis @angular/router et filter depuis rxjs/operators.
    import { filter, take } from 'rxjs/operators';
    import { Router, RouterEvent, Event } from '@angular/router';
  6. Si vous disposez d' extended packages/libs/common-components/src/lib/components/donut-chart/donut-chart.component.ts, recherchez et remplacez le code existant par le nouveau code dans le fichier donut-chart.component.ts .
    Le code suivant illustre le code existant :
    const pie = d3.pie().value((d) => d.count).sort(null);
    Le code suivant illustre le nouveau code :
    const pie = d3.pie().value((d) => d?.['count']).sort(null);
  7. Dans le fichier angular.json , recherchez browserTarget et remplacez-le par buildTarget.
  8. Dans l'outil de développement le plus récent, 25.1.3.0-10.0.2503.0, naviguez jusqu'au répertoire extensions/libs/styles et copiez les fichiers package.json et webpack.config.js dans votre dossier d'extension.
  9. Configurez un nouvel espace de travail à partir de la version la plus récente du kit de développement 25.1.3.0-10.0.2503.0 en suivant les étapes ci-dessous.
    1. Copiez le fichier angular.json de l'espace de travail précédent vers le nouvel espace de travail.
    2. Copiez les extensions migrées de l'espace de travail précédent vers le nouvel espace de travail.
    3. Relancez les commandes suivantes pour tester les extensions :
      yarn bootstrap
      ln -s <store-temp>/store-cli/schematics/node_modules <store-temp>/store-cli/node_modules

      Veillez à utiliser le chemin absolu lorsque vous exécutez la commande précédente.

    4. Fusionnez les modifications entrantes du code fourni par l'application avec les extensions afin de vous assurer que vous disposez de la version la plus récente du code et d'éviter toute erreur de compilation.
    5. Tenez compte des étapes suivantes pendant que vous fusionnez vos modifications.
      1. Avec la version la plus récente de RxJS, TypeScript affiche un message d'erreur si l'argument de la méthode suivante n'est pas fourni. Si vous ne voulez pas passer d'argument, déclarez le sujet avec un type void . Par ailleurs, si le sujet émet des valeurs provenant d'une autre source et intégrées par les observateurs, mais que vous ne souhaitez pas envoyer de valeur provenant d'une source, passez null comme argument à la méthode next . Le code suivant illustre le code existant :
        public addToCartSubject = new Subject<any>();
        this.refreshParentComponent.next();

        Le code suivant illustre le nouveau code :

        public addToCartSubject = new Subject<void>();
        this.refreshParentComponent.next(null);
      2. ngbAccordion passe de component à directive dans la version 16.0.0 de ng-bootstrap. Suivez l'exemple suivant pour vous assurer que toutes les occurrences de ngbAccordion dans les extensions sont mises à jour en directive.
        1. Modifiez le code de l'accordéon dans le fichier component.html comme illustré dans l'exemple suivant. Le code suivant illustre l'ancien code :
          <ngb-accordion #acc="ngbAccordion" activeIds="{{activeIds}}"
                                 [attr.tid]="componentId+'filterStatus'">
                                 <ngb-panel id="ngb-panel-assignto">
                                     <ng-template ngbPanelTitle>
                                         <span
                                             [ngClass]="{' app-icon-open-chevron_down_14': isOpen(acc, 'ngb-panel-assignto'), 'app-icon-collapsed-chevron_right_14': !isOpen(acc, 'ngb-panel-assignto') }"
                                             class="app-glyphicons"></span>
                                         <span translate> filterOptions.LABEL_FilterGroupDisplayValueAssignTo</span>
                                     </ng-template>
                                     <ng-template ngbPanelContent>
                                         <isf-combo-box [attr.tid]="componentId+'filterAssignTo'"
                                             [searchText]="selectedUserName" [items]="userList" [columnName]="'name'"
                                             [selectedValues]="[selectedUserName]"
                                             [placeholder]="'filterOptions.LABEL_SelectAssociate'"
                                             [isItemSelected]="selectedUserName" (applySelection)="onSelection($event)"
                                             [resetValue]="resetComboBox"></isf-combo-box>
                                     </ng-template>
                                 </ngb-panel>
                </ngb-accordion>

          Le code suivant illustre le nouveau code :

          <div ngbAccordion #acc="ngbAccordion"
                                 [attr.tid]="componentId+'filterStatus'">
                                 <div ngbAccordionItem="ngb-panel-assignto" id="ngb-panel-assignto" [collapsed]="!activeIds.includes('ngb-panel-assignto')">
                                     <div ngbAccordionHeader>
                                         <button ngbAccordionButton>
                                             <span
                                             [ngClass]="{' app-icon-open-chevron_down_14': isOpen(acc, 'ngb-panel-assignto'), 'app-icon-collapsed-chevron_right_14': !isOpen(acc, 'ngb-panel-assignto') }"
                                             class="app-glyphicons"></span>
                                         <span translate> filterOptions.LABEL_FilterGroupDisplayValueAssignTo</span>
                                         </button>
                                     </div>
                                     <div ngbAccordionCollapse>
                                         <div ngbAccordionBody>
                                             <ng-template>
                                                 <isf-combo-box [attr.tid]="componentId+'filterAssignTo'"
                                                     [searchText]="selectedUserName" [items]="userList" [columnName]="'name'"
                                                     [selectedValues]="[selectedUserName]"
                                                     [placeholder]="'filterOptions.LABEL_SelectAssociate'"
                                                     [isItemSelected]="selectedUserName" (applySelection)="onSelection($event)"
                                                     [resetValue]="resetComboBox"></isf-combo-box>
                                             </ng-template>
                                         </div>
                                     </div>
                                 </div>
           </div>
        2. Dans le fichier component.ts , supprimez l'importation de NgbAccordion et ajoutez NgbAccordionDirective à partir de @ng-bootstrap/ng-bootstrap.
          import { NgbAccordionDirective } from '@ng-bootstrap/ng-bootstrap';
        3. Dans le fichier component.ts , modifiez la fonction isOpen comme indiqué dans l'exemple de code suivant.
          public isOpen(acc: NgbAccordion, panelId: string) {
              return (acc.activeIds.includes(panelId));
            }
          Modifier comme suit :
          public isOpen(acc: NgbAccordionDirective, panelId: string) {
            return acc.isExpanded(panelId)
          }
        4. L'événement PanelChange a été supprimé dans la version la plus récente de ngbootsrap. Procédez aux changements mentionnés ci-dessous :
          1. Remplacez panelChange par show dans le fichier component.html comme indiqué dans l'exemple suivant :
            (panelChange)="setSelectedLocation($event)"
            Remplacer par :
            (show)="setSelectedLocation($event)"
          2. Dans le fichier component.ts , modifiez la fonction de gestion de l'événement panelChange comme indiqué dans l'exemple suivant :
            public setSelectedLocation(event: NgbPanelChangeEvent) {
                if (UIUtil.isNotVoid(event.nextState)) {
                  if (UIUtil.isNotVoid(event.panelId)) {
                    this.selectedLocationId = event.panelId;
                    this._setDefaultAttributeSet(this.selectedLocationId);
                  }
                } else {
                  this.selectedLocationId = '';
                }
              }
            Remplacer par
            public setSelectedLocation(panelId: string) {
                if (UIUtil.isNotVoid(panelId)) {
                    this.selectedLocationId = panelId;
                    this._setDefaultAttributeSet(this.selectedLocationId);
                } else {
                  this.selectedLocationId = '';
                }
              }
      3. Si vous utilisez ngbDropdown dans le bootstrap navbar, définissez l'attribut display à dynamic comme indiqué.
        <div ngbDropdown display="dynamic"></div>
  10. Lancez l'application en exécutant la commande suivante :
    yarn start-app
    Remarque : si vous exécutez la commande yarn start-app et que vous rencontrez l'erreur suivante, supprimez le dossier .angular de l'espace de travail et exécutez à nouveau la commande.

    Module not found: Error: node_modules/@angular-devkit/build-angular/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js'

    Remarque : si vous utilisez l'instance dev ou qa cloud comme serveur distant à des fins de développement, vous devez effectuer les modifications mentionnées dans la section Configuration du serveur de développement local.