diff --git a/HISTORY.rst b/HISTORY.rst
index 74e3f54e1e..69d68f7cd0 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -195,6 +195,10 @@
- Moved the navigation templates from the appearance app to the
navigation app.
- Moved the dashboard and dashboard widgets to their own app.
+- Converted the calculate form title template into a template tag.
+ The result of the template tag is applied as the title property
+ of the H3 HTML tag allowing users to view the full title on
+ mouse hover if it was truncated.
3.1.9 (2018-11-01)
==================
diff --git a/mayan/apps/appearance/settings.py b/mayan/apps/appearance/settings.py
index 5a53ef6719..da05640a5e 100644
--- a/mayan/apps/appearance/settings.py
+++ b/mayan/apps/appearance/settings.py
@@ -7,6 +7,7 @@ from mayan.apps.smart_settings import Namespace
from .literals import DEFAULT_MAXIMUM_TITLE_LENGTH
namespace = Namespace(name='appearance', label=_('Appearance'))
+
setting_max_title_length = namespace.add_setting(
default=DEFAULT_MAXIMUM_TITLE_LENGTH,
global_name='APPEARANCE_MAXIMUM_TITLE_LENGTH', help_text=_(
diff --git a/mayan/apps/appearance/templates/appearance/calculate_form_title.html b/mayan/apps/appearance/templates/appearance/calculate_form_title.html
index 8e152170ca..8da8e72972 100644
--- a/mayan/apps/appearance/templates/appearance/calculate_form_title.html
+++ b/mayan/apps/appearance/templates/appearance/calculate_form_title.html
@@ -1,42 +1,15 @@
{% load i18n %}
-{% load smart_settings_tags %}
+{% load common_tags %}
-{% smart_setting 'APPEARANCE_MAXIMUM_TITLE_LENGTH' as maximum_title_length %}
+{% common_calculate_title as form_title %}
{% if not non_html_title %}
-
+
{% endif %}
-
- {% if title %}
- {{ title|truncatechars:maximum_title_length }}
- {% else %}
- {% if delete_view %}
- {% trans 'Confirm delete' %}
- {% else %}
- {% if form %}
- {% if object %}
- {% blocktrans with object as object %}Edit: {{ object }}{% endblocktrans %}
- {% else %}
- {% trans 'Confirm' %}
- {% endif %}
- {% else %}
- {% if read_only %}
- {% blocktrans %}Details for: {{ object }}{% endblocktrans %}
- {% else %}
- {% if object %}
- {% blocktrans with object as object %}Edit: {{ object }}{% endblocktrans %}
- {% else %}
- {% trans 'Create' %}
- {% endif %}
- {% endif %}
- {% endif %}
- {% endif %}
- {% endif %}
-
+ {{ form_title }}
{% if not non_html_title %}
-
{% if subtitle %}
{{ subtitle }}
{% endif %}
diff --git a/mayan/apps/common/classes.py b/mayan/apps/common/classes.py
index 18db047f6f..08f4102488 100644
--- a/mayan/apps/common/classes.py
+++ b/mayan/apps/common/classes.py
@@ -4,7 +4,6 @@ import hashlib
from django.apps import apps
from django.db import models
-from django.template import loader
from django.template.response import TemplateResponse
from django.urls import reverse
from django.utils.encoding import force_text, python_2_unicode_compatible
diff --git a/mayan/apps/common/templatetags/common_tags.py b/mayan/apps/common/templatetags/common_tags.py
index daaf3975c0..71b1606d35 100644
--- a/mayan/apps/common/templatetags/common_tags.py
+++ b/mayan/apps/common/templatetags/common_tags.py
@@ -3,10 +3,13 @@ from __future__ import unicode_literals
from json import dumps
from django.template import Context, Library
+from django.template.defaultfilters import truncatechars
from django.template.loader import get_template
from django.utils.encoding import force_text
+from django.utils.translation import ugettext_lazy as _
import mayan
+from mayan.apps.appearance.settings import setting_max_title_length
from ..classes import Collection
from ..literals import MESSAGE_SQLITE_WARNING
@@ -58,3 +61,28 @@ def render_subtemplate(context, template_name, template_context):
new_context = Context(context.flatten())
new_context.update(Context(template_context))
return get_template(template_name).render(new_context.flatten())
+
+
+@register.simple_tag(takes_context=True)
+def common_calculate_title(context):
+ if context.get('title'):
+ return truncatechars(
+ value=context.get('title'), arg=setting_max_title_length.value
+ )
+ else:
+ if context.get('delete_view'):
+ return _('Confirm delete')
+ else:
+ if context.get('form'):
+ if context.get('object'):
+ return _('Edit %s') % context.get('object')
+ else:
+ return _('Confirm')
+ else:
+ if context.get('read_only'):
+ return _('Details for: %s') % context.get('object')
+ else:
+ if context.get('object'):
+ return _('Edit: %s') % context.get('object')
+ else:
+ return _('Create')