moved a bunch of churned customers templates to a hidden folder. Added to Sandata's script and the new groups. Notes.

This commit is contained in:
Norm Rasmussen
2024-05-06 17:07:40 -04:00
parent e9a721cfd6
commit 86ef310892
1042 changed files with 4425 additions and 339 deletions

View File

@ -0,0 +1,40 @@
<div class="np-card">
<div class="np-card-container">
{% if course.ribbon %}
<div class="np-card-ribbon">
{{ course.ribbon }}
</div>
{% endif %}
<img
class="np-card-image"
alt="{{ course.name }}"
src="{{ course.image_url }}"
>
<div class="np-card-content np-card-content-vertical np-card-padding">
<h3 class="np-card-content-title">
{{ course.name }}
</h3>
<div class="np-card-content-subtitle">
{{ course.instructor_names }}
</div>
<div class="course-description">
{{ course.short_description }}
</div>
<div class="np-card-content-footer">
<div class="np-card-content-progress np-button-color">
{% t shared.progress, count: course.progress %}
</div>
{% capture course_path %}{% route course, id: course.id %}{% endcapture %}
{% if course.has_to_restart? %}
{% include "course_version_outdated_popup", path: course_path %}
{% endif %}
<div class="button-wrapper">
<a class="np-button np-button-wide" href="{{ course_path }}">
{% t shared.view %}
</a>
<div class="back-button"></div>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,73 @@
<div class="np-card np-no-horizontal-padding">
<div class="np-card-container">
<div class="np-learning-path">
<img
alt="{{ learning_path.name }}"
class="np-card-image np-learning-path-image"
src="{{ learning_path.image_url }}"
/>
<div class="np-card-text-wrapper">
<div class="np-hidden-desktop np-card-header">
<i class="np-card-header-icon far fa-road"></i>
<div class="np-card-header-type">{% t shared.learning_path.title %}</div>
<div class="np-hidden-desktop np-card-header-items-count">
{{ learning_path.items.count }} {% t .items %}
</div>
</div>
<div class="np-hidden-mobile np-card-header">
<div class="np-card-header-type">{% t shared.learning_path.title %}</div>
<i class="np-card-header-icon far fa-road"></i>
</div>
<div class="np-card-content np-card-padding np-card-content-vertical">
<h3 class="np-card-content-title">
{{ learning_path.name }}
</h3>
<div class="np-card-content-subtitle">
{{ learning_path.instructor_names }}
</div>
<div class="np-hidden-mobile np-card-content-description">
{{ learning_path.description }}
</div>
<div class="np-hidden-mobile np-card-content-progress
np-button-color">
{% t shared.progress, count: learning_path.progress %}
</div>
<div class="np-hidden-mobile np-card-progress-bar-container">
<div
style="width: {{ learning_path.progress }}%"
class="np-button-background-color np-card-progress-bar">
</div>
</div>
<div class="np-card-content-footer">
<div class="np-hidden-desktop np-card-content-progress
np-button-color">
{% t shared.progress, count: learning_path.progress %}
</div>
<div class="button-wrapper">
<a class="np-button" href="{% route learning_path, id: learning_path.id %}">
{% t shared.view %}
</a>
<div class="back-button"></div>
</div>
<span class="np-hidden-mobile np-learning-path-items">
<i class="np-button-color np-learning-path-items-icon far fa-graduation-cap"></i>
<span class="np-learning-path-items-count">
{{ learning_path.items.count }} {% t .items %}
</span>
</span>
</div>
</div>
</div>
</div>
</div>
<div class="np-card-stack">
<div class="np-card-stack-level-1"></div>
<div class="np-card-stack-level-2"></div>
</div>
</div>

View File

