Skip to content

Commit 0060c71

Browse files
authored
Adds mock data generation to data workbench (#350)
* Adds mock data generation to data workbench Enables users to update objects with mock data based on predefined patterns. This enhancement provides a way to test and populate data during development and testing phases, reducing the dependency on real data. The changes introduce UI elements to define mock data fields and their patterns, and modifies the backend to handle the mock data configuration. * [Mega-Linter] Apply linters fixes :) --------- Co-authored-by: nvuillam <17500430+nvuillam@users.noreply.github.com>
1 parent effd5be commit 0060c71

File tree

4 files changed

+276
-13
lines changed

4 files changed

+276
-13
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
## Unreleased
44

5+
## [6.27.1] 2025-02-19
6+
57
- Improves duplicate command prevention
8+
- Add support of Mock data in Data Workbench
69

710
## [6.27.0] 2025-02-10
811

src/commands/showDataWorkbench.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ type SfdmuObjectConfig = {
2424
useQueryAll?: boolean;
2525
allOrNone?: boolean;
2626
batchSize?: number | string;
27+
updateWithMockData?: boolean;
28+
mockFields?: Array<{ name?: string; pattern?: string }>;
2729
[key: string]: any;
2830
};
2931

@@ -218,6 +220,8 @@ async function loadDataWorkspaces(): Promise<DataWorkspace[]> {
218220
obj.bulkApiV1BatchSize ??
219221
obj.restApiBatchSize ??
220222
undefined,
223+
updateWithMockData: obj.updateWithMockData === true,
224+
mockFields: normalizeMockFields(obj.mockFields),
221225
objectName: extractObjectName(obj.query || ""),
222226
}))
223227
: [];
@@ -512,6 +516,13 @@ function normalizeObjectsForSave(objects: SfdmuObjectConfig[]): any[] {
512516
delete cleanedObj.batchSize;
513517
}
514518

519+
cleanedObj.updateWithMockData = obj.updateWithMockData === true;
520+
cleanedObj.mockFields = normalizeMockFields(obj.mockFields);
521+
522+
if (!cleanedObj.updateWithMockData || cleanedObj.mockFields.length === 0) {
523+
delete cleanedObj.mockFields;
524+
}
525+
515526
if (cleanedObj.objectName) {
516527
delete cleanedObj.objectName;
517528
}
@@ -520,6 +531,21 @@ function normalizeObjectsForSave(objects: SfdmuObjectConfig[]): any[] {
520531
});
521532
}
522533

