From 78c51d55b51c3a498036ee39cea309aa60b7ed4e Mon Sep 17 00:00:00 2001 From: Jonathan van Rij Date: Mon, 16 Feb 2026 16:00:16 +0100 Subject: [PATCH] adds help texts --- app/Nova/Actions/DownloadExcel.php | 1 + app/Nova/AnswerResource.php | 18 ++++++++++++------ app/Nova/CategoryResource.php | 2 ++ app/Nova/LogResource.php | 18 ++++++++++++------ app/Nova/QuestionGroupResource.php | 15 ++++++++++----- app/Nova/QuestionResource.php | 24 ++++++++++++++++-------- app/Nova/ScreeningResource.php | 12 ++++++++---- app/Nova/SessionResource.php | 24 ++++++++++++++++-------- app/Nova/User.php | 27 ++++++++++++++++++--------- 9 files changed, 95 insertions(+), 46 deletions(-) diff --git a/app/Nova/Actions/DownloadExcel.php b/app/Nova/Actions/DownloadExcel.php index b70f4c1..77e45a3 100644 --- a/app/Nova/Actions/DownloadExcel.php +++ b/app/Nova/Actions/DownloadExcel.php @@ -11,6 +11,7 @@ // Fixes Nova 5 incompatibility where field names are PendingTranslation objects instead of strings. final class DownloadExcel extends BaseDownloadExcel { + protected $onlyIndexFields = false; /** * @param Model|mixed $row */ diff --git a/app/Nova/AnswerResource.php b/app/Nova/AnswerResource.php index 47599ad..f1698a7 100644 --- a/app/Nova/AnswerResource.php +++ b/app/Nova/AnswerResource.php @@ -79,32 +79,38 @@ public function fields(NovaRequest $request): array BelongsTo::make('Session', 'session', SessionResource::class) ->sortable() ->filterable() - ->rules('required'), + ->readonly() + ->help('The questionnaire session this answer belongs to.'), BelongsTo::make('Question', 'question', QuestionResource::class) ->sortable() ->filterable() - ->rules('required'), + ->readonly() + ->help('The question that was answered.'), Text::make('Value') ->sortable() ->filterable() ->copyable() - ->rules('nullable', 'max:255'), + ->readonly() + ->help('The selected answer: "yes", "no", or "not_applicable". Empty for open text questions.'), Textarea::make('Text Value') ->alwaysShow() - ->rules('nullable'), + ->readonly() + ->help('Any written details or free text the user provided for this question.'), DateTime::make('Created At') ->exceptOnForms() ->sortable() - ->filterable(), + ->filterable() + ->help('When this answer was first saved.'), DateTime::make('Updated At') ->exceptOnForms() ->sortable() - ->filterable(), + ->filterable() + ->help('When this answer was last changed.'), ]; } diff --git a/app/Nova/CategoryResource.php b/app/Nova/CategoryResource.php index a6e0fb7..423dd35 100644 --- a/app/Nova/CategoryResource.php +++ b/app/Nova/CategoryResource.php @@ -72,12 +72,14 @@ public function fields(NovaRequest $request): array ->sortable() ->filterable() ->copyable() + ->help('The name of this assessment category, such as Audit, Tax, or Legal.') ->rules('required', 'max:255'), Number::make('Sort Order') ->sortable() ->filterable() ->copyable() + ->help('Controls the display order of categories. Lower numbers appear first.') ->rules('required', 'integer'), HasMany::make('Question Groups', 'questionGroups', QuestionGroupResource::class), diff --git a/app/Nova/LogResource.php b/app/Nova/LogResource.php index 897a1a0..01ea7b3 100644 --- a/app/Nova/LogResource.php +++ b/app/Nova/LogResource.php @@ -86,34 +86,40 @@ public function fields(NovaRequest $request): array ->nullable() ->sortable() ->filterable() - ->rules('nullable'), + ->rules('nullable') + ->help('The user who performed this action. May be empty for system events.'), BelongsTo::make('Session', 'session', SessionResource::class) ->nullable() ->sortable() ->filterable() - ->rules('nullable'), + ->rules('nullable') + ->help('The questionnaire session related to this action, if any.'), BelongsTo::make('Category', 'category', CategoryResource::class) ->nullable() ->sortable() ->filterable() - ->rules('nullable'), + ->rules('nullable') + ->help('The assessment category related to this action, if any.'), Text::make('Action') ->sortable() ->filterable() ->copyable() - ->rules('required', 'max:255'), + ->rules('required', 'max:255') + ->help('What happened, e.g. "login", "session_started", "answer_saved", "screening_completed".'), Code::make('Metadata') ->json() - ->rules('nullable'), + ->rules('nullable') + ->help('Additional details about this action in a structured format.'), DateTime::make('Created At') ->exceptOnForms() ->sortable() - ->filterable(), + ->filterable() + ->help('When this action occurred.'), ]; } diff --git a/app/Nova/QuestionGroupResource.php b/app/Nova/QuestionGroupResource.php index c741916..6ed7a9d 100644 --- a/app/Nova/QuestionGroupResource.php +++ b/app/Nova/QuestionGroupResource.php @@ -73,25 +73,30 @@ public function fields(NovaRequest $request): array BelongsTo::make('Category', 'category', CategoryResource::class) ->sortable() ->filterable() - ->rules('required'), + ->rules('required') + ->help('The assessment category this group of questions belongs to, such as Audit or Tax.'), Text::make('Name') ->sortable() ->filterable() ->copyable() - ->rules('required', 'max:255'), + ->rules('required', 'max:255') + ->help('The title of this question group, shown as a section heading in the questionnaire.'), Number::make('Sort Order') ->sortable() ->filterable() ->copyable() - ->rules('required', 'integer'), + ->rules('required', 'integer') + ->help('Controls the display order within the category. Lower numbers appear first.'), Textarea::make('Description') - ->rules('nullable'), + ->rules('nullable') + ->help('An optional description shown to users at the top of this question group.'), Textarea::make('Scoring Instructions') - ->rules('nullable'), + ->rules('nullable') + ->help('Optional instructions shown to users explaining how this section is scored, e.g. "If you answer yes, you will score 1 point."'), HasMany::make('Questions', 'questions', QuestionResource::class), ]; diff --git a/app/Nova/QuestionResource.php b/app/Nova/QuestionResource.php index f71a150..5459f79 100644 --- a/app/Nova/QuestionResource.php +++ b/app/Nova/QuestionResource.php @@ -87,25 +87,30 @@ public function fields(NovaRequest $request): array BelongsTo::make('Question Group', 'questionGroup', QuestionGroupResource::class) ->sortable() - ->filterable(), + ->filterable() + ->help('The group this question belongs to. Questions are shown together by group in the questionnaire.'), Textarea::make('Text') ->rules('required') - ->updateRules('required'), + ->updateRules('required') + ->help('The full question text shown to the user in the questionnaire.'), Boolean::make('Has Yes') ->sortable() - ->filterable(), + ->filterable() + ->help('When enabled, a "Yes" answer option is shown for this question.'), Boolean::make('Has No') ->sortable() - ->filterable(), + ->filterable() + ->help('When enabled, a "No" answer option is shown for this question.'), Boolean::make('Has NA', 'has_na') ->sortable() - ->filterable(), + ->filterable() + ->help('When enabled, a "Not Applicable" answer option is shown for this question.'), Select::make('Details') ->options([ @@ -117,15 +122,18 @@ public function fields(NovaRequest $request): array ->displayUsingLabels() ->nullable() ->sortable() - ->filterable(), + ->filterable() + ->help('Controls when the user is asked for additional details. "Required" always asks, "Optional" lets the user choose, "Required on Yes/No" only asks when that answer is selected.'), Number::make('Sort Order') ->sortable() - ->filterable(), + ->filterable() + ->help('Controls the display order within the question group. Lower numbers appear first.'), Boolean::make('Is Scored') ->sortable() - ->filterable(), + ->filterable() + ->help('When enabled, this question counts toward the total score. A "Yes" answer scores 1 point.'), HasMany::make('Answers', 'answers', AnswerResource::class), ]; diff --git a/app/Nova/ScreeningResource.php b/app/Nova/ScreeningResource.php index f5cdee2..c1e2644 100644 --- a/app/Nova/ScreeningResource.php +++ b/app/Nova/ScreeningResource.php @@ -86,23 +86,27 @@ public function fields(NovaRequest $request): array BelongsTo::make('User', 'user', User::class) ->sortable() ->filterable() - ->rules('required'), + ->rules('required') + ->help('The person who completed this pre-screening.'), Number::make('Score') ->sortable() ->filterable() ->copyable() - ->rules('required', 'integer'), + ->rules('required', 'integer') + ->help('The number of "Yes" answers out of 10 pre-screening questions.'), Boolean::make('Passed') ->sortable() ->filterable() - ->rules('required', 'boolean'), + ->rules('required', 'boolean') + ->help('Whether the user scored 5 or more points and was allowed to continue to the full questionnaire.'), DateTime::make('Created At') ->exceptOnForms() ->sortable() - ->filterable(), + ->filterable() + ->help('When this pre-screening was started.'), HasMany::make('Sessions', 'sessions', SessionResource::class), ]; diff --git a/app/Nova/SessionResource.php b/app/Nova/SessionResource.php index b52fa19..6c74eb5 100644 --- a/app/Nova/SessionResource.php +++ b/app/Nova/SessionResource.php @@ -87,18 +87,21 @@ public function fields(NovaRequest $request): array BelongsTo::make('User', 'user', User::class) ->sortable() ->filterable() - ->rules('required'), + ->rules('required') + ->help('The person who started this questionnaire session.'), BelongsTo::make('Category', 'category', CategoryResource::class) ->sortable() ->filterable() - ->rules('required'), + ->rules('required') + ->help('The assessment category for this session, such as Audit or Tax.'), BelongsTo::make('Screening', 'screening', ScreeningResource::class) ->nullable() ->sortable() ->filterable() - ->rules('nullable'), + ->rules('nullable') + ->help('The pre-screening that was completed before starting this session.'), Select::make('Status') ->options([ @@ -108,13 +111,15 @@ public function fields(NovaRequest $request): array ]) ->displayUsingLabels() ->sortable() - ->filterable(), + ->filterable() + ->help('The current state of this session. "In Progress" means the user has not yet submitted, "Completed" means submitted, "Abandoned" means the user left without finishing.'), Number::make('Score') ->sortable() ->filterable() ->copyable() - ->rules('nullable', 'integer'), + ->rules('nullable', 'integer') + ->help('The total score from all scored questions. Only "Yes" answers count as points.'), Select::make('Result') ->options([ @@ -124,15 +129,18 @@ public function fields(NovaRequest $request): array ]) ->displayUsingLabels() ->sortable() - ->filterable(), + ->filterable() + ->help('The final outcome based on the score. "Go" (10+ points) means pursue the opportunity, "Consult Leadership" (5-9 points) means seek advice, "No Go" (1-4 points) means do not pursue.'), Textarea::make('Additional Comments') - ->rules('nullable'), + ->rules('nullable') + ->help('Any extra notes the user added at the end of the questionnaire.'), DateTime::make('Completed At') ->sortable() ->filterable() - ->rules('nullable'), + ->rules('nullable') + ->help('The date and time when the user submitted this session.'), HasMany::make('Answers', 'answers', AnswerResource::class), diff --git a/app/Nova/User.php b/app/Nova/User.php index 3948212..43dd0b1 100644 --- a/app/Nova/User.php +++ b/app/Nova/User.php @@ -51,44 +51,53 @@ public function fields(NovaRequest $request): array BelongsTo::make('Role', 'role', RoleResource::class) ->sortable() - ->filterable(), + ->filterable() + ->help('The user\'s role, which controls what they can access in the admin panel.'), Text::make('Name') ->sortable() - ->rules('required', 'max:255'), + ->rules('required', 'max:255') + ->help('The user\'s full name, imported from Azure AD when they first log in.'), Text::make('Email') ->sortable() ->rules('required', 'email', 'max:254') ->creationRules('unique:users,email') - ->updateRules('unique:users,email,{{resourceId}}'), + ->updateRules('unique:users,email,{{resourceId}}') + ->help('The user\'s email address, used to identify them when logging in via Azure AD.'), Text::make('Azure ID', 'azure_id') ->onlyOnDetail() - ->copyable(), + ->copyable() + ->help('A unique identifier from Azure AD. Set automatically when the user logs in.'), Text::make('Photo', 'photo') ->onlyOnDetail() - ->copyable(), + ->copyable() + ->help('A link to the user\'s profile photo from Azure AD.'), Text::make('Job Title', 'job_title') ->sortable() ->filterable() - ->copyable(), + ->copyable() + ->help('The user\'s job title, imported from Azure AD.'), Text::make('Department') ->sortable() ->filterable() - ->copyable(), + ->copyable() + ->help('The department the user belongs to, imported from Azure AD.'), Text::make('Phone') ->sortable() - ->copyable(), + ->copyable() + ->help('The user\'s phone number, imported from Azure AD.'), Password::make('Password') ->onlyOnForms() ->creationRules($this->passwordRules()) - ->updateRules($this->optionalPasswordRules()), + ->updateRules($this->optionalPasswordRules()) + ->help('Only needed for admin panel access. Regular users log in via Azure AD and do not need a password.'), ]; }