From 10ae616b1c24098ae94feb55ebf71a6199bd8b14 Mon Sep 17 00:00:00 2001 From: Jay Shah <602425+jshah4517@users.noreply.github.com> Date: Wed, 1 Apr 2020 15:05:05 +0100 Subject: [PATCH] Version 3.0.0-beta.2 --- core/dashboard.twig | 136 ++++++++++++++++ core/maintenance.twig | 21 +++ core/search.twig | 23 +++ errors/401.twig | 18 +++ errors/403.twig | 18 +++ errors/404.twig | 18 +++ errors/405.twig | 18 +++ footer_common.twig | 23 +++ forms/custom_fields.twig | 137 ++++++++++++++++ head_common.twig | 18 +++ header.twig | 0 index.twig | 222 ++++++++++++++++++++++++++ navigation.twig | 87 ++++++++++ selfservice/article.twig | 189 ++++++++++++++++++++++ selfservice/article_attachments.twig | 33 ++++ selfservice/article_details.twig | 29 ++++ selfservice/article_list.twig | 40 +++++ selfservice/article_related.twig | 20 +++ selfservice/category.twig | 32 ++++ selfservice/category_list.twig | 25 +++ selfservice/comment.twig | 83 ++++++++++ selfservice/feedback.twig | 9 ++ selfservice/forms/comment.twig | 53 ++++++ selfservice/hierarchical.twig | 39 +++++ selfservice/list.twig | 20 +++ selfservice/sidebar.twig | 40 +++++ selfservice/tag.twig | 23 +++ sidebar.twig | 0 ticket/entire_message.twig | 61 +++++++ ticket/feedback.twig | 53 ++++++ ticket/forms/message.twig | 93 +++++++++++ ticket/forms/submit_ticket_step1.twig | 66 ++++++++ ticket/forms/submit_ticket_step2.twig | 28 ++++ ticket/forms/submit_ticket_step3.twig | 216 +++++++++++++++++++++++++ ticket/message.twig | 92 +++++++++++ ticket/ticket.twig | 165 +++++++++++++++++++ ticket/ticket_custom_fields.twig | 11 ++ ticket/ticket_details.twig | 42 +++++ ticket/ticket_grid.twig | 103 ++++++++++++ ticket/ticket_messages.twig | 7 + ticket/track.twig | 34 ++++ user/change_password.twig | 55 +++++++ user/confirm.twig | 27 ++++ user/email.twig | 112 +++++++++++++ user/email_history.twig | 17 ++ user/forms/organisation.twig | 44 +++++ user/forms/organisation_profile.twig | 35 ++++ user/forms/twofa.twig | 40 +++++ user/forms/user_profile.twig | 112 +++++++++++++ user/linked_account.twig | 39 +++++ user/login.twig | 105 ++++++++++++ user/login_twofa.twig | 40 +++++ user/login_twofa_setup.twig | 32 ++++ user/organisation.twig | 171 ++++++++++++++++++++ user/organisation_add.twig | 50 ++++++ user/password_reset.twig | 39 +++++ user/profile.twig | 84 ++++++++++ user/register.twig | 101 ++++++++++++ user/reset_complete.twig | 21 +++ user/reset_confirm.twig | 67 ++++++++ user/set_password.twig | 53 ++++++ user/twofa.twig | 56 +++++++ 62 files changed, 3645 insertions(+) create mode 100644 core/dashboard.twig create mode 100644 core/maintenance.twig create mode 100644 core/search.twig create mode 100644 errors/401.twig create mode 100644 errors/403.twig create mode 100644 errors/404.twig create mode 100644 errors/405.twig create mode 100644 footer_common.twig create mode 100644 forms/custom_fields.twig create mode 100644 head_common.twig create mode 100644 header.twig create mode 100644 index.twig create mode 100644 navigation.twig create mode 100644 selfservice/article.twig create mode 100644 selfservice/article_attachments.twig create mode 100644 selfservice/article_details.twig create mode 100644 selfservice/article_list.twig create mode 100644 selfservice/article_related.twig create mode 100644 selfservice/category.twig create mode 100644 selfservice/category_list.twig create mode 100644 selfservice/comment.twig create mode 100644 selfservice/feedback.twig create mode 100644 selfservice/forms/comment.twig create mode 100644 selfservice/hierarchical.twig create mode 100644 selfservice/list.twig create mode 100644 selfservice/sidebar.twig create mode 100644 selfservice/tag.twig create mode 100644 sidebar.twig create mode 100644 ticket/entire_message.twig create mode 100644 ticket/feedback.twig create mode 100644 ticket/forms/message.twig create mode 100644 ticket/forms/submit_ticket_step1.twig create mode 100644 ticket/forms/submit_ticket_step2.twig create mode 100644 ticket/forms/submit_ticket_step3.twig create mode 100644 ticket/message.twig create mode 100644 ticket/ticket.twig create mode 100644 ticket/ticket_custom_fields.twig create mode 100644 ticket/ticket_details.twig create mode 100644 ticket/ticket_grid.twig create mode 100644 ticket/ticket_messages.twig create mode 100644 ticket/track.twig create mode 100644 user/change_password.twig create mode 100644 user/confirm.twig create mode 100644 user/email.twig create mode 100644 user/email_history.twig create mode 100644 user/forms/organisation.twig create mode 100644 user/forms/organisation_profile.twig create mode 100644 user/forms/twofa.twig create mode 100644 user/forms/user_profile.twig create mode 100644 user/linked_account.twig create mode 100644 user/login.twig create mode 100644 user/login_twofa.twig create mode 100644 user/login_twofa_setup.twig create mode 100644 user/organisation.twig create mode 100644 user/organisation_add.twig create mode 100644 user/password_reset.twig create mode 100644 user/profile.twig create mode 100644 user/register.twig create mode 100644 user/reset_complete.twig create mode 100644 user/reset_confirm.twig create mode 100644 user/set_password.twig create mode 100644 user/twofa.twig diff --git a/core/dashboard.twig b/core/dashboard.twig new file mode 100644 index 0000000..6af35f6 --- /dev/null +++ b/core/dashboard.twig @@ -0,0 +1,136 @@ +{% extends parent_template %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('general.home') }} +{% endblock %} + +{% block precontent %} + {% if isModuleEnabled('Selfservice') %} +
+
+ +
+
+ {% endif %} +{% endblock %} + +{% block content %} + + {% if not isModuleEnabled('Ticket') and not isModuleEnabled('Selfservice') %} + + {{ Lang.get('core.no_modules') }} + + {% else %} + + {% if isModuleEnabled('Ticket') %} +
+ +
+
+ {{ Lang.get('core.submit_ticket') }} +
+
+

{{ Lang.get('core.submit_ticket') }}

+

{{ Lang.get('core.submit_ticket_desc') }}

+
+
+
+ {% if not auth_check() and Config.get('channel.web.settings.unauthenticated_users') %} + +
+
+ {{ Lang.get('core.track_ticket') }} +
+
+

{{ Lang.get('core.track_ticket') }}

+

{{ Lang.get('core.track_ticket_desc') }}

+
+
+
+ {% elseif auth_check() %} + +
+
+ {{ Lang.get('core.my_tickets') }} +
+
+

{{ Lang.get('core.my_tickets') }}

+

{{ Lang.get('core.my_tickets_desc') }}

+
+
+
+ {% endif %} +
+ {% endif %} + + {% if isModuleEnabled('Selfservice') %} + {% for type in types %} + {% set isCollapsible = not type.articles.isEmpty() and type.content == 0 and type.show_on_dashboard %} + +
+
+
+
+ + {{ type.name }} + +
+
+

{{ type.name }}

+

{{ type.description }}

+
+
+ + {% if isCollapsible %} + + + + {% endif %} +
+ {% if isCollapsible %} +
+ {% include 'frontend.' ~ template ~ '.selfservice.article_list' with {'articles': type.articles, 'noRssFeed': true} %} + + +
+ {% endif %} +
+ {% endfor %} + {% endif %} + {% endif %} + + {{ View.fireHook('frontend.dashboard') }} + +{% endblock %} + +{% block scripts_footer %} + +{% endblock %} diff --git a/core/maintenance.twig b/core/maintenance.twig new file mode 100644 index 0000000..0579fe2 --- /dev/null +++ b/core/maintenance.twig @@ -0,0 +1,21 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('general.maintenance') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('general.maintenance') }} +{% endblock %} + +{% block content %} + +

{{ Lang.get('core.maintenance') }}

+ +
+ +
+ {{ Lang.get('core.maintenance_desc') }} +
+
+ +{% endblock %} \ No newline at end of file diff --git a/core/search.twig b/core/search.twig new file mode 100644 index 0000000..13d0f2e --- /dev/null +++ b/core/search.twig @@ -0,0 +1,23 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('core.search_results') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('core.search_results') }} +{% endblock %} + +{% block content %} + + {{ Lang.get('core.found_results', {'total': total}) }} '{{ Request.input('query') }}'. + + {% if total > 0 %} +
+ + {% + include 'frontend.' ~ template ~ '.selfservice.article_list' + with {'articles': articles, 'noRssFeed': true, 'show_pinned': false} + %} + {% endif %} + +{% endblock %} \ No newline at end of file diff --git a/errors/401.twig b/errors/401.twig new file mode 100644 index 0000000..1e07502 --- /dev/null +++ b/errors/401.twig @@ -0,0 +1,18 @@ +{% extends parent_template %} + +{% block title %} + 401 - {{ Lang.get('messages.unauthorised') }} +{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('messages.error') }} (401) +{% endblock %} + +{% block content %} + +

{{ Lang.get('messages.not_authorised') }} {{ Lang.get('messages.please_report') }}

+ +

{{ Lang.get('messages.return_to', {'page': '' ~ mb_strtolower(Lang.get('general.previous_page'), 'UTF-8') ~ ''})|raw }}

+ +{% endblock %} \ No newline at end of file diff --git a/errors/403.twig b/errors/403.twig new file mode 100644 index 0000000..88b29ae --- /dev/null +++ b/errors/403.twig @@ -0,0 +1,18 @@ +{% extends parent_template %} + +{% block title %} + 403 - {{ Lang.get('messages.forbidden') }} +{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('messages.error') }} (403) +{% endblock %} + +{% block content %} + +

