Custom Templates for DeepL backed up and EmailMonkey. GS University was also re-downloaded. Then small scripts updated like for Chubb.

This commit is contained in:
Norm Rasmussen
2025-02-25 17:01:36 -05:00
parent 74d46e88f4
commit a62a76f5d1
288 changed files with 9886 additions and 152 deletions

View File

@ -0,0 +1,66 @@
<div class="np-hidden-mobile">
<p>{% t .description %}</p>
<p>{% t .requirements %}</p>
</div>
<img
alt=""
class="np-account-avatar-image"
src="{{ form.gravatar_url }}?s=200"
id="{{version}}_gravatar_img"
{% unless form.use_gravatar? %}style="display: none"{% endunless %}
/>
<img
alt=""
class="np-account-avatar-image"
src="{{ form.secure_custom_avatar_url }}"
id="{{version}}_custom_avatar_img"
{% if form.use_gravatar? %}style="display: none"{% endif %}
/>
<div class="np-account-avatar-choice">
<div class="np-form-field">
<label class="radio radio-before np-input-label" for="{{version}}_learner_use_gravatar_true">
<span class="radio__input">
<input
id="{{version}}_learner_use_gravatar_true"
name="learner[use_gravatar]"
type="radio"
value="true"
{% if form.use_gravatar? %}checked{% endif %}
/>
<span class="np-button-color radio__control"></span>
</span>
<span class="radio__label">
{% t .use_gravatar %}
</span>
</label>
</div>
<div class="np-form-field">
<label class="radio radio-before np-input-label" for="{{version}}_learner_use_gravatar_false">
<span class="radio__input">
<input
id="{{version}}_learner_use_gravatar_false"
name="learner[use_gravatar]"
type="radio"
value="false"
{% unless form.use_gravatar? %}checked{% endunless %}
/>
<span class="np-button-color radio__control"></span>
</span>
<span class="radio__label">
{% t .upload_custom_photo %}
</span>
</label>
</div>
<div>
<button
id="{{version}}_upload_avatar"
type="button"
class="np-button np-button-secondary" {% if form.use_gravatar? %}style="visibility: hidden"{% endif %}
>
{% t .upload %}
</button>
</div>
</div>

View File

@ -0,0 +1,19 @@
<form class="np-form" action="{{ form.options.action }}" method="post" id="desktop_edit_learner" novalidate>
<input type="hidden" name="_method" value="{{ form.options.http_method }}">
{% form_authenticity_token %}
<div class="np-card">
<div class="np-card-container np-card-padding">
<div class="row">
<div class="col-sm-7 np-account-form">
{% render "account_form", form: form, version: "desktop" %}
<button type="submit" class="np-button np-button-big np-button-large-font np-form-action">
{% t shared.account.save %}
</button>
</div>
<div class="col-sm-5 np-account-avatar">
{% include "account_avatar", version: "desktop" %}
</div>
</div>
</div>
</div>
</form>

View File

@ -0,0 +1,139 @@
<div class="np-resource-title">
{% t .header %}
</div>
<div class="np-form-field {% if form.errors contains 'email' %}np-account-form-field-error{% endif %}">
<label class="np-input-label" for="{{version}}_learner_email">{% t shared.email %} *</label>
<input
{% if form.options.invite? %} disabled {% endif %}
autofocus="autofocus"
class="np-input"
id="{{version}}_learner_email"
name="learner[email]"
type="email"
value="{{ form.email }}"
/>
</div>
<div class="np-form-field {% if form.errors contains 'first_name' %}np-account-form-field-error{% endif %}">
<label class="np-input-label" for="{{version}}_learner_first_name">
{% t shared.first_name %} *
</label>
<input
class="np-input"
id="{{version}}_learner_first_name"
name="learner[first_name]"
value="{{ form.first_name }}"
/>
</div>
<div class="np-form-field {% if form.errors contains 'last_name' %}np-account-form-field-error{% endif %}">
<label class="np-input-label" for="{{version}}_learner_last_name">
{% t shared.last_name %} *
</label>
<input
class="np-input"
id="{{version}}_learner_last_name"
name="learner[last_name]"
value="{{ form.last_name }}"
/>
</div>
<div class="np-form-field {% if form.errors contains 'display_name' %}np-account-form-field-error{% endif %}">
<label class="np-input-label" for="{{version}}_learner_display_name">
{% t .display_name %}
</label>
<input
class="np-input"
id="{{version}}_learner_display_name"
name="learner[display_name]"
value="{{ form.display_name }}"
/>
</div>
{% unless form.options.invite? %}
<div class="np-form-field {% if form.errors contains 'current_password' %}np-account-form-field-error{% endif %}">
<label class="np-input-label" for="{{version}}_learner_current_password">
{% t .current_password %} *
</label>
<input
class="np-input"
id="{{version}}_learner_current_password"
name="learner[current_password]"
type="password"
/>
</div>
<div class="np-form-field {% if form.errors contains 'password' %}np-account-form-field-error{% endif %}">
<label class="np-input-label" for="{{version}}_learner_password">
{% t .new_password %} *
</label>
<input
class="np-input"
id="{{version}}_learner_password"
name="learner[password]"
type="password"
/>
</div>
<div class="np-form-field {% if form.errors contains 'password_confirmation' %}np-account-form-field-error{% endif %}">
<label class="np-input-label" for="{{version}}_learner_password_confirmation">
{% t .confirm_new_password %} *
</label>
<input
class="np-input"
id="{{version}}_learner_password_confirmation"
name="learner[password_confirmation]"
type="password"
/>
</div>
{% endunless %}
{% if form.options.invite? %}
<div class="np-form-field {% if form.errors contains 'password' %}np-account-form-field-error{% endif %}">
<label class="np-input-label" for="{{version}}_learner_password">
{% t shared.password %} *
</label>
<input
class="np-input"
id="{{version}}_learner_password"
name="learner[password]"
type="password"
/>
</div>
{% if form.terms_of_service_required? %}
<div class="np-form-field terms-of-service {% if form.errors contains 'terms_of_service_accepted' %}np-account-form-field-error{% endif %}">
<input
id="{{version}}_learner_terms_of_service"
name="learner[terms_of_service_accepted]"
type="checkbox"
/>
<div class="label">
{% t .terms_of_service %}
<a
target="_blank"
href={{ form.terms_of_service_url }}
>
{% t .terms_link %}
</a>
</div>
</div>
{% else %}
<div class="np-margin-top">
<span class="np-form-terms ">
{% t .terms %}
<a
class="np-form-link np-button-color"
target="_blank"
href={{ form.terms_of_service_url }}
>
{% t .terms_link %}
</a>
</span>
</div>
{% endif %}
<input
id="{{version}}_invite_token"
name="learner[token]"
value="{{ form.invite_token }}"
type="hidden"
/>
{% endif %}

View File

@ -0,0 +1,17 @@
<form class="np-form" action="{{ form.options.action }}" method="post" id="mobile_edit_learner" novalidate>
<input type="hidden" name="_method" value="{{ form.options.http_method }}">
{% form_authenticity_token %}
<div class="np-card np-account-form">
<div class="np-card-container np-card-padding">
{% render "account_form", form: form, version: "mobile" %}
</div>
</div>
<div class="np-card np-account-avatar">
<div class="np-card-container np-card-padding">
{% include "account_avatar", version: "mobile" %}
</div>
</div>
<button type="submit" class="np-button np-button-big np-button-large-font np-form-action">
{% t shared.account.save %}
</button>
</form>

View File

@ -0,0 +1,23 @@
{% capture settings_path %}{% route account %}{% endcapture %}
{% capture transcript_path %}{% route transcript %}{% endcapture %}
{% if current_person.signed_in? %}
{% unless current_school.sso_active? %}
<nav class="np-tabs np-account-tabs">
<div class="np-tabs-content">
<div class="np-tab{% if page.path == settings_path %} np-tab-active{% endif %}">
<a class="np-tab-link" href="{{ settings_path}}">
{% t .profile_settings %}
</a>
<div class="np-tab-indicator np-button-background-color"></div>
</div>
<div class="np-tab{% if page.path == transcript_path %} np-tab-active{% endif %}">
<a class="np-tab-link" href="{{ transcript_path }}">
{% t .transcript %}
</a>
<div class="np-tab-indicator np-button-background-color"></div>
</div>
</div>
</nav>
{% endunless %}
{% endif %}

View File

@ -0,0 +1,124 @@
<div class="recommended-wrapper">
<div class="heading lang-en">
Browse all courses
</div>
<div class="heading lang-de">
Alle Kurse durchsuchen
</div>
<div class="carousel-filters-wrapper">
{% include 'catalog-filters' %}
</div>
<div class="catalog-courses-wrapper">
{% for course in courses.enrolled %}
{% unless course.properties.resource or course.properties.on_demand%}
{% if course.properties.language == userLanguage %}
<div class="catalog-course-container">{% include "cards_course" %}</div>
{% endif %}
{% endunless %}
{% endfor %}
</div>
</div>
<style>
.catalog-courses-wrapper {
display: grid;
grid-template-columns: repeat(4,1fr);
gap: 20px;
margin-top: 30px;
}
.all-courses-carousel {
position: relative;
}
.slick-arrow {
position: absolute;
top: -30px;
z-index: 111;
cursor: pointer;
}
.right-arrow {
margin-left: 30px;
}
.slick-dots button {
display: block;
width: 10px;
height: 10px;
padding: 0;
border: none;
border-radius: 1px;
background: #8878FF;
text-indent: -9999px;
}
.slick-dots {
list-style-type: none;
}
.slick-dots {
display: flex;
justify-content: center;
margin: 0;
padding-top: 3rem;
list-style-type: none;
gap: 10px;
}
.slick-dots li {
margin: 0 0.25rem;
}
.slick-dots li.slick-active button {
background: #6CF1C9;
}
@media only screen and (max-width: 1170px) {
.catalog-courses-wrapper {
grid-template-columns: repeat(2,1fr);
}
}
@media only screen and (max-width: 768px) {
.catalog-courses-wrapper {
grid-template-columns: repeat(1,1fr);
}
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
const filters = document.querySelectorAll('.filter');
const cards = document.querySelectorAll('.catalog-course-container .card');
let activeFilter = null;
filters.forEach(filter => {
filter.addEventListener('click', function() {
const value = filter.getAttribute('value');
if (activeFilter === value) {
activeFilter = null;
filter.classList.remove('filter-active');
} else {
activeFilter = value;
filters.forEach(f => f.classList.remove('filter-active'));
filter.classList.add('filter-active');
}
filterCourses();
});
});
function filterCourses() {
if (!activeFilter) {
cards.forEach(card => {
card.parentElement.style.display = 'block';
});
} else {
cards.forEach(card => {
const cardCategories = card.getAttribute('categories').split(',');
if (cardCategories.includes(activeFilter)) {
card.parentElement.style.display = 'block';
} else {
card.parentElement.style.display = 'none';
}
});
}
}
});
</script>

View File

@ -0,0 +1,81 @@
<div class="recommended-wrapper">
<div class="heading lang-en">
Browse all learning paths
</div>
<div class="heading lang-de">
Alle Lernpfade durchsuchen
</div>
<div class="all-lp-wrapper">
{% for learning_path in learning_paths.enrolled %}
{% for category in learning_path.categories %}
{% if category.name == userLanguage %}
<div class="carousel-card">
{% include "cards_learning_path" %}
</div>
{% endif %}
{% endfor %}
{% endfor %}
</div>
</div>
<style>
.all-lp-wrapper {
display: grid;
grid-template-columns: repeat(4,1fr);
gap: 20px;
margin-top: 30px;
}
.all-lp-carousel {
position: relative;
}
.slick-arrow {
position: absolute;
top: -30px;
z-index: 111;
cursor: pointer;
}
.right-arrow {
margin-left: 30px;
}
.slick-dots button {
display: block;
width: 10px;
height: 10px;
padding: 0;
border: none;
border-radius: 1px;
background: #8878FF;
text-indent: -9999px;
}
.slick-dots {
list-style-type: none;
}
.slick-dots {
display: flex;
justify-content: center;
margin: 0;
padding-top: 3rem;
list-style-type: none;
gap: 10px;
}
.slick-dots li {
margin: 0 0.25rem;
}
.slick-dots li.slick-active button {
background: #6CF1C9;
}
@media only screen and (max-width: 1170px) {
.all-lp-wrapper {
grid-template-columns: repeat(2,1fr);
}
}
@media only screen and (max-width: 768px) {
.all-lp-wrapper {
grid-template-columns: repeat(1,1fr);
}
}
</style>

View File

@ -0,0 +1,64 @@
<div class="banner-container">
<div class="banner-content">
<div class="banner-text-wrapper">
<div class="banner-heading">
Become part of the DeepL community
</div>
<div class="desc">
Join our vibrant community today and connect with like-minded individuals from around the world! Share your ideas, passions, and experiences while learning from others.
</div>
</div>
<div class="banner-btn-container">
<a href="#" class="dark-btn">Join us now</a>
</div>
</div>
<div class="banner-image-wrapper">
<img src="https://s3.amazonaws.com/static.northpass.com/DeepL/images/Group+427321804.png" alt="" class="banner-img">
</div>
</div>
<style>
.banner-container {
display: flex;
gap: 20px;
background: #F8F8F8;
padding: 32px;
border-radius: 8px;
}
.banner-content, .banner-image-wrapper {
flex-basis: 50%;
}
.banner-content {
display: flex;
flex-direction: column;
justify-content: space-between;
}
.banner-heading {
font-size: 80px;
font-weight: 300;
line-height: 80px;
letter-spacing: -0.015em;
text-align: left;
margin-bottom: 32px;
}
.desc {
font-size: 18px;
font-weight: 400;
line-height: 25.2px;
}
.banner-img {
width: 100%;
max-width: 440px;
height: fit-content;
}
.banner-image-wrapper {
display: flex;
justify-content: center;
align-items: center;
}
.banner-btn-container {
display: flex;
margin-top: 15%;
}
</style>

View File

