@pega/sdk 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +287 -1
- package/package.json +1 -1
- package/templates/angular-sdk-reference/package.json +12 -12
- package/templates/angular-sdk-reference/tsconfig.json +1 -1
- package/templates/react-native-sdk-reference/expo-env.d.ts +3 -0
- package/templates/react-sdk-reference/{.github/agents/implementation-expert.agent.md → .ai-common/agents/implementation-expert.md} +23 -26
- package/templates/react-sdk-reference/{.github/copilot-instructions.md → .ai-common/global/ai-agent-instructions.md} +7 -7
- package/templates/react-sdk-reference/{.github/instructions/component-map.instructions.md → .ai-common/instructions/component-map.md} +8 -1
- package/templates/react-sdk-reference/{.github/instructions/dse-component.instructions.md → .ai-common/instructions/dse-component.md} +1 -1
- package/templates/react-sdk-reference/{.github/instructions/field-component.instructions.md → .ai-common/instructions/field-component.md} +2 -1
- package/templates/react-sdk-reference/{.github/instructions/template-component.instructions.md → .ai-common/instructions/template-component.md} +1 -1
- package/templates/react-sdk-reference/{.github/instructions/widget-component.instructions.md → .ai-common/instructions/widget-component.md} +1 -1
- package/templates/react-sdk-reference/{.github/prompts/add-component.prompt.md → .ai-common/prompts/add-component.md} +45 -18
- package/templates/react-sdk-reference/{.cursor/rules → .ai-common}/prompts/component-manifest.json +8 -2
- package/templates/react-sdk-reference/{.github/prompts/generate-all-components.prompt.md → .ai-common/prompts/generate-all-components.md} +195 -78
- package/templates/react-sdk-reference/{.github/prompts/generate-dse-components.prompt.md → .ai-common/prompts/generate-dse-components.md} +28 -17
- package/templates/react-sdk-reference/{.github/prompts/generate-field-components.prompt.md → .ai-common/prompts/generate-field-components.md} +32 -16
- package/templates/react-sdk-reference/{.github/prompts/generate-template-components.prompt.md → .ai-common/prompts/generate-template-components.md} +76 -22
- package/templates/react-sdk-reference/{.github/prompts/generate-widget-components.prompt.md → .ai-common/prompts/generate-widget-components.md} +44 -30
- package/templates/react-sdk-reference/{.claude → .ai-common}/prompts/identify-components.md +4 -0
- package/templates/react-sdk-reference/{.cursor/rules/prompts/replace-design-system.mdrules → .ai-common/prompts/replace-design-system.md} +2 -3
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/AlertBanner.md +50 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/Banner.md +44 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/CaseSummaryFields.md +54 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/DetailsFields.md +49 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/FieldGroup.md +44 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/FieldGroupList.md +43 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/FieldValueList.md +46 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/design-system-extension-skills/Operator.md +67 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/Pulse.md +20 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/RichTextEditor.md +58 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension-skills/WssQuickCreate.md +31 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/design-system-extension.md +1 -1
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-components.md +18 -1
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/AutoComplete.md +298 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/CancelAlert.md +132 -3
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Checkbox.md +358 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Currency.md +230 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/Date.md +221 -0
- package/templates/react-sdk-reference/.ai-common/skills/field-skills/DateTime.md +213 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Decimal.md +112 -13
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Dropdown.md +127 -1
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Email.md +68 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Group.md +51 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Integer.md +81 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/Location.md +105 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Multiselect.md +70 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/ObjectReference.md +74 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Percentage.md +84 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Phone.md +81 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/RadioButtons.md +93 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/RichText.md +85 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/ScalarList.md +54 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/SelectableCard.md +55 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/SemanticLink.md +64 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/TextArea.md +66 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/TextContent.md +28 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/TextInput.md +67 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/Time.md +67 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/field-skills/URL.md +59 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/field-skills/UserReference.md +90 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-components.md +83 -52
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/AdvancedSearch.md +77 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/AppShell.md +273 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/BannerPage.md +39 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/CaseSummary.md +79 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/CaseView.md +399 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/CaseViewActionsMenu.md +282 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/Confirmation.md +89 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DataReference.md +50 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DefaultForm.md +117 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DefaultPage.md +49 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/Details.md +59 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/DetailsSubTabs.md +60 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DetailsThreeColumn.md +12 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/DetailsTwoColumn.md +12 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/DynamicTabs.md +67 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/FieldGroupTemplate.md +119 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/HierarchicalForm.md +45 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/InlineDashboard.md +41 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/InlineDashboardPage.md +56 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/ListPage.md +18 -0
- package/templates/react-sdk-reference/.ai-common/skills/template-skills/ListView.md +419 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/MultiReferenceReadOnly.md +40 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/NarrowWide.md +66 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/OneColumn.md +34 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/PromotedFilters.md +92 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/SelfServiceCaseView.md +56 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/SimpleTable.md +59 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/SingleReferenceReadOnly.md +52 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/SubTabs.md +47 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/TwoColumn.md +49 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/WssNavBar.md +71 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-components.md +1 -1
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/AppAnnouncement.md +38 -1
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/Attachment.md +58 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/CaseHistory.md +63 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/widget-skills/FileUtility.md +81 -14
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/Followers.md +20 -0
- package/templates/react-sdk-reference/{.github → .ai-common}/skills/widget-skills/QuickCreate.md +48 -0
- package/templates/react-sdk-reference/{.claude → .ai-common}/skills/widget-skills/SummaryItem.md +66 -0
- package/templates/react-sdk-reference/.ai-common/skills/widget-skills/ToDo.md +492 -0
- package/templates/react-sdk-reference/package.minimal.json +29 -0
- package/templates/react-sdk-reference/src/AppProviders.tsx +17 -0
- package/templates/react-sdk-reference/src/MashupApp.tsx +8 -19
- package/templates/react-sdk-reference/src/PortalApp.tsx +6 -17
- package/templates/react-sdk-reference/.claude/instructions/component-map.md +0 -38
- package/templates/react-sdk-reference/.claude/instructions/dse-component.md +0 -75
- package/templates/react-sdk-reference/.claude/instructions/field-component.md +0 -75
- package/templates/react-sdk-reference/.claude/instructions/template-component.md +0 -93
- package/templates/react-sdk-reference/.claude/instructions/widget-component.md +0 -88
- package/templates/react-sdk-reference/.claude/prompts/add-component.md +0 -152
- package/templates/react-sdk-reference/.claude/prompts/component-manifest.json +0 -193
- package/templates/react-sdk-reference/.claude/prompts/generate-all-components.md +0 -158
- package/templates/react-sdk-reference/.claude/prompts/generate-dse-components.md +0 -140
- package/templates/react-sdk-reference/.claude/prompts/generate-field-components.md +0 -153
- package/templates/react-sdk-reference/.claude/prompts/generate-template-components.md +0 -165
- package/templates/react-sdk-reference/.claude/prompts/generate-widget-components.md +0 -138
- package/templates/react-sdk-reference/.claude/prompts/replace-design-system.md +0 -519
- package/templates/react-sdk-reference/.claude/skills/component-contracts.md +0 -140
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/AlertBanner.md +0 -137
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldGroup.md +0 -134
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/FieldValueList.md +0 -118
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/Pulse.md +0 -85
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/RichTextEditor.md +0 -232
- package/templates/react-sdk-reference/.claude/skills/design-system-extension-skills/WssQuickCreate.md +0 -137
- package/templates/react-sdk-reference/.claude/skills/design-system-extension.md +0 -291
- package/templates/react-sdk-reference/.claude/skills/field-skills/AutoComplete.md +0 -113
- package/templates/react-sdk-reference/.claude/skills/field-skills/Checkbox.md +0 -175
- package/templates/react-sdk-reference/.claude/skills/field-skills/Currency.md +0 -109
- package/templates/react-sdk-reference/.claude/skills/field-skills/Date.md +0 -101
- package/templates/react-sdk-reference/.claude/skills/field-skills/DateTime.md +0 -106
- package/templates/react-sdk-reference/.claude/skills/field-skills/Integer.md +0 -88
- package/templates/react-sdk-reference/.claude/skills/field-skills/Multiselect.md +0 -188
- package/templates/react-sdk-reference/.claude/skills/field-skills/ObjectReference.md +0 -173
- package/templates/react-sdk-reference/.claude/skills/field-skills/Percentage.md +0 -93
- package/templates/react-sdk-reference/.claude/skills/field-skills/Phone.md +0 -129
- package/templates/react-sdk-reference/.claude/skills/field-skills/RadioButtons.md +0 -167
- package/templates/react-sdk-reference/.claude/skills/field-skills/RichText.md +0 -149
- package/templates/react-sdk-reference/.claude/skills/field-skills/ScalarList.md +0 -134
- package/templates/react-sdk-reference/.claude/skills/field-skills/SelectableCard.md +0 -231
- package/templates/react-sdk-reference/.claude/skills/field-skills/SemanticLink.md +0 -155
- package/templates/react-sdk-reference/.claude/skills/field-skills/TextInput.md +0 -107
- package/templates/react-sdk-reference/.claude/skills/field-skills/Time.md +0 -89
- package/templates/react-sdk-reference/.claude/skills/field-skills/URL.md +0 -86
- package/templates/react-sdk-reference/.claude/skills/template-components.md +0 -321
- package/templates/react-sdk-reference/.claude/skills/template-skills/AdvancedSearch.md +0 -150
- package/templates/react-sdk-reference/.claude/skills/template-skills/AppShell.md +0 -124
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseSummary.md +0 -106
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseView.md +0 -137
- package/templates/react-sdk-reference/.claude/skills/template-skills/CaseViewActionsMenu.md +0 -131
- package/templates/react-sdk-reference/.claude/skills/template-skills/Confirmation.md +0 -109
- package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsSubTabs.md +0 -97
- package/templates/react-sdk-reference/.claude/skills/template-skills/DetailsTwoColumn.md +0 -80
- package/templates/react-sdk-reference/.claude/skills/template-skills/ListPage.md +0 -70
- package/templates/react-sdk-reference/.claude/skills/template-skills/ListView.md +0 -142
- package/templates/react-sdk-reference/.claude/skills/template-skills/MultiReferenceReadOnly.md +0 -82
- package/templates/react-sdk-reference/.claude/skills/template-skills/OneColumn.md +0 -114
- package/templates/react-sdk-reference/.claude/skills/template-skills/SimpleTable.md +0 -131
- package/templates/react-sdk-reference/.claude/skills/template-skills/SingleReferenceReadOnly.md +0 -108
- package/templates/react-sdk-reference/.claude/skills/template-skills/SubTabs.md +0 -82
- package/templates/react-sdk-reference/.claude/skills/widget-skills/FileUtility.md +0 -206
- package/templates/react-sdk-reference/.claude/skills/widget-skills/QuickCreate.md +0 -118
- package/templates/react-sdk-reference/.claude/skills/widget-skills/ToDo.md +0 -198
- package/templates/react-sdk-reference/.cursor/rules/component-map.mdrules +0 -41
- package/templates/react-sdk-reference/.cursor/rules/dse-component.mdrules +0 -78
- package/templates/react-sdk-reference/.cursor/rules/field-component.mdrules +0 -74
- package/templates/react-sdk-reference/.cursor/rules/pega-sdk.mdrules +0 -247
- package/templates/react-sdk-reference/.cursor/rules/prompts/add-component.mdrules +0 -149
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-all-components.mdrules +0 -154
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-dse-components.mdrules +0 -131
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-field-components.mdrules +0 -144
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-template-components.mdrules +0 -156
- package/templates/react-sdk-reference/.cursor/rules/prompts/generate-widget-components.mdrules +0 -129
- package/templates/react-sdk-reference/.cursor/rules/prompts/identify-components.mdrules +0 -110
- package/templates/react-sdk-reference/.cursor/rules/skills/component-contracts.mdrules +0 -145
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/AlertBanner.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Banner.mdrules +0 -154
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/CaseSummaryFields.mdrules +0 -159
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/DetailsFields.mdrules +0 -149
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldGroup.mdrules +0 -136
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldGroupList.mdrules +0 -116
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/FieldValueList.mdrules +0 -120
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Operator.mdrules +0 -154
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/Pulse.mdrules +0 -88
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/RichTextEditor.mdrules +0 -211
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension-skills/WssQuickCreate.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/design-system-extension.mdrules +0 -294
- package/templates/react-sdk-reference/.cursor/rules/skills/field-components.mdrules +0 -299
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/AutoComplete.mdrules +0 -117
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/CancelAlert.mdrules +0 -208
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Checkbox.mdrules +0 -163
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Currency.mdrules +0 -111
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Date.mdrules +0 -104
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/DateTime.mdrules +0 -108
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Decimal.mdrules +0 -103
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Dropdown.mdrules +0 -119
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Email.mdrules +0 -112
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Group.mdrules +0 -95
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Integer.mdrules +0 -92
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Location.mdrules +0 -141
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Multiselect.mdrules +0 -169
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/ObjectReference.mdrules +0 -169
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Percentage.mdrules +0 -97
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Phone.mdrules +0 -115
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/RadioButtons.mdrules +0 -151
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/RichText.mdrules +0 -143
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/ScalarList.mdrules +0 -129
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/SelectableCard.mdrules +0 -221
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/SemanticLink.mdrules +0 -153
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextArea.mdrules +0 -101
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextContent.mdrules +0 -106
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/TextInput.mdrules +0 -109
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/Time.mdrules +0 -93
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/URL.mdrules +0 -90
- package/templates/react-sdk-reference/.cursor/rules/skills/field-skills/UserReference.mdrules +0 -185
- package/templates/react-sdk-reference/.cursor/rules/skills/run-and-verify.mdrules +0 -73
- package/templates/react-sdk-reference/.cursor/rules/skills/template-components.mdrules +0 -327
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/AdvancedSearch.mdrules +0 -149
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/AppShell.mdrules +0 -127
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/BannerPage.mdrules +0 -88
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseSummary.mdrules +0 -105
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseView.mdrules +0 -136
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/CaseViewActionsMenu.mdrules +0 -131
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/Confirmation.mdrules +0 -112
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DataReference.mdrules +0 -125
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DefaultForm.mdrules +0 -107
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DefaultPage.mdrules +0 -115
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/Details.mdrules +0 -93
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsSubTabs.mdrules +0 -100
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsThreeColumn.mdrules +0 -83
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DetailsTwoColumn.mdrules +0 -83
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/DynamicTabs.mdrules +0 -106
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/FieldGroupTemplate.mdrules +0 -114
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/HierarchicalForm.mdrules +0 -118
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/InlineDashboard.mdrules +0 -109
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/InlineDashboardPage.mdrules +0 -90
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/ListPage.mdrules +0 -73
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/ListView.mdrules +0 -144
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/MultiReferenceReadOnly.mdrules +0 -85
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/NarrowWide.mdrules +0 -146
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/OneColumn.mdrules +0 -114
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/PromotedFilters.mdrules +0 -129
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SelfServiceCaseView.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SimpleTable.mdrules +0 -132
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SingleReferenceReadOnly.mdrules +0 -108
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/SubTabs.mdrules +0 -84
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/TwoColumn.mdrules +0 -136
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/WideNarrow.mdrules +0 -155
- package/templates/react-sdk-reference/.cursor/rules/skills/template-skills/WssNavBar.mdrules +0 -140
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-components.mdrules +0 -276
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/AppAnnouncement.mdrules +0 -87
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/Attachment.mdrules +0 -151
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/CaseHistory.mdrules +0 -112
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/FileUtility.mdrules +0 -205
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/Followers.mdrules +0 -104
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/QuickCreate.mdrules +0 -119
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/SummaryItem.mdrules +0 -172
- package/templates/react-sdk-reference/.cursor/rules/skills/widget-skills/ToDo.mdrules +0 -195
- package/templates/react-sdk-reference/.cursor/rules/template-component.mdrules +0 -95
- package/templates/react-sdk-reference/.cursor/rules/widget-component.mdrules +0 -90
- package/templates/react-sdk-reference/.github/prompts/component-manifest.json +0 -193
- package/templates/react-sdk-reference/.github/prompts/identify-components.prompt.md +0 -110
- package/templates/react-sdk-reference/.github/prompts/replace-design-system.prompt.md +0 -524
- package/templates/react-sdk-reference/.github/skills/component-contracts.md +0 -140
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/Banner.md +0 -152
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/CaseSummaryFields.md +0 -159
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/DetailsFields.md +0 -148
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/FieldGroupList.md +0 -113
- package/templates/react-sdk-reference/.github/skills/design-system-extension-skills/Operator.md +0 -155
- package/templates/react-sdk-reference/.github/skills/field-components.md +0 -295
- package/templates/react-sdk-reference/.github/skills/field-skills/AutoComplete.md +0 -113
- package/templates/react-sdk-reference/.github/skills/field-skills/CancelAlert.md +0 -211
- package/templates/react-sdk-reference/.github/skills/field-skills/Checkbox.md +0 -175
- package/templates/react-sdk-reference/.github/skills/field-skills/Currency.md +0 -109
- package/templates/react-sdk-reference/.github/skills/field-skills/Date.md +0 -101
- package/templates/react-sdk-reference/.github/skills/field-skills/DateTime.md +0 -106
- package/templates/react-sdk-reference/.github/skills/field-skills/Decimal.md +0 -99
- package/templates/react-sdk-reference/.github/skills/field-skills/Dropdown.md +0 -134
- package/templates/react-sdk-reference/.github/skills/field-skills/Email.md +0 -109
- package/templates/react-sdk-reference/.github/skills/field-skills/Group.md +0 -96
- package/templates/react-sdk-reference/.github/skills/field-skills/Location.md +0 -145
- package/templates/react-sdk-reference/.github/skills/field-skills/TextArea.md +0 -98
- package/templates/react-sdk-reference/.github/skills/field-skills/TextContent.md +0 -117
- package/templates/react-sdk-reference/.github/skills/field-skills/UserReference.md +0 -203
- package/templates/react-sdk-reference/.github/skills/run-and-verify.md +0 -70
- package/templates/react-sdk-reference/.github/skills/template-skills/AppShell.md +0 -124
- package/templates/react-sdk-reference/.github/skills/template-skills/BannerPage.md +0 -86
- package/templates/react-sdk-reference/.github/skills/template-skills/CaseView.md +0 -137
- package/templates/react-sdk-reference/.github/skills/template-skills/CaseViewActionsMenu.md +0 -131
- package/templates/react-sdk-reference/.github/skills/template-skills/DataReference.md +0 -124
- package/templates/react-sdk-reference/.github/skills/template-skills/DefaultForm.md +0 -104
- package/templates/react-sdk-reference/.github/skills/template-skills/DefaultPage.md +0 -112
- package/templates/react-sdk-reference/.github/skills/template-skills/Details.md +0 -90
- package/templates/react-sdk-reference/.github/skills/template-skills/DetailsThreeColumn.md +0 -80
- package/templates/react-sdk-reference/.github/skills/template-skills/DynamicTabs.md +0 -106
- package/templates/react-sdk-reference/.github/skills/template-skills/FieldGroupTemplate.md +0 -112
- package/templates/react-sdk-reference/.github/skills/template-skills/HierarchicalForm.md +0 -116
- package/templates/react-sdk-reference/.github/skills/template-skills/InlineDashboard.md +0 -108
- package/templates/react-sdk-reference/.github/skills/template-skills/InlineDashboardPage.md +0 -82
- package/templates/react-sdk-reference/.github/skills/template-skills/ListView.md +0 -142
- package/templates/react-sdk-reference/.github/skills/template-skills/NarrowWide.md +0 -143
- package/templates/react-sdk-reference/.github/skills/template-skills/PromotedFilters.md +0 -130
- package/templates/react-sdk-reference/.github/skills/template-skills/SelfServiceCaseView.md +0 -142
- package/templates/react-sdk-reference/.github/skills/template-skills/TwoColumn.md +0 -133
- package/templates/react-sdk-reference/.github/skills/template-skills/WideNarrow.md +0 -152
- package/templates/react-sdk-reference/.github/skills/template-skills/WssNavBar.md +0 -139
- package/templates/react-sdk-reference/.github/skills/widget-components.md +0 -260
- package/templates/react-sdk-reference/.github/skills/widget-skills/AppAnnouncement.md +0 -84
- package/templates/react-sdk-reference/.github/skills/widget-skills/Attachment.md +0 -151
- package/templates/react-sdk-reference/.github/skills/widget-skills/CaseHistory.md +0 -110
- package/templates/react-sdk-reference/.github/skills/widget-skills/Followers.md +0 -103
- package/templates/react-sdk-reference/.github/skills/widget-skills/SummaryItem.md +0 -169
- package/templates/react-sdk-reference/.github/skills/widget-skills/ToDo.md +0 -198
- package/templates/react-sdk-reference/AGENTS.md +0 -246
- /package/templates/react-sdk-reference/{.claude → .ai-common}/skills/run-and-verify.md +0 -0
- /package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/WideNarrow.md +0 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
# Skill: ListView
|
|
2
|
+
|
|
3
|
+
Full-featured list view template. Renders a data table with sorting, pagination, global search, single/multi selection, column menu, and filter dialog.
|
|
4
|
+
|
|
5
|
+
> **Prerequisite skill:** [`template-components.md`](../template-components.md) — covers architecture, child rendering patterns, and registration conventions common to ALL template components.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
> ⚠️ **CRITICAL — `referenceList` is a STRING, not an array**
|
|
10
|
+
>
|
|
11
|
+
> The `referenceList` prop is a **data page reference string** (e.g., `".D_pyMyWorkList.pxResults"`) — NOT an array of data rows. You MUST:
|
|
12
|
+
>
|
|
13
|
+
> 1. Check `typeof referenceList === 'string'` before using it
|
|
14
|
+
> 2. Call `PCore.getDataApiUtils().getData(referenceList, payload)` to fetch actual row data
|
|
15
|
+
> 3. Initialize row state as empty array: `useState<any[]>([])`
|
|
16
|
+
> 4. NEVER put `referenceList` directly into state or call `.filter()` on it
|
|
17
|
+
>
|
|
18
|
+
> ```typescript
|
|
19
|
+
> // ❌ WRONG — will crash with "rows.filter is not a function"
|
|
20
|
+
> const [rows, setRows] = useState(referenceList);
|
|
21
|
+
>
|
|
22
|
+
> // ✅ CORRECT — fetch data from the reference string
|
|
23
|
+
> const [rows, setRows] = useState<any[]>([]);
|
|
24
|
+
> useEffect(() => {
|
|
25
|
+
> if (Array.isArray(referenceList)) {
|
|
26
|
+
> setRows(referenceList);
|
|
27
|
+
> return;
|
|
28
|
+
> }
|
|
29
|
+
> const dataRef = typeof referenceList === 'string' ? referenceList : dataPageName;
|
|
30
|
+
> if (dataRef) {
|
|
31
|
+
> PCore.getDataApiUtils()
|
|
32
|
+
> .getData(dataRef, payload ?? {})
|
|
33
|
+
> .then((response) => setRows(response?.data?.data ?? response?.data?.pxResults ?? []))
|
|
34
|
+
> .catch(() => setRows([]));
|
|
35
|
+
> }
|
|
36
|
+
> }, [referenceList]);
|
|
37
|
+
> ```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
> ⚠️ **CRITICAL — Column definitions MUST come from PConnect presets metadata**
|
|
42
|
+
>
|
|
43
|
+
> The table must render ONLY the columns configured in the Pega view metadata — NOT all fields from the raw data response. Raw responses contain 20+ internal fields (`pzInsKey`, `pxRefObjectClass`, `pyAssignmentStatus`, etc.) that should never be shown.
|
|
44
|
+
>
|
|
45
|
+
> **How to extract configured columns:**
|
|
46
|
+
>
|
|
47
|
+
> 1. Get column fields from presets: `getPConnect().getComponentConfig().presets[0].children[0].children`
|
|
48
|
+
> 2. Get field definitions (labels, types) from metadata: `PCore.getAnalyticsUtils().getDataViewMetadata(referenceList, false)`
|
|
49
|
+
> 3. Map each preset column to its field definition to build `{id, label, type, displayAsLink}` headers
|
|
50
|
+
>
|
|
51
|
+
> ```typescript
|
|
52
|
+
> // ❌ WRONG — shows ALL raw data keys as columns (pzInsKey, pxRefObjectClass, etc.)
|
|
53
|
+
> const fields = Object.keys(rows[0]).map((key) => ({ id: key, label: key }));
|
|
54
|
+
>
|
|
55
|
+
> // ✅ CORRECT — extract configured columns from PConnect presets + metadata
|
|
56
|
+
> const componentConfig = getPConnect().getComponentConfig();
|
|
57
|
+
> const columnFields = componentConfig.presets[0].children[0].children;
|
|
58
|
+
> const metaResponse = await PCore.getAnalyticsUtils().getDataViewMetadata(referenceList, false);
|
|
59
|
+
> const fieldDefs = metaResponse?.data?.fields ?? [];
|
|
60
|
+
>
|
|
61
|
+
> const columns = columnFields.map((field, index) => {
|
|
62
|
+
> let fieldId = field.config.value.substring(field.config.value.indexOf(' ') + 1);
|
|
63
|
+
> if (fieldId.startsWith('.')) fieldId = fieldId.substring(1);
|
|
64
|
+
> const { additionalDetails = {} } = field.config;
|
|
65
|
+
> const displayAsLink =
|
|
66
|
+
> additionalDetails.type === 'DISPLAY_LINK' || ('displayAsLink' in field.config && field.config.displayAsLink);
|
|
67
|
+
> return {
|
|
68
|
+
> id: fieldId,
|
|
69
|
+
> label: fieldDefs[index]?.label ?? field.config.label ?? fieldId,
|
|
70
|
+
> type: field.type,
|
|
71
|
+
> displayAsLink,
|
|
72
|
+
> classID: fieldDefs.find((f) => f.name === fieldId)?.classID,
|
|
73
|
+
> };
|
|
74
|
+
> });
|
|
75
|
+
> ```
|
|
76
|
+
>
|
|
77
|
+
> **Key points:**
|
|
78
|
+
>
|
|
79
|
+
> - `field.config.value` has format `"@P .pyID"` — strip annotation prefix to get field name
|
|
80
|
+
> - `fieldDefs[index].label` provides the localized display label
|
|
81
|
+
> - `displayAsLink` determines if the cell renders as a clickable navigation link
|
|
82
|
+
> - If `presets` is unavailable (fallback), use first ~6 fields from `fieldDefs` — NEVER use raw data keys
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
> ⚠️ **CRITICAL — Data fetching differs by `bInForm`**
|
|
87
|
+
>
|
|
88
|
+
> The data API to call depends on whether the ListView is inside a form or on a standalone page:
|
|
89
|
+
>
|
|
90
|
+
> ```typescript
|
|
91
|
+
> // Page-level (bInForm = false) — e.g., worklist landing page
|
|
92
|
+
> const result = await PCore.getDataApiUtils().getData(referenceList, payload ?? {});
|
|
93
|
+
> const rows = result?.data?.data ?? [];
|
|
94
|
+
>
|
|
95
|
+
> // Form-level (bInForm = true) — e.g., embedded list in a case form
|
|
96
|
+
> const context = getPConnect().getContextName();
|
|
97
|
+
> const result = await PCore.getDataPageUtils().getDataAsync(referenceList, context, parameters, null, query);
|
|
98
|
+
> const rows = result?.data ?? [];
|
|
99
|
+
> ```
|
|
100
|
+
>
|
|
101
|
+
> Using the wrong API will return empty data or fail silently.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Component Purpose
|
|
106
|
+
|
|
107
|
+
The primary data table component. Renders a sortable, paginated, filterable, and selectable table from a PConnect data source. Supports both standalone page use (`bInForm: false`) and embedded form use (`bInForm: true`). Columns are configurable, and the table supports row-level selection with callback.
|
|
108
|
+
|
|
109
|
+
## Pega Metadata
|
|
110
|
+
|
|
111
|
+
- **Registration key:** `ListView` (in `component-map.ts`)
|
|
112
|
+
- **Category:** Data display template
|
|
113
|
+
- **Extends:** `PConnProps`
|
|
114
|
+
|
|
115
|
+
## Props
|
|
116
|
+
|
|
117
|
+
| Prop | Type | Required | Description |
|
|
118
|
+
| ----------------------- | ---------- | -------- | ----------------------------------------------------------------------------- |
|
|
119
|
+
| `bInForm` | `boolean` | No | Whether rendered inside a form (affects toolbar and padding). Default `false` |
|
|
120
|
+
| `selectionMode` | `string` | No | `'single'` (radio) or `'multi'` (checkbox) or absent (no selection) |
|
|
121
|
+
| `dataPageName` | `string` | No | Name of data page to fetch records from |
|
|
122
|
+
| `referenceList` | `array` | No | In-memory data array (used when data is already available) |
|
|
123
|
+
| `compositeKeys` | `object` | No | Key fields for unique row identification |
|
|
124
|
+
| `columns` | `array` | No | Column definition objects `{ fieldName, label, sortable, filterable }` |
|
|
125
|
+
| `additionalTableConfig` | `object` | No | Extra config merged with column/sort/filter settings |
|
|
126
|
+
| `isSearchable` | `boolean` | No | Whether global search input is shown |
|
|
127
|
+
| `payload` | `object` | No | Query payload for data page requests |
|
|
128
|
+
| `getPConnect` | `function` | Yes | PConnect getter |
|
|
129
|
+
|
|
130
|
+
## Component Skeleton
|
|
131
|
+
|
|
132
|
+
> ⚠️ **CRITICAL — USE THE PROJECT'S DESIGN SYSTEM FOR TABLE RENDERING**
|
|
133
|
+
>
|
|
134
|
+
> This component MUST use the **installed design system's table components** — NOT plain HTML `<table>/<thead>/<tbody>`.
|
|
135
|
+
> Check `package.json` for the installed design system and use its table primitives:
|
|
136
|
+
>
|
|
137
|
+
> | If installed DS is... | Import from... | Table components |
|
|
138
|
+
> | --------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
|
|
139
|
+
> | `@carbon/react` | `@carbon/react` | `Table, TableHead, TableRow, TableHeader, TableBody, TableCell, TableContainer, TableToolbar, TableToolbarSearch, Pagination, Link` |
|
|
140
|
+
> | `@mui/material` | `@mui/material` | `Table, TableHead, TableRow, TableCell, TableBody, TableContainer, TablePagination, TableSortLabel, Link` |
|
|
141
|
+
> | `antd` | `antd` | `Table` (with `columns` + `dataSource` props, built-in pagination) |
|
|
142
|
+
> | `@chakra-ui/react` | `@chakra-ui/react` | `Table, Thead, Tbody, Tr, Th, Td, Link` + custom pagination |
|
|
143
|
+
> | None / CSS-only | N/A | Plain `<table>/<thead>/<tbody>` with CSS classes |
|
|
144
|
+
>
|
|
145
|
+
> **The table MUST look like a proper data grid** with:
|
|
146
|
+
>
|
|
147
|
+
> - Column headers with field labels (from PConnect presets metadata)
|
|
148
|
+
> - Paginated rows (not all rows at once)
|
|
149
|
+
> - Clickable link cells for navigation
|
|
150
|
+
> - Search toolbar (when `globalSearch !== false`)
|
|
151
|
+
>
|
|
152
|
+
> ❌ **NEVER** render raw `Object.values(row)` or dump all data keys as columns.
|
|
153
|
+
> ❌ **NEVER** use plain HTML when a design system is installed.
|
|
154
|
+
|
|
155
|
+
This is the largest template component. The implementation MUST include these critical sections:
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
159
|
+
import type { PConnProps } from '@pega/sdk-react';
|
|
160
|
+
|
|
161
|
+
const AssignDashObjects = ['Assign-Worklist', 'Assign-WorkBasket'];
|
|
162
|
+
|
|
163
|
+
interface ListViewProps extends PConnProps {
|
|
164
|
+
bInForm?: boolean;
|
|
165
|
+
globalSearch?: boolean;
|
|
166
|
+
referenceList?: any;
|
|
167
|
+
selectionMode?: string;
|
|
168
|
+
referenceType?: string;
|
|
169
|
+
payload?: any;
|
|
170
|
+
parameters?: any;
|
|
171
|
+
compositeKeys?: any;
|
|
172
|
+
localeReference?: string;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export default function ListView(props: ListViewProps) {
|
|
176
|
+
const { getPConnect, bInForm = true, globalSearch, referenceList, payload, parameters, localeReference } = props;
|
|
177
|
+
|
|
178
|
+
const [arRows, setRows] = useState<any[]>([]);
|
|
179
|
+
const [arColumns, setColumns] = useState<any[]>([]);
|
|
180
|
+
const [page, setPage] = useState(1);
|
|
181
|
+
const [pageSize, setPageSize] = useState(10);
|
|
182
|
+
const [searchValue, setSearchValue] = useState('');
|
|
183
|
+
const [title, setTitle] = useState('');
|
|
184
|
+
|
|
185
|
+
const thePConn = getPConnect();
|
|
186
|
+
const componentConfig = thePConn.getComponentConfig();
|
|
187
|
+
const resolvedConfigProps: any = thePConn.getConfigProps();
|
|
188
|
+
|
|
189
|
+
// ═══════════════════════════════════════════════════════════════
|
|
190
|
+
// CRITICAL: Extract column definitions from PConnect presets
|
|
191
|
+
// ═══════════════════════════════════════════════════════════════
|
|
192
|
+
const getHeaderCells = useCallback((columnFields: any[], fieldDefs: any[]) => {
|
|
193
|
+
return columnFields.map((field: any, index: number) => {
|
|
194
|
+
let theField = field.config.value.substring(field.config.value.indexOf(' ') + 1);
|
|
195
|
+
if (theField.startsWith('.')) theField = theField.substring(1);
|
|
196
|
+
const colIndex = fieldDefs.findIndex((ele) => ele.name === theField);
|
|
197
|
+
const { additionalDetails = {} } = field.config;
|
|
198
|
+
let displayAsLink = additionalDetails.type === 'DISPLAY_LINK';
|
|
199
|
+
if (!displayAsLink) displayAsLink = 'displayAsLink' in field.config && field.config.displayAsLink;
|
|
200
|
+
return {
|
|
201
|
+
id: theField,
|
|
202
|
+
type: field.type,
|
|
203
|
+
displayAsLink,
|
|
204
|
+
label: fieldDefs[index]?.label ?? field.config.label ?? theField,
|
|
205
|
+
classID: colIndex > -1 ? fieldDefs[colIndex].classID : undefined,
|
|
206
|
+
isAssignmentLink: displayAsLink && AssignDashObjects.includes(fieldDefs[colIndex]?.classID),
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
}, []);
|
|
210
|
+
|
|
211
|
+
// ═══════════════════════════════════════════════════════════════
|
|
212
|
+
// CRITICAL: Fetch metadata + data in useEffect
|
|
213
|
+
// ═══════════════════════════════════════════════════════════════
|
|
214
|
+
useEffect(() => {
|
|
215
|
+
let isActive = true;
|
|
216
|
+
async function fetchData() {
|
|
217
|
+
// Step 1: Get field definitions from metadata API
|
|
218
|
+
const metaResponse: any = await PCore.getAnalyticsUtils().getDataViewMetadata(referenceList, false);
|
|
219
|
+
const fieldDefs = metaResponse?.data?.fields ?? [];
|
|
220
|
+
|
|
221
|
+
// Step 2: Get configured columns from presets
|
|
222
|
+
const columnFields = componentConfig?.presets?.[0]?.children?.[0]?.children ?? [];
|
|
223
|
+
if (columnFields.length) {
|
|
224
|
+
const myColumns = getHeaderCells(columnFields, fieldDefs);
|
|
225
|
+
myColumns.forEach((col) => {
|
|
226
|
+
if (localeReference) col.label = PCore.getLocaleUtils().getLocaleValue(col.label, localeReference);
|
|
227
|
+
});
|
|
228
|
+
if (isActive) setColumns(myColumns);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Step 3: Fetch data — API differs by bInForm
|
|
232
|
+
let dataResult: any;
|
|
233
|
+
if (!bInForm) {
|
|
234
|
+
dataResult = await PCore.getDataApiUtils().getData(referenceList, payload ?? {});
|
|
235
|
+
} else {
|
|
236
|
+
const context = thePConn.getContextName();
|
|
237
|
+
dataResult = await (PCore.getDataPageUtils() as any).getDataAsync(
|
|
238
|
+
referenceList,
|
|
239
|
+
context,
|
|
240
|
+
parameters,
|
|
241
|
+
null,
|
|
242
|
+
null,
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
const tableData = !bInForm ? (dataResult?.data?.data ?? []) : (dataResult?.data ?? []);
|
|
246
|
+
if (isActive) setRows(Array.isArray(tableData) ? tableData : []);
|
|
247
|
+
}
|
|
248
|
+
fetchData();
|
|
249
|
+
return () => {
|
|
250
|
+
isActive = false;
|
|
251
|
+
};
|
|
252
|
+
}, [referenceList, bInForm, payload, parameters]);
|
|
253
|
+
|
|
254
|
+
// ═══════════════════════════════════════════════════════════════
|
|
255
|
+
// CRITICAL: Link click handlers for navigation
|
|
256
|
+
// ═══════════════════════════════════════════════════════════════
|
|
257
|
+
function handleLinkClick(row: any, column: any) {
|
|
258
|
+
if (column.isAssignmentLink) {
|
|
259
|
+
const { pxRefObjectClass, pzInsKey } = row;
|
|
260
|
+
thePConn.getActionsApi().openAssignment(pzInsKey, pxRefObjectClass, {
|
|
261
|
+
containerName: thePConn.getContainerName(),
|
|
262
|
+
channelName: '',
|
|
263
|
+
});
|
|
264
|
+
} else {
|
|
265
|
+
const pxRefObjectKey = row.pxRefObjectKey ?? row.pzInsKey;
|
|
266
|
+
const pxRefObjectClass = row.pxRefObjectClass ?? row.pxObjClass;
|
|
267
|
+
if (pxRefObjectClass && pxRefObjectKey) {
|
|
268
|
+
thePConn.getActionsApi().openWorkByHandle(pxRefObjectKey, pxRefObjectClass);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Search, pagination, sort, selection, render...
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
> **Note:** This skeleton shows the MANDATORY patterns. Full implementations will also include sorting, selection, filter dialog, column menus, and PubSub subscriptions for dashboard filters. But the three critical sections above (column extraction, data fetching, link handling) MUST be present for the table to render correctly.
|
|
278
|
+
|
|
279
|
+
## Behavioral Contract
|
|
280
|
+
|
|
281
|
+
### Initialization
|
|
282
|
+
|
|
283
|
+
`useInit(getPConnect, columns, dataPageName, payload)` hook:
|
|
284
|
+
|
|
285
|
+
1. Calls `initializeColumns(getPConnect, columns)` to build `configFields`.
|
|
286
|
+
2. Calls `buildFieldsForTable(configFields)` to produce display column definitions.
|
|
287
|
+
3. Calls `getConfigFields(configFields)` for sort/filter metadata.
|
|
288
|
+
4. Fetches initial data via `PCore.getDataApiUtils().getDataAsync(dataPageName, payload)`.
|
|
289
|
+
5. Returns `{ tableDataRows, configFields, totalCount }`.
|
|
290
|
+
|
|
291
|
+
### Sorting
|
|
292
|
+
|
|
293
|
+
- `<TableSortLabel>` in each sortable column header.
|
|
294
|
+
- On click: call `PCore.getDataApiUtils().getDataAsync(dataPageName, { ...payload, sortBy, sortOrder })`.
|
|
295
|
+
- `sortBy` = column field name, `sortOrder` = `'ASC'` or `'DESC'`.
|
|
296
|
+
|
|
297
|
+
### Pagination
|
|
298
|
+
|
|
299
|
+
- `<TablePagination>` component below the table.
|
|
300
|
+
- `rowsPerPageOptions`: `[5, 10, 25]`.
|
|
301
|
+
- On page/rows change: re-fetch with `startIndex` and `maxResults` params.
|
|
302
|
+
|
|
303
|
+
### Global Search
|
|
304
|
+
|
|
305
|
+
- Shown when `isSearchable === true`.
|
|
306
|
+
- `<TextField>` input above the table (toolbar area).
|
|
307
|
+
- On submit/debounce: re-fetch with `searchText` param.
|
|
308
|
+
|
|
309
|
+
### Selection
|
|
310
|
+
|
|
311
|
+
| `selectionMode` | Control per row | Callback |
|
|
312
|
+
| --------------- | --------------- | ---------------------------- |
|
|
313
|
+
| `'single'` | `<Radio>` | `onRowSelect(rowData)` |
|
|
314
|
+
| `'multi'` | `<Checkbox>` | `onRowsSelect(selectedRows)` |
|
|
315
|
+
| absent | None | None |
|
|
316
|
+
|
|
317
|
+
- Select-all checkbox in the header for multi-selection.
|
|
318
|
+
- Selected rows highlighted with `selected` row class.
|
|
319
|
+
|
|
320
|
+
### Column Menu
|
|
321
|
+
|
|
322
|
+
- `<MoreVertIcon>` button in each column header.
|
|
323
|
+
- Opens `<Menu>` with options: Show/Hide column, Pin column.
|
|
324
|
+
- Column visibility stored in local state `columnVisibility`.
|
|
325
|
+
|
|
326
|
+
### Filter Dialog
|
|
327
|
+
|
|
328
|
+
- Filter icon in toolbar or column header.
|
|
329
|
+
- Opens `<Dialog>` with filter form fields for each filterable column.
|
|
330
|
+
- On apply: re-fetch with filter params.
|
|
331
|
+
- `filterData(filters, configFields)` formats filter objects for the API.
|
|
332
|
+
|
|
333
|
+
### Link Rendering (Navigation)
|
|
334
|
+
|
|
335
|
+
Columns configured with `displayAsLink: true` (or `additionalDetails.type === 'DISPLAY_LINK'`) render as clickable links that navigate to assignments or work items.
|
|
336
|
+
|
|
337
|
+
**Detection logic:**
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
const AssignDashObjects = ['Assign-Worklist', 'Assign-WorkBasket'];
|
|
341
|
+
|
|
342
|
+
// A column is a link if:
|
|
343
|
+
const isLink = column.displayAsLink;
|
|
344
|
+
|
|
345
|
+
// It's an assignment link if its classID is a worklist/workbasket class:
|
|
346
|
+
const isAssignmentLink = AssignDashObjects.includes(column.classID);
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
**Click handling:**
|
|
350
|
+
|
|
351
|
+
| Link type | API call | Parameters |
|
|
352
|
+
| --------------- | --------------------------------------------------------------------- | ---------------------------------------------- |
|
|
353
|
+
| Assignment link | `getActionsApi().openAssignment(pzInsKey, pxRefObjectClass, options)` | `options = { containerName, channelName: '' }` |
|
|
354
|
+
| Work item link | `getActionsApi().openWorkByHandle(pxRefObjectKey, pxRefObjectClass)` | — |
|
|
355
|
+
|
|
356
|
+
**Legacy column IDs** that also render as links (even without `displayAsLink`):
|
|
357
|
+
|
|
358
|
+
- `pxTaskLabel` → opens assignment (if `pxRefObjectClass` + `pzInsKey` exist on the row)
|
|
359
|
+
- `pxRefObjectInsName` → opens work item (if `pxRefObjectClass` + `pxRefObjectKey` exist)
|
|
360
|
+
|
|
361
|
+
### Snackbar Toast
|
|
362
|
+
|
|
363
|
+
- Shown on fetch errors or action feedback.
|
|
364
|
+
- Auto-hides after 3000ms.
|
|
365
|
+
|
|
366
|
+
## Visual Specifications
|
|
367
|
+
|
|
368
|
+
| Element | Description |
|
|
369
|
+
| -------------- | -------------------------------------------------------- |
|
|
370
|
+
| Toolbar | Search input + filter button + (optional) action buttons |
|
|
371
|
+
| Table head | Sticky header with sort labels and column menu |
|
|
372
|
+
| Table body | Striped rows, hover state, selected state |
|
|
373
|
+
| Pagination bar | Below table, page size selector + page nav |
|
|
374
|
+
|
|
375
|
+
**CSS-only implementation notes:**
|
|
376
|
+
|
|
377
|
+
- Table container: `overflow-x: auto`.
|
|
378
|
+
- Header row: `background: var(--table-header-bg); font-weight: 600`.
|
|
379
|
+
- Selected row: `background: var(--selection-highlight-bg)`.
|
|
380
|
+
- Hover row: `background: var(--hover-bg)`.
|
|
381
|
+
- Sticky header: `position: sticky; top: 0; z-index: 1`.
|
|
382
|
+
|
|
383
|
+
## Edge Cases & Special Logic
|
|
384
|
+
|
|
385
|
+
- `bInForm: true` — remove outer padding, hide some toolbar elements.
|
|
386
|
+
- Empty result set — show empty state message `"No records found"`.
|
|
387
|
+
- `compositeKeys` — used for unique row key generation when no single ID field exists.
|
|
388
|
+
- Column visibility changes are local state only — not persisted by default.
|
|
389
|
+
- Large datasets — pagination is mandatory; do not load all rows at once.
|
|
390
|
+
|
|
391
|
+
## Dependencies
|
|
392
|
+
|
|
393
|
+
- `useInit`, `filterData`, `buildFieldsForTable`, `getConfigFields`, `initializeColumns` from `./utils`
|
|
394
|
+
- `PCore.getDataApiUtils().getDataAsync()` — data fetching
|
|
395
|
+
- MUI: `<Table>`, `<TableHead>`, `<TableBody>`, `<TableRow>`, `<TableCell>`, `<TableSortLabel>`, `<TablePagination>`, `<Checkbox>`, `<Radio>`, `<Dialog>`, `<TextField>`, `<Menu>`, `<MenuItem>`, `<Snackbar>`
|
|
396
|
+
|
|
397
|
+
## Design System Mapping
|
|
398
|
+
|
|
399
|
+
**UI control type:** Full-featured data table with sorting, pagination, search, selection, and filtering.
|
|
400
|
+
|
|
401
|
+
Listed design systems are examples only.
|
|
402
|
+
|
|
403
|
+
| Design System | Table | Pagination | Dialog | Search | Link |
|
|
404
|
+
| ------------------ | -------------------------------------------------------------------------------------- | -------------------------- | ------------------ | ---------------- | ------------------- |
|
|
405
|
+
| Default (CSS only) | `<table>/<thead>/<tbody>` | Custom pagination controls | `<dialog>` element | `<input>` | `<a>` |
|
|
406
|
+
| MUI | `<Table>` + sub-components | `<TablePagination>` | `<Dialog>` | `<TextField>` | `<Link>` |
|
|
407
|
+
| Carbon | `<DataTable>` + `<Table>/<TableHead>/<TableBody>/<TableRow>/<TableCell>/<TableHeader>` | `<Pagination>` | `<Modal>` | `<Search>` | `<Link>` |
|
|
408
|
+
| Ant Design | `<Table>` | Built-in pagination prop | `<Modal>` | `<Input.Search>` | `<Typography.Link>` |
|
|
409
|
+
| Chakra UI | `<Table>` | Custom or `react-table` | `<Modal>` | `<Input>` | `<Link>` |
|
|
410
|
+
| Shadcn/ui | `<Table>` + TanStack Table | Custom pagination | `<Dialog>` | `<Input>` | `<a>` |
|
|
411
|
+
|
|
412
|
+
When implementing in a specific design system:
|
|
413
|
+
|
|
414
|
+
- **ALWAYS check `package.json`** to identify the installed design system BEFORE writing any render code
|
|
415
|
+
- Import and use the DS's table/pagination/search/link components — do NOT fall back to plain HTML
|
|
416
|
+
- If the DS provides a `DataTable` wrapper (e.g., Carbon), use it for built-in toolbar/search integration
|
|
417
|
+
- `bInForm` prop affects layout — tighten spacing and remove outer chrome when `true`
|
|
418
|
+
- Sorting, pagination, and search all trigger data re-fetches — do not filter client-side for server-paged data
|
|
419
|
+
- Selection mode (`single`/`multi`) requires different controls and callbacks
|
|
@@ -26,6 +26,46 @@ Renders a multi-value reference field in read-only mode. Routing is based on the
|
|
|
26
26
|
| `fieldMetadata` | `object` | No | Field-level metadata |
|
|
27
27
|
| `getPConnect` | `function` | Yes | PConnect getter |
|
|
28
28
|
|
|
29
|
+
## Component Skeleton
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import type { PConnProps } from '@pega/sdk-react';
|
|
33
|
+
|
|
34
|
+
interface MultiReferenceReadOnlyProps extends PConnProps {
|
|
35
|
+
config: { referenceList: any; readonlyContextList: any };
|
|
36
|
+
label: string;
|
|
37
|
+
hideLabel: boolean;
|
|
38
|
+
displayMode?: any;
|
|
39
|
+
displayAs?: any;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export default function MultiReferenceReadOnly(props: MultiReferenceReadOnlyProps) {
|
|
43
|
+
const { getPConnect, label = '', hideLabel = false, config, displayMode, displayAs } = props;
|
|
44
|
+
const { referenceList, readonlyContextList } = config;
|
|
45
|
+
|
|
46
|
+
// 1. Route: SimpleTableSelectReadonly for specific displayAs values
|
|
47
|
+
if (['readonlyMulti', 'combobox', 'checkboxgroup'].includes(displayAs)) {
|
|
48
|
+
return getPConnect().createComponent({
|
|
49
|
+
type: 'SimpleTableSelectReadonly',
|
|
50
|
+
config: { ...config, displayMode, label, hideLabel, displayAs },
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// 2. Fallback: use readonlyContextList if referenceList is not a property annotation
|
|
55
|
+
let readonlyContextObject;
|
|
56
|
+
if (!PCore.getAnnotationUtils().isProperty(referenceList)) {
|
|
57
|
+
readonlyContextObject = { referenceList: readonlyContextList };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// 3. Route: SimpleTable for all other displayAs values
|
|
61
|
+
const component = getPConnect().createComponent(
|
|
62
|
+
{ type: 'SimpleTable', config: { ...config, ...readonlyContextObject, label, hideLabel } },
|
|
63
|
+
'', 0, {},
|
|
64
|
+
);
|
|
65
|
+
return <>{component}</>;
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
29
69
|
## Behavioral Contract
|
|
30
70
|
|
|
31
71
|
### Routing by `displayAs`
|
package/templates/react-sdk-reference/{.claude → .ai-common}/skills/template-skills/NarrowWide.md
RENAMED
|
@@ -63,6 +63,72 @@ All extend `PConnProps`.
|
|
|
63
63
|
| `showHighlightedData` | `boolean` | No | Whether to render highlighted data fields above children. Default `false` |
|
|
64
64
|
| `getPConnect` | `function` | Yes | PConnect getter |
|
|
65
65
|
|
|
66
|
+
## Component Skeletons
|
|
67
|
+
|
|
68
|
+
### NarrowWide (core)
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import type { PropsWithChildren, ReactElement } from 'react';
|
|
72
|
+
import type { PConnProps } from '@pega/sdk-react';
|
|
73
|
+
import './NarrowWide.css';
|
|
74
|
+
|
|
75
|
+
interface NarrowWideProps extends PConnProps {
|
|
76
|
+
a: any; b: any; title?: string; cols?: string; icon?: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export default function NarrowWide(props: PropsWithChildren<NarrowWideProps>) {
|
|
80
|
+
const { a, b, children } = props;
|
|
81
|
+
return (
|
|
82
|
+
<>
|
|
83
|
+
{children && (children as ReactElement[]).length === 2 && (
|
|
84
|
+
<div className="psdk-narrow-wide-column">
|
|
85
|
+
<div className="psdk-narrow-column-column">{children[0]}</div>
|
|
86
|
+
<div className="psdk-wide-column-column">{children[1]}</div>
|
|
87
|
+
</div>
|
|
88
|
+
)}
|
|
89
|
+
{a && b && (
|
|
90
|
+
<div className="psdk-narrow-wide-column">
|
|
91
|
+
<div className="psdk-narrow-column-column">{a}</div>
|
|
92
|
+
<div className="psdk-wide-column-column">{b}</div>
|
|
93
|
+
</div>
|
|
94
|
+
)}
|
|
95
|
+
</>
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### NarrowWidePage
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
const NarrowWide = getComponentFromRegistry('NarrowWide');
|
|
104
|
+
const { children, title, templateCol = '1fr 1fr', icon = '' } = props;
|
|
105
|
+
return <NarrowWide a={children[0]} b={children[1]} title={title}
|
|
106
|
+
cols={templateCol} icon={icon?.replace('pi pi-', '')} />;
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### NarrowWideForm
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
const { children } = props;
|
|
113
|
+
return children?.length === 2 ? (
|
|
114
|
+
<div className="psdk-narrow-wide-column">
|
|
115
|
+
<div className="psdk-narrow-column-column">{children[0]}</div>
|
|
116
|
+
<div className="psdk-wide-column-column">{children[1]}</div>
|
|
117
|
+
</div>
|
|
118
|
+
) : null;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### NarrowWideDetails
|
|
122
|
+
|
|
123
|
+
Same pattern as `Details` but uses `COLUMN_WIDTHS = [4, 8]`:
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
const COLUMN_WIDTHS = [4, 8];
|
|
127
|
+
// highlighted data: <GridItem xs={COLUMN_WIDTHS[i]}>
|
|
128
|
+
// regular children: <GridItem xs={COLUMN_WIDTHS[i]}>
|
|
129
|
+
// Wrap in FieldGroup, setInheritedProp DISPLAY_ONLY + readOnly
|
|
130
|
+
```
|
|
131
|
+
|
|
66
132
|
## Behavioral Contract
|
|
67
133
|
|
|
68
134
|
### NarrowWide
|
package/templates/react-sdk-reference/{.github → .ai-common}/skills/template-skills/OneColumn.md
RENAMED
|
@@ -24,6 +24,40 @@ Renders all children stacked vertically in a single full-width column. Three clo
|
|
|
24
24
|
|
|
25
25
|
All extend `PConnProps`. Children are received as React `children`.
|
|
26
26
|
|
|
27
|
+
## Component Skeletons
|
|
28
|
+
|
|
29
|
+
### OneColumn (core)
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import type { PropsWithChildren, ReactElement } from 'react';
|
|
33
|
+
import type { PConnProps } from '@pega/sdk-react';
|
|
34
|
+
|
|
35
|
+
export default function OneColumn(props: PropsWithChildren<PConnProps>) {
|
|
36
|
+
const { children } = props;
|
|
37
|
+
return (
|
|
38
|
+
<GridContainer spacing={2}>
|
|
39
|
+
<GridItem xs={12} className="col-styles">
|
|
40
|
+
{(children as ReactElement[]).map(child => child)}
|
|
41
|
+
</GridItem>
|
|
42
|
+
</GridContainer>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
// CSS: .col-styles { display: grid; gap: 1rem; align-content: baseline; }
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### OneColumnPage
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
const OneColumn = getComponentFromRegistry('OneColumn');
|
|
52
|
+
return <OneColumn {...props} />;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### OneColumnTab
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
return <div id="OneColumnTab">{children}</div>;
|
|
59
|
+
```
|
|
60
|
+
|
|
27
61
|
## Props
|
|
28
62
|
|
|
29
63
|
| Prop | Type | Required | Description |
|
|
@@ -27,6 +27,98 @@ Renders promoted filter controls above a list view. Filter fields are created dy
|
|
|
27
27
|
| `isSearchable` | `boolean` | No | Whether the ListView below shows a global search input |
|
|
28
28
|
| `getPConnect` | `function` | Yes | PConnect getter |
|
|
29
29
|
|
|
30
|
+
## Component Skeleton
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import React, { useCallback, useMemo, useState, createElement } from 'react';
|
|
34
|
+
import { isEmptyObject } from '../../helpers/common-utils';
|
|
35
|
+
import { getComponentFromRegistry, PConnectComponent } from '@pega/sdk-react';
|
|
36
|
+
import type { PConnProps } from '@pega/sdk-react';
|
|
37
|
+
import './PromotedFilters.css';
|
|
38
|
+
|
|
39
|
+
const SUPPORTED_TYPES_IN_PROMOTED_FILTERS = [
|
|
40
|
+
'TextInput','Percentage','Email','Integer','Decimal','Checkbox',
|
|
41
|
+
'DateTime','Date','Time','Text','TextArea','Currency','URL','RichText',
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
// Sub-component: renders each filter field via PCore.createPConnect
|
|
45
|
+
function Filters({ filters, transientItemID, localeReference }) {
|
|
46
|
+
return filters.map((filter, index) => {
|
|
47
|
+
const filterClone = { ...filter };
|
|
48
|
+
if (!SUPPORTED_TYPES_IN_PROMOTED_FILTERS.includes(filterClone.type)) {
|
|
49
|
+
filterClone.type = 'TextInput';
|
|
50
|
+
delete filterClone.config.placeholder;
|
|
51
|
+
}
|
|
52
|
+
filterClone.config.contextName = transientItemID;
|
|
53
|
+
filterClone.config.readOnly = false;
|
|
54
|
+
filterClone.config.context = transientItemID;
|
|
55
|
+
filterClone.config.localeReference = localeReference;
|
|
56
|
+
const c11nEnv = PCore.createPConnect({
|
|
57
|
+
meta: filterClone,
|
|
58
|
+
options: { hasForm: true, contextName: transientItemID },
|
|
59
|
+
});
|
|
60
|
+
return <React.Fragment key={index}>{createElement(PConnectComponent, c11nEnv)}</React.Fragment>;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export default function PromotedFilters(props: PromotedFilterProps) {
|
|
65
|
+
const ListView = getComponentFromRegistry('ListView');
|
|
66
|
+
const localizedVal = PCore.getLocaleUtils().getLocaleValue;
|
|
67
|
+
const { getPConnect, viewName, filters, listViewProps, pageClass, parameters } = props;
|
|
68
|
+
const [initTable, setInitTable] = useState(false);
|
|
69
|
+
const [payload, setPayload] = useState({});
|
|
70
|
+
|
|
71
|
+
// 1. Build transient item on mount (useMemo)
|
|
72
|
+
const filtersProperties = {};
|
|
73
|
+
filters.forEach(f => { filtersProperties[PCore.getAnnotationUtils().getPropertyName(f.config.value)] = ''; });
|
|
74
|
+
const transientItemID = useMemo(() => {
|
|
75
|
+
return getPConnect().getContainerManager().addTransientItem({
|
|
76
|
+
id: viewName, data: { ...filtersProperties, classID: pageClass },
|
|
77
|
+
});
|
|
78
|
+
}, []);
|
|
79
|
+
|
|
80
|
+
// 2. Search handler: read form changes, format filters, set payload
|
|
81
|
+
const getFilterData = useCallback((e) => {
|
|
82
|
+
e.preventDefault();
|
|
83
|
+
const changes = PCore.getFormUtils().getChanges(transientItemID);
|
|
84
|
+
const formValues = {};
|
|
85
|
+
Object.keys(changes).forEach(key => {
|
|
86
|
+
if (!['context_data','pageInstructions'].includes(key)) formValues[key] = changes[key];
|
|
87
|
+
});
|
|
88
|
+
const promotedFilters = formatPromotedFilters(formValues);
|
|
89
|
+
if (PCore.getFormUtils().isFormValid(transientItemID) && isValidInput(formValues)) {
|
|
90
|
+
setInitTable(true);
|
|
91
|
+
const Query: any = { dataViewParameters: parameters };
|
|
92
|
+
if (!isEmptyObject(promotedFilters)) Query.query = { filter: { filterConditions: promotedFilters } };
|
|
93
|
+
setPayload(Query);
|
|
94
|
+
}
|
|
95
|
+
}, [transientItemID]);
|
|
96
|
+
|
|
97
|
+
// 3. Clear handler
|
|
98
|
+
const clearFilterData = useCallback(() => {
|
|
99
|
+
PCore.getContainerUtils().clearTransientData(transientItemID);
|
|
100
|
+
setInitTable(false);
|
|
101
|
+
getPConnect()?.getListActions?.()?.setSelectedRows([]);
|
|
102
|
+
}, [transientItemID]);
|
|
103
|
+
|
|
104
|
+
// 4. Render: title + filter fields + Clear/Search buttons + conditional ListView
|
|
105
|
+
return (
|
|
106
|
+
<>
|
|
107
|
+
<div>{listViewProps.title}</div>
|
|
108
|
+
<div className="psdk-grid-filter">
|
|
109
|
+
<Filters filters={filters} transientItemID={transientItemID}
|
|
110
|
+
localeReference={listViewProps.localeReference} />
|
|
111
|
+
</div>
|
|
112
|
+
<div>
|
|
113
|
+
<ClearButton onClick={clearFilterData}>Clear</ClearButton>
|
|
114
|
+
<SearchButton onClick={getFilterData}>Search</SearchButton>
|
|
115
|
+
</div>
|
|
116
|
+
{initTable && <ListView {...listViewProps} title="" payload={payload} isSearchable />}
|
|
117
|
+
</>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
30
122
|
## Behavioral Contract
|
|
31
123
|
|
|
32
124
|
### Transient Data Setup
|