{{ Lang.get('messages.forbidden') }}.
{{ Lang.get('messages.please_report') }}

+ +

{{ Lang.get('messages.return_to', {'page': '' ~ mb_strtolower(Lang.get('general.previous_page'), 'UTF-8') ~ ''})|raw }}

+ +{% endblock %} \ No newline at end of file diff --git a/errors/404.twig b/errors/404.twig new file mode 100644 index 0000000..5ee1887 --- /dev/null +++ b/errors/404.twig @@ -0,0 +1,18 @@ +{% extends parent_template %} + +{% block title %} + 404 - {{ Lang.get('messages.page_not_found') }} +{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('messages.error') }} (404) +{% endblock %} + +{% block content %} + +

{{ Lang.get('messages.cant_find_page') }} {{ Lang.get('messages.please_report') }}

+ +

{{ Lang.get('messages.return_to', {'page': '' ~ mb_strtolower(Lang.get('general.support_portal'), 'UTF-8') ~ ''})|raw }}

+ +{% endblock %} \ No newline at end of file diff --git a/errors/405.twig b/errors/405.twig new file mode 100644 index 0000000..e697c27 --- /dev/null +++ b/errors/405.twig @@ -0,0 +1,18 @@ +{% extends parent_template %} + +{% block title %} + 405 - {{ Lang.get('messages.page_not_found') }} +{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('messages.error') }} (405) +{% endblock %} + +{% block content %} + +

{{ Lang.get('messages.cant_find_page') }} {{ Lang.get('messages.please_report') }}

+ +

{{ Lang.get('messages.return_to', {'page': '' ~ mb_strtolower(Lang.get('general.support_portal'), 'UTF-8') ~ ''})|raw }}

