Media And Images: One Upload Dialog, Broken Images Fixed
Uploading images from the Media library and from a product page now uses the same dialog. The two were built separately and looked and worked differently — different drop areas, different copy, and one started uploading on drop while the other staged files behind an Upload button. They now share the same shape and per-file progress with the filename, and stay a consistent size whether the page already has images or not. The Media library dialog starts uploading as soon as files are dropped, and you can add a second batch before continuing on to link them to products. Freshly uploaded images no longer render as a broken placeholder — 271 images in production across seven companies had been stuck that way — because uploads now match up through the upload request that started them, so the client-side row and the server-side confirmation always land on the same image record. And under the Associated Products heading, the search box now names what you can search on and what happens when you pick a result, so it reads as the way to add an association instead of a filter over the ones already there.
Behind the scenes, image-upload webhooks now record activity through the same path as other actions, so duplicate deliveries no longer create duplicate rows, and image archive and bulk-upload actions show up in the activity feed. Archived timestamps record when the archive happened, so the value stays stable if the record is rebuilt. A few smaller cleanups landed alongside: unused arguments dropped off four of the five media actions that never read them, and a redundant ownership check that the caller already guaranteed came out.