From 81d774880e3dc871ab46a9921c5a4e01643c8459 Mon Sep 17 00:00:00 2001 From: Jon Date: Wed, 14 Aug 2024 00:02:25 +0930 Subject: [PATCH] feat(base): create detail view templates purpose is to aid in the development of a detail form #22 #24 #226 --- app/project-static/content.css | 168 ++++++++++++------ app/project-static/functions.js | 16 ++ app/templates/base.html.j2 | 1 + app/templates/content/field.html.j2 | 72 ++++++++ app/templates/content/section.html.j2 | 93 ++++++++++ app/templates/detail.html.j2 | 33 ++++ .../media/layout-template-view-base.png | Bin 0 -> 23492 bytes .../media/layout-template-view-detail.drawio | 46 +++++ .../media/layout-template-view-detail.png | Bin 0 -> 33554 bytes .../centurion_erp/development/templates.md | 48 +++++ 10 files changed, 422 insertions(+), 55 deletions(-) create mode 100644 app/project-static/functions.js create mode 100644 app/templates/content/field.html.j2 create mode 100644 app/templates/content/section.html.j2 create mode 100644 app/templates/detail.html.j2 create mode 100644 docs/projects/centurion_erp/development/media/layout-template-view-base.png create mode 100644 docs/projects/centurion_erp/development/media/layout-template-view-detail.drawio create mode 100644 docs/projects/centurion_erp/development/media/layout-template-view-detail.png diff --git a/app/project-static/content.css b/app/project-static/content.css index 80f5de1e1..e18271206 100644 --- a/app/project-static/content.css +++ b/app/project-static/content.css @@ -65,6 +65,119 @@ input[type=submit] { height: 30px; margin: 10px; } + + + + +/* Style the navigation tabs at the top of a content page */ +.content-navigation-tabs { + display: block; + overflow: hidden; + border-bottom: 1px solid #ccc; + /* background-color: #f1f1f1; */ + width: 100%; + text-align: left; + padding: 0px; + margin: 0px +} + + +.content-navigation-tabs-link { + border: 0px; + margin: none; + padding: none; +} + +/* Style the buttons that are used to open the tab content */ +.content-navigation-tabs button { + display: inline; + background-color: inherit; + float: left; + border: none; + outline: none; + cursor: pointer; + margin: 0px; + padding: 0px; + padding: 14px 16px; + transition: 0.3s; + font-size: inherit; + color: #6a6e73; +} + + +/* Change background color of buttons on hover */ +.content-navigation-tabs button:hover { + /* background-color: #ddd; */ + border-bottom: 3px solid #ccc; +} + + +/* Create an active/current tablink class */ +.content-navigation-tabs button.active { + /* background-color: #ccc; */ + border-bottom: 3px solid #177ee6; +} + + + +/* Style content for each tab */ +.content-tab { + width: 100%; + display: none; + padding-bottom: 0px; + border: none; + border-top: none; +} + +.content-tab hr { + border: none; + border-top: 1px solid #ccc; +} + +.content-tab pre { + word-wrap: break-word; + white-space: pre-wrap; +} + +/* Style for section fields on details page */ +.detail-view-field { + display: unset; + height: 30px; + line-height: 30px; + padding: 0px 20px 40px 20px; + +} + +.detail-view-field label { + display: inline-block; + font-weight: bold; + width: 200px; + margin: 10px; + height: 30px; + line-height: 30px; + +} + +.detail-view-field span { + display: inline-block; + width: 340px; + margin: 10px; + border-bottom: 1px solid #ccc; + height: 30px; + line-height: 30px; + +} + + + + + + + + + + + /******************************************************************************* EoF refactored @@ -124,61 +237,6 @@ input[type=checkbox]:checked::after { -/* Style the tab */ -.tab { - display: block; - overflow: hidden; - border-bottom: 1px solid #ccc; - /* background-color: #f1f1f1; */ - width: 100%; - text-align: left; - padding: 0px; - margin: 0px -} - -.tablinks { - border: 0px; - margin: none; - padding: none; -} - -/* Style the buttons that are used to open the tab content */ -.tab button { - display: inline; - background-color: inherit; - float: left; - border: none; - outline: none; - cursor: pointer; - margin: 0px; - padding: 0px; - padding: 14px 16px; - transition: 0.3s; - font-size: inherit; - color: #6a6e73; -} - -/* Change background color of buttons on hover */ -.tab button:hover { - /* background-color: #ddd; */ - border-bottom: 3px solid #ccc; -} - -/* Create an active/current tablink class */ -.tab button.active { - /* background-color: #ccc; */ - border-bottom: 3px solid #177ee6; -} - -/* Style the tab content */ -.tabcontent { - width: 100%; - display: none; - /* padding: 6px 12px; */ - padding-bottom: 0px; - border: none; - border-top: none; -} table { width: 100%; diff --git a/app/project-static/functions.js b/app/project-static/functions.js new file mode 100644 index 000000000..cf2c74f12 --- /dev/null +++ b/app/project-static/functions.js @@ -0,0 +1,16 @@ +function openContentNavigationTab(evt, TabName) { + var i, tabcontent, tablinks; + + tabcontent = document.getElementsByClassName("content-tab"); + for (i = 0; i < tabcontent.length; i++) { + tabcontent[i].style.display = "none"; + } + + tablinks = document.getElementsByClassName("content-navigation-tabs-link"); + for (i = 0; i < tablinks.length; i++) { + tablinks[i].className = tablinks[i].className.replace(" active", ""); + } + + document.getElementById(TabName).style.display = "block"; + evt.currentTarget.className += " active"; +} diff --git a/app/templates/base.html.j2 b/app/templates/base.html.j2 index 585c648c4..712f2e90b 100644 --- a/app/templates/base.html.j2 +++ b/app/templates/base.html.j2 @@ -14,6 +14,7 @@ + {% endif %} diff --git a/app/templates/content/field.html.j2 b/app/templates/content/field.html.j2 new file mode 100644 index 000000000..76b77f858 --- /dev/null +++ b/app/templates/content/field.html.j2 @@ -0,0 +1,72 @@ +{% load json %} +{% load markdown %} + +{% if field.widget_type == 'textarea' or field.label == 'Notes' %} + + {% if field.name in section.json and field.value %} + +
{{ field.value.strip | json_pretty | safe }}
+ + {% elif field.name in section.markdown or field.label == 'Notes' %} + + {% if field.label == 'Notes' %} + +
+ + +
+ {% if field.value %} + {{ field.value | markdown | safe }} + {% else %} +   + {% endif %} +
+
+ + {% else %} + + {% if field.value %} + + {{ field.value | markdown | safe }} + + {% else %} + +   + + {% endif %} + + {% endif %} + + {% elif not field.value %} + +   + + {% endif %} + + +{% else %} + + +
+ + + {% if field.field.choices %} {# Display the selected choice text value #} + {% for id, value in field.field.choices %} + + {% if field.value == id %} + + {{ value }} + + {% endif %} + + {%endfor%} + + {% else %} + {{ field.value }} + {% endif %} + +
+ +{% endif %} diff --git a/app/templates/content/section.html.j2 b/app/templates/content/section.html.j2 new file mode 100644 index 000000000..c6c18bd19 --- /dev/null +++ b/app/templates/content/section.html.j2 @@ -0,0 +1,93 @@ +{% load json %} +{% load markdown %} + +{% for section in tab.sections %} + + + {% if forloop.first %} + +

{{ tab.name }}

+ + {% else %} + +
+

{{ section.name }}

+ + {% endif %} + +
+ + {% if section.layout == 'single' %} + + {% for section_field in section.fields %} + {% for field in form %} + + {% if field.name in section_field %} + + {% include 'content/field.html.j2' %} + + {% endif %} + + {% endfor %} + {% endfor %} + + {% elif section.layout == 'double' %} + + {% if section.left %} + +
+ + {% for section_field in section.left %} + {% for field in form %} + + {% if field.name in section_field %} + + {% include 'content/field.html.j2' %} + + {% endif %} + + {% endfor %} + {% endfor %} + +
+ + {% endif %} + + + {% if section.right %} + +
+ + {% for section_field in section.right %} + {% for field in form %} + + {% if field.name in section_field %} + + {% include 'content/field.html.j2' %} + + {% endif %} + + {% endfor %} + {% endfor %} + +
+ + {% endif %} + + {% endif %} + + {% if forloop.first %} + + {% if tab.edit_url %} + +
+ +
+ + {% endif %} + + {% endif %} + +
+ +{% endfor %} diff --git a/app/templates/detail.html.j2 b/app/templates/detail.html.j2 new file mode 100644 index 000000000..35d54ee23 --- /dev/null +++ b/app/templates/detail.html.j2 @@ -0,0 +1,33 @@ +{% extends 'base.html.j2' %} + +{% block content %} + +
+ + + + {% for key, tab in form.tabs.items %} + + {% if forloop.first %} + + + + {% else %} + + + + {% endif %} + + {% endfor %} + +
+ +{% block tabs %}{% endblock %} + +{% endblock %} \ No newline at end of file diff --git a/docs/projects/centurion_erp/development/media/layout-template-view-base.png b/docs/projects/centurion_erp/development/media/layout-template-view-base.png new file mode 100644 index 0000000000000000000000000000000000000000..f5668551a50d1cb33753341b6e5d9b07d5112c62 GIT binary patch literal 23492 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/projects/centurion_erp/development/media/layout-template-view-detail.png b/docs/projects/centurion_erp/development/media/layout-template-view-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..ef245ff61c6274a704629ea45c7e86f9d54ff2ea GIT binary patch literal 33554 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

Z`B_BRDpdGo=Be4z5C?AQ$YK=HFgY0-ym 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 literal 0 HcmV?d00001 diff --git a/docs/projects/centurion_erp/development/templates.md b/docs/projects/centurion_erp/development/templates.md index 5758fc9b7..36d5cf041 100644 --- a/docs/projects/centurion_erp/development/templates.md +++ b/docs/projects/centurion_erp/development/templates.md @@ -7,3 +7,51 @@ about: https://gitlab.com/nofusscomputing/infrastructure/configuration-managemen --- This section of the documentation contains the details related to the templates used within Centurion ERP for rendering data for the end user to view. +The base template is common to all templates and is responsible for the rendering of the common layout. Each subsequent template includes this template. This enables **ALL** pages within the site to share the same layout. + +![Base template layout](./media/layout-template-view-base.png) + +Point of note is that the orange area of the template is what each template is "filling out." + +This view contains the following areas: + +- Page Header +- Navigation +- Page Title +- Content Area +- Page footer + +!!! note + This template should not be included directly as it is incomplete and requires subsequent templates to populate the contents of the orange area. + + +## Detail + +This template is intended to be used to render the details of a single model. The layout of the detail view is as follows: + +![detail layout](./media/layout-template-view-detail.png) + +This view contains the following areas: + +- Section navigation tabs +- Section Content + +The page title represents the "what" to the contents of the page. i.e. for a device this would be the device name. A detail page contains navigation tabs to aid in displaying multiple facets of an item, with each "tabbed" page containing one or more sections. Point of note is that the tabs are only rendered within the top section of each "tabbed" page. + +Base definition for defining a detail page is as follows: + +``` jinja + +{% extends 'detail.html.j2' %} + +{% load json %} +{% load markdown %} + + +{% block tabs %} + + your tabs content here + +{% endblock %} + +```