altinn-designsystem
Version:
Altinn Design system based on Pattern Lab.
400 lines (338 loc) • 12.9 kB
JavaScript
/* 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'
});
}
}
};