+ +{% endblock %} \ No newline at end of file diff --git a/footer_common.twig b/footer_common.twig new file mode 100644 index 0000000..f00e97c --- /dev/null +++ b/footer_common.twig @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/forms/custom_fields.twig b/forms/custom_fields.twig new file mode 100644 index 0000000..a4da256 --- /dev/null +++ b/forms/custom_fields.twig @@ -0,0 +1,137 @@ +{% for customfield in customfields %} + {# If we don't wish to lock fields on new forms #} + {% if new is defined and new %} + {% set customfield = customfield|merge({'locked': 0}) %} + {% elseif ticket|default is not empty and ticket.locked == 1 %} + {% set customfield = customfield|merge({'locked': 1}) %} + {% endif %} + + {% set attributes = { 'data-depends-on': customfield.depends_on_option_id } %} +
+ + {{ form_label('customfield[' ~ customfield.id ~ ']', customfield.name) }} +
+ {% if customfield.type == 0 %} + +
+ + + {% elseif customfield.type == 1 %} + + + {% elseif customfield.type == 2 %} + {% if not customfield.required %} + {# Filler value for when the checklist is not required and submitted with no values, do not delete! #} + + {% endif %} + {% for key, option in customfield.options %} + + {% if not loop.last %} +
+ {% endif %} + {% endfor %} + + {% elseif customfield.type == 3 %} + {{ form_text('customfield[' ~ customfield.id ~ ']', + customfield.value|default is not empty ? timeWithOffset(customfield.value, false)|date(Config.get('settings.date_format')) : null, + {'class': 'datepicker sp-w-40', 'placeholder': '', 'disabled': (customfield.value is not empty and customfield.locked ? 'disabled' : null)}) }} + + {% elseif customfield.type == 4 %} + {{ form_select('customfield[' ~ customfield.id ~ '][]', customfield.options, + customfield.value, + {'multiple': 'multiple', 'disabled': customfield.value is not empty and customfield.locked ? 'disabled' : null}) }} + + {% elseif customfield.type == 5 %} + {{ form_select('customfield[' ~ customfield.id ~ ']', {'': Lang.get('customfield.please_select')} + customfield.options, + customfield.value, (customfield.value is not empty and customfield.locked ? {'disabled': 'disabled'} : {})) }} + + {% elseif customfield.type == 6 %} + {# The min-width is required for IE as otherwise password fields look incorrect with hideShowPassword, do not delete! #} + {{ form_password('customfield[' ~ customfield.id ~ ']', + (customfield.value is not empty and customfield.locked ? {'disabled': 'disabled'} : {})|merge({'autocomplete': 'new-password', 'style': 'min-width: 300px;'})) + }} + {% if customfield.value is not empty %} +
({{ Lang.get('general.only_enter_to_change') }})
+ {% endif %} + + {% elseif customfield.type == 7 %} + {% for key, option in customfield.options %} + + {% if not loop.last %} +
+ {% endif %} + {% endfor %} + + {% elseif customfield.type == 8 %} + {{ form_text('customfield[' ~ customfield.id ~ ']', customfield.value is not null and not customfield.encrypted ? customfield.value : null, + customfield.value is not empty and customfield.locked ? {'disabled': 'disabled'} : {}) }} + {% if customfield.value is not null and customfield.encrypted %} +
({{ Lang.get('general.only_enter_to_change') }})
+ {% endif %} + + {% elseif customfield.type == 9 %} + {{ form_redactor('customfield[' ~ customfield.id ~ ']', customfield.value is not null and not customfield.encrypted ? customfield.value : null, + customfield.value is not empty and customfield.locked ? {'rows': 5, 'class': 'sp-w-full', 'disabled': 'disabled'} : {'rows': 5, 'class': 'sp-w-full'}) }} + {% if customfield.value is not null and customfield.encrypted %} +
({{ Lang.get('general.only_enter_to_change') }})
+ {% endif %} + + {% elseif customfield.type == 10 %} +
+
+
+ {% for i in 1..5 %} +
{{ i }}
+ {% endfor %} +
+ {% for key, option in customfield.options %} +
+
{{ option }}
+ {% for i in 1..5 %} +
+ {{ form_radio('customfield[' ~ customfield.id ~ '][' ~ key ~ ']', i, + customfield.value is not empty and array_key_exists(key, customfield.value) and customfield.value[key] == i ? true : false, + customfield.value is not empty and customfield.locked ? {'class': 'sp-m-0', 'disabled': 'disabled'} : {'class': 'sp-m-0'}) }} +
+ {% endfor %} +
+ {% endfor %} +
+ {% endif %} + {% if customfield.description is not empty %} +
{{ customfield.description }}
+ {% endif %} +
+
+{% endfor %} \ No newline at end of file diff --git a/head_common.twig b/head_common.twig new file mode 100644 index 0000000..f77d309 --- /dev/null +++ b/head_common.twig @@ -0,0 +1,18 @@ + + + + + + + + + + + +{% if Config.get('settings.favicon') is not empty %} + +{% endif %} + + +{{ colourScheme|raw }} + diff --git a/header.twig b/header.twig new file mode 100644 index 0000000..e69de29 diff --git a/index.twig b/index.twig new file mode 100644 index 0000000..94b0740 --- /dev/null +++ b/index.twig @@ -0,0 +1,222 @@ + + + + + {% block meta %}{% endblock %} + + {{ company }} - {% block title %}{{ Lang.get('general.support_portal') }}{% endblock %} + + {% include 'frontend.' ~ template ~ '.head_common' %} + + {% block scripts_header %}{% endblock %} + + {{ View.fireHook('frontend.head') }} + + {% set route = Route.currentRouteName() %} + + + + + {{ View.fireHook('frontend.body_start') }} + +
+
+ {{ View.fireHook('frontend.header_start') }} + + + +
+ + +
+ {% if not (route starts with 'core.frontend.home') and isModuleEnabled('Selfservice') %} + + + + {% endif %} +
+ +
+ {% if Config.get('settings.website_url') is not empty %} + + {{ Lang.get('core.back_to_website') }} + + {% elseif isModuleEnabled('Ticket') %} + + {{ Lang.get('core.submit_ticket') }} + + {% endif %} + + {% if auth_check() %} +
+ +   + {{ auth_user().formatted_name }} + + +
+ {% include 'frontend.' ~ template ~ '.navigation' with {'account': true} %} +
+
+ {% else %} + + {{ Lang.get('user.login') }} + + {% endif %} +
+ +
+
+
+ + + +
+
+
+
+ + {% block header %}{% endblock %} + + {{ View.fireHook('frontend.header_end') }} +
+
+ + + + {% block precontent %}{% endblock %} + +
+
+ + {{ View.fireHook('frontend.wrapper_start') }} + +
+

+ {{ block('title') }} +

+ +
+ {{ Lang.get('general.support_portal') }}  »  + {% block breadcrumb %}{% endblock %} +
+ +
+
+ +
+ +
+ + {{ View.fireHook('frontend.content_start') }} + +
+ + {{ View.fireHook('frontend.content_inner_start') }} + + {% block subtitle %}{% endblock %} + + +
+ + {% if Session.has('success') %} +
{{ Session.get('success')|raw }}
+ {% elseif Session.has('error') %} +
{{ Session.get('error')|raw }}
+ {% elseif Session.has('warning') %} +
{{ Session.get('warning')|raw }}
+ {% endif %} + + {% if errors|default is not empty and errors.count() %} +
+ {{ Lang.get('messages.please_correct') }}
+ {% for error in errors.all() %} + {{ error }}
+ {% endfor %} +
+ {% endif %} + + {% block content %}{% endblock %} + + {{ View.fireHook('frontend.content_inner_end') }} + +
+ + {{ View.fireHook('frontend.content_end') }} + +
+ + {% block sidebar %}{% endblock %} + + {{ View.fireHook('frontend.wrapper_end') }} +
+ +
+
+ +
+
+
+
+ + © {{ company }} + +
+ {% if Config.get('settings.language_frontend_toggle') == 1 %} +
+   + +
+ {% endif %} +
+
+
+ + {{ View.fireHook('frontend.footer') }} + + {% include 'frontend.' ~ template ~ '.footer_common' %} + + + + {% block scripts_footer %}{% endblock %} + + {{ View.fireHook('frontend.body_end') }} + + + + diff --git a/navigation.twig b/navigation.twig new file mode 100644 index 0000000..6910e1c --- /dev/null +++ b/navigation.twig @@ -0,0 +1,87 @@ + diff --git a/selfservice/article.twig b/selfservice/article.twig new file mode 100644 index 0000000..39bb603 --- /dev/null +++ b/selfservice/article.twig @@ -0,0 +1,189 @@ +{% extends parent_template %} + +{% block meta %} + +{% endblock %} + +{% block title %}{{ article.title }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ type.name }}  »  + {{ Lang.get('selfservice.viewing_article') }} +{% endblock %} + +{% block sidebar %} + {% include 'frontend.' ~ template ~ '.selfservice.sidebar' %} + {{ parent() }} +{% endblock %} + +{% block precontent %} +
+
+ {{ Lang.get('messages.error_loading_comments') }} +
+
+{% endblock %} + +{% block content %} + + +   + {{ Lang.get('general.print') }} + + + + {% include 'frontend.' ~ template ~ '.selfservice.article_details' %} + +
+ + +
{{ article.purified_text|raw }}
+ + + {% include 'frontend.' ~ template ~ '.selfservice.article_attachments' %} + +
+ +
+ +
+ {{ Lang.get('general.share_via') }} + + + + + + + +
+ + + {% if Config.get('settings.ratings_enabled') %} +
+ {% if not rated and (Config.get('settings.rating_post') == '0' or auth_check()) %} +
+ {{ Lang.get('selfservice.article_find_useful') }}   + +
+ {% elseif rated %} + {{ Lang.get('selfservice.thank_you_for_feedback') }} + {% endif %} +
+ {% endif %} +
+ + {% if related is defined and not related.isEmpty() %} +

{{ Lang.get('selfservice.related_articles') }}

+ + {% include 'frontend.' ~ template ~ '.selfservice.article_related' %} + {% endif %} + + + {% if Config.get('settings.comments_enabled') + and (article.comments is not empty or Config.get('settings.comment_write') == 0 or auth_check()) + %} +
+ + + +

{{ Lang.choice('selfservice.comment', 2) }}

+ + {% if Session.has('comment_success') %} +
{{ Session.get('comment_success') }}
+ {% elseif Session.has('comment_error') %} +
{{ Session.get('comment_error') }}
+ {% endif %} + + {% if Config.get('settings.comment_write') == 0 or auth_check() %} +
+ {{ Lang.get('general.add_item', {'item': Lang.choice('selfservice.comment', 1)}) }} + + + +
+
+ {% include 'frontend.' ~ template ~ '.selfservice.forms.comment' with { type: type.id } %} +
+ {% else %} +

{{ Lang.get('selfservice.login_to_comment') }}

+ {% endif %} + + {% if article.comments is not empty %} +
+ {{ Lang.get('general.order_by') }}:  + + + + + +
+ + {# Show all the comments #} +
+ {% include 'frontend.' ~ template ~ '.selfservice.comment' with {'comments': article.comments, 'type': type.id} %} +
+ + {% if comment_total > article.comments|length %} + + {% endif %} + {% endif %} + {% endif %} + +{% endblock %} + +{% block scripts_footer %} + + + + + + + + + + + + {% if Config.get('settings.captcha_type') != 0 + and (Config.get('settings.comment_captcha') == 2 or (not auth_check() and Config.get('settings.comment_captcha') == 1)) + %} + {{ Captcha.getJs() }} + {% endif %} + + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} diff --git a/selfservice/article_attachments.twig b/selfservice/article_attachments.twig new file mode 100644 index 0000000..5b3ecd9 --- /dev/null +++ b/selfservice/article_attachments.twig @@ -0,0 +1,33 @@ +{% if not article.getAttachments().isEmpty() %} +

{{ Lang.choice('general.attachment', 2) }}

+ +
+ +
+
+ +
+{% endif %} \ No newline at end of file diff --git a/selfservice/article_details.twig b/selfservice/article_details.twig new file mode 100644 index 0000000..ebd7c9e --- /dev/null +++ b/selfservice/article_details.twig @@ -0,0 +1,29 @@ + diff --git a/selfservice/article_list.twig b/selfservice/article_list.twig new file mode 100644 index 0000000..d9c45b2 --- /dev/null +++ b/selfservice/article_list.twig @@ -0,0 +1,40 @@ +{% if not articles.isEmpty() %} + + + {{ articles.render()|raw }} + + {% if type|default is not empty and type.view == 1 and noRssFeed is not defined %} +
+ +   + {{ Lang.get('selfservice.rssfeed') }} + +
+ {% endif %} + +{% else %} + {{ Lang.get('selfservice.no_articles') }} +{% endif %} diff --git a/selfservice/article_related.twig b/selfservice/article_related.twig new file mode 100644 index 0000000..a7d4679 --- /dev/null +++ b/selfservice/article_related.twig @@ -0,0 +1,20 @@ +{% if not related.isEmpty() %} + +{% endif %} \ No newline at end of file diff --git a/selfservice/category.twig b/selfservice/category.twig new file mode 100644 index 0000000..1a11969 --- /dev/null +++ b/selfservice/category.twig @@ -0,0 +1,32 @@ +{% extends parent_template %} + +{% block title %}{{ categoryName }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ type.name }}  »  + {% for category in breadcrumb %} + {{ category.name }}  »  + {% endfor %} + {{ categoryName }} +{% endblock %} + +{% block sidebar %} + {% include 'frontend.' ~ template ~ '.selfservice.sidebar' %} + {{ parent() }} +{% endblock %} + +{% block content %} + + {% if type.view == 0 and not subcategories.isEmpty() %} + {# Show any subcategories if they exist #} + {% include 'frontend.' ~ template ~ '.selfservice.category_list' with {'categories': subcategories, 'none': false} %} + +
+ {% endif %} + + {# Show all articles in category #} +

{{ Lang.choice('selfservice.article', 2) }}

+ {% include 'frontend.' ~ template ~ '.selfservice.article_list' with {'category': false, 'show_pinned': type.view == 1} %} + +{% endblock %} diff --git a/selfservice/category_list.twig b/selfservice/category_list.twig new file mode 100644 index 0000000..19d08ca --- /dev/null +++ b/selfservice/category_list.twig @@ -0,0 +1,25 @@ +

{{ Lang.choice('selfservice.category', 2) }}

+ +{% if not categories.isEmpty() %} +
+ {% for category in categories %} + {% if not category.articles.isEmpty() %} +
+ +   {{ category.name }} ({{ category.count }}) + + +
+ {% endif %} + {% endfor %} +
+{% else %} + {{ Lang.get('selfservice.no_categories_frontend') }} +{% endif %} \ No newline at end of file diff --git a/selfservice/comment.twig b/selfservice/comment.twig new file mode 100644 index 0000000..9e8110d --- /dev/null +++ b/selfservice/comment.twig @@ -0,0 +1,83 @@ +{% if comments is not empty %} +
+ {% for comment in comments %} +
+ + +
+
+ +
+
+
+ + {{ comment.author.formatted_name }} + + {% if comment.author.isOperator %} +  {{ Lang.get('general.staff') }} + {% endif %} +  {{ timeago(comment.created_at) }} +
+ + {% if comment.rating|default is not empty and comment.rating < Config.get('settings.comment_threshold') %} + {{ Lang.get('selfservice.comment_below_threshold') }} +
+ {% else %} +
+ {% endif %} + {{ comment.purified_text|raw }} +
+ +
+ {% if Config.get('settings.comment_ratings') %} + + + +   + + + + + + {% if comment.rating is not empty %} + {{ comment.rating }} + {% else %} + + {% endif %} + + {% if Config.get('settings.comment_write') == 0 or auth_check() %} + · + {% endif %} + {% endif %} + + {% if Config.get('settings.comment_write') == 0 or auth_check() %} + {{ Lang.get('general.reply') }} + {% endif %} +
+ + {% if comment.children is not empty %} + {% if comment.more|default is not empty and comment_ordering == 1 %} + + {% endif %} + + {% include 'frontend.' ~ template ~ '.selfservice.comment' + with {'comments': comment_ordering == 1 ? comment.children|reverse(true) : comment.children} + %} + + {% if comment.more|default is not empty and comment_ordering != 1 %} + + {% endif %} + {% endif %} +
+
+
+ {% endfor %} + +
+{% endif %} \ No newline at end of file diff --git a/selfservice/feedback.twig b/selfservice/feedback.twig new file mode 100644 index 0000000..6ee5963 --- /dev/null +++ b/selfservice/feedback.twig @@ -0,0 +1,9 @@ +{{ Lang.get('ticket.feedback_questions') }} + +

+ +
+ + + {% include 'frontend.' ~ template ~ '.forms.custom_fields' %} +
\ No newline at end of file diff --git a/selfservice/forms/comment.twig b/selfservice/forms/comment.twig new file mode 100644 index 0000000..d3913e2 --- /dev/null +++ b/selfservice/forms/comment.twig @@ -0,0 +1,53 @@ +{{ form_open({ 'route': [ 'selfservice.comment' ], 'method': 'post', 'class': 'add-comment validate' }) }} + + {{ form_hidden('article_id', article['id']) }} + {{ form_hidden('type_id', type) }} + {{ form_hidden('parent_id') }} + +

+ {{ Lang.get('selfservice.replying_to') }} +   + {{ form_button(Lang.get('general.cancel'), {'class': 'sp-cancel-reply sp-button sp-button-sm'}) }} +

+ + {% if not auth_check() %} +
+
+ {{ form_text('name', null, { 'placeholder': Lang.get('general.name') }) }} +
+
+ {% endif %} + +
+
+ {{ form_textarea('text', null, {'placeholder': Lang.choice('selfservice.comment', 1), 'class': 'sp-h-24'}) }} +
+
+ + {% if auth_check() %} +
+
+ +
+
+ {% endif %} + + {% if Config.get('settings.captcha_type') != 0 + and (Config.get('settings.comment_captcha') == 2 or (not auth_check() and Config.get('settings.comment_captcha') == 1)) + %} + {% if Captcha.isVisible() %} +
{{ Lang.get('core.captcha') }}
+ {% endif %} + + {{ Captcha.getHtml() }} + {% endif %} + +
+ {{ form_submit(Lang.choice('general.post', 1)) }} +
+ + {% if article.comments is not empty %} +
+ {% endif %} + +{{ form_close() }} diff --git a/selfservice/hierarchical.twig b/selfservice/hierarchical.twig new file mode 100644 index 0000000..375d944 --- /dev/null +++ b/selfservice/hierarchical.twig @@ -0,0 +1,39 @@ +{% extends parent_template %} + +{% block title %}{{ type.name }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ type.name }} +{% endblock %} + +{% block sidebar %} + {% include 'frontend.' ~ template ~ '.selfservice.sidebar' %} + {{ parent() }} +{% endblock %} + +{% block content %} + + {# Show all the parent categories #} + + {% include 'frontend.' ~ template ~ '.selfservice.category_list' with {'categories': parent_categories} %} + + {# Latest / Most Popular articles #} + + + +
+ {% include 'frontend.' ~ template ~ '.selfservice.article_list' with {'articles': popular} %} +
+
+ {% include 'frontend.' ~ template ~ '.selfservice.article_list' with {'articles': latest} %} +
+ +{% endblock %} \ No newline at end of file diff --git a/selfservice/list.twig b/selfservice/list.twig new file mode 100644 index 0000000..815851d --- /dev/null +++ b/selfservice/list.twig @@ -0,0 +1,20 @@ +{% extends parent_template %} + +{% block title %}{{ type.name }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ type.name }} +{% endblock %} + +{% block sidebar %} + {% include 'frontend.' ~ template ~ '.selfservice.sidebar' %} + {{ parent() }} +{% endblock %} + +{% block content %} + + {# Show all the articles (paginated), starting with most recent #} + {% include 'frontend.' ~ template ~ '.selfservice.article_list' with {'show_pinned': true} %} + +{% endblock %} \ No newline at end of file diff --git a/selfservice/sidebar.twig b/selfservice/sidebar.twig new file mode 100644 index 0000000..1dbb7e4 --- /dev/null +++ b/selfservice/sidebar.twig @@ -0,0 +1,40 @@ +
+ {{ View.fireHook('frontend.sidebar_start') }} + + {% if categories is not empty and not categories.isEmpty() %} +
+

{{ Lang.choice('selfservice.category', 2) }}

+ +
+ {% endif %} + + {% if tags is not empty and not tags.isEmpty() %} +
+

{{ Lang.choice('selfservice.tag', 2) }}

+ +
+ {% endif %} + + {{ View.fireHook('frontend.sidebar_end') }} +
diff --git a/selfservice/tag.twig b/selfservice/tag.twig new file mode 100644 index 0000000..3f6d0eb --- /dev/null +++ b/selfservice/tag.twig @@ -0,0 +1,23 @@ +{% extends parent_template %} + +{% block title %} + {{ Lang.choice('selfservice.tag', 1) }}: {{ tag.name }} +{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ type.name }}  »  + {{ tag.name }} +{% endblock %} + +{% block sidebar %} + {% include 'frontend.' ~ template ~ '.selfservice.sidebar' %} + {{ parent() }} +{% endblock %} + +{% block content %} + + {# Show all articles with tag in this type #} + {% include 'frontend.' ~ template ~ '.selfservice.article_list' with {'articles': articles, 'show_pinned': type.view == 1} %} + +{% endblock %} diff --git a/sidebar.twig b/sidebar.twig new file mode 100644 index 0000000..e69de29 diff --git a/ticket/entire_message.twig b/ticket/entire_message.twig new file mode 100644 index 0000000..0786954 --- /dev/null +++ b/ticket/entire_message.twig @@ -0,0 +1,61 @@ + + + + + + + {{ ticket.subject }} + + {% include 'frontend.' ~ template ~ '.head_common' %} + + {{ View.fireHook('frontend.head') }} + + + + + {{ View.fireHook('frontend.body_start') }} + +
+
+ {{ View.fireHook('frontend.wrapper_start') }} + +

{{ ticket.subject }}

+ +
+ {{ View.fireHook('frontend.content_start') }} + + {% include 'frontend.' ~ template ~ '.ticket.message' %} + + {{ View.fireHook('frontend.content_end') }} +
+ + {{ View.fireHook('frontend.wrapper_end') }} +
+
+ + {% include 'frontend.' ~ template ~ '.footer_common' %} + + + + + + + + + + {{ View.fireHook('frontend.body_end') }} + + + + \ No newline at end of file diff --git a/ticket/feedback.twig b/ticket/feedback.twig new file mode 100644 index 0000000..19ac65c --- /dev/null +++ b/ticket/feedback.twig @@ -0,0 +1,53 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('ticket.feedback_for_ticket', {'number': ticket.number}) }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.choice('ticket.ticket', 2) }}  »  + {{ Lang.choice('ticket.ticket', 1) }} #{{ ticket.number }} +{% endblock %} + +{% block content %} + +
{{ Lang.get('ticket.feedback_thank_you') }}
+ + {{ Lang.get('ticket.feedback_questions') }} + +

