Compare commits

...

1 Commits

Author SHA1 Message Date
Romeo Van Snick
849866edc4 Move the reference update thunks into the reference module 2026-08-27 21:45:31 -07:00
9 changed files with 75 additions and 70 deletions

View File

@@ -1,18 +1,7 @@
import { type Schema, normalize } from "normalizr";
import _ from "underscore";
import { databaseApi, fieldApi, segmentApi, tableApi } from "metabase/api";
import { runRtkEndpoint } from "metabase/api/utils/run-rtk-endpoint";
import type { Dispatch, State } from "metabase/redux/store";
import { DatabaseSchema, FieldSchema, TableSchema } from "metabase/schema";
import type {
Database,
Field,
FieldId,
FieldValue,
Segment,
Table,
} from "metabase-types/api";
import type { State } from "metabase/redux/store";
import type { FieldId, FieldValue } from "metabase-types/api";
const UPDATE = "metabase/entities/UPDATE";
@@ -37,53 +26,3 @@ export function getFieldRemappings(
): FieldValue[] {
return state.entities.fields[fieldId]?.remappings ?? [];
}
export const updateSegment =
(segment: Segment) =>
(dispatch: Dispatch): Promise<unknown> =>
runRtkEndpoint(segment, dispatch, segmentApi.endpoints.updateSegment);
export const updateDatabase =
(database: Database) =>
async (dispatch: Dispatch): Promise<unknown> => {
const slimDatabase = _.omit(database, "tables", "tables_lookup");
const result: unknown = await runRtkEndpoint(
slimDatabase,
dispatch,
databaseApi.endpoints.updateDatabase,
);
dispatch(updateMetadata(result, DatabaseSchema));
return result;
};
export const updateTable =
(table: Table) =>
async (dispatch: Dispatch): Promise<unknown> => {
const slimTable = _.omit(
table,
"fields",
"fields_lookup",
"aggregation_operators",
"segments",
);
const result: unknown = await runRtkEndpoint(
slimTable,
dispatch,
tableApi.endpoints.updateTable,
);
dispatch(updateMetadata(result, TableSchema));
return result;
};
export const updateField =
(field: Field) =>
async (dispatch: Dispatch): Promise<unknown> => {
const slimField = _.omit(field, "filter_operators_lookup");
const result: unknown = await runRtkEndpoint(
slimField,
dispatch,
fieldApi.endpoints.updateField,
);
dispatch(updateMetadata(result, FieldSchema));
return result;
};

View File

@@ -6,11 +6,11 @@ import { t } from "ttag";
import { LoadingAndErrorWrapper } from "metabase/common/components/LoadingAndErrorWrapper";
import CS from "metabase/css/core/index.css";
import { connect } from "metabase/redux";
import { updateDatabase } from "metabase/redux/metadata";
import Detail from "metabase/reference/components/Detail";
import { EditHeader } from "metabase/reference/components/EditHeader";
import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
import * as actions from "metabase/reference/reference";
import { updateDatabase } from "metabase/reference/update-actions";
import { getShallowFields as getFields } from "metabase/selectors/metadata";
import type { User } from "metabase-types/api";

View File

@@ -6,7 +6,6 @@ import { t } from "ttag";
import { LoadingAndErrorWrapper } from "metabase/common/components/LoadingAndErrorWrapper";
import CS from "metabase/css/core/index.css";
import { connect } from "metabase/redux";
import { updateField } from "metabase/redux/metadata";
import S from "metabase/reference/Reference.module.css";
import Detail from "metabase/reference/components/Detail";
import { EditHeader } from "metabase/reference/components/EditHeader";
@@ -14,6 +13,7 @@ import EditableReferenceHeader from "metabase/reference/components/EditableRefer
import FieldTypeDetail from "metabase/reference/components/FieldTypeDetail";
import UsefulQuestions from "metabase/reference/components/UsefulQuestions";
import * as actions from "metabase/reference/reference";
import { updateField } from "metabase/reference/update-actions";
import type Metadata from "metabase-lib/v1/metadata/Metadata";
import type { FieldId, User } from "metabase-types/api";

View File