@ -0,0 +1,54 @@
<div class="card" categories="{% for category in course.categories %}{{category.name}},{% endfor %}" progress="{% if course.progress > 0 and course.progress < 100 %}In progress{% elsif course.progress == 100 %}Completed{% else %}Not started{% endif %}">
<div class="card-container">
<img
class="card-image"
alt="{{ course.name }}"
src="{{ course.image_url }}"
>
<div class="card-content">
<div class="card-details">
<div class="card-detail course-lessons lang-en">
{{course.activities_count}} lessons
</div>
<div class="card-detail course-lessons lang-de">
{{course.activities_count}} Lektionen
</div>
<div class="card-detail course-time lang-en">
{{course.properties.course_time}} minutes
</div>
<div class="card-detail course-time lang-de">
{{course.properties.course_time}} Minuten
</div>
</div>
<div class="card-content-title">
{{ course.name }}
</div>
<div class="course-content-desc">
{{ course.short_description }}
</div>
<div class="course-progress-container">
<div class="progress-number">{{course.progress}}%</div>
<div class="course-progress">
<span class="course-progress-bar" style="width: {{course.progress}}%;"></span>
</div>
</div>
<div class="card-content-footer">
{% capture course_path %}{% route course, id: course.id %}{% endcapture %}
<a class="card-btn dark-btn lang-en" href="{{ course_path }}">
{% if course.progress == 0 %}
Get started
{% else %}
Continue
{% endif %}
</a>
<a class="card-btn dark-btn lang-de" href="{{ course_path }}">
{% if course.progress == 0 %}
Loslegen
{% else %}
Weiter
{% endif %}
</a>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,63 @@
<div class="card">
<div class="card-container">
<img
class="card-image"
alt="{{ learning_path.name }}"
src="{{ learning_path.image_url }}"
>
<div class="card-content">
<div class="card-details-lp">
<div class="card-detail lang-en">
{% assign lessons = 0 %}
{% for item in learning_path.items %}
{% assign lessons = lessons | plus: 1 %}
{% endfor %}
{{lessons}}
Lessons
</div>
<div class="card-detail lang-de">
{% assign lessons = 0 %}
{% for item in learning_path.items %}
{% assign lessons = lessons | plus: 1 %}
{% endfor %}
{{lessons}}
Lektionen
</div>
{% if learning_path.has_certificate? %}
<div class="cert-tag lang-en">
Certification
</div>
<div class="cert-tag lang-de">
Zertifizierung
</div>
{% endif %}
</div>
<div class="card-content-title">
{{ learning_path.name }}
</div>
<div class="course-progress-container">
<div class="progress-number">{{learning_path.progress}}%</div>
<div class="course-progress">
<span class="course-progress-bar" style="width: {{learning_path.progress}}%;"></span>
</div>
</div>
<div class="card-content-footer">
<a class="card-btn dark-btn lang-en" href="{% route learning_path, id: learning_path.id %}">
{% if learning_path.progress == 0 %}
Get started
{% else %}
Continue
{% endif %}
</a>
<a class="card-btn dark-btn lang-de" href="{% route learning_path, id: learning_path.id %}">
{% if learning_path.progress == 0 %}
Loslegen
{% else %}
Weiter
{% endif %}
</a>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,60 @@
<div class="card" categories="{% for category in course.categories %}{{category.name}},{% endfor %}" progress="{% if course.progress > 0 and course.progress < 100 %}In progress{% elsif course.progress == 100 %}Completed{% else %}Not started{% endif %}">
<div class="card-container">
<img
class="card-image"
alt="{{ course.name }}"
src="{{ course.image_url }}"
>
<div class="card-content">
<div class="card-details">
<div class="card-detail course-lessons">
{% for category in course.categories %}
{% if category.name == 'PDF' %}
PDF
{% elsif category.name == 'Video' %}
Video
{% endif %}
{% endfor %}
</div>
<div class="card-detail course-time">
{{course.properties.course_time}} minutes
</div>
</div>
<div class="card-content-title">
{{ course.name }}
</div>
<div class="card-content-footer">
{% capture course_path %}{% route course, id: course.id %}{% endcapture %}
<a class="card-btn dark-btn lang-en"
{% if course.enrolled? %}
href="{% route course_viewer, course_id: course.id, learning_path_id: params.learning_path_id %}"
{% else %}
href="{{ course_path }}"
{% endif %}>
{% for category in course.categories %}
{% if category.name == 'PDF' %}
Read now
{% elsif category.name == 'Video' %}
Watch now
{% endif %}
{% endfor %}
</a>
<a class="card-btn dark-btn lang-de"
{% if course.enrolled? %}
href="{% route course_viewer, course_id: course.id, learning_path_id: params.learning_path_id %}"
{% else %}
href="{{ course_path }}"
{% endif %}>
{% for category in course.categories %}
{% if category.name == 'PDF' %}
Jetzt lesen
{% elsif category.name == 'Video' %}
Jetzt anschauen
{% endif %}
{% endfor %}
</a>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,89 @@
<div class="card-webinar">
<div class="card-content-training-event">
<div class="card-content-title">
{{ training_event.title }}
</div>
<div class="card-details-webinar">
<div class="card-detail-webinar course-lessons">
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 21.8149H20V22.8149H4V21.8149Z" fill="#42A2FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 2.81494C7.22386 2.81494 7 3.0388 7 3.31494V14.8149C7 15.0172 7.12182 15.1995 7.30866 15.2769C7.4955 15.3543 7.71055 15.3115 7.85355 15.1685L10.2071 12.8149H21.5C21.7761 12.8149 22 12.5911 22 12.3149V3.31494C22 3.0388 21.7761 2.81494 21.5 2.81494H7.5ZM8 13.6078V3.81494H21V11.8149H10C9.86739 11.8149 9.74021 11.8676 9.64645 11.9614L8 13.6078ZM2 7.81494C2 7.5388 2.22386 7.31494 2.5 7.31494H6V8.31494H3V16.3149H14C14.1326 16.3149 14.2598 16.3676 14.3536 16.4614L15.5 17.6078V13.8149H16.5V18.8149C16.5 19.0172 16.3782 19.1995 16.1913 19.2769C16.0045 19.3543 15.7894 19.3115 15.6464 19.1685L13.7929 17.3149H2.5C2.22386 17.3149 2 17.0911 2 16.8149V7.81494ZM17 7.31494H16V8.31494H17V7.31494ZM14 7.31494H15V8.31494H14V7.31494ZM13 7.31494H12V8.31494H13V7.31494Z" fill="#42A2FF"/>
</svg>
{% t shared.event_types, key: training_event.event_type %}
</div>
<div class="card-detail-webinar course-time">
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 21.8149H20V22.8149H4V21.8149Z" fill="#42A2FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.5 5.31494V6.81494H6.5V5.31494H17.5V6.81494H18.5V5.31494H21V7.81494H3V5.31494H5.5ZM5.5 4.31494H2.5C2.22386 4.31494 2 4.5388 2 4.81494V19.3149C2 19.5911 2.22386 19.8149 2.5 19.8149H21.5C21.7761 19.8149 22 19.5911 22 19.3149V4.81494C22 4.5388 21.7761 4.31494 21.5 4.31494H18.5V2.81494H17.5V4.31494H6.5V2.81494H5.5V4.31494ZM3 8.81494V18.8149H21V8.81494H3ZM5.5 10.3149H8V11.3149H5.5V10.3149ZM9 10.3149H11.5V11.3149H9V10.3149ZM15 10.3149H12.5V11.3149H15V10.3149ZM16 10.3149H18.5V11.3149H16V10.3149ZM5.5 16.3149H8V17.3149H5.5V16.3149ZM11.5 16.3149H9V17.3149H11.5V16.3149ZM12.5 16.3149H18.5V17.3149H12.5V16.3149ZM8 13.3149H5.5V14.3149H8V13.3149ZM9 13.3149H11.5V14.3149H9V13.3149ZM15 13.3149H12.5V14.3149H15V13.3149ZM16 13.3149H18.5V14.3149H16V13.3149Z" fill="#42A2FF"/>
</svg>
{% t .sessions, count: training_event.sessions.size %}
</div>
</div>
<div class="card-training-session">
<span class="card-content-label lang-en">
Next session
</span>
<span class="card-content-label lang-de">
Nächste Sitzung
</span>
<div class="card-training-session-date">
<div class="card-training-session-date-day">
{{ training_event.sessions.first.day }}
</div>
<div>
<div class="card-training-session-date-month">
{{ training_event.sessions.first.month }}
</div>
<div class="card-training-session-date-year">
{{ training_event.sessions.first.year }}
</div>
</div>
</div>
</div>
</div>
<div class="card-footer">
<div class="card-training-sessions">
<a
class="card-btn dark-btn lang-en"
href="{% route training_session, id: training_event.sessions.first.id %}"
>
Register now
</a>
<a
class="card-btn dark-btn lang-de"
href="{% route training_session, id: training_event.sessions.first.id %}"
>
Jetzt registrieren
</a>
</div>
</div>
</div>
<style>
.card-webinar {
background: #f8f8f8;
padding: 32px;
border-radius: 8px;
margin: 0 20px 20px 0;
height: 100%;
display: flex;
flex-direction: column;
justify-content: end;
}
.card-details-webinar {
display: flex;
color: #42A2FF;
font-size: 14px;
font-weight: 400;
margin: 20px 0;
}
.card-detail-webinar {
padding-left: 5px;
display: flex;
align-items: center;
gap: 5px;
}
</style>

View File

@ -0,0 +1,136 @@
<div class="carousel-filters">
<div class="filters-container">
<div class="filter lang-en" value="Popular">Popular</div>
<div class="filter lang-de" value="Popular">Beliebt</div>
<div class="filter lang-en" value="Administration">Administration</div>
<div class="filter lang-de" value="Administration">Verwaltung</div>
<div class="filter lang-en" value="Products" >Products</div>
<div class="filter lang-de" value="Products" >Produkte</div>
<div class="filter lang-en" value="Features" >Features</div>
<div class="filter lang-de" value="Features" >Funktionen</div>
</div>
<div class="filter-dropdown-container">
<div class="text lang-en">Filter by progress:</div>
<div class="text lang-de">Nach Fortschritt filtern:</div>
<div class="filter-dropdown-block">
Not selected
<svg width="12" height="9" viewBox="0 0 12 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.8142 0.52832H10.6423C10.5626 0.52832 10.4876 0.567383 10.4407 0.631445L6.00166 6.7502L1.5626 0.631445C1.51573 0.567383 1.44073 0.52832 1.36104 0.52832H0.189163C0.0876002 0.52832 0.0282252 0.643946 0.0876002 0.726758L5.59698 8.32207C5.79698 8.59707 6.20635 8.59707 6.40479 8.32207L11.9142 0.726758C11.9751 0.643946 11.9157 0.52832 11.8142 0.52832Z" fill="black" fill-opacity="0.25"/>
</svg>
</div>
<div class="filter-by-progress-dropdown hidden">
<div class="filter-by-progress-option lang-en" value="All courses">All courses</div>
<div class="filter-by-progress-option lang-de" value="All courses">Alle Kurse</div>
<div class="filter-by-progress-option lang-en" value="Not started">Not started</div>
<div class="filter-by-progress-option lang-de" value="Not started">Nicht gestartet</div>
<div class="filter-by-progress-option lang-en" value="In progress">In progress</div>
<div class="filter-by-progress-option lang-de" value="In progress">In Arbeit</div>
<div class="filter-by-progress-option lang-en" value="Completed">Completed</div>
<div class="filter-by-progress-option lang-de" value="Completed">Abgeschlossen</div>
</div>
</div>
</div>
<style>
.carousel-filters {
background: #EDEDED;
border-radius: 8px;
padding: 24px 32px;
margin-top: 30px;
display: flex;
justify-content: space-between;
}
.filters-container {
display: flex;
gap: 44px;
width: 100%;
align-items: center;
}
.filter {
font-size: 18px;
font-weight: 400;
line-height: 27px;
color: #0F2B46;
text-decoration: underline;
cursor: pointer;
padding: 5px 10px;
}
.filter-dropdown-container {
position: relative;
display: flex;
align-items: center;
gap: 10px;
justify-content: end;
width: 100%;
max-width: 290px;
}
.filter-dropdown-block {
background-color: white;
border: 1px solid #ccc;
padding: 10px;
cursor: pointer;
user-select: none;
max-width: 150px;
width: 100%;
border-radius: 12px;
display: flex;
justify-content: space-between;
align-items: center;
}
.filter-by-progress-dropdown {
background-color: white;
border: 1px solid #ccc;
position: absolute;
width: 100%;
z-index: 1;
top: 40px;
}
.filter-by-progress-option {
padding: 10px;
cursor: pointer;
}
.filter-by-progress-option:hover {
background-color: #f0f0f0;
}
.hidden {
display: none;
}
.filter-active {
color: #42A2FF;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function () {
const dropdownBlock = document.querySelector('.filter-dropdown-block');
const dropdown = document.querySelector('.filter-by-progress-dropdown');
const options = document.querySelectorAll('.filter-by-progress-option');
dropdownBlock.addEventListener('click', function () {
dropdown.classList.toggle('hidden');
});
options.forEach(option => {
option.addEventListener('click', function () {
const selectedValue = option.getAttribute('value');
dropdownBlock.textContent = selectedValue;
dropdown.classList.add('hidden');
});
});
document.addEventListener('click', function (event) {
if (!dropdownBlock.contains(event.target) && !dropdown.contains(event.target)) {
dropdown.classList.add('hidden');
}
});
});
</script>

View File

@ -0,0 +1,88 @@
<div class="carousel-filters">
<div class="filters-container">
<div class="filter lang-en" value="Popular">Popular</div>
<div class="filter lang-de" value="Popular">Beliebt</div>
<div class="filter lang-en" value="Administration">Administration</div>
<div class="filter lang-de" value="Administration">Verwaltung</div>
<div class="filter lang-en" value="Products" >Products</div>
<div class="filter lang-de" value="Products" >Produkte</div>
<div class="filter lang-en" value="Features" >Features</div>
<div class="filter lang-de" value="Features" >Funktionen</div>
</div>
</div>
<style>
.carousel-filters {
background: #EDEDED;
border-radius: 8px;
padding: 24px 32px;
margin-top: 30px;
display: flex;
justify-content: space-between;
}
.filters-container {
display: flex;
gap: 44px;
width: 100%;
align-items: center;
}
.filter {
font-size: 18px;
font-weight: 400;
line-height: 27px;
color: #0F2B46;
text-decoration: underline;
cursor: pointer;
padding: 5px 10px;
}
.filter-dropdown-container {
position: relative;
display: flex;
align-items: center;
gap: 10px;
justify-content: end;
width: 100%;
max-width: 290px;
}
.filter-dropdown-block {
background-color: white;
border: 1px solid #ccc;
padding: 10px;
cursor: pointer;
user-select: none;
max-width: 150px;
width: 100%;
border-radius: 12px;
display: flex;
justify-content: space-between;
align-items: center;
}
.filter-by-progress-dropdown {
background-color: white;
border: 1px solid #ccc;
position: absolute;
width: 100%;
z-index: 1;
top: 40px;
}
.filter-by-progress-option {
padding: 10px;
cursor: pointer;
}
.filter-by-progress-option:hover {
background-color: #f0f0f0;
}
.hidden {
display: none;
}
.filter-active {
color: #42A2FF;
}
</style>

View File

@ -0,0 +1,4 @@
<div class="col-xs-12 col-md-4 spacing-clear">
{% include "certificates_verification" %}
{% include "certificates_metadata" %}
</div>

View File

@ -0,0 +1,59 @@
<div class="np-card spacing-clear">
<div class="np-card-container padding-spacing-8">
<div class="row np-certificate-metadata-row">
<div class="col-xs-6 col-md-6">
<p class="np-certificate-metadata-title" >
{% t .learner %}
</p>
</div>
<div class="col-xs-6 col-md-6">
<p class="np-certificate-metadata-value">
{{certificate.learner_name}}
</p>
</div>
</div>
<div class="line"></div>
{% if certificate.issuer_name_enabled? %}
<div class="row np-certificate-metadata-row">
<div class="col-xs-6 col-md-6">
<p class="np-certificate-metadata-title">
{% t .issued_by %}
</p>
</div>
<div class="col-xs-6 col-md-6">
<p class="np-certificate-metadata-value">
{{ certificate.issuer_name }}
</p>
</div>
</div>
<div class="line"></div>
{% endif %}
<div class="row np-certificate-metadata-row">
<div class="col-xs-6 col-md-6">
<p class="np-certificate-metadata-title" >
{% t .issued_on %}
</p>
</div>
<div class="col-xs-6 col-md-6">
<p class="np-certificate-metadata-value">
{{ certificate.issue_date }}
</p>
</div>
</div>
<div class="line"></div>
<div class="row np-certificate-metadata-row">
<div class="col-xs-6 col-md-6">
<p class="np-certificate-metadata-title" >
{% t .expires_on %}
</p>
</div>
<div class="col-xs-6 col-md-6">
<p class="np-certificate-metadata-value">
{{ certificate.expiration_date_translation }}
</p>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,35 @@
<script type="text/javascript">
const resizeIframe = () => {
const combinedPadding = 16;
const previewIframe = document.getElementById("previewIframe");
const previewIFrameCard = document.getElementById("previewIFrameCard");
const templateInPreviewContainer = previewIframe.contentWindow.document.querySelector('.np-certificate-container');
const previewIframeContentHeight = templateInPreviewContainer.offsetHeight;
const previewIframeContentWidth = templateInPreviewContainer.offsetWidth;
const certificateRatio = previewIframeContentHeight / previewIframeContentWidth;
templateInPreviewContainer.style.margin = 0;
previewIFrameCard.style.height = `${previewIFrameCard.offsetWidth * certificateRatio}px`;
const scaledIframeWidth = previewIFrameCard.offsetWidth - combinedPadding;
const scaledIframeHeight = scaledIframeWidth * certificateRatio;
const scale = scaledIframeHeight / previewIframeContentHeight;
previewIframe.style.transform = `scale(${scale})`;
}
window.onresize = resizeIframe;
</script>
<div class="col-xs-12 col-md-8 np-certificate-iframe-container">
<div class="np-card spacing-clear">
<div id="previewIFrameCard" class="np-card-container np-certificate-card">
<iframe
id="previewIframe"
onload="resizeIframe()"
class="np-certificate-iframe-preview"
srcdoc="{{ certificate.certificate_template_html }}"
></iframe>
</div>
</div>
</div>

View File

@ -0,0 +1,44 @@
<div class="top-bar np-certificate-top-bar-spacing">
<div class="top-bar__container uk-container uk-container-center uk-padding-horizontal np-max-width">
<div class="top-bar__col">
<h2 class="np-certificate-title" >
{{certificate.certificate_name}}
</h2>
</div>
<div class="button-container np-certificate-button-container">
{% if certificate.linkedin_sharing_enabled and current_person.signed_in? and certificate.learner_uuid == current_person.id %}
<a
class="np-button np-certificate-button np-certificate-button-secondary"
href="{{certificate.linkedin_share_url}}"
target="_blank"
>
<i class="fab fa-linkedin np-certificate-share-icon"></i>
{% t .share %}
</a>
{% endif %}
<button
id="print"
type="button"
class="np-button np-certificate-button np-certificate-button-secondary np-certificate-button-print"
>
{% t .print %}
</button>
{% if certificate.generating_pdf %}
<div class="np-button np-certificate-button np-certificate-button-primary np-certificate-spinner-container">
<i class="loader fad fa-spinner-third fa-spin np-certificate-spinner-icon np-button-font-color"></i>
</div>
{% else %}
<a
href="{{ certificate.download_url }}"
aria-label="{% t .download %}"
target="_blank"
rel="noopener noreferrer"
download
class="np-button np-certificate-button np-certificate-button-primary np-button-font-color"
>
{% t .download %}
</a>
{% endif %}
</div>
</div>
</div>

View File

@ -0,0 +1,15 @@
<div class="np-card spacing-clear np-certificate-verification-card">
<div class="np-card-container np-certificate-verification-container">
<div class="np-certificate-verification-icon-container np-certificate-verification-icon-container-{{certificate.verification_status}}">
<i class="far fa-{{certificate.verification_icon}} np-certificate-verification-icon"></i>
</div>
<div class="np-certificate-verification-info-container">
<h2 class="np-certificate-verification-info-status spacing-clear">
{{certificate.verification_title}}
</h2>
<p class="np-certificate-verification-info-description spacing-clear">
{{certificate.verification_description}}
</p>
</div>
</div>
</div>

