Skip to content

Commit 12d5fa8

Browse files
committed
Add Changed Status to Attributes
1 parent c642ce0 commit 12d5fa8

File tree

1 file changed

+23
-16
lines changed

1 file changed

+23
-16
lines changed

projects/angular-odata/src/lib/models/options.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ export const INCLUDE_DEEP = {
259259
export enum ODataModelState {
260260
Added,
261261
Removed,
262+
Changed,
262263
Unchanged,
263264
}
264265

@@ -625,6 +626,7 @@ export class ODataModelField<F> {
625626
}
626627

627628
export class ODataModelAttribute<T> {
629+
private state: ODataModelState = ODataModelState.Unchanged;
628630
private value?: T | ODataModel<T> | ODataCollection<T, ODataModel<T>> | null;
629631
private change?: T | ODataModel<T> | ODataCollection<T, ODataModel<T>> | null;
630632
private subscription?: Subscription;
@@ -673,7 +675,7 @@ export class ODataModelAttribute<T> {
673675
| ODataCollection<T, ODataModel<T>>
674676
| null
675677
| undefined {
676-
return this.change !== undefined ? this.change : this.value;
678+
return this.state === ODataModelState.Changed ? this.change : this.value;
677679
}
678680

679681
set(
@@ -708,11 +710,12 @@ export class ODataModelAttribute<T> {
708710
: !Types.isEqual(current, value);
709711
if (reset) {
710712
this.value = value;
711-
this.change = undefined;
713+
this.state = ODataModelState.Unchanged;
712714
} else if (Types.isEqual(value, this.value)) {
713-
this.change = undefined;
715+
this.state = ODataModelState.Unchanged;
714716
} else if (changed) {
715717
this.change = value;
718+
this.state = ODataModelState.Changed;
716719
}
717720
if (
718721
ODataModelOptions.isModel(value) ||
@@ -731,7 +734,7 @@ export class ODataModelAttribute<T> {
731734
}: { include_navigation?: boolean } = {}): boolean {
732735
const current = this.get();
733736
return (
734-
this.change !== undefined ||
737+
this.state === ODataModelState.Changed ||
735738
((ODataModelOptions.isModel(current) ||
736739
ODataModelOptions.isCollection(current)) &&
737740
(
@@ -748,7 +751,7 @@ export class ODataModelAttribute<T> {
748751
this.unlink(
749752
this.change as ODataModel<T> | ODataCollection<T, ODataModel<T>>,
750753
);
751-
this.change = undefined;
754+
this.state = ODataModelState.Unchanged;
752755
if (
753756
ODataModelOptions.isModel(this.value) ||
754757
ODataModelOptions.isCollection(this.value)
@@ -1638,17 +1641,19 @@ export class ODataModelOptions<T> {
16381641
ODataModelOptions.isModel(value)
16391642
) {
16401643
// Check for reference
1641-
const referenced = this.resolveReferenced(self, attr);
1644+
const referenced = this.resolveReferenced(self, attr, {
1645+
resolve: false,
1646+
});
16421647
if (value !== null && referenced !== null && referenced !== undefined) {
1643-
(value as ODataModel<F>).assign(referenced as Partial<F>, {
1644-
silent: true,
1645-
});
1646-
} else if (value !== null && referenced === null) {
1647-
// New value is null
1648-
(attr as ODataModelAttribute<F>).set(null);
1649-
} else if (value === null && referenced !== null) {
1650-
// New value is undefined
1651-
(attr as ODataModelAttribute<F>).set(undefined);
1648+
(value as ODataModel<F>).assign(referenced as Partial<F>, {
1649+
silent: true,
1650+
});
1651+
} else if (value !== null && referenced === null) {
1652+
// New value is null
1653+
(attr as ODataModelAttribute<F>).set(null);
1654+
} else if (value === null && referenced !== null) {
1655+
// New value is undefined
1656+
(attr as ODataModelAttribute<F>).set(undefined);
16521657
}
16531658
}
16541659
return value;
@@ -1794,7 +1799,9 @@ export class ODataModelOptions<T> {
17941799
// Resolve referentials
17951800
if (!ODataModelOptions.isCollection(attr.get())) {
17961801
const meta = this.api.optionsForType<F>(modelField.type);
1797-
const ref = meta?.resolveReferential(attr.get(), attr);
1802+
const ref = meta?.resolveReferential(attr.get(), attr, {
1803+
resolve: false,
1804+
});
17981805
if (ref !== null && ref !== undefined) {
17991806
Object.assign(self, ref);
18001807
}

0 commit comments

Comments
 (0)