diff --git a/app/resources/locales/en_US/field.po b/app/resources/locales/en_US/field.po
index e782eba9c..f26b666db 100644
--- a/app/resources/locales/en_US/field.po
+++ b/app/resources/locales/en_US/field.po
@@ -116,6 +116,9 @@ msgstr "Ends at ({0})"
msgid "enrollee_email"
msgstr "Enrollee Email"
+msgid "enrollee_identifier"
+msgstr "Enrollee Identifier"
+
msgid "extension"
msgstr "Extension"
@@ -185,6 +188,9 @@ msgstr "Middle"
msgid "modifiable"
msgstr "Modifiable"
+msgid "modified"
+msgstr "Modified"
+
msgid "name"
msgstr "Name"
diff --git a/app/resources/locales/en_US/information.po b/app/resources/locales/en_US/information.po
index b13dfec6d..87ca65138 100644
--- a/app/resources/locales/en_US/information.po
+++ b/app/resources/locales/en_US/information.po
@@ -54,6 +54,9 @@ msgstr "not set"
msgid "pagination.format"
msgstr "Page {{page}} of {{pages}}, Viewing {{start}}-{{end}} of {{count}}"
+msgid "enrollment.steps"
+msgstr "Enrollment Steps"
+
msgid "ExternalIdentities.source"
msgstr "This External Identity was created from {0}."
@@ -105,6 +108,12 @@ msgstr "Additional History Records may be available via Petitions and Provisioni
msgid "pagination.format"
msgstr "Page {{page}} of {{pages}}, Viewing {{start}}-{{end}} of {{count}}"
+msgid "petition.history"
+msgstr "Petition History"
+
+msgid "petition.information"
+msgstr "Petition Information"
+
msgid "Petitions.pending"
msgstr "This Petition has now been assigned to someone else. There is no further action for you at this time."
diff --git a/app/resources/locales/en_US/operation.po b/app/resources/locales/en_US/operation.po
index 7475df4ca..f28b3fd72 100644
--- a/app/resources/locales/en_US/operation.po
+++ b/app/resources/locales/en_US/operation.po
@@ -288,6 +288,9 @@ msgstr "View {0}"
msgid "view.PersonRoles.a"
msgstr "View Role {0}"
+msgid "view.Petitions.a"
+msgstr "View Petition {0}"
+
msgid "view.ExternalIdentityRoles.a"
msgstr "View Role {0}"
diff --git a/app/src/Lib/Util/StringUtilities.php b/app/src/Lib/Util/StringUtilities.php
index d1d5e644c..d25ba6336 100644
--- a/app/src/Lib/Util/StringUtilities.php
+++ b/app/src/Lib/Util/StringUtilities.php
@@ -201,7 +201,10 @@ public static function entityAndActionToTitle($entity,
$field = $linkTable->getDisplayField();
if(!empty($entity->$field)) {
- $title = __d($domain, $msgId, $entity->$field);
+ $title = __d($domain, $msgIdOverride, $entity->$field);
+ if($msgIdOverride === $title) {
+ $title = __d($domain, $msgId, $entity->$field);
+ }
} else {
$title = __d($domain, $msgId, __d('controller', $modelsName, [1]));
}
diff --git a/app/src/Model/Table/PetitionsTable.php b/app/src/Model/Table/PetitionsTable.php
index 8aa38d24c..9c6352c42 100644
--- a/app/src/Model/Table/PetitionsTable.php
+++ b/app/src/Model/Table/PetitionsTable.php
@@ -110,7 +110,8 @@ public function initialize(array $config): void {
'EnrollmentFlows' => ['EnrollmentFlowSteps' => ['sort' => ['ordr' => 'ASC']]],
'EnrolleePeople' => ['PrimaryName' => ['foreignKey' => 'person_id']],
'PetitionerPeople' => ['PrimaryName' => ['foreignKey' => 'person_id']],
- 'PetitionStepResults'
+ 'PetitionStepResults',
+ 'PetitionHistoryRecords'
]);
$this->setAutoViewVars([
diff --git a/app/templates/EnrollmentFlows/fields-nav.inc b/app/templates/EnrollmentFlows/fields-nav.inc
index 2beb1446c..7e551480d 100644
--- a/app/templates/EnrollmentFlows/fields-nav.inc
+++ b/app/templates/EnrollmentFlows/fields-nav.inc
@@ -26,7 +26,7 @@
*/
$topLinks[] = [
- 'icon' => 'start',
+ 'icon' => 'play_arrow',
'order' => 'Default',
'label' => __d('operation', 'EnrollmentFlows.start'),
'link' => [
diff --git a/app/templates/Petitions/columns.inc b/app/templates/Petitions/columns.inc
index 1cfed9ffc..57c4f432d 100644
--- a/app/templates/Petitions/columns.inc
+++ b/app/templates/Petitions/columns.inc
@@ -86,8 +86,8 @@ $rowActions = [
'controller' => 'petitions',
'action' => 'resume',
'class' => '',
-// XXX this icon is supposed to be "resume" but that doesn't appear to render
- 'icon' => 'start',
+// XXX this icon can be "resume" if we switch to Material Symbols - see: CFM-404
+ 'icon' => 'fast_forward',
'label' => __d('operation', 'resume'),
'if' => 'isResumable'
]
diff --git a/app/templates/Petitions/fields-nav.inc b/app/templates/Petitions/fields-nav.inc
new file mode 100644
index 000000000..c0964d730
--- /dev/null
+++ b/app/templates/Petitions/fields-nav.inc
@@ -0,0 +1,38 @@
+ 'fast_forward',
+ 'order' => 'Default',
+ 'label' => __d('operation', 'resume'),
+ 'link' => [
+ 'action' => 'resume',
+ $vv_obj->id
+ ]
+ ]
+];
diff --git a/app/templates/Petitions/fields.inc b/app/templates/Petitions/fields.inc
index ca8e86b35..1665c1682 100644
--- a/app/templates/Petitions/fields.inc
+++ b/app/templates/Petitions/fields.inc
@@ -28,6 +28,7 @@
declare(strict_types = 1);
use \Cake\Utility\Hash;
+use Cake\Utility\Inflector;
// Petitions are read-only, though they can link to other actions
if ($vv_action !== 'view') {
@@ -35,38 +36,137 @@ if ($vv_action !== 'view') {
}
// Start with the petition metadata
-print $this->element('form/listItem', [
- 'arguments' => [
- 'fieldName' => 'status',
- ]
-]);
-
-// Enrollee Email, if provided
-print $this->element('form/listItem', [
- 'arguments' => [
- 'fieldName' => 'enrollee_email',
- ]
-]);
+$statusTitle = __d('enumeration','PetitionStatusEnum.' . $vv_obj->status);
+$statusCssClass = 'petition-status-title petition-status-title-' . Inflector::dasherize($statusTitle);
+?>
-// Enrollee
-if (!empty($vv_obj?->enrollee_person?->id)) {
- $enrolleeStatus = $vv_obj->enrollee_person->primary_name->full_name ?? __d('field', 'Petitions.enrollee.new');
- $enrolleeLink = [
- 'url' => [
- 'controller' => 'people',
- 'action' => 'edit',
- $vv_obj->enrollee_person_id
- ]
- ];
- print $this->element('form/listItem', [
- 'arguments' => [
- 'fieldName' => 'enrollee_person_id',
- 'status' => $enrolleeStatus,
- 'link' => !empty($vv_obj->enrollee_person->id) ? $enrolleeLink : [],
- ]
- ]);
-}
+
+
+enrollee_person?->id)): ?>
+
+
+
+
+
+
+ = __d('enumeration','EnrollmentActorEnum.E') ?>:
+
+
+ =
+ $this->Html->link(
+ $vv_obj->enrollee_person->primary_name->full_name ?? __d('field', 'Petitions.enrollee.new'),
+ [
+ 'controller' => 'people',
+ 'action' => 'edit',
+ $vv_obj->enrollee_person_id
+ ]
+ );
+ ?>
+
+
+
+
+
+ enrollee_email)): ?>
+
+
+ = __d('field','email') ?>:
+
+
+ =
+ $this->Html->link(
+ $vv_obj->enrollee_email,
+ 'mailto:' . $vv_obj->enrollee_email,
+ ['class' => 'nospin']
+ );
+ ?>
+
+
+
+ enrollee_identifier)): ?>
+
+
+ = __d('field','identifier') ?>:
+
+
+ = $vv_obj->enrollee_identifier ?>
+
+
+
+
+
+
+
+
+
+
+ = __d('enumeration','EnrollmentActorEnum.E') ?>
+
+
+
+ =
+ $this->Html->link(
+ $vv_obj->enrollee_person->primary_name->full_name ?? __d('field', 'Petitions.enrollee.new'),
+ [
+ 'controller' => 'people',
+ 'action' => 'edit',
+ $vv_obj->enrollee_person_id
+ ]
+ );
+ ?>
+
+
+
+ enrollee_email)): ?>
+
+
+
+
+ = __d('field','enrollee_email') ?>
+
+
+
+ =
+ $this->Html->link(
+ $vv_obj->enrollee_email,
+ 'mailto:' . $vv_obj->enrollee_email,
+ ['class' => 'nospin']
+ );
+ ?>
+
+
+
+
+ enrollee_identifier)): ?>
+
+
+
+
+ = __d('field','enrollee_identifier') ?>
+
+
+
+ = $vv_obj->enrollee_identifier ?>
+
+
+
+
+ */ ?>
+
+petitioner_person?->id)) {
$petitionerStatus = $vv_obj?->petitioner_person?->primary_name?->full_name ?? '';
@@ -85,31 +185,114 @@ if (!empty($vv_obj?->petitioner_person?->id)) {
]
]);
}
-
?>
+
+
+
+
+
+ = __d('controller','EnrollmentFlows', [1]) ?>
+
+
+
+ =
+ $this->Html->link(
+ $vv_obj->enrollment_flow->name,
+ [
+ 'controller' => 'enrollment_flows',
+ 'action' => 'edit',
+ $vv_obj->enrollment_flow->id
+ ]
+ )
+ ?>
+
+
+
+
+
+
+
+
+ = __d('field','created') ?>: = $vv_obj->created ?>
+
+
+
+ = __d('field','modified') ?>: = $vv_obj->modified ?>
+
+
+
+
+
+
+
-
- enrollment_flow->enrollment_flow_steps as $step): ?>
- petition_step_results, "{n}[enrollment_flow_step_id=$step->id]");
+enrollment_flow->enrollment_flow_steps as $step): ?>
+ petition_step_results, "{n}[enrollment_flow_step_id=$step->id]");
- if(!empty($result)) {
- $resultLink = [
- 'controller' => 'petitions',
- 'action' => 'result',
- $vv_obj->id,
- '?' => [
- 'enrollment_flow_step_id' => $step->id
- ]
- ];
- }
- ?>
+ if(!empty($result)) {
+ $resultLink = [
+ 'controller' => 'petitions',
+ 'action' => 'result',
+ $vv_obj->id,
+ '?' => [
+ 'enrollment_flow_step_id' => $step->id
+ ]
+ ];
+ }
+ ?>
- - = $step->description ?>
-
- - = !empty($result) ? $this->Html->link($result[0]->comment, $resultLink) : "" ?>
-
-
-
-
+
+
+
+
+ = $step->description ?>
+
+
+
+ = !empty($result) ? $this->Html->link($result[0]->comment, $resultLink) : "" ?>
+
+
+
+
+
+
+petition_history_records)):
+ // XXX Generalize this into an element for all history records if we use this output elsewhere
+?>
+
+
+
+
+
+
+ = __d('field', 'action'); ?> |
+ = __d('field', 'actor'); ?> |
+ = __d('field', 'comment'); ?> |
+ = __d('field', 'created'); ?> |
+
+
+
+
+ petition_history_records as $hr): ?>
+
+ = __d('enumeration','PetitionActionEnum.' . $hr['action']) ?> |
+ = $hr['actor_person_id'] // XXX Replace with link to actor and name of ?> |
+ = $hr['comment'] ?> |
+ = $hr['created'] ?> |
+
+
+
+
+
+
+
diff --git a/app/webroot/css/co-base.css b/app/webroot/css/co-base.css
index 3521f9c2d..624bd6659 100644
--- a/app/webroot/css/co-base.css
+++ b/app/webroot/css/co-base.css
@@ -29,7 +29,7 @@
@import url("fonts/material-icons/material-icons.css");
html * {
- font-family: 'open_sansregular','Trebuchet MS',Arial,Helvetica,sans-serif;
+ font-family: var(--cmg-font-regular);
}
body {
color: var(--cmg-color-body-txt);
@@ -1354,21 +1354,30 @@ field data is in the right column; see also ul.data-list
above. ***/
ul.form-list {
clear: both;
+ margin-top: 0.5rem;
padding: 0;
-}
-body.view ul.form-list {
- border-bottom: 1px solid var(--cmg-color-bg-005);
+ border-top: 1px solid var(--cmg-color-bg-005);
}
.cm-time-picker-vals ul li,
ul.form-list li {
background-color: var(--cmg-color-body-bg);
border-left: 1px solid var(--cmg-color-bg-005);
- border-top: 1px solid var(--cmg-color-bg-005);
+ border-bottom: 1px solid var(--cmg-color-bg-005);
border-right: 1px solid var(--cmg-color-bg-005);
margin: 0;
padding: 0;
list-style: none;
}
+ul.fields li.form-list-header {
+ overflow-x: unset;
+ margin-top: 2rem;
+}
+ul.fields li.form-list-header h2 {
+ color: var(--cmg-color-txt-inverse);
+ background-color: var(--cmg-color-btn-bg-001);
+ font-size: 1.4em;
+ padding: 1rem;
+}
ul.form-list li:focus-within {
background-color: var(--cmg-color-bg-001);
}
@@ -1387,8 +1396,7 @@ ul.form-list li .field:hover {
}
ul.form-list li.fields-submit {
background-color: unset;
- border-left: none;
- border-right: none;
+ border: none;
}
ul.form-list li.fields-submit .field:hover {
background-color: var(--cmg-color-body-bg);
@@ -1884,6 +1892,38 @@ body.attributecollectors .submit {
padding-right: 1em;
white-space: nowrap;
}
+ul#view_Petitions.form-list {
+ border-top: none;
+}
+ul.form-list li.petition-status-title {
+ margin-top: 0.5rem;
+ margin-bottom: -1rem;
+ border: none;
+}
+ul.form-list li.petition-status-title h2 {
+ /* default colors for most status titles */
+ background-color: var(--cmg-color-highlight-009);
+ color: var(--cmg-color-highlight-010);
+ border: 1px solid var(--cmg-color-highlight-011);
+}
+ul.form-list li.petition-status-title-finalized h2 {
+ background-color: var(--cmg-color-highlight-006);
+ color: var(--cmg-color-highlight-007);
+ border: 1px solid var(--cmg-color-highlight-008);
+}
+ul.form-list li.petition-enrollee-items,
+ul.form-list li.petition-enrollee-items .field:hover {
+ background-color: var(--cmg-color-highlight-004);
+ color: var(--cmg-color-highlight-005);
+}
+ul.form-list li.petition-enrollee-items .field-info {
+ display: flex;
+ flex-direction: column; /* changes to 'row' on desktop */
+}
+ul.form-list li.petition-enrollee-items .petition-inline-value,
+ul.form-list li.petition-enrollee-items .petition-inline-value a {
+ font-family: var(--cmg-font-semibold);
+}
/* GENERAL */
.hidden,
.invisible,
@@ -2091,6 +2131,9 @@ table.table-striped tbody tr:nth-child(2n) td {
td .alert {
margin-bottom: 0;
}
+.history-table th {
+ font-weight: normal;
+}
/* LOADING ANIMATION & SKELETONS */
@keyframes loading {
0% { opacity: 0.3; }
diff --git a/app/webroot/css/co-color.css b/app/webroot/css/co-color.css
index c9b6524dd..333727517 100644
--- a/app/webroot/css/co-color.css
+++ b/app/webroot/css/co-color.css
@@ -90,6 +90,10 @@
--cmg-color-highlight-017: #cee6f8; /* alert: info border color (blue) */
--cmg-color-highlight-018: yellow; /* autocomplete highlight for query text */
+ /* Fonts */
+ --cmg-font-regular: 'open_sansregular','Trebuchet MS',Arial,Helvetica,sans-serif;
+ --cmg-font-semibold: 'open_sanssemibold','open_sansregular','Trebuchet MS',Arial,Helvetica,sans-serif;
+
/* Duet Date Picker Colors & Settings */
--duet-color-primary: var(--cmg-color-btn-bg-001);
--duet-color-text: var(--cmg-color-body-txt);
diff --git a/app/webroot/css/co-responsive.css b/app/webroot/css/co-responsive.css
index 88f567a3f..c8a0c16d7 100644
--- a/app/webroot/css/co-responsive.css
+++ b/app/webroot/css/co-responsive.css
@@ -504,6 +504,11 @@
#dispatch_AttributeCollectors .fields-telephoneNumber .fieldset-info .fieldset-field.fields-number input {
width: 24em;
}
+ /* PETITIONS */
+ ul.form-list li.petition-enrollee-items .field-info {
+ flex-direction: row;
+ gap: 3em;
+ }
/* FOOTER */
#co-footer {
position: static;
diff --git a/app/webroot/css/fonts/opensans/OpenSans-Semibold-webfont.woff b/app/webroot/css/fonts/opensans/OpenSans-Semibold-webfont.woff
new file mode 100644
index 000000000..c5c64ed59
Binary files /dev/null and b/app/webroot/css/fonts/opensans/OpenSans-Semibold-webfont.woff differ
diff --git a/app/webroot/css/fonts/opensans/stylesheet.css b/app/webroot/css/fonts/opensans/stylesheet.css
index 07f6cc63d..bb2af9471 100644
--- a/app/webroot/css/fonts/opensans/stylesheet.css
+++ b/app/webroot/css/fonts/opensans/stylesheet.css
@@ -8,3 +8,9 @@
font-weight: normal;
font-style: normal;
}
+@font-face {
+ font-family: 'open_sanssemibold';
+ src: url('OpenSans-Semibold-webfont.woff') format('woff');
+ font-weight: normal;
+ font-style: normal;
+}
\ No newline at end of file