Rewrite help with clearer descriptions of ABSENT/PRESENT modes,
add two-case SVG showing both filtering directions with dual
output collections (filtered + discarded).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add nested collection explanation with examples showing both flat
list extraction (case A) and list:list mapped extraction (case B).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add examples, workflow use case, and a clean SVG schematic showing
a single dataset being duplicated into a list collection.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the 207KB Inkscape-generated build_list.svg with a 10KB
hand-coded SVG matching the style of the sample sheet tool diagrams.
Uses abstract labels (Dataset 1, Dataset A, etc.) for all three cases.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add "What is a sample sheet?" sections, concrete examples, and SVG
diagrams to both __CONVERT_SAMPLE_SHEET__ and __SAMPLE_SHEET_TO_TABULAR__
so newcomers understand what sample sheets are and when to use each tool.
Also adds the missing macros import to sample_sheet_to_tabular.xml.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fetchCollectionDetails now returns GalaxyApiResult instead of throwing,
which lets collectionElementsStore track errors as ApiError with HTTP
status codes. getCollectionById and getDetailedCollectionById now gate on
existing errors with retry logic for transient statuses (429, 5xx),
matching the pattern from keyedCache and historyStore. Updated all
callers of fetchCollectionDetails and loadHistoryById to handle the new
return types.
getHistoryById triggers loadHistoryById when a history is missing, but if
the fetch fails the error was thrown via rethrowSimple without being
tracked. The computed would re-trigger the fetch on every render, causing
an infinite request loop. Now getHistoryByIdFromServer returns a
GalaxyApiResult instead of throwing, loadHistoryById tracks errors in
historyLoadErrors, and getHistoryById gates on existing errors with retry
logic for transient HTTP status codes (429, 5xx).
create() now uses admin API to ensure user exists instead of
navigating to /user/create Mako form. login() establishes browser
session via PUT /api_internal/login using page.evaluate(fetch(...))
to share Playwright's cookie context.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
tool_shed/webapp/api/ is dead code — Phase 0 removed all route
registration. Zero imports reference the package. -1497 lines.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use configured tool_shed_url instead of deprecated web.url_for() which
returns a placeholder string in ASGI/FastAPI mode.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move RETRYABLE_STATUSES, MAX_RETRIES, and isRetryableApiError from
keyedCache.ts into simple-error.ts so they can be reused by other stores
that need the same retry logic. Also add GalaxyApiResult<T> discriminated
union type which makes API errors visible in function signatures instead
of relying on thrown exceptions.
When a dataset fetch fails permanently (e.g. 404 or 403), the view now
displays an error alert instead of spinning forever waiting for data that
will never arrive.
Switches the 12 cache-backed fetch handlers across 6 store/api files
from rethrowSimple to rethrowSimpleWithStatus so that the keyedCache
retry logic can distinguish retryable server errors from permanent
client errors. The cancelWorkflowScheduling handler (a DELETE, not a
cache handler) keeps using rethrowSimple.
When a useKeyedCache fetch handler fails, getItemById previously saw
undefined in storedItems and re-triggered the fetch in an infinite loop.
Now the cache checks loadingErrors before initiating a new fetch — non-
retryable errors (plain Error or 4xx ApiError) permanently block further
attempts, while retryable server errors (429, 5xx) allow up to 3 retries
before giving up.
Adds ApiError class and rethrowSimpleWithStatus helper to simple-error.ts
so fetch handlers can preserve HTTP status codes from API responses.
We weren't rendering markdown elements that required a `job_id` but instead of a job id in the arguments, had an `implicit_collection_jobs_id` (it's a collection step).
Now, the `hasValidObject` method in `client/src/components/Markdown/Utilities/requirements.ts` checks for this.
DataMetaFilter.filter_options() returned empty list when the referenced
dataset was missing or invalid, hiding all options. Now returns all
options (matching existing behavior when metadata is unset). Also
preserve other_values context in populate_model.py exception handlers.
Fixes#21904
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Initialize `parameters`, `template_macro_params`, `_macro_paths`, and
`ports` in `Tool.__init__` so they always exist as attributes. Update
`ToolParameterBundle` protocol to reflect that `parameters` may be
`None`. Replace defensive `hasattr`/`getattr` patterns with direct
attribute access and `None` comparisons.
Fixes https://github.com/galaxyproject/galaxy/issues/21843