@cityads/ember-data-change-tracker 0.11.3 → 0.12.0-beta.0
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 +45 -31
- package/addon/index.js +2 -2
- package/addon/{model-ext.js → mixins/change-tracker.js} +3 -5
- package/addon/mixins/keep-only-changed.js +2 -2
- package/addon/tracker.js +1 -2
- package/addon/transforms/object.js +6 -6
- package/addon/utilities.js +1 -1
- 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
|
@@ -5,18 +5,18 @@
|
|
|
5
5
|
**New**
|
|
6
6
|
- Experimental feature
|
|
7
7
|
- isDirty, hasDirtyRelations computed properties
|
|
8
|
-
- Set up in [configuration](https://github.com/
|
|
8
|
+
- Set up in [configuration](https://github.com/AlexMayants/ember-data-change-tracker#configuration) as { enableIsDirty: true }
|
|
9
9
|
- It is experimental and a has one crippling defect, it can not track object type
|
|
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,10 +31,10 @@ 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
|
-
* `ember install ember-data-change-tracker`
|
|
37
|
+
* `ember install @cityads/ember-data-change-tracker`
|
|
38
38
|
|
|
39
39
|
## Why?
|
|
40
40
|
|
|
@@ -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,
|
|
@@ -128,7 +142,7 @@ Usage:
|
|
|
128
142
|
### isDirty, hasDirtyRelations
|
|
129
143
|
- Computed properties to check if the model has changed
|
|
130
144
|
- Not enabled by default
|
|
131
|
-
- Need to set enableIsDirty ( true ) on model or global [configuration](https://github.com/
|
|
145
|
+
- Need to set enableIsDirty ( true ) on model or global [configuration](https://github.com/AlexMayants/ember-data-change-tracker#configuration)
|
|
132
146
|
- The only attributes that can NOT be tracked with isDirty are object/array
|
|
133
147
|
attributes
|
|
134
148
|
|
|
@@ -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* }
|
|
@@ -245,7 +259,7 @@ Example:
|
|
|
245
259
|
```javascript
|
|
246
260
|
// file: app/serializers/user.js
|
|
247
261
|
import DS from 'ember-data';
|
|
248
|
-
import keepOnlyChanged from 'ember-data-change-tracker/mixins/keep-only-changed';
|
|
262
|
+
import keepOnlyChanged from '@cityads/ember-data-change-tracker/mixins/keep-only-changed';
|
|
249
263
|
|
|
250
264
|
export default DS.RESTSerializer.extend(keepOnlyChanged);
|
|
251
265
|
```
|
|
@@ -295,7 +309,7 @@ For example:
|
|
|
295
309
|
|
|
296
310
|
import {moduleForModel, test} from 'ember-qunit';
|
|
297
311
|
import {make, manualSetup} from 'ember-data-factory-guy';
|
|
298
|
-
import {initializer as changeInitializer} from 'ember-data-change-tracker';
|
|
312
|
+
import {initializer as changeInitializer} from '@cityads/ember-data-change-tracker';
|
|
299
313
|
|
|
300
314
|
moduleForModel('project', 'Unit | Model | project', {
|
|
301
315
|
|
|
@@ -305,4 +319,4 @@ moduleForModel('project', 'Unit | Model | project', {
|
|
|
305
319
|
}
|
|
306
320
|
});
|
|
307
321
|
|
|
308
|
-
```
|
|
322
|
+
```
|
package/addon/index.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import Ember from 'ember';
|
|
2
2
|
import Model from 'ember-data/model';
|
|
3
|
-
import Tracker from '
|
|
3
|
+
import Tracker from '../tracker';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Model.reopen({
|
|
5
|
+
export default Model.extend({
|
|
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/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
|
}
|
package/addon/utilities.js
CHANGED
|
@@ -21,7 +21,7 @@ export const relationShipTransform = {
|
|
|
21
21
|
hasMany: {
|
|
22
22
|
serialize(model, key, options) {
|
|
23
23
|
let relationship = model.hasMany(key).hasManyRelationship;
|
|
24
|
-
let value = relationship.state.hasReceivedData ? relationship.
|
|
24
|
+
let value = relationship.state.hasReceivedData ? relationship.localState: relationship.remoteState;
|
|
25
25
|
return value && value.map(item => modelTransform(item, options.polymorphic));
|
|
26
26
|
},
|
|
27
27
|
|
|
@@ -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.0",
|
|
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