Skip to content

feat(workbench): various UX improvements#8165

Open
grantfitzsimmons wants to merge 45 commits into
mainfrom
issue-8153
Open

feat(workbench): various UX improvements#8165
grantfitzsimmons wants to merge 45 commits into
mainfrom
issue-8153

Conversation

@grantfitzsimmons

@grantfitzsimmons grantfitzsimmons commented Jun 4, 2026

Copy link
Copy Markdown
Member

Fixes #8153
Fixes #8155
Fixes #8014
Fixes #4484

This PR introduces a number of different UI improvements, localization updates, and bug fixes centered around the WorkBench data mapping and upload workflows:

  1. Terminology Updates ("Upload Plan" ➔ "Mapping"):

    • Renamed user-facing copy and localized strings from "Upload Plan" to "Mapping" / "Mapping Plan" (e.g. chooseExistingPlan becomes "Choose Existing Mapping", uploadPlan is now "Import/Export Mapping").
  2. Record Counts & Live Validation:

    • Validation and upload results dialogs now dynamically show a breakdown of record counts per type (e.g., Created, Updated, Deleted, Matched/Changed) using the TableRecordCounts component.
    • Enabled Live Validation (dataCheck) by default (defaultValue: true in user preferences).
    • Dialog icons now accurately reflect the validation and upload status (success, error, warning).
      image
      image
      image
      image
  3. Import/Export Mapping Enhancements:

    • Added the ability to import a mapping configuration from a .json file in addition to exporting.
    • Includes validation to show an error dialog if the uploaded file is not valid JSON.
      image
      image
  4. Data Mapping Dialog & Usability Improvements:

    • Added a "Choose Existing Mapping" option directly in the "no mapping" dialog.
      image
    • Added a confirmation step before clearing all mappings to prevent accidental loss of progress.
      image
    • Added descriptive helper texts in the Base Table Selection dialogs explaining what a base table is, and adjusted the dialog container layout to a more standard sizing constraint.
      WorkBench
      image
      WorkBench Attachments
      image
    • Added documentation link to the workbench mapper control panel.
      image
  5. UI Fixes:

Checklist

  • Self-review the PR after opening it to make sure the changes look good and
    self-explanatory (or properly documented)
  • Add relevant issue to release milestone
  • Add pr to documentation list
  • Add automated tests
  • Add a reverse migration if a migration is present in the PR
  • Add migration function to
    def fix_schema_config(stdout: WriteToStdOut | None = None):

Testing instructions