View File

@ -0,0 +1,4 @@
<i class="far fa-lock-alt np-course-outline-content-activity-icon-locked"></i>
<span class="np-course-outline-content-activity-title">
{{ activity.title }}
</span>

View File

@ -0,0 +1,15 @@
{% if course.enrolled? %}
<a
href="{% route activity_viewer,
id: activity.id,
course_id: params.course_id,
learning_path_id: params.learning_path_id
%}" class="{{ class }}"
>
{{ activity.title }}
</a>
{% else%}
<span class="{{ class }}">
{{ activity.title }}
</span>
{% endif %}

View File

@ -0,0 +1,7 @@
<div class="overview-categories-wrapper">
{% for category in course.categories %}
<div class="category-item">
{{ category.name }}
</div>
{% endfor %}
</div>

View File

@ -0,0 +1,4 @@
<div class="np-card-text">
{{ course.full_description }}
</div>

View File

@ -0,0 +1,150 @@
<div class="overview-container">
<div class="overview-header-container">
<div class="overview-btn-container">
<svg width="16" height="9" viewBox="0 0 16 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 4.49991L1 4.49991M1 4.49991L4.33417 1.09082M1 4.49991L4.33417 7.909" stroke="#0F2B46" stroke-linejoin="round"/>
</svg>
<a href="/app/catalog" class="overview-back-btn">Back to all courses</a>
</div>
<div class="overview-heading">
{{ course.name }}
</div>
</div>
<div class="overview-content-container">
<div class="content-details">
<img
src="{{ course.image_url }}"
class="np-top-image np-top-image-spacing"
alt="{{ course.name }}"
/>
{% include "course_description" %}
<div class="overview-details-container">
<div class="overview-detail">
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M40 44.0001L8.00001 44L8.00001 42L40 42.0001L40 44.0001Z" fill="#0F2B46"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24 36C31.732 36 38 29.732 38 22C38 14.268 31.732 8 24 8C16.268 8 10 14.268 10 22C10 29.732 16.268 36 24 36ZM24 38C32.8366 38 40 30.8366 40 22C40 13.1634 32.8366 6 24 6C15.1634 6 8 13.1634 8 22C8 30.8366 15.1634 38 24 38Z" fill="#0F2B46"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M23 21L23 11L25 11L25 21L23 21Z" fill="#0F2B46"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.3397 22.2679L35 27.2679L34 29L25.3397 24L26.3397 22.2679Z" fill="#0F2B46"/>
</svg>
<div class="detail-content">
{{course.properties.course_time}} minutes
</div>
</div>
<div class="overview-detail">
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M40 44.0033H8V42.0033H40V44.0033Z" fill="#0F2B46"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M34 23H24V21H34V23Z" fill="#0F2B46"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19 18H14V16H19V18Z" fill="#0F2B46"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M34 30L24 30V28L34 28V30Z" fill="#0F2B46"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19 25H14V23H19V25Z" fill="#0F2B46"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.2368 4.35388C13.4268 4.12943 13.7059 4 14 4H29C29.5523 4 30 4.44772 30 5V10H28V6H14.4637L10 11.2727V31H19V33H9C8.44772 33 8 32.5523 8 32V10.9062C8 10.6696 8.08389 10.4407 8.23677 10.2601L13.2368 4.35388Z" fill="#0F2B46"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.2368 9.35388C23.4268 9.12943 23.7059 9 24 9H39C39.5523 9 40 9.44772 40 10V37C40 37.5523 39.5523 38 39 38H19C18.4477 38 18 37.5523 18 37V15.9062C18 15.6696 18.0839 15.4407 18.2368 15.2601L23.2368 9.35388ZM24.4637 11L20 16.2727V36H38V11H24.4637Z" fill="#0F2B46"/>
</svg>
<div class="detail-content">
{{course.activities_count}} lessons
</div>
</div>
</div>
{% if course.categories.any? %}
{% include "course_categories" %}
{% endif %}
{% if course.instructors.any? %}
<div class="np-card-content-divider">
{% include "course_instructors" %}
</div>
{% endif %}
{% if course.events.any? %}
<div class="np-card-content-divider">
{% include "course_events" %}
</div>
{% endif %}
</div>
<div class="content-activities">
<div class="np-top-cta">
{% include "course_progress_and_cta" %}
</div>
{% include "course_outline" %}
</div>
</div>
</div>
<style>
.overview-back-btn {
font-size: 18px;
font-weight: 400;
line-height: 25.2px;
letter-spacing: -0.01em;
text-align: center;
color: #0F2B46;
text-decoration: none;
}
.overview-btn-container {
display: flex;
gap: 10px;
align-items: center;
}
.overview-heading {
font-size: 48px;
font-weight: 320;
line-height: 50.4px;
letter-spacing: -0.015em;
color: #0F2B46;
}
.overview-header-container {
display: flex;
flex-direction: column;
gap: 30px;
}
.overview-content-container {
display: grid;
margin-top: 30px;
grid-template-columns: repeat(2,1fr);
gap: 70px;
}
.overview-details-container {
display: flex;
gap: 30px;
}
.overview-detail {
display: flex;
flex-direction: column;
gap: 13px;
align-items: start;
}
.detail-content {
font-size: 18px;
font-weight: 400;
line-height: 25.2px;
letter-spacing: -0.01em;
color: #0F2B46;
}
.category-item {
font-size: 14px;
font-weight: 400;
line-height: 19.6px;
letter-spacing: -0.01em;
color: #0F2B46;
padding: 11px 12px;
background: #EDEDED;
border-radius: 4px;
}
.overview-categories-wrapper {
display: flex;
flex-wrap: wrap;
gap: 17px;
margin-top: 40px;
}
@media only screen and (max-width: 900px) {
.overview-content-container {
grid-template-columns: repeat(1,1fr);
}
}
</style>

View File

@ -0,0 +1,28 @@
<h3 class="np-card-heading">
{% t .header %}
</h3>
<div class="np-flex-column">
{% for event in course.events %}
<div class="np-course-events-content-item">
<div class="np-course-events-content-date np-button-background-color">
<div class="np-course-events-content-month">
{{ event.sessions.first.abbreviated_month }}
</div>
<div class="np-course-events-content-day">
{{ event.sessions.first.day }}
</div>
</div>
<div class="np-course-events-content-details">
<div class="np-course-events-content-name">
{{ event.title }}
</div>
<div class="np-course-events-content-type np-text-light">
{% t shared.event_types, key: event.event_type %}
</div>
<div class="np-course-events-content-time np-button-color">
{{ event.sessions.first.time_period }} {{ event.sessions.first.time_zone }}
</div>
</div>
</div>
{% endfor %}
</div>

View File

@ -0,0 +1,16 @@
<div class="np-top-vocabulary np-text-title np-text-muted">
{{ current_school.course_vocabulary }}
<i class="far fa-graduation-cap np-button-color np-learning-path-icon np-hidden-mobile">
</i>
</div>
<div class="np-top-title">
<a href="{% route home %}" class="np-back-button" aria-label="{% t shared.go_back %}">
<i class="far fa-arrow-left np-hidden-mobile np-icon-back"></i>
</a>
{{ course.name }}
</div>
<img
src="{{ course.image_url }}"
class="np-top-image np-hidden-desktop"
alt="{{ course.name }}"
/>

View File

@ -0,0 +1,22 @@
<h3 class="np-card-heading">
{% t .header %}
</h3>
<div class="np-flex">
{% for instructor in course.instructors %}
<div class="np-content-instructors-content-item">
<img
src="{{ instructor.avatar_url }}"
class="np-content-instructors-content-image"
alt="{{ instructor.name }}"
/>
<div class="np-content-instructors-content-description">
<div class="np-content-instructors-content-name">
{{ instructor.name }}
</div>
<div class="np-content-instructors-content-info np-text-light">
{{ instructor.title }}
</div>
</div>
</div>
{% endfor %}
</div>

View File

@ -0,0 +1,40 @@
<div class="np-card-container np-card-padding-large">
{% include "course_header" %}
<div class="np-top-cta">
{% include "course_progress_and_cta" %}
</div>
</div>
{% if course.progress == 0 %}
<div class="np-card-container np-card-padding np-card-spacing">
{% include "course_description" %}
</div>
<div class="np-card-container np-card-padding np-card-spacing">
{% include "course_outline" %}
</div>
{% else %}
<div class="np-card-container np-card-padding np-card-spacing">
{% include "course_outline" %}
</div>
<div class="np-card-container np-card-padding np-card-spacing">
{% include "course_description" %}
</div>
{% endif %}
{% if course.categories.any? %}
<div class="np-card-container np-card-padding np-card-spacing">
{% include "course_categories" %}
</div>
{% endif %}
{% if course.instructors.any? %}
<div class="np-card-container np-card-padding np-card-spacing">
{% include "course_instructors" %}
</div>
{% endif %}
{% if course.events.any? %}
<div class="np-card-container np-card-padding np-card-spacing">
{% include "course_events" %}
</div>
{% endif %}

View File

@ -0,0 +1,77 @@
<div class="np-course-outline">
<div class="small-heading">
Course outline
</div>
<div class="course-outline-content">
<ol class="np-course-outline-content-section">
{% for section in course.sections %}
<li class="np-course-outline-content-section-list">
<div class="outline-section-name">
{{ section.name }}
</div>
<ol class="course-outline-content-activity">
{% for activity in section.activities %}
<li class="np-course-outline-content-activity-list">
{% if activity.completed? %}
<i class="fas fa-circle np-course-outline-content-activity-icon np-button-color"></i>
{% if activity.locked? %}
{% include "course_activity_locked" %}
{% else %}
{% include "course_activity_unlocked", class: "course-outline-content-activity-link-completed" %}
{% endif %}
<div class="np-button-background-color np-course-outline-content-activity-list-bar"></div>
{% else %}
{% unless activity.locked? %}
<i class="far fa-circle np-course-outline-content-activity-icon"></i>
{% endunless %}
{% if activity.locked? %}
{% include "course_activity_locked" %}
{% else %}
{% include "course_activity_unlocked", class: "course-outline-content-activity-link" %}
{% endif %}
<div class="np-course-outline-content-activity-list-bar"></div>
{% endif %}
</li>
{% endfor %}
</ol>
</li>
{% endfor %}
</ol>
</div>
</div>
<style>
.course-outline-content {
margin-top: 50px;
}
.outline-section-name {
font-size: 24px;
font-weight: 400;
line-height: 30px;
letter-spacing: -0.015em;
color: #0F2B46;
}
.course-outline-content-activity {
padding: 0;
}
.np-course-outline-content-activity-list {
border-bottom: none;
}
.course-outline-content-activity-link {
font-size: 18px;
font-weight: 400;
line-height: 25.2px;
letter-spacing: -0.01em;
text-align: left;
color: #42A2FF;
text-decoration: none;
margin-left: 20px;
}
.np-course-outline-content-activity-icon {
width: 23px;
height: 23px;
color: #0F2B46
}
</style>

View File

@ -0,0 +1,77 @@
<div class="np-top-cta-progress-content">
<div class="small-heading">
Course progress
</div>
<div class="progress-overview">
<div class="np-progress-bar-container">
<div
style="width: {{ course.progress }}%"
class="np-button-background-color np-card-progress-bar">
</div>
</div>
<div class="progress-text">
{{ course.progress }}%
</div>
</div>
</div>
{% if course.learner_can_retake? %}
<form action="{% route course_retake, id: course.id %}" method="POST">
{% form_authenticity_token %}
<button type="submit" class="np-top-button np-button-font-color np-button np-button-big">
{% t .retake, key: current_school.course_vocabulary %}
</button>
</form>
{% else %}
<div class="overview-cta-btn-container">
<a
class="overview-cta-btn"
{% if course.enrolled? %}
href="{% route course_viewer, course_id: course.id, learning_path_id: params.learning_path_id %}"
{% else %}
href="{% route course_enrollment, code: course.enrollment_code %}"
{% endif %}
>
{% if course.enrolled? == false %}
{% t shared.enroll %}
{% elsif course.started? == false %}
{% t shared.course.start, key: current_school.course_vocabulary %}
{% elsif course.completed? %}
{% t shared.course.view, key: current_school.course_vocabulary %}
{% else %}
{% t shared.continue %}
{% endif %}
</a>
</div>
{% endif %}
<style>
.progress-text {
color: #42A2FF;
font-size: 14px;
font-weight: 600;
line-height: 19.6px;
letter-spacing: -0.01em;
}
.progress-overview {
display: flex;
gap: 20px;
}
.overview-cta-btn {
font-size: 18px;
font-weight: 400;
line-height: 25.2px;
letter-spacing: -0.01em;
color: #FFFFFF;
padding: 7px 18px;
background: #0F2B46;
border-radius: 40px;
text-decoration: none;
}
.overview-cta-btn-container {
display: flex;
width: 100%;
max-width: 150px;
}
</style>

View File

@ -0,0 +1,7 @@
{% if courses.include_courses_to_restart? %}
<div role="alert" class="np-alert np-alert-global np-alert-info">
<div class="np-alert-container uk-container uk-container-center">
{% t .content %}
</div>
</div>
{% endif %}

View File

@ -0,0 +1,33 @@
<div class="np-course-version-outdated-popup np-popup">
<div class="np-popup-positioner">
<i
class="np-course-version-outdated-popup-trigger fas fa-exclamation-circle"
data-toggle-class-on-target="np-popup-tooltip--visible"
data-toggle-target-parent=".np-popup-tooltip"
data-toggle-outside
></i>
<div
class="np-popup-tooltip"
role="tooltip"
aria-hidden="true"
>
<header class="np-popup-header">
<i class="np-popup-header-icon fas fa-exclamation-circle"></i>
<h3 class="np-popup-header-title">
{% t .title %}
</h3>
</header>
<div class="np-popup-body">
<h4>{% t .body.header %}</h4>
<p>{% t .body.content %}</p>
<a
class="np-popup-body-button"
href="{{ path }}"
>
{% t .body.button %}
</a>
</div>
<div class="np-popup-tail"></div>
</div>
</div>
</div>

View File

@ -0,0 +1,16 @@
{% if courses.in_catalog.any? %}
<div class="np-catalog-courses row row-with-thumbnails">
{% for course in courses.in_catalog %}
<div class="col-xs-12 col-md-6 col-lg-4 np-stretch-content">
{% include "cards_course" with course %}
</div>
{% endfor %}
</div>
{% else %}
{% capture message %}
{% t shared.zero_state.courses.catalog,
key: current_school.course_vocabulary
%}
{% endcapture %}
{% include "courses_zero_state", message: message %}
{% endif %}

View File

@ -0,0 +1,16 @@
{% if courses.enrolled.any? %}
<div class="row row-with-thumbnails">
{% for course in courses.enrolled %}
<div class="{{ class }}">
{% include "cards_course" with course %}
</div>
{% endfor %}
</div>
{% else %}
{% capture message %}
{% t shared.zero_state.courses.index,
key: current_school.course_vocabulary
%}
{% endcapture %}
{% include "courses_zero_state", message: message %}
{% endif %}

View File

@ -0,0 +1,6 @@
<div class="np-dashboard-resources-container">
<div class="np-zero-state-text">
{{ message }}
</div>
<img class="np-zero-state-courses" alt="{{ message }}" />
</div>

View File

@ -0,0 +1,10 @@
<input
id={{value}}
name={{ name }}
value={{ value }}
type="checkbox"
{% if selected %} checked="checked" {% endif %}
/>
<label for={{value}}>
{{label}}
</label>

View File

@ -0,0 +1,40 @@
<div class="np-filter">
<div class="dropdown">
<button
class="np-button dropdown-button"
data-toggle-class="is-open"
data-toggle-escape
data-toggle-outside
data-toggle-target-next
type="button"
>
{% t shared.filters.filter %}
</button>
<div class="dropdown-menu" data-test="modal">
<form method="get">
{%
include "filter_select",
filters: filters,
key: key,
label: label
%}
<button
class="np-button dropdown-button-apply lang-en"
data-toggle-trigger-off
type="submit"
>
{% t shared.filters.apply %}
</button>
<button
class="np-button dropdown-button-apply lang-de"
data-toggle-trigger-off
type="submit"
>
Anwenden
</button>
</form>
</div>
</div>
</div>

View File

@ -0,0 +1,25 @@
{% if params.q %}
<input type="hidden" name="q" value="{{ params.q }}">
{% endif %}
<label class="dropdown-label lang-en" for="filter[category_uuid][in][]">
{{ label }}
</label>
<label class="dropdown-label lang-de" for="filter[category_uuid][in][]">
Nach Typ
</label>
<select
class="np-filter-select"
multiple
name="filter[{{ key }}][in][]"
>
{% for filter in filters %}
<option
value="{{ filter.value }}"
{% if filter.selected? %} selected="selected" {% endif %}
>
{{ filter.name }}
</option>
{% endfor %}
</select>

View File

