Files
breadcrumb-the-shire/modules/helpdesk/pages/helpdesk/handovers/_form.phtml
aminovfariz 9bc8799b6b feat(helpdesk): add user-select field type to handover protocol schema
New schema field type 'user-select' renders a dropdown of active tenant
users. Action files (create + edit) load tenant users when the schema
contains at least one user-select field and pass them to _form.phtml.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 10:46:15 +02:00

159 lines
6.9 KiB
PHTML

<?php
/**
* Renders a fillable form from a handover schema snapshot.
*
* Expected variables:
* $schemaFields — list of field definitions from schema_snapshot['fields']
* $fieldValues — associative array of current field values (key => value)
* $readonly — bool, if true all inputs are disabled
* $fieldDiff — (optional) associative array of diffs: key => ['type' => added|removed|changed, 'old' => ..., 'new' => ...]
*/
$schemaFields = is_array($schemaFields ?? null) ? $schemaFields : [];
$fieldValues = is_array($fieldValues ?? null) ? $fieldValues : [];
$fieldDiff = is_array($fieldDiff ?? null) ? $fieldDiff : [];
$tenantUsers = is_array($tenantUsers ?? null) ? $tenantUsers : [];
$readonly = !empty($readonly);
$hasDiff = $fieldDiff !== [];
?>
<?php if ($schemaFields === []): ?>
<p class="app-muted"><?php e(t('No protocol fields defined.')); ?></p>
<?php else: ?>
<?php foreach ($schemaFields as $index => $field):
$type = (string) ($field['type'] ?? '');
$label = (string) ($field['label'] ?? '');
$key = (string) ($field['key'] ?? '');
$required = !empty($field['required']);
$value = $key !== '' ? (string) ($fieldValues[$key] ?? '') : '';
$inputId = 'handover-field-' . $index;
$diff = ($key !== '' && isset($fieldDiff[$key])) ? $fieldDiff[$key] : null;
$diffClass = $diff !== null ? ' handover-diff-' . ($diff['type'] ?? '') : '';
?>
<?php if ($type === 'heading'): ?>
<h3 class="handover-form-heading"><?php e($label); ?></h3>
<?php elseif ($type === 'paragraph'): ?>
<p class="app-muted"><?php e($label); ?></p>
<?php elseif ($type === 'checkbox'): ?>
<div class="handover-diff-field<?php e($diffClass); ?>">
<label class="handover-form-checkbox-label">
<input
type="checkbox"
id="<?php e($inputId); ?>"
name="field_<?php e($key); ?>"
value="1"
<?php if ($value === '1'): ?> checked<?php endif; ?>
<?php if ($readonly): ?> disabled<?php endif; ?>
>
<?php e($label); ?>
<?php if ($required): ?><span class="handover-form-required"> *</span><?php endif; ?>
</label>
<?php if ($diff !== null): ?>
<span class="handover-diff-indicator" aria-label="<?php e(t('Changed')); ?>">
<?php if ($diff['type'] === 'changed'): ?>
<small class="app-muted"><?php e(t('was: %s', ($diff['old'] ?? '') === '1' ? t('Yes') : t('No'))); ?></small>
<?php endif; ?>
</span>
<?php endif; ?>
</div>
<?php elseif ($type === 'user-select'): ?>
<div class="handover-diff-field<?php e($diffClass); ?>">
<label for="<?php e($inputId); ?>">
<?php e($label); ?>
<?php if ($required): ?><span class="handover-form-required"> *</span><?php endif; ?>
</label>
<select
id="<?php e($inputId); ?>"
name="field_<?php e($key); ?>"
<?php if ($required): ?> aria-required="true"<?php endif; ?>
<?php if ($readonly): ?> disabled<?php endif; ?>
>
<option value=""><?php e(t('Please select...')); ?></option>
<?php foreach ($tenantUsers as $u):
$uId = (string) ($u['id'] ?? '');
$uName = trim((string) ($u['display_name'] ?? ''));
$uEmail = (string) ($u['email'] ?? '');
$uLabel = $uName !== '' ? $uName : $uEmail;
?>
<option value="<?php e($uId); ?>"<?php if ($value === $uId): ?> selected<?php endif; ?>>
<?php e($uLabel); ?>
</option>
<?php endforeach; ?>
</select>
<?php if ($diff !== null && $diff['type'] === 'changed'): ?>
<small class="app-muted handover-diff-indicator" aria-label="<?php e(t('Changed')); ?>"><?php e(t('was: %s', (string) ($diff['old'] ?? ''))); ?></small>
<?php endif; ?>
</div>
<?php elseif ($type === 'select'): ?>
<div class="handover-diff-field<?php e($diffClass); ?>">
<label for="<?php e($inputId); ?>">
<?php e($label); ?>
<?php if ($required): ?><span class="handover-form-required"> *</span><?php endif; ?>
</label>
<select
id="<?php e($inputId); ?>"
name="field_<?php e($key); ?>"
<?php if ($required): ?> aria-required="true"<?php endif; ?>
<?php if ($readonly): ?> disabled<?php endif; ?>
>
<option value=""><?php e(t('Please select...')); ?></option>
<?php foreach (($field['options'] ?? []) as $opt): ?>
<option value="<?php e((string) ($opt['value'] ?? '')); ?>"<?php if ($value === (string) ($opt['value'] ?? '')): ?> selected<?php endif; ?>>
<?php e((string) ($opt['label'] ?? '')); ?>
</option>
<?php endforeach; ?>
</select>
<?php if ($diff !== null && $diff['type'] === 'changed'): ?>
<small class="app-muted handover-diff-indicator" aria-label="<?php e(t('Changed')); ?>"><?php e(t('was: %s', (string) ($diff['old'] ?? ''))); ?></small>
<?php endif; ?>
</div>
<?php elseif ($type === 'textarea'): ?>
<div class="handover-diff-field<?php e($diffClass); ?>">
<label for="<?php e($inputId); ?>">
<?php e($label); ?>
<?php if ($required): ?><span class="handover-form-required"> *</span><?php endif; ?>
</label>
<textarea
id="<?php e($inputId); ?>"
name="field_<?php e($key); ?>"
rows="4"
<?php if ($required): ?> aria-required="true"<?php endif; ?>
<?php if ($readonly): ?> disabled<?php endif; ?>
><?php e($value); ?></textarea>
<?php if ($diff !== null && $diff['type'] === 'changed'): ?>
<small class="app-muted handover-diff-indicator" aria-label="<?php e(t('Changed')); ?>"><?php e(t('was: %s', (string) ($diff['old'] ?? ''))); ?></small>
<?php endif; ?>
</div>
<?php else: ?>
<?php
$inputType = match ($type) {
'number' => 'number',
'date' => 'date',
default => 'text',
};
?>
<div class="handover-diff-field<?php e($diffClass); ?>">
<label for="<?php e($inputId); ?>">
<?php e($label); ?>
<?php if ($required): ?><span class="handover-form-required"> *</span><?php endif; ?>
</label>
<input
type="<?php e($inputType); ?>"
id="<?php e($inputId); ?>"
name="field_<?php e($key); ?>"
value="<?php e($value); ?>"
<?php if ($required): ?> aria-required="true"<?php endif; ?>
<?php if ($readonly): ?> disabled<?php endif; ?>
>
<?php if ($diff !== null && $diff['type'] === 'changed'): ?>
<small class="app-muted handover-diff-indicator" aria-label="<?php e(t('Changed')); ?>"><?php e(t('was: %s', (string) ($diff['old'] ?? ''))); ?></small>
<?php endif; ?>
</div>
<?php endif; ?>
<?php endforeach; ?>
<?php endif; ?>