+ + {{ form_open({'route': ['ticket.frontend.ticket.feedback', ticket.number, token] }) }} + + {% include 'frontend.' ~ template ~ '.forms.custom_fields' %} + +
+ {{ form_submit(Lang.get('general.save')) }} +
+ + {{ form_close() }} + +{% endblock %} + +{% block scripts_footer %} + + + + + + + + +{% endblock %} diff --git a/ticket/forms/message.twig b/ticket/forms/message.twig new file mode 100644 index 0000000..9164978 --- /dev/null +++ b/ticket/forms/message.twig @@ -0,0 +1,93 @@ +
+ + {{ form_hidden('send_email_to_users', 1) }} + {{ form_hidden('ticket_number', ticket.number) }} + {% if Request.has('token') %} + {{ form_hidden('token', Request.input('token')) }} + {% endif %} + +
+
+
+
+
{{ Lang.get('ticket.cc') }}
+
+
+ {% if organisationEmails is empty and ticket.cc is empty %} +
{{ Lang.get('ticket.cc_desc') }}
+ {% else %} + {{ organisationEmails.concat(ticket.cc).join(', ') }} + {% endif %} +
+ + +
+
+
+ +
+ {{ form_redactor('text') }} +
+ +
+ +
+ +
    +
  • +
    +   + + + + + +
    + +
    + +
    + +
    +
    +
    +
  • +
+
+
+ +
+
+ {{ Lang.get('general.drag_and_drop') }} +
+ + +
+ +
+ {{ form_submit(Lang.choice('general.post', 1)) }} + + {% if ticket.status_id != Config.get('settings.default_resolved_status') %} +    + + {{ Lang.get('ticket.mark_resolved') }} + + {% endif %} +
+ +
\ No newline at end of file diff --git a/ticket/forms/submit_ticket_step1.twig b/ticket/forms/submit_ticket_step1.twig new file mode 100644 index 0000000..c2deee7 --- /dev/null +++ b/ticket/forms/submit_ticket_step1.twig @@ -0,0 +1,66 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('core.submit_ticket') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('core.submit_ticket') }} +{% endblock %} + +{% block content %} + + {{ form_open({ 'route': [ 'ticket.frontend.ticket.storeStep1' ], 'class': 'validate' }) }} + + {{ form_hidden('department', Request.input('department')) }} + +

{{ Lang.get('ticket.enter_your_details') }}

+ +

{{ Lang.get('ticket.enter_user_details') }}

+ + {% set email = Request.old('email') %} + {% if email %} +
+ {{ form_label('firstname', Lang.get('user.firstname')) }} +
+ {{ form_text('firstname', null, {'autofocus': 'autofocus'}) }} +
+
+ +
+ {{ form_label('lastname', Lang.get('user.lastname')) }} +
+ {{ form_text('lastname') }} +
+
+ {% endif %} + +
+ {{ form_label('email', Lang.get('general.email')) }} +
+ {{ form_email('email', email, (email ? {} : {'autofocus': 'autofocus'})) }} +
+
+ + {% if email and Config.get('settings.organisations_enabled') %} +
+ {{ form_label('organisation', Lang.choice('user.organisation', 1)) }} +
+ {{ form_text('organisation') }}   + ({{ Lang.get('general.optional') }}) +
+
+ {% endif %} + +
+ {{ form_submit(Lang.choice('general.submit', 1)) }} +
+ + {{ form_close() }} + +{% endblock %} + +{% block scripts_footer %} + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} diff --git a/ticket/forms/submit_ticket_step2.twig b/ticket/forms/submit_ticket_step2.twig new file mode 100644 index 0000000..f2e9254 --- /dev/null +++ b/ticket/forms/submit_ticket_step2.twig @@ -0,0 +1,28 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('core.submit_ticket') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('core.submit_ticket') }} +{% endblock %} + +{% block content %} + +

{{ Lang.get('ticket.select_department') }}

+ +

{{ Lang.get('ticket.select_department_desc') }}

+ + {% for department in departments %} + +

{{ department.frontend_name }}

+ {% if department.description is not empty %} +

{{ department.description }}

+ {% endif %} +
+ {% else %} + {{ Lang.get('ticket.no_departments') }} + {% endfor %} + +{% endblock %} \ No newline at end of file diff --git a/ticket/forms/submit_ticket_step3.twig b/ticket/forms/submit_ticket_step3.twig new file mode 100644 index 0000000..39c0e6a --- /dev/null +++ b/ticket/forms/submit_ticket_step3.twig @@ -0,0 +1,216 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('core.submit_ticket') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('core.submit_ticket') }} +{% endblock %} + +{% block precontent %} +
+
+
+{% endblock %} + +{% block content %} + + {{ form_open({'route': 'ticket.frontend.ticket.storeStep3', 'class': 'validate'}) }} + + {% if not auth_check() %} + {{ form_hidden('email', guest_user.email) }} + + {% if guest_user.firstname is not empty %} + {{ form_hidden('firstname', guest_user.firstname) }} + {% endif %} + {% if guest_user.lastname is not empty %} + {{ form_hidden('lastname', guest_user.lastname) }} + {% endif %} + {% if guest_user.organisation is not empty %} + {{ form_hidden('organisation', guest_user.organisation) }} + {% endif %} + {% endif %} + +

