From b00210a92cd9b2944320963aaef6c3d4e421ccaf Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Wed, 9 Jan 2019 16:24:51 -0500 Subject: [PATCH 1/7] Update app_info section of form --- atst/forms/data.py | 15 ++++++---- atst/forms/task_order.py | 35 +++++++++++----------- atst/routes/task_orders/new.py | 3 +- templates/task_orders/_new.html | 1 + templates/task_orders/new/app_info.html | 18 +++++------- translations.yaml | 39 +++++++++++++++++++++++++ 6 files changed, 77 insertions(+), 34 deletions(-) diff --git a/atst/forms/data.py b/atst/forms/data.py index 957dd911..1db4a893 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -176,9 +176,13 @@ FUNDING_TYPES = [ TASK_ORDER_SOURCES = [("MANUAL", "Manual"), ("EDA", "EDA")] APP_MIGRATION = [ - ("on_premise", "Yes, migrating from an on-premise data center"), - ("cloud", "Yes, migrating from another cloud provider "), - ("none", "Not planning to migrate any applications "), + ("on_premise", "Yes, migrating from an on-premise data center"), + ("cloud", "Yes, migrating from another cloud provider"), + ( + "both", + "Yes, migrating from an on-premise data center and another cloud provider", + ), + ("none", "Not planning to migrate any applications"), ("not_sure", "Not Sure"), ] @@ -193,11 +197,10 @@ PROJECT_COMPLEXITY = [ ] DEV_TEAM = [ - ("government", "Government"), - ("civilians", "Civilians"), + ("government_civilians", "Government Civilians"), ("military", "Military "), ("contractor", "Contractor "), - ("other", "Other"), + ("other", "Other (E.g. University or other partner)"), ] TEAM_EXPERIENCE = [ diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index 5c062ae6..6e9d9ab9 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -21,52 +21,53 @@ from .data import ( DEV_TEAM, TEAM_EXPERIENCE, ) +from atst.utils.localization import translate class AppInfoForm(CacheableForm): portfolio_name = StringField( - "Organization Portfolio Name", - description="The name of your office or organization. You can add multiple applications to your portfolio. Your task orders are used to pay for these applications and their environments", + translate("forms.task_order.portfolio_name_label"), + description=translate("forms.task_order.portfolio_name_description"), ) scope = TextAreaField( - "Cloud Project Scope", - description="Your team's plan for using the cloud, such as migrating an existing application or creating a prototype.", + translate("forms.task_order.scope_label"), + description=translate("forms.task_order.scope_description"), ) defense_component = SelectField( - "Department of Defense Component", choices=SERVICE_BRANCHES + translate("forms.task_order.defense_component_label"), choices=SERVICE_BRANCHES ) app_migration = RadioField( - "App Migration", - description="Do you plan to migrate existing application(s) to the cloud?", + translate("forms.task_order.app_migration_label"), + description=translate("forms.task_order.app_migration_description"), choices=APP_MIGRATION, default="", ) native_apps = RadioField( - "Native Apps", - description="Do you plan to develop application(s) natively in the cloud? ", + translate("forms.task_order.native_apps_label"), + description=translate("forms.task_order.native_apps_description"), choices=[("yes", "Yes"), ("no", "No"), ("not_sure", "Not Sure")], ) complexity = SelectMultipleField( - "Project Complexity", - description="Which of these describes how complex your team's use of the cloud will be? (Select all that apply.)", + translate("forms.task_order.complexity_label"), + description=translate("forms.task_order.complexity_description"), choices=PROJECT_COMPLEXITY, default="", widget=ListWidget(prefix_label=False), option_widget=CheckboxInput(), ) - complexity_other = StringField("Project Complexity Other") + complexity_other = StringField(translate("forms.task_order.complexity_other_label")) dev_team = SelectMultipleField( - "Development Team", - description="Which people or teams will be completing the development work for your cloud applications?", + translate("forms.task_order.dev_team_label"), + description=translate("forms.task_order.dev_team_description"), choices=DEV_TEAM, default="", widget=ListWidget(prefix_label=False), option_widget=CheckboxInput(), ) - dev_team_other = StringField("Development Team Other") + dev_team_other = StringField(translate("forms.task_order.dev_team_other_label")) team_experience = RadioField( - "Team Experience", - description="How much experience does your team have with development in the cloud?", + translate("forms.task_order.team_experience_label"), + description=translate("forms.task_order.team_experience_description"), choices=TEAM_EXPERIENCE, default="", ) diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index 266bcf57..9b33c088 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -15,12 +15,13 @@ from atst.domain.workspaces import Workspaces from atst.domain.workspace_roles import WorkspaceRoles import atst.forms.task_order as task_order_form from atst.services.invitation import Invitation as InvitationService +from atst.utils.localization import translate TASK_ORDER_SECTIONS = [ { "section": "app_info", - "title": "What You're Building", + "title": "What You're Making", "template": "task_orders/new/app_info.html", "form": task_order_form.AppInfoForm, }, diff --git a/templates/task_orders/_new.html b/templates/task_orders/_new.html index 1f406b7f..ec860310 100644 --- a/templates/task_orders/_new.html +++ b/templates/task_orders/_new.html @@ -38,6 +38,7 @@
+
{% endblock %} diff --git a/templates/task_orders/new/app_info.html b/templates/task_orders/new/app_info.html index 9e01a1fc..e32b69f6 100644 --- a/templates/task_orders/new/app_info.html +++ b/templates/task_orders/new/app_info.html @@ -6,42 +6,40 @@ {% from "components/multi_checkbox_input.html" import MultiCheckboxInput %} {% block heading %} - What You're Building + {{ "task_orders.new.app_info.section_title"| translate }} {% endblock %} {% block form %} -

Basic Information

+

{{ "task_orders.new.app_info.basic_info_title"| translate }}

{{ TextInput(form.portfolio_name, placeholder="The name of your office or organization") }} {{ TextInput(form.scope, paragraph=True) }}

- Not sure how to describe your scope? Read some Sample Scopes to - get an idea of what is appropriate. + {{ "task_orders.new.app_info.sample_scope" | translate | safe }}

+ {{ OptionsInput(form.defense_component) }}
-

About Your Project

+

{{ "task_orders.new.app_info.project_title" | translate }}

{{ OptionsInput(form.app_migration) }} {{ OptionsInput(form.native_apps) }} {{ MultiCheckboxInput(form.complexity, form.complexity_other) }}
-

About Your Team

+

{{ "task_orders.new.app_info.team_title" | translate }}

{{ MultiCheckboxInput(form.dev_team, form.dev_team_other) }} {{ OptionsInput(form.team_experience) }}
-

Market Research

+

{{ "task_orders.new.app_info.market_research_title" | translate }}

-The JEDI Cloud Computing Program Office (CCPO) has completed the market -research requirement for all related task orders. The Department of Defense CIO -has approved this research. View JEDI Cloud Market Research +{{ "task_orders.new.app_info.market_research_paragraph" | translate | safe }}

diff --git a/translations.yaml b/translations.yaml index 61859980..88cd0186 100644 --- a/translations.yaml +++ b/translations.yaml @@ -1,3 +1,13 @@ +# How to use text containing html tags in .html files: + # In the template add the `safe` filter when referencing the string + # from the template file. ie: + + # login: + # title: A title with a link! + + # `{{ "login.title" | translate | safe }}` + + audit_log: events: default: @@ -153,6 +163,24 @@ forms: environment_names_required_validation_message: Provide at least one environment name. environment_names_unique_validation_message: Environment names must be unique. name_label: Project Name + task_order: + portfolio_name_label: Organization Portfolio Name + portfolio_name_description: The name of your office or organization. You can add multiple applications to your portfolio. Your task orders are used to pay for these applications and their environments. + scope_label: Cloud Project Scope + scope_description: Your team's plan for using the cloud, such as migrating an existing application or creating a prototype. + defense_component_label: Department of Defense Component + app_migration_label: App Migration + app_migration_description: Do you plan to migrate existing application(s) to the cloud? + native_apps_label: Native Apps + native_apps_description: Do you plan to develop application(s) natively in the cloud? + complexity_label: Project Complexity + complexity_description: Which of these describes how complex your team's use of the cloud will be? Select all that apply. + complexity_other_label: Project Complexity Other + dev_team_label: Development Team + dev_team_description: Which people or teams will be completing the development work for your cloud applications? Select all that apply. + dev_team_other_label: Development Team Other + team_experience_label: Team Experience + team_experience_description: How much experience does your team have with development in the cloud? validators: is_number_message: Please enter a valid number. list_item_required_message: Please provide at least one. @@ -295,6 +323,17 @@ requests: num_software_systems_tooltip: 'A software system can be any code that you plan to host on cloud infrastructure. For example, it could be a custom-developed web application, or a large ERP system.' questions_title_text: Questions related to JEDI Cloud migration rationalization_software_systems_tooltip: Rationalization is the DoD process to determine whether the application should move to the cloud. +task_orders: + new: + app_info: + section_title: "What You're Making" + basic_info_title: Basic information + sample_scope: | + Not sure how to describe your scope? Read some Sample Scopes to get an idea of what is appropriate. + project_title: About your project + team_title: About your team + market_research_title: Market Research + market_research_paragraph: 'The JEDI Cloud Computing Program Office (CCPO) has completed the market research requirements for all related task orders. The Department of Defense CIO has approved this research.
View JEDI Market Research Memo' testing: example_string: Hello World example_with_variables: 'Hello, {name}!' From 922ec561344e80e94292cd8922abc54d98b47851 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 10 Jan 2019 08:21:45 -0500 Subject: [PATCH 2/7] Update TO funding section --- atst/domain/task_orders.py | 2 + atst/forms/data.py | 27 ++++++++++ atst/forms/task_order.py | 30 ++++++++--- templates/components/text_input.html | 1 + templates/task_orders/new/funding.html | 72 ++++++++------------------ translations.yaml | 29 +++++++++++ 6 files changed, 104 insertions(+), 57 deletions(-) diff --git a/atst/domain/task_orders.py b/atst/domain/task_orders.py index 865b5b05..e0537e87 100644 --- a/atst/domain/task_orders.py +++ b/atst/domain/task_orders.py @@ -24,7 +24,9 @@ class TaskOrders(object): "team_experience", ], "funding": [ + "performance_length", "start_date", + "csp_cost_estimate", "end_date", "clin_01", "clin_02", diff --git a/atst/forms/data.py b/atst/forms/data.py index 1db4a893..07be22ce 100644 --- a/atst/forms/data.py +++ b/atst/forms/data.py @@ -213,3 +213,30 @@ TEAM_EXPERIENCE = [ "Built or migrated many applications, or consulted on several such projects", ), ] + +PERIOD_OF_PERFORMANCE_LENGTH = [ + ("1_month", "1 Month"), + ("2_months", "2 Months"), + ("3_months", "3 Months"), + ("4_months", "4 Months"), + ("5_months", "5 Months"), + ("6_months", "6 Months"), + ("7_months", "7 Months"), + ("8_months", "8 Months"), + ("9_months", "9 Months"), + ("10_months", "10 Months"), + ("11_months", "11 Months"), + ("1_year", "1 Year"), + ("1_year_1_month", "1 Year, 1 Month"), + ("1_year_2_months", "1 Year, 2 Months"), + ("1_year_3_months", "1 Year, 3 Months"), + ("1_year_4_months", "1 Year, 4 Months"), + ("1_year_5_months", "1 Year, 5 Months"), + ("1_year_6_months", "1 Year, 6 Months"), + ("1_year_7_months", "1 Year, 7 Months"), + ("1_hyear_8_months", "1 Year, 8 Months"), + ("1_year_9_months", "1 Year, 9 Months"), + ("1_year_10_months", "1 Year, 10 Months"), + ("1_year_11_months", "1 Year, 11 Months"), + ("2_years", "2 Years"), +] diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index 6e9d9ab9..7473eba1 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -6,6 +6,7 @@ from wtforms.fields import ( SelectMultipleField, StringField, TextAreaField, + FileField, ) from wtforms.fields.html5 import DateField from wtforms.widgets import ListWidget, CheckboxInput @@ -20,6 +21,7 @@ from .data import ( PROJECT_COMPLEXITY, DEV_TEAM, TEAM_EXPERIENCE, + PERIOD_OF_PERFORMANCE_LENGTH, ) from atst.utils.localization import translate @@ -74,17 +76,29 @@ class AppInfoForm(CacheableForm): class FundingForm(CacheableForm): - start_date = DateField("Start Date", format="%m/%d/%Y") - end_date = DateField("End Date", format="%m/%d/%Y") - clin_01 = IntegerField("CLIN 01 : Unclassified") - clin_02 = IntegerField("CLIN 02: Classified") - clin_03 = IntegerField("CLIN 03: Unclassified") - clin_04 = IntegerField("CLIN 04: Classified") + performance_length = SelectField( + translate("forms.task_order.performance_length_label"), + choices=PERIOD_OF_PERFORMANCE_LENGTH, + ) + start_date = DateField( + translate("forms.task_order.start_date_label"), format="%m/%d/%Y" + ) + end_date = DateField( + translate("forms.task_order.end_date_label"), format="%m/%d/%Y" + ) + csp_cost_estimate = FileField( + translate("forms.task_order.csp_cost_est_label"), + description=translate("forms.task_order.csp_cost_est_description"), + ) + clin_01 = IntegerField(translate("forms.task_order.clin_01_label")) + clin_02 = IntegerField(translate("forms.task_order.clin_02_label")) + clin_03 = IntegerField(translate("forms.task_order.clin_03_label")) + clin_04 = IntegerField(translate("forms.task_order.clin_04_label")) class UnclassifiedFundingForm(FundingForm): - clin_02 = IntegerField("CLIN 02: Classified (available soon)") - clin_04 = IntegerField("CLIN 04: Classified (available soon)") + clin_02 = IntegerField(translate("forms.task_order.unclassified_clin_02_label")) + clin_04 = IntegerField(translate("forms.task_order.unclassified_clin_04_label") def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/templates/components/text_input.html b/templates/components/text_input.html index 21a0839d..e34fe429 100644 --- a/templates/components/text_input.html +++ b/templates/components/text_input.html @@ -69,6 +69,7 @@ type='text' {% if disabled %} disabled="disabled" + readonly="readonly" {% endif %} ref='input' placeholder='{{ placeholder }}'> diff --git a/templates/task_orders/new/funding.html b/templates/task_orders/new/funding.html index 23586216..0515953c 100644 --- a/templates/task_orders/new/funding.html +++ b/templates/task_orders/new/funding.html @@ -5,7 +5,7 @@ {% from "components/date_input.html" import DateInput %} {% block heading %} - Funding + {{ "task_orders.new.funding.section_title" | translate }} {% endblock %} {% block form %} @@ -13,65 +13,42 @@
-

Period of Performance

+

{{ "task_orders.new.funding.performance_period_title" | translate }}

-

Choose the dates your task order will cover.

+ {{ "task_orders.new.funding.performance_period_paragraph" | translate | safe }} -

- Because your funds will be lost if you don’t use them, we strongly recommend - submitting small, short-duration task orders, usually a three month period. - We’ll notify you when your period of performance is nearing the end so you can - request your next set of funds with a new task order. -

- - {{ DateInput(form.start_date, placeholder='MM / DD / YYYY', validation='date') }} - {{ DateInput(form.end_date, placeholder='MM / DD / YYYY', validation='date') }} + {{ OptionsInput(form.performance_length) }}
-

Cloud Usage Estimate

+

{{ "task_orders.new.funding.estimate_usage_title" | translate }}

-

- Calculate how much your cloud usage will cost. A technical representative - should help you complete this calculation. - - Cloud Service Provider's estimate calculator - -

-

Upload a copy of your CSP Cost Estimate Research

+ {{ "task_orders.new.funding.estimate_usage_paragraph" | translate | safe }} -

- Upload your anticipated cloud usage from the CSP tool linked above. PDFs and - screengrabs of the tool are sufficient. -

-

- This is only an estimation tool to help you make and informed evaluation of - what you expect to use. While you're tied to the dollar amount you specify in - your task order, you're not obligated by the resources you indicate in the - calculator. -

- +
+ {{ form.csp_cost_estimate.label }} + {{ form.csp_cost_estimate.description }} + {{ form.csp_cost_estimate }} +

-

Cloud Usage Calculations

+

{{ "task_orders.new.funding.cloud_calculations_title" | translate }}

- Enter the results of your cloud usage calculations. These will correspond with - your task order's period of performance. -

-

Cloud Offerings

-

- Infrastructure as a Service (IaaS) and Platform as a Service (PaaS) offerings + {{ "task_orders.new.funding.cloud_calculations_paragraph" | translate }}

- {{ TextInput(form.clin_01, validation='dollars') }} +

{{ "task_orders.new.funding.cloud_offerings_title" | translate }}

+

+ {{ "task_orders.new.funding.cloud_offerings_paragraph" | translate }} +

+ + {{ TextInput(form.clin_01, validation='dollars', placeholder="$0.00") }} {{ TextInput(form.clin_02, validation='dollars', disabled=(not config.CLASSIFIED)) }} -

Cloud Support and Assistance

+

{{ "task_orders.new.funding.support_assistance_title" | translate }}

- Technical guidance from the cloud service provider, including architecture, - configuration of IaaS and PaaS, integration, troubleshooting assistance, and - other services. + {{ "task_orders.new.funding.support_assistance_paragraph" | translate }}

- {{ TextInput(form.clin_03, validation='dollars', tooltip='The cloud support and assistance packages cannot be used as a primary development resource.') }} + {{ TextInput(form.clin_03, validation='dollars', tooltip='The cloud support and assistance packages cannot be used as a primary development resource.', placeholder="$0.00") }} {{ TextInput(form.clin_04, validation='dollars', tooltip='The cloud support and assistance packages cannot be used as a primary development resource.', disabled=(not config.CLASSIFIED)) }}
@@ -81,13 +58,10 @@ {% block next %}
-

Total Task Order Value:

+

{{ "task_orders.new.funding.total" | translate }}

{{ super() }}
{% endblock %} - - - diff --git a/translations.yaml b/translations.yaml index 88cd0186..3fc7d46d 100644 --- a/translations.yaml +++ b/translations.yaml @@ -181,6 +181,17 @@ forms: dev_team_other_label: Development Team Other team_experience_label: Team Experience team_experience_description: How much experience does your team have with development in the cloud? + performance_length_label: Period of Performance length + start_date_label: Start Date + end_date_label: End Date + csp_cost_est_label: Upload a copy of your CSP Cost Estimate Research + csp_cost_est_description: Upload a PDF or screenshot fo your usage estimate from the calculator. + clin_01_label: 'CLIN 01 : Unclassifie'd + clin_02_label: 'CLIN 02: Classified' + clin_03_label: 'CLIN 03: Unclassified' + clin_04_label: 'CLIN 04: Classified' + unclassified_clin_02_label: 'CLIN 02: Classified (available soon)' + unclassified_clin_04_label: 'CLIN 04: Classified (available soon)' validators: is_number_message: Please enter a valid number. list_item_required_message: Please provide at least one. @@ -334,6 +345,24 @@ task_orders: team_title: About your team market_research_title: Market Research market_research_paragraph: 'The JEDI Cloud Computing Program Office (CCPO) has completed the market research requirements for all related task orders. The Department of Defense CIO has approved this research.
View JEDI Market Research Memo' + funding: + section_title: Funding + performance_period_title: Period of Performance + performance_period_paragraph: | +

Choose the dates your task order will cover.

+

Because your funds will be lost if you don’t use them, we strongly recommend submitting small, short-duration task orders, usually a three month period. We’ll notify you when your period of performance is nearing the end so you can request your next set of funds with a new task order.

+ estimate_usage_title: Estimate Your Cloud Usage + estimate_usage_paragraph: | +

Calculate how much your cloud usage will cost. A technical representative should help you complete this calculation. These calculatiosnd will become your CLINs.

+

**link image** Cloud Service Provider's estimate calculator

+

This is only an estimation tool to help you make an informed evaluation of what you expect to use. While you're tied to the dollar amount you specify in your task order, you're not obligated by the resources you indicate in the calculator.

+ cloud_calculations_title: Cloud Usage Calculations + cloud_calculations_paragraph: Enter the results of your cloud usage calculations. + cloud_offerings_title: Cloud Offerings + cloud_offerings_paragraph: Infrastructure as a Service (IaaS) and Platform as a Service (PaaS) offerings + support_assistance_title: Cloud Support and Assistance + support_assistance_paragraph: Technical guidance from the cloud service provider, including architecture, configuration of IaaS and PaaS, integration, troubleshooting assistance, and other services. + total: 'Total Task Order Value:' testing: example_string: Hello World example_with_variables: 'Hello, {name}!' From 74ab102891fc3322b3d39fe63c43b3876fb2ea13 Mon Sep 17 00:00:00 2001 From: leigh-mil Date: Thu, 10 Jan 2019 11:15:39 -0500 Subject: [PATCH 3/7] Update TO section for Oversight --- atst/forms/task_order.py | 74 +++++++++++++----------- templates/components/text_input.html | 3 +- templates/components/user_info.html | 4 +- templates/task_orders/new/oversight.html | 41 ++++++++++--- translations.yaml | 22 ++++++- 5 files changed, 98 insertions(+), 46 deletions(-) diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index 7473eba1..0376e32d 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -8,11 +8,11 @@ from wtforms.fields import ( TextAreaField, FileField, ) -from wtforms.fields.html5 import DateField +from wtforms.fields.html5 import DateField, TelField from wtforms.widgets import ListWidget, CheckboxInput from wtforms.validators import Required, Length -from atst.forms.validators import IsNumber +from atst.forms.validators import IsNumber, PhoneNumber from .forms import CacheableForm from .data import ( @@ -98,7 +98,7 @@ class FundingForm(CacheableForm): class UnclassifiedFundingForm(FundingForm): clin_02 = IntegerField(translate("forms.task_order.unclassified_clin_02_label")) - clin_04 = IntegerField(translate("forms.task_order.unclassified_clin_04_label") + clin_04 = IntegerField(translate("forms.task_order.unclassified_clin_04_label")) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -107,52 +107,56 @@ class UnclassifiedFundingForm(FundingForm): class OversightForm(CacheableForm): - ko_first_name = StringField("First Name") - ko_last_name = StringField("Last Name") - ko_email = StringField("Email") + ko_first_name = StringField( + translate("forms.task_order.oversight_first_name_label") + ) + ko_last_name = StringField(translate("forms.task_order.oversight_last_name_label")) + ko_email = StringField(translate("forms.task_order.oversight_email_label")) + ko_phone = TelField( + translate("forms.task_order.oversight_phone_label"), validators=[PhoneNumber()] + ) ko_dod_id = StringField( - "DOD ID", validators=[Required(), Length(min=10), IsNumber()] + translate("forms.task_order.oversight_dod_id_label"), + validators=[Required(), Length(min=10), IsNumber()], ) - cor_first_name = StringField("First Name") - cor_last_name = StringField("Last Name") - cor_email = StringField("Email") + cor_first_name = StringField( + translate("forms.task_order.oversight_first_name_label") + ) + cor_last_name = StringField(translate("forms.task_order.oversight_last_name_label")) + cor_email = StringField(translate("forms.task_order.oversight_email_label")) + cor_phone = TelField( + translate("forms.task_order.oversight_phone_label"), validators=[PhoneNumber()] + ) cor_dod_id = StringField( - "DOD ID", validators=[Required(), Length(min=10), IsNumber()] + translate("forms.task_order.oversight_dod_id_label"), + validators=[Required(), Length(min=10), IsNumber()], ) - so_first_name = StringField("First Name") - so_last_name = StringField("Last Name") - so_email = StringField("Email") + so_first_name = StringField( + translate("forms.task_order.oversight_first_name_label") + ) + so_last_name = StringField(translate("forms.task_order.oversight_last_name_label")) + so_email = StringField(translate("forms.task_order.oversight_email_label")) + so_phone = TelField( + translate("forms.task_order.oversight_phone_label"), validators=[PhoneNumber()] + ) so_dod_id = StringField( - "DOD ID", validators=[Required(), Length(min=10), IsNumber()] + translate("forms.task_order.oversight_dod_id_label"), + validators=[Required(), Length(min=10), IsNumber()], ) ko_invite = BooleanField( - "Invite KO to Task Order Builder", - description=""" - Your KO will need to approve funding for this Task Order by logging - into the JEDI Cloud Portal, submitting the Task Order documents - within their official system of record, and electronically signing. - You may choose to skip this for now and invite them later. - """, + translate("forms.task_order.ko_invite_label"), + description=translate("forms.task_order.skip_invite_description"), ) cor_invite = BooleanField( - "Invite COR to Task Order Builder", - description=""" - Your COR may assist with submitting the Task Order documents within - their official system of record. You may choose to skip this for - now and invite them later. - """, + translate("forms.task_order.cor_invite_label"), + description=translate("forms.task_order.skip_invite_description"), ) so_invite = BooleanField( - "Invite Security Officer to Task Order Builder", - description=""" - Your Security Officer will need to answer some security - configuration questions in order to generate a DD-254 document, - then electronically sign. You may choose to skip this for now - and invite them later. - """, + translate("forms.task_order.so_invite_label"), + description=translate("forms.task_order.skip_invite_description"), ) diff --git a/templates/components/text_input.html b/templates/components/text_input.html index e34fe429..5a0214d8 100644 --- a/templates/components/text_input.html +++ b/templates/components/text_input.html @@ -6,6 +6,7 @@ label=field.label | striptags, description=field.description, tooltip='', + tooltip_title='Help', placeholder='', validation='anything', paragraph=False, @@ -30,7 +31,7 @@