From 926f89d97585f806006b9ca0d175f4316090904c Mon Sep 17 00:00:00 2001 From: dandds Date: Wed, 1 May 2019 13:33:04 -0400 Subject: [PATCH 01/14] Form for application team member table. Nested form for each member, with child forms for environment roles and permissions. --- atst/forms/team.py | 51 +++++++++++++++++++++++++++ tests/forms/__init__.py | 0 tests/forms/test_team.py | 26 ++++++++++++++ tests/routes/applications/__init__.py | 0 4 files changed, 77 insertions(+) create mode 100644 atst/forms/team.py create mode 100644 tests/forms/__init__.py create mode 100644 tests/forms/test_team.py create mode 100644 tests/routes/applications/__init__.py diff --git a/atst/forms/team.py b/atst/forms/team.py new file mode 100644 index 00000000..ccc49e35 --- /dev/null +++ b/atst/forms/team.py @@ -0,0 +1,51 @@ +from flask_wtf import FlaskForm +from wtforms.fields import FormField, FieldList, HiddenField + +from .application_member import EnvironmentForm +from .forms import BaseForm +from atst.forms.fields import SelectField +from atst.domain.permission_sets import PermissionSets +from atst.utils.localization import translate + + +class PermissionsForm(FlaskForm): + perms_env_mgmt = SelectField( + translate("portfolios.applications.members.new.manage_envs"), + choices=[ + (None, "View only"), + (PermissionSets.EDIT_APPLICATION_ENVIRONMENTS, "Edit access"), + ], + filters=[BaseForm.remove_empty_string], + ) + perms_team_mgmt = SelectField( + translate("portfolios.applications.members.new.manage_team"), + choices=[ + (None, "View only"), + (PermissionSets.EDIT_APPLICATION_TEAM, "Edit access"), + ], + filters=[BaseForm.remove_empty_string], + ) + perms_del_env = SelectField( + choices=[(None, "No"), (PermissionSets.DELETE_APPLICATION_ENVIRONMENTS, "Yes")], + filters=[BaseForm.remove_empty_string], + ) + + @property + def data(self): + _data = super().data + permission_sets = [] + for field in _data: + if _data[field] is not None: + permission_sets.append(_data[field]) + + return permission_sets + + +class MemberForm(FlaskForm): + user_id = HiddenField() + environment_roles = FieldList(FormField(EnvironmentForm)) + permission_sets = FormField(PermissionsForm) + + +class TeamForm(BaseForm): + members = FieldList(FormField(MemberForm)) diff --git a/tests/forms/__init__.py b/tests/forms/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/forms/test_team.py b/tests/forms/test_team.py new file mode 100644 index 00000000..671a44ee --- /dev/null +++ b/tests/forms/test_team.py @@ -0,0 +1,26 @@ +from wtforms.validators import ValidationError +import pytest + +from atst.domain.permission_sets import PermissionSets +from atst.forms.team import * + + +def test_permissions_form_permission_sets(): + form_data = { + "perms_env_mgmt": "", + "perms_team_mgmt": PermissionSets.EDIT_APPLICATION_TEAM, + "perms_del_env": "", + } + form = PermissionsForm(data=form_data) + assert form.validate() + assert form.data == [PermissionSets.EDIT_APPLICATION_TEAM] + + +def test_permissions_form_invalid(): + form_data = { + "perms_env_mgmt": "not a real choice", + "perms_team_mgmt": PermissionSets.EDIT_APPLICATION_TEAM, + "perms_del_env": "", + } + form = PermissionsForm(data=form_data) + assert not form.validate() diff --git a/tests/routes/applications/__init__.py b/tests/routes/applications/__init__.py new file mode 100644 index 00000000..e69de29b From 0da0f6a0ae39d8f80b33b1ed5c987140768766b0 Mon Sep 17 00:00:00 2001 From: dandds Date: Wed, 1 May 2019 15:30:42 -0400 Subject: [PATCH 02/14] WIP: use team form for application team page --- atst/domain/environment_roles.py | 14 ++++- atst/forms/team.py | 3 +- atst/models/application.py | 1 + atst/routes/applications/team.py | 43 +++++++++++++-- .../add_new_application_member.html | 20 +++---- .../applications/read_only_team.html | 46 ++++++++++++++++ templates/portfolios/applications/team.html | 52 +++---------------- tests/domain/test_environment_roles.py | 16 ++++++ 8 files changed, 134 insertions(+), 61 deletions(-) create mode 100644 templates/fragments/applications/read_only_team.html create mode 100644 tests/domain/test_environment_roles.py diff --git a/atst/domain/environment_roles.py b/atst/domain/environment_roles.py index 99728467..bb8fdb85 100644 --- a/atst/domain/environment_roles.py +++ b/atst/domain/environment_roles.py @@ -1,7 +1,7 @@ from flask import current_app as app from atst.database import db -from atst.models import EnvironmentRole +from atst.models import EnvironmentRole, Application, Environment class EnvironmentRoles(object): @@ -35,3 +35,15 @@ class EnvironmentRoles(object): return True else: return False + + @classmethod + def get_for_application_and_user(cls, user_id, application_id): + return ( + db.session.query(EnvironmentRole) + .join(Environment) + .join(Application, Environment.application_id == Application.id) + .filter(EnvironmentRole.user_id == user_id) + .filter(Application.id == application_id) + .filter(EnvironmentRole.environment_id == Environment.id) + .all() + ) diff --git a/atst/forms/team.py b/atst/forms/team.py index ccc49e35..f9661f72 100644 --- a/atst/forms/team.py +++ b/atst/forms/team.py @@ -1,5 +1,5 @@ from flask_wtf import FlaskForm -from wtforms.fields import FormField, FieldList, HiddenField +from wtforms.fields import FormField, FieldList, HiddenField, StringField from .application_member import EnvironmentForm from .forms import BaseForm @@ -43,6 +43,7 @@ class PermissionsForm(FlaskForm): class MemberForm(FlaskForm): user_id = HiddenField() + user_name = StringField() environment_roles = FieldList(FormField(EnvironmentForm)) permission_sets = FormField(PermissionsForm) diff --git a/atst/models/application.py b/atst/models/application.py index 9edb5166..ef783ff6 100644 --- a/atst/models/application.py +++ b/atst/models/application.py @@ -28,6 +28,7 @@ class Application( back_populates="application", primaryjoin="and_(Environment.application_id==Application.id, Environment.deleted==False)", ) + # TODO: filter condition on this relationship? roles = relationship("ApplicationRole") @property diff --git a/atst/routes/applications/team.py b/atst/routes/applications/team.py index 57994a3c..8bee43ec 100644 --- a/atst/routes/applications/team.py +++ b/atst/routes/applications/team.py @@ -2,12 +2,14 @@ from flask import render_template, request as http_request, g, url_for, redirect from . import applications_bp -from atst.domain.environments import Environments from atst.domain.applications import Applications +from atst.domain.environments import Environments +from atst.domain.environment_roles import EnvironmentRoles from atst.domain.authz.decorator import user_can_access_decorator as user_can from atst.domain.permission_sets import PermissionSets from atst.domain.exceptions import AlreadyExistsError from atst.forms.application_member import NewForm as NewMemberForm +from atst.forms.team import TeamForm from atst.models import Permissions from atst.services.invitation import Invitation as InvitationService from atst.utils.flash import formatted_flash as flash @@ -27,8 +29,10 @@ def team(application_id): application = Applications.get(resource_id=application_id) environment_users = {} + team_data = [] for member in application.members: user_id = member.user.id + user_name = member.user.full_name environment_users[user_id] = { "permissions": { "delete_access": permission_str( @@ -45,18 +49,51 @@ def team(application_id): user=member.user, application=application ), } + permission_sets = { + "perms_env_mgmt": PermissionSets.EDIT_APPLICATION_ENVIRONMENTS + if member.has_permission_set(PermissionSets.EDIT_APPLICATION_ENVIRONMENTS) + else "", + "perms_team_mgmt": PermissionSets.EDIT_APPLICATION_TEAM + if member.has_permission_set(PermissionSets.EDIT_APPLICATION_TEAM) + else "", + "perms_del_env": PermissionSets.DELETE_APPLICATION_ENVIRONMENTS + if member.has_permission_set(PermissionSets.DELETE_APPLICATION_ENVIRONMENTS) + else "", + } + roles = EnvironmentRoles.get_for_application_and_user( + member.user.id, application.id + ) + environment_roles = [ + { + "environment_id": str(role.environment.id), + "environment_name": role.environment.name, + "role": role.role, + } + for role in roles + ] + team_data.append( + { + "user_id": str(user_id), + "user_name": user_name, + "permission_sets": permission_sets, + "environment_roles": environment_roles, + } + ) + + team_form = TeamForm(data={"members": team_data}) env_roles = [ {"environment_id": e.id, "environment_name": e.name} for e in application.environments ] - member_form = NewMemberForm(data={"environment_roles": env_roles}) + new_member_form = NewMemberForm(data={"environment_roles": env_roles}) return render_template( "portfolios/applications/team.html", application=application, environment_users=environment_users, - member_form=member_form, + team_form=team_form, + new_member_form=new_member_form, ) diff --git a/templates/fragments/applications/add_new_application_member.html b/templates/fragments/applications/add_new_application_member.html index 99f8f99a..3294b21c 100644 --- a/templates/fragments/applications/add_new_application_member.html +++ b/templates/fragments/applications/add_new_application_member.html @@ -9,23 +9,23 @@
- {{ TextInput(member_form.user_data.first_name, validation='requiredField') }} + {{ TextInput(new_member_form.user_data.first_name, validation='requiredField') }}
- {{ TextInput(member_form.user_data.last_name, validation='requiredField') }} + {{ TextInput(new_member_form.user_data.last_name, validation='requiredField') }}
- {{ TextInput(member_form.user_data.email, validation='email') }} + {{ TextInput(new_member_form.user_data.email, validation='email') }}
- {{ TextInput(member_form.user_data.phone_number, validation='usPhone', optional=True) }} + {{ TextInput(new_member_form.user_data.phone_number, validation='usPhone', optional=True) }}
- {{ TextInput(member_form.user_data.dod_id, validation='dodId') }} + {{ TextInput(new_member_form.user_data.dod_id, validation='dodId') }}
@@ -61,7 +61,7 @@
- {% for environment_data in member_form.environment_roles %} + {% for environment_data in new_member_form.environment_roles %} @@ -86,9 +86,9 @@ {% endfor %}