{{ Lang.get('ticket.enter_ticket_details') }}

+ +
+ +
+ {{ form_label('department', Lang.choice('ticket.department', 1)) }} +
+ {{ form_hidden('department', department.id) }} + {{ department.frontend_name }} +
+
+ +
+ {{ form_label('priority', Lang.choice('ticket.priority', 1)) }} +
+ {{ form_select('priority', department_priorities, null, {'autofocus': 'autofocus'}) }} +
+
+ + {% if organisationUsers is not empty %} +
+ {{ form_label('organisationUsers', Lang.get('user.organisation_users')) }} +
+ {{ organisationUsers.implode(', ') }} +
{{ Lang.get('user.organisation_users_ticket') }}
+
+
+ {% endif %} + +
+ {{ form_label('cc[]', Lang.get('ticket.cc')) }} +
+ {{ form_select('cc[]', [], [], {'multiple': 'multiple'}) }} +
{{ Lang.get('ticket.cc_desc') }}
+
+
+ +
+ +
+ {{ form_label('subject', Lang.get('ticket.subject')) }} +
+ {{ form_text('subject') }} +
+
+ +
+ +
+
+

{{ Lang.get('selfservice.related_articles') }}

+
+
+
+
+ +
+ {{ form_label('text', Lang.choice('general.message', 1)) }} +
+ {{ form_redactor('text') }} + +
+ + {% if Request.old() is not empty and Request.old()['attachment'] is not empty %} + {% for hash, file in Request.old()['attachment'] %} + + {% endfor %} + {% endif %} +
+ +
    +
  • +
    +   + + + + + +
    + +
    + +
    + +
    +
    +
    +
  • + {% if Request.old() is not empty and Request.old()['attachment'] is not empty %} + {% for hash, file in Request.old()['attachment'] %} +
  • +
    +   + + + {{ file }} + + +
    + +
    + +
    +
  • + {% endfor %} + {% endif %} +
+ +
+
+ {{ Lang.get('general.drag_and_drop') }} +
+ + +
+
+
+ + {% include 'frontend.' ~ template ~ '.forms.custom_fields' with {'new': true} %} + + {% if showCaptcha %} + {% if Captcha.isVisible() %} +
+ +
+ +
+ {{ Captcha.getHtml() }} +
+
+ {% else %} + {{ Captcha.getHtml() }} + {% endif %} + {% endif %} + +
+ {{ form_submit(Lang.choice('general.submit', 1)) }} +
+ + {{ form_close() }} + +{% endblock %} + +{% block scripts_footer %} + + + + + + + + + + + + + + + {% if showCaptcha %} + {{ Captcha.getJs() }} + {% endif %} + + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} diff --git a/ticket/message.twig b/ticket/message.twig new file mode 100644 index 0000000..9b5362a --- /dev/null +++ b/ticket/message.twig @@ -0,0 +1,92 @@ +
+
+
+ +
+
+
+
+ {{ message.user.formatted_name }} +
+
{{ timeago(message.created_at) }}
+
+
+
+ +
+ {{ message.purified_text|raw }} +
+ + {% if not message.attachments.isEmpty() %} + + {% endif %} +
\ No newline at end of file diff --git a/ticket/ticket.twig b/ticket/ticket.twig new file mode 100644 index 0000000..af9f996 --- /dev/null +++ b/ticket/ticket.twig @@ -0,0 +1,165 @@ +{% extends parent_template %} + +{% block meta %} + + {% if download %} + + {% endif %} +{% endblock %} + +{% block title %}{{ ticket.subject }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.choice('ticket.ticket', 2) }}  »  + {{ Lang.choice('ticket.ticket', 1) }} #{{ ticket.number }} +{% endblock %} + +{% block sidebar %} +
+ {{ View.fireHook('frontend.sidebar_start') }} + +
+

{{ Lang.get('ticket.ticket_details') }}

+ +
+

{{ Lang.get('ticket.ticket_details') }}

+
+ +
+
+ +
+ {% include 'frontend.' ~ template ~ '.ticket.ticket_details' %} + + {% if customfields is not empty %} + {% include 'frontend.' ~ template ~ '.ticket.ticket_custom_fields' %} + {% endif %} +
+
+ + {{ View.fireHook('frontend.sidebar_end') }} +
+{% endblock %} + +{% block precontent %} +
+
+ {{ Lang.get('messages.success_updated', {'item': mb_strtolower(Lang.choice('ticket.ticket', 1), 'UTF-8')}) }} +
+
+
+
+ {{ Lang.get('messages.error_updated', {'item': mb_strtolower(Lang.choice('ticket.ticket', 1), 'UTF-8')}) }} +
+
+ +
+
+ {{ Lang.get('messages.success_updated', {'item': mb_strtolower(Lang.choice('ticket.ticket', 1), 'UTF-8')}) }} +
+
+
+
+ {{ Lang.get('messages.error_updated', {'item': mb_strtolower(Lang.choice('ticket.ticket', 1), 'UTF-8')}) }} +
+
+
+
+
+
+
+
+{% endblock %} + +{% block content %} + + {% if download %} +
+ + {{ Lang.get('ticket.downloading') }}
+ {{ Lang.get('ticket.downloading_desc', {'href': download.direct_frontend_url|e})|raw }} +
+ {% endif %} + + {% if ticket.locked == 1 %} +
+ {{ Lang.get('ticket.error_ticket_locked') }} +
+ {% endif %} + + {% if feedbackToken is not null %} +
+

{{ Lang.get('ticket.feedback_desc') }}

+ + +
+ {% endif %} + + {% if ticket.user.isAscendingReplyOrder() %} + {% include 'frontend.' ~ template ~ '.ticket.ticket_messages' %} + {% endif %} + + {% if ticket.locked == 0 %} +
+ {% include 'frontend.' ~ template ~ '.ticket.forms.message' %} +
+ {% endif %} + + {% if ticket.user.isDescendingReplyOrder() %} + {% include 'frontend.' ~ template ~ '.ticket.ticket_messages' %} + {% endif %} + +{% endblock %} + +{% block scripts_footer %} + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} + {% if jsValidatorFields|default is not empty %} + {{ jsValidatorFields|raw }} + {% endif %} + + + + + + + + + + + + + + + + + + +{% endblock %} diff --git a/ticket/ticket_custom_fields.twig b/ticket/ticket_custom_fields.twig new file mode 100644 index 0000000..8541bf3 --- /dev/null +++ b/ticket/ticket_custom_fields.twig @@ -0,0 +1,11 @@ +
+ {% include 'frontend.' ~ template ~ '.forms.custom_fields' %} + + {% if ticket.locked == 0 %} +
+ +
+ {% endif %} +
diff --git a/ticket/ticket_details.twig b/ticket/ticket_details.twig new file mode 100644 index 0000000..b6da0d4 --- /dev/null +++ b/ticket/ticket_details.twig @@ -0,0 +1,42 @@ +
+
+ +
+ {{ ticket.number }} +
+
+
+ +
+ {{ ticket.department.frontend_name }} +
+
+
+ +
+ + {{ ticket.status.name }} + +
+
+
+ +
+ + {{ ticket.priority.name }} + +
+
+
+ +
+ {{ timeago(ticket.created_at) }} +
+
+
+ +
+ {{ timeago(ticket.last_message_time) }} +
+
+
diff --git a/ticket/ticket_grid.twig b/ticket/ticket_grid.twig new file mode 100644 index 0000000..17d1602 --- /dev/null +++ b/ticket/ticket_grid.twig @@ -0,0 +1,103 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.choice('ticket.ticket', 2) }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.choice('ticket.ticket', 2) }} +{% endblock %} + +{% block content %} + +
+ +   + {{ Lang.get('core.submit_ticket') }} +     + +   {{ Lang.get('general.filter_results') }} + +
+ +
+

{{ Lang.get('general.filter_results') }}

