Skip to content

Commit ac68b75

Browse files
Revert "Demos | DataGrid - BatchUpdateRequest: Support BackEnd / EndPoint Anti Forgery (all frameworks) (#32057)"
This reverts commit bb94682. # Conflicts: # apps/demos/utils/visual-tests/matrix-test-helper.ts
1 parent c5bb2cd commit ac68b75

File tree

7 files changed

+80
-422
lines changed

7 files changed

+80
-422
lines changed

apps/demos/Demos/DataGrid/BatchUpdateRequest/Angular/app/app.component.ts

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
import { bootstrapApplication } from '@angular/platform-browser';
22
import { Component, enableProdMode, provideZoneChangeDetection } from '@angular/core';
3-
import { HttpClient, provideHttpClient, withFetch, withInterceptors } from '@angular/common/http';
3+
import { HttpClient, provideHttpClient, withFetch } from '@angular/common/http';
44
import { lastValueFrom } from 'rxjs';
55
import * as AspNetData from 'devextreme-aspnet-data-nojquery';
66
import { DxDataGridComponent, DxDataGridModule, DxDataGridTypes } from 'devextreme-angular/ui/data-grid';
7-
import { antiForgeryInterceptor, AntiForgeryTokenService } from './app.service';
87

98
if (!/localhost/.test(document.location.host)) {
109
enableProdMode();
1110
}
1211

13-
const BASE_PATH = 'https://js.devexpress.com/Demos/NetCore';
14-
const URL = `${BASE_PATH}/api/DataGridBatchUpdateWebApi`;
12+
const URL = 'https://js.devexpress.com/Demos/NetCore/api/DataGridBatchUpdateWebApi';
1513