@@ -7,7 +7,6 @@ import { EmptyState } from "metabase/common/components/EmptyState";
import { LoadingAndErrorWrapper } from "metabase/common/components/LoadingAndErrorWrapper";
import CS from "metabase/css/core/index.css";
import { connect } from "metabase/redux";
import { updateField } from "metabase/redux/metadata";
import R from "metabase/reference/Reference.module.css";
import { EditHeader } from "metabase/reference/components/EditHeader";
import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
@@ -15,6 +14,7 @@ import Field from "metabase/reference/components/Field";
import F from "metabase/reference/components/Field.module.css";
import S from "metabase/reference/components/List/List.module.css";
import * as actions from "metabase/reference/reference";
import { updateField } from "metabase/reference/update-actions";
import { getIconForField } from "metabase-lib/v1/metadata/utils/fields";
import type {
FieldId,

View File

@@ -6,13 +6,13 @@ import { t } from "ttag";
import { LoadingAndErrorWrapper } from "metabase/common/components/LoadingAndErrorWrapper";
import CS from "metabase/css/core/index.css";
import { connect } from "metabase/redux";
import { updateTable } from "metabase/redux/metadata";
import S from "metabase/reference/Reference.module.css";
import Detail from "metabase/reference/components/Detail";
import { EditHeader } from "metabase/reference/components/EditHeader";
import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
import UsefulQuestions from "metabase/reference/components/UsefulQuestions";
import * as actions from "metabase/reference/reference";
import { updateTable } from "metabase/reference/update-actions";
import {
getShallowFields as getFields,
getMetadata,

View File

@@ -8,7 +8,6 @@ import { LoadingAndErrorWrapper } from "metabase/common/components/LoadingAndErr
import { modelIconMap } from "metabase/common/utils/icon";
import CS from "metabase/css/core/index.css";
import { connect } from "metabase/redux";
import { updateSegment } from "metabase/redux/metadata";
import Detail from "metabase/reference/components/Detail";
import { EditHeader } from "metabase/reference/components/EditHeader";
import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
@@ -16,6 +15,7 @@ import { Formula } from "metabase/reference/components/Formula";
import { List } from "metabase/reference/components/List";
import UsefulQuestions from "metabase/reference/components/UsefulQuestions";
import * as actions from "metabase/reference/reference";
import { updateSegment } from "metabase/reference/update-actions";
import {
getShallowFields as getFields,
getMetadata,

View File

@@ -6,7 +6,6 @@ import { t } from "ttag";
import { LoadingAndErrorWrapper } from "metabase/common/components/LoadingAndErrorWrapper";
import CS from "metabase/css/core/index.css";
import { connect } from "metabase/redux";
import { updateField } from "metabase/redux/metadata";
import S from "metabase/reference/Reference.module.css";
import Detail from "metabase/reference/components/Detail";
import { EditHeader } from "metabase/reference/components/EditHeader";
@@ -15,6 +14,7 @@ import FieldTypeDetail from "metabase/reference/components/FieldTypeDetail";
import { List } from "metabase/reference/components/List";
import UsefulQuestions from "metabase/reference/components/UsefulQuestions";
import * as actions from "metabase/reference/reference";
import { updateField } from "metabase/reference/update-actions";
import { getMetadata } from "metabase/selectors/metadata";
import type Metadata from "metabase-lib/v1/metadata/Metadata";
import type { FieldId, User } from "metabase-types/api";

View File

@@ -8,7 +8,6 @@ import { LoadingAndErrorWrapper } from "metabase/common/components/LoadingAndErr
import { modelIconMap } from "metabase/common/utils/icon";
import CS from "metabase/css/core/index.css";
import { connect } from "metabase/redux";
import { updateField } from "metabase/redux/metadata";
import R from "metabase/reference/Reference.module.css";
import { EditHeader } from "metabase/reference/components/EditHeader";
import EditableReferenceHeader from "metabase/reference/components/EditableReferenceHeader";
@@ -17,6 +16,7 @@ import F from "metabase/reference/components/Field.module.css";
import { List } from "metabase/reference/components/List";
import S from "metabase/reference/components/List/List.module.css";
import * as actions from "metabase/reference/reference";
import { updateField } from "metabase/reference/update-actions";
import { getIconForField } from "metabase-lib/v1/metadata/utils/fields";
import type {
FieldId,

View File

@@ -0,0 +1,66 @@
import _ from "underscore";
import { databaseApi, fieldApi, segmentApi, tableApi } from "metabase/api";
import { runRtkEndpoint } from "metabase/api/utils/run-rtk-endpoint";
import { updateMetadata } from "metabase/redux/metadata";
import type { Dispatch } from "metabase/redux/store";
import { DatabaseSchema, FieldSchema, TableSchema } from "metabase/schema";
import type { Database, Field, Segment, Table } from "metabase-types/api";
/**
* The edit forms in this module submit the entity they rendered, which came
* from `state.entities` and carries the nested records the mirror stitched onto
* it. The API rejects those, so each one is dropped before the request.
*
* These write the response into the mirror themselves rather than the update
* endpoints hydrating for everyone. Those endpoints have around 25 other
* callers, and hydrating for all of them broke
* `database-writable-connection.cy.spec.ts`.
*/
export const updateDatabase =
(database: Database) =>
async (dispatch: Dispatch): Promise<unknown> => {
const result: unknown = await runRtkEndpoint(
_.omit(database, "tables", "tables_lookup"),
dispatch,
databaseApi.endpoints.updateDatabase,
);
dispatch(updateMetadata(result, DatabaseSchema));
return result;
};
export const updateTable =
(table: Table) =>
async (dispatch: Dispatch): Promise<unknown> => {
const result: unknown = await runRtkEndpoint(
_.omit(
table,
"fields",
"fields_lookup",
"aggregation_operators",
"segments",
),
dispatch,
tableApi.endpoints.updateTable,
);
dispatch(updateMetadata(result, TableSchema));
return result;
};
export const updateField =
(field: Field) =>
async (dispatch: Dispatch): Promise<unknown> => {
const result: unknown = await runRtkEndpoint(
_.omit(field, "filter_operators_lookup"),
dispatch,
fieldApi.endpoints.updateField,
);
dispatch(updateMetadata(result, FieldSchema));
return result;
};
export const updateSegment =
(segment: Segment) =>
(dispatch: Dispatch): Promise<unknown> =>
runRtkEndpoint(segment, dispatch, segmentApi.endpoints.updateSegment);