diff --git a/app/plugins/CoreAssigner/templates/FormatAssigners/fields.inc b/app/plugins/CoreAssigner/templates/FormatAssigners/fields.inc
index 2de0ec752..f382bc570 100644
--- a/app/plugins/CoreAssigner/templates/FormatAssigners/fields.inc
+++ b/app/plugins/CoreAssigner/templates/FormatAssigners/fields.inc
@@ -28,22 +28,22 @@
+
Field->control(
fieldName: 'collision_mode',
options: [
- 'onChange' => 'javascript:fields_update_gadgets();'
+ 'onChange' => 'updateGadgets()'
]
);
diff --git a/app/src/View/Helper/FieldHelper.php b/app/src/View/Helper/FieldHelper.php
index 2329855c7..93a112a24 100644
--- a/app/src/View/Helper/FieldHelper.php
+++ b/app/src/View/Helper/FieldHelper.php
@@ -284,7 +284,7 @@ public function endControlSet(): string {
*/
protected function endLine(): string {
- return "\n";
+ return "\n";
}
/**
@@ -556,7 +556,7 @@ protected function startLine(string $class=null): string {
$ret .= ' class="' . $class . '"';
}
- $ret .= '>';
+ $ret .= '>
';
return $ret;
}
@@ -571,12 +571,14 @@ protected function startLine(string $class=null): string {
public function submit(string $label): string {
return '
-
- * ' . __d('field', 'required') . '
-
-
- ' . $this->Form->submit($label) . '
-
+
+
+ * ' . __d('field', 'required') . '
+
+
+ ' . $this->Form->submit($label) . '
+
+
';
}
}
\ No newline at end of file
diff --git a/app/templates/IdentifierAssignments/fields.inc b/app/templates/IdentifierAssignments/fields.inc
index 9fa5e4717..a7c764847 100644
--- a/app/templates/IdentifierAssignments/fields.inc
+++ b/app/templates/IdentifierAssignments/fields.inc
@@ -28,40 +28,43 @@
+
Field->control(
fieldName: 'context',
options: [
- 'onChange' => 'javascript:fields_update_gadgets();'
+ 'onChange' => 'updateGadgets()'
]
);
- print $this->Field->control('group_id');
-
print $this->Field->control(
fieldName: 'identifier_type_id',
options: [
- 'onChange' => 'javascript:reset_type("email-address-type-id")'
+ 'onChange' => 'resetType("email-address-type-id")'
]
);
- print $this->Field->control('login');
+ print $this->Field->control(
+ fieldName: 'login',
+ cssClass: 'subfield'
+ );
print $this->Field->control(
fieldName: 'email_address_type_id',
options: [
- 'onChange' => 'javascript:reset_type("identifier-type-id")'
+ 'onChange' => 'resetType("identifier-type-id")'
]
);
+ print $this->Field->control('group_id');
+
print $this->Field->control('ordr');
}
\ No newline at end of file
diff --git a/app/templates/ProvisioningTargets/fields.inc b/app/templates/ProvisioningTargets/fields.inc
index 12f3db035..fd4ed02cf 100644
--- a/app/templates/ProvisioningTargets/fields.inc
+++ b/app/templates/ProvisioningTargets/fields.inc
@@ -27,35 +27,45 @@
?>
+
Field->control('description');
- print $this->Field->control('status',
- ['onChange' => 'fields_update_gadgets();',
- 'default' => \App\Lib\Enum\ProvisionerModeEnum::QueueOnError]);
+ print $this->Field->control(
+ fieldName: 'status',
+ options: [
+ 'onChange' => 'updateGadgets()',
+ 'default' => \App\Lib\Enum\ProvisionerModeEnum::QueueOnError
+ ]
+ );
- print $this->Field->control('retry_interval', ['default' => 900]);
+ print $this->Field->control(
+ fieldName: 'retry_interval',
+ options: [
+ 'default' => 900
+ ],
+ cssClass: 'subfield'
+ );
print $this->Field->control('plugin');
diff --git a/app/templates/Types/fields.inc b/app/templates/Types/fields.inc
index 9e189f1db..8e89035de 100644
--- a/app/templates/Types/fields.inc
+++ b/app/templates/Types/fields.inc
@@ -28,28 +28,33 @@
+
Field->control('attribute',
- ['onChange' => 'fields_update_gadgets();',
- 'readonly' => $vv_action == 'edit']);
+ print $this->Field->control(
+ fieldName: 'attribute',
+ options: [
+ 'onChange' => 'updateGadgets()',
+ 'readonly' => $vv_action == 'edit'
+ ]
+ );
print $this->Field->control('display_name');
diff --git a/app/templates/element/dialog.php b/app/templates/element/dialog.php
index c8ef2923f..b1e765cdc 100644
--- a/app/templates/element/dialog.php
+++ b/app/templates/element/dialog.php
@@ -26,7 +26,7 @@
*
* This generic modal dialog stub is used for confirmations, e.g. when deleting a record.
* The text of the box is overridden with JavaScript, and the confirm button is intended to
- * click a CakePHP postLink or postButton in the DOM. Use js_confirm_generic() to call it.
+ * click a CakePHP postLink or postButton in the DOM. Use jsConfirmGeneric() to call it.
*/
?>
diff --git a/app/templates/element/menuAction.php b/app/templates/element/menuAction.php
index ba1dcbc95..404e9b78a 100644
--- a/app/templates/element/menuAction.php
+++ b/app/templates/element/menuAction.php
@@ -106,7 +106,7 @@ class="= $actionsMenuClass; ?>">
$cancelButtonText = !empty($action['confirm']['dg_cancel_btn']) ? $action['confirm']['dg_cancel_btn'] : __d('operation','cancel');
$replacements = !empty($action['confirm']['dg_body_txt_replacements']) ? $action['confirm']['dg_body_txt_replacements'] : '';
- $dg_onclick = 'javascript:js_confirm_generic(\''
+ $dg_onclick = 'javascript:jsConfirmGeneric(\''
. $dialogBodyText . '\',\'' // dialog body text
. $actionUrl . '\',\'' // URL to redirect to on confirm
. $actionUid . '\',\'' // ID of postButton element to click on confirm if not empty
diff --git a/app/templates/layout/default.php b/app/templates/layout/default.php
index c9087c935..d804d47c6 100644
--- a/app/templates/layout/default.php
+++ b/app/templates/layout/default.php
@@ -90,7 +90,7 @@
$bodyClasses .= ' logged-out';
}
?>
-
+
diff --git a/app/templates/layout/iframe.php b/app/templates/layout/iframe.php
index e3a3e1b35..6010ae512 100644
--- a/app/templates/layout/iframe.php
+++ b/app/templates/layout/iframe.php
@@ -90,7 +90,7 @@
$bodyClasses .= ' logged-out';
}
?>
-
+
diff --git a/app/webroot/css/co-base.css b/app/webroot/css/co-base.css
index a80b75fe4..e5a73246d 100644
--- a/app/webroot/css/co-base.css
+++ b/app/webroot/css/co-base.css
@@ -1130,7 +1130,7 @@ ul.data-list li {
background-color: var(--cmg-color-bg-003);
}
ul.data-list li:nth-child(2n) {
- background-color: var(--cmg-color-bg-009); /* note that this is slightly lighter than the .form-list zebra */
+ background-color: var(--cmg-color-bg-009);
}
ul.data-table li {
background-color: unset;
@@ -1152,25 +1152,34 @@ above. ***/
ul.form-list {
clear: both;
padding: 0;
- border-top: 1px solid var(--cmg-color-bg-005);
}
.cm-time-picker-vals ul li,
ul.form-list li {
- background-color: var(--cmg-color-bg-001);
+ background-color: var(--cmg-color-body-bg);
border-left: 1px solid var(--cmg-color-bg-005);
- border-bottom: 1px solid var(--cmg-color-bg-005);
+ border-top: 1px solid var(--cmg-color-bg-005);
border-right: 1px solid var(--cmg-color-bg-005);
margin: 0;
- padding: 0.75em;
+ padding: 0;
list-style: none;
}
-.cm-time-picker-vals ul li:nth-child(even),
-ul.form-list li:nth-child(even) {
+ul.form-list li:focus-within {
+ background-color: var(--cmg-color-bg-001);
+}
+ul.form-list li.fields-submit:focus-within {
background-color: var(--cmg-color-body-bg);
}
+ul.form-list li.subfield {
+ border-top: none;
+}
+ul.form-list li .field {
+ margin: 0;
+ padding: 0.75em;
+}
ul.form-list li.fields-submit {
background-color: unset;
- border: none;
+ border-left: none;
+ border-right: none;
}
ul.form-list .field-name {
display: block;
@@ -1362,6 +1371,9 @@ ul.form-list .cm-time-picker-vals li {
display: block;
padding: 4px 0 0 0;
}
+.cm-time-picker-vals ul li:nth-child(even) {
+ background-color: var(--cmg-color-body-bg);
+}
.cm-time-picker-vals button {
background-color: transparent;
border: none;
@@ -1392,6 +1404,7 @@ ul.form-list .cm-time-picker-vals li {
position: absolute;
border: none;
right: 2.5em;
+ padding-top: 1em;
color: var(--cmg-color-txt-soft);
background-color: unset;
}
@@ -1827,6 +1840,11 @@ html.dark-mode .btn-default:active {
background-color: var(--cmg-color-body-bg);
border-color: var(--cmg-color-bg-006);
}
+.collapsing {
+ transition-property: height, visibility;
+ transition-duration: 0.2s;
+ transition-timing-function: ease-out;
+}
/* FOOTER */
footer {
text-align: center;
diff --git a/app/webroot/css/co-responsive.css b/app/webroot/css/co-responsive.css
index 3bccd3e82..22fc96c68 100644
--- a/app/webroot/css/co-responsive.css
+++ b/app/webroot/css/co-responsive.css
@@ -87,7 +87,7 @@
ul.form-list-admin .field-info {
width: 40%;
}
- ul.form-list li {
+ ul.form-list li .field {
display: flex;
column-gap: 1em;
align-items: center;
diff --git a/app/webroot/js/comanage/comanage.js b/app/webroot/js/comanage/comanage.js
index f57e94db1..1b4f7d9c2 100644
--- a/app/webroot/js/comanage/comanage.js
+++ b/app/webroot/js/comanage/comanage.js
@@ -26,17 +26,17 @@
// On page load, call any defined initialization functions.
// Make sure function is defined before calling.
-function js_onload_call_hooks() {
- if(window.js_local_onload) {
- js_local_onload();
+function jsOnLoadCallHooks() {
+ if(window.jsLocalOnLoad) {
+ jsLocalOnLoad();
}
}
// On form submit, call any defined functions.
// Make sure function is defined before calling.
-function js_onsubmit_call_hooks() {
- if(window.js_local_onsubmit) {
- js_local_onsubmit();
+function jsOnSubmitCallHooks() {
+ if(window.jsLocalOnSubmit) {
+ jsLocalOnSubmit();
}
}
@@ -55,6 +55,32 @@ function stopSpinner() {
$("#co-loading").hide();
}
+// Show fields in .form-list output.
+// fields - array of field IDs
+// isPageLoad - boolean, true for first page load
+function showFields(fields, isPageLoad) {
+ for(const field of fields) {
+ if(isPageLoad !== undefined && isPageLoad) {
+ $('#' + field).closest('li').addClass('collapse show');
+ } else {
+ $('#' + field).closest('li').collapse('show');
+ }
+ }
+}
+
+// Hide fields in .form-list output.
+// fields - array of field IDs
+// isPageLoad - boolean, true for first page load
+function hideFields(fields, isPageLoad) {
+ for(const field of fields) {
+ if(isPageLoad !== undefined && isPageLoad) {
+ $('#' + field).closest('li').addClass('collapse');
+ } else {
+ $('#' + field).closest('li').collapse('hide');
+ }
+ }
+}
+
// Returns an i18n string with tokens replaced.
// For use in JavaScript dialogs.
// text - body text for the array with tokens {0}, {1}, etc
@@ -76,7 +102,7 @@ function replaceTokens(text,replacements) {
// cancelbtxt - cancel button text (string, optional)
// titletxt - dialog title text (string, optional)
// tokenReplacements - strings to replace tokens in dialog body text (array, optional)
-function js_confirm_generic(txt, confirmUrl, clickId, confirmbtxt, cancelbtxt, titletxt, tokenReplacements) {
+function jsConfirmGeneric(txt, confirmUrl, clickId, confirmbtxt, cancelbtxt, titletxt, tokenReplacements) {
var bodyText = txt;
var confUrl = confirmUrl;