1. Live Validation & Upload Record Counts (Fixes #8153)

  • Open any dataset in the WorkBench.
  • Verify that "Live Validation" is enabled by default.
  • Map your columns and trigger validation/upload.
  • Verify that the validation and upload confirmation/results dialogs show a table outlining the records created, updated, deleted, or matched/changed, depending on your dataset operations.

2. Mapping Import/Export & Clear Confirmation

  • While mapping columns, click Import/Export Mapping (previously "Upload Plan").
  • Verify that you can Export the current plan as a .json file.
  • Test the Import feature by selecting a .json file from your local machine. Verify that uploading a corrupt or invalid JSON file presents an invalid JSON error dialog.
  • Click Clear Mappings and ensure a confirmation dialog appears asking to verify erasing the mappings before proceeding.
  • Switch datasets to one without a mapping. Verify that the dialog now includes a button to Choose Existing Mapping.

3. Base Table Selection Dialog

  • Open the Base Table Selection dialog (e.g. by changing base tables or starting a new mapping).
  • Verify the dialog width/height scales properly and that it displays descriptions clarifying what a "base table" is.

4. SvgIcon Alignment in Firefox (Fixes #8155)

  • Open the WorkBench using Firefox.
  • Verify that column/table status icons align correctly and do not shift out of place.

5. Express Search Dialog Shifting (Fixes #8014)

  • Open the Express Search Configuration dialog.
  • Verify the dialog does not shift layout when opened/closed.

Summary by CodeRabbit

  • New Features

    • New dialog icons for warning/question/failure states
    • "Choose existing plan" flow for datasets without an upload plan
    • Import/export mapping (Upload Plan) support
    • Upload dialogs now show detailed record-count breakdowns
  • Improvements

    • Documentation link added in mapping UI
    • Terminology standardized to "Data Set Mapping"
    • Dialog sizing and SVG text alignment refined
    • Live validation enabled by default
    • Multiple localization and success-message updates

Triggered by e922695 on branch refs/heads/issue-8153
Update terminology and user-facing copy from 'Upload Plan' to 'Mapping' (or 'Mapping Plan') across the WorkBench.
@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 463169ec-add6-489b-bde2-d7afdfa49447

📥 Commits

Reviewing files that changed from the base of the PR and between ea96ac7 and c60afcc.

📒 Files selected for processing (1)
  • specifyweb/frontend/js_src/lib/localization/wbPlan.ts
✅ Files skipped from review due to trivial changes (1)
  • specifyweb/frontend/js_src/lib/localization/wbPlan.ts

📝 Walkthrough

Walkthrough

Updates workbench/dialog UI and mapping flows: adds an xCircle icon and dialog icon mappings, fixes SVG text alignment, wires icons into dialogs, adds record-count rendering and a choose-existing mapping flow, introduces raw JSON import/export for mappings, and revises mapping-related localization and copy.

Changes

WorkBench UI improvements and icon system

Layer / File(s) Summary
Icon system foundation and dialog sizing
specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx, specifyweb/frontend/js_src/lib/components/Atoms/className.ts, specifyweb/frontend/js_src/lib/components/ExpressSearchConfig/ExpressSearchConfigDialog.tsx
Added xCircle and updated dialogIcons (warning, question, failure), added dialog icon trigger CSS entries, and changed express-search dialog container to extraWideContainer.
SVG text vertical alignment fix for Firefox
specifyweb/frontend/js_src/lib/components/Molecules/SvgIcon.tsx
Replaced baseline attributes with dy=".35em" on SVG <text> for consistent icon centering across browsers.
Dialog icon wiring in status and action components
specifyweb/frontend/js_src/lib/components/LocalityUpdate/Status.tsx, specifyweb/frontend/js_src/lib/components/WbActions/WbRollback.tsx, specifyweb/frontend/js_src/lib/components/WbActions/WbUpload.tsx
Imported dialogIcons and supplied explicit icon props for status, rollback, and upload dialogs.
Upload dialog with record counts display
specifyweb/frontend/js_src/lib/components/WbActions/WbUpload.tsx, specifyweb/frontend/js_src/lib/components/WbActions/index.tsx
Extended WbUpload to accept recordCounts; WbActions derives and passes recordCounts, and operation-completed UI renders TableRecordCounts with per-type headers and sorting.
Operation completed dialog with icon selection and result breakdown
specifyweb/frontend/js_src/lib/components/WbActions/index.tsx
Selects success/error icons based on mode and invalid-cell counts, adds dialog close content, and conditionally shows a TableRecordCounts breakdown.
No-upload plan selection flow
specifyweb/frontend/js_src/lib/components/WbActions/WbNoUploadPlan.tsx, specifyweb/frontend/js_src/lib/components/WbPlanView/State.tsx
Adds TemplateSelection-backed "choose existing mapping" flow with LoadingContext, async PUT via ping, redirect on selection, and updated base-table selection dialog sizing/content.
Clear mappings component with confirmation dialog
specifyweb/frontend/js_src/lib/components/WbPlanView/Mapper.tsx, specifyweb/frontend/js_src/lib/components/WbPlanView/MapperComponents.tsx
Introduced exported ClearMappings component (confirmation dialog) and moved inline clear action into it; added documentation link in mapper toolbar and adjusted validation button styling.
Raw upload plan JSON import with validation
specifyweb/frontend/js_src/lib/components/WbToolkit/DevShowPlan.tsx
Added hidden file input, JSON parse/validation (fileToText), invalidJson warning dialog, import/export buttons, and updated dialog copy for import/export mapping.
Text localization and API exports
specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx, specifyweb/frontend/js_src/lib/components/WorkBench/DataSetMeta.tsx, specifyweb/frontend/js_src/lib/components/WorkBench/RecordSet.tsx, specifyweb/frontend/js_src/lib/components/WorkBench/Results.tsx, specifyweb/frontend/js_src/lib/components/WbPlanView/uploadPlanParser.ts, specifyweb/frontend/js_src/lib/components/WbPlanView/README.md
Changed liveValidation default to true, switched metadata labels to wbText.metadata(), updated record-set label, exported TableResults, and updated parser/message wording from "Upload plan" to "Data set mapping".
Comprehensive localization and terminology updates
specifyweb/frontend/js_src/lib/localization/wbPlan.ts, specifyweb/frontend/js_src/lib/localization/workbench.ts, specifyweb/frontend/js_src/lib/localization/batchEdit.ts
Added mapping/import-export/invalid-JSON strings, replaced "Upload Plan" with mapping terminology across many locales, and revised batch-edit success/warning wording.

Suggested reviewers

  • emenslin
  • CarolineDenis
  • bhumikaguptaa
  • Iwantexpresso
  • lexiclevenger
🚥 Pre-merge checks | ✅ 4 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Automatic Tests ⚠️ Warning PR adds significant component logic and features (WbUpload, WbNoUploadPlan, DevShowPlan) without test files. Only Icons test provides coverage via generic pattern. Add unit tests for modified components: WbUpload (recordCounts prop), WbNoUploadPlan (new flow), DevShowPlan (import/export), MapperComponents (ClearMappings), and SvgIcon (dy attribute).
Testing Instructions ⚠️ Warning Testing instructions are missing from the PR summary despite claims in objectives. The summary lacks verification steps for 21+ modified components. Add Testing Instructions section covering dialog stability, icon centering, record counts, JSON import, new dialogs, and Live Validation default.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat(workbench): various UX improvements' aligns with the core changes, though it is intentionally broad rather than highlighting a single primary change given the multi-faceted nature of this PR.
Linked Issues check ✅ Passed All primary objectives from linked issues are addressed: #8153 post-upload dialog UX improvements with record counts, #8155 Firefox SvgIcon text centering fix using dy attribute, #8014 Express Search Config dialog width stabilization, and #4484 matching behavior wording corrections in localization.
Out of Scope Changes check ✅ Passed Changes align with linked issue scope: UI/UX improvements, localization updates, dialog icon refinements, and terminology standardization. Minor additions like TemplateSelection export and TableResults export are supportive of the main objectives without introducing unrelated features.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-8153

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@grantfitzsimmons grantfitzsimmons changed the title fix: polish upload/commit messages feat(workbench): various UX improvements Jun 4, 2026
@grantfitzsimmons grantfitzsimmons added this to the 7.12.1 milestone Jun 4, 2026
@grantfitzsimmons grantfitzsimmons marked this pull request as ready for review June 8, 2026 00:44

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (5)
specifyweb/frontend/js_src/lib/localization/workbench.ts (1)

980-989: 💤 Low value

Consider following the localization workflow for new keys.

The new metadata key includes translations for all locales. Based on learnings, new localization keys should typically include only the en-us entry in code, with other locales populated via Weblate to maintain the translation workflow.

This doesn't affect functionality, but keeping the workflow consistent helps maintain translation quality and attribution. Based on learnings from previous PR feedback, it's preferred to let Weblate handle non-English translations for new keys.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@specifyweb/frontend/js_src/lib/localization/workbench.ts` around lines 980 -
989, The new localization object key metadata currently includes translations
for many locales; remove all non-English entries and leave only the 'en-us'
value for metadata so new keys follow the Weblate workflow (i.e., keep metadata:
{ 'en-us': 'Metadata' } and remove
'de-ch','es-es','fr-fr','ru-ru','uk-ua','pt-br','hr-hr') so translations are
later added via Weblate.

Source: Learnings

specifyweb/frontend/js_src/lib/localization/wbPlan.ts (1)

807-826: 💤 Low value

New localization keys include translations for all locales.

Per the project's localization guidelines, new keys should typically include only the en-us entry in code, with other locales populated via Weblate. The invalidJsonFile and invalidJsonFileDescription keys (Lines 807-826) include translations for all locales. This may be intentional if these were pre-translated or part of a batch update, but it's worth confirming this aligns with the localization workflow.

Based on learnings, new localization keys should include only the 'en-us' entry in code, with other locales populated via Weblate.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@specifyweb/frontend/js_src/lib/localization/wbPlan.ts` around lines 807 -
826, Remove the inline translations for all locales and leave only the 'en-us'
entries for the two new localization keys so they follow the project's Weblate
workflow: update the invalidJsonFile and invalidJsonFileDescription objects to
contain only the 'en-us' string values (e.g. 'The selected file is not valid
JSON.' and 'Please select a valid JSON data set mapping file.' respectively),
removing the other locale keys (ru-ru, es-es, fr-fr, uk-ua, de-ch, pt-br, hr-hr)
so translators will add them via Weblate.

Source: Learnings

specifyweb/frontend/js_src/lib/components/WbToolkit/DevShowPlan.tsx (1)

85-99: ⚖️ Poor tradeoff

Consider adding schema validation for imported JSON.

The import handler validates that the file contains valid JSON syntax (Line 93), but does not verify that the JSON structure matches the UploadPlan schema. Invalid structure will only be caught when the user tries to save. Adding client-side schema validation would provide earlier feedback.

💡 Optional schema validation approach

You could add a basic structure check:

.then((text) => {
  const parsed = JSON.parse(text);
  // Basic structure check
  if (!parsed.baseTableName || !parsed.uploadable) {
    throw new Error('Invalid mapping structure');
  }
  setUploadPlane(text);
})

However, full schema validation would be more complex and may not be worth the effort since the backend validates on save.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@specifyweb/frontend/js_src/lib/components/WbToolkit/DevShowPlan.tsx` around
lines 85 - 99, handleFileSelected currently only checks JSON syntax via
JSON.parse in the fileToText promise chain but does not validate the object
shape against the expected UploadPlan schema; update the promise chain in
handleFileSelected to parse the text into an object, perform a schema/shape
check (e.g., verify required fields and types expected by UploadPlan such as
baseTableName and uploadable or use a lightweight validator), and only call
setUploadPlane(text) when the validation passes; on validation failure call
showInvalid (or throw) so the existing catch handles it; reference
handleFileSelected, fileToText, setUploadPlane, UploadPlan and showInvalid when
making the change.
specifyweb/frontend/js_src/lib/components/WbPlanView/State.tsx (1)

101-101: 💤 Low value

Consider avoiding the !important modifier if possible.

The !w-1/3 class uses Tailwind's ! modifier to force override the normalContainer width. While this works, it may indicate a layout conflict. If normalContainer sets a width that needs overriding frequently, consider creating a dedicated dialog size variant instead of using !important.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@specifyweb/frontend/js_src/lib/components/WbPlanView/State.tsx` at line 101,
The container class string in State.tsx currently uses the Tailwind forced
modifier `!w-1/3` to override dialogClassNames.normalContainer; remove the `!`
override and instead add a dedicated size variant (e.g.,
dialogClassNames.smallContainer or dialogClassNames.normalContainerSmall) in the
dialogClassNames definitions and use that variant here, or adjust
normalContainer to accept size variants so you can replace
`${dialogClassNames.normalContainer} !w-1/3 max-h-[90%]` with a non-forced
combination that references the new variant (keep the rest like max-h-[90%]
unchanged).
specifyweb/frontend/js_src/lib/components/WbActions/index.tsx (1)

235-272: ⚡ Quick win

Consider extracting the result-type label mapping to reduce duplication.

The label mapping logic (lines 253-259) is duplicated from WbUpload.tsx lines 166-172. Consider extracting this to a shared helper function that maps result types to localized strings.

♻️ Example refactor

Create a helper function in a shared location:

function getResultTypeLabel(resultType: keyof RecordCounts): LocalizedString {
  return resultType === 'Uploaded'
    ? wbText.recordsCreated()
    : resultType === 'Updated'
      ? wbText.recordsUpdated()
      : resultType === 'Deleted'
        ? wbText.recordsDeleted()
        : wbText.recordsMatchedAndChanged();
}

Then use it in both files:

-  {resultType === 'Uploaded'
-    ? wbText.recordsCreated()
-    : resultType === 'Updated'
-      ? wbText.recordsUpdated()
-      : resultType === 'Deleted'
-        ? wbText.recordsDeleted()
-        : wbText.recordsMatchedAndChanged()}
+  {getResultTypeLabel(resultType)}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@specifyweb/frontend/js_src/lib/components/WbActions/index.tsx` around lines
235 - 272, The result-type label mapping in WbActions (the ternary block that
chooses between wbText.recordsCreated/Updated/Deleted/MatchedAndChanged) is
duplicated with WbUpload; extract it into a shared helper (e.g.,
getResultTypeLabel) that accepts the resultType (keyof RecordCounts) and returns
the localized string using wbText, then import and call
getResultTypeLabel(resultType) in both WbActions/index.tsx and WbUpload.tsx to
replace the inline ternary; ensure the helper uses the same RecordCounts key
type and wbText references so behavior and localization remain identical.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@specifyweb/frontend/js_src/lib/components/WbActions/WbNoUploadPlan.tsx`:
- Around line 64-79: The TemplateSelection onSelect handler calls ping(...)
wrapped by loading(...) but lacks explicit error handling; update the onSelect
callback in WbNoUploadPlan (the TemplateSelection -> onSelect handler) to attach
a .catch handler to the ping promise so failures are handled explicitly: keep
the redirect to /specify/workbench/plan/${datasetId}/ only on success, and in
.catch display a user-friendly error (e.g., via existing UI toast/alert function
or set state to show an error), stop/clear any loading state, and include the
error details for debugging; ensure the success path still calls
window.location.href and the error path does not redirect.

---

Nitpick comments:
In `@specifyweb/frontend/js_src/lib/components/WbActions/index.tsx`:
- Around line 235-272: The result-type label mapping in WbActions (the ternary
block that chooses between
wbText.recordsCreated/Updated/Deleted/MatchedAndChanged) is duplicated with
WbUpload; extract it into a shared helper (e.g., getResultTypeLabel) that
accepts the resultType (keyof RecordCounts) and returns the localized string
using wbText, then import and call getResultTypeLabel(resultType) in both
WbActions/index.tsx and WbUpload.tsx to replace the inline ternary; ensure the
helper uses the same RecordCounts key type and wbText references so behavior and
localization remain identical.

In `@specifyweb/frontend/js_src/lib/components/WbPlanView/State.tsx`:
- Line 101: The container class string in State.tsx currently uses the Tailwind
forced modifier `!w-1/3` to override dialogClassNames.normalContainer; remove
the `!` override and instead add a dedicated size variant (e.g.,
dialogClassNames.smallContainer or dialogClassNames.normalContainerSmall) in the
dialogClassNames definitions and use that variant here, or adjust
normalContainer to accept size variants so you can replace
`${dialogClassNames.normalContainer} !w-1/3 max-h-[90%]` with a non-forced
combination that references the new variant (keep the rest like max-h-[90%]
unchanged).

In `@specifyweb/frontend/js_src/lib/components/WbToolkit/DevShowPlan.tsx`:
- Around line 85-99: handleFileSelected currently only checks JSON syntax via
JSON.parse in the fileToText promise chain but does not validate the object
shape against the expected UploadPlan schema; update the promise chain in
handleFileSelected to parse the text into an object, perform a schema/shape
check (e.g., verify required fields and types expected by UploadPlan such as
baseTableName and uploadable or use a lightweight validator), and only call
setUploadPlane(text) when the validation passes; on validation failure call
showInvalid (or throw) so the existing catch handles it; reference
handleFileSelected, fileToText, setUploadPlane, UploadPlan and showInvalid when
making the change.

In `@specifyweb/frontend/js_src/lib/localization/wbPlan.ts`:
- Around line 807-826: Remove the inline translations for all locales and leave
only the 'en-us' entries for the two new localization keys so they follow the
project's Weblate workflow: update the invalidJsonFile and
invalidJsonFileDescription objects to contain only the 'en-us' string values
(e.g. 'The selected file is not valid JSON.' and 'Please select a valid JSON
data set mapping file.' respectively), removing the other locale keys (ru-ru,
es-es, fr-fr, uk-ua, de-ch, pt-br, hr-hr) so translators will add them via
Weblate.

In `@specifyweb/frontend/js_src/lib/localization/workbench.ts`:
- Around line 980-989: The new localization object key metadata currently
includes translations for many locales; remove all non-English entries and leave
only the 'en-us' value for metadata so new keys follow the Weblate workflow
(i.e., keep metadata: { 'en-us': 'Metadata' } and remove
'de-ch','es-es','fr-fr','ru-ru','uk-ua','pt-br','hr-hr') so translations are
later added via Weblate.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2cf96f8c-9e64-4b99-8101-228a215cf666

📥 Commits

Reviewing files that changed from the base of the PR and between 7fc918f and ea96ac7.

⛔ Files ignored due to path filters (1)
  • specifyweb/frontend/js_src/lib/components/Attachments/__tests__/__snapshots__/AttachmentCell.test.tsx.snap is excluded by !**/*.snap
📒 Files selected for processing (22)
  • specifyweb/frontend/js_src/lib/components/Atoms/Icons.tsx
  • specifyweb/frontend/js_src/lib/components/Atoms/className.ts
  • specifyweb/frontend/js_src/lib/components/ExpressSearchConfig/ExpressSearchConfigDialog.tsx
  • specifyweb/frontend/js_src/lib/components/LocalityUpdate/Status.tsx
  • specifyweb/frontend/js_src/lib/components/Molecules/SvgIcon.tsx
  • specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx
  • specifyweb/frontend/js_src/lib/components/WbActions/WbNoUploadPlan.tsx
  • specifyweb/frontend/js_src/lib/components/WbActions/WbRollback.tsx
  • specifyweb/frontend/js_src/lib/components/WbActions/WbUpload.tsx
  • specifyweb/frontend/js_src/lib/components/WbActions/index.tsx
  • specifyweb/frontend/js_src/lib/components/WbPlanView/Mapper.tsx
  • specifyweb/frontend/js_src/lib/components/WbPlanView/MapperComponents.tsx
  • specifyweb/frontend/js_src/lib/components/WbPlanView/README.md
  • specifyweb/frontend/js_src/lib/components/WbPlanView/State.tsx
  • specifyweb/frontend/js_src/lib/components/WbPlanView/uploadPlanParser.ts
  • specifyweb/frontend/js_src/lib/components/WbToolkit/DevShowPlan.tsx
  • specifyweb/frontend/js_src/lib/components/WorkBench/DataSetMeta.tsx
  • specifyweb/frontend/js_src/lib/components/WorkBench/RecordSet.tsx
  • specifyweb/frontend/js_src/lib/components/WorkBench/Results.tsx
  • specifyweb/frontend/js_src/lib/localization/batchEdit.ts
  • specifyweb/frontend/js_src/lib/localization/wbPlan.ts
  • specifyweb/frontend/js_src/lib/localization/workbench.ts

@github-project-automation github-project-automation Bot moved this from 📋Back Log to Dev Attention Needed in General Tester Board Jun 8, 2026
Comment thread specifyweb/frontend/js_src/lib/localization/wbPlan.ts Outdated
@CarolineDenis

CarolineDenis commented Jun 8, 2026

Copy link
Copy Markdown
Contributor

I don't think live validation is enabled by default.

In WbValidate()
We could do something like:

const isLiveValidateOn = validation.validationMode === 'live';

@grantfitzsimmons

Copy link
Copy Markdown
Member Author

@CarolineDenis:

I don't think live validation is enabled by default.

I suppose I mean that the live validation button is visible by default rather than on automatically. Do you think it would be intrusive if it started as soon as data was being entered?

@CarolineDenis

Copy link
Copy Markdown
Contributor

@grantfitzsimmons ok then it works as expected!
I think the current behavior is best.

@CarolineDenis CarolineDenis self-requested a review June 8, 2026 13:51

@emenslin emenslin left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1. Live Validation & Upload Record Counts (Fixes #8153)

  • Verify that "Live Validation" is enabled by default.
  • Verify that the validation and upload confirmation/results dialogs show a table outlining the records created, updated, deleted, or matched/changed, depending on your dataset operations.

2. Mapping Import/Export & Clear Confirmation

  • Verify that you can Export the current plan as a .json file.
  • Test the Import feature by selecting a .json file from your local machine. Verify that uploading a corrupt or invalid JSON file presents an invalid JSON error dialog.
  • Click Clear Mappings and ensure a confirmation dialog appears asking to verify erasing the mappings before proceeding.
  • Switch datasets to one without a mapping. Verify that the dialog now includes a button to Choose Existing Mapping.

3. Base Table Selection Dialog

  • Verify the dialog width/height scales properly and that it displays descriptions clarifying what a "base table" is.

4. SvgIcon Alignment in Firefox (Fixes #8155)

  • Verify that column/table status icons align correctly and do not shift out of place.

5. Express Search Dialog Shifting (Fixes #8014)

  • Verify the dialog does not shift layout when opened/closed.

Overall it looks really good! I didn't run into any major issues but I have a few questions.

  • When first looking at results after live validation it shows completely incorrect results and you have to close the dialog and open it again for the results to show correctly. Regular validation does appear correctly first time around so I am not too worried about it since a regular validation is recommended before uploading anyway; however, I figured it was still worth mentioning
06-08_12.47.mp4
  • If you import an invalid JSON file or edit the existing file to be invalid, there is no error, instead it just doesn't let you save when you press save.
06-08_12.01.mp4
  • Live validation says a row needs to be disambiguated but doesn't let you disambiguate
06-08_10.53.mp4
  • Live validation count disappears after it's been run once
Image
  • Results and the new records in upload dialog are in opposite orders, this doesn't necessarily matter, but it could be worth considering what way is the best way to display the new records.
Image
  • Should the import mapping dialog match other import dialogs? i.e. have the box where you can choose a file or drag it

    • Example when importing a WB data set
    Image
  • Lastly, when you import a mapping the columns are sometimes in the incorrect order from the file. I'm getting similar behavior in main so it isn't specific to this issue but I figured it was worth mentioning.

06-08_13.02.mp4

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Dev Attention Needed

3 participants