<section class="panel theme--white
panel--no-padding-top ">
<div class="panel__inner">
<div class="filters js-filters js-loader-overlay-holder" aria-controls="filter-documents-list">
<div class="row">
<div class="col h-margin-top-4 h-margin-bottom-1">
<div class="headline-5">Filtrera</div>
</div>
</div>
<div class="h-margin-bottom-2">
<div class="row h-margin-bottom-1 js-dropdowns-holder ">
<div class="col col--span-12 col--span-xs-6 col--span-m-3">
<div class="form-item form-item--select ">
<select id="categorySelect1" class="select__select js-filter" name="Select1" aria-controls="filter-documents-list" data-type="select" data-type-variant="select-with-relation">
<option class="select__option" value="" disabled selected>Please select category</option>
<option class="select__option" value="1">Option 1</option>
<option class="select__option" value="2">Option 2</option>
</select>
</div>
</div>
<div class="col col--span-12 col--span-xs-6 col--span-m-3">
<div class="form-item form-item--select ">
<select id="categorySelect2" class="select__select js-filter" name="Select2" aria-controls="filter-documents-list" data-type="select" data-type-variant="select-with-relation">
<option class="select__option" value="">Option 1</option>
<option class="select__option" value="2" selected>Option 2</option>
<option class="select__option" value="3">Option 3</option>
</select>
</div>
</div>
</div>
<div class="row row--justify-between h-margin-bottom-1">
<div class="col col--auto-width">
<div class="h-display-inline-block h-margin-right-3 h-margin-bottom-2">
<div class="form-item">
<div class="js-tooltip">
<div class="tooltip">
<div class="tooltip__content">
Produktblad lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.
<div class="tooltip__arrow"></div>
</div>
</div>
<div class="checkbox__item ">
<label class="checkbox__label js-filter" for="Produktblad">
<input class="checkbox__input js-filter" type="checkbox" name="Produktblad" id="Produktblad" value="Produktblad" aria-controls="filter-documents-list" data-type="checkbox">
<span class="checkbox__title">Produktblad</span>
</label>
</div>
</div>
</div>
</div>
<div class="h-display-inline-block h-margin-right-3 h-margin-bottom-2">
<div class="form-item">
<div class="js-tooltip">
<div class="tooltip">
<div class="tooltip__content">
Manual lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.
<div class="tooltip__arrow"></div>
</div>
</div>
<div class="checkbox__item ">
<label class="checkbox__label js-filter" for="Manual">
<input class="checkbox__input js-filter" type="checkbox" name="Manual" id="Manual" value="Manual" aria-controls="filter-documents-list" data-type="checkbox">
<span class="checkbox__title">Manual</span>
</label>
</div>
</div>
</div>
</div>
<div class="h-display-inline-block h-margin-right-3 h-margin-bottom-2">
<div class="form-item">
<div class="js-tooltip">
<div class="tooltip">
<div class="tooltip__content">
Broschyrer lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.
<div class="tooltip__arrow"></div>
</div>
</div>
<div class="checkbox__item ">
<label class="checkbox__label js-filter" for="Broschyrer">
<input class="checkbox__input js-filter" type="checkbox" name="Broschyrer" id="Broschyrer" value="Broschyrer" aria-controls="filter-documents-list" data-type="checkbox">
<span class="checkbox__title">Broschyrer</span>
</label>
</div>
</div>
</div>
</div>
<div class="h-display-inline-block h-margin-right-3 h-margin-bottom-2">
<div class="form-item">
<div class="js-tooltip">
<div class="tooltip">
<div class="tooltip__content">
Kvalitetsdokument lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.
<div class="tooltip__arrow"></div>
</div>
</div>
<div class="checkbox__item ">
<label class="checkbox__label js-filter" for="Kvalitetsdokument">
<input class="checkbox__input js-filter" type="checkbox" name="Kvalitetsdokument" id="Kvalitetsdokument" value="Kvalitetsdokument" aria-controls="filter-documents-list" data-type="checkbox">
<span class="checkbox__title">Kvalitetsdokument</span>
</label>
</div>
</div>
</div>
</div>
<div class="h-display-inline-block h-margin-right-3 h-margin-bottom-2">
<div class="form-item">
<div class="js-tooltip">
<div class="tooltip">
<div class="tooltip__content">
Ritning lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.
<div class="tooltip__arrow"></div>
</div>
</div>
<div class="checkbox__item ">
<label class="checkbox__label js-filter" for="Ritning">
<input class="checkbox__input js-filter" type="checkbox" name="Ritning" id="Ritning" value="Ritning" aria-controls="filter-documents-list" data-type="checkbox">
<span class="checkbox__title">Ritning</span>
</label>
</div>
</div>
</div>
</div>
<div class="h-display-inline-block h-margin-right-3 h-margin-bottom-2">
<div class="form-item">
<div class="js-tooltip">
<div class="tooltip">
<div class="tooltip__content">
Övrigt lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.
<div class="tooltip__arrow"></div>
</div>
</div>
<div class="checkbox__item ">
<label class="checkbox__label js-filter" for="Övrigt">
<input class="checkbox__input js-filter" type="checkbox" name="Övrigt" id="Övrigt" value="Övrigt" checked aria-controls="filter-documents-list" data-type="checkbox">
<span class="checkbox__title">Övrigt</span>
</label>
</div>
</div>
</div>
</div>
</div>
<div class="col col--auto-width">
<label for="Inkludera tillbehörsdokument" class="switch">
<input type="checkbox" class="switch__checkbox js-filter" value="includeAccessoryDocuments" aria-controls="filter-documents-list" data-type="switch" checked id="Inkludera tillbehörsdokument">
<div class="switch__control"></div>
<span class="switch__label">Inkludera tillbehörsdokument</span>
</label>
</div>
</div>
<div class="js-clear-filters-holder h-hidden-from-view row h-margin-top-1 h-margin-bottom-1 ">
<div class="col">
<a href="#" class="js-clear-filters">Clear filters</a>
</div>
</div>
</div>
<div class="h-margin-top-3">
<div class="row row--justify-between row--align-center">
<div class="col col--auto-width">
<p class="search-result-count">Visar 5 av 1000 träffar.</p>
</div>
<div class="col col--auto-width">
<div class="form-item form-item--select form-item--horizontal">
<label for="categorySelectSort" class="form-item__label">
Sortera:
</label>
<select id="categorySelectSort" class="select__select js-filter select__select--ghost" name="Sort" aria-controls="filter-documents-list" data-type="select">
<option class="select__option" value="" selected>Senaste</option>
<option class="select__option" value="a-z">A-Z</option>
<option class="select__option" value="z-a">Z-A</option>
</select>
</div>
</div>
</div>
</div>
<div class="
horizontal-scroller
horizontal-scroller--show-icon
" data-show-scroll-icon="true">
<div class="horizontal-scroller__scroller">
<table id="filter-documents" class="table table--inverted-zebra ">
<thead>
<tr>
<td>Dokument</td>
<td><a class="js-sortable-cell" href="#" id="article" aria-controls="filter-documents-list">Artikel</a></td>
<td><a class="js-sortable-cell" href="#" id="doctype" aria-controls="filter-documents-list">Dokumenttyp</a></td>
<td><a class="js-sortable-cell" href="#" id="date" aria-controls="filter-documents-list">Publiceringsdatum</a></td>
<td>Ladda ner</td>
</tr>
</thead>
<tbody id="filter-documents-list">
<tr data-extension="test" data-filename="pdf" data-document-category="Övrigt" class="js-document-tracking-row">
<td><a class="js-document-tracking-link" href="#">Anvisningar för isärtagning (pdf 618.54kB)</a></td>
<td>CASA Blues</td>
<td>Övrigt</td>
<td>2021-11-02</td>
<td><a href="/mocks/document.pdf" class="table__icon js-document-tracking-link" download><svg class="icon" focusable="false">
<use xlink:href="#icon-download"></use>
</svg></a></td>
</tr>
<tr data-extension="test 2" data-filename="pdf2" data-document-category="Övrigt2" class="js-document-tracking-row">
<td><a class="js-document-tracking-link" href="#">Anvisningar för montering, drift och underhåll (pdf 618.54kB)</a></td>
<td><a href="#">CASA Blues</a></td>
<td>Övrigt</td>
<td>2021-10-03</td>
<td><a href="/mocks/document.pdf" class="table__icon js-document-tracking-link" download><svg class="icon" focusable="false">
<use xlink:href="#icon-download"></use>
</svg></a></td>
</tr>
<tr data-extension="test 3" data-filename="pdf 3" data-document-category="Övrigt 3" class="js-document-tracking-row">
<td><a class="js-document-tracking-link" href="#">Anvisningar för montering, drift och underhåll, Epsilon Echos series (pdf 618.54kB)</a></td>
<td>CASA Blues</td>
<td>Övrigt</td>
<td>2021-10-04</td>
<td><a href="/mocks/document.pdf" class="table__icon js-document-tracking-link" download><svg class="icon" focusable="false">
<use xlink:href="#icon-download"></use>
</svg></a></td>
</tr>
<tr data-extension="test 4" data-filename="pdf 4" data-document-category="Övrigt 4" class="js-document-tracking-row">
<td><a class="js-document-tracking-link" href="#">Apparatlåda, All Year Comfort (COMPACT) (pdf 618.54kB)</a></td>
<td>CASA Blues</td>
<td>Övrigt</td>
<td>2021-10-04</td>
<td><a href="/mocks/document.pdf" class="table__icon js-document-tracking-link" download><svg class="icon" focusable="false">
<use xlink:href="#icon-download"></use>
</svg></a></td>
</tr>
<tr data-extension="test 5" data-filename="pdf 5" data-document-category="Övrigt 5" class="js-document-tracking-row">
<td><a href="#">Bedömning, Sunda Hus (pdf 618.54kB)</a></td>
<td>CASA Blues</td>
<td>Övrigt</td>
<td>2021-10-02</td>
<td><a href="/mocks/document.pdf" class="table__icon" download><svg class="icon" focusable="false">
<use xlink:href="#icon-download"></use>
</svg></a></td>
</tr>
</tbody>
</table>
</div>
</div>
<script type="text/template" id="document-data-tmpl">
<% forEach(results, function(result) { %>
<tr
data-extension="<%= result.extension %>"
data-filename="<%= result.fileName %>"
data-document-category="<%= result.type %>"
class="js-document-tracking-row"
>
<td>
<a class="js-document-tracking-link" href="<%= result.url %>" target="_blank">
<%= result.title %>
</a>
</td>
<td><%= result.article %></td>
<td><%= result.type %></td>
<td><%= result.date %></td>
<td>
<a
href="<%= result.fileUrl %>"
download
class="js-document-tracking-link"
>
Ladda ner
</a>
</td>
</tr>
<% }); %>
</script>
<div class="h-text-align-center">
<p class="search-result-count"></p>
<button class="button js-load-more " href="/mocks/api/documents.json" aria-controls="filter-documents-list" data-template-id="document-data-tmpl">
<span class="button__label">Ladda fler</span>
</button>
</div>
</div>
</div>
</section>
<script type="text/template" id="no-results-data-tmpl"></script>
{{#> @panel theme=panel.theme modifiers=panel.modifiers }}
<div class="filters js-filters js-loader-overlay-holder" {{{getattributes filtersAttributes}}}>
{{#if filtersTitle}}
<div class="row">
<div class="col h-margin-top-4 h-margin-bottom-1">
<div class="headline-5">{{filtersTitle}}</div>
</div>
</div>
{{/if}}
<div class="h-margin-bottom-2">
{{#if displayDropdowns}}
<div class="row h-margin-bottom-1 js-dropdowns-holder {{additionalClasses}}">
{{#each filters.dropdowns}}
<div class="col col--span-12 col--span-xs-6 col--span-m-3">
{{#if multi}}
{{render "@select-multiple" this merge=true}}
{{else}}
{{render "@select--default" this merge=true}}
{{/if}}
</div>
{{/each}}
</div>
{{/if}}
{{#each filters.checkboxes}}
{{#if label}}
<div class="row">
<div class="col">
<div class="headline-7">{{label}}</div>
</div>
</div>
{{/if}}
<div class="row row--justify-between h-margin-bottom-1">
<div class="col col--auto-width">
{{#each items}}
<div class="h-display-inline-block h-margin-right-3 h-margin-bottom-2">
{{render "@checkbox--default" this merge=true}}
</div>
{{/each}}
</div>
<div class="col col--auto-width">
{{#each switchers}}
{{render "@switch" this merge=true}}
{{/each}}
</div>
</div>
{{/each}}
{{#if displaySearch}}
<div class="row h-margin-top-3 h-margin-bottom-1 js-search-field-holder">
<div class="col col--span-12 col--span-l-7 col--span-xl-5">
{{render "@search" searchField}}
</div>
</div>
{{/if}}
{{#if resetButton}}
<div class="js-clear-filters-holder h-hidden-from-view row h-margin-top-1 h-margin-bottom-1 {{additionalClasses}}">
<div class="col">
<a href="#" class="js-clear-filters">Clear filters</a>
</div>
</div>
{{/if}}
</div>
<div class="h-margin-top-3">
<div class="row row--justify-between row--align-center">
<div class="col col--auto-width">
{{>@search-result-count searchResultCount}}
</div>
<div class="col col--auto-width">
{{#if displaySort}}
{{render "@select--ghost" filters.sort merge=true}}
{{/if}}
</div>
</div>
</div>
{{#if cards}}
<div class="row" id="{{cards.id}}">
{{#each cards.items}}
<div class="col col--bottom-gutter col--span-12 col--span-s-6 col--span-xl-3">
{{>@card this}}
</div>
{{/each}}
</div>
{{render "@card-data-tmpl"}}
{{/if}}
{{#if officeCards}}
<div class="row" id="{{officeCards.id}}">
{{#each officeCards.items}}
<div class="col col--bottom-gutter col--span-12 col--span-s-6 col--span-xl-3">
{{>@contact-card this}}
</div>
{{/each}}
</div>
{{render "@office-card-data-tmpl"}}
{{#> @modal messageSelectorModal modifiers="form"}}
<div class="h-padding-bottom-4">
<h2>New message</h2>
<div id="form_40600">
<script>
document.addEventListener('DOMContentLoaded', function () {
hbspt.forms.create({
css: '',
portalId: "3433011",
formId: "cee49fbd-acb1-4054-9a44-74ea6ec39adc",
target: "#form_40600",
onFormSubmit: function ($form) {
dataLayer.push({
'event': 'hubspot form submitted',
'hubspot form name': 'Technical support',
'hubspot form id': $form[0].id,
});
},
onFormReady: function ($form) {
let event;
try {
event = new CustomEvent('onDynamicContentAdded');
} catch (e) {
event = document.createEvent('Event');
event.initEvent('onDynamicContentAdded', true, true);
};
window.dispatchEvent(event);
}
});
});
</script>
</div>
</div>
{{/@modal}}
{{/if}}
{{#if personCards}}
<div class="row filters-result-container" id="{{personCards.id}}">
{{#each personCards.items}}
<div class="col col--bottom-gutter col--span-12 col--span-s-6 col--span-xl-3">
{{>@contact-card this}}
</div>
{{/each}}
<div class="row h-margin-top-3">
{{render "@no-results"}}
</div>
</div>
{{render "@person-card-data-tmpl"}}
{{/if}}
{{#if partnerCards}}
<div class="row filters-result-container" id="{{partnerCards.id}}">
{{#each partnerCards.items}}
<div class="col col--bottom-gutter col--span-12 col--span-s-6 col--span-xl-3">
{{>@contact-card this}}
</div>
{{/each}}
</div>
{{render "@partner-card-data-tmpl"}}
{{/if}}
{{#if table}}
{{#> @horizontal-scroller showScrollIcon="true" contentContainer="filter-documents"}}
<table id="{{table.id}}" class="table table--inverted-zebra {{ tableAdditionalClasses }}">
{{#with ../table}}
<thead>
{{#each headerRows}}
<tr>
{{#each cols}}
<td>{{{ this }}}</td>
{{/each}}
</tr>
{{/each}}
</thead>
<tbody id="filter-documents-list">
{{#each rows}}
<tr
data-extension="{{this.extension}}"
data-filename="{{this.fileName}}"
data-document-category="{{this.type}}"
class="js-document-tracking-row"
>
{{#each cols}}
<td>{{{this}}}</td>
{{/each}}
</tr>
{{/each}}
</tbody>
{{/with}}
</table>
{{/@horizontal-scroller}}
{{render "@document-data-tmpl"}}
{{/if}}
<div class="h-text-align-center">
{{#if searchResultCount}}
{{> @search-result-count}}
{{/if}}
{{#if loadMore}}
{{#if loadMore.visuallyHidden}}
{{> @button loadMore additionalClasses="js-load-more h-hidden-from-view"}}
{{else}}
{{> @button loadMore additionalClasses="js-load-more"}}
{{/if}}
{{/if}}
</div>
</div>
{{/@panel}}
{{render "@no-results-data-tmpl"}}
{
"panel": {
"theme": "white",
"modifiers": "no-padding-top"
},
"filtersTitle": "Filtrera",
"filtersAttributes": {
"aria-controls": "filter-documents-list"
},
"displayDropdowns": true,
"displaySearch": false,
"resetButton": true,
"displaySort": true,
"searchField": {
"name": "Search",
"value": "",
"type": "text",
"placeholder": "text",
"disabled": false,
"additionalClasses": "js-filter",
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "search"
}
},
"searchResultCount": {
"paginationInfo": {
"text": "Visar 5 av 1000 träffar."
}
},
"filters": {
"checkboxes": [
{
"items": [
{
"name": "Produktblad",
"label": "Produktblad",
"value": "Produktblad",
"description": "Produktblad lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.",
"type": "checkbox",
"legend": false,
"disabled": false,
"checked": false,
"additionalClasses": "js-filter",
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "checkbox"
},
"tooltip": true
},
{
"name": "Manual",
"label": "Manual",
"value": "Manual",
"description": "Manual lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.",
"type": "checkbox",
"legend": false,
"disabled": false,
"checked": false,
"additionalClasses": "js-filter",
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "checkbox"
},
"tooltip": true
},
{
"name": "Broschyrer",
"label": "Broschyrer",
"value": "Broschyrer",
"description": "Broschyrer lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.",
"type": "checkbox",
"legend": false,
"disabled": false,
"checked": false,
"additionalClasses": "js-filter",
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "checkbox"
},
"tooltip": true
},
{
"name": "Kvalitetsdokument",
"label": "Kvalitetsdokument",
"value": "Kvalitetsdokument",
"description": "Kvalitetsdokument lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.",
"type": "checkbox",
"legend": false,
"disabled": false,
"checked": false,
"additionalClasses": "js-filter",
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "checkbox"
},
"tooltip": true
},
{
"name": "Ritning",
"label": "Ritning",
"value": "Ritning",
"description": "Ritning lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.",
"type": "checkbox",
"legend": false,
"disabled": false,
"checked": false,
"additionalClasses": "js-filter",
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "checkbox"
},
"tooltip": true
},
{
"name": "Övrigt",
"label": "Övrigt",
"value": "Övrigt",
"description": "Övrigt lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut.",
"type": "checkbox",
"legend": false,
"disabled": false,
"checked": true,
"additionalClasses": "js-filter",
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "checkbox"
},
"tooltip": true
}
],
"switchers": [
{
"name": "Inkludera tillbehörsdokument",
"label": "Inkludera tillbehörsdokument",
"value": "includeAccessoryDocuments",
"additionalClasses": "js-filter",
"checked": true,
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "switch"
}
}
]
}
],
"dropdowns": [
{
"name": "Select1",
"id": "categorySelect1",
"label": "",
"additionalClasses": "js-filter",
"options": [
{
"name": "Please select category",
"value": "",
"disabled": true,
"selected": true
},
{
"name": "Option 1",
"value": 1
},
{
"name": "Option 2",
"value": 2
}
],
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "select",
"data-type-variant": "select-with-relation"
}
},
{
"name": "Select2",
"label": "",
"id": "categorySelect2",
"additionalClasses": "js-filter",
"options": [
{
"name": "Option 1",
"value": ""
},
{
"name": "Option 2",
"value": 2,
"selected": true
},
{
"name": "Option 3",
"value": 3
}
],
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "select",
"data-type-variant": "select-with-relation"
}
}
],
"sort": {
"name": "Sort",
"label": "Sortera:",
"modifiers": "horizontal",
"id": "categorySelectSort",
"additionalClasses": "js-filter select__select--ghost",
"options": [
{
"name": "Senaste",
"value": "",
"selected": true
},
{
"name": "A-Z",
"value": "a-z"
},
{
"name": "Z-A",
"value": "z-a"
}
],
"attr": {
"aria-controls": "filter-documents-list",
"data-type": "select"
}
}
},
"table": {
"id": "filter-documents",
"modifiers": [
"zebra"
],
"headerRows": [
{
"cols": [
"Dokument",
"<a class=\"js-sortable-cell\" href=\"#\" id=\"article\" aria-controls=\"filter-documents-list\">Artikel</a>",
"<a class=\"js-sortable-cell\" href=\"#\" id=\"doctype\" aria-controls=\"filter-documents-list\">Dokumenttyp</a>",
"<a class=\"js-sortable-cell\" href=\"#\" id=\"date\" aria-controls=\"filter-documents-list\">Publiceringsdatum</a>",
"Ladda ner"
]
}
],
"rows": [
{
"extension": "test",
"fileName": "pdf",
"type": "Övrigt",
"cols": [
"<a class=\"js-document-tracking-link\" href=\"#\">Anvisningar för isärtagning (pdf 618.54kB)</a>",
"CASA Blues",
"Övrigt",
"2021-11-02",
"<a href=\"/mocks/document.pdf\" class=\"table__icon js-document-tracking-link\" download><svg class=\"icon\" focusable=\"false\"><use xlink:href=\"#icon-download\"></use></svg></a>"
]
},
{
"extension": "test 2",
"fileName": "pdf2",
"type": "Övrigt2",
"cols": [
"<a class=\"js-document-tracking-link\" href=\"#\">Anvisningar för montering, drift och underhåll (pdf 618.54kB)</a>",
"<a href=\"#\">CASA Blues</a>",
"Övrigt",
"2021-10-03",
"<a href=\"/mocks/document.pdf\" class=\"table__icon js-document-tracking-link\" download><svg class=\"icon\" focusable=\"false\"><use xlink:href=\"#icon-download\"></use></svg></a>"
]
},
{
"extension": "test 3",
"fileName": "pdf 3",
"type": "Övrigt 3",
"cols": [
"<a class=\"js-document-tracking-link\" href=\"#\">Anvisningar för montering, drift och underhåll, Epsilon Echos series (pdf 618.54kB)</a>",
"CASA Blues",
"Övrigt",
"2021-10-04",
"<a href=\"/mocks/document.pdf\" class=\"table__icon js-document-tracking-link\" download><svg class=\"icon\" focusable=\"false\"><use xlink:href=\"#icon-download\"></use></svg></a>"
]
},
{
"extension": "test 4",
"fileName": "pdf 4",
"type": "Övrigt 4",
"cols": [
"<a class=\"js-document-tracking-link\" href=\"#\">Apparatlåda, All Year Comfort (COMPACT) (pdf 618.54kB)</a>",
"CASA Blues",
"Övrigt",
"2021-10-04",
"<a href=\"/mocks/document.pdf\" class=\"table__icon js-document-tracking-link\" download><svg class=\"icon\" focusable=\"false\"><use xlink:href=\"#icon-download\"></use></svg></a>"
]
},
{
"extension": "test 5",
"fileName": "pdf 5",
"type": "Övrigt 5",
"cols": [
"<a href=\"#\">Bedömning, Sunda Hus (pdf 618.54kB)</a>",
"CASA Blues",
"Övrigt",
"2021-10-02",
"<a href=\"/mocks/document.pdf\" class=\"table__icon\" download><svg class=\"icon\" focusable=\"false\"><use xlink:href=\"#icon-download\"></use></svg></a>"
]
}
]
},
"loadMore": {
"tag": "button",
"label": "Ladda fler",
"href": "/mocks/api/documents.json",
"attributes": {
"aria-controls": "filter-documents-list",
"data-template-id": "document-data-tmpl"
},
"additionalClasses": "js-load-more"
}
}
import getEvent from '../../functions/getEvent';
import ShowInfo from '../show-info/ShowInfo';
import OptionsLimiter from '../options-limiter/OptionsLimiter';
import Modal from '../modal/Modal';
import { debounce } from 'lodash';
class Filters {
constructor(el) {
this.el = el;
this.filterDropdownsSelector = '.js-filter[data-type="select"]';
this.searchFieldSelector = '.js-filter[data-type="search"]';
this.filterDropdownsMultipleSelector = '.js-filter[data-type="select-multiple"]';
this.notFilterDropdownsSelector = '.js-filter:not([data-type="select"]):not([data-type="search"]):not([data-type="checkbox"])';
this.filterCheckboxSelector = '.js-filter[data-type="checkbox"]';
this.filterRangeSlider = '.js-filter[data-type="range-slider"]';
this.filters = el.querySelectorAll('.js-filter');
this.dropdownsMultiple = el.querySelectorAll(this.filterDropdownsMultipleSelector);
this.dropdownsHolder = el.querySelector('.js-dropdowns-holder');
this.sortableCells = el.querySelectorAll('.js-sortable-cell');
this.loadMoreBtn = el.querySelector('.js-load-more');
this.clearFiltersBtn = el.querySelector('.js-clear-filters');
this.searchField = el.querySelector(this.searchFieldSelector);
this.searchButton = this.searchField ? this.searchField.nextElementSibling : null;
this.updateFilters = this.updateFilters.bind(this);
this.triggerUpdate = this.triggerUpdate.bind(this);
const savedFiltersArray = sessionStorage.getItem('filters array');
const savedFiltersDictionary = sessionStorage.getItem('filters dictionary');
this.filtersArray = savedFiltersArray ? JSON.parse(savedFiltersArray) : [];
this.filtersDictionary = savedFiltersDictionary ? JSON.parse(savedFiltersDictionary) : {};
this.sortOrder = '';
this.sortBy = '';
this.init();
}
init() {
this.attachListeners(true);
}
attachListeners() {
const self = this;
if (this.clearFiltersBtn) {
this.clearFiltersBtn.addEventListener('click', (e) => {
e.preventDefault();
this.clearFilters();
});
};
this.el.addEventListener('change', function (e) {
const target = e.target;
if (target.matches
? target.matches(self.filterDropdownsSelector)
: target.msMatchesSelector(self.filterDropdownsSelector)
) {
self.updateFilter(target, true);
}
}, false);
this.el.addEventListener('change', function (e) {
const target = e.target;
const shouldUpdateFromData = target.dataset.shouldUpdateFilters;
const shouldUpdate = typeof shouldUpdateFromData !== 'undefined' ? shouldUpdateFromData === 'true' : true;
if (target.matches
? target.matches(self.filterCheckboxSelector)
: target.msMatchesSelector(self.filterCheckboxSelector)
) {
self.updateFilter(target, shouldUpdate);
}
}, false);
this.el.addEventListener('change', function (e) {
const target = e.target.closest(self.filterRangeSlider);
if (target) {
const shouldUpdateFromData = target.dataset.shouldUpdateFilters;
const shouldUpdate = typeof shouldUpdateFromData !== 'undefined' ? shouldUpdateFromData === 'true' : true;
self.updateFilter(target, shouldUpdate);
}
}, false);
this.el.addEventListener('click', function (e) {
const target = e.target;
if (target.matches
? target.matches(self.notFilterDropdownsSelector)
: target.msMatchesSelector(self.notFilterDropdownsSelector)
) {
self.updateFilter(target, true);
}
}, false);
for (let i = 0; this.dropdownsMultiple.length > i; i++) {
this.dropdownsMultiple[i].addEventListener('change', (e) => {
const target = e.target;
if (target.matches
? target.matches(this.filterDropdownsMultipleSelector)
: target.msMatchesSelector(this.filterDropdownsMultipleSelector)
) {
this.updateFilter(target, true);
}
});
}
for (let i = 0; i < this.sortableCells.length; i++) {
const cell = this.sortableCells[i];
cell.addEventListener('click', e => this.sortTable(e, cell));
}
if (this.searchField) {
this.searchField.addEventListener('input', (e) => {
const target = e.target;
this.updateFilterDebounced(target, true);
});
}
if (this.searchButton) {
this.searchButton.addEventListener('click', (e) => {
this.updateFilter(this.searchField, true);
});
}
window.addEventListener('loadMoreUpdate', (e) => {
if (e && e.data) {
const showInfoEls = this.el.querySelectorAll('.js-show-info');
// Re-initialize modals
const els = document.querySelectorAll('.modal');
for (let el of els) {
new Modal(el);
}
// Re-initialize showInfo component
for (let el of showInfoEls) {
ShowInfo(el);
}
// Re-initialize Options limiter component
const optionsLimiter = this.el.querySelectorAll('.js-options-limiter');
for (let el of optionsLimiter) {
new OptionsLimiter(el);
}
}
});
// Listener if Filter history is enabled
window.addEventListener('popstate', this.applyFiltersFromUrl.bind(this));
this.loadMoreBtn && this.loadMoreBtn.addEventListener('updateFilterDropdowns', this.updateFilters);
}
sortTable(e, cell) {
const newSortBy = cell.id;
if (newSortBy === this.sortBy) {
if (this.sortOrder === 'asc') {
this.sortOrder = 'desc';
} else {
this.sortOrder = 'asc';
}
} else {
this.sortOrder = 'asc';
}
this.sortBy = newSortBy;
this.triggerUpdateDebounced(cell.getAttribute('aria-controls'));
e.preventDefault();
}
groupFilters(filters) {
let a = [];
for (let filter of filters) {
const existingIndex = a.findIndex((obj) => obj.name === filter.name);
if (existingIndex > -1) {
a[existingIndex].value = a[existingIndex].value.concat(filter.value);
} else {
filter.value = [filter.value];
a.push(filter);
}
}
return a;
}
updateFilters(e) {
const { subcategoriesMarkup } = e.data;
if (this.dropdownsHolder) {
this.dropdownsHolder.innerHTML = subcategoriesMarkup;
}
}
triggerUpdate(ariaControls) {
const event = getEvent('filterApplied');
const data = {
ariaControls,
filtersArray: this.groupFilters(this.filtersArray),
filtersDictionary: this.filtersDictionary,
sortData: {}
};
if (this.sortBy) {
data.sortData.sortOrder = this.sortOrder;
data.sortData.sortBy = this.sortBy;
}
event['data'] = data;
if (this.loadMoreBtn) {
this.loadMoreBtn.dispatchEvent(event);
}
}
triggerUpdateDebounced = debounce(this.triggerUpdate, 100, false);
clearFilters() {
const filters = this.el.querySelectorAll('.js-filter');
let ariaControls = '';
for (let i = 0; i < filters.length; i++) {
const filter = filters[i];
const filterType = filter.getAttribute('data-type-variant') || filter.getAttribute('data-type');
switch (filterType) {
case 'switch':
filter.checked = false;
break;
case 'select-multiple': {
const checked = filter.querySelectorAll('option:checked');
[...checked].forEach(option => { option.selected = false; });
filter.value = '';
filter.dispatchEvent(new Event('change'));
break;
}
case 'select-with-relation':
filter.value = '';
break;
case 'select':
filter.value = '';
break;
case 'checkbox':
filter.checked = false;
filter.dispatchEvent(new Event('change'));
break;
case 'search':
filter.value = '';
break;
case 'range-slider':
filter.dispatchEvent(new Event('reset'));
filter.dispatchEvent(new Event('change'));
break;
default:
break;
}
ariaControls = filter.getAttribute('aria-controls');
}
this.updateFilter(null, false);
sessionStorage.removeItem('filters array');
sessionStorage.removeItem('filters dictionary');
this.triggerUpdateDebounced(ariaControls);
}
updateUrlWithQueryParams(filtersArray, filtersDictionary) {
// Generate query parameters from filtersArray and filtersDictionary
const queryParams = new URLSearchParams();
// Add matched filters for filtersArray to the URL parameters
const groupedFilters = {};
filtersArray.forEach(filter => {
if (filter.name && filter.value) {
const values = Array.isArray(filter.value) ? filter.value : [filter.value]; // Supports both array or string.
// Concat filter type name if it exists - or create new key.
if (groupedFilters[filter.name]) {
groupedFilters[filter.name] = groupedFilters[filter.name].concat(values);
} else {
groupedFilters[filter.name] = values;
}
}
});
// Add matched filters for filtersDictionary to the URL parameters
for (const [key, value] of Object.entries(filtersDictionary)) {
if (value) {
queryParams.append(key, value);
}
}
// Add filters to queryParams
for (const [key, values] of Object.entries(groupedFilters)) {
queryParams.append(key, values.join('|'));
}
const newUrl = `${window.location.pathname}?${queryParams.toString()}`;
// Update URL with new queryparams
window.history.pushState(null, '', newUrl);
}
applyFiltersFromUrl() {
const urlParams = new URLSearchParams(window.location.search);
// Update filters state from URL and queryparams.
this.el.querySelectorAll('.js-filter').forEach(filter => {
const filterName = filter.getAttribute('name');
const filterType = filter.getAttribute('data-type-variant') || filter.getAttribute('data-type');
const paramValue = urlParams.get(filterName);
if (paramValue) {
switch (filterType) {
case 'checkbox':
filter.checked = paramValue.split('|').includes(filter.value);
break;
case 'select-multiple':
[...filter.options].forEach(option => {
const value = option.value;
const selectedValues = paramValue.split('|');
const dropdownOption = option.parentNode.parentNode.querySelector('.select-multiple__options a[data-value="' + value + '"]');
const button = option.parentNode.parentNode.querySelector('.select-multiple__wrapper a[data-value="' + value + '"]');
option.selected = selectedValues.includes(option.value);
if (dropdownOption) {
selectedValues.includes(option.value)
? dropdownOption.setAttribute('data-checked', true)
: dropdownOption.removeAttribute('data-checked');
}
if (button) {
button.style.display = selectedValues.includes(option.value) ? 'block' : 'none';
}
});
break;
case 'select':
case 'search':
filter.value = paramValue;
break;
default:
break;
}
this.updateFilter(filter, false);
} else {
// Reset filters if no match with queryParams.
if (filter.type === 'checkbox') {
filter.checked = false;
} else {
filter.value = '';
}
this.updateFilter(filter, false);
}
});
// Update filter result
this.triggerUpdateDebounced(this.el.getAttribute('aria-controls'));
}
updateFilter(filter, shouldUpdate) {
this.filtersArray = [];
this.filtersDictionary = {};
const filters = this.el.querySelectorAll('.js-filter');
const dropdownFilters = this.el.querySelectorAll('.js-filter[data-type="select"]');
const changedDropdownIndex = Array.prototype.indexOf.call(dropdownFilters, filter);
const isFilterHistoryEnabled = filter && filter.getAttribute('data-enable-history') === 'true';
let currentDropdownIndex = 0;
for (let i = 0; i < filters.length; i++) {
const filter = filters[i];
const filterType = filter.getAttribute('data-type-variant') || filter.getAttribute('data-type');
switch (filterType) {
case 'switch':
this.filtersDictionary[filter.value] = filter.checked;
break;
case 'select-multiple': {
const checked = filter.querySelectorAll('option:checked');
const checkedValues = [...checked].map(option => option.value);
if (checkedValues.length) {
this.filtersDictionary[filter.name] = checkedValues.join('|');
}
break;
}
case 'select-with-relation':
if (currentDropdownIndex > changedDropdownIndex && changedDropdownIndex > -1) {
break;
}
this.filtersDictionary[filter.name] = filter.value;
currentDropdownIndex++;
break;
case 'select':
this.filtersDictionary[filter.name] = filter.value;
break;
case 'checkbox':
let newFilters = [];
if (filter.checked) {
newFilters = [...this.filtersArray, { 'name': filter.name, 'value': filter.value }];
} else {
newFilters = this.filtersArray.filter(item => item !== filter.value);
}
this.filtersArray = newFilters;
break;
case 'search':
this.filtersDictionary[filter.name] = filter.value;
break;
case 'range-slider':
const input = filter.querySelector('.input');
const paramName = filter && filter.querySelector('input:checked') && filter.querySelector('input:checked').value;
if (input.getAttribute('isDirty') === 'false') {
break;
}
let value = input.dataset.realValue;
this.filtersDictionary[paramName] = value;
break;
default:
break;
}
}
if (shouldUpdate) {
sessionStorage.setItem('filters array', JSON.stringify(this.filtersArray));
sessionStorage.setItem('filters dictionary', JSON.stringify(this.filtersDictionary));
// Update URL with query params.
if (isFilterHistoryEnabled) {
this.updateUrlWithQueryParams(this.filtersArray, this.filtersDictionary);
}
this.triggerUpdateDebounced(filter.getAttribute('aria-controls'));
}
}
updateFilterDebounced = debounce(this.updateFilter, 500, false);
}
export default Filters;
.filters {
th, td {
&:last-child {
text-align: center;
}
@include breakpoint-down($l) {
min-width: 0;
&:first-child {
min-width: size(25);
}
}
}
}
.js-clear-filters {
color: $color-black;
}
import Filters from './Filters';
const els = document.querySelectorAll('.js-filters');
for (let el of els) {
new Filters(el);
}
No notes defined.