altinn-designsystem
Version:
Altinn Design system based on Pattern Lab.
634 lines (555 loc) • 21.1 kB
JavaScript
/* globals $ */
var handleFocus = function() {
// If state on input is 'focus', add class to a-input: 'a-input-focus'
$('body').on('focus', 'input.form-control', function() {
$(this).parent().addClass('a-input-focus');
});
$('body').on('blur', 'input.form-control', function() {
$(this).parent().removeClass('a-input-focus');
});
$('.a-radioButtons-stackedList').find('input[type=radio]').change(function() {
var me = $(this);
if (me.is(':checked')) {
me.parent().addClass('a-js-radioParentGray');
$('input[type=radio]').each(function() {
if ($(this).attr('id') !== me.attr('id') &&
$(this).attr('name') === me.attr('name')) {
$(this).parent().removeClass('a-js-radioParentGray');
}
});
}
});
};
/* globals AltinnLoader:true */
AltinnLoader = {
addLoader: function($target) {
if ($target.find('.loader-container').length === 0) {
$target.prepend('<div class="loader-container"><div class="loader loader-ellipsis"></div></div>');
}
$('button.a-modal-back').attr('disabled', true);
$('button.a-modal-close').attr('disabled', true);
},
removeLoader: function($target) {
$target.find('.loader-container').remove();
$('button.a-modal-back').attr('disabled', false);
$('button.a-modal-close').attr('disabled', false);
}
};
/* globals currentRequest, popoverLocalInit, AltinnModal */
/* globals AltinnModal:true, AltinnLoader */
AltinnModal = {
closeModal: function(settings) {
$('body').removeClass('a-modal-background-error a-displayNav');
$('body').removeClass('a-modal-background-success');
$(settings.target).modal('hide');
$('body').append($('.a-stickyHelp-container'));
},
loadModal: function(settings) {
var currentRequest = $.ajax({
url: settings.url,
beforeSend: function() {
if (typeof currentRequest !== 'undefined') {
currentRequest.abort();
}
AltinnLoader.addLoader($('body'));
},
data: settings.data
}).always(function() {
}).done(function(data) {
var modalPage = $('<div/>', {
class: 'modalPage',
html: data
});
var page = $('<div/>', {
class: 'a-page a-current-page',
data: {
pageIndex: 1,
isSuccess: settings.isSuccess,
isError: settings.isError,
showModalNav: settings.showModalNav
},
html: modalPage
});
$('body').removeClass('a-modal-background-error a-displayNav');
$('body').removeClass('a-modal-background-success');
// if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) {
// goToModalHeader();
// }
$(settings.target + ' .a-modal-content-target').append(page);
$(settings.target).find('.a-current-page').first().data().enableDirtyPopover = settings.enableDirtyPopover;
// Initialize with backdrop: static to prevent modal from closing when clicking outside,
// and keyboard: false to prevent ESC from closing the modal
$(settings.target).modal({
backdrop: 'static',
keyboard: false
});
$(settings.target).on('hidden.bs.modal', function() {
$(settings.target + ' .a-modal-content-target').empty();
$(settings.target).attr('aria-hidden', true);
$('#altinnModal').siblings('.row').removeClass('d-none');
});
$(settings.target).on('shown.bs.modal', function() {
$(settings.target).removeAttr('aria-hidden');
$('#altinnModal').siblings('.row').addClass('d-none');
});
popoverLocalInit();
if (settings.isError) {
$('body').addClass('a-modal-background-error');
if (settings.showModalNav) {
$('body').addClass('a-displayNav');
}
} else if (settings.isSuccess) {
$('body').addClass('a-modal-background-success');
}
AltinnLoader.removeLoader($('body'));
// causes issues in IE11 (blinking quickhelp when modal is open)
// $(settings.target).on('transitionend', function() {
// $(settings.target).append($('.a-stickyHelp-container'));
// });
});
},
nextModalPageWithContent: function(settings) {
var current;
var modalPage = $('<div/>', {
class: 'modalPage',
html: settings.content
});
var existingPages;
var newPage;
var newPageIndex;
existingPages = $(settings.target + ' :data(page-index)');
if (settings.clearHistory) {
newPageIndex = 1;
} else {
newPageIndex = existingPages.length + 1;
}
if (settings.clearHistory) {
$(settings.target + ' :data(page-index)').not('.a-current-page').remove();
}
newPage = $('<div/>', {
class: 'a-page a-next-page',
data: {
pageIndex: newPageIndex,
isSuccess: settings.isSuccess,
isError: settings.isError,
showModalNav: settings.showModalNav
},
html: modalPage
});
// if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) {
// goToModalHeader();
// }
$(settings.target + ' .a-modal-content-target').append(newPage);
$(settings.target).animate({
scrollTop: 0
}, 20);
current = $(settings.target + ' .a-current-page');
setTimeout(function() {
$('body').removeClass('a-modal-background-error a-displayNav');
$('body').removeClass('a-modal-background-success');
current.removeClass('a-current-page').addClass('a-previous-page');
newPage.removeClass('a-next-page').addClass('a-current-page');
$(newPage).data().enableDirtyPopover = settings.enableDirtyPopover;
if (settings.isError) {
$('body').addClass('a-modal-background-error');
if (settings.showModalNav) {
$('body').addClass('a-displayNav');
}
} else if (settings.isSuccess) {
$('body').addClass('a-modal-background-success');
}
}, 0);
current.on('transitionend', function() {
if (settings.clearHistory) {
$(settings.target + ' :data(page-index)').not('.a-current-page').remove();
} else {
current.hide().off();
}
});
popoverLocalInit();
},
nextModalPage: function(settings) {
var currentRequest = $.ajax({
url: settings.url,
beforeSend: function() {
if (typeof currentRequest !== 'undefined') {
currentRequest.abort();
}
AltinnLoader.addLoader($(settings.target).find('.a-current-page .a-modal-body'));
},
data: settings.data
}).always(function() {
}).done(function(data) {
var current;
var modalPage = $('<div/>', {
class: 'modalPage',
html: data
});
var existingPages;
var newPage;
var newPageIndex;
existingPages = $(settings.target + ' :data(page-index)');
if (settings.clearHistory) {
newPageIndex = 1;
} else {
newPageIndex = existingPages.length + 1;
}
if (settings.clearHistory) {
$(settings.target + ' :data(page-index)').not('.a-current-page').remove();
}
newPage = $('<div/>', {
class: 'a-page a-next-page',
data: {
pageIndex: newPageIndex,
isSuccess: settings.isSuccess,
isError: settings.isError,
showModalNav: settings.showModalNav
},
html: modalPage
});
// if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) {
// goToModalHeader();
// }
$(settings.target + ' .a-modal-content-target').append(newPage);
$(settings.target).animate({
scrollTop: 0
}, 20);
current = $(settings.target + ' .a-current-page');
setTimeout(function() {
$('body').removeClass('a-modal-background-error a-displayNav');
$('body').removeClass('a-modal-background-success');
current.removeClass('a-current-page').addClass('a-previous-page');
newPage.removeClass('a-next-page').addClass('a-current-page');
$(newPage).data().enableDirtyPopover = settings.enableDirtyPopover;
if (settings.isError) {
$('body').addClass('a-modal-background-error');
if (settings.showModalNav) {
$('body').addClass('a-displayNav');
}
} else if (settings.isSuccess) {
$('body').addClass('a-modal-background-success');
}
}, 0);
current.on('transitionend', function() {
if (settings.clearHistory) {
$(settings.target + ' :data(page-index)').not('.a-current-page').remove();
} else {
current.hide().off();
}
AltinnLoader.removeLoader(current.find('.a-modal-body'));
});
popoverLocalInit();
});
},
previousModalPage: function(settings) {
var current;
var allPages;
var previous;
var pagesToPop;
var isError;
var showModalNav;
var isSuccess;
if (!settings.pagesToPop) {
pagesToPop = 1;
} else {
pagesToPop = settings.pagesToPop;
}
if ($(settings.target + ' .a-current-page').data('page-index') - pagesToPop <= 0) {
$(settings.target).one('hidden.bs.modal', function() {
$('body').removeClass('a-modal-background-error a-displayNav');
$('body').removeClass('a-modal-background-success');
});
$(settings.target).modal('hide');
return;
}
current = $(settings.target + ' .a-current-page');
allPages = $(settings.target + ' :data(page-index)');
previous = allPages.filter(function() {
return $(this).data('page-index') === allPages.length - 1;
});
previous.show();
isError = $(previous).data().isError;
showModalNav = $(previous).data().showModalNav;
isSuccess = $(previous).data().isSuccess;
current.addClass('a-next-page');
current.removeClass('a-current-page');
// if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) {
// goToModalHeader();
// }
setTimeout(function() {
$('body').removeClass('a-modal-background-error a-displayNav');
$('body').removeClass('a-modal-background-success');
previous.addClass('a-current-page').removeClass('a-previous-page');
if (isError) {
$('body').addClass('a-modal-background-error');
if (showModalNav) {
$('body').addClass('a-displayNav');
}
} else if (isSuccess) {
$('body').addClass('a-modal-background-success');
}
}, 0);
current.on('transitionend', function() {
var previousPages = allPages.filter(function() {
return $(this).data('page-index') > allPages.length - pagesToPop;
});
previousPages.remove();
});
},
setCurrentPageIsDirty: function(target, state) {
$(target).find('.a-current-page').first().data().isDirty = state;
},
init: function() {
var that = this;
$('body').on('click', '[data-toggle="altinn-modal"]', function() {
var $source = $(this);
if ($source.data().action === 'load') {
that.loadModal({
url: $source.data().url,
target: $source.data().target,
enableDirtyPopover: $source.data().enableDirtyPopover
});
} else if ($source.data().action === 'next') {
that.nextModalPage({ url: $source.data().url,
target: $source.data().target,
isSuccess: $source.data().isSuccess,
isError: $source.data().isError,
showModalNav: $source.data().showModalNav,
clearHistory: $source.data().clearHistory,
enableDirtyPopover: $source.data().enableDirtyPopover });
} else if ($source.data().action === 'back') {
that.previousModalPage({
target: $source.data().target,
pagesToPop: $source.data().pages
});
} else if ($source.data().action === 'close') {
that.closeModal({ target: $source.data().target });
}
});
$('body').on('click', '.a-modal-back', function() {
var $modal = $(this).closest('.a-modal');
if ($modal.find('.a-current-page').first().data().enableDirtyPopover
&& $modal.find('.a-current-page').first().data().isDirty) {
$(this).popover('show');
} else {
that.previousModalPage({ target: '#' + $modal[0].id });
}
});
$('body').on('click', '.a-modal-close', function() {
var $modal = $(this).closest('.a-modal');
if ($modal.find('.a-current-page').first().data().enableDirtyPopover
&& $modal.find('.a-current-page').first().data().isDirty) {
$(this).popover('show');
} else {
that.closeModal({ target: '#' + $modal[0].id });
}
});
$('body').on('click', '.a-js-modal-dirtyBackBtn', function() {
AltinnModal.previousModalPage({ target: '#' + $(this).closest('.a-modal')[0].id });
$('button[aria-describedby=' + $(this).parent().parent().attr('id') + ']').popover('hide');
});
$('body').on('click', '.a-js-modal-dirtyCancelBtn', function() {
$('button[aria-describedby=' + $(this).parent().parent().attr('id') + ']').popover('hide');
});
$('body').on('click', '.a-js-modal-dirtyCloseBtn', function() {
AltinnModal.closeModal({ target: '#' + $(this).closest('.a-modal')[0].id });
$('button[aria-describedby=' + $(this).parent().parent().attr('id') + ']').popover('hide');
});
function urlQuery(query) { // Parse current URL for query value
var _query = query.replace(/[[]/, '[').replace(/[\]]/, '\\]');
var expr = '[\\?&]' + _query + '=([^&#]*)';
var regex = new RegExp(expr);
var results = regex.exec(window.location.href);
if (results !== null) {
return results[1];
}
return false;
}
if (urlQuery('form') === '1') {
AltinnModal.loadModal({
url: '/hjelp/kontaktskjema-for-hjelp/',
target: '#modal'
});
}
}
};
/* globals currentRequest, AltinnQuickhelp */
/* globals AltinnQuickhelp:true */
AltinnQuickhelp = {
listeners: function(target) {
var that = this;
$('.a-stickyHelp-search').find('input').on('keyup', function(e) {
var keyCode = e.keyCode || e.which;
if (keyCode === 13 && encodeURIComponent($(this)[0].value).length > 0) {
that.nextquickhelpPage({
url: $('#a-stickyHelp').attr('data-api') +
encodeURIComponent($(this)[0].value) + '/' + $('html').attr('lang'),
target: target
});
}
});
$('.a-stickyHelp-search').find('button').on('click', function(e) {
if (encodeURIComponent($('.a-js-stickyhelpSearch')[0].value).length > 0) {
that.nextquickhelpPage({
url: $('#a-stickyHelp').attr('data-api') +
encodeURIComponent($('.a-js-stickyhelpSearch')[0].value) + '/' +
$('html').attr('lang'),
target: target
});
}
});
},
nextquickhelpPage: function(settings) {
var currentRequest = $.ajax({
url: settings.url,
beforeSend: function() {
if (typeof currentRequest !== 'undefined') {
currentRequest.abort();
}
}
}).done(function(data) {
var quickhelpPage = $('<div/>', { class: 'quickhelpPage', html: data });
var current; var existingPages; var newPage; var newPageIndex;
existingPages = $(settings.target + ' :data(page-index)');
newPageIndex = existingPages.length + 1;
newPage = $('<div/>', {
class: 'a-page a-next-page',
data: { 'page-index': newPageIndex },
html: quickhelpPage
});
$(settings.target + ' .a-stickyHelp-content-target').append(newPage);
$(settings.target).animate({ scrollTop: 0 }, 20);
current = $(settings.target + ' .a-current-page');
setTimeout(function() {
current.removeClass('a-current-page').addClass('a-previous-page');
newPage.removeClass('a-next-page').addClass('a-current-page');
$(newPage).data();
}, 0);
current.on('transitionend', function() {
if (settings.clearHistory) {
$(settings.target + ' :data(page-index)').not('.a-current-page')
.remove();
} else {
current.off();
}
});
$('#a-js-stickyHelp-back').addClass('d-block');
});
},
previousquickhelpPage: function(settings) {
var current; var allPages; var previous; var pagesToPop;
if (!settings.pagesToPop) {
pagesToPop = 1;
} else {
pagesToPop = settings.pagesToPop;
}
current = $(settings.target + ' .a-current-page');
allPages = $(settings.target + ' :data(page-index)');
previous = allPages.filter(function() {
return $(this).data('page-index') === allPages.length - 1;
});
previous.addClass('a-current-page').removeClass('a-next-page');
current.removeClass('a-current-page').addClass('a-next-page');
setTimeout(function() {
previous.addClass('a-current-page').removeClass('a-previous-page');
}, 0);
current.on('transitionend', function() {
var previousPages = allPages.filter(function() {
return $(this).data('page-index') > allPages.length - pagesToPop;
});
previousPages.remove();
});
if (allPages.length === 2) {
$('#a-js-stickyHelp-back').removeClass('d-block');
}
},
init: function() {
var that = this; that.listeners('#a-stickyHelp');
$('body').on('click', '[data-toggle="quickhelp"]', function() {
var $source = $(this);
if ($source.data().action === 'next') {
that.nextquickhelpPage({
url: $source.data().url, target: $source.data().target
});
} else if ($source.data().action === 'back') {
that.previousquickhelpPage({
target: $source.data().target, pagesToPop: $source.data().pages
});
}
});
$('.a-current-page').data({ 'page-index': 1 });
$('.a-js-stickyHelpCategory')
.html($('#a-stickyHelp').find('.a-stickyHelp-content-target')
.attr('data-category')
);
$('.a-js-stickyHelpCategoryLink').attr('data-url', $('#a-stickyHelp')
.find('.a-stickyHelp-content-target').attr('data-url')
);
$('body').on('click', '.a-stickyHelp-open', function() {
if (!$('.a-js-stickyHelpFrame').attr('src')) {
$('.a-js-stickyHelpFrame')
.attr('src', $('.a-js-stickyHelpFrame').attr('data-src'));
}
});
if ($('.quickhelpPage').find('.a-text').length !== 0) {
$('.quickhelpPage').parent('.a-page').addClass('a-page-hasArticleInside');
}
}
};
/* globals enableIOS11Fix, disableIOS11Fix, iOS11BugWorkAround */
var enableIOS11Fix = function() {
// We disable scrolling by hiding everything not in view
document.body.style.overflow = 'hidden';
document.body.style.position = 'fixed';
// It seems we don't need to set these, but I'm leaving there here for now
// Should be reversed in the disableIOS11Fix function if we enable them
// document.body.style.height = '100%';
// document.body.style.width = '100%';
};
var disableIOS11Fix = function() {
document.body.style.overflow = 'auto';
document.body.style.position = 'static';
};
var isAffectedPlatform = function() {
// Needs to be updated if new versions are affected
var ua = navigator.userAgent;
var iOS = /iPad|iPhone|iPod/.test(ua);
var iOS11 = /OS 11_/.test(ua);
return (iOS && iOS11);
};
var iOS11BugWorkAround = function() {
// Detect iOS 11_x affected by cursor position bug
// Bug report: https://bugs.webkit.org/show_bug.cgi?id=176896
if (isAffectedPlatform()) {
// This should run in the parent page only, not in the modal
if ($('body.a-stickyHelp-body').length === 0) {
// We enable the fix only when the help button is clicked/tapped
$('.a-stickyHelp-open').on('click', function() {
enableIOS11Fix();
});
}
// This should be running inside the iframe
$('.a-stickyHelp-close').on('click', function() {
// When the close button in the sticky help window is clicked/tapped
// we disable the fix, otherwise the page will not scroll
window.parent.disableIOS11Fix();
});
}
};
/*
globals
AltinnModal,
AltinnQuickhelp,
handleFocus,
iOS11BugWorkAround,
window,
*/
window.infoportalInit = function() {
AltinnModal.init();
AltinnQuickhelp.init();
handleFocus();
iOS11BugWorkAround();
};
window.infoportalInit();
// $(document).foundation();
//# sourceMappingURL=maps/quickhelp.js.map