@ -0,0 +1,110 @@
{% assign available_learning_path_categories = '' %}
{% for learning_path in learning_paths.available %}
{% for category in learning_path.categories %}
{% unless available_learning_path_categories contains category.name %}
{% assign available_learning_path_categories = available_learning_path_categories | append: category.name | append: '$' %}
{% endunless %}
{% endfor %}
{% endfor %}
{% assign learning_path_cats = available_learning_path_categories | split: '$' %}
<div class="lp-filter-wrapper">
<div class="filter-container">
<div class="filter" id="filterToggle">Filter</div>
</div>
<div class="filter-content" id="filterContent">
{% for category in learning_path_cats %}
{% if category != '' %}
<div class="filter-option">
<input class="filter-checkbox" value="{{ category }}" type="checkbox" onchange="filterLearningPaths()">
<label class="filter-name">{{ category }}</label>
</div>
{% endif %}
{% endfor %}
</div>
</div>
<style>
.lp-filter-wrapper {
position: relative;
width: 100%;
color: #000;
border-radius: 4px;
display: flex;
justify-content: end;
margin-bottom: 20px;
}
.filter-checkbox {
width: 20px;
height: 20px;
}
.filter-container {
position: relative;
}
.filter {
background-color: #d9dfe2;
padding: 10px 20px;
cursor: pointer;
width: 100%;
text-align: center;
border-radius: 4px;
color: #305263;
font-size: 14px;
font-weight: 700;
}
.filter-content {
position: absolute;
top: 100%;
width: 250px;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
display: none;
flex-direction: column;
gap: 10px;
max-height: 0;
overflow: hidden;
transition: max-height 0.4s ease, width 0.4s ease;
z-index: 111;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
padding: 5px;
margin-top: 5px;
}
.filter-option {
padding: 10px;
display: flex;
align-items: end;
gap: 10px;
}
.filter-active .filter-content {
display: flex;
max-height: 500px;
width: 250px;
}
.learning-path-card {
margin-bottom: 16px;
padding: 12px;
border: 1px solid #ddd;
display: block;
}
</style>
<script>
document.getElementById("filterToggle").addEventListener("click", function() {
const filterWrapper = document.querySelector('.lp-filter-wrapper');
filterWrapper.classList.toggle("filter-active");
});
function filterLearningPaths() {
const checkedCategories = Array.from(document.querySelectorAll('.filter-checkbox:checked')).map(checkbox => checkbox.value.toLowerCase());
const learningPaths = document.querySelectorAll('.learning-path-card');
learningPaths.forEach(path => {
const pathCategories = path.getAttribute('data-categories').toLowerCase().split(',');
const isVisible = checkedCategories.some(category => pathCategories.includes(category));
path.style.display = isVisible || checkedCategories.length === 0 ? 'block' : 'none';
});
}
</script>

View File

@ -0,0 +1,154 @@
<footer class="academy-footer np-max-width">
<div class="links-footer">
<div class="footer-items-wrapper">
<a href="{% route home %}">
<img
alt="{{ current_school.name }}"
class="footer-logo-image"
src="{{ current_school.logo_url }}"
/>
</a>
</div>
<div class="footer-items-wrapper">
<div class="footer-item-title lang-en">Resources</div>
<div class="footer-item-title lang-de">Ressourcen</div>
<div class="footer-links-container">
<a href="https://support.deepl.com/hc/en-us" target="_blank" class="footer-link lang-en">Help Center</a>
<a href="https://support.deepl.com/hc/de" target="_blank" class="footer-link lang-de">Hilfecenter</a>
<a href="https://www.deepl.com/en/blog" target="_blank" class="footer-link lang-en">Blog</a>
<a href="https://www.deepl.com/de/blog" target="_blank" class="footer-link lang-de">Blog</a>
<a href="https://developers.deepl.com/docs" target="_blank" class="footer-link lang-en">API documentation</a>
<a href="https://developers.deepl.com/docs" target="_blank" class="footer-link lang-de">API-Dokumentation</a>
<a href="https://www.deepl.com/en/pro-data-security" target="_blank" class="footer-link lang-en">Data security</a>
<a href="https://www.deepl.com/de/pro-data-security" target="_blank" class="footer-link lang-de">Datensicherheit</a>
<a href="https://www.deepl.com/en/privacy" target="_blank" class="footer-link lang-en">Privacy policy</a>
<a href="https://www.deepl.com/de/privacy" target="_blank" class="footer-link lang-de">Datenschutzerklärung</a>
<a href="https://www.deepl.com/en/pro-license" target="_blank" class="footer-link lang-en">Terms and conditions</a>
<a href="https://www.deepl.com/de/pro-license" target="_blank" class="footer-link lang-de">AGB</a>
<a href="https://support.deepl.com/hc/en-us/requests/new?ticket_form_id=13384459519132" target="_blank" class="footer-link lang-en">Cancel subscriptions</a>
<a href="https://support.deepl.com/hc/de/requests/new?ticket_form_id=13384459519132" target="_blank" class="footer-link lang-de">Abonnements kĂĽndigen</a>
</div>
</div>
<div class="footer-items-wrapper">
<div class="footer-item-title lang-en">Product</div>
<div class="footer-item-title lang-de">Produkte</div>
<div class="footer-links-container">
<a href="https://www.deepl.com/en/translator" target="_blank" class="footer-link lang-en">Free translator</a>
<a href="https://www.deepl.com/de/translator" target="_blank" class="footer-link lang-de">Kostenloser Ăśbersetzer</a>
<a href="https://www.deepl.com/en/features" target="_blank" class="footer-link lang-en">Features</a>
<a href="https://www.deepl.com/de/features" target="_blank" class="footer-link lang-de">Features</a>
<a href="https://www.deepl.com/en/pro?cta=footer-pro" target="_blank" class="footer-link">DeepL Pro</a>
<a href="https://www.deepl.com/en/pro-api" target="_blank" class="footer-link lang-en">Translation API</a>
<a href="https://www.deepl.com/de/pro-api" target="_blank" class="footer-link lang-de">API</a>
<a href="https://www.deepl.com/en/write" target="_blank" class="footer-link lang-en">DeepL Write</a>
<a href="https://www.deepl.com/de/write" target="_blank" class="footer-link lang-de">DeepL Write</a>
<a href="https://www.deepl.com/en/write" target="_blank" class="footer-link lang-en">DeepL Voice</a>
<a href="https://www.deepl.com/de/write" target="_blank" class="footer-link lang-de">DeepL Voice</a>
<a href="https://www.deepl.com/en/app" target="_blank" class="footer-link lang-en">Apps</a>
<a href="https://www.deepl.com/de/app" target="_blank" class="footer-link lang-de">Apps</a>
<a href="https://www.deepl.com/en/integrations" target="_blank" class="footer-link lang-en">Integrations</a>
<a href="https://www.deepl.com/de/integrations" target="_blank" class="footer-link lang-de">Integrationen</a>
<a href="https://www.deepl.com/en/features/document-translation" target="_blank" class="footer-link lang-en">Document translation</a>
<a href="https://www.deepl.com/de/features/document-translation" target="_blank" class="footer-link lang-de">DokumentĂĽbersetzung</a>
</div>
</div>
<div class="footer-items-wrapper">
<div class="footer-item-title lang-en">Download</div>
<div class="footer-item-title lang-de">Downloads</div>
<div class="footer-links-container">
<a href="https://www.deepl.com/en/android-app" target="_blank" class="footer-link lang-en">DeepL for Android</a>
<a href="https://www.deepl.com/de/android-app" target="_blank" class="footer-link lang-de">DeepL fĂĽr Android</a>
<a href="https://www.deepl.com/en/android-app" target="_blank" class="footer-link lang-en">DeepL for ChromeOS</a>
<a href="https://www.deepl.com/de/android-app" target="_blank" class="footer-link lang-de">DeepL fĂĽr ChromeOS</a>
<a href="https://www.deepl.com/en/ios-app" target="_blank" class="footer-link lang-en">DeepL for iPhone</a>
<a href="https://www.deepl.com/de/ios-app" target="_blank" class="footer-link lang-de">DeepL fĂĽr iPhone</a>
<a href="https://www.deepl.com/en/ios-app" target="_blank" class="footer-link lang-en">DeepL for iPad</a>
<a href="https://www.deepl.com/de/ios-app" target="_blank" class="footer-link lang-de">DeepL fĂĽr iPad</a>
<a href="https://www.deepl.com/en/macos-app" target="_blank" class="footer-link lang-en">DeepL for Mac</a>
<a href="https://www.deepl.com/de/macos-app" target="_blank" class="footer-link lang-de">DeepL fĂĽr Mac</a>
<a href="https://www.deepl.com/en/windows-app" target="_blank" class="footer-link lang-en">DeepL for Windows</a>
<a href="https://www.deepl.com/de/windows-app" target="_blank" class="footer-link lang-de">DeepL fĂĽr Windows</a>
<a href="https://www.deepl.com/en/chrome-extension" target="_blank" class="footer-link lang-en">DeepL Chrome extension</a>
<a href="https://www.deepl.com/de/chrome-extension" target="_blank" class="footer-link lang-de">DeepL-Erweiterung fĂĽr Chrome</a>
<a href="https://www.deepl.com/en/edge-extension" target="_blank" class="footer-link lang-en">DeepL Edge extension</a>
<a href="https://www.deepl.com/de/edge-extension" target="_blank" class="footer-link lang-de">DeepL-Erweiterung fĂĽr Edge</a>
<a href="https://www.deepl.com/en/firefox-extension" target="_blank" class="footer-link lang-en">DeepL Firefox extension</a>
<a href="https://www.deepl.com/de/firefox-extension" target="_blank" class="footer-link lang-de">DeepL-Erweiterung fĂĽr Firefox</a>
<a href="https://www.deepl.com/en/word-addin" target="_blank" class="footer-link lang-en">DeepL in Microsoft Word</a>
<a href="https://www.deepl.com/de/word-addin" target="_blank" class="footer-link lang-de">DeepL fĂĽr Microsoft Word</a>
<a href="https://www.deepl.com/en/integrations/outlook-addin" target="_blank" class="footer-link lang-en">DeepL for Microsoft Outlook</a>
<a href="https://www.deepl.com/de/integrations/outlook-addin" target="_blank" class="footer-link lang-de">DeepL fĂĽr Microsoft Outlook</a>
<a href="https://www.deepl.com/en/integrations/powerpoint-addin" target="_blank" class="footer-link lang-en">DeepL for Microsoft Powerpoint</a>
<a href="https://www.deepl.com/de/integrations/powerpoint-addin" target="_blank" class="footer-link lang-de">DeepL fĂĽr Microsoft PowerPoint</a>
<a href="https://www.deepl.com/en/google-workspace" target="_blank" class="footer-link lang-en">DeepL for Google Workspace</a>
<a href="https://www.deepl.com/de/google-workspace" target="_blank" class="footer-link lang-de">DeepL fĂĽr Google Workspace</a>
<a href="https://www.deepl.com/en/microsoft-365" target="_blank" class="footer-link lang-en">DeepL for Microsoft 365</a>
<a href="https://www.deepl.com/de/microsoft-365" target="_blank" class="footer-link lang-en">DeepL fĂĽr Microsoft 365</a>
</div>
</div>
<div class="footer-items-wrapper">
<div class="footer-item-title lang-en">Company</div>
<div class="footer-item-title lang-de">Unternehmen</div>
<div class="footer-links-container">
<a href="https://www.deepl.com/en/contact-us" target="_blank" class="footer-link lang-en">Contact Sales</a>
<a href="https://www.deepl.com/de/contact-us" target="_blank" class="footer-link lang-de">Sales-Team kontaktieren</a>
<a href="https://www.deepl.com/en/press" target="_blank" class="footer-link lang-en">Press</a>
<a href="https://www.deepl.com/de/press" target="_blank" class="footer-link lang-de">Presse</a>
<a href="https://www.deepl.com/en/careers" target="_blank" class="footer-link lang-en">Careers</a>
<a href="https://www.deepl.com/de/careers" target="_blank" class="footer-link lang-de">Karriere</a>
<a href="https://www.deepl.com/en/publisher" target="_blank" class="footer-link lang-en">Publisher</a>
<a href="https://www.deepl.com/de/publisher" target="_blank" class="footer-link lang-de">Impressum</a>
</div>
</div>
</div>
</footer>
<style>
.footer-links-container {
display: flex;
flex-direction: column;
gap: 10px;
margin-top: 10px;
}
.links-footer {
display: flex;
}
.footer-items-wrapper {
width: 100%;
}
.academy-footer {
padding: 60px;
}
.footer-item-title {
font-size: 16px;
font-weight: 600;
line-height: 24px;
text-align: left;
color: #292C32;
}
.footer-link {
text-decoration: none;
font-size: 16px;
font-weight: 300;
line-height: 24px;
text-align: left;
color: #292C32;
}
.footer-link:hover {
color: #42a2ff;
}
.footer-logo-image {
width: 100%;
max-width: 100px;
}
.social-links-wrapper {
display: flex;
justify-content: end;
gap: 10px;
margin-top: 30px;
}
.social-link {
text-decoration: none;
}
</style>

View File

@ -0,0 +1,25 @@
{% styles default %}
{% styles colors %}
{% styles custom %}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.css" integrity="sha512-wR4oNhLBHf7smjy0K4oqzdWumd+r5/+6QO/vDda76MW5iug4PT7v86FoEkySIJft3XA0Ae6axhIvHrqwm793Nw==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js" type="text/javascript"></script>
<script>
function changeLangText() {
const searchInput = document.querySelector('.search-input');
const selectedLang = localStorage.getItem("userLanguage");
console.log(selectedLang);
if (selectedLang === 'de') {
searchInput.placeholder = "Suche";
}
}
addEventListener("DOMContentLoaded", (event) => {
changeLangText()
});
</script>

View File