@ -0,0 +1,48 @@
<div class="np-card">
<div class="np-card-container">
<div class="np-card-content-training-event">
<h3 class="np-card-content-title">
{{ training_event.title }}
</h3>
<div class="np-card-content-subtitle">
{% t shared.event_types, key: training_event.event_type %}
</div>
<div class="np-card-training-session">
<span class="np-card-content-label">
{% t .next_session %}
</span>
<div class="np-card-training-session-date">
<div class="np-button-background-color np-card-training-session-date-bar"></div>
<div class="np-card-training-session-date-day">
{{ training_event.sessions.first.day }}
</div>
<div>
<div class="np-card-training-session-date-month">
{{ training_event.sessions.first.month }}
</div>
<div class="np-card-training-session-date-year">
{{ training_event.sessions.first.year }}
</div>
</div>
</div>
</div>
</div>
<div class="np-card-content np-card-content-vertical np-card-padding">
<div class="np-card-training-sessions">
<i class="np-card-training-sessions-icon far fa-calendar-star"></i>
<span class="np-card-training-sessions-label">
{% t .sessions, count: training_event.sessions.size %}
</span>
<div class="button-wrapper">
<a
class="np-button np-button-wide"
href="{% route training_session, id: training_event.sessions.first.id %}"
>
{% t shared.view %}
</a>
<div class="back-button"></div>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,34 @@
<div class="courses-filter">
<div class="courses-filter-title">
Categories
</div>
<div class="courses-filter-item courses-filter-item-active" filter-category="ALL" onclick="filterCourses(this);">
All
</div>
{% for category in categories.in_catalog %}
<div class="courses-filter-item" filter-category="{{ category.id }}" onclick="filterCourses(this);">
{{ category.name }}
</div>
{% endfor %}
</div>
<script>
function filterCourses(element) {
let categoryId = element.getAttribute('filter-category');
document.querySelector('.courses-filter-item-active').classList.remove('courses-filter-item-active');
element.classList.add('courses-filter-item-active');
if (categoryId === 'ALL') {
document.querySelectorAll('.filter-hidden').forEach(x => {
x.classList.remove('filter-hidden');
});
} else {
document.querySelectorAll('[course-category]').forEach(x => {
if (x.getAttribute('course-category').includes(categoryId)) {
x.classList.remove('filter-hidden');
} else {
x.classList.add('filter-hidden');
}
});
}
}
</script>

View File

@ -0,0 +1,20 @@
<div class="courses-list np-hidden">
<div class="np-resource-title courses-list-title">
Library
</div>
<div class="row courses-wrapper">
<div class="courses-filter-wrapper col-12 col-md-3">
{% include "courses_filter" %}
</div>
<div class="courses-wrapper row row-with-thumbnails col-12 col-md-9">
{% for course in courses.in_catalog %}
<div class="col-xs-12 col-sm-6 col-xl-4 np-stretch-content role-hidden" course-category="{{ course.categories | map: 'id' | join: ' ' }}" course-role="{{ course.properties.role }}">
{% include "cards_course" %}
</div>
{% endfor %}
<div class="zero-state np-hidden">
{% include "courses_zero_state", message: "No courses matching criteria" %}
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,9 @@
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
{% styles default %}
{% styles colors %}
{% styles custom %}

View File