{{ "portfolios.applications.members.new.manage_perms" | translate({"application_name": application.name}) }}

- {{ CheckboxInput(member_form.permission_sets.perms_team_mgmt, classes="input__inline-fields") }} - {% call CheckboxInput(member_form.permission_sets.perms_env_mgmt, classes="input__inline-fields") %} - {% set field=member_form.permission_sets.perms_del_env %} + {{ CheckboxInput(new_member_form.permission_sets.perms_team_mgmt, classes="input__inline-fields") }} + {% call CheckboxInput(new_member_form.permission_sets.perms_env_mgmt, classes="input__inline-fields") %} + {% set field=new_member_form.permission_sets.perms_del_env %} {{ value }} + {% endmacro %} + + +
  • +
    +
    {{ user.full_name }}
    + {{ PermissionField(user_permissions["delete_access"]) }} + {{ PermissionField(user_permissions["environment_management"]) }} + {{ PermissionField(user_permissions["team_management"]) }} + +
    + {% call ToggleSection(section_name="environments") %} +
      + {% for environment in user_info["environments"] %} +
    • + {{ environment.name }} +
    • + {% endfor %} +
    + {% endcall %} +
  • +
    +{% endfor %} diff --git a/templates/portfolios/applications/team.html b/templates/portfolios/applications/team.html index e02a5459..c5e94b0a 100644 --- a/templates/portfolios/applications/team.html +++ b/templates/portfolios/applications/team.html @@ -61,52 +61,12 @@
      - {% for member in application.members %} - {% set user = member.user %} - {% set user_info = environment_users[user.id] %} - {% set user_permissions = user_info["permissions"] %} - - {% macro PermissionField(value) %} -
      {{ value }}
      - {% endmacro %} - - -
    • -
      -
      {{ user.full_name }}
      - {{ PermissionField(user_permissions["delete_access"]) }} - {{ PermissionField(user_permissions["environment_management"]) }} - {{ PermissionField(user_permissions["team_management"]) }} - -
      - {% call ToggleSection(section_name="environments") %} -
        - {% for environment in user_info["environments"] %} -
      • - {{ environment.name }} -
      • - {% endfor %} -
      - {% endcall %} -
    • -
      - {% endfor %} + {% if user_can(permissions.EDIT_APPLICATION_MEMBER) %} + {# edit version goes here #} + {% include "fragments/applications/read_only_team.html" %} + {% elif user_can(permissions.VIEW_APPLICATION_MEMBER) %} + {% include "fragments/applications/read_only_team.html" %} + {% endif %}
    diff --git a/tests/domain/test_environment_roles.py b/tests/domain/test_environment_roles.py new file mode 100644 index 00000000..de42d70e --- /dev/null +++ b/tests/domain/test_environment_roles.py @@ -0,0 +1,16 @@ +from atst.domain.environment_roles import EnvironmentRoles + +from tests.factories import * + + +def test_get_for_application_and_user(): + user = UserFactory.create() + application = ApplicationFactory.create() + env1 = EnvironmentFactory.create(application=application) + EnvironmentFactory.create(application=application) + EnvironmentRoleFactory.create(user=user, environment=env1) + + roles = EnvironmentRoles.get_for_application_and_user(user.id, application.id) + assert len(roles) == 1 + assert roles[0].environment == env1 + assert roles[0].user == user From c1ae5129bc3f015989c2ddd65cda95035a3afb24 Mon Sep 17 00:00:00 2001 From: Montana Date: Wed, 1 May 2019 16:20:53 -0400 Subject: [PATCH 03/14] Add edit template with dropdown selectors --- js/components/toggler.js | 2 + styles/components/_accordion_table.scss | 9 ++++ .../fragments/applications/edit_team.html | 43 ++++++++++++++++ .../applications/read_only_team.html | 50 +++++++++---------- templates/portfolios/applications/team.html | 3 +- 5 files changed, 80 insertions(+), 27 deletions(-) create mode 100644 templates/fragments/applications/edit_team.html diff --git a/js/components/toggler.js b/js/components/toggler.js index 39eca87f..583dec53 100644 --- a/js/components/toggler.js +++ b/js/components/toggler.js @@ -1,5 +1,6 @@ import FormMixin from '../mixins/form' import textinput from './text_input' +import optionsinput from './options_input' export default { name: 'toggler', @@ -8,6 +9,7 @@ export default { components: { textinput, + optionsinput, }, data: function() { diff --git a/styles/components/_accordion_table.scss b/styles/components/_accordion_table.scss index e9060bc5..28cd08de 100644 --- a/styles/components/_accordion_table.scss +++ b/styles/components/_accordion_table.scss @@ -39,6 +39,15 @@ .accordion-table__item-content { padding: ($gap * 2); + + .usa-input { + margin: 0; + } + + select { + border: none; + font-weight: $font-normal; + } } .accordion-table__items { diff --git a/templates/fragments/applications/edit_team.html b/templates/fragments/applications/edit_team.html new file mode 100644 index 00000000..d034ec6a --- /dev/null +++ b/templates/fragments/applications/edit_team.html @@ -0,0 +1,43 @@ +{% from "components/options_input.html" import OptionsInput %} + +{% for member_form in team_form.members %} + {% set environment_roles_form = member_form.environment_roles %} + {% set permissions_form = member_form.permission_sets %} + + +
  • +
    +
    {{ member_form.user_name.data }}
    +
    {{ OptionsInput(permissions_form.perms_team_mgmt, label=False) }}
    +
    {{ OptionsInput(permissions_form.perms_env_mgmt, label=False) }}
    +
    {{ OptionsInput(permissions_form.perms_del_env, label=False) }}
    + +
    + {% call ToggleSection(section_name="environments") %} +
      + {% for environment_form in environment_roles_form %} +
    • + {{ environment_form.environment_name.data }} +
    • + {% endfor %} +
    + {% endcall %} +
  • +
    +{% endfor %} diff --git a/templates/fragments/applications/read_only_team.html b/templates/fragments/applications/read_only_team.html index 41a793c4..2adf1694 100644 --- a/templates/fragments/applications/read_only_team.html +++ b/templates/fragments/applications/read_only_team.html @@ -3,34 +3,34 @@ {% set user_info = environment_users[user.id] %} {% set user_permissions = user_info["permissions"] %} - {% macro PermissionField(value) %} -
    {{ value }}
    - {% endmacro %} + {% macro PermissionField(value) %} +
    {{ value }}
    + {% endmacro %} - -
  • -
    -
    {{ user.full_name }}
    - {{ PermissionField(user_permissions["delete_access"]) }} - {{ PermissionField(user_permissions["environment_management"]) }} - {{ PermissionField(user_permissions["team_management"]) }} -
  • +
    +
    {{ user.full_name }}
    + {{ PermissionField(user_permissions["delete_access"]) }} + {{ PermissionField(user_permissions["environment_management"]) }} + {{ PermissionField(user_permissions["team_management"]) }} + + {{ + ToggleButton( + open_html=open_html, + close_html=close_html, + section_name="environments" + ) + }} +
    {% call ToggleSection(section_name="environments") %}
      diff --git a/templates/portfolios/applications/team.html b/templates/portfolios/applications/team.html index c5e94b0a..9449ff6d 100644 --- a/templates/portfolios/applications/team.html +++ b/templates/portfolios/applications/team.html @@ -62,8 +62,7 @@
        {% if user_can(permissions.EDIT_APPLICATION_MEMBER) %} - {# edit version goes here #} - {% include "fragments/applications/read_only_team.html" %} + {% include "fragments/applications/edit_team.html" %} {% elif user_can(permissions.VIEW_APPLICATION_MEMBER) %} {% include "fragments/applications/read_only_team.html" %} {% endif %} From 56920888372e2c2bba27b886812542ab498c7cdf Mon Sep 17 00:00:00 2001 From: Montana Date: Wed, 1 May 2019 16:37:37 -0400 Subject: [PATCH 04/14] Add Save Button to edit version of team table -adds base form component -Save button does not function properly yet -alphabetizes imports on base-form --- js/components/forms/base_form.js | 24 +++--- templates/portfolios/applications/team.html | 94 +++++++++++---------- 2 files changed, 63 insertions(+), 55 deletions(-) diff --git a/js/components/forms/base_form.js b/js/components/forms/base_form.js index 535a098d..a7259eae 100644 --- a/js/components/forms/base_form.js +++ b/js/components/forms/base_form.js @@ -1,26 +1,28 @@ import ally from 'ally.js' -import FormMixin from '../../mixins/form' -import textinput from '../text_input' -import optionsinput from '../options_input' -import DateSelector from '../date_selector' -import MultiStepModalForm from './multi_step_modal_form' -import multicheckboxinput from '../multi_checkbox_input' import checkboxinput from '../checkbox_input' +import DateSelector from '../date_selector' +import FormMixin from '../../mixins/form' import levelofwarrant from '../levelofwarrant' import Modal from '../../mixins/modal' +import multicheckboxinput from '../multi_checkbox_input' +import MultiStepModalForm from './multi_step_modal_form' +import optionsinput from '../options_input' +import textinput from '../text_input' +import toggler from '../toggler' export default { name: 'base-form', components: { - textinput, - optionsinput, - DateSelector, - MultiStepModalForm, - multicheckboxinput, checkboxinput, + DateSelector, levelofwarrant, Modal, + multicheckboxinput, + MultiStepModalForm, + optionsinput, + textinput, + toggler, }, mixins: [FormMixin], } diff --git a/templates/portfolios/applications/team.html b/templates/portfolios/applications/team.html index 9449ff6d..992ef782 100644 --- a/templates/portfolios/applications/team.html +++ b/templates/portfolios/applications/team.html @@ -2,6 +2,7 @@ {% from "components/empty_state.html" import EmptyState %} {% from "components/icon.html" import Icon %} +{% from 'components/save_button.html' import SaveButton %} {% from "components/toggle_list.html" import ToggleButton, ToggleSection %} {% set secondary_breadcrumb = 'portfolios.applications.team_settings.title' | translate({ "application_name": application.name }) %} @@ -24,60 +25,65 @@
        -
        - {% if g.matchesPath("application-members") %} - {% include "fragments/flash.html" %} - {% endif %} -
        -
        -
        -
        - {{ "portfolios.applications.team_settings.section.title" | translate({ "application_name": application.name }) }} + +
        + {% if g.matchesPath("application-members") %} + {% include "fragments/flash.html" %} + {% endif %} +
        +
        +
        +
        + {{ "portfolios.applications.team_settings.section.title" | translate({ "application_name": application.name }) }} +
        + + {{ Icon('info') }} + {{ "portfolios.admin.settings_info" | translate }} + +
        +
        + +
        +
        +
        + {{ "common.name" | translate }} +
        +
        + {{ "portfolios.applications.team_settings.section.table.delete_access" | translate }} +
        +
        + {{ "portfolios.applications.team_settings.section.table.environment_management" | translate }} +
        +
        + {{ "portfolios.applications.team_settings.section.table.team_management" | translate }} +
        +
        +  
        - - {{ Icon('info') }} - {{ "portfolios.admin.settings_info" | translate }} - +
          + {% if user_can(permissions.EDIT_APPLICATION_MEMBER) %} + {% include "fragments/applications/edit_team.html" %} + {% elif user_can(permissions.VIEW_APPLICATION_MEMBER) %} + {% include "fragments/applications/read_only_team.html" %} + {% endif %} +
        -
        -
        -
        -
        - {{ "common.name" | translate }} -
        -
        - {{ "portfolios.applications.team_settings.section.table.delete_access" | translate }} -
        -
        - {{ "portfolios.applications.team_settings.section.table.environment_management" | translate }} -
        -
        - {{ "portfolios.applications.team_settings.section.table.team_management" | translate }} -
        -
        -   -
        -
        -
          - {% if user_can(permissions.EDIT_APPLICATION_MEMBER) %} - {% include "fragments/applications/edit_team.html" %} - {% elif user_can(permissions.VIEW_APPLICATION_MEMBER) %} - {% include "fragments/applications/read_only_team.html" %} - {% endif %} -
        -
        - - + +
        +
        {% endif %} {% endblock %} From 416ea1de82bd5f2069b7e9d9add345359ccb074a Mon Sep 17 00:00:00 2001 From: Montana Date: Wed, 1 May 2019 17:22:32 -0400 Subject: [PATCH 05/14] Watch for changes on the options input, which is a grandchild of base-form --- js/components/options_input.js | 8 ++++++++ js/components/toggler.js | 2 +- js/mixins/form.js | 3 +-- styles/elements/_tables.scss | 1 + templates/components/options_input.html | 3 ++- templates/fragments/applications/edit_team.html | 6 +++--- templates/portfolios/applications/team.html | 4 ++-- 7 files changed, 18 insertions(+), 9 deletions(-) diff --git a/js/components/options_input.js b/js/components/options_input.js index fa4d8a57..2970b135 100644 --- a/js/components/options_input.js +++ b/js/components/options_input.js @@ -1,8 +1,11 @@ import { emitEvent } from '../lib/emitters' +import FormMixin from '../mixins/form' export default { name: 'optionsinput', + mixins: [FormMixin], + props: { name: String, initialErrors: { @@ -10,6 +13,10 @@ export default { default: () => [], }, initialValue: String, + watch: { + type: Boolean, + default: false, + }, }, data: function() { @@ -27,6 +34,7 @@ export default { emitEvent('field-change', this, { value: e.target.value, name: this.name, + watch: this.watch, }) this.showError = false this.showValid = true diff --git a/js/components/toggler.js b/js/components/toggler.js index 583dec53..f1c34c96 100644 --- a/js/components/toggler.js +++ b/js/components/toggler.js @@ -1,6 +1,6 @@ import FormMixin from '../mixins/form' -import textinput from './text_input' import optionsinput from './options_input' +import textinput from './text_input' export default { name: 'toggler', diff --git a/js/mixins/form.js b/js/mixins/form.js index 497497b1..f8e97f4d 100644 --- a/js/mixins/form.js +++ b/js/mixins/form.js @@ -16,8 +16,7 @@ export default { const { name, valid, parent_uid } = event if (typeof this[name] !== undefined) { this.fields[name] = valid - - if (parent_uid === this._uid) { + if (event['parent_uid'] === this._uid || event['watch']) { this.changed = true } } diff --git a/styles/elements/_tables.scss b/styles/elements/_tables.scss index 5ad64929..b18b1884 100644 --- a/styles/elements/_tables.scss +++ b/styles/elements/_tables.scss @@ -126,6 +126,7 @@ table { @include h4; font-size: $lead-font-size; + justify-content: space-between; flex: 2; } } diff --git a/templates/components/options_input.html b/templates/components/options_input.html index ff8af362..81a1e50c 100644 --- a/templates/components/options_input.html +++ b/templates/components/options_input.html @@ -1,13 +1,14 @@ {% from "components/icon.html" import Icon %} {% from "components/tooltip.html" import Tooltip %} -{% macro OptionsInput(field, tooltip, inline=False, label=True, disabled=False) -%} +{% macro OptionsInput(field, tooltip, inline=False, label=True, disabled=False, watch=False) -%}
        diff --git a/templates/fragments/applications/edit_team.html b/templates/fragments/applications/edit_team.html index d034ec6a..094ccf40 100644 --- a/templates/fragments/applications/edit_team.html +++ b/templates/fragments/applications/edit_team.html @@ -8,9 +8,9 @@
      • {{ member_form.user_name.data }}
        -
        {{ OptionsInput(permissions_form.perms_team_mgmt, label=False) }}
        -
        {{ OptionsInput(permissions_form.perms_env_mgmt, label=False) }}
        -
        {{ OptionsInput(permissions_form.perms_del_env, label=False) }}
        +
        {{ OptionsInput(permissions_form.perms_team_mgmt, label=False, watch=True) }}
        +
        {{ OptionsInput(permissions_form.perms_env_mgmt, label=False, watch=True) }}
        +
        {{ OptionsInput(permissions_form.perms_del_env, label=False, watch=True) }}
      • + + {% endfor %} diff --git a/templates/portfolios/applications/team.html b/templates/portfolios/applications/team.html index f6df4f25..b80b070f 100644 --- a/templates/portfolios/applications/team.html +++ b/templates/portfolios/applications/team.html @@ -73,7 +73,7 @@