@ -0,0 +1,516 @@
{% assign userLanguage = current_person.properties.learner_language | upcase%}
<div id="loader-overlay">
<div class="loader"></div>
</div>
<header class="header">
<div class="np-header-content np-max-width">
<div class="np-hidden-desktop np-header-mobile-menu-nav">
{% if current_person.signed_in? %}
<button
data-toggle-class="np-hidden"
class="np-header-mobile-menu-nav-button fal fa-times np-hidden np-header-font-color"
data-toggle-target=".np-header-mobile-avatar-menu,
.np-header-mobile-menu-content, .np-main, .np-footer"
></button>
<button
data-test="open-mobile-menu"
data-toggle-class="np-hidden"
class="np-header-mobile-menu-nav-button np-header-mobile-avatar-menu"
data-toggle-target=".fa-times, .np-header-mobile-menu-content, .np-main, .np-footer"
>
<img
alt="{{ current_person.name }}"
class="np-header-avatar-image"
src="{{ current_person.avatar_url }}"
/>
</button>
{% endif %}
</div>
<div class="header-navigation-container">
<div class="header-logo">
<a class="deepl-logo" href="/app">
<img class="deepl-logo-img" src="https://s3.us-east-1.amazonaws.com/static.northpass.com/DeepL/images/Academy.png" alt="">
</a>
</div>
<div class="navigation">
<a href="/app/learning_paths" id="lp" class="navigation-item lang-en">
Learning paths
</a>
<a href="/app/learning_paths" id="lp" class="navigation-item lang-de">
Lernpfade
</a>
<a href="/app/catalog" id="courses" class="navigation-item lang-en">
Courses
</a>
<a href="/app/catalog" id="courses" class="navigation-item lang-de">
Kurse
</a>
<a href="/app/training_events" id="webinars" class="navigation-item lang-en">
Webinars
</a>
<a href="/app/training_events" id="webinars" class="navigation-item lang-de">
Webinare
</a>
<a href="/app/resources" id="resources" class="navigation-item lang-en">
Resources
</a>
<a href="/app/resources" id="resources" class="navigation-item lang-de">
Ressourcen
</a>
</div>
</div>
{% if current_person.signed_in? %}
<div class="header-profile-container">
<div class="np-hidden-mobile search-bar">
<form action="{% route search %}" method="get" data-test="desktop-search">
<input
aria-label="{% t .search %}"
class="search-input"
type="text"
name="q"
placeholder="{% t .search %}"
/>
<i class="header-search-icon far fa-search"></i>
</form>
</div>
{% if current_person.properties.new_content %}
<div class="languge-dropdown">
<button
type="button"
class="navigation-item languge-dropdown-button lang-en"
data-toggle-class="is-open"
data-toggle-target-next
data-toggle-outside
data-toggle-escape>
<span style="display:inline-block">Language</span>
</button>
<button
type="button"
class="navigation-item languge-dropdown-button lang-de"
data-toggle-class="is-open"
data-toggle-target-next
data-toggle-outside
data-toggle-escape>
<span style="display:inline-block">Sprache</span>
</button>
<ul class="languge-dropdown-list">
<li>
<button
type="button"
id="en-lang"
data-lang="en"
class="lang-option active"
data-toggle-trigger-off
>
<span style="display:inline-block">English</span>
</button>
</li>
<li>
<button
type="button"
id="de-lang"
data-lang="de"
class="lang-option"
data-toggle-trigger-off>
<span style="display:inline-block">Deutsch</span>
</button>
</li>
</ul>
</div>
{% endif %}
<div class="np-hidden-mobile np-header-avatar">
<button
class="np-header-avatar-button"
data-test="open-desktop-menu"
data-toggle-class-on-target="np-hidden"
data-toggle-target=".np-header-avatar-tooltip"
data-toggle-outside
>
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 6C0 2.68629 2.68629 0 6 0H34C37.3137 0 40 2.68629 40 6V34C40 37.3137 37.3137 40 34 40H6C2.68629 40 0 37.3137 0 34V6Z" fill="#EDEDED"/>
<path d="M26.6666 27.5V25.8333C26.6666 24.9493 26.3154 24.1014 25.6903 23.4763C25.0652 22.8512 24.2173 22.5 23.3333 22.5H16.6666C15.7825 22.5 14.9347 22.8512 14.3096 23.4763C13.6844 24.1014 13.3333 24.9493 13.3333 25.8333V27.5M23.3333 15.8333C23.3333 17.6743 21.8409 19.1667 19.9999 19.1667C18.159 19.1667 16.6666 17.6743 16.6666 15.8333C16.6666 13.9924 18.159 12.5 19.9999 12.5C21.8409 12.5 23.3333 13.9924 23.3333 15.8333Z" stroke="#0F2B46" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div class="np-header-avatar-tooltip np-hidden" role="tooltip">
<span class="np-header-avatar-tooltip-arrow-up"></span>
<div class="np-header-avatar-tooltip-learner">
<div class="np-header-avatar-tooltip-learner-name">
{{ current_person.name }}
</div>
<div class="np-header-avatar-tooltip-learner-email">
{{ current_person.email }}
</div>
</div>
<nav class="np-header-avatar-tooltip-navigation">
{% unless current_school.sso_active? %}
<a
class="np-header-avatar-tooltip-navigation-link"
href="{% route account %}"
>
{% t .profile_settings %}
</a>
{% endunless %}
{% if current_person.signed_in? %}
<a
class="np-header-avatar-tooltip-navigation-link"
href="{% route transcript %}"
>
{% t .transcript %}
</a>
{% endif %}
<a
class="np-header-avatar-tooltip-navigation-link np-danger"
href="{% route logout %}"
>
{% t .sign_out %}
</a>
</nav>
</div>
</div>
</div>
{% else %}
<a
class="np-header-sign-in np-header-desktop-nav-link np-header-font-color"
aria-label="{% t shared.sign_in %}"
href="{% route login %}"
>
{% t shared.sign_in %}
</a>
{% endif %}
</div>
</header>
<div class="np-hidden-desktop">
<div class="np-header-mobile-menu-content np-hidden">
{% if current_person.signed_in? %}
<img
alt="{{ current_person.name }}"
class="np-header-mobile-menu-content-avatar"
src="{{ current_person.avatar_url }}"
/>
<div class="np-header-mobile-menu-content-name">
{{ current_person.name }}
</div>
{% endif %}
<div class="np-header-mobile-menu-content-nav">
<form
class="np-header-search"
data-test="mobile-search"
method="get"
action="{% route search %}"
>
<input
aria-label="{% t .search %}"
class="np-header-search-input"
type="text"
name="q"
placeholder="{% t .search %}"
/>
<i class="header-search-icon far fa-search"></i>
</form>
{% for website_navigation in navigations.header_navigations %}
<a
href="{{ website_navigation.path }}"
class="np-header-mobile-menu-content-button"
{% if website_navigation.external? %} target="_blank" {% endif %}
>
{{ website_navigation.name }}
</a>
{% endfor %}
<div class="np-header-mobile-menu-content-line"></div>
{% unless current_school.sso_active? %}
<a
class="np-header-mobile-menu-content-button"
href="{% route account %}"
>
{% t .profile_settings %}
</a>
{% endunless %}
{% if current_person.signed_in? %}
<a
class="np-header-mobile-menu-content-button"
href="{% route transcript %}"
>
{% t .transcript %}
</a>
{% endif %}
<a
class="np-header-mobile-menu-content-button np-danger"
href="{% route logout %}"
>
{% t .sign_out %}
</a>
</div>
</div>
</div>
{% include "messages" %}
<style>
.deepl-logo-img {
width: 100%;
max-width: 230px;
}
.header-navigation-container {
display: flex;
align-items: center;
gap: 30px;
}
.deepl-logo {
display: flex;
}
.header-profile-container {
display: flex;
align-items: center;
}
.np-header-content {
display: flex;
justify-content: space-between;
}
.search-bar {
position: relative;
height: fit-content;
}
.navigation {
display: flex;
gap: 25px;
height: 100%;
}
.search-input {
border: 1px solid rgba(0,0,0, 0.25);
padding: 5px 10px;
border-radius: 8px;
}
.navigation-item {
text-decoration: none;
color: #0f2b46;
padding: 5px 10px;
}
.navigation-item:hover {
color: #42A2FF;
}
.active-nav {
color: #42A2FF;
}
.header {
background: #f8f8f8;
padding: 10px 40px;
}
.header-search-icon {
position: absolute;
left: 10px;
height: 100%;
display: flex;
align-items: center;
top: 0%;
}
.search-input {
border: 1px solid rgba(0,0,0, 0.25);
padding: 5px 10px 5px 30px;
border-radius: 8px;
}
.languge-dropdown {
position: relative;
display: inline-block;
margin-left:24px;
}
.languge-dropdown-button {
display: inline-block;
padding: 0;
overflow: hidden;
border: none;
background: #ededed;
height: 40px;
border-radius: 4px;
padding: 0 15px;
cursor: pointer;
}
.np-header-avatar-button {
display: flex;
}
.languge-dropdown-button::after {
font-family:"Font awesome 5 Pro";
display: inline-block;
content: "\f078";
transition: transform .25s ease-out;
margin-left:4px;
}
.languge-dropdown-button.is-open::after {
transform: rotate(180deg);
}
.languge-dropdown-list {
position: absolute;
top: 50px;
left: 0;
z-index: 1;
display: block;
width: max-content;
min-width: 100%;
max-width: 15em;
max-height: 13em;
overflow: auto;
padding: 0;
margin: 0;
transform: translateY(-1em);
transform-origin: center top;
background-color: white;
perspective: 1000px;
box-shadow: 0 0 8px rgba(72,103,118,.5);
list-style: none;
visibility: hidden;
opacity: 0;
transition: .25s ease-in;
border-radius: 8px;
}
.languge-dropdown-list.is-open {
transform: translateY(0);
visibility: visible;
opacity: 1;
transition-timing-function: ease-out;
}
.languge-dropdown-list li {
border-bottom: 1px solid #ededed;
cursor:pointer;
padding:12px 24px;
}
.languge-dropdown-list li:hover button,
.languge-dropdown-list li:focus button{
font-weight:700;
}
.languge-dropdown-list li button.active {
font-weight:700;
cursor:text;
}
.languge-dropdown-list li:last-child {
border-bottom: none;
}
.languge-dropdown-list button {
display: block;
width: 100%;
box-sizing: border-box;
border: none;
background: none;
text-align: left;
}
.languge-dropdown-list button:hover,
.languge-dropdown-list button:focus {
cursor:pointer;
}
</style>
<script>
const url = window.location.pathname;
const lp = document.getElementById('lp');
const academy = document.getElementById('academy');
const courses = document.getElementById('courses');
const webinars = document.getElementById('webinars');
const resources = document.getElementById('resources');
switch (url) {
case '/app':
academy.classList.add('active-nav');
break;
case '/app/learning_paths':
lp.classList.add('active-nav');
break;
case '/app/catalog':
courses.classList.add('active-nav');
break;
case '/app/training_events':
webinars.classList.add('active-nav');
break;
case '/app/resources':
resources.classList.add('active-nav');
break;
default:
break;
}
</script>
<script>
function changeElementsText() {
const searchInput = document.querySelector('.search-input');
const selectedLang = localStorage.getItem("userLanguage");
console.log(selectedLang);
if (selectedLang === 'de') {
searchInput.placeholder = "Suche";
}
}
document.addEventListener("DOMContentLoaded", function() {
let userLanguage = localStorage.getItem("userLanguage");
let userLanguageCustomPropValue = '{{current_person.properties.learner_language}}'
if (userLanguage === null) {
userLanguage = "en";
localStorage.setItem("userLanguage", userLanguage);
}
if (userLanguageCustomPropValue) {
localStorage.setItem("userLanguage", userLanguageCustomPropValue);
}
document.body.setAttribute("data-lang", userLanguage);
document.querySelectorAll(".lang-option").forEach(function(button) {
button.classList.remove("active");
});
document.querySelector(`.lang-option[data-lang='${userLanguage}']`).classList.add("active");
document.querySelectorAll(".lang-option").forEach(function(button) {
button.addEventListener("click", function() {
const selectedLangOption = this.getAttribute("data-lang");
localStorage.setItem("userLanguage", selectedLangOption);
document.querySelectorAll(".lang-option").forEach(function(button) {
button.classList.remove("active");
});
this.classList.add("active");
document.body.setAttribute("data-lang", selectedLangOption);
document.getElementById("loader-overlay").style.display = "flex";
fetch("https://webhooks.workato.com/webhooks/rest/3be1030a-8bc7-4063-a6dc-7e529b869613/user-language-handler", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
language: selectedLangOption,
id: '{{current_person.id}}'
})
})
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok ' + response.statusText);
}
return response.json();
})
.then(data => {
console.log("Language information sent successfully:", data);
})
.catch(error => {
console.error("Error sending language information:", error);
});
changeElementsText();
setTimeout(() => {
location.reload();
}, 5000);
});
});
});
</script>

View File

@ -0,0 +1,17 @@
<header class="np-box-header np-header-color">
<a class="np-box-header-link" href="{% route home %}">
{% if current_school.logo_url %}
<img
alt="{{ current_school.name }}"
src="{{ current_school.logo_url }}"
class="np-box-header-logo"
/>
{% else %}
<span class="np-school-name np-header-font-color">
{{ current_school.name }}
</span>
{% endif %}
</a>
</header>
{% include "messages" %}

View File

@ -0,0 +1,5 @@
{% if learning_path.new_content_available? %}
{% include "learning_path_new_content_banner" %}
{% else %}
{% include "learning_path_completed_banner" %}
{% endif %}

View File

@ -0,0 +1,7 @@
<div class="overview-categories-wrapper">
{% for category in learning_path.categories %}
<div class="category-item">
{{ category.name }}
</div>
{% endfor %}
</div>

View File

@ -0,0 +1,17 @@
{% if learning_path.has_certificate? %}
{% if learning_path.certificate_completed? %}
<div class="np-learning-path-outline-bar np-hidden-mobile"></div>
<a
class="np-learning-path-certificate-link"
href="{{ learning_path.certificate_link }}"
>
<div class="np-learning-path-certificate">
{% include "learning_path_certificate_content" %}
</div>
</a>
{% else %}
<div class="np-learning-path-certificate np-learning-path-certificate--inactive">
{% include "learning_path_certificate_content" %}
</div>
{% endif %}
{% endif %}

View File

@ -0,0 +1,19 @@
<div class="np-learning-path-certificate-content">
<div class="np-learning-path-certificate-avatar" role="img">
<i class="np-learning-path-certificate-avatar-icon fal fa-award"></i>
<h5 class="np-learning-path-certificate-avatar-title">
{% t .avatar_title %}
</h5>
</div>
<h4 class="np-learning-path-certificate-name">
{{ learning_path.certificate_name }}
</h4>
{% if learning_path.certificate_completed? %}
<time
class="np-learning-path-certificate-issue-date"
datetime="{{ learning_path.certificate_issue_date }}"
>
{{ learning_path.certificate_issue_date | date: "%B %d, %Y" }}
</time>
{% endif %}
</div>

View File

@ -0,0 +1,13 @@
<div class="np-learning-path-completed-banner np-learning-path-banner">
<img class="np-learning-path-banner-image" src="https://s3.amazonaws.com/static.northpass.com/images/stars-completed.svg"/>
<div class="np-learning-path-banner-content">
<h3 class="np-learning-path-banner-headline">{% t .headline %}</h3>
<p class="np-learning-path-banner-description">{% t .description %}</p>
<div class="np-learning-path-banner-actions">
{% if learning_path.certificate_link %}
<a href="{{ learning_path.certificate_link }}" class="np-learning-path-banner-action np-learning-path-banner-action--primary">{% t .actions.certificate %}</a>
{% endif %}
<a href="/app/courses" class="np-learning-path-banner-action np-learning-path-banner-action--secondary">{% t .actions.more_courses %}</a>
</div>
</div>
</div>

View File

@ -0,0 +1,80 @@
{% if learning_path.enrolled? and course.unlocked? %}
<div class="np-learning-path-outline-bar np-hidden-mobile"></div>
<a
class="learning-path-outline-item"
href="{% route learning_path_course, learning_path_id: learning_path.id, id: course.id %}"
>
<div class="lp-overview-item">
<img
src="{{ item.image }}"
alt="{{ course.name }}"
class="learning-path-outline-course-image"
>
<div class="np-learning-path-outline-content">
<div class="learning-path-outline-name">
{{ course.name }}
</div>
<div class="progress-text
{% if course.completed? %} np-color-success {% else %} progress-text {% endif %}
">
{% t shared.progress, count: course.progress %}
</div>
</div>
<i class="fas fa-chevron-right np-learning-path-outline-icon"></i>
{% if course.optional? %}
<div class="np-optional-ribbon">
{% t shared.optional %}
</div>
{% endif %}
</div>
</a>
{% else %}
<div class="np-learning-path-outline-item np-learning-path-outline-inactive-item np-card-container">
<div class="lp-overview-item">
<img
src="{{ item.image }}"
alt="{{ course.name }}"
class="learning-path-outline-course-image"
>
<div class="np-learning-path-outline-content">
<div class="learning-path-outline-name">
{{ course.name }}
</div>
</div>
{% if course.optional? %}
<div class="np-optional-ribbon">
{% t shared.optional %}
</div>
{% endif %}
</div>
</div>
{% endif %}
<style>
.lp-overview-item {
display: flex;
width: 100%;
align-items: center;
}
.learning-path-outline-course-image {
width: 135px;
height: 75px;
}
.np-learning-path-outline-inactive-item {
border: none;
}
.learning-path-outline-name {
font-size: 24px;
font-weight: 400;
line-height: 30px;
letter-spacing: -0.015em;
text-align: left;
color: #0F2B46;
}
.np-learning-path-outline-item {
margin-top: 30px;
}
.learning-path-outline-item {
text-decoration: none;
}
</style>

View File

@ -0,0 +1,4 @@
<div class="np-card-text">
{{ learning_path.description }}
</div>

View File

@ -0,0 +1,19 @@
<div class="overview-content-container">
<div class="content-details">
<img
src="{{ learning_path.image_url }}"
class="np-top-image np-top-image-spacing"
alt="{{ learning_path.name }}"
/>
{% include "learning_path_description" %}
{% include "learning_path_instructors" %}
{% include "learning_path_categories" %}
</div>
<div class="content-activities">
<div class="np-top-cta">
{% include "learning_path_progress_and_cta" %}
</div>
{% include "learning_path_outline" %}
</div>
</div>

View File

@ -0,0 +1,12 @@
<div class="overview-header-container">
<div class="overview-btn-container">
<svg width="16" height="9" viewBox="0 0 16 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 4.49991L1 4.49991M1 4.49991L4.33417 1.09082M1 4.49991L4.33417 7.909" stroke="#0F2B46" stroke-linejoin="round"></path>
</svg>
<a href="/app/learning_paths" class="overview-back-btn">Back to all learning paths</a>
</div>
<div class="overview-heading">
{{ learning_path.name }}
</div>
</div>

View File

@ -0,0 +1,76 @@
{% include "learning_path_desktop_header" %}
{% include "learning_path_desktop_content" %}
<style>
.overview-back-btn {
font-size: 18px;
font-weight: 400;
line-height: 25.2px;
letter-spacing: -0.01em;
text-align: center;
color: #0F2B46;
text-decoration: none;
}
.overview-btn-container {
display: flex;
gap: 10px;
align-items: center;
}
.overview-heading {
font-size: 48px;
font-weight: 320;
line-height: 50.4px;
letter-spacing: -0.015em;
color: #0F2B46;
}
.overview-header-container {
display: flex;
flex-direction: column;
gap: 30px;
}
.overview-content-container {
display: grid;
margin-top: 30px;
grid-template-columns: repeat(2,1fr);
gap: 70px;
}
.overview-details-container {
display: flex;
gap: 30px;
}
.overview-detail {
display: flex;
flex-direction: column;
gap: 13px;
align-items: start;
}
.detail-content {
font-size: 18px;
font-weight: 400;
line-height: 25.2px;
letter-spacing: -0.01em;
color: #0F2B46;
}
.category-item {
font-size: 14px;
font-weight: 400;
line-height: 19.6px;
letter-spacing: -0.01em;
color: #0F2B46;
padding: 11px 12px;
background: #EDEDED;
border-radius: 4px;
}
.overview-categories-wrapper {
display: flex;
flex-wrap: wrap;
gap: 17px;
margin-top: 40px;
}
@media only screen and (max-width: 900px) {
.overview-content-container {
grid-template-columns: repeat(1,1fr);
}
}
</style>