@ -0,0 +1,178 @@
<header class="np-header np-header-color">
<div class="np-header-content">
<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>
{% if current_school.logo_url %}
<h1 class="np-header-logo">
<a href="{% route home %}">
<img
alt="{{ current_school.name }}"
class="np-header-logo-image"
src="{{ current_school.logo_url }}"
/>
</a>
</h1>
{% else %}
<a href="{% route home %}" class="np-school-name np-header-font-color">
{{ current_school.name }}
</a>
{% endif %}
<div class="np-hidden-mobile np-header-desktop-nav">
<ul class="np-header-desktop-nav-list">
{% for website_navigation in navigations.header_navigations_external %}
<li class= "np-header-desktop-nav-item">
<a
href="{{ website_navigation.path }}"
class="np-header-desktop-nav-link np-header-font-color"
>
{{ website_navigation.name }}
</a>
</li>
{% endfor %}
</ul>
</div>
{% if current_person.signed_in? %}
<div class="np-hidden-mobile np-header-search np-header-search-expanded">
<form action="{% route search %}" method="get" data-test="desktop-search">
<input
aria-label="{% t .search %}"
class="np-header-search-input np-header-font-background-color"
type="text"
name="q"
placeholder="{% t .search %}"
/>
<i class="np-header-search-icon far fa-search"></i>
</form>
</div>
<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
>
<img
alt="{{ current_person.name }}"
class="np-header-avatar-image"
src="{{ current_person.avatar_url }}"
>
</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 %}
<a
class="np-header-avatar-tooltip-navigation-link np-danger"
href="{% route logout %}"
>
{% t .sign_out %}
</a>
</nav>
</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 %}
</div>
{% 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="np-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"
>
{{ 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 %}
<a
class="np-header-mobile-menu-content-button np-danger"
href="{% route logout %}"
>
{% t .sign_out %}
</a>
</div>
</div>
</div>
{% include "messages" %}

View File

@ -0,0 +1,83 @@
<div class="topics-wrapper col-xs-12">
<h3 class="topics-title">
Popular Topics
</h3>
<div class="topics row">
<div class="topic-wrapper col-12 col-sm-6 col-md-4 col-lg-3">
<a class="topic" href="https://support.cayuse.com/hc/en-us/categories/360002631894-Animal-Oversight">
Animal Oversight
</a>
</div>
<div class="topic-wrapper col-12 col-sm-6 col-md-4 col-lg-3">
<a class="topic" href="https://support.cayuse.com/hc/en-us/categories/1500001762282-Connect-Conference-Community">
Cayuse Community
</a>
</div>
<div class="topic-wrapper col-12 col-sm-6 col-md-4 col-lg-3">
<a class="topic" href="https://support.cayuse.com/hc/en-us/categories/9886295600147-Cayuse-Modernization">
Cayuse Modernization
</a>
</div>
<div class="topic-wrapper col-12 col-sm-6 col-md-4 col-lg-3">
<a class="topic" href="https://support.cayuse.com/hc/en-us/categories/360000137107-Fund-Manager-Effort-and-Grants">
Fund Manager, Effort, and Grants
</a>
</div>
<div class="topic-wrapper col-12 col-sm-6 col-md-4 col-lg-3">
<a class="topic" href="https://support.cayuse.com/hc/en-us/categories/115001977467-Human-Ethics">
Human Ethics
</a>
</div>
<div class="topic-wrapper col-12 col-sm-6 col-md-4 col-lg-3">
<a class="topic" href="https://support.cayuse.com/hc/en-us/categories/360003816254-Integrations-and-APIs">
Integrations & APIs
</a>
</div>
<div class="topic-wrapper col-12 col-sm-6 col-md-4 col-lg-3">
<a class="topic" href="https://support.cayuse.com/hc/en-us/categories/360001518894-Outside-Interests">
Outside Interests
</a>
</div>
<div class="topic-wrapper col-12 col-sm-6 col-md-4 col-lg-3">
<a class="topic" href="https://support.cayuse.com/hc/en-us/categories/115002015648-Platform-and-Admin">
Platform & Admin
</a>
</div>
<div class="topic-wrapper col-12 col-sm-6 col-md-4 col-lg-3">
<a class="topic" href="https://support.cayuse.com/hc/en-us/categories/360001581913-Sponsored-Projects-4-0">
Sponsored Projects 4.0
</a>
</div>
<div class="topic-wrapper col-12 col-sm-6 col-md-4 col-lg-3">
<a class="topic" href="https://support.cayuse.com/hc/en-us/categories/360002101954-Vivarium-Operations-and-Vet-Care">
Vivarium Operations & Vet Care
</a>
</div>
</div>
</div>
<style>
.topics-title {
text-align: center;
margin-bottom: 30px;
font-weight: 600;
}
.topic-wrapper {
display: flex;
margin-bottom: 10px;
}
.topic {
width: 100%;
height: 100%;
text-align: center;
border: 2px solid #253272;
padding: 8px 0;
color: #253272;
border-radius: 6px;
font-weight: 600;
}
.topic:hover {
color: white;
background: rgba(37,50,114, 0.9);
}
</style>

View File

@ -0,0 +1,106 @@
<div class="role-select container">
<div class="role-select-title">
Library
</div>
<div class="role-select-list row">
<a class="role-select-item col-12 col-md-6 col-xl-3" href="#administrators">
<div class="role-select-item-container">
<img class="role-select-image" src="https://cdn.northpass.io/Cayuse/admin.jpg">
<div class="role-select-item-text">
<div class="role-select-item-name">
Administrators
</div>
</div>
</div>
</a>
<a class="role-select-item col-12 col-md-6 col-xl-3" href="#researchers">
<div class="role-select-item-container">
<img class="role-select-image" src="https://cdn.northpass.io/Cayuse/researcher.jpg">
<div class="role-select-item-text">
<div class="role-select-item-name">
Researchers
</div>
</div>
</div>
</a>
<a class="role-select-item col-12 col-md-6 col-xl-3" href="#it-managers">
<div class="role-select-item-container">
<img class="role-select-image" src="https://cdn.northpass.io/Cayuse/it_manager.jpg">
<div class="role-select-item-text">
<div class="role-select-item-name">
IT Managers
</div>
</div>
</div>
</a>
<a class="role-select-item col-12 col-md-6 col-xl-3" href="#staff">
<div class="role-select-item-container">
<img class="role-select-image" src="https://cdn.northpass.io/Cayuse/staff.jpg">
<div class="role-select-item-text">
<div class="role-select-item-name">
Staff
</div>
</div>
</div>
</a>
</div>
</div>
<script>
addEventListener("hashchange", () => {
showCourses(location.hash.replace('#', ''));
});
addEventListener('DOMContentLoaded', () => {
showCourses(location.hash.replace('#', ''));
})
const roleDescriptions = {
'administrators': {
name: 'Courses for Administrators',
},
'researchers': {
name: 'Courses for Researchers',
},
'it-managers': {
name: 'Courses for IT Managers',
},
'staff': {
name: 'Courses for Staff',
}
}
function showCourses(name) {
let coursesParent = document.querySelector('.courses-wrapper')
let roleSelectElement = document.querySelector('.role-select');
if (!name) {
if (roleSelectElement.classList.contains('np-hidden')) {
roleSelectElement.classList.remove('np-hidden');
document.querySelector('.courses-list').classList.add('np-hidden');
}
} else if (roleDescriptions[name]) {
coursesParent.querySelectorAll('[course-role]').forEach(x => {
if (x.getAttribute('course-role') === name) {
x.classList.remove('role-hidden');
} else {
x.classList.add('role-hidden');
}
});
document.querySelectorAll('[filter-category]:not([filter-category="ALL"])').forEach( x => {
if (coursesParent.querySelector(`[course-category*="${x.getAttribute('filter-category')}"][course-role="${name}"]`)) {
x.classList.remove('role-hidden');
} else {
x.classList.add('role-hidden');
}
});
document.querySelector('.courses-list-title').innerText = roleDescriptions[name].name;
if (!roleSelectElement.classList.contains('np-hidden')) {
roleSelectElement.classList.add('np-hidden');
document.querySelector('.courses-list').classList.remove('np-hidden');
}
}
}
</script>

View File

@ -0,0 +1,25 @@
<nav class="np-sub-navigation np-hidden-desktop">
<div class="np-sub-navigation-content">
{% for link in navigations.sub_navigation %}
{% unless link.label == 'Catalog' %}
{% if link.label == 'Home' %}
<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>
Library
</a>
<div class="np-sub-navigation-content-item-bar np-button-background-color"></div>
</div>
{% else %}
<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>
{% endif %}
{% endunless %}
{% endfor %}
</div>
</nav>

View File

@ -0,0 +1,59 @@
{% include "header" %}
{% include "course_version_outdated_alert", courses: courses.enrolled %}
{% include "sub_navigation" %}
<main class="np-main np-courses np-subpage-container np-max-width">
{% include "role_select" %}
{% include 'courses_with_filter' %}
</main>
{% include "footer" %}
<style>
.courses-filter {
margin-bottom: 20px;
}
.courses-filter-title {
font-size: 22px;
font-weight: 500;
margin-bottom: 10px;
}
.courses-filter-item {
cursor: pointer;
padding: 5px 0;
}
.courses-filter-item-active {
font-weight: 600;
cursor: auto;
}
.role-select-title {
font-size: 30px;
font-weight: 600;
margin-bottom: 20px;
}
.role-select-item-container {
padding: 20px 30px;
display: flex;
align-items: center;
text-align: center;
border: 1px solid darkblue;
border-radius: 8px;
flex-direction: column;
height: 100%;
}
.role-select-item-name {
font-size: 20px;
font-weight: 500;
margin-bottom: 10px;
}
.role-select-item {
margin-bottom: 20px;
}
.role-select-image {
width: 100%;
}
.role-select-item-text {
margin-top: 10px;
}
.role-hidden, .filter-hidden {
display: none !important;
}
</style>

View File

@ -0,0 +1,30 @@
{% include "header" %}
{% include "course_version_outdated_alert", courses: courses.enrolled %}
{% include "sub_navigation" %}
<main class="np-main np-dashboard np-subpage-container np-max-width">
<div class="row np-flex-center">
<div class="col-xs-12 col-sm-8">
{% if features.learning_paths? %}
<div class="np-dashboard-resources-title">
{% t shared.learning_paths %}
</div>
{% include "learning_paths_index", items: learning_paths.enrolled %}
{% endif %}
<div class="np-dashboard-resources-title">
{% t shared.course_vocabulary.plural, key: current_school.course_vocabulary %}
</div>
{% include "courses_index", class: "col-xs-12 col-sm-6 np-stretch-content" %}
</div>
{% if features.training_events? %}
<div class="np-grid-spacing col-xs-12 col-sm-4">
<div class="np-dashboard-resources-title">
{% t .upcoming_events %}
</div>
{% include "training_events_dashboard" %}
</div>
{% endif %}
{% include 'popular_topics' %}
</div>
</main>
{% include "footer" %}

View File

@ -0,0 +1,55 @@
<script>
window.location.href = '/app/courses'
</script>
{%- comment -%} {% include "header" %}
{% include "course_version_outdated_alert", courses: courses.featured %}
<main class="np-main np-homepage">
<div class="np-homepage-hero">
<img class="np-homepage-hero-image"
src="{{ homepage.artwork_url }}"
alt="{{ homepage.headline }}"
/>
<div class="np-homepage-hero-content">
<div class="np-homepage-headline np-header-font-color">
{{ homepage.headline }}
</div>
<div class="np-homepage-subheadline np-header-font-color">
{{ homepage.subheadline }}
</div>
<a class="np-homepage-hero-cta np-button" href="{% route catalog %}">
{% t .discover %}
</a>
</div>
</div>
{% include "sub_navigation" %}
<div class="np-homepage-featured np-max-width">
<div class="np-homepage-featured-text">
<div class="np-homepage-headline">
{{ homepage.featured_courses_headline }}
</div>
<div class="np-homepage-subheadline">
{{ homepage.featured_courses_subheadline }}
</div>
</div>
{% if courses.featured.any? %}
<div class="np-homepage-featured-courses row">
{% for course in courses.featured %}
<div class="col-xs-12 col-md-6 col-lg-4 np-stretch-content">
{% include "cards_course" with course %}
</div>
{% endfor %}
</div>
{% else %}
<div class="np-homepage-featured-empty">
<div class="np-zero-state-text">
{% t .empty, key: current_school.course_vocabulary %}
</div>
<img
class="np-zero-state-courses"
alt="{% t .empty, key: current_school.course_vocabulary %}"
/>
</div>
{% endif %}
</div>
</main>
{% include "footer" %} {%- endcomment -%}

View File

@ -0,0 +1,50 @@
/*
Put your custom overlay styles in here
You can use your northpass color palette in this file
{{ color_palette.button_font_color }}
{{ color_palette.button_color }}
{{ color_palette.button_hover_color }}
{{ color_palette.header_font_color }}
{{ color_palette.header_font_hover_color }}
{{ color_palette.header_color }}
*/
a, a:hover, a:focus, a:active {
text-decoration: none;
color: inherit;
}
.course-description {
margin-top: 10px;
}
@media screen and (min-width: 768px) and (max-width: 950px){
.np-card-content-footer {
flex-direction: column;
align-items: center;
gap: 20px;
}
}
.button-wrapper {
position: relative;
}
.back-button {
position: absolute !important;
background: #2e3e8f;
opacity: 0.8;
width: 100%;
height: 100%;
top: 4px;
left: 4px;
border-radius: 4px;
z-index: -1;
}
.np-button:hover {
color: white;
}
.np-card-content-progress {
font-size: 1rem;
}
.np-header-desktop-nav-list {
margin-bottom: 0;
}