Skip to content

feat(workbench): various UX improvements#8165

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

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

Conversation

@grantfitzsimmons
Copy link
Copy Markdown
Member

@grantfitzsimmons grantfitzsimmons commented Jun 4, 2026

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

Release Notes

  • New Features

    • Added icons to confirmation dialogs (warning, question, failure states)
    • Introduced "Choose existing plan" option for datasets without upload plans
    • Added record count details in upload dialogs
    • Implemented import/export mapping functionality
  • Improvements

    • Enhanced mapping interface with documentation link
    • Updated terminology to "Data Set Mapping" throughout
    • Improved dialog sizing and text alignment
    • Live validation now enabled by default
    • Refined success messages and localization across multiple languages

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
Copy link
Copy Markdown

coderabbitai Bot commented Jun 4, 2026

Review Change Stack

📝 Walkthrough

Walkthrough

This PR improves the WorkBench upload experience and fixes browser compatibility issues by adding new icons, refining dialog styling, enhancing the upload confirmation flow with record count breakdowns, introducing a plan selection feature, and updating terminology and localization strings across the interface.

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 SVG icon and updated dialogIcons mapping for warning, question, and failure states. Added dialog icon trigger CSS classes. Updated dialog container sizing to use extraWideContainer for consistent widths, addressing #8014.
SVG text vertical alignment fix for Firefox
specifyweb/frontend/js_src/lib/components/Molecules/SvgIcon.tsx
Replaced baseline-related SVG text attributes with dy=".35em" to correctly center icon text in both Firefox and Chrome, fixing the table icon misalignment reported in #8155.
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
Added explicit icon props to Dialog components for ABORTED (error), PARSED (question), and SUCCEEDED (success) states, plus rollback and upload confirmation 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 prop and render detailed breakdown sorted by result type; WbActions derives recordCounts from validation state and passes to component, addressing clearer record feedback in #8153.
Operation completed dialog with icon selection and result breakdown
specifyweb/frontend/js_src/lib/components/WbActions/index.tsx
Updated operationCompleted dialog to dynamically select success/error icons, added close button content, and conditionally render TableRecordCounts with per-result-type titles and sort order.
No-upload plan selection flow
specifyweb/frontend/js_src/lib/components/WbActions/WbNoUploadPlan.tsx
Introduced plan selection UI: LoadingContext-backed loading helper, isChoosingPlan state, TemplateSelection component, and async PUT request to update dataset uploadplan on selection with redirect to plan page.
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 new exported ClearMappings component wrapping ButtonWithConfirmation; moved clear-mappings logic from inline button to dedicated component with confirmation gating; updated validation button styling when mappingsAreValidated is true.
Documentation link in mapper control panel
specifyweb/frontend/js_src/lib/components/WbPlanView/MapperComponents.tsx
Added Link.NewTab for workbench documentation URL in MappingsControlPanel toolbar with localized documentation label.
Base table selection dialog UI improvements
specifyweb/frontend/js_src/lib/components/WbPlanView/State.tsx
Exported TemplateSelection function; updated BaseTableSelection dialog sizing to normalContainer with !w-1/3 and max-h-[90%]; added conditional descriptive paragraph for attachments vs. non-attachments base tables.
Raw upload plan JSON import with validation
specifyweb/frontend/js_src/lib/components/WbToolkit/DevShowPlan.tsx
Enhanced with JSON file import capability: file input ref, handleFileSelected parser with validation, invalidJson dialog state, and import/export buttons; updated dialog text to import/export mapping terminology.
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 DataSetMeta and DataSetName to use wbText.metadata(); updated RecordSet to use wbText.saveAsRecordSet; exported TableResults function; changed liveValidation default to true; updated error message terminology 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 new mapping-related strings (importExportMapping, clearMappings, baseTableDescription, invalidJsonFile); changed "Upload Plan" to "Data Set Mapping" terminology throughout user-facing messages; refined translations for upload/validation/rollback/status across multiple locales; updated batch edit success message wording.

Suggested reviewers

  • emenslin
  • CarolineDenis
  • bhumikaguptaa
  • Iwantexpresso
  • lexiclevenger
🚥 Pre-merge checks | ✅ 5 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Testing Instructions ⚠️ Warning No testing instructions found in the PR. The PR objectives claim to include testing instructions, but none exist in documentation, code comments, or the PR template section. Add testing instructions to the PR (via PR description or new doc) covering: upload dialog messaging/icons, Firefox icon alignment, Express Search dialog width consistency, and mapping behavior wording changes.
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: UX improvements across WorkBench components including dialogs, icons, validation, and mappings.
Linked Issues check ✅ Passed All linked issues are addressed: #8153 (upload dialog UX with record counts and clear completion status), #8155 (Firefox icon alignment via dy attribute), #8014 (express search dialog width fix), #4484 (matching behavior wording updates).
Out of Scope Changes check ✅ Passed All changes are within scope of the linked issues. Terminology updates, record counts display, import/export mapping, dialog improvements, icon fixes, and localization updates all directly support the stated objectives.
Automatic Tests ✅ Passed PR contains primarily UI/styling/localization changes where automatic unit tests are not necessary by standard practice. Existing auto-iterating icon test covers new xCircle icon.

✏️ 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
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

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
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

1 participant