View File

@ -0,0 +1,19 @@
{% if learning_path.in_progress? %}
{% include "learning_path_outline" %}
<div class="np-card-container np-card-padding np-card-spacing">
{% include "learning_path_description" %}
</div>
{% else %}
<div class="np-card-container np-card-padding np-card-spacing">
{% include "learning_path_description" %}
</div>
<div class="np-card-spacing">
{% include "learning_path_outline" %}
</div>
{% endif %}
{% if learning_path.instructors.any? %}
<div class="np-card-container np-card-padding np-card-spacing">
{% include "learning_path_instructors" %}
</div>
{% endif %}

View File

@ -0,0 +1,17 @@
<div class="np-resource-header np-card-padding-vertical">
<div class="np-top-vocabulary np-text-title">
{% t shared.learning_path.title %}
<i class="far fa-road np-button-color np-learning-path-icon"></i>
</div>
<div class="np-top-title">
{{ learning_path.name }}
</div>
<img
src="{{ learning_path.image_url }}"
class="np-top-image"
alt="{{ learning_path.name }}"
/>
<div class="np-top-cta">
{% include "learning_path_progress_and_cta" %}
</div>
</div>

View File

@ -0,0 +1,2 @@
{% include "learning_path_mobile_header" %}
{% include "learning_path_mobile_content" %}

View File

@ -0,0 +1,12 @@
<div class="np-learning-path-new-content-banner np-learning-path-banner">
<div class="np-learning-path-banner-content">
<h3 class="np-learning-path-banner-headline">{% t .headline %}</h3>
<p class="np-learning-path-banner-description">{% t .description %}</p>
<div class="np-learning-path-banner-actions">
{% learning_path_next_step_button learning_path, class: "np-learning-path-banner-action np-learning-path-banner-action--primary" %}
{% if learning_path.certificate_link %}
<a href="{{ learning_path.certificate_link }}" class="np-learning-path-banner-action np-learning-path-banner-action--secondary">{% t .actions.view_certificate %}</a>
{% endif %}
</div>
</div>
</div>

View File

@ -0,0 +1,10 @@
<div class="np-learning-path-outline">
{% for item in learning_path.items %}
{% if item.course? %}
{% include "learning_path_course", course: item %}
{% elsif item.training_event? %}
{% include "learning_path_training_session", training_session: item %}
{% endif %}
{% endfor %}
{% include "learning_path_certificate" %}
</div>

View File

@ -0,0 +1,52 @@
{% if learning_path.enrolled? %}
<div class="np-top-cta-progress-content">
<div class="small-heading">
{% t .progress %}
</div>
<div class="progress-overview">
<div class="np-progress-bar-container">
<div
style="width: {{ learning_path.progress }}%"
class="np-button-background-color np-card-progress-bar">
</div>
</div>
<div class="progress-text">
{{ learning_path.progress }}%
</div>
</div>
</div>
{% endif %}
<div class="overview-cta-btn-container">
{% learning_path_next_step_button learning_path, class: "overview-cta-btn" %}
</div>
<style>
.progress-text {
color: #42A2FF;
font-size: 14px;
font-weight: 600;
line-height: 19.6px;
letter-spacing: -0.01em;
}
.progress-overview {
display: flex;
gap: 20px;
}
.overview-cta-btn {
font-size: 18px;
font-weight: 400;
line-height: 25.2px;
letter-spacing: -0.01em;
color: #FFFFFF;
padding: 7px 18px;
background: #0F2B46;
border-radius: 40px;
text-decoration: none;
}
.overview-cta-btn-container {
display: flex;
width: 100%;
max-width: 150px;
}
</style>

View File

@ -0,0 +1,3 @@
{% include "learning_path_desktop_header" %}
{% include "learning_path_banners" %}
{% include "learning_path_desktop_content" %}

View File

@ -0,0 +1,5 @@
<div class="np-card-padding">
{% include "learning_path_banners" %}
</div>
{% include "learning_path_mobile_header" %}
{% include "learning_path_mobile_content" %}

View File

@ -0,0 +1,53 @@
{% if learning_path.enrolled? and training_session.unlocked? %}
<div class="np-learning-path-outline-bar np-hidden-mobile"></div>
<a
class="np-learning-path-outline-item np-card-container"
href="{% route training_session, id: training_session.id %}"
>
<div class="np-card-content np-card-padding">
<div class="np-events-content-date np-button-background-color">
<div class="np-events-content-month">
{{ training_session.month }}
</div>
<div class="np-events-content-day">
{{ training_session.day }}
</div>
</div>
<div class="np-learning-path-outline-content">
<div class="np-learning-path-outline-name np-top-title">{{ training_session.name }}</div>
<div class="np-learning-path-outline-caption">{{ training_session.instructors }}</div>
<div class="np-events-content-time np-learning-path-outline-time np-button-color">
{{ training_session.time }} {{ training_session.time_zone }}
</div>
</div>
<i class="fas fa-chevron-right np-learning-path-outline-icon"></i>
{% if training_session.optional? %}
<div class="np-optional-ribbon">
{% t shared.optional %}
</div>
{% endif %}
</div>
</a>
{% else %}
<div class="np-learning-path-outline-item np-card-container np-learning-path-outline-inactive-item">
<div class="np-card-content np-card-padding">
<div class="np-events-content-date np-button-background-color">
<div class="np-events-content-month">
{{ training_session.month }}
</div>
<div class="np-events-content-day">
{{ training_session.day }}
</div>
</div>
<div class="np-learning-path-outline-content">
<div class="np-learning-path-outline-name np-top-title">{{ training_session.name }}</div>
<div class="np-learning-path-outline-caption">{{ training_session.caption }}</div>
</div>
{% if training_session.optional? %}
<div class="np-optional-ribbon">
{% t shared.optional %}
</div>
{% endif %}
</div>
</div>
{% endif %}

View File

@ -0,0 +1,14 @@
<div class="np-learning-paths-resources">
{% if items.any? %}
{% for learning_path in items %}
{% include "cards_learning_path" with learning_path %}
{% endfor %}
{% else %}
<div class="np-learning-paths-resources-container">
<div class="np-zero-state-text">
{% t .empty %}
</div>
<img class="np-zero-state-learning-paths" alt="{% t .empty %}" />
</div>
{% endif %}
</div>

View File

@ -0,0 +1,19 @@
{% if messages.alert.size > 0 %}
<div class="np-alert np-alert-error">
<div class="np-alert-wrapper">
{% for message in messages.alert %}
<div>{{ message }}</div>
{% endfor %}
</div>
</div>
{% endif %}
{% if messages.notice.size > 0 %}
<div class="np-alert np-alert-success">
<div class="np-alert-wrapper">
{% for message in messages.notice %}
<div>{{ message }}</div>
{% endfor %}
</div>
</div>
{% endif %}

View File

@ -0,0 +1,73 @@
<div class="recommended-wrapper">
<div class="heading lang-en">
On-demand library
</div>
<div class="heading lang-de">
On-Demand-Bibliothek
</div>
<div class="webinars-cards-wrapper on-demand-cards-wrapper">
{% for course in courses.enrolled %}
{% if course.properties.on_demand %}
{% if course.properties.language == userLanguage %}
{% include "on_demand_cards" %}
{% endif %}
{% endif %}
{% endfor %}
</div>
</div>
<style>
.your-course-carousel {
position: relative;
}
.slick-arrow {
position: absolute;
top: -30px;
z-index: 111;
cursor: pointer;
}
.right-arrow {
margin-left: 30px;
}
.slick-dots button {
display: block;
width: 10px;
height: 10px;
padding: 0;
border: none;
border-radius: 1px;
background: #8878FF;
text-indent: -9999px;
}
.slick-dots {
list-style-type: none;
}
.slick-dots {
display: flex;
justify-content: center;
margin: 0;
padding-top: 3rem;
list-style-type: none;
gap: 10px;
}
.slick-dots li {
margin: 0 0.25rem;
}
.slick-dots li.slick-active button {
background: #6CF1C9;
}
@media only screen and (max-width: 1170px) {
.on-demand-cards-wrapper {
grid-template-columns: repeat(2,1fr) !important;
}
}
@media only screen and (max-width: 768px) {
.on-demand-cards-wrapper {
grid-template-columns: repeat(1,1fr) !important;
}
}
</style>

View File

@ -0,0 +1,27 @@
<div class="card" categories="{% for category in course.categories %}{{category.name}},{% endfor %}" progress="{% if course.progress > 0 and course.progress < 100 %}In progress{% elsif course.progress == 100 %}Completed{% else %}Not started{% endif %}">
<div class="card-container">
<img
class="card-image"
alt="{{ course.name }}"
src="{{ course.image_url }}"
>
<div class="card-content">
<div class="card-content-title">
{{ course.name }}
</div>
<div class="card-content-footer">
{% capture course_path %}{% route course, id: course.id %}{% endcapture %}
{% if course.has_to_restart? %}
{% include "course_version_outdated_popup", path: course_path %}
{% endif %}
<a class="card-btn dark-btn lang-en" {% if course.enrolled? %}href="{% route course_viewer, course_id: course.id, learning_path_id: params.learning_path_id %}"{% else %}href="{{ course_path }}"{% endif %}>
Watch now
</a>
<a class="card-btn dark-btn lang-de" {% if course.enrolled? %}href="{% route course_viewer, course_id: course.id, learning_path_id: params.learning_path_id %}"{% else %}href="{{ course_path }}"{% endif %}>
Jetzt anschauen
</a>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,144 @@
<div class="recommended-wrapper">
<div class="heading lang-en">
Explore our most popular courses
</div>
<div class="heading lang-de">
Entdecken Sie unsere beliebtesten Kurse
</div>
<div class="carousel-filters-wrapper">
{% include 'carousel-filters' %}
</div>
<div class="carousel-wrapper popular-carousel">
{% for course in courses.enrolled %}
{% unless course.properties.resource or course.properties.on_demand %}
{% if course.properties.language == userLanguage %}
<div class="carousel-card popular-carousel-card">
{% include "cards_course" with course %}
</div>
{% endif %}
{% endunless %}
{% endfor %}
</div>
</div>
<style>
.popular-carousel {
position: relative;
}
.slick-arrow {
position: absolute;
top: -30px;
z-index: 111;
cursor: pointer;
}
.right-arrow {
margin-left: 30px;
}
.slick-dots button {
display: block;
width: 10px;
height: 10px;
padding: 0;
border: none;
border-radius: 1px;
background: #8878FF;
text-indent: -9999px;
}
.slick-dots {
list-style-type: none;
}
.slick-dots {
display: flex;
justify-content: center;
margin: 0;
padding-top: 3rem;
list-style-type: none;
gap: 10px;
}
.slick-dots li {
margin: 0 0.25rem;
}
.slick-dots li.slick-active button {
background: #6CF1C9;
}
</style>
<script>
$(document).ready(function(){
$(".popular-carousel").slick({
slidesToShow: 4,
slidesToScroll: 4,
prevArrow: '<i class="fal fa-chevron-left left-arrow"></i>',
nextArrow: '<i class="fal fa-chevron-right right-arrow"></i>',
infinite: false,
dots: true,
responsive: [
{
breakpoint: 1170,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
}
},
{
breakpoint: 768,
settings: {
slidesToShow: 1,
slidesToScroll: 1,
}
}
]
});
let selectedCategory = null;
let selectedProgress = null;
function filterCards() {
$(".popular-carousel").slick('slickUnfilter');
let filterFunction = function() {
const card = $(this).find('.card');
const cardCategories = card.attr('categories').split(',').map(c => c.trim());
const cardProgress = card.attr('progress');
let showByCategory = !selectedCategory || cardCategories.includes(selectedCategory);
let showByProgress = !selectedProgress || selectedProgress === 'All courses' || cardProgress === selectedProgress;
return showByCategory && showByProgress;
};
$(".popular-carousel").slick('slickFilter', filterFunction);
}
$('.filter').on('click', function() {
let clickedCategory = $(this).attr('value');
if (selectedCategory === clickedCategory) {
selectedCategory = null;
$(this).removeClass('filter-active');
} else {
selectedCategory = clickedCategory;
$('.filter').removeClass('filter-active');
$(this).addClass('filter-active');
}
filterCards();
});
$('.filter-by-progress-option').on('click', function() {
let clickedProgress = $(this).attr('value');
if (selectedProgress === clickedProgress) {
selectedProgress = null;
} else {
selectedProgress = clickedProgress;
}
filterCards();
});
});
</script>

View File

@ -0,0 +1,92 @@
{% assign recommended_counter = 0 %}
<div class="recommended-wrapper" id="recommended-section">
<div class="heading lang-en">
Recommended for you
</div>
<div class="heading lang-de">
FĂĽr Sie empfohlen
</div>
<div class="recommended-wrapper-content">
{% comment %} {% for course in courses.enrolled %}
{% unless course.properties.resource or course.properties.on_demand %}
<div class="carousel-card recommended-card">
{% include "cards_course" with course %}
</div>
{% assign recommended_counter = recommended_counter | plus: 1 %}
{% endunless %}
{% endfor %} {% endcomment %}
{% for learning_path in learning_paths.enrolled %}
{% for category in learning_path.categories %}
{% if category.name == userLanguage %}
<div class="carousel-card recommended-card">
{% include "cards_learning_path" %}
</div>
{% assign recommended_counter = recommended_counter | plus: 1 %}
{% endif %}
{% endfor %}
{% endfor %}
</div>
<div class="see-all-btn-container">
<a class="light-btn" id="expand-btn" href="/app/catalog">See all</a>
</div>
</div>
<style>
.recommended-wrapper-content {
display: grid;
grid-template-columns: repeat(4,1fr);
gap: 20px;
margin-top: 30px;
}
@media only screen and (max-width: 1170px) {
.recommended-wrapper-content {
grid-template-columns: repeat(2,1fr);
}
}
@media only screen and (max-width: 768px) {
.recommended-wrapper-content {
grid-template-columns: repeat(1,1fr);
}
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function () {
const cards = document.querySelectorAll('.recommended-card');
const seeAllBtn = document.getElementById('expand-btn');
const maxCards = 8;
const initialVisibleCards = 4;
const totalCards = cards.length;
let isExpanded = false;
if (totalCards > initialVisibleCards) {
seeAllBtn.style.display = 'block';
} else {
seeAllBtn.style.display = 'none';
}
function updateCardVisibility() {
cards.forEach((card, index) => {
if (isExpanded) {
card.style.display = index < maxCards ? 'block' : 'none';
} else {
card.style.display = index < initialVisibleCards ? 'block' : 'none';
}
});
seeAllBtn.textContent = isExpanded ? 'Show Less' : 'See All';
}
updateCardVisibility();
seeAllBtn.addEventListener('click', function (e) {
e.preventDefault();
isExpanded = !isExpanded;
updateCardVisibility();
});
});
</script>

View File

@ -0,0 +1,94 @@
<div class="carousel-filters">
<div class="filters-container">
<div class="filter lang-en" value="Administration">Administration</div>
<div class="filter lang-de" value="Administration">Verwaltung</div>
<div class="filter lang-en" value="Translator">Translator</div>
<div class="filter lang-de" value="Translator">Ăśbersetzer</div>
<div class="filter lang-en" value="Glossaries" >Glossaries</div>
<div class="filter lang-de" value="Glossaries" >Glossare</div>
<div class="filter lang-en" value="Document translation" >Document translation</div>
<div class="filter lang-de" value="Document translation" >DokumentĂĽbersetzung</div>
<div class="filter" value="Apps" >Apps</div>
<div class="filter lang-en" value="Extensions and integrations" >Extensions and integrations</div>
<div class="filter lang-de" value="Extensions and integrations" >Erweiterungen und Integrationen</div>
<div class="filter" value="Write" >Write</div>
<div class="filter" value="Voice">Voice</div>
<div class="filter" value="API" >API</div>
</div>
</div>
<style>
.carousel-filters {
background: #EDEDED;
border-radius: 8px;
padding: 24px 32px;
margin-top: 30px;
display: flex;
justify-content: space-between;
}
.filters-container {
display: flex;
gap: 44px;
width: 100%;
align-items: center;
}
.filter {
font-size: 18px;
font-weight: 400;
line-height: 27px;
color: #0F2B46;
text-decoration: underline;
cursor: pointer;
padding: 5px 10px;
}
.filter-dropdown-container {
position: relative;
display: flex;
align-items: center;
gap: 10px;
justify-content: end;
width: 100%;
max-width: 290px;
}
.filter-dropdown-block {
background-color: white;
border: 1px solid #ccc;
padding: 10px;
cursor: pointer;
user-select: none;
max-width: 150px;
width: 100%;
border-radius: 12px;
display: flex;
justify-content: space-between;
align-items: center;
}
.filter-by-progress-dropdown {
background-color: white;
border: 1px solid #ccc;
position: absolute;
width: 100%;
z-index: 1;
top: 40px;
}
.filter-by-progress-option {
padding: 10px;
cursor: pointer;
}
.filter-by-progress-option:hover {
background-color: #f0f0f0;
}
.hidden {
display: none;
}
.filter-active {
color: #42A2FF;
}
</style>

