@cityads/ember-data-change-tracker 0.11.4 → 0.12.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -26
- package/addon/index.js +3 -2
- package/addon/{model-ext.js → mixins/change-tracker.js} +4 -6
- package/addon/mixins/keep-only-changed.js +2 -2
- package/addon/model.js +4 -0
- package/addon/tracker.js +1 -2
- package/addon/transforms/object.js +6 -6
- package/app/mixins/change-tracker.js +1 -0
- package/package.json +4 -4
- package/addon/initializer.js +0 -4
- package/app/initializers/ember-data-change-tracker.js +0 -7
package/README.md
CHANGED
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
attributes. But if you don't have object types it works fine.
|
|
11
11
|
|
|
12
12
|
This addon aims to fill in the gaps in the change tracking / rollback that ember data does now.
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
- Currently ember-data
|
|
15
15
|
- tracks changes for numbers/strings/date/boolean attributes
|
|
16
16
|
- has a ```changedAttributes()``` method to see what changed => [ last, current ]
|
|
17
17
|
- has a ```rollbackAttributes()``` method to rollback attributes
|
|
18
18
|
- has a ```hasDirtyAttributes``` computed property
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
- This addon:
|
|
21
21
|
- tracks modifications in attributes that are object/json/custom type
|
|
22
22
|
- tracks replacement of belongsTo associations
|
|
@@ -31,7 +31,7 @@ This addon aims to fill in the gaps in the change tracking / rollback that ember
|
|
|
31
31
|
- Can be used in two modes
|
|
32
32
|
- auto track mode
|
|
33
33
|
- manual track mode ( the default )
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
## Installation
|
|
36
36
|
|
|
37
37
|
* `ember install @cityads/ember-data-change-tracker`
|
|
@@ -42,22 +42,36 @@ This addon aims to fill in the gaps in the change tracking / rollback that ember
|
|
|
42
42
|
|
|
43
43
|
```javascript
|
|
44
44
|
export default Model.extend({
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
name: attr('string'), // ember-data tracks this already
|
|
46
|
+
info: attr('object'), // ember-data does not track modifications
|
|
47
|
+
json: attr(), // ember-data does not track modifications if this is object
|
|
48
|
+
company: belongsTo('company', { async: false, polymorphic: true }), // ember-data does not track replacement
|
|
49
|
+
profile: belongsTo('profile', { async: true }), // ember-data does not track replacement
|
|
50
|
+
projects: hasMany('project', { async: false }), // ember-data does not track additions/deletions
|
|
51
|
+
pets: hasMany('pet', { async: true, polymorphic: true }) // ember-data does not track additions/deletions
|
|
52
|
+
});
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
You can not currently rollback the info, json if they are modified
|
|
56
56
|
or company, profile, projects and pets if they change.
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
### setting up tracking
|
|
60
|
+
|
|
61
|
+
This addon exports a mixin you should add to the models you want to track:
|
|
62
|
+
|
|
63
|
+
```javascript
|
|
64
|
+
import ChangeTracker from '@cityads/ember-data-change-tracker/mixins/change-tracker';
|
|
65
|
+
|
|
66
|
+
export default Model.extend(ChangeTracker, {
|
|
67
|
+
name: attr('string'),
|
|
68
|
+
...
|
|
69
|
+
pets: hasMany('pet', { async: true, polymorphic: true })
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
59
73
|
### model changes
|
|
60
|
-
|
|
74
|
+
|
|
61
75
|
- The method ```modelChanges()``` is added to model
|
|
62
76
|
- Shows you any changes in an object attribute type
|
|
63
77
|
- whether modified or replacing the value
|
|
@@ -73,7 +87,7 @@ This addon aims to fill in the gaps in the change tracking / rollback that ember
|
|
|
73
87
|
Example: ( remove from a hasMany )
|
|
74
88
|
```javascript
|
|
75
89
|
user.get('projects').removeObject(firstProject); // remove project1
|
|
76
|
-
user.modelChanges() //=> {projects: true }
|
|
90
|
+
user.modelChanges() //=> { projects: true }
|
|
77
91
|
```
|
|
78
92
|
|
|
79
93
|
|
|
@@ -103,9 +117,9 @@ Usage:
|
|
|
103
117
|
|
|
104
118
|
// manual tracking model means you have to explicitly call => startTrack
|
|
105
119
|
// to save the current state of things before you edit
|
|
106
|
-
user.startTrack();
|
|
120
|
+
user.startTrack();
|
|
107
121
|
|
|
108
|
-
// edit things
|
|
122
|
+
// edit things
|
|
109
123
|
user.setProperties({
|
|
110
124
|
'info.foo': 3,
|
|
111
125
|
company: smallCompany,
|
|
@@ -144,15 +158,15 @@ Usage:
|
|
|
144
158
|
|
|
145
159
|
let user = make('user', { company: bigCompany, pets });
|
|
146
160
|
|
|
147
|
-
user.startTrack();
|
|
161
|
+
user.startTrack();
|
|
148
162
|
|
|
149
|
-
// edit things
|
|
163
|
+
// edit things
|
|
150
164
|
user.set('name', "new name");
|
|
151
165
|
user.get('isDirty'); //=> true
|
|
152
|
-
|
|
166
|
+
|
|
153
167
|
user.rollback();
|
|
154
168
|
user.get('isDirty'); //=> false
|
|
155
|
-
|
|
169
|
+
|
|
156
170
|
user.set('company', smallCompany);
|
|
157
171
|
user.get('hasDirtyRelations'); //=> true
|
|
158
172
|
user.get('isDirty'); //=> true
|
|
@@ -163,18 +177,18 @@ Usage:
|
|
|
163
177
|
user.set('pets', [cat, cat2]);
|
|
164
178
|
user.get('hasDirtyRelations'); //=> true
|
|
165
179
|
user.get('isDirty'); //=> true
|
|
166
|
-
|
|
180
|
+
|
|
167
181
|
user.rollback();
|
|
168
182
|
user.get('isDirty'); //=> false
|
|
169
183
|
|
|
170
|
-
// things that don't work
|
|
171
|
-
user.set('info.foo', 3);
|
|
184
|
+
// things that don't work
|
|
185
|
+
user.set('info.foo', 3);
|
|
172
186
|
user.get('isDirty'); //=> false ( object/array attributes don't work for computed isDirty )
|
|
173
187
|
|
|
174
188
|
```
|
|
175
189
|
|
|
176
190
|
### Configuration
|
|
177
|
-
|
|
191
|
+
|
|
178
192
|
- Global configuration
|
|
179
193
|
- By default the global settings are:
|
|
180
194
|
- { **trackHasMany**: *true*, **auto**: *false*, **enableIsDirty**: *false* }
|
|
@@ -305,4 +319,4 @@ moduleForModel('project', 'Unit | Model | project', {
|
|
|
305
319
|
}
|
|
306
320
|
});
|
|
307
321
|
|
|
308
|
-
```
|
|
322
|
+
```
|
package/addon/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import changeTracker from './mixins/change-tracker';
|
|
2
2
|
import keepOnlyChanged from './mixins/keep-only-changed';
|
|
3
|
+
import Model from './model';
|
|
3
4
|
|
|
4
|
-
export {keepOnlyChanged,
|
|
5
|
+
export { changeTracker, keepOnlyChanged, Model };
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import Ember from 'ember';
|
|
2
|
-
import
|
|
3
|
-
import Tracker from '
|
|
2
|
+
import Mixin from '@ember/object/mixin';
|
|
3
|
+
import Tracker from '../tracker';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Model.reopen({
|
|
5
|
+
export default Mixin.create({
|
|
8
6
|
|
|
9
7
|
init(){
|
|
10
8
|
this._super(...arguments);
|
|
@@ -42,7 +40,7 @@ Model.reopen({
|
|
|
42
40
|
* @returns {*}
|
|
43
41
|
*/
|
|
44
42
|
modelChanges() {
|
|
45
|
-
let changed =
|
|
43
|
+
let changed = { ...this.changedAttributes() };
|
|
46
44
|
let trackerInfo = Tracker.metaInfo(this);
|
|
47
45
|
for (let key in trackerInfo) {
|
|
48
46
|
if (!changed[key] && trackerInfo.hasOwnProperty(key)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Mixin from '@ember/object/mixin';
|
|
2
2
|
|
|
3
3
|
// EmberData does not serialize hasMany relationships by default
|
|
4
|
-
export default
|
|
4
|
+
export default Mixin.create({
|
|
5
5
|
keepValue(record, key) {
|
|
6
6
|
return record.get('isNew') || record.didChange(key);
|
|
7
7
|
},
|
package/addon/model.js
ADDED
package/addon/tracker.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import Ember from 'ember';
|
|
2
2
|
import { didModelChange, didModelsChange, relationShipTransform, relationshipKnownState } from './utilities';
|
|
3
3
|
|
|
4
|
-
const assign = Object.assign || Ember.assign || Ember.merge;
|
|
5
4
|
export const ModelTrackerKey = '-change-tracker';
|
|
6
5
|
export const RelationshipsKnownTrackerKey = '-change-tracker-relationships-known';
|
|
7
6
|
const alreadyTrackedRegex = /^-mf-|string|boolean|date|^number$/,
|
|
@@ -165,7 +164,7 @@ export default class Tracker {
|
|
|
165
164
|
static options(model) {
|
|
166
165
|
let envConfig = this.envConfig(model);
|
|
167
166
|
let modelConfig = this.modelConfig(model);
|
|
168
|
-
let opts =
|
|
167
|
+
let opts = { ...defaultOpts, ...envConfig, ...modelConfig };
|
|
169
168
|
|
|
170
169
|
let unknownOpts = Object.keys(opts).filter((v) => !knownTrackerOpts.includes(v));
|
|
171
170
|
Ember.assert(`[ember-data-change-tracker] changeTracker options can have
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import Transform from 'ember-data/transform';
|
|
2
|
+
import { isEmpty, typeOf } from '@ember/utils';
|
|
3
3
|
|
|
4
|
-
export default
|
|
4
|
+
export default Transform.extend({
|
|
5
5
|
serialize: function(value) {
|
|
6
6
|
return value && JSON.stringify(value);
|
|
7
7
|
},
|
|
8
8
|
|
|
9
9
|
deserialize: function(value) {
|
|
10
|
-
if (
|
|
10
|
+
if (isEmpty(value)) {
|
|
11
11
|
return {};
|
|
12
12
|
}
|
|
13
|
-
if (
|
|
13
|
+
if (typeOf(value) === 'object') {
|
|
14
14
|
return value;
|
|
15
15
|
}
|
|
16
|
-
if (
|
|
16
|
+
if (typeOf(value) === 'string') {
|
|
17
17
|
return JSON.parse(value);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@cityads/ember-data-change-tracker/mixins/change-tracker';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cityads/ember-data-change-tracker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0-beta.1",
|
|
4
4
|
"description": "Track changes and rollback object attributes and relationships. Ember data 2.5+",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ember-addon",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@ember/optional-features": "^0.7.0",
|
|
33
33
|
"broccoli-asset-rev": "^2.7.0",
|
|
34
34
|
"ember-fetch": "^6.5.1",
|
|
35
|
-
"ember-cli": "
|
|
35
|
+
"ember-cli": "~4.8.1",
|
|
36
36
|
"ember-cli-app-version": "^2.0.0",
|
|
37
37
|
"ember-cli-dependency-checker": "^3.2.0",
|
|
38
38
|
"ember-cli-eslint": "^4.2.3",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"ember-cli-release": "^0.2.9",
|
|
44
44
|
"ember-cli-sri": "^2.1.1",
|
|
45
45
|
"ember-cli-uglify": "^1.2.0",
|
|
46
|
-
"ember-data": "3
|
|
46
|
+
"ember-data": "~4.7.3",
|
|
47
47
|
"ember-data-factory-guy": "3.9.4",
|
|
48
48
|
"ember-data-model-fragments": "4.0.0",
|
|
49
49
|
"ember-disable-prototype-extensions": "^1.1.0",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"ember-load-initializers": "^2.0.0",
|
|
52
52
|
"ember-resolver": "5.0.1",
|
|
53
53
|
"ember-sinon": "4.0.0",
|
|
54
|
-
"ember-source": "
|
|
54
|
+
"ember-source": "~4.8.0",
|
|
55
55
|
"ember-source-channel-url": "^1.1.0",
|
|
56
56
|
"ember-try": "^0.2.23",
|
|
57
57
|
"loader.js": "4.7.0"
|
package/addon/initializer.js
DELETED