+ +
+
+ +
+ {{ form_text('sSearch_0', null, {'placeholder': Lang.get('general.type_to_filter')}) }}{{ form_button('', {'class': 'reset-filter'}) }} +
+
+
+ +
+ {{ form_text('sSearch_1', null, {'placeholder': Lang.get('general.type_to_filter')}) }}{{ form_button('', {'class': 'reset-filter'}) }} +
+
+
+ +
+ {{ form_select('sSearch_2', {'-1': Lang.get('general.select_value')} + departments.pluck('name', 'id').all()) }}{{ form_button('', {'class': 'reset-filter'}) }} +
+
+
+ +
+ {{ form_select('sSearch_3', {'-1': Lang.get('general.select_value')} + statuses.pluck('name', 'id').all()) }}{{ form_button('', {'class': 'reset-filter'}) }} +
+
+
+ +
+ + {{ form_text('sSearch_4_start', null, {'class': 'datepicker sp-w-40', 'placeholder': '  ' ~ Lang.get('general.start_date')}) }}{{ form_button('', {'class': 'reset-filter'}) }} + +  {{ Lang.get('general.to') }}  + + {{ form_text('sSearch_4_end', null, {'class': 'datepicker sp-w-40', 'placeholder': '  ' ~ Lang.get('general.end_date')}) }}{{ form_button('', {'class': 'reset-filter'}) }} + +
+
+
+ +
+ + {{ form_text('sSearch_5_start', null, {'class': 'datepicker sp-w-40', 'placeholder': '  ' ~ Lang.get('general.start_date')}) }}{{ form_button('', {'class': 'reset-filter'}) }} + +  {{ Lang.get('general.to') }}  + + {{ form_text('sSearch_5_end', null, {'class': 'datepicker sp-w-40', 'placeholder': '  ' ~ Lang.get('general.end_date')}) }}{{ form_button('', {'class': 'reset-filter'}) }} + +
+
+
+
+ + {{ table.render()|raw }} + +{% endblock %} + +{% block scripts_footer %} + + {{ table.script()|raw }} + + + + +{% endblock %} diff --git a/ticket/ticket_messages.twig b/ticket/ticket_messages.twig new file mode 100644 index 0000000..204eb1e --- /dev/null +++ b/ticket/ticket_messages.twig @@ -0,0 +1,7 @@ +
+ {% for message in messages %} + {% if message.type == 0 %} + {% include 'frontend.' ~ template ~ '.ticket.message' %} + {% endif %} + {% endfor %} +
diff --git a/ticket/track.twig b/ticket/track.twig new file mode 100644 index 0000000..8e68154 --- /dev/null +++ b/ticket/track.twig @@ -0,0 +1,34 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('ticket.track_ticket') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('ticket.track_ticket') }} +{% endblock %} + +{% block content %} + + {{ form_open({'route': 'ticket.frontend.track', 'method': 'post', 'class': 'validate'}) }} + +
+ {{ form_label('email', Lang.get('general.email')) }} + {{ form_email('email') }} +
+
+ {{ form_label('number', Lang.get('ticket.ticket_number')) }} + {{ form_text('number') }} +
+
+ {{ form_submit(Lang.get('ticket.view_ticket')) }} +
+ + {{ form_close() }} + +{% endblock %} + +{% block scripts_footer %} + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/user/change_password.twig b/user/change_password.twig new file mode 100644 index 0000000..a2c99f8 --- /dev/null +++ b/user/change_password.twig @@ -0,0 +1,55 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.change_password') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.change_password') }} +{% endblock %} + +{% block content %} + + {{ form_open({'route': [ 'user.change_password' ], 'method': 'PUT', 'class': 'validate'}) }} + +
+ {{ form_label('current_password', Lang.get('user.current_password')) }} +
+ {{ form_password('current_password', {'autocomplete': 'off', 'autofocus': 'autofocus', 'size': 20}) }}
+
{{ Lang.get('user.personal_confirm_password') }}
+
+
+ +
+ {{ form_label('password', Lang.get('user.new_password')) }} +
+ {{ form_password('password', {'size': 20, 'autocomplete': 'new-password'}) }} +
+
+ +
+ {{ form_label('password_confirmation', Lang.get('user.confirm_password')) }} +
+ {{ form_password('password_confirmation', {'size': 20, 'autocomplete': 'new-password'}) }} +
+
+ +
+ {{ form_submit(Lang.get('general.save')) }} +
+ + {{ form_close() }} + +{% endblock %} + +{% block scripts_footer %} + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} + + +{% endblock %} \ No newline at end of file diff --git a/user/confirm.twig b/user/confirm.twig new file mode 100644 index 0000000..0877b8f --- /dev/null +++ b/user/confirm.twig @@ -0,0 +1,27 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.confirmation') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.confirmation') }} +{% endblock %} + +{% block content %} + + {% if error is not defined %} +
+ {{ Lang.get('messages.success') }}
+ {{ Lang.get('user.thank_you_confirm') }} + {% if not auth_check() %} + {{ Lang.get('user.continue_to_login', {'route': route('user.login')})|raw }} + {% endif %} +
+ {% else %} +
+ {{ Lang.get('messages.error') }}
+ {{ error }} +
+ {% endif %} + +{% endblock %} \ No newline at end of file diff --git a/user/email.twig b/user/email.twig new file mode 100644 index 0000000..8833c60 --- /dev/null +++ b/user/email.twig @@ -0,0 +1,112 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.view_email') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.email_history') }} +  »  + {{ Lang.get('user.view_email') }} +{% endblock %} + +{% block content %} + +

{{ Lang.choice('general.detail', 2) }}

+ +
+ +
+ +
+ {{ record.subject }} +
+
+ +
+ +
+ {{ formatDate(record.created_at) }} +
+
+ + {% if record.type|default is not empty %} +
+ +
+ {% if record.type == 0 %} + {{ Lang.get('core.outgoing') }} + {% elseif record.type == 1 %} + {{ Lang.get('core.incoming') }} + {% elseif record.type == 2 %} + {{ Lang.get('core.incoming_spam') }} + {% elseif record.type == 3 %} + {{ Lang.get('core.incoming_throttled') }} + {% else %} + {{ Lang.get('core.incoming_rejected') }} + {% endif %} +
+
+ {% endif %} + + {% if record.to is not empty %} +
+ +
+ {{ implode(", ", record.to) }} +
+
+ {% endif %} + + {% if record.from_address is not empty %} +
+ +
+ {{ record.from_address }} +
+
+ {% endif %} + + {% if record.reply_to is not empty %} +
+ +
+ {{ record.reply_to }} +
+
+ {% endif %} + + {% if record.cc is not empty %} +
+ +
+ {{ implode(", ", record.cc) }} +
+
+ {% endif %} + + {% if record.bcc is not empty %} +
+ +
+ {{ implode(", ", record.bcc) }} +
+
+ {% endif %} + +
+ +

{{ Lang.get('general.content') }}