View File

@ -0,0 +1,117 @@
<div class="recommended-wrapper">
<div class="carousel-filters-wrapper">
{% include 'resources-filters' %}
</div>
<div class="catalog-courses-wrapper">
{% for course in courses.in_catalog %}
{% if course.properties.resource == true %}
{% if course.properties.language == userLanguage %}
<div class="catalog-course-container">{% include "cards_resources" %}</div>
{% endif %}
{% endif %}
{% endfor %}
</div>
</div>
<style>
.catalog-courses-wrapper {
display: grid;
grid-template-columns: repeat(4,1fr);
gap: 20px;
margin-top: 30px;
}
.all-courses-carousel {
position: relative;
}
.slick-arrow {
position: absolute;
top: -30px;
z-index: 111;
cursor: pointer;
}
.right-arrow {
margin-left: 30px;
}
.slick-dots button {
display: block;
width: 10px;
height: 10px;
padding: 0;
border: none;
border-radius: 1px;
background: #8878FF;
text-indent: -9999px;
}
.slick-dots {
list-style-type: none;
}
.slick-dots {
display: flex;
justify-content: center;
margin: 0;
padding-top: 3rem;
list-style-type: none;
gap: 10px;
}
.slick-dots li {
margin: 0 0.25rem;
}
.slick-dots li.slick-active button {
background: #6CF1C9;
}
@media only screen and (max-width: 1170px) {
.catalog-courses-wrapper {
grid-template-columns: repeat(2,1fr);
}
}
@media only screen and (max-width: 768px) {
.catalog-courses-wrapper {
grid-template-columns: repeat(1,1fr);
}
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
const filters = document.querySelectorAll('.filter');
const cards = document.querySelectorAll('.catalog-course-container .card');
let activeFilter = null;
filters.forEach(filter => {
filter.addEventListener('click', function() {
const value = filter.getAttribute('value');
if (activeFilter === value) {
activeFilter = null;
filter.classList.remove('filter-active');
} else {
activeFilter = value;
filters.forEach(f => f.classList.remove('filter-active'));
filter.classList.add('filter-active');
}
filterCourses();
});
});
function filterCourses() {
if (!activeFilter) {
cards.forEach(card => {
card.parentElement.style.display = 'block';
});
} else {
cards.forEach(card => {
const cardCategories = card.getAttribute('categories').split(',');
if (cardCategories.includes(activeFilter)) {
card.parentElement.style.display = 'block';
} else {
card.parentElement.style.display = 'none';
}
});
}
}
});
</script>

View File

@ -0,0 +1,19 @@
<div class="np-card np-search-result">
<div class="np-card-container">
<div class="np-card-content">
<img
class="np-search-result-image"
alt="{{ result.name }}"
src="{{ result.image_url }}"
/>
<div class="np-search-result-content">
<div>
<a class="np-search-result-title" href="{{ result.path }}">
{{ result.name }}
</a>
</div>
<div class="np-search-result-snippet">{{ result.description }}</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,13 @@
<div class="np-card np-search-zero-state">
<div class="np-card-container">
<div class="np-card-content np-card-content-vertical np-search-zero-state-card">
<h3 class="np-search-zero-state-title">
{% t .nothing_found %}
</h3>
<div class="np-search-zero-state-subtitle">
{% t .empty %}
</div>
<div class="np-search-zero-state-image"></div>
</div>
</div>
</div>

View File

@ -0,0 +1,13 @@
<nav class="np-sub-navigation">
<div class="np-sub-navigation-content">
{% for link in navigations.sub_navigation %}
<div class="np-sub-navigation-content-item {{ link.active_class }}">
<a class="np-sub-navigation-content-item-link" href="{{ link.url }}">
<i class="{{ link.icon }} np-button-color np-sub-navigation-content-item-icon"></i>
{{ link.label }}
</a>
<div class="np-sub-navigation-content-item-bar np-button-background-color"></div>
</div>
{% endfor %}
</div>
</nav>

View File

@ -0,0 +1,9 @@
<div class="np-dashboard-resources">
{% if training_events.enrolled.any? %}
{% for training_event in training_events.enrolled %}
{% include "cards_training_event" with training_event %}
{% endfor %}
{% else %}
{% include "training_events_zero_state" %}
{% endif %}
</div>

View File

@ -0,0 +1,53 @@
<div class="np-filter">
<div class="dropdown">
<button
class="np-button dropdown-button"
data-toggle-class="is-open"
data-toggle-escape
data-toggle-outside
data-toggle-target-next
type="button"
>
{% t shared.filters.filter %}
</button>
<div class="dropdown-menu" data-test="modal">
<form method="get">
<span class="dropdown-label">
{% t shared.filters.by_event_type %}
</span>
<ul class="dropdown-checkboxes">
{% for event_type in training_events.filters.event_types %}
{% capture label %}
{% t shared.event_types, key: event_type.value %}
{% endcapture %}
<li>
{% include "filter_checkbox",
label: label,
name: event_type.name,
value: event_type.value
selected: event_type.selected?
%}
</li>
{% endfor %}
</ul>
{% capture label %}{% t shared.filters.by_course %}{% endcapture %}
{%
include "filter_select",
filters: training_events.filters.courses,
key: "courses_uuid",
label: label
%}
<button
class="np-button dropdown-button-apply"
data-toggle-trigger-off
type="submit"
>
{% t shared.filters.apply %}
</button>
</form>
</div>
</div>
</div>

View File

@ -0,0 +1,21 @@
<div class="np-dashboard-resources">
{% if training_events.available.any? %}
<div class="webinars-wrapper">
{% for training_event in training_events.available %}
<div class="webinar-container">
{% include "cards_training_event" with training_event %}
</div>
{% endfor %}
</div>
{% else %}
{% include "training_events_zero_state" %}
{% endif %}
</div>
<style>
.webinars-wrapper {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 20px;
}
</style>

View File

@ -0,0 +1,9 @@
<div class="np-dashboard-resources-container">
<div class="np-zero-state-text">
{% t .empty %}
</div>
<img
class="np-zero-state-training-events"
alt="{% t .empty %}"
/>
</div>

View File

@ -0,0 +1,52 @@
<div class="dropdown dropdown-calendar">
<button
class="np-top-button np-button-font-color np-button np-button-big dropdown-calendar-button"
data-toggle-class="is-open"
data-toggle-escape
data-toggle-outside
data-toggle-target-next
type="button"
>
{% t .add_to_calendar %}
<i class="fas fa-chevron-down dropdown-calendar-button-chevron"></i>
</button>
<ul class="dropdown-calendar-menu">
<li class="dropdown-calendar-item">
<a
class="dropdown-calendar-item-element np-button-background-color-on-hover np-button-font-color-on-hover"
href="{{ training_session.google_calendar_url }}"
target="_blank"
>
{% t .google_calendar %}
</a>
</li>
<li class="dropdown-calendar-item">
<a
class="dropdown-calendar-item-element np-button-background-color-on-hover np-button-font-color-on-hover"
href="{{ training_session.outlook_calendar_url }}"
target="_blank"
>
{% t .outlook_calendar %}
</a>
</li>
<li class="dropdown-calendar-item">
<a
class="dropdown-calendar-item-element np-button-background-color-on-hover np-button-font-color-on-hover"
href="{{ training_session.outlook_office_calendar_url }}"
target="_blank"
>
{% t .office_calendar %}
</a>
</li>
<li class="dropdown-calendar-item">
<a
class="dropdown-calendar-item-element np-button-background-color-on-hover np-button-font-color-on-hover"
href="{{ training_session.ical_calendar_url }}"
target="_blank"
>
{% t .ical_calendar %}
</a>
</li>
</ul>
</div>

View File

@ -0,0 +1,40 @@
<div class="np-training-session-cta">
<div class="overview-cta-btn-container">
<form
action="{{ training_session.cta.url }}"
method="post"
>
{% form_authenticity_token %}
{% if training_session.show_calendar_links? %}
{% include "training_session_calendars" %}
{% endif %}
{% if training_session.cta.undo? %}
<input type="hidden" name="_method" value="delete" />
{% endif %}
{% if training_session.cta.label %}
<button
id="register-btn"
type="submit"
class="overview-cta-btn"
onclick="redirectToSessionUrl()"
>
{{ training_session.cta.label }}
</button>
{% endif %}
</form>
</div>
</div>
<script>
function redirectToSessionUrl() {
const registerBtn = document.getElementById('register-btn');
const sessionUrl = '{{training_session.session_url}}';
if (registerBtn.innerText == 'Register') {
window.open(sessionUrl, '_blank').focus();
}
}
</script>

View File

@ -0,0 +1,16 @@
<div class="np-card-training-session-date">
<div class="np-button-background-color np-card-training-session-date-bar"></div>
<div class="card-training-session-date">
<div class="card-training-session-date-day">
{{ training_session.day }}
</div>
<div>
<div class="card-training-session-date-month">
{{ training_session.month }}
</div>
<div class="card-training-session-date-year">
{{ training_session.year }}
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,6 @@
<h3 class="np-card-heading">
{% t .header %}
</h3>
<div class="np-card-text">
{{ training_event.description }}
</div>

View File

@ -0,0 +1,48 @@
{% include "training_session_header" %}
<div class="overview-content-container">
<div class="content-details">
<div class="training-card-container">
<div class="np-card-padding-large">
<div>
{% include "training_session_status" %}
{% include "training_session_date" %}
</div>
<div class="np-training-session-details">
{% include "training_session_details" %}
{% include "training_session_cta" %}
</div>
</div>
<div class="np-card-content-divider"></div>
<div class="np-card-padding-large">
{% include "training_session_description" %}
</div>
</div>
</div>
<div class="content-activities">
<div class="training-session-container">
<div class="np-training-session-sessions-title">
{% t shared.more_sessions %}
</div>
{% if training_event.sessions.size > 1 %}
{% include "training_session_more_sessions" %}
{% else %}
<div class="np-training-session-zero-state">
<img
alt="{% t .empty %}"
class="np-zero-state-training-sessions"
/>
<div class="np-training-session-zero-state-text">
{% t .empty %}
</div>
</div>
{% endif %}
</div>
</div>
</div>
<style>
.training-card-container {
position: relative;
}
</style>

View File

@ -0,0 +1,23 @@
<div class="np-training-session-info">
<div class="np-training-session-time">
<i class="fal fa-clock np-button-color np-training-session-icon"></i>
<time>{{ training_session.time_period }} {{ training_session.time_zone }}</time>
</div>
{% if training_session.approved? and training_session.location %}
<div class="np-training-session-location">
<i class="fal fa-map-marker-alt np-button-color np-training-session-icon"></i>
{{ training_session.location }}
</div>
{% endif %}
{% if training_session.approved? and training_session.session_url %}
<div class="np-training-session-location">
<i class="fal fa-map-marker-alt np-button-color np-training-session-icon"></i>
<a href="{{ training_session.session_url }}" class="np-button-color" target="_blank" >
{{ training_session.session_url }}
</a>
</div>
{% endif %}
</div>

View File

@ -0,0 +1,11 @@
<div class="overview-header-container">
<div class="overview-btn-container">
<svg width="16" height="9" viewBox="0 0 16 9" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 4.49991L1 4.49991M1 4.49991L4.33417 1.09082M1 4.49991L4.33417 7.909" stroke="#0F2B46" stroke-linejoin="round"></path>
</svg>
<a href="/app/training_events" class="overview-back-btn">Back to all webinars</a>
</div>
<div class="overview-heading">
{{ training_event.title }}
</div>
</div>

View File

@ -0,0 +1,27 @@
<div class="np-training-session-view">
<div class="np-training-session-view-header">
{% include "training_session_header" %}
</div>
<div class="np-card-container np-training-session-view-details np-card-padding np-card-spacing">
{% include "training_session_status" %}
{% include "training_session_date" %}
{% include "training_session_details" %}
<div class="np-card-padding-large">
{% include "training_session_cta" %}
</div>
{% include "training_session_description" %}
</div>
{% if training_event.sessions.size > 1 %}
<div class="np-card-spacing">
<div class="np-training-session-container">
<div class="np-training-session-sessions-title">
{% t shared.more_sessions %}
</div>
{% include "training_session_more_sessions" %}
</div>
</div>
{% endif %}
</div>

View File

@ -0,0 +1,3 @@
{% for session in training_event.sessions %}
{% include "training_session_tile", current_session: training_session %}
{% endfor %}

View File

@ -0,0 +1,6 @@
<div class="np-training-session-cta-note np-training-session-tile-badge np-training-session-tile-badge-{{ training_session.status.type }}">
{% if training_session.approved? %}
<i class="far fa-check np-training-session-icon"></i>
{% endif %}
{{ training_session.status.label }}
</div>

View File

@ -0,0 +1,24 @@
{% if current_session.id != session.id %}
<a
class="np-training-session-tile"
href="{% route training_session, id: session.id %}"
>
<div class="np-training-session-tile-header">
<i class="far fa-calendar-star np-training-session-tile-icon"></i>
<div class="np-training-session-tile-badge np-training-session-tile-badge-{{ session.status.type }}">
{{ session.status.label }}
</div>
</div>
<div class="np-training-session-tile-content">
<div>
<div class="np-training-session-tile-date">
{{ session.month }} {{ session.day }}, {{ session.year }}
</div>
<div class="np-training-session-tile-time">
{{ session.time_period }} {{ session.time_zone }}
</div>
</div>
<i class="fas fa-arrow-right np-training-session-tile-chevron"></i>
</div>
</a>
{% endif %}

View File

@ -0,0 +1,64 @@
<div class="recommended-wrapper">
<div class="heading">
Upcoming webinars
</div>
<div class="upcoming-webinars-cards-wrapper">
{% for training_event in training_events.available %}
<div class="upcoming-webinar-card" date="{{ training_event.sessions.first.day }},{{ training_event.sessions.first.month }},{{ training_event.sessions.first.year }}">
{% include "cards_training_event" with training_event %}
</div>
{% endfor %}
</div>
</div>
<style>
.your-course-carousel {
position: relative;
}
.slick-arrow {
position: absolute;
top: -30px;
z-index: 111;
cursor: pointer;
}
.right-arrow {
margin-left: 30px;
}
.slick-dots button {
display: block;
width: 10px;
height: 10px;
padding: 0;
border: none;
border-radius: 1px;
background: #8878FF;
text-indent: -9999px;
}
.slick-dots {
list-style-type: none;
}
.slick-dots {
display: flex;
justify-content: center;
margin: 0;
padding-top: 3rem;
list-style-type: none;
gap: 10px;
}
.slick-dots li {
margin: 0 0.25rem;
}
.slick-dots li.slick-active button {
background: #6CF1C9;
}
.upcoming-webinars-cards-wrapper {
display: grid;
grid-template-columns: repeat(2,1fr);
margin-top: 40px;
gap: 20px;
}
</style>

View File

@ -0,0 +1,45 @@
<div class="webinars-wrapper">
<div class="heading">
Watch webinars
</div>
<div class="webinars-wrapper">
{% if training_events.available.any? %}
<div class="webinars-cards-wrapper">
{% for training_event in training_events.available %}
<div class="webinar-card-container">
{% include "cards_training_event" with training_event %}
</div>
{% endfor %}
</div>
{% else %}
{% include "training_events_zero_state" %}
{% endif %}
</div>
<div class="see-all-btn-container">
<a class="light-btn" href="/app/training_events">See all</a>
</div>
</div>
<style>
.webinars-cards-wrapper {
display: grid;
grid-template-columns: repeat(2, 1fr);
}
.webinars-wrapper {
margin-top: 30px;
}
@media only screen and (max-width: 1170px) {
.webinars-cards-wrapper {
grid-template-columns: repeat(2,1fr) !important;
}
}
@media only screen and (max-width: 768px) {
.webinars-cards-wrapper {
grid-template-columns: repeat(1,1fr) !important;
}
}
</style>

View File

