From 7ee00243d3b096180175a09a6784fd66338a1224 Mon Sep 17 00:00:00 2001 From: michaeljymsgutierrez Date: Thu, 16 Apr 2026 03:16:59 +0800 Subject: [PATCH 1/9] Implemented and injected collection record _rollbackRecordAttributes --- packages/dist/arm-js-library.js | 22 ++++++++++++++++++++++ packages/src/lib/api-resource-manager.js | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+) 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) From 73498cf9e4142c9cbec763d183cfe1b7e2ebe420 Mon Sep 17 00:00:00 2001 From: michaeljymsgutierrez Date: Sun, 19 Apr 2026 01:19:10 +0800 Subject: [PATCH 2/9] Added rollbackAttributes unit test --- packages/tests/units/record.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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) From dd4a6a565943c8f68e441d6d27f7ace769ae1595 Mon Sep 17 00:00:00 2001 From: michaeljymsgutierrez Date: Sun, 19 Apr 2026 01:42:53 +0800 Subject: [PATCH 3/9] Renamed demo route for collection records request-functions to request-retrieve-functions --- .../destroy-record/model.js | 0 .../destroy-record/page.jsx | 0 .../get-collection/model.js | 0 .../get-collection/page.jsx | 0 .../reload/model.js | 0 .../reload/page.jsx | 0 .../save/model.js | 0 .../save/page.jsx | 0 apps/create-next-app/src/app/demo/page.jsx | 8 ++++---- 9 files changed, 4 insertions(+), 4 deletions(-) rename apps/create-next-app/src/app/demo/collection-records/{request-functions => request-retrieve-functions}/destroy-record/model.js (100%) rename apps/create-next-app/src/app/demo/collection-records/{request-functions => request-retrieve-functions}/destroy-record/page.jsx (100%) rename apps/create-next-app/src/app/demo/collection-records/{request-functions => request-retrieve-functions}/get-collection/model.js (100%) rename apps/create-next-app/src/app/demo/collection-records/{request-functions => request-retrieve-functions}/get-collection/page.jsx (100%) rename apps/create-next-app/src/app/demo/collection-records/{request-functions => request-retrieve-functions}/reload/model.js (100%) rename apps/create-next-app/src/app/demo/collection-records/{request-functions => request-retrieve-functions}/reload/page.jsx (100%) rename apps/create-next-app/src/app/demo/collection-records/{request-functions => request-retrieve-functions}/save/model.js (100%) rename apps/create-next-app/src/app/demo/collection-records/{request-functions => request-retrieve-functions}/save/page.jsx (100%) 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/save/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/save/model.js 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..9fca2be 100644 --- a/apps/create-next-app/src/app/demo/page.jsx +++ b/apps/create-next-app/src/app/demo/page.jsx @@ -24,10 +24,10 @@ 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/save', '/demo/collection-records/state-properties', '/demo/create-collection-record-function/create-record', '/demo/push-collection-record-function/push-payload', From 998cd21351b78e5f399975bc6ccf34010b8e951a Mon Sep 17 00:00:00 2001 From: michaeljymsgutierrez Date: Sun, 19 Apr 2026 01:53:19 +0800 Subject: [PATCH 4/9] Updated demo route links for renamed path --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2cd9131..1fb7430 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 @@ -746,7 +746,7 @@ See example [here](https://github.com/michaeljymsgutierrez/arm-js-library/tree/m - 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 +779,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. From 8dc4c6bbfc7c83c00ed5ca5a48613e3ea559cc8e Mon Sep 17 00:00:00 2001 From: michaeljymsgutierrez Date: Sun, 19 Apr 2026 01:55:35 +0800 Subject: [PATCH 5/9] Updated credits section --- README.md | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 1fb7430..4710212 100644 --- a/README.md +++ b/README.md @@ -1056,26 +1056,9 @@ const addresses = [ ## Credits - - Axl Asuncion - - - - Luigi Cruz - - - - Dickson Palomeras - +- **Axl Asuncion** - Original logo/design creator +- **Luigi Cruz** - Features and bugs feedback +- **Dickson Palomeras** - Features and bugs feedback ## License From 7c25b596609f2ba33bdafcb20e995b32c92c5908 Mon Sep 17 00:00:00 2001 From: michaeljymsgutierrez Date: Sun, 19 Apr 2026 02:01:47 +0800 Subject: [PATCH 6/9] Added credit links --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4710212..f1e415a 100644 --- a/README.md +++ b/README.md @@ -1056,9 +1056,9 @@ const addresses = [ ## Credits -- **Axl Asuncion** - Original logo/design creator -- **Luigi Cruz** - Features and bugs feedback -- **Dickson Palomeras** - Features and bugs feedback +- **[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 From 8351e872f0857a11419563c186ee17ea930638af Mon Sep 17 00:00:00 2001 From: michaeljymsgutierrez Date: Sun, 19 Apr 2026 02:24:35 +0800 Subject: [PATCH 7/9] Added demo route for record rollbackAttributes --- .../rollback-attributes/model.js | 7 + .../rollback-attributes/page.jsx | 132 ++++++++++++++++++ apps/create-next-app/src/app/demo/page.jsx | 1 + 3 files changed, 140 insertions(+) create mode 100644 apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes/model.js create mode 100644 apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes/page.jsx diff --git a/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes/model.js b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes/model.js new file mode 100644 index 0000000..800ecdb --- /dev/null +++ b/apps/create-next-app/src/app/demo/collection-records/request-retrieve-functions/rollback-attributes/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-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..6e93471 --- /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/page.jsx b/apps/create-next-app/src/app/demo/page.jsx index 9fca2be..51dd645 100644 --- a/apps/create-next-app/src/app/demo/page.jsx +++ b/apps/create-next-app/src/app/demo/page.jsx @@ -27,6 +27,7 @@ const DemoPage = () => { '/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', From dd385f4c719b25cb847646f842c4e180e81a5db0 Mon Sep 17 00:00:00 2001 From: michaeljymsgutierrez Date: Sun, 19 Apr 2026 02:25:18 +0800 Subject: [PATCH 8/9] Renamed button Rollback to Rollback Attributes --- .../request-retrieve-functions/rollback-attributes/page.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 6e93471..04e9859 100644 --- 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 @@ -122,7 +122,7 @@ const Page = observer(() => { From f57da577b1ef312227ca749e0c6d3af326f327bd Mon Sep 17 00:00:00 2001 From: michaeljymsgutierrez Date: Sun, 19 Apr 2026 02:28:12 +0800 Subject: [PATCH 9/9] Added section for rollbackAttributes --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index f1e415a..6c7348e 100644 --- a/README.md +++ b/README.md @@ -741,6 +741,14 @@ 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`