+ +
+ {{ Purifier.clean(record.contents) }} +
+ + + +{% endblock %} diff --git a/user/email_history.twig b/user/email_history.twig new file mode 100644 index 0000000..0b63bf5 --- /dev/null +++ b/user/email_history.twig @@ -0,0 +1,17 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.email_history') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.email_history') }} +{% endblock %} + +{% block content %} + {{ table.render()|raw }} +{% endblock %} + +{% block scripts_footer %} + + {{ table.script()|raw }} +{% endblock %} diff --git a/user/forms/organisation.twig b/user/forms/organisation.twig new file mode 100644 index 0000000..ec891de --- /dev/null +++ b/user/forms/organisation.twig @@ -0,0 +1,44 @@ +{% if Config.get('settings.organisations_enabled') %} +
+ {{ form_label('organisation', Lang.choice('user.organisation', 1)) }} +
+ {{ form_text('organisation', organisation|default is not empty ? organisation.name : '', + (organisation is not empty and (new is defined or record.organisation.owner_id != record.id)) + ? {'readonly': 'readonly', 'size': 30} : {'size': 30}) }} + + {% if organisation|default is not empty and new is not defined %} + {% if record.organisation.isOwner(record.id) or record.organisation_access_level == 0 %} +
+ {{ Lang.get('user.manage_organisation') }} + {% endif %} + {% if not record.organisation.isOwner(record.id) or record.organisation.users().count() == 1 %} +
+ {{ Lang.get('user.leave_organisation') }} + {% endif %} + {% endif %} +
+
+ + {% if new|default is not empty %} +
+ {{ form_label('access_level', Lang.get('user.organisation_access_level')) }} +
+ {{ form_select('access_level', { 0: Lang.get('user.manager'), 1: Lang.choice('user.user', 1) }, 1) }} +
{{ Lang.get('user.organisation_user_desc')|raw }}
+
+
+ {% endif %} + + {% if organisation|default is not empty and new is not defined and record.organisation_access_level == 0 %} +
+ {{ form_label('organisation_notifications', Lang.get('user.organisation_notifications')) }} +
+ {{ form_check('organisation_notifications', 1, record.organisation_notifications|default is not empty ? + record.organisation_notifications : Config.get('settings.organisation_notifications'), + {'class': 'sp-toggle', 'id': 'toggle_organisation_notifications'}) }} + +
{{ Lang.get('user.organisation_notifications_desc') }}
+
+
+ {% endif %} +{% endif %} diff --git a/user/forms/organisation_profile.twig b/user/forms/organisation_profile.twig new file mode 100644 index 0000000..fd3db10 --- /dev/null +++ b/user/forms/organisation_profile.twig @@ -0,0 +1,35 @@ +
+ {{ form_label('name', Lang.get('general.name')) }} +
+ {{ form_text('name') }} +
+
+ + {% include 'frontend.' ~ template ~ '.forms.custom_fields' %} + +
+ {{ form_label('country', Lang.get('user.country')) }} +
+ {{ form_select('country', countries(), + record.country|default is not empty ? record.country : Config.get('settings.default_country')) }} +
+
+ + {# Check whether we should allow organisations to change their default language #} + {% if Config.get('settings.language_frontend_toggle') %} +
+ {{ form_label('language_code', Lang.choice('general.language', 1)) }} +
+ {{ form_select('language_code', languages, + record.language_code|default is not empty ? record.language_code : LanguageFactory.getUserDefault()) }} +
+
+ {% endif %} + +
+ {{ form_label('timezone', Lang.get('general.timezone')) }} +
+ {{ form_select('timezone', timezones(), + record|default is not empty and record.timezone|default is not empty ? record.timezone : Config.get('settings.default_timezone')) }} +
+
\ No newline at end of file diff --git a/user/forms/twofa.twig b/user/forms/twofa.twig new file mode 100644 index 0000000..3484203 --- /dev/null +++ b/user/forms/twofa.twig @@ -0,0 +1,40 @@ +
+ {{ form_label('twofa_qrcode', Lang.get('user.qr_code')) }} +
+ +
+
+ +
+ {{ form_label('twofa_secret', Lang.get('user.two_fa_secret')) }} +
+ {{ twofa_secret }} +
{{ Lang.get('user.two_fa_secret_desc') }}
+
+
+ +
+ {{ form_label('twofa_code', Lang.get('user.verify_code')) }} +
+ {{ form_text('twofa_code') }}
+ {{ form_submit(Lang.get('user.verify_and_enable'), {'class': 'twofa-verify sp-my-3'}) }} +
+ {{ Lang.get('user.two_fa_verify_desc') }} + +
+    + Authy (Android), + Google Authenticator (Android).
+ +    + Authy (iOS), + Google Authenticator (iOS), + Authy (macOS).
+ +    + Authenticator (Windows Phone), + Authy (Windows PC).
+
+
+
+
diff --git a/user/forms/user_profile.twig b/user/forms/user_profile.twig new file mode 100644 index 0000000..ca3ed35 --- /dev/null +++ b/user/forms/user_profile.twig @@ -0,0 +1,112 @@ +
+ {{ form_label('firstname', Lang.get('user.firstname')) }} +
+ {{ form_text('firstname', null, record.exists ? {} : {'autofocus': 'autofocus'}) }} +
+
+ +
+ {{ form_label('lastname', Lang.get('user.lastname')) }} +
+ {{ form_text('lastname') }} +
+
+ +
+ {{ form_label('email', Lang.get('general.email')) }} +
+ {% set emailAttributes = {'size': 35} %} + {% if auth_check() and auth_user().loggedInViaSSO() %} + {% set emailAttributes = emailAttributes|merge({'readonly': 'readonly'}) %} + {% endif %} + {{ form_email('email', record.email, emailAttributes) }} + + {% if emailChange %} +
+ {{ Lang.get('user.updating_email_address', {'email': emailChange.new_email}) }} +
+ {% endif %} +
+
+ + {% if not record.exists or (auth_user().password is not empty and not auth_user().loggedInViaSSO()) %} +
+ {{ form_label('password', Lang.get('general.password')) }} +
+ {% if not record.exists %} + {{ form_password('password', {'size': 20, 'autocomplete': 'new-password'}) }} + {% else %} + + {{ Lang.get('user.change_password') }} + + {% endif %} +
+
+ {% endif %} + + {% if not record.exists %} +
+ {{ form_label('password_confirmation', Lang.get('user.confirm_password')) }} +
+ {{ form_password('password_confirmation', {'size': 20, 'autocomplete': 'new-password'}) }} +
+
+ {% endif %} + + {% if record.exists and record.password is not empty %} +
+ {{ form_label('twofa_enabled', Lang.get('user.two_fa_enabled')) }} +
+ {% if record.twofa_enabled %} +
{{ Lang.get('general.yes') }}
+ {% else %} +
{{ Lang.get('general.no') }}
+ {% endif %} + {% if not record.twofa_enabled or (record.id == auth_user().id and not Config.get('settings.force_2fa_users', 0)) %} + + {% endif %} +
+
+ {% endif %} + +
+ {{ form_label('country', Lang.get('user.country')) }} +
+ {{ form_select('country', countries(), + organisation_add is defined and organisation.country|default is not empty ? organisation.country : + record.country|default is not empty ? record.country : Config.get('settings.default_country')) }} +
+
+ + {# Check whether we should allow users to change their default language #} + {% if Config.get('settings.language_frontend_toggle') %} +
+ {{ form_label('language_code', Lang.choice('general.language', 1)) }} +
+ {{ form_select('language_code', languages, + organisation_add is defined and organisation.language_code|default is not empty ? organisation.language_code + : record.language_code|default is not empty ? record.language_code : LanguageFactory.getUserDefault()) }} +
+
+ {% endif %} + +
+ {{ form_label('timezone', Lang.get('general.timezone')) }} +
+ {{ form_select('timezone', timezones(), + organisation_add is defined and organisation.timezone|default is not empty ? organisation.timezone + : record|default is not empty and record.timezone|default is not empty ? record.timezone : Config.get('settings.default_timezone')) }} +
+
+ +
+ {{ form_label('avatar', Lang.get('user.avatar')) }} +
+ {% if record.avatar_url %} + + {% endif %} + {{ form_file('avatar') }} +
+
\ No newline at end of file diff --git a/user/linked_account.twig b/user/linked_account.twig new file mode 100644 index 0000000..685f324 --- /dev/null +++ b/user/linked_account.twig @@ -0,0 +1,39 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.linked_accounts') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.linked_accounts') }} +{% endblock %} + +{% block content %} + + {% if not socialite_providers.isEmpty() %} +
+ {% for provider, metadata in all_providers %} + {% if socialite_providers.contains('name', provider) %} + + {% endif %} + {% endfor %} +
+ +
+ {% endif %} + + {{ table.render()|raw }} + +{% endblock %} + +{% block scripts_footer %} + + + + {{ table.script()|raw }} +{% endblock %} diff --git a/user/login.twig b/user/login.twig new file mode 100644 index 0000000..f5b36f1 --- /dev/null +++ b/user/login.twig @@ -0,0 +1,105 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.login') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.login') }} +{% endblock %} + +{% block content %} + + {% if not Session.has('error') and Session.has('social_metadata') %} +
+ {{ Lang.get('user.social_linking_login') }} +
+ {% endif %} + + {{ form_open({'route': 'user.login', 'method': 'post', 'class': 'validate sp-w-full sp-m-auto md:sp-w-2/3 xl:sp-w-1/2'}) }} + + {% if intended_url is not null %} + {{ form_hidden('back', intended_url) }} + {% endif %} + +
+ {{ form_label('email', Lang.get('general.email')) }} +
+ {{ form_email('email', null, {'autofocus': 'autofocus'}) }} +
+
+ +
+ {{ form_label('password', Lang.get('general.password')) }} +
+ {{ form_password('password') }} + +
+
+ +
+ +
+ +
+
+ +
+ +
+ {{ form_submit(Lang.get('user.login')) }} +
+
+ + {% if not Request.has('social') %} +
+ {% if SamlAuth.exists(SamlAuth.frontendGuard(current_brand(false))) %} +
+ {{ Lang.get('general.or') }} +
+ + + {% endif %} + + {% if not socialite_providers.isEmpty() %} +
+ {{ Lang.get('general.or') }} +
+ + {% for provider, metadata in all_providers %} + {% if socialite_providers.contains('name', provider) %} +
+ {% endif %} + {% endfor %} + {% endif %} +
+ +
+ {% if Config.get('settings.registration_enabled') == 1 %} +
+ + {{ Lang.get('user.register_now') }} + {% endif %} +
+ {% endif %} + + {{ form_close() }} + +{% endblock %} + +{% block scripts_footer %} + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} diff --git a/user/login_twofa.twig b/user/login_twofa.twig new file mode 100644 index 0000000..12f084c --- /dev/null +++ b/user/login_twofa.twig @@ -0,0 +1,40 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.login') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.login') }} +{% endblock %} + +{% block content %} + +

{{ Lang.get('user.two_fa') }}

+ + {{ form_open({'route': 'user.login.twofa', 'method': 'POST', 'class': 'validate sp-w-full sp-m-auto md:sp-w-2/3 xl:sp-w-1/2'}) }} + + {{ form_hidden('email', email) }} + {{ form_hidden('twofa_token', twofa_token) }} + {{ form_hidden('back', back) }} + {{ form_hidden('remember', remember) }} + +
+ {{ form_label('twofa_code', Lang.get('user.two_fa_code')) }} +
+ {{ form_text('twofa_code', null, {'placeholder': Lang.get('user.two_fa_code'), 'autofocus': 'autofocus'}) }} +
+
+ +
+ {{ form_submit(Lang.get('user.login')) }} +
+ + {{ form_close() }} + +{% endblock %} + +{% block scripts_footer %} + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} diff --git a/user/login_twofa_setup.twig b/user/login_twofa_setup.twig new file mode 100644 index 0000000..fac9f51 --- /dev/null +++ b/user/login_twofa_setup.twig @@ -0,0 +1,32 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.login') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.login') }} +{% endblock %} + +{% block content %} + +

{{ Lang.get('user.two_fa') }}

+ +

{{ Lang.get('user.two_fa_required') }}

+ + {{ form_open({'route': 'user.login.twofa.setup', 'method': 'POST', 'class': 'validate'}) }} + + {{ form_hidden('email', email) }} + {{ form_hidden('twofa_token', twofa_token) }} + {{ form_hidden('twofa_secret', twofa_secret) }} + + {% include 'frontend.' ~ template ~ '.user.forms.twofa' %} + + {{ form_close() }} + +{% endblock %} + +{% block scripts_footer %} + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/user/organisation.twig b/user/organisation.twig new file mode 100644 index 0000000..0545fbd --- /dev/null +++ b/user/organisation.twig @@ -0,0 +1,171 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.choice('user.organisation', 1) }}: {{ auth_user().organisation.name }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.choice('user.organisation', 1) }} +{% endblock %} + +{% block precontent %} +
+
+ {{ Lang.get('messages.success_deleted', { 'item': mb_strtolower(Lang.choice('user.user', 1), 'UTF-8') }) }} +
+
+
+
+ {{ Lang.get('messages.error_deleted', { 'item': mb_strtolower(Lang.choice('user.user', 1), 'UTF-8') }) }} +
+
+{% endblock %} + +{% block content %} + + + +
+ {{ form_model(record, {'route': 'user.organisation.updateProfile', 'method': 'POST', 'class': 'validate profile'}) }} + {% include 'frontend.' ~ template ~ '.user.forms.organisation_profile' %} + +
+ {{ form_submit(Lang.get('general.save')) }} +
+ {{ form_close() }} +
+ +
+

{{ Lang.get('user.organisation_desc')|raw }}

+ + {{ form_model(record, {'route': 'user.organisation.updateUsers', 'method': 'POST'}) }} + +
+ + + + + + + + + + {% for user in record.users %} + + + + + + {% endfor %} + +
{{ Lang.get('general.name') }}{{ Lang.get('user.access_level')|raw }}
+   + {{ user.formattedname }} + {% if user.email %} + {{ '<' ~ user.email ~ '>' }} + {% endif %} + {% if record.isOwner(user.id) %} + {{ Lang.get('user.owner') }} + {% endif %} + {% if user.confirmed == 0 %} + {{ Lang.get('user.unconfirmed') }} + {% endif %} + + {{ form_select('access_level[' ~ user.id ~ ']', { + 0: Lang.get('user.manager'), + 1: Lang.choice('user.user', 1) + }, + user.organisation_access_level, record.isOwner(user.id) or user.id == auth_user().id ? + {'class': 'access-level', 'disabled': 'disabled'} : {'class': 'access-level'}) }} + + {% if not (auth_user().id == user.id or record.isOwner(user.id)) %} + + + + + {% endif %} +
+
+ +
+ {% if ownerOptions is not empty %} + {{ form_submit(Lang.get('general.update')) }} + {% endif %} + {% if Config.get('settings.registration_enabled') %} + + {{ form_button(Lang.get('user.add_user')) }} + + {% endif %} +
+ + {{ form_close() }} + + {% if record.owner_id == auth_user().id and ownerOptions is not empty %} +
+ + {{ form_model(record, {'route': 'user.organisation.transferOwnership', 'method': 'POST', 'class': 'validate transferOwnership'}) }} + +