@ -0,0 +1,112 @@
<div class="card-webinar">
<div class="card-content-training-event">
<div class="card-content-title">
{{ training_event.title }}
</div>
<div class="card-details-webinar">
<div class="card-detail-webinar course-lessons">
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 21.8149H20V22.8149H4V21.8149Z" fill="#42A2FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 2.81494C7.22386 2.81494 7 3.0388 7 3.31494V14.8149C7 15.0172 7.12182 15.1995 7.30866 15.2769C7.4955 15.3543 7.71055 15.3115 7.85355 15.1685L10.2071 12.8149H21.5C21.7761 12.8149 22 12.5911 22 12.3149V3.31494C22 3.0388 21.7761 2.81494 21.5 2.81494H7.5ZM8 13.6078V3.81494H21V11.8149H10C9.86739 11.8149 9.74021 11.8676 9.64645 11.9614L8 13.6078ZM2 7.81494C2 7.5388 2.22386 7.31494 2.5 7.31494H6V8.31494H3V16.3149H14C14.1326 16.3149 14.2598 16.3676 14.3536 16.4614L15.5 17.6078V13.8149H16.5V18.8149C16.5 19.0172 16.3782 19.1995 16.1913 19.2769C16.0045 19.3543 15.7894 19.3115 15.6464 19.1685L13.7929 17.3149H2.5C2.22386 17.3149 2 17.0911 2 16.8149V7.81494ZM17 7.31494H16V8.31494H17V7.31494ZM14 7.31494H15V8.31494H14V7.31494ZM13 7.31494H12V8.31494H13V7.31494Z" fill="#42A2FF"/>
</svg>
{% t shared.event_types, key: training_event.event_type %}
</div>
<div class="card-detail-webinar course-time">
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 21.8149H20V22.8149H4V21.8149Z" fill="#42A2FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.5 5.31494V6.81494H6.5V5.31494H17.5V6.81494H18.5V5.31494H21V7.81494H3V5.31494H5.5ZM5.5 4.31494H2.5C2.22386 4.31494 2 4.5388 2 4.81494V19.3149C2 19.5911 2.22386 19.8149 2.5 19.8149H21.5C21.7761 19.8149 22 19.5911 22 19.3149V4.81494C22 4.5388 21.7761 4.31494 21.5 4.31494H18.5V2.81494H17.5V4.31494H6.5V2.81494H5.5V4.31494ZM3 8.81494V18.8149H21V8.81494H3ZM5.5 10.3149H8V11.3149H5.5V10.3149ZM9 10.3149H11.5V11.3149H9V10.3149ZM15 10.3149H12.5V11.3149H15V10.3149ZM16 10.3149H18.5V11.3149H16V10.3149ZM5.5 16.3149H8V17.3149H5.5V16.3149ZM11.5 16.3149H9V17.3149H11.5V16.3149ZM12.5 16.3149H18.5V17.3149H12.5V16.3149ZM8 13.3149H5.5V14.3149H8V13.3149ZM9 13.3149H11.5V14.3149H9V13.3149ZM15 13.3149H12.5V14.3149H15V13.3149ZM16 13.3149H18.5V14.3149H16V13.3149Z" fill="#42A2FF"/>
</svg>
{% assign session_counter = 0 %}
{% for session in training_event.sessions %}
{% assign session_counter = session_counter | plus: 1 %}
{% endfor %}
{{session_counter}} sessions
</div>
</div>
<div class="card-training-session">
<span class="card-content-label lang-en">
Next session
</span>
<span class="card-content-label lang-de">
Nächste Sitzung
</span>
<div class="card-training-session-date">
<div class="card-training-session-date-day">
{{ training_event.sessions.first.day }}
</div>
<div>
<div class="card-training-session-date-month">
{{ training_event.sessions.first.month }}
</div>
<div class="card-training-session-date-year">
{{ training_event.sessions.first.year }}
</div>
</div>
</div>
</div>
</div>
<div class="card-footer">
<div class="card-training-sessions">
<a
class="card-btn dark-btn lang-en"
href="{% route training_session, id: training_event.sessions.first.id %}"
>
Join now
</a>
<a
class="card-btn dark-btn lang-de"
href="{% route training_session, id: training_event.sessions.first.id %}"
>
Jetzt beitreten
</a>
</div>
</div>
</div>
<style>
.card-webinar {
background: #f8f8f8;
padding: 32px;
border-radius: 8px;
margin: 0 20px 20px 0;
height: 100%;
display: flex;
flex-direction: column;
justify-content: end;
}
.card-details-webinar {
display: flex;
color: #42A2FF;
font-size: 14px;
font-weight: 400;
margin: 20px 0;
}
.card-training-session-date-day {
font-size: 64px;
font-weight: 300;
line-height: 67.2px;
letter-spacing: -0.015em;
color: #0F2B46;
}
.card-training-session-date-month, .card-training-session-date-year {
font-size: 18px;
font-weight: 400;
line-height: 25.2px;
color: #0F2B46;
}
.card-training-session-date {
display: flex;
align-items: center;
margin: 20px 0;
gap: 15px;
}
.card-detail-webinar {
padding-left: 5px;
display: flex;
align-items: center;
gap: 5px;
}
</style>

View File

@ -0,0 +1,143 @@
<div class="recommended-wrapper">
<div class="heading lang-en">
Your courses
</div>
<div class="heading lang-de">
Ihre Kurse
</div>
<div class="carousel-wrapper your-course-carousel">
{% for course in courses.enrolled %}
{% if course.progress > 0 %}
{% unless course.properties.resource == true %}
{% if course.properties.language == userLanguage %}
<div class="carousel-card">
{% include "cards_course" %}
</div>
{% endif %}
{% endunless %}
{% endif %}
{% endfor %}
</div>
</div>
<style>
.your-course-carousel {
position: relative;
}
.slick-arrow {
position: absolute;
top: -30px;
z-index: 111;
cursor: pointer;
}
.right-arrow {
margin-left: 30px;
}
.slick-dots button {
display: block;
width: 10px;
height: 10px;
padding: 0;
border: none;
border-radius: 1px;
background: #8878FF;
text-indent: -9999px;
}
.slick-dots {
list-style-type: none;
}
.slick-dots {
display: flex;
justify-content: center;
margin: 0;
padding-top: 3rem;
list-style-type: none;
gap: 10px;
}
.slick-dots li {
margin: 0 0.25rem;
}
.slick-dots li.slick-active button {
background: #6CF1C9;
}
</style>
<script>
$(document).ready(function(){
$(".your-course-carousel").slick({
slidesToShow: 4,
slidesToScroll: 4,
prevArrow: '<i class="fal fa-chevron-left left-arrow"></i>',
nextArrow: '<i class="fal fa-chevron-right right-arrow"></i>',
infinite: false,
dots: true,
responsive: [
{
breakpoint: 1170,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
}
},
{
breakpoint: 768,
settings: {
slidesToShow: 1,
slidesToScroll: 1,
}
}
]
});
let selectedCategory = null;
let selectedProgress = null;
function filterCards() {
$(".popular-carousel").slick('slickUnfilter');
let filterFunction = function() {
const card = $(this).find('.card');
const cardCategories = card.attr('categories').split(',').map(c => c.trim());
const cardProgress = card.attr('progress');
let showByCategory = !selectedCategory || cardCategories.includes(selectedCategory);
let showByProgress = !selectedProgress || selectedProgress === 'All courses' || cardProgress === selectedProgress;
return showByCategory && showByProgress;
};
$(".popular-carousel").slick('slickFilter', filterFunction);
}
$('.filter').on('click', function() {
let clickedCategory = $(this).attr('value');
if (selectedCategory === clickedCategory) {
selectedCategory = null;
$(this).removeClass('filter-active');
} else {
selectedCategory = clickedCategory;
$('.filter').removeClass('filter-active');
$(this).addClass('filter-active');
}
filterCards();
});
$('.filter-by-progress-option').on('click', function() {
let clickedProgress = $(this).attr('value');
if (selectedProgress === clickedProgress) {
selectedProgress = null;
} else {
selectedProgress = clickedProgress;
}
filterCards();
});
});
</script>

View File

@ -0,0 +1,143 @@
<div class="recommended-wrapper">
<div class="heading lang-en">
Your learning paths
</div>
<div class="heading lang-de">
Ihre Lernpfade
</div>
<div class="carousel-wrapper your-lp-carousel">
{% for learning_path in learning_paths.enrolled %}
{% if learning_path.progress > 0 %}
{% for category in learning_path.categories %}
{% if category.name == userLanguage %}
<div class="carousel-card">
{% include "cards_learning_path" %}
</div>
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
</div>
</div>
<style>
.your-lp-carousel {
position: relative;
}
.slick-arrow {
position: absolute;
top: -30px;
z-index: 111;
cursor: pointer;
}
.right-arrow {
margin-left: 30px;
}
.slick-dots button {
display: block;
width: 10px;
height: 10px;
padding: 0;
border: none;
border-radius: 1px;
background: #8878FF;
text-indent: -9999px;
}
.slick-dots {
list-style-type: none;
}
.slick-dots {
display: flex;
justify-content: center;
margin: 0;
padding-top: 3rem;
list-style-type: none;
gap: 10px;
}
.slick-dots li {
margin: 0 0.25rem;
}
.slick-dots li.slick-active button {
background: #6CF1C9;
}
</style>
<script>
$(document).ready(function(){
$(".your-lp-carousel").slick({
slidesToShow: 4,
slidesToScroll: 4,
prevArrow: '<i class="fal fa-chevron-left left-arrow"></i>',
nextArrow: '<i class="fal fa-chevron-right right-arrow"></i>',
infinite: false,
dots: true,
responsive: [
{
breakpoint: 1170,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
}
},
{
breakpoint: 768,
settings: {
slidesToShow: 1,
slidesToScroll: 1,
}
}
]
});
let selectedCategory = null;
let selectedProgress = null;
function filterCards() {
$(".popular-carousel").slick('slickUnfilter');
let filterFunction = function() {
const card = $(this).find('.card');
const cardCategories = card.attr('categories').split(',').map(c => c.trim());
const cardProgress = card.attr('progress');
let showByCategory = !selectedCategory || cardCategories.includes(selectedCategory);
let showByProgress = !selectedProgress || selectedProgress === 'All courses' || cardProgress === selectedProgress;
return showByCategory && showByProgress;
};
$(".popular-carousel").slick('slickFilter', filterFunction);
}
$('.filter').on('click', function() {
let clickedCategory = $(this).attr('value');
if (selectedCategory === clickedCategory) {
selectedCategory = null;
$(this).removeClass('filter-active');
} else {
selectedCategory = clickedCategory;
$('.filter').removeClass('filter-active');
$(this).addClass('filter-active');
}
filterCards();
});
$('.filter-by-progress-option').on('click', function() {
let clickedProgress = $(this).attr('value');
if (selectedProgress === clickedProgress) {
selectedProgress = null;
} else {
selectedProgress = clickedProgress;
}
filterCards();
});
});
</script>

View File

@ -0,0 +1,64 @@
<div class="recommended-wrapper">
<div class="heading">
Your Webinars
</div>
<div class="upcoming-webinars-cards-wrapper">
{% for training_event in training_events.enrolled %}
<div class="carousel-card">
{% include "your_cards_training_event" with training_event%}
</div>
{% endfor %}
</div>
</div>
<style>
.your-course-carousel {
position: relative;
}
.slick-arrow {
position: absolute;
top: -30px;
z-index: 111;
cursor: pointer;
}
.right-arrow {
margin-left: 30px;
}
.slick-dots button {
display: block;
width: 10px;
height: 10px;
padding: 0;
border: none;
border-radius: 1px;
background: #8878FF;
text-indent: -9999px;
}
.upcoming-webinars-cards-wrapper {
display: grid;
grid-template-columns: repeat(2,1fr);
margin-top: 40px;
gap: 20px;
}
.slick-dots {
list-style-type: none;
}
.slick-dots {
display: flex;
justify-content: center;
margin: 0;
padding-top: 3rem;
list-style-type: none;
gap: 10px;
}
.slick-dots li {
margin: 0 0.25rem;
}
.slick-dots li.slick-active button {
background: #6CF1C9;
}
</style>

View File

@ -0,0 +1,15 @@
{% include "header" %}
{% include "account_tabs" %}
<main class="np-main np-subpage-container np-account">
<div class="np-hidden-desktop">
{% include "account_mobile_view", form: form %}
</div>
<div class="np-hidden-mobile np-flex np-flex-center">
{% include "account_desktop_view", form: form %}
</div>
</main>
{% include "footer" %}

View File

@ -0,0 +1,59 @@
<main class="np-box-container np-open-access">
<div class="np-box">
{% include "header_minimal" %}
<div class="np-box-content-container">
<form class="np-form np-box-content" action="{{ form.url }}" method="get" novalidate>
{% form_authenticity_token %}
<div class="np-form-headline">
{% t shared.welcome_to_school, school_name: current_school.name %}
</div>
<div class="np-form-subheadline">
{% t .headline, key: current_school.course_vocabulary %}
</div>
<div class="np-form-field">
<label class="np-input-label" for="learner_first_name">
{% t shared.first_name %}
</label>
<input
class="np-input"
autofocus="autofocus"
type="text"
name="first_name"
id="learner_first_name"
value="{{ form.first_name }}"
/>
</div>
<div class="np-form-field">
<label class="np-input-label" for="learner_last_name">
{% t shared.last_name %}
</label>
<input
class="np-input"
type="text"
name="last_name"
id="learner_last_name"
value="{{ form.last_name }}"
/>
</div>
<div class="np-form-field">
<label class="np-input-label" for="learner_email">
{% t shared.email_address %}
</label>
<input
class="np-input"
type="text"
name="email"
id="learner_email"
value="{{ form.email }}"
/>
</div>
<input
type="submit"
name="commit"
value="{% t shared.enter %}"
class="np-button np-button-big np-form-action"
/>
</form>
</div>
</div>
</main>

View File

@ -0,0 +1,59 @@
<main class="np-box-container np-open-access">
<div class="np-box">
{% include "header_minimal" %}
<div class="np-box-content-container">
<form class="np-form np-box-content" action="{{ form.url }}" method="get" novalidate>
{% form_authenticity_token %}
<div class="np-form-headline">
{% t shared.welcome_to_school, school_name: current_school.name %}
</div>
<div class="np-form-subheadline">
{% t .headline, key: current_school.course_vocabulary %}
</div>
<div class="np-form-field">
<label class="np-input-label" for="learner_employee_id">
{% t shared.employee_id %}
</label>
<input
class="np-input"
autofocus="autofocus"
type="text"
name="employee_id"
id="learner_employee_id"
value="{{ form.employee_id }}"
/>
</div>
<div class="np-form-field">
<label class="np-input-label" for="learner_first_name">
{% t shared.first_name %}
</label>
<input
class="np-input"
type="text"
name="first_name"
id="learner_first_name"
value="{{ form.first_name }}"
/>
</div>
<div class="np-form-field">
<label class="np-input-label" for="learner_last_name">
{% t shared.last_name %}
</label>
<input
class="np-input"
type="text"
name="last_name"
id="learner_last_name"
value="{{ form.last_name }}"
/>
</div>
<input
type="submit"
name="commit"
value="{% t shared.enter %}"
class="np-button np-button-big np-form-action"
/>
</form>
</div>
</div>
</main>

View File

@ -0,0 +1,40 @@
<main class="np-box-container np-open-access">
<div class="np-box">
{% include "header_minimal" %}
<div class="np-box-content-container">
<form class="np-form np-box-content" action="{{ form.url }}" method="get" novalidate>
<div class="np-form-headline"> {% t shared.welcome_to_school, school_name: current_school.name %} </div>
<div class="np-form-subheadline"> {% t .headline, key: current_school.course_vocabulary %} </div>
{% form_authenticity_token %}
<div class="np-form-field">
<label class="np-input-label" for="learner_last_name">
{% t shared.last_name %}
</label>
<input
class="np-input"
autofocus="autofocus"
type="text"
name="last_name"
id="learner_last_name"
value="{{ form.last_name }}"
/>
</div>
<div class="np-form-field">
<label class="np-input-label" for="learner_phone_number">
{% t shared.phone_number %}
</label>
<input
class="np-input"
type="text"
name="phone_number"
id="learner_phone_number"
value="{{ form.phone_number }}"
/>
</div>
<button type="submit" class="np-button np-button-big np-form-action">
{% t shared.enter %}
</button>
</form>
</div>
</div>
</main>

View File

@ -0,0 +1,74 @@
<main class="np-box-container np-open-access">
<div class="np-box">
{% include "header_minimal" %}
<div class="np-box-content-container">
<form class="np-form np-box-content" action="{{ form.url }}" method="get" novalidate>
<div class="np-form-headline"> {% t shared.welcome_to_school, school_name: current_school.name %} </div>
<div class="np-form-subheadline"> {% t .headline, key: current_school.course_vocabulary %} </div>
{% form_authenticity_token %}
<div class="np-form-field">
<label class="np-input-label" for="learner_email">
{% t shared.email_address %}
</label>
<input
class="np-input"
autofocus="autofocus"
type="email"
name="email"
id="learner_email"
value="{{ form.email }}"
/>
</div>
<div class="np-form-field">
<label class="np-input-label" for="learner_first_name">
{% t shared.first_name %}
</label>
<input
class="np-input"
type="text"
name="first_name"
id="learner_first_name"
value="{{ form.first_name }}"
/>
</div>
<div class="np-form-field">
<label class="np-input-label" for="learner_last_name">
{% t shared.last_name %}
</label>
<input
class="np-input"
type="text"
name="last_name"
id="learner_last_name"
value="{{ form.last_name }}"
/>
</div>
<div class="np-form-field">
<label class="np-input-label" for="learner_phone_number">
{% t shared.phone_number_optional %}
</label>
<input
class="np-input"
type="text"
name="phone_number"
id="learner_phone_number"
value="{{ form.phone_number }}"
/>
</div>
<div class="np-form-field np-open-access-terms">
<input type="hidden" name="terms" value="0" />
<input id="terms" type="checkbox" name="terms" value="1" />
<label for="terms" class="np-open-access-terms-checkbox">
{{ current_school.custom_terms }}
</label>
</div>
<input
type="submit"
name="commit"
value="{% t shared.enter %}"
class="np-button np-button-big np-form-action"
/>
</form>
</div>
</div>
</main>

Some files were not shown because too many files have changed in this diff Show More