From 4b3c46e63048b203b6b86fc23f132ec661137540 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Wed, 29 Jul 2026 17:53:01 +0900 Subject: [PATCH 1/4] BREAKING: `modelService.delete()` does not `refetchObservableQueries()` #12584 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The most common use case for `modelService.delete()` is from a page detail, and after deletion the user is redirected to the page listing. So there is no need to `refetchObservableQueries()` unconditionally. # Other use cases For other use cases we can reload specific queries like those examples. ## Dialog From a dialog on top of the listing page: ```ts this.itemService .delete([id], { // Wait till we refresh the list under the dialog before closing the dialog, to avoid re-clicking on the just deleted item refetchQueries: [itemsQuery], awaitRefetchQueries: true, }) .subscribe({ next: () => { this.alertService.info(`Supprimé`); this.dialogRef.close(); } }); ``` ## Inline deletion in listing From a listing page where deletion is directly accessible on the row: ```ts this.itemService.delete([id], { refetchQueries: [itemsQuery], }).subscribe({ next: () => { this.alertService.info(`Supprimé`); }, error: () => this.deleting.delete(id), }); ``` ## Bulk deleting Bulk deleting via `NaturalAbstractList.bulkDelete()` still automatically refetch the listing of items, but no other queries anymore. --- e2e/utils.ts | 1 - package.json | 4 ++-- pnpm-lock.yaml | 40 ++++++++++++++++++++-------------------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/e2e/utils.ts b/e2e/utils.ts index a5a666a8..a50be76a 100644 --- a/e2e/utils.ts +++ b/e2e/utils.ts @@ -1,5 +1,4 @@ import {execFileSync, execSync} from 'node:child_process'; -import {DocumentNode} from '@apollo/client/core'; import {Page, Response} from '@playwright/test'; import {DocumentNode, getOperationAST} from 'graphql'; diff --git a/package.json b/package.json index 399022c8..0215a398 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,8 @@ "@angular/router": "^21.2.17", "@apollo/client": "^4.2.7", "@ecodev/fab-speed-dial": "^21.0.2", - "@ecodev/natural": "^71.0.1", - "@ecodev/natural-editor": "^71.0.1", + "@ecodev/natural": "72.0.0-alpha.1", + "@ecodev/natural-editor": "72.0.0-alpha.1", "@ecodev/natural-layout": "^2.0.2", "@graphql-codegen/cli": "^6.0.0", "@graphql-codegen/typescript-operations": "^5.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f7f8fa2e..23a7465d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,11 +42,11 @@ importers: specifier: ^21.0.2 version: 21.0.2(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(rxjs@7.8.2) '@ecodev/natural': - specifier: ^71.0.1 - version: 71.0.1(d8fa97316196c06b59471547a9a6ef26) + specifier: 72.0.0-alpha.1 + version: 72.0.0-alpha.1(d8fa97316196c06b59471547a9a6ef26) '@ecodev/natural-editor': - specifier: ^71.0.1 - version: 71.0.1(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@71.0.1(d8fa97316196c06b59471547a9a6ef26)) + specifier: 72.0.0-alpha.1 + version: 72.0.0-alpha.1(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@72.0.0-alpha.1(d8fa97316196c06b59471547a9a6ef26)) '@ecodev/natural-layout': specifier: ^2.0.2 version: 2.0.5 @@ -552,8 +552,8 @@ packages: '@angular/material': ^21.1 rxjs: ^7.8.2 - '@ecodev/natural-editor@71.0.1': - resolution: {integrity: sha512-fMEFUyaW5gmBGGxGCJKX/KHxrW1/70vgLR6DsHignfaHo6108Fj6lSV8YGVAwBgUq8q+V+jgG4qShr1qvTVGAQ==} + '@ecodev/natural-editor@72.0.0-alpha.1': + resolution: {integrity: sha512-XxQZjZdjtiu6gC1w55utSxSXwh6XjGlK1mC/RiadvfLfC1p6LsXpkkKAf4llyccd+yaeqL7QRDXIs7HMsvyN7w==} peerDependencies: '@angular/common': ^21.1.0 '@angular/core': ^21.1.0 @@ -564,8 +564,8 @@ packages: '@ecodev/natural-layout@2.0.5': resolution: {integrity: sha512-PcMT248B/XVOTdYUcpPhCdL2BbxwoxZghATnPSew4TMVMlLgk65bfMi2uY05Ywb+hPdbjwIJWZ7zepFlr/vDKw==} - '@ecodev/natural@71.0.1': - resolution: {integrity: sha512-g/QDjwNaUtdlf163EK6o7AgTFi2Q6n81n1Zofdc06l0NPOcXPv5iZ3ODyo7HKaO6rbRE7cI+c4WhrxFGKvFy8g==} + '@ecodev/natural@72.0.0-alpha.1': + resolution: {integrity: sha512-2wS/Qqxujc4Y8ISiT0sJ60jCwMNrCBofVb2+bju8tQjZ5f7/0BmvjXVo3TluggiYUzcR8EbP2sRNmyQ7uNOR+w==} hasBin: true peerDependencies: '@angular/cdk': ^21.1.0 @@ -3734,8 +3734,8 @@ packages: prosemirror-transform@1.12.0: resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} - prosemirror-view@1.42.1: - resolution: {integrity: sha512-rRqzZnRgkyh69XoOMrfFJHwauHscLBmHbq772kwbic1ymQAM8gXjzEbJse5j1ep2UO2HRIAQL0bY3kZ/RoqjVw==} + prosemirror-view@1.42.2: + resolution: {integrity: sha512-Pdg0l5kXm8aLDquFAnQFTCITg0q44sLqBlHlpsVLD9segdOao8TOfQdAhCrCXyVgPSRr6UDDROOIWA3bIrN9YQ==} proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -4959,13 +4959,13 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@ecodev/natural-editor@71.0.1(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@71.0.1(d8fa97316196c06b59471547a9a6ef26))': + '@ecodev/natural-editor@72.0.0-alpha.1(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@72.0.0-alpha.1(d8fa97316196c06b59471547a9a6ef26))': dependencies: '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/forms': 21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/material': 21.2.14(5d3abea766a539fd0b311e1932b77b1d) - '@ecodev/natural': 71.0.1(d8fa97316196c06b59471547a9a6ef26) + '@ecodev/natural': 72.0.0-alpha.1(d8fa97316196c06b59471547a9a6ef26) prosemirror-commands: 1.7.1 prosemirror-dropcursor: 1.8.3 prosemirror-gapcursor: 1.4.1 @@ -4978,12 +4978,12 @@ snapshots: prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 - prosemirror-view: 1.42.1 + prosemirror-view: 1.42.2 tslib: 2.8.1 '@ecodev/natural-layout@2.0.5': {} - '@ecodev/natural@71.0.1(d8fa97316196c06b59471547a9a6ef26)': + '@ecodev/natural@72.0.0-alpha.1(d8fa97316196c06b59471547a9a6ef26)': dependencies: '@angular/cdk': 21.2.14(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) @@ -8339,20 +8339,20 @@ snapshots: dependencies: prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.1 + prosemirror-view: 1.42.2 prosemirror-gapcursor@1.4.1: dependencies: prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 - prosemirror-view: 1.42.1 + prosemirror-view: 1.42.2 prosemirror-history@1.5.0: dependencies: prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.1 + prosemirror-view: 1.42.2 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: @@ -8390,7 +8390,7 @@ snapshots: dependencies: prosemirror-model: 1.25.11 prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.1 + prosemirror-view: 1.42.2 prosemirror-tables@1.8.5: dependencies: @@ -8398,13 +8398,13 @@ snapshots: prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 prosemirror-transform: 1.12.0 - prosemirror-view: 1.42.1 + prosemirror-view: 1.42.2 prosemirror-transform@1.12.0: dependencies: prosemirror-model: 1.25.11 - prosemirror-view@1.42.1: + prosemirror-view@1.42.2: dependencies: prosemirror-model: 1.25.11 prosemirror-state: 1.4.4 From 09af3c155d0f6788601ebec8c0c20b0445cbfad3 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Thu, 30 Jul 2026 15:01:04 +0900 Subject: [PATCH 2/4] BREAKING: `modelService.create()` does not `refetchObservableQueries()` #12584 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The most common use case for `modelService.create()` is from a page detail for creation, and after the creation the user is redirected to the page detail for edition. So there is no need to `refetchObservableQueries()` unconditionally. # Other use cases For other use cases we can reload specific queries like those examples. ## Dialog From a dialog on top of the listing page: ```ts this.itemService .create({...}, { // Refresh the list under the dialog refetchQueries: [itemsQuery] }) .subscribe(newItem => { this.alertService.info('Créé'); this.dialogRef.close(newItem); }); ``` ## Inline creation in listing From a listing page where row creation is inline, there is nothing to do, because the row already exists before we even mutate the server. --- package.json | 4 ++-- pnpm-lock.yaml | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 0215a398..6c516746 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,8 @@ "@angular/router": "^21.2.17", "@apollo/client": "^4.2.7", "@ecodev/fab-speed-dial": "^21.0.2", - "@ecodev/natural": "72.0.0-alpha.1", - "@ecodev/natural-editor": "72.0.0-alpha.1", + "@ecodev/natural": "72.0.0-alpha.2", + "@ecodev/natural-editor": "72.0.0-alpha.2", "@ecodev/natural-layout": "^2.0.2", "@graphql-codegen/cli": "^6.0.0", "@graphql-codegen/typescript-operations": "^5.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 23a7465d..bd290afd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,11 +42,11 @@ importers: specifier: ^21.0.2 version: 21.0.2(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(rxjs@7.8.2) '@ecodev/natural': - specifier: 72.0.0-alpha.1 - version: 72.0.0-alpha.1(d8fa97316196c06b59471547a9a6ef26) + specifier: 72.0.0-alpha.2 + version: 72.0.0-alpha.2(d8fa97316196c06b59471547a9a6ef26) '@ecodev/natural-editor': - specifier: 72.0.0-alpha.1 - version: 72.0.0-alpha.1(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@72.0.0-alpha.1(d8fa97316196c06b59471547a9a6ef26)) + specifier: 72.0.0-alpha.2 + version: 72.0.0-alpha.2(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@72.0.0-alpha.2(d8fa97316196c06b59471547a9a6ef26)) '@ecodev/natural-layout': specifier: ^2.0.2 version: 2.0.5 @@ -552,8 +552,8 @@ packages: '@angular/material': ^21.1 rxjs: ^7.8.2 - '@ecodev/natural-editor@72.0.0-alpha.1': - resolution: {integrity: sha512-XxQZjZdjtiu6gC1w55utSxSXwh6XjGlK1mC/RiadvfLfC1p6LsXpkkKAf4llyccd+yaeqL7QRDXIs7HMsvyN7w==} + '@ecodev/natural-editor@72.0.0-alpha.2': + resolution: {integrity: sha512-zwoFbp+Oj2zTH3e/InhDWFm7s6xehybMqaxE4En+GR3YS5lBJTJNHQJzaN5LDsLhdvr6C6GsI2a6vDrQL5TL3w==} peerDependencies: '@angular/common': ^21.1.0 '@angular/core': ^21.1.0 @@ -564,8 +564,8 @@ packages: '@ecodev/natural-layout@2.0.5': resolution: {integrity: sha512-PcMT248B/XVOTdYUcpPhCdL2BbxwoxZghATnPSew4TMVMlLgk65bfMi2uY05Ywb+hPdbjwIJWZ7zepFlr/vDKw==} - '@ecodev/natural@72.0.0-alpha.1': - resolution: {integrity: sha512-2wS/Qqxujc4Y8ISiT0sJ60jCwMNrCBofVb2+bju8tQjZ5f7/0BmvjXVo3TluggiYUzcR8EbP2sRNmyQ7uNOR+w==} + '@ecodev/natural@72.0.0-alpha.2': + resolution: {integrity: sha512-iXs4T3ZlYponTS97Kue3t2Xo6Nq5auSWvozywHMkwnco7q+htx+J+oK16Y6iZEUf8FwdZDHfUHPfS5NBbgXahQ==} hasBin: true peerDependencies: '@angular/cdk': ^21.1.0 @@ -4959,13 +4959,13 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@ecodev/natural-editor@72.0.0-alpha.1(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@72.0.0-alpha.1(d8fa97316196c06b59471547a9a6ef26))': + '@ecodev/natural-editor@72.0.0-alpha.2(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@72.0.0-alpha.2(d8fa97316196c06b59471547a9a6ef26))': dependencies: '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/forms': 21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/material': 21.2.14(5d3abea766a539fd0b311e1932b77b1d) - '@ecodev/natural': 72.0.0-alpha.1(d8fa97316196c06b59471547a9a6ef26) + '@ecodev/natural': 72.0.0-alpha.2(d8fa97316196c06b59471547a9a6ef26) prosemirror-commands: 1.7.1 prosemirror-dropcursor: 1.8.3 prosemirror-gapcursor: 1.4.1 @@ -4983,7 +4983,7 @@ snapshots: '@ecodev/natural-layout@2.0.5': {} - '@ecodev/natural@72.0.0-alpha.1(d8fa97316196c06b59471547a9a6ef26)': + '@ecodev/natural@72.0.0-alpha.2(d8fa97316196c06b59471547a9a6ef26)': dependencies: '@angular/cdk': 21.2.14(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) From a8521042794dd0db95d5d75686b55fbc319484e5 Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Fri, 31 Jul 2026 17:24:58 +0900 Subject: [PATCH 3/4] Simplify Permissions.php via Ecosystem 2.19.0 --- configuration/Permissions.php | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/configuration/Permissions.php b/configuration/Permissions.php index eb9b3cbc..c8727e7b 100644 --- a/configuration/Permissions.php +++ b/configuration/Permissions.php @@ -2,18 +2,11 @@ declare(strict_types=1); -$base = __DIR__ . '/../'; -$nodeModules = $base . 'node_modules/'; -$esbuild = is_dir($nodeModules) ? array_map( - fn (string $path) => [ - 'path' => str_replace($base, '', $path), +return [ + [ + 'path' => 'node_modules/**/bin/esbuild', 'permissions' => '0750', ], - explode(PHP_EOL, mb_trim(`find $nodeModules -type f -size +5M -path '*/bin/esbuild'`)), -) : []; - -return [ - ...$esbuild, [ 'path' => 'data/file', 'permissions' => '0770', From d5e6695124b349b1240c2beaa3319599faf7502a Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Mon, 3 Aug 2026 17:37:27 +0900 Subject: [PATCH 4/4] BREAKING: modelService `update()`, `updateNow()` and `createOrUpdate()` do not `refetchObservableQueries()` #12584 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The most common use case for `modelService.updateNow()`, and variants, is from a page detail for edition. The update mutation itself already fetches the very few fields that are server computed and should be refetched. So there is no need to `refetchObservableQueries()` unconditionally. # Other use cases For other use cases we can reload specific queries like those examples. ## Dialog From a dialog on top of the listing page: ```ts this.itemService .updateNow({...}, { // Wait till we refresh the list under the dialog before closing the dialog, to avoid re-clicking on the just updated item refetchQueries: [itemsQuery], awaitRefetchQueries: true }) .subscribe(newItem => { this.alertService.info('Mis à jour'); this.dialogRef.close(newItem); }); ``` ## Inline update in listing From a listing page where row update is inline, there is nothing to do, because the row already is up to date before we even mutate the server. ## Bulk updating Bulk updating is extremely rare in our projects, and should be treated on a case by base basis. Drop unused `BookingWithOwnerService.terminateBooking()` #12584 Drop debug code #12584 --- package.json | 4 ++-- pnpm-lock.yaml | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 6c516746..eb54734a 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,8 @@ "@angular/router": "^21.2.17", "@apollo/client": "^4.2.7", "@ecodev/fab-speed-dial": "^21.0.2", - "@ecodev/natural": "72.0.0-alpha.2", - "@ecodev/natural-editor": "72.0.0-alpha.2", + "@ecodev/natural": "72.0.0", + "@ecodev/natural-editor": "72.0.0", "@ecodev/natural-layout": "^2.0.2", "@graphql-codegen/cli": "^6.0.0", "@graphql-codegen/typescript-operations": "^5.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd290afd..1dad276d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,11 +42,11 @@ importers: specifier: ^21.0.2 version: 21.0.2(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(rxjs@7.8.2) '@ecodev/natural': - specifier: 72.0.0-alpha.2 - version: 72.0.0-alpha.2(d8fa97316196c06b59471547a9a6ef26) + specifier: 72.0.0 + version: 72.0.0(d8fa97316196c06b59471547a9a6ef26) '@ecodev/natural-editor': - specifier: 72.0.0-alpha.2 - version: 72.0.0-alpha.2(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@72.0.0-alpha.2(d8fa97316196c06b59471547a9a6ef26)) + specifier: 72.0.0 + version: 72.0.0(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@72.0.0(d8fa97316196c06b59471547a9a6ef26)) '@ecodev/natural-layout': specifier: ^2.0.2 version: 2.0.5 @@ -552,8 +552,8 @@ packages: '@angular/material': ^21.1 rxjs: ^7.8.2 - '@ecodev/natural-editor@72.0.0-alpha.2': - resolution: {integrity: sha512-zwoFbp+Oj2zTH3e/InhDWFm7s6xehybMqaxE4En+GR3YS5lBJTJNHQJzaN5LDsLhdvr6C6GsI2a6vDrQL5TL3w==} + '@ecodev/natural-editor@72.0.0': + resolution: {integrity: sha512-/wXWcJXfuECywvq9Lv5oz0T6OvjuTvF7AHPRV9E1aGiwMV/2gTQLK/OpaNfoHBqLjVErCNf0yZwq5oFp3orjOQ==} peerDependencies: '@angular/common': ^21.1.0 '@angular/core': ^21.1.0 @@ -564,8 +564,8 @@ packages: '@ecodev/natural-layout@2.0.5': resolution: {integrity: sha512-PcMT248B/XVOTdYUcpPhCdL2BbxwoxZghATnPSew4TMVMlLgk65bfMi2uY05Ywb+hPdbjwIJWZ7zepFlr/vDKw==} - '@ecodev/natural@72.0.0-alpha.2': - resolution: {integrity: sha512-iXs4T3ZlYponTS97Kue3t2Xo6Nq5auSWvozywHMkwnco7q+htx+J+oK16Y6iZEUf8FwdZDHfUHPfS5NBbgXahQ==} + '@ecodev/natural@72.0.0': + resolution: {integrity: sha512-XiAgw9Ca1XToAsCVmQ3vqO/aY1j5I9SnAJojpBtvFKAB9KgqO/Q3DPCWVi6UHYxsGKb6E1iRQdmclZ9y0Px5xQ==} hasBin: true peerDependencies: '@angular/cdk': ^21.1.0 @@ -4959,13 +4959,13 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - '@ecodev/natural-editor@72.0.0-alpha.2(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@72.0.0-alpha.2(d8fa97316196c06b59471547a9a6ef26))': + '@ecodev/natural-editor@72.0.0(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/forms@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@angular/material@21.2.14(5d3abea766a539fd0b311e1932b77b1d))(@ecodev/natural@72.0.0(d8fa97316196c06b59471547a9a6ef26))': dependencies: '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) '@angular/core': 21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1) '@angular/forms': 21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/material': 21.2.14(5d3abea766a539fd0b311e1932b77b1d) - '@ecodev/natural': 72.0.0-alpha.2(d8fa97316196c06b59471547a9a6ef26) + '@ecodev/natural': 72.0.0(d8fa97316196c06b59471547a9a6ef26) prosemirror-commands: 1.7.1 prosemirror-dropcursor: 1.8.3 prosemirror-gapcursor: 1.4.1 @@ -4983,7 +4983,7 @@ snapshots: '@ecodev/natural-layout@2.0.5': {} - '@ecodev/natural@72.0.0-alpha.2(d8fa97316196c06b59471547a9a6ef26)': + '@ecodev/natural@72.0.0(d8fa97316196c06b59471547a9a6ef26)': dependencies: '@angular/cdk': 21.2.14(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.2.17(@angular/common@21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@angular/common': 21.2.17(@angular/core@21.2.17(@angular/compiler@21.2.17)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)