{{ Lang.get('user.transfer_ownership') }}

+ +

{{ Lang.get('user.transfer_ownership_desc') }}

+ +
+ {{ form_label('owner', Lang.get('user.new_owner')) }} +
+ +
+
+ +
+ {{ form_submit(Lang.get('general.transfer')) }} +
+ + {{ form_close() }} + {% endif %} +
+ +{% endblock %} + +{% block scripts_footer %} + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} + {% if transferValidator|default is not empty %} + {{ transferValidator|raw }} + {% endif %} + + + + + + + + + + + +{% endblock %} diff --git a/user/organisation_add.twig b/user/organisation_add.twig new file mode 100644 index 0000000..d0e1e00 --- /dev/null +++ b/user/organisation_add.twig @@ -0,0 +1,50 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.choice('user.organisation', 1) }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.choice('user.organisation', 1) }}  »  + {{ Lang.get('user.organisation_add_user') }} +{% endblock %} + +{% block content %} + + {{ form_open({'route': [ 'user.organisation.addUser' ], 'method': 'POST', 'class': 'validate'}) }} + + {% include 'frontend.' ~ template ~ '.user.forms.user_profile' with {'organisation_add': true} %} + + {% include 'frontend.' ~ template ~ '.user.forms.organisation' with {'new': true} %} + + {% include 'frontend.' ~ template ~ '.forms.custom_fields' with {'new': true} %} + +
+ {{ form_submit(Lang.get('user.add_user')) }} +
+ + {{ form_close() }} + +{% endblock %} + +{% block scripts_footer %} + + + + + + + + + + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} diff --git a/user/password_reset.twig b/user/password_reset.twig new file mode 100644 index 0000000..63272ab --- /dev/null +++ b/user/password_reset.twig @@ -0,0 +1,39 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.reset_password') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.reset_password') }} +{% endblock %} + +{% block content %} + + {% if reset_success|default is not empty and reset_success %} + + {{ Lang.get('user.reset_request_desc') }} + + {% else %} + + {{ form_open({'route': 'user.reset', 'method': 'post', 'class': 'validate'}) }} + +
+ {{ form_label('email', Lang.get('general.email')) }} + {{ form_email('email', null, {'autofocus': 'autofocus'}) }} +
+ +
+ {{ form_submit(Lang.get('general.reset')) }} +
+ + {{ form_close() }} + + {% endif %} + +{% endblock %} + +{% block scripts_footer %} + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/user/profile.twig b/user/profile.twig new file mode 100644 index 0000000..ef179ee --- /dev/null +++ b/user/profile.twig @@ -0,0 +1,84 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.profile') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.profile') }} +{% endblock %} + +{% block content %} + + {{ form_model(record, {'route': 'user.profile.update', 'method': 'PUT', 'files': true, 'class': 'validate'}) }} + + {% include 'frontend.' ~ template ~ '.user.forms.user_profile' %} + +
+ {{ form_label('template_mode', Lang.get('core.template_mode')) }} +
+ {{ form_select('template_mode', + {1: Lang.get('core.light_mode'), 2: Lang.get('core.dark_mode')}, + record.template_mode is empty ? Config.get('settings.frontend_template_mode') : record.template_mode + ) }} +
+
+ + {% include 'frontend.' ~ template ~ '.user.forms.organisation' %} + + {% include 'frontend.' ~ template ~ '.forms.custom_fields' %} + +
+ {{ form_submit(Lang.get('general.save')) }} +
+ + {{ form_close() }} + +
+ +{% endblock %} + +{% block scripts_footer %} + + + + + + + + + + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} diff --git a/user/register.twig b/user/register.twig new file mode 100644 index 0000000..a08a5bd --- /dev/null +++ b/user/register.twig @@ -0,0 +1,101 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.register') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.register_account') }} +{% endblock %} + +{% block content %} + + {% if register_success|default is not empty and register_success %} + +
{{ Lang.get('user.success_register') }}
+ {{ Lang.get('user.success_register_desc') }} + + {% else %} + + {% if Session.has('social_metadata') %} +
+ {{ Lang.get('user.social_linking_register') }} +

+ {{ Lang.get('user.already_registered') }} + {{ Lang.get('user.login') }} » +
+ {% else %} + {% if not socialite_providers.isEmpty() %} +
+ {% for provider, metadata in all_providers %} + {% if socialite_providers.contains('name', provider) %} + + {% endif %} + {% endfor %} +
+ +
+ {% endif %} + {% endif %} + + {{ form_open({ 'route': [ 'user.register' ], 'method': 'post', 'files': true, 'class': 'validate' }) }} + + {% include 'frontend.' ~ template ~ '.user.forms.user_profile' %} + + {% include 'frontend.' ~ template ~ '.user.forms.organisation' %} + + {% include 'frontend.' ~ template ~ '.forms.custom_fields' with {'new': true} %} + + {% if Config.get('settings.captcha_type') != 0 and Config.get('settings.registration_captcha') %} + {% if Captcha.isVisible() %} +
+ +
+ {{ Captcha.getHtml() }} +
+
+ {% else %} + {{ Captcha.getHtml() }} + {% endif %} + {% endif %} + +
+ {{ form_submit(Lang.get('user.register')) }} +
+ + {{ form_close() }} + + {% endif %} + +{% endblock %} + +{% block scripts_footer %} + + + + + + + + + {% if Config.get('settings.captcha_type') != 0 and Config.get('settings.registration_captcha') %} + {{ Captcha.getJs() }} + {% endif %} + + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/user/reset_complete.twig b/user/reset_complete.twig new file mode 100644 index 0000000..5549471 --- /dev/null +++ b/user/reset_complete.twig @@ -0,0 +1,21 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.reset_password') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.reset_password') }} +{% endblock %} + +{% block content %} + + {% if reset_success|default is not empty and reset_success %} +
+ {{ Lang.get('user.password_reset_success') }} + {% if not auth_check() %} + {{ Lang.get('user.continue_to_login', {'route': route('user.login')})|raw }} + {% endif %} +
+ {% endif %} + +{% endblock %} \ No newline at end of file diff --git a/user/reset_confirm.twig b/user/reset_confirm.twig new file mode 100644 index 0000000..400a7fa --- /dev/null +++ b/user/reset_confirm.twig @@ -0,0 +1,67 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.reset_password') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.reset_password') }} +{% endblock %} + +{% block content %} + + {% if reset_error|default is not empty and reset_error %} + +
{{ Lang.get('messages.error') }}
+ + {{ reset_error }} + + {% else %} + + {% if error is not empty %} +
{{ error }}
+ {% endif %} + + {{ Lang.get('user.please_set_password') }} +

+ + {{ form_open({'route': 'user.resetconfirm', 'method': 'post', 'class': 'validate'}) }} + + {{ form_hidden('email', Request.input('email')) }} + {{ form_hidden('token', Request.input('token')) }} + +
+ {{ form_label('password', Lang.get('general.password')) }} +
+ {{ form_password('password', {'autocomplete': 'new-password'}) }} +
+
+ +
+ {{ form_label('password_confirmation', Lang.get('user.confirm_password')) }} +
+ {{ form_password('password_confirmation', {'autocomplete': 'new-password'}) }} +
+
+ +
+ {{ form_submit(Lang.get('general.save')) }} +
+ + {{ form_close() }} + + {% endif %} + +{% endblock %} + +{% block scripts_footer %} + + + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/user/set_password.twig b/user/set_password.twig new file mode 100644 index 0000000..5e4afcf --- /dev/null +++ b/user/set_password.twig @@ -0,0 +1,53 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.set_password') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.set_password') }} +{% endblock %} + +{% block content %} + + {{ Lang.get('user.register_confirm_desc') }} +

+ + {{ form_open({'route': 'user.setpassword', 'method': 'post', 'class': 'validate'}) }} + + {{ form_hidden('email', Request.input('email')) }} + {{ form_hidden('token', Request.input('token')) }} + +
+ {{ form_label('password', Lang.get('general.password')) }} +
+ {{ form_password('password', {'autocomplete': 'new-password'}) }} +
+
+ +
+ {{ form_label('password_confirmation', Lang.get('user.confirm_password')) }} +
+ {{ form_password('password_confirmation', {'autocomplete': 'new-password'}) }} +
+
+ +
+ {{ form_submit(Lang.get('general.save')) }} +
+ + {{ form_close() }} + +{% endblock %} + +{% block scripts_footer %} + {% if jsValidator|default is not empty %} + {{ jsValidator|raw }} + {% endif %} + + +{% endblock %} \ No newline at end of file diff --git a/user/twofa.twig b/user/twofa.twig new file mode 100644 index 0000000..38dff92 --- /dev/null +++ b/user/twofa.twig @@ -0,0 +1,56 @@ +{% extends parent_template %} + +{% block title %}{{ Lang.get('user.two_fa') }}{% endblock %} + +{% block breadcrumb %} + {{ parent() }} + {{ Lang.get('user.two_fa') }} +{% endblock %} + +{% block content %} + +
+ {{ form_label('twofa_enabled', Lang.get('user.two_fa_enabled')) }} +
+ + {{ Lang.get('general.yes') }} + + + {{ Lang.get('general.no') }} + + {% if not Config.get('settings.force_2fa_users') %} +
+ {% if auth_user().twofa_enabled %} + {{ Lang.get('user.two_fa_disable') }} + {% else %} + {{ Lang.get('user.two_fa_enable') }} + {% endif %} +
+ {% endif %} +
+
+ +
+ + + {{ csrf_field() }} + + {% if auth_user().twofa_enabled and not Config.get('settings.force_2fa_users') %} + +
+ {{ form_label('twofa_code', Lang.get('user.verify_code')) }} +
+ {{ form_text('twofa_code') }}
+ {{ form_submit(Lang.get('user.verify_and_disable'), {'class': 'twofa-verify sp-mt-3'}) }} +
{{ Lang.get('user.verify_code_desc') }}
+
+
+ + {% elseif not auth_user().twofa_enabled %} + + {% include 'frontend.' ~ template ~ '.user.forms.twofa' %} + + {% endif %} +
+ +{% endblock %}