534+
function normalizeMockFields(
535+
mockFields: Array<{ name?: string; pattern?: string }> | undefined,
536+
): Array<{ name: string; pattern: string }> {
537+
if (!Array.isArray(mockFields)) {
538+
return [];
539+
}
540+
return mockFields
541+
.filter((mockField) => mockField && typeof mockField === "object")
542+
.map((mockField) => ({
543+
name: mockField.name || "",
544+
pattern: mockField.pattern || "",
545+
}))
546+
.filter((mockField) => mockField.name || mockField.pattern);
547+
}
548+
523549
function extractObjectName(query: string): string {
524550
if (!query) {
525551
return "";

src/webviews/lwc-ui/modules/s/dataWorkbench/dataWorkbench.html

Lines changed: 131 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -242,28 +242,51 @@ <h5 class="slds-text-heading_x-small">Configuration Summary</h5>
242242
<dd class="slds-item_detail slds-truncate">{selectedWorkspace.objectsCount}</dd>
243243
</dl>
244244
<template if:true={selectedWorkspace.objects}>
245-
<ul class="slds-list_dotted slds-m-top_small">
245+
<div class="slds-m-top_small">
246246
<template for:each={selectedWorkspace.objects} for:item="obj" for:index="index">
247-
<li key={obj.query} class="slds-m-bottom_x-small">
248-
<p class="slds-text-body_small">
249-
<strong>{obj.operation}</strong>
247+
<div key={obj.query} class="slds-box slds-box_x-small slds-m-bottom_x-small slds-border_bottom">
248+
<div class="slds-grid slds-grid_align-spread slds-m-bottom_x-small">
249+
<div>
250+
<span class="slds-badge slds-badge_inverse slds-m-right_x-small">{obj.operation}</span>
251+
<span class="slds-text-body_small slds-text-color_weak">{obj.objectName}</span>
252+
</div>
253+
</div>
254+
<p class="slds-text-body_small slds-text-color_weak slds-truncate slds-m-bottom_x-small" title={obj.query}>{obj.query}</p>
255+
<div class="slds-grid slds-wrap slds-gutters_x-small">
250256
<template if:true={obj.externalId}>
251-
&nbsp;• External Id: {obj.externalId}
257+
<div class="slds-size_auto">
258+
<span class="slds-text-body_xx-small slds-badge">External Id: {obj.externalId}</span>
259+
</div>
252260
</template>
253261
<template if:true={obj.deleteOldData}>
254-
&nbsp;• deleteOldData
262+
<div class="slds-size_auto">
263+
<span class="slds-text-body_xx-small slds-badge slds-badge_success">deleteOldData</span>
264+
</div>
255265
</template>
256266
<template if:true={obj.useQueryAll}>
257-
&nbsp;• useQueryAll
267+
<div class="slds-size_auto">
268+
<span class="slds-text-body_xx-small slds-badge slds-badge_success">useQueryAll</span>
269+
</div>
270+
</template>
271+
<template if:true={obj.updateWithMockData}>
272+
<div class="slds-size_auto">
273+
<span class="slds-text-body_xx-small slds-badge slds-badge_success">Mock Data</span>
274+
</div>
275+
</template>
276+
<template if:true={obj.hasMockFields}>
277+
<div class="slds-size_auto">
278+
<span class="slds-text-body_xx-small slds-badge">{obj.mockFieldsCount} field(s)</span>
279+
</div>
258280
</template>
259281
<template if:true={obj.batchSize}>
260-
&nbsp;• batchSize: {obj.batchSize}
282+
<div class="slds-size_auto">
283+
<span class="slds-text-body_xx-small slds-badge">Batch: {obj.batchSize}</span>
284+
</div>
261285
</template>
262-
</p>
263-
<p class="slds-text-body_small slds-text-color_weak slds-truncate" title={obj.query}>{obj.query}</p>
264-
</li>
286+
</div>
287+
</div>
265288
</template>
266-
</ul>
289+
</div>
267290
</template>
268291
</div>
269292
</div>
@@ -585,6 +608,102 @@ <h4 class="slds-text-title_caps">Object {obj.displayIndex}</h4>
585608
</div>
586609
</div>
587610
</div>
611+
612+
<div class="slds-form-element slds-m-bottom_medium">
613+
<div class="slds-grid slds-grid_vertical-align-center">
614+
<div class="slds-no-flex">
615+
<lightning-input
616+
type="toggle"
617+
variant="label-hidden"
618+
name="update-with-mock-data"
619+
aria-label="Update with mock data"
620+
message-toggle-active=""
621+
message-toggle-inactive=""
622+
checked={obj.updateWithMockData}
623+
data-index={index}
624+
data-field="updateWithMockData"
625+
onchange={handleObjectToggleChange}
626+
></lightning-input>
627+
</div>
628+
<div class="slds-grid slds-grid_vertical-align-center slds-m-left_small">
629+
<span class="slds-text-body_regular">Update with mock data</span>
630+
<span class="slds-no-flex slds-m-left_xx-small">
631+
<s-multiline-helptext content="Enable mock data generation for fields defined below."></s-multiline-helptext>
632+
</span>
633+
</div>
634+
</div>
635+
</div>
636+
637+
<template if:true={obj.showMockFields}>
638+
<div class="slds-box slds-box_x-small slds-m-bottom_medium">
639+
<div class="slds-grid slds-grid_align-spread slds-grid_vertical-align-center slds-m-bottom_small">
640+
<h5 class="slds-text-title_caps">Mock fields</h5>
641+
<lightning-button
642+
variant="neutral"
643+
label="Add mock field"
644+
icon-name="utility:add"
645+
onclick={addMockField}
646+
data-index={index}
647+
></lightning-button>
648+
</div>
649+
<template for:each={obj.mockFields} for:item="mockField" for:index="fieldIndex">
650+
<div key={mockField.displayIndex} class="slds-grid slds-gutters slds-m-bottom_x-small slds-grid_vertical-align-end">
651+
<div class="slds-col slds-size_5-of-12">
652+
<div class="slds-form-element">
653+
<label class="slds-form-element__label" for="mock-field-name">Field</label>
654+
<div class="slds-form-element__control">
655+
<lightning-input
656+
variant="label-hidden"
657+
type="text"
658+
name="mock-field-name"
659+
placeholder="Email__c"
660+
data-index={index}
661+
data-fieldindex={fieldIndex}
662+
data-field="name"
663+
value={mockField.name}
664+
onchange={handleMockFieldChange}
665+
></lightning-input>
666+
</div>
667+
</div>
668+
</div>
669+
<div class="slds-col slds-size_5-of-12">
670+
<div class="slds-form-element">
671+
<label class="slds-form-element__label" for="mock-field-pattern">Pattern</label>
672+
<div class="slds-form-element__control">
673+
<lightning-combobox
674+
variant="label-hidden"
675+
name="mock-field-pattern"
676+
placeholder="Select pattern"
677+
data-index={index}
678+
data-fieldindex={fieldIndex}
679+
data-field="pattern"
680+
value={mockField.pattern}
681+
options={mockPatternOptions}
682+
onchange={handleMockFieldChange}
683+
></lightning-combobox>
684+
</div>
685+
</div>
686+
</div>
687+
<div class="slds-col slds-size_2-of-12">
688+
<div class="slds-form-element">
689+
<label class="slds-form-element__label">&nbsp;</label>
690+
<div class="slds-form-element__control">
691+
<lightning-button
692+
variant="destructive-text"
693+
icon-name="utility:delete"
694+
label="Remove"
695+
data-index={index}
696+
data-fieldindex={fieldIndex}
697+
onclick={removeMockField}
698+
disabled={obj.disableMockFieldRemove}
699+
></lightning-button>
700+
</div>
701+
</div>
702+
</div>
703+
</div>
704+
</template>
705+
</div>
706+
</template>
588707
</div>
589708
</template>
590709
</div>

0 commit comments

Comments
 (0)