diff --git a/README.md b/README.md index 2cd9131..6c7348e 100644 --- a/README.md +++ b/README.md @@ -702,7 +702,7 @@ See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/m address.get('attributes.label') ``` -- **Request Functions** +- **Request and Retrieve Functions** - **save(collectionConfig)** - Persist collection record changes to server. - Create a new record to server only if it doesn't already exist in the database. @@ -711,7 +711,7 @@ See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/m - Will call **PUT** method: `PUT /addresses/2519858` - Support collectionConfig. - **optional** - Available collectionConfig `(skip, alias, autoResolve, ignorePayload, override)` - - See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/main/apps/create-next-app/src/app/demo/collection-records/request-functions/save) + - See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/main/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/save) ```javascript // Returned promise @@ -727,7 +727,7 @@ See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/m - Will call **GET** method: `GET /addresses/2519858` - Support collectionConfig. - **optional** - Available collectionConfig `(skip, alias, autoResolve, ignorePayload, override)` - - See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/main/apps/create-next-app/src/app/demo/collection-records/request-functions/reload) + - See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/main/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/reload) ```javascript // Returned promise @@ -741,12 +741,20 @@ See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/m }) ``` + - **rollbackAttributes()** + - Rollback record attributes to their original state without triggering a request. + - See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/main/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes) + + ```javascript + address.rollbackAttributes() + ``` + - **destroyRecord(collectionConfig)** - Remove collection record permanently from server. - Will call **GET** method: `DELETE /addresses/2519858` - Support collectionConfig. - **optional** - Available collectionConfig `(skip, alias, autoResolve, ignorePayload, override)` - - See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/main/apps/create-next-app/src/app/demo/collection-records/request-functions/destroy-record) + - See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/main/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/destroy-record) ```javascript // Returned promise @@ -779,7 +787,7 @@ See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/m - Sort returned collection records based on passed array of sort criteria. - **config - Object** - Contains request config such as `(skip, alias, autoResolve, ignorePayload, override)` which are currently available. - - See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/main/apps/create-next-app/src/app/demo/collection-records/request-functions/get-collection) + - See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/main/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/get-collection) ```javascript // Get user record from the server but don't preload addresses records. @@ -1056,26 +1064,9 @@ const addresses = [ ## Credits - - Axl Asuncion - - - - Luigi Cruz - - - - Dickson Palomeras - +- **[Axl Asuncion](https://www.facebook.com/skpcls)** - Original logo/design creator +- **[Luigi Cruz](https://github.com/luigircruz)** - Features and bugs feedback +- **[Dickson Palomeras](https://github.com/DicksonPal)** - Features and bugs feedback ## License diff --git a/apps/create-next-app/src/app/demo/collection-records/request-functions/destroy-record/model.js b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/destroy-record/model.js similarity index 100% rename from apps/create-next-app/src/app/demo/collection-records/request-functions/destroy-record/model.js rename to apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/destroy-record/model.js diff --git a/apps/create-next-app/src/app/demo/collection-records/request-functions/destroy-record/page.jsx b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/destroy-record/page.jsx similarity index 100% rename from apps/create-next-app/src/app/demo/collection-records/request-functions/destroy-record/page.jsx rename to apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/destroy-record/page.jsx diff --git a/apps/create-next-app/src/app/demo/collection-records/request-functions/get-collection/model.js b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/get-collection/model.js similarity index 100% rename from apps/create-next-app/src/app/demo/collection-records/request-functions/get-collection/model.js rename to apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/get-collection/model.js diff --git a/apps/create-next-app/src/app/demo/collection-records/request-functions/get-collection/page.jsx b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/get-collection/page.jsx similarity index 100% rename from apps/create-next-app/src/app/demo/collection-records/request-functions/get-collection/page.jsx rename to apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/get-collection/page.jsx diff --git a/apps/create-next-app/src/app/demo/collection-records/request-functions/reload/model.js b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/reload/model.js similarity index 100% rename from apps/create-next-app/src/app/demo/collection-records/request-functions/reload/model.js rename to apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/reload/model.js diff --git a/apps/create-next-app/src/app/demo/collection-records/request-functions/reload/page.jsx b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/reload/page.jsx similarity index 100% rename from apps/create-next-app/src/app/demo/collection-records/request-functions/reload/page.jsx rename to apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/reload/page.jsx diff --git a/apps/create-next-app/src/app/demo/collection-records/request-functions/save/model.js b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes/model.js similarity index 100% rename from apps/create-next-app/src/app/demo/collection-records/request-functions/save/model.js rename to apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes/model.js diff --git a/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes/page.jsx b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes/page.jsx new file mode 100644 index 0000000..04e9859 --- /dev/null +++ b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes/page.jsx @@ -0,0 +1,132 @@ +'use client' + +import { observer } from 'mobx-react' +import Model from './model' + +const Page = observer(() => { + const { isLoading, data: address } = Model() + + if (isLoading) return
Loading...
+ + return ( +
event.preventDefault()}> +
+ + + address.set('attributes.address1', event.target.value) + } + /> +
+ +
+ + + address.set('attributes.address2', event.target.value) + } + /> +
+ +
+ + + address.set('attributes.city', event.target.value) + } + /> +
+ +
+ + + address.set('attributes.post-code', event.target.value) + } + /> +
+ +
+ + + address.set('attributes.landmark', event.target.value) + } + /> +
+ +
+ + + address.set('attributes.kind', event.target.value) + } + /> +
+ +
+ + + address.set('attributes.label', event.target.value) + } + /> +
+ +
+ + + address.set('attributes.latitude', event.target.value) + } + /> +
+ +
+ + + address.set('attributes.longitude', event.target.value) + } + /> +
+ +
+ +
+
+ ) +}) + +export default Page diff --git a/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/save/model.js b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/save/model.js new file mode 100644 index 0000000..800ecdb --- /dev/null +++ b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/save/model.js @@ -0,0 +1,7 @@ +import { ARM } from '@/components/providers/arm-config-provider' + +const Model = () => { + return ARM.findRecord('addresses', 2519858, { include: 'user' }) +} + +export default Model diff --git a/apps/create-next-app/src/app/demo/collection-records/request-functions/save/page.jsx b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/save/page.jsx similarity index 100% rename from apps/create-next-app/src/app/demo/collection-records/request-functions/save/page.jsx rename to apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/save/page.jsx diff --git a/apps/create-next-app/src/app/demo/page.jsx b/apps/create-next-app/src/app/demo/page.jsx index 9c92acd..51dd645 100644 --- a/apps/create-next-app/src/app/demo/page.jsx +++ b/apps/create-next-app/src/app/demo/page.jsx @@ -24,10 +24,11 @@ const highlightMatch = (text, searchTerm) => { const DemoPage = () => { const links = [ '/demo/collection-records/getter-setter-functions', - '/demo/collection-records/request-functions/destroy-record', - '/demo/collection-records/request-functions/get-collection', - '/demo/collection-records/request-functions/reload', - '/demo/collection-records/request-functions/save', + '/demo/collection-records/request-retrieve-functions/destroy-record', + '/demo/collection-records/request-retrieve-functions/get-collection', + '/demo/collection-records/request-retrieve-functions/reload', + '/demo/collection-records/request-retrieve-functions/rollback-attributes', + '/demo/collection-records/request-retrieve-functions/save', '/demo/collection-records/state-properties', '/demo/create-collection-record-function/create-record', '/demo/push-collection-record-function/push-payload', diff --git a/packages/dist/arm-js-library.js b/packages/dist/arm-js-library.js index 68b6c46..325bfa3 100644 --- a/packages/dist/arm-js-library.js +++ b/packages/dist/arm-js-library.js @@ -601,6 +601,27 @@ Fix: Try adding ${collectionName} on your ARM config initialization.`; } }); } + /** + * Reverts the record's attributes to their original state. + * + * This method retrieves the stored `originalRecord` (excluding internal + * ARM properties), applies those values back to the current record instance, + * and resets the `isDirty` and `isPristine` state flags. + * + * @private + * @returns {void} + */ + _rollbackRecordAttributes() { + const originalRecord = omit( + toJS(this.originalRecord), + keysToBeOmittedOnDeepCheck + ); + this.getARMContext()._setProperties(this, { + ...originalRecord, + isDirty: false, + isPristine: true + }); + } /** * Retrieves records from a specified collection based on given criteria. * @@ -695,6 +716,7 @@ Fix: Try adding ${collectionName} on your ARM config initialization.`; get: armInstance._getRecordProperty, set: armInstance._setRecordProperty, setProperties: armInstance._setRecordProperties, + rollbackAttributes: armInstance._rollbackRecordAttributes, getARMContext: () => armInstance, save: function(collectionConfig) { return armInstance._saveRecord(this, collectionConfig); diff --git a/packages/src/lib/api-resource-manager.js b/packages/src/lib/api-resource-manager.js index c156494..0b7ef72 100644 --- a/packages/src/lib/api-resource-manager.js +++ b/packages/src/lib/api-resource-manager.js @@ -746,6 +746,29 @@ export default class ApiResourceManager { }) } + /** + * Reverts the record's attributes to their original state. + * + * This method retrieves the stored `originalRecord` (excluding internal + * ARM properties), applies those values back to the current record instance, + * and resets the `isDirty` and `isPristine` state flags. + * + * @private + * @returns {void} + */ + _rollbackRecordAttributes() { + const originalRecord = omit( + toJS(this.originalRecord), + keysToBeOmittedOnDeepCheck, + ) + + this.getARMContext()._setProperties(this, { + ...originalRecord, + isDirty: false, + isPristine: true, + }) + } + /** * Retrieves records from a specified collection based on given criteria. * @@ -851,6 +874,7 @@ export default class ApiResourceManager { get: armInstance._getRecordProperty, set: armInstance._setRecordProperty, setProperties: armInstance._setRecordProperties, + rollbackAttributes: armInstance._rollbackRecordAttributes, getARMContext: () => armInstance, save: function (collectionConfig) { return armInstance._saveRecord(this, collectionConfig) diff --git a/packages/tests/units/record.js b/packages/tests/units/record.js index 18ba127..5bb7795 100644 --- a/packages/tests/units/record.js +++ b/packages/tests/units/record.js @@ -158,6 +158,23 @@ const execRecordTest = (ARM) => { expect(record.get('attributes.address1')).toBe('Anabu Hills Test 4') }) + test('Verify rollbackAttributes functionality', async () => { + ARM.clearCollection('addresses') + expect(ARM.getCollection('addresses')).toHaveLength(0) + + await ARM.findRecord('addresses', 2518368, null, { + autoResolve: false, + skipId: uuidv1(), + }) + const record = ARM.peekRecord('addresses', 2518368) + + record.set('attributes.address1', 'Anabu Hills Modified') + record.rollbackAttributes() + + expect(record.get('isPristine')).toBe(true) + expect(record.get('attributes.address1')).toBe('Anabu Hills Test 4') + }) + test('Verify destroyRecord functionality', async () => { ARM.clearCollection('addresses') expect(ARM.getCollection('addresses')).toHaveLength(0)