Renames the somewhat ambiguous "members" property into "contacts", to
more clearly indicate the source/nature of the data within. (Avoid
confusion with "members of a group", which is contained in groups
instead.)
Also refactors the retrieving of appropriately-defaulted contact values
into a utility function.
We were passing in a contacts object, which may not always contain all
group members. We now pass in a groups object (set of ships) instead,
and derive contributor count from that.
Image should retain its own width if it's smaller than the bound, but
not go beyond them.
Height bounding wasn't being inherited properly through the "100%", so
we're moving the max-height into the embed itself instead.
(Making its container div always contain it rather than overflow also
prevents bleeding the preview down the page in case of sizing error.)
Specifically, this commit removes the add action from the contact-view
and replaces it with a listener within contact-hook for additions
to groups. This means that when a ship is added to a group that the
contact-hook is watching, the ship is automatically sent an invite to
join that "managed group" from the contacts application. This also
includes the UI integration work on the management screen and settings
screen for working with the new group / permission structure.
The only thing we care about is whether or not we have (any & all) data
about the submission. Using URL here is confusing because it conflates
with the prop, and checking the prop in the first place always gives the
same result.
Previously, receiving new items could "locally create" pages,
half-filled with whatever items were pushed down into them. Frontend
would see the existence of the page and assume all was well. However,
the page may have contained more items (on the backend) than just what
we pushed down.
This adds a per-page flag, "local", to indicate such pages. When display
logic sees it's set, it will send a request for the full page,
regardless of currently available data, loading in the canonical full
page as a result.