{% extends "base.html" %} {% from "components/ui.html" import confirm_dialog %} {% block content %}
Client details and associated projects.
{{ contact.full_name }}
{% if contact.title %}{{ contact.title }}
{% endif %} {% if contact.is_primary %} {{ _('Primary') }} {% endif %}{{ contacts|length - 3 }} {{ _('more contact(s)') }}
{% endif %}{{ _('No contacts yet') }}
{{ _('Add Contact') }} {% endif %}{{ client.contact_person }}
{{ client.phone }}
{{ client.address }}
{% set link_template = link_templates_by_field.get(key) if link_templates_by_field else None %} {% if link_template and value %} {# Render as clickable link using link template #} {% set rendered_url = link_template.render_url(value) %} {% if rendered_url %} {{ value }} {% else %} {{ value }} {% endif %} {% elif value is string and (value.startswith('http://') or value.startswith('https://')) %} {# Fallback: If the value looks like a URL, render it as a clickable link #} {{ value }} {% elif value is string and value.startswith('www.') %} {{ value }} {% else %} {{ value }} {% endif %}
{{ _('Plan includes %(hours)s hours per cycle. Resets on day %(day)s.', hours='%.2f'|format(prepaid_overview.plan_hours), day=client.prepaid_reset_day) }}
{{ attachment.description }}
{% endif %}{{ attachment.file_size_display }} • {{ attachment.uploaded_at|user_datetime('%Y-%m-%d %H:%M') if attachment.uploaded_at else '' }} {% if attachment.is_visible_to_client %} {{ _('Client Visible') }} {% endif %}
{{ _('No attachments yet') }}
{% endif %}| Name | Status | Actions |
|---|---|---|
|
{{ project.name }}
{% if project.code_display %}
{{ project.code_display }}
{% endif %}
|
{% set status_map = { 'active': {'cls': 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300', 'label': _('Active')}, 'inactive': {'cls': 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300', 'label': _('Inactive')}, 'archived': {'cls': 'bg-gray-100 text-gray-700 dark:bg-gray-700 dark:text-gray-200', 'label': _('Archived')}, } %} {% set st = status_map.get(project.status, status_map['inactive']) %} {{ st.label }} | View |
| No projects found for this client. | ||
| {{ _('Date') }} | {{ _('Project') }} | {{ _('Task') }} | {{ _('User') }} | {{ _('Duration') }} | {{ _('Notes') }} |
|---|---|---|---|---|---|
|
{{ entry.start_time|user_datetime('%Y-%m-%d') }}
{{ entry.start_time|user_datetime('%H:%M') }}
{% if entry.end_time %}
- {{ entry.end_time|user_datetime('%H:%M') }}
{% endif %}
|
{% if entry.project %} {{ entry.project.name }} {% else %} {{ _('Direct') }} {% endif %} | {% if entry.task %} {{ entry.task.name }} {% else %} - {% endif %} | {{ entry.user.display_name if entry.user else _('N/A') }} | {{ "%.2f"|format(entry.duration_hours) }}h | {% if entry.notes %} {{ entry.notes[:50] }}{% if entry.notes|length > 50 %}...{% endif %} {% else %} - {% endif %} |
{{ _('Showing last %(count)s entries', count=recent_time_entries|length) }} | {{ _('Total hours') }}: {{ "%.2f"|format(recent_time_entries|sum(attribute='duration_hours')) }}h
{{ _('No recent time entries found.') }}
{% endif %}{{ _('No notes yet. Add a note to keep track of important information about this client.') }}