1614
let modulePrefix = '';
1715
// @ts-ignore
@@ -30,16 +28,12 @@ if (window && window.config?.packageConfigPaths) {
3028
export class AppComponent {
3129
ordersStore: AspNetData.CustomStore;
3230

33-
constructor(private http: HttpClient, private tokenService: AntiForgeryTokenService) {
31+
constructor(private http: HttpClient) {
3432
this.ordersStore = AspNetData.createStore({
3533
key: 'OrderID',
3634
loadUrl: `${URL}/Orders`,
37-
async onBeforeSend(_method, ajaxOptions) {
38-
const tokenData = await lastValueFrom(tokenService.getToken());
39-
ajaxOptions.xhrFields = {
40-
withCredentials: true,
41-
headers: { [tokenData.headerName]: tokenData.token },
42-
};
35+
onBeforeSend(method, ajaxOptions) {
36+
ajaxOptions.xhrFields = { withCredentials: true };
4337
},
4438
});
4539
}
@@ -58,23 +52,16 @@ export class AppComponent {
5852
changes: DxDataGridTypes.DataChange[],
5953
component: DxDataGridComponent['instance'],
6054
): Promise<void> {
61-
try {
62-
await lastValueFrom(
63-
this.http.post(url, JSON.stringify(changes), {
64-
withCredentials: true,
65-
headers: {
66-
'Content-Type': 'application/json',
67-
},
68-
}),
69-
);
70-
await component.refresh(true);
71-
component.cancelEditData();
72-
} catch (error: any) {
73-
const errorMessage = (typeof error?.error === 'string' && error.error)
74-
? error.error
75-
: (error?.statusText || 'Unknown error');
76-
throw new Error(`Batch save failed: ${errorMessage}`);
77-
}
55+
await lastValueFrom(
56+
this.http.post(url, JSON.stringify(changes), {
57+
withCredentials: true,
58+
headers: {
59+
'Content-Type': 'application/json',
60+
},
61+
}),
62+
);
63+
await component.refresh(true);
64+
component.cancelEditData();
7865
}
7966

8067
normalizeChanges(changes: DxDataGridTypes.DataChange[]): DxDataGridTypes.DataChange[] {
@@ -106,9 +93,6 @@ export class AppComponent {
10693
bootstrapApplication(AppComponent, {
10794
providers: [
10895
provideZoneChangeDetection({ eventCoalescing: true, runCoalescing: true }),
109-
provideHttpClient(
110-
withFetch(),
111-
withInterceptors([antiForgeryInterceptor]),
112-
),
96+
provideHttpClient(withFetch()),
11397
],
11498
});

apps/demos/Demos/DataGrid/BatchUpdateRequest/Angular/app/app.service.ts

Lines changed: 0 additions & 104 deletions
This file was deleted.

apps/demos/Demos/DataGrid/BatchUpdateRequest/React/App.tsx

Lines changed: 17 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,13 @@ import type { DataGridRef, DataGridTypes } from 'devextreme-react/data-grid';
44
import { createStore } from 'devextreme-aspnet-data-nojquery';
55
import 'whatwg-fetch';
66

7-
const BASE_PATH = 'https://js.devexpress.com/Demos/NetCore';
8-
const URL = `${BASE_PATH}/api/DataGridBatchUpdateWebApi`;
9-
10-
async function fetchAntiForgeryToken(): Promise<{ headerName: string; token: string }> {
11-
try {
12-
const response = await fetch(`${BASE_PATH}/api/Common/GetAntiForgeryToken`, {
13-
method: 'GET',
14-
credentials: 'include',
15-
cache: 'no-cache',
16-
});
17-
18-
if (!response.ok) {
19-
const errorMessage = await response.text();
20-
throw new Error(`Failed to retrieve anti-forgery token: ${errorMessage || response.statusText}`);
21-
}
22-
23-
return await response.json();
24-
} catch (error) {
25-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
26-
throw new Error(errorMessage);
27-
}
28-
}
29-
30-
async function getAntiForgeryTokenValue(): Promise<{ headerName: string; token: string }> {
31-
const tokenMeta = document.querySelector<HTMLMetaElement>('meta[name="csrf-token"]');
32-
if (tokenMeta) {
33-
const headerName = tokenMeta.dataset.headerName || 'RequestVerificationToken';
34-
const token = tokenMeta.getAttribute('content') || '';
35-
return Promise.resolve({ headerName, token });
36-
}
37-
38-
const tokenData = await fetchAntiForgeryToken();
39-
const meta = document.createElement('meta');
40-
meta.name = 'csrf-token';
41-
meta.content = tokenData.token;
42-
meta.dataset.headerName = tokenData.headerName;
43-
document.head.appendChild(meta);
44-
return tokenData;
45-
}
7+
const URL = 'https://js.devexpress.com/Demos/NetCore/api/DataGridBatchUpdateWebApi';
468

479
const ordersStore = createStore({
4810
key: 'OrderID',
4911
loadUrl: `${URL}/Orders`,
50-
async onBeforeSend(_method, ajaxOptions) {
51-
const tokenData = await getAntiForgeryTokenValue();
52-
ajaxOptions.xhrFields = {
53-
withCredentials: true,
54-
headers: { [tokenData.headerName]: tokenData.token },
55-
};
12+
onBeforeSend: (method, ajaxOptions) => {
13+
ajaxOptions.xhrFields = { withCredentials: true };
5614
},
5715
});
5816

@@ -81,31 +39,25 @@ function normalizeChanges(changes: DataGridTypes.DataChange[]): DataGridTypes.Da
8139
}) as DataGridTypes.DataChange[];
8240
}
8341

84-
async function sendBatchRequest(url: string, changes: DataGridTypes.DataChange[], headers: Record<string, string>) {
85-
try {
86-
const response = await fetch(url, {
87-
method: 'POST',
88-
body: JSON.stringify(changes),
89-
headers: {
90-
'Content-Type': 'application/json;charset=UTF-8',
91-
...headers,
92-
},
93-
credentials: 'include',
94-
});
42+
async function sendBatchRequest(url: string, changes: DataGridTypes.DataChange[]) {
43+
const result = await fetch(url, {
44+
method: 'POST',
45+
body: JSON.stringify(changes),
46+
headers: {
47+
'Content-Type': 'application/json;charset=UTF-8',
48+
},
49+
credentials: 'include',
50+
});
9551

96-
if (!response.ok) {
97-
const errorMessage = await response.text();
98-
throw new Error(`Batch save failed: ${errorMessage || response.statusText}`);
99-
}
100-
} catch (error) {
101-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
102-
throw new Error(errorMessage);
52+
if (!result.ok) {
53+
const json = await result.json();
54+
55+
throw json.Message;
10356
}
10457
}
10558

10659
async function processBatchRequest(url: string, changes: DataGridTypes.DataChange[], component: ReturnType<DataGridRef['instance']>) {
107-
const tokenData = await getAntiForgeryTokenValue();
108-
await sendBatchRequest(url, changes, { [tokenData.headerName]: tokenData.token });
60+
await sendBatchRequest(url, changes);
10961
await component.refresh(true);
11062
component.cancelEditData();
11163
}

apps/demos/Demos/DataGrid/BatchUpdateRequest/ReactJs/App.js

Lines changed: 16 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -3,51 +3,12 @@ import DataGrid, { Column, Editing, Pager } from 'devextreme-react/data-grid';
33
import { createStore } from 'devextreme-aspnet-data-nojquery';
44
import 'whatwg-fetch';
55

6-
const BASE_PATH = 'https://js.devexpress.com/Demos/NetCore';
7-
const URL = `${BASE_PATH}/api/DataGridBatchUpdateWebApi`;
8-
async function fetchAntiForgeryToken() {
9-
try {
10-
const response = await fetch(`${BASE_PATH}/api/Common/GetAntiForgeryToken`, {
11-
method: 'GET',
12-
credentials: 'include',
13-
cache: 'no-cache',
14-
});
15-
if (!response.ok) {
16-
const errorMessage = await response.text();
17-
throw new Error(
18-
`Failed to retrieve anti-forgery token: ${errorMessage || response.statusText}`,
19-
);
20-
}
21-
return await response.json();
22-
} catch (error) {
23-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
24-
throw new Error(errorMessage);
25-
}
26-
}
27-
async function getAntiForgeryTokenValue() {
28-
const tokenMeta = document.querySelector('meta[name="csrf-token"]');
29-
if (tokenMeta) {
30-
const headerName = tokenMeta.dataset.headerName || 'RequestVerificationToken';
31-
const token = tokenMeta.getAttribute('content') || '';
32-
return Promise.resolve({ headerName, token });
33-
}
34-
const tokenData = await fetchAntiForgeryToken();
35-
const meta = document.createElement('meta');
36-
meta.name = 'csrf-token';
37-
meta.content = tokenData.token;
38-
meta.dataset.headerName = tokenData.headerName;
39-
document.head.appendChild(meta);
40-
return tokenData;
41-
}
6+
const URL = 'https://js.devexpress.com/Demos/NetCore/api/DataGridBatchUpdateWebApi';
427
const ordersStore = createStore({
438
key: 'OrderID',
449
loadUrl: `${URL}/Orders`,
45-
async onBeforeSend(_method, ajaxOptions) {
46-
const tokenData = await getAntiForgeryTokenValue();
47-
ajaxOptions.xhrFields = {
48-
withCredentials: true,
49-
headers: { [tokenData.headerName]: tokenData.token },
50-
};
10+
onBeforeSend: (method, ajaxOptions) => {
11+
ajaxOptions.xhrFields = { withCredentials: true };
5112
},
5213
});
5314
function normalizeChanges(changes) {
@@ -74,29 +35,22 @@ function normalizeChanges(changes) {
7435
}
7536
});
7637
}
77-
async function sendBatchRequest(url, changes, headers) {
78-
try {
79-
const response = await fetch(url, {
80-
method: 'POST',
81-
body: JSON.stringify(changes),
82-
headers: {
83-
'Content-Type': 'application/json;charset=UTF-8',
84-
...headers,
85-
},
86-
credentials: 'include',
87-
});
88-
if (!response.ok) {
89-
const errorMessage = await response.text();
90-
throw new Error(`Batch save failed: ${errorMessage || response.statusText}`);
91-
}
92-
} catch (error) {
93-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
94-
throw new Error(errorMessage);
38+
async function sendBatchRequest(url, changes) {
39+
const result = await fetch(url, {
40+
method: 'POST',
41+
body: JSON.stringify(changes),
42+
headers: {
43+
'Content-Type': 'application/json;charset=UTF-8',
44+
},
45+
credentials: 'include',
46+
});
47+
if (!result.ok) {
48+
const json = await result.json();
49+
throw json.Message;
9550
}
9651
}
9752
async function processBatchRequest(url, changes, component) {
98-
const tokenData = await getAntiForgeryTokenValue();
99-
await sendBatchRequest(url, changes, { [tokenData.headerName]: tokenData.token });
53+
await sendBatchRequest(url, changes);
10054
await component.refresh(true);
10155
component.cancelEditData();
10256
}

0 commit comments

Comments
 (0)