Skip to content

Commit

Permalink
Merge pull request #728 from gadget-inc/mill/fixCustomParamsOnModels
Browse files Browse the repository at this point in the history
Fix custom action params in AutoForm
  • Loading branch information
MillanWangGadget authored Jan 20, 2025
2 parents d42df6f + 86af8a0 commit 309342b
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 11 deletions.
13 changes: 13 additions & 0 deletions packages/react/spec/auto/polaris/PolarisAutoForm.stories.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,26 @@ export const Primary = {
},
};

export const CreateWithCustomParams = {
args: {
action: api.widget.createWithCustomParams,
},
};

export const UpdateRecord = {
args: {
action: api.widget.update,
findBy: "999",
},
};

export const UpdateRecordWithCustomParams = {
args: {
action: api.widget.updateWithCustomParams,
findBy: "999",
},
};

export const UpsertRecordWithFindBy = {
args: {
action: api.widget.upsert,
Expand Down
27 changes: 18 additions & 9 deletions packages/react/src/auto/hooks/useFieldMetadata.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
import { type FieldMetadata } from "../../metadata.js";
import { useAutoFormMetadata } from "../AutoFormContext.js";

export const useFieldMetadata = (fieldApiIdentifier: string) => {
const { model, fields } = useAutoFormMetadata();
const metaDataPath =
model && model.apiIdentifier
? model.apiIdentifier + "." + fieldApiIdentifier // Model action
: fieldApiIdentifier; // Global action

const targetFieldMetadata = fields.find((field) => field.path === metaDataPath);
const isModelAction = model && model.apiIdentifier;
const metaDataPath = isModelAction
? model.apiIdentifier + "." + fieldApiIdentifier // Model action
: fieldApiIdentifier; // Global action

const targetFieldMetadata = fields.find(
(field) => field.path === metaDataPath || isFieldCustomParamOnModelAction(fieldApiIdentifier, field)
);

if (!targetFieldMetadata) {
throw new Error(`Field "${fieldApiIdentifier}" not found in metadata`);
}

return {
path: metaDataPath,
metadata: targetFieldMetadata.metadata,
};
return targetFieldMetadata;
};

const isFieldCustomParamOnModelAction = (
fieldApiIdentifier: string,
fieldCandidate: {
path: string;
metadata: FieldMetadata;
}
) => fieldCandidate.metadata.__typename !== "GadgetModelField" && fieldCandidate.path === fieldApiIdentifier;
9 changes: 7 additions & 2 deletions packages/react/src/use-table/helpers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,12 @@ const roleAssignmentsSelection = {
name: true,
};

const getNonRelationshipSelectionValue = (field: FieldMetadata) => {
const getNonRelationshipSelectionValue = (field: FieldMetadata, onlyAllowModelFields = false) => {
if (field.__typename !== "GadgetModelField" && onlyAllowModelFields) {
// Only model fields are selectable
return false;
}

switch (field.fieldType) {
case GadgetFieldType.RichText:
return richTextSelection;
Expand Down Expand Up @@ -524,7 +529,7 @@ export const pathListToSelection = (modelIdentifier: string, pathList: string[],
}
} else {
// Non relationship field
selection[field.apiIdentifier] = getNonRelationshipSelectionValue(field);
selection[field.apiIdentifier] = getNonRelationshipSelectionValue(field, true);
}
}

Expand Down

0 comments on commit 309342b

Please sign in to comment.