In order to place modal forms in other places on the page (so that forms
are not nested) it's necessary to move MultiStepModalForm links out of
the component. They just need to refer to the correct modal.
This PR also makes changes to ensure that the active modal is being
unset everywhere correctly when a modal is closed.
The link button to add a new application member to an app that did not
have any ("empty state") was not wired up. This:
- Moves the two steps of the new member modal into macros so that they
can be reused with different button/link types
- Wires the "invite a new team member" button on the application team
page
- Makes a minor CSS tweak so that icons nested under `.empty-state` in
the modal aren't enormous
- raise specific invitation type if invite not found in invitation domain classes
- more terse assignments of defaults in invitation service, smh
- terser margin expression for inline input fields
- sass formatting
- use translation for cancel link
- oxford comma for app team management permission explanation
- do not format environment roles with hyphens for role selection
- generalize some additional methods in the invitation domain base class
- use plain atst.models import path
- remove extra padding from second modal screen
- update modal styles to more closely match designs
- ad `user_name` property to application_role model to fix flash message
It will be enabled when the user checks the "manage environments"
permission. This updates the Jinja and Vue checkbox input components so
that Vue can monitor the inpur state.
The environment name will be grayed out until something besides the
default "no access" is selected.
Small changes to the application member subforms:
- filter for "None" as a string
- have nested forms inherit from FlaskForm; each nested form adds its
own validation error flash otherwise if there are validation problems