# Breaking Changes

## V19

### Node

Man braucht jetzt mindestens node 22. Pipelines müssen ggf. auch angepasst werden.

### Angular 21

Hinweis: Encoding Probleme können bei der Migration zu Problemen führen. Alle ts und html Dateien müssen UTF-8 Encoding haben.

Upgrade Command:
```shell
> npm install @sowatech/shared@19 --legacy-peer-deps
> ng generate @sowatech/shared:ng-update
```

Das shared schematic sollte sämtliche packages updaten und die schematics ausführen.
Da nach jedem Schritt die Packages neu installiert werden, kann das lange dauern.
Dabei muss 3x manuell bestätigt werden, dass bestimmte Angular Migrations ausgeführt werden sollen.

Nachdem die Migration durch ist, nochmal `ng generate @angular/core:control-flow-migration` ausführen und angezeigte Fehler korrigieren.

`@HostBinding` und `@HostListener` dürfen nicht mehr `private` sein und müssen zu `protected` geändert werden. (erzeugt build Fehler)

### "moduleResolution": "bundler"

Durch die neue moduleResolution klappen die Imports von ngx-bootstrap nicht mehr.
In der `tsconfig.json` müssen folgende `paths` ergänzt werden:
```json
{
    "compilerOptions": {
        "paths": {
            // ...
            "ngx-bootstrap/accordion": ["node_modules/ngx-bootstrap/accordion/index.d.ts"],
            "ngx-bootstrap/dropdown": ["node_modules/ngx-bootstrap/dropdown/index.d.ts"],
            "ngx-bootstrap/modal": ["node_modules/ngx-bootstrap/modal/index.d.ts"],
            "ngx-bootstrap/popover": ["node_modules/ngx-bootstrap/popover/index.d.ts"],
            "ngx-bootstrap/positioning": ["node_modules/ngx-bootstrap/positioning/index.d.ts"],
            "ngx-bootstrap/tabs": ["node_modules/ngx-bootstrap/tabs/index.d.ts"],
            "ngx-bootstrap/timepicker": ["node_modules/ngx-bootstrap/timepicker/index.d.ts"],
            "ngx-bootstrap/typeahead": ["node_modules/ngx-bootstrap/typeahead/index.d.ts"]
        }
    }
}
```

Weitere direkte oder indirekte Imports müssen ebenfalls hinzugefügt werden. Das erkennt man an solchen Fehlermeldung:
```
X [ERROR] TS7016: Could not find a declaration file for module 'ngx-bootstrap/mini-ngrx'. '.../node_modules/ngx-bootstrap/mini-ngrx/fesm2020/ngx-bootstrap-mini-ngrx.mjs' implicitly has an 'any' type.
  If the 'ngx-bootstrap' package actually exposes this module, try adding a new declaration (.d.ts) file containing `declare module 'ngx-bootstrap/mini-ngrx';` [plugin angular-compiler]

    node_modules/ngx-bootstrap/timepicker/reducer/timepicker.reducer.d.ts:1:23:
      1 │ import { Action } from 'ngx-bootstrap/mini-ngrx';
        ╵                        ~~~~~~~~~~~~~~~~~~~~~~~~~
```
fix: `"ngx-bootstrap/mini-ngrx": ["node_modules/ngx-bootstrap/mini-ngrx/index.d.ts"]`

### ngx-scrollbar

styles.scss: scrollbar styles entfernen, diese sind jetzt Teil der globalen shared-Styles.
```
- ng-scrollbar {
-     .ng-scroll-content {
-         vertical-align: middle;
-     }
-
-     --scrollbar-border-radius: 7px;
-     --scrollbar-thickness: 6 !important;
-     --scrollbar-hover-thickness: 11 !important;
- }
```

### eslint

Es haben sich diverse eslint Regeln geändert, diese sollten geprüft und behoben, deaktiviert oder zu warnings geändert werden.
Einige Rules könnten als nicht gefunden markiert sein, weil sie im sowatech plugin aktiviert sind, diese müssen auf "off" gestellt werden.
Falls die Integration mit dem sowatech plugin nicht klappt, muss eslint auf Version 8 zurückgesetzt werden.

## V18

### globale shared-Styles

Styles in angular.json hinzufügen, entweder `sneat-styles.scss` oder `inspinia-styles.scss`:
```json
"styles": [
  "node_modules/@sowatech/shared/styles/inspinia-styles.scss",
  "src/styles.scss"
]
```

## V17

### Angular 19

Timing in effects hat sich geändert → prüfen!

### Änderungen durch package updates

#### `ngx-scrollbar` 18

(`app.module.ts`)
Der Provider `NG_SCROLLBAR_OPTIONS` muss mit dem funktionalen Provider `provideScrollbarOptions` ersetzt werden.

Beispiel vorher:
`{ provide: NG_SCROLLBAR_OPTIONS, useValue: { visibility: 'hover' } }`

Beispiel nachher:
`provideScrollbarOptions({ visibility: 'hover' })`

#### `quill`

Typing Problem => Neuere `parchment` Version installieren

#### `ngrx-store-localstorage`

Date conversion deaktivieren (`restoreDate: false`)

### eslint

eslint erfordert jetzt standardmäßig standalone Components. Um das zu deaktivieren, muss die `.eslintrc` angepasst werden:
- `"@angular-eslint/prefer-standalone": "off"`

### Die Signatur der Button Components hat sich geändert

Projektspezifische Button Components, die von einer Shared Button Component erben, müssen angepasst werden:
- Constructor Parameter sind entfallen.
- Inputs sind jetzt Signals (können also nicht von außen gesetzt werden).

### Entfernt weil deprecated

`DatasourceComponent.focusPreviouseRow` entfernt
- stattdessen `focusPreviousRow`

`DatasourceComponent.refreshBlocked` entfernt
- zum Setzen stattdessen `addRefreshBlocker()` / `removeRefreshBlocker()` benutzen
- zum Abfragen stattdessen `refreshIsBlocked` benutzen

`SharedConfigService.localStoragePrefix` entfernt
- stattdessen `SharedConfigService.storagePrefix`

`SwtDateIntervalComponent.getSelectedInterval` entfernt
- stattdessen `currentInterval` benutzen

`GenericEditDialogBaseComponent.dirty` entfernt
- zum Setzen stattdessen `setDirty()` / `resetDirty()` benutzen
- zum Abfragen stattdessen `isDirty()` benutzen (Signal)

## V16.2

- swt-dropdown-container
  - swt-dropdown-container müssen in selbstgeschriebenen dialogen einen container angeben
  - closeWhenClickOutside muss manuell eingeschaltet werden
  - swt-dropdown-container im Zusammenhang mit "swt-date-picker" "(onShow)="swtDatePicker.refresh()"" sollte nicht auf swt-dropdown-container aufgerufen werden,
    sonst öffnet sich der dropdown-container nicht

## V16
- `ng update @sowatech/shared@16` für automatisches Update der Dependencies
    - deinstalliert xlsx-Package
    - installiert exceljs, wenn xlsx vorhanden war

## V15

- Update auf Angular 17
- Grid `focusedRowDetailOpenedId` zu `detailId` umbenannt
- Die FilterGroupComponent der Datasource wurde gelöscht
- `ng update @sowatech/shared@15` für automatisches Angular Update, Update der Dependencies und Umbenennung `detailId`

## V14

Kein breaking Change

## V13
- Update auf Angular 16
- Update der peerDependencies
- BrowserSupport entfernt
- in angular.json müssen folgende Pfade unter styles eingetragen werden, sollten die zugehörigen Packages installiert sein:
    - "node_modules/quill/dist/quill.snow.css",
    - "node_modules/quill/dist/quill.bubble.css",
    - "node_modules/@ng-select/ng-select/themes/default.theme.css"
- ngx-perfect-scrollbar wurde durch ngx-scrollbar ersetzt
    - package austauschen
    - global style hinzufügen:
      ng-scrollbar {
        .ng-scroll-content {
            vertical-align: middle;
        }
        --scrollbar-size: 6px !important;
        --scrollbar-hover-size: 11px !important;
    }
    - im app.module unter providers hinzufügen:
        {
            provide: NG_SCROLLBAR_OPTIONS,
            useValue: {
               visibility: 'hover',
               autoHeightDisabled: false,
               track: 'all',
            }
        }

## V12

UserPropertiesStorageService nicht mehr async

## V 11
- global-keyboard-shortcuts:
    - Version des ng-keyboard-shortcuts Packages auf 13.0.8 Anpassen
    - Bei Angabe eines Combo-Shortcuts (z.B. Ctrl + X) müssen alle Tasten gleichzeitig gedrückt werden (vorher war eine verzögerung möglich)
    - Es können jetzt zusätzlich mehrere Shortcuts als string[] in die Shortcut-Direktive hinzugefügt werden. In der Anzeige im Tooltip wird immer der erste Key benutzt.

## V 10
- swt-wizard: Buttons werden jetzt disabled, d.h. das eine Validierung eines Wizard-Steps bei Klick auf einen disabled Button nicht mehr möglich ist, siehe: https://enoso.atlassian.net/browse/SHANG-76
- Die Session muss jetzt im AppModule in den Providers angegeben werden: `{ provide: SharedSession, useExisting: Session }`
- Shared Exportiert keine Session mehr, es sollte stattdessen die Projektspezifische Session verwendet werden


## V8
Wegen Importänderungen in tsconfig.
compilerOptions um ```"allowSyntheticDefaultImports": true``` ergänzen

## V6

grid.pageSize entfernt. DataSource.setPageSize stattdessen nutzen.

Es können auch nicht mehr mehrere external refreshes einer Datasource gleichzeitig laufen.

## V5

SharedModule.forRoot() ausführen (am Besten in AppModule imports).

## V4

@angular/localize installieren
