@ng-bootstrap/ng-bootstrap
Version:
Angular powered Bootstrap
76 lines • 11.3 kB
JavaScript
import { isString } from '../util/util';
export function toFragmentElement(container, id) {
if (!container || id == null) {
return null;
}
return isString(id) ? container.querySelector(`#${CSS.escape(id)}`) : id;
}
function getOrderedFragments(container, fragments) {
const selector = [...fragments].map(({ id }) => `#${CSS.escape(id)}`).join(',');
return Array.from(container.querySelectorAll(selector));
}
export const defaultProcessChanges = (state, changeActive, ctx) => {
const { rootElement, fragments, scrollSpy, options, entries } = state;
const orderedFragments = getOrderedFragments(rootElement, fragments);
if (!ctx.initialized) {
ctx.initialized = true;
ctx.gapFragment = null;
ctx.visibleFragments = new Set();
// special case when one of the fragments was pre-selected
const preSelectedFragment = toFragmentElement(rootElement, options?.initialFragment);
if (preSelectedFragment) {
scrollSpy.scrollTo(preSelectedFragment);
return;
}
}
for (const entry of entries) {
const { isIntersecting, target: fragment } = entry;
// 1. an entry became visible
if (isIntersecting) {
// if we were in-between two elements, we have to clear it up
if (ctx.gapFragment) {
ctx.visibleFragments.delete(ctx.gapFragment);
ctx.gapFragment = null;
}
ctx.visibleFragments.add(fragment);
}
// 2. an entry became invisible
else {
ctx.visibleFragments.delete(fragment);
// nothing is visible anymore, but something just was actually
if (ctx.visibleFragments.size === 0 && scrollSpy.active !== '') {
// 2.1 scrolling down - keeping the same element
if (entry.boundingClientRect.top < entry.rootBounds.top) {
ctx.gapFragment = fragment;
ctx.visibleFragments.add(ctx.gapFragment);
}
// 2.2 scrolling up - getting the previous element
else {
// scrolling up and no more fragments above
if (fragment === orderedFragments[0]) {
ctx.gapFragment = null;
ctx.visibleFragments.clear();
changeActive('');
return;
}
// getting previous fragment
else {
const fragmentIndex = orderedFragments.indexOf(fragment);
ctx.gapFragment = orderedFragments[fragmentIndex - 1] || null;
if (ctx.gapFragment) {
ctx.visibleFragments.add(ctx.gapFragment);
}
}
}
}
}
}
// getting the first visible element in the DOM order of the fragments
for (const fragment of orderedFragments) {
if (ctx.visibleFragments.has(fragment)) {
changeActive(fragment.id);
break;
}
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsc3B5LnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Njcm9sbHNweS9zY3JvbGxzcHkudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLFVBQVUsaUJBQWlCLENBQUMsU0FBeUIsRUFBRSxFQUFnQztJQUM1RixJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7UUFDN0IsT0FBTyxJQUFJLENBQUM7S0FDWjtJQUNELE9BQU8sUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMxRSxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxTQUFrQixFQUFFLFNBQXVCO0lBQ3ZFLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUErQixDQUNoRSxLQU1DLEVBQ0QsWUFBc0MsRUFDdEMsR0FJQyxFQUNBLEVBQUU7SUFDSCxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQztJQUN0RSxNQUFNLGdC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bnMsIE5nYlNjcm9sbFNweVByb2Nlc3NDaGFuZ2VzLCBOZ2JTY3JvbGxTcHlTZXJ2aWNlIH0gZnJvbSAnLi9zY3JvbGxzcHkuc2VydmljZSc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0ZyYWdtZW50RWxlbWVudChjb250YWluZXI6IEVsZW1lbnQgfCBudWxsLCBpZD86IHN0cmluZyB8IEhUTUxFbGVtZW50IHwgbnVsbCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG5cdGlmICghY29udGFpbmVyIHx8IGlkID09IG51bGwpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXHRyZXR1cm4gaXNTdHJpbmcoaWQpID8gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYCMke0NTUy5lc2NhcGUoaWQpfWApIDogaWQ7XG59XG5cbmZ1bmN0aW9uIGdldE9yZGVyZWRGcmFnbWVudHMoY29udGFpbmVyOiBFbGVtZW50LCBmcmFnbWVudHM6IFNldDxFbGVtZW50Pik6IEVsZW1lbnRbXSB7XG5cdGNvbnN0IHNlbGVjdG9yID0gWy4uLmZyYWdtZW50c10ubWFwKCh7IGlkIH0pID0+IGAjJHtDU1MuZXNjYXBlKGlkKX1gKS5qb2luKCcsJyk7XG5cdHJldHVybiBBcnJheS5mcm9tKGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0UHJvY2Vzc0NoYW5nZXM6IE5nYlNjcm9sbFNweVByb2Nlc3NDaGFuZ2VzID0gKFxuXHRzdGF0ZToge1xuXHRcdGVudHJpZXM6IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlbXTtcblx0XHRyb290RWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cdFx0ZnJhZ21lbnRzOiBTZXQ8RWxlbWVudD47XG5cdFx0c2Nyb2xsU3B5OiBOZ2JTY3JvbGxTcHlTZXJ2aWNlO1xuXHRcdG9wdGlvbnM6IE5nYlNjcm9sbFNweU9wdGlvbnM7XG5cdH0sXG5cdGNoYW5nZUFjdGl2ZTogKGFjdGl2ZTogc3RyaW5nKSA9PiB2b2lkLFxuXHRjdHg6IHtcblx0XHRpbml0aWFsaXplZDogYm9vbGVhbjtcblx0XHRnYXBGcmFnbWVudDogRWxlbWVudCB8IG51bGw7XG5cdFx0dmlzaWJsZUZyYWdtZW50czogU2V0PEVsZW1lbnQ+O1xuXHR9LFxuKSA9PiB7XG5cdGNvbnN0IHsgcm9vdEVsZW1lbnQsIGZyYWdtZW50cywgc2Nyb2xsU3B5LCBvcHRpb25zLCBlbnRyaWVzIH0gPSBzdGF0ZTtcblx0Y29uc3Qgb3JkZXJlZEZyYWdtZW50cyA9IGdldE9yZGVyZWRGcmFnbWVudHMocm9vdEVsZW1lbnQsIGZyYWdtZW50cyk7XG5cblx0aWYgKCFjdHguaW5pdGlhbGl6ZWQpIHtcblx0XHRjdHguaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdGN0eC5nYXBGcmFnbWVudCA9IG51bGw7XG5cdFx0Y3R4LnZpc2libGVGcmFnbWVudHMgPSBuZXcgU2V0PEVsZW1lbnQ+KCk7XG5cblx0XHQvLyBzcGVjaWFsIGNhc2Ugd2hlbiBvbmUgb2YgdGhlIGZyYWdtZW50cyB3YXMgcHJlLXNlbGVjdGVkXG5cdFx0Y29uc3QgcHJlU2VsZWN0ZWRGcmFnbWVudCA9IHRvRnJhZ21lbnRFbGVtZW50KHJvb3RFbGVtZW50LCBvcHRpb25zPy5pbml0aWFsRnJhZ21lbnQpO1xuXHRcdGlmIChwcmVTZWxlY3RlZEZyYWdtZW50KSB7XG5cdFx0XHRzY3JvbGxTcHkuc2Nyb2xsVG8ocHJlU2VsZWN0ZWRGcmFnbWVudCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHR9XG5cblx0Zm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG5cdFx0Y29uc3QgeyBpc0ludGVyc2VjdGluZywgdGFyZ2V0OiBmcmFnbWVudCB9ID0gZW50cnk7XG5cblx0XHQvLyAxLiBhbiBlbnRyeSBiZWNhbWUgdmlzaWJsZVxuXHRcdGlmIChpc0ludGVyc2VjdGluZykge1xuXHRcdFx0Ly8gaWYgd2Ugd2VyZSBpbi1iZXR3ZWVuIHR3byBlbGVtZW50cywgd2UgaGF2ZSB0byBjbGVhciBpdCB1cFxuXHRcdFx0aWYgKGN0eC5nYXBGcmFnbWVudCkge1xuXHRcdFx0XHRjdHgudmlzaWJsZUZyYWdtZW50cy5kZWxldGUoY3R4LmdhcEZyYWdtZW50KTtcblx0XHRcdFx0Y3R4LmdhcEZyYWdtZW50ID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Y3R4LnZpc2libGVGcmFnbWVudHMuYWRkKGZyYWdtZW50KTtcblx0XHR9XG5cblx0XHQvLyAyLiBhbiBlbnRyeSBiZWNhbWUgaW52aXNpYmxlXG5cdFx0ZWxzZSB7XG5cdFx0XHRjdHgudmlzaWJsZUZyYWdtZW50cy5kZWxldGUoZnJhZ21lbnQpO1xuXG5cdFx0XHQvLyBub3RoaW5nIGlzIHZpc2libGUgYW55bW9yZSwgYnV0IHNvbWV0aGluZyBqdXN0IHdhcyBhY3R1YWxseVxuXHRcdFx0aWYgKGN0eC52aXNpYmxlRnJhZ21lbnRzLnNpemUgPT09IDAgJiYgc2Nyb2xsU3B5LmFjdGl2ZSAhPT0gJycpIHtcblx0XHRcdFx0Ly8gMi4xIHNjcm9sbGluZyBkb3duIC0ga2VlcGluZyB0aGUgc2FtZSBlbGVtZW50XG5cdFx0XHRcdGlmIChlbnRyeS5ib3VuZGluZ0NsaWVudFJlY3QudG9wIDwgZW50cnkucm9vdEJvdW5kcyEudG9wKSB7XG5cdFx0XHRcdFx0Y3R4LmdhcEZyYWdtZW50ID0gZnJhZ21lbnQ7XG5cdFx0XHRcdFx0Y3R4LnZpc2libGVGcmFnbWVudHMuYWRkKGN0eC5nYXBGcmFnbWVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gMi4yIHNjcm9sbGluZyB1cCAtIGdldHRpbmcgdGhlIHByZXZpb3VzIGVsZW1lbnRcblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Ly8gc2Nyb2xsaW5nIHVwIGFuZCBubyBtb3JlIGZyYWdtZW50cyBhYm92ZVxuXHRcdFx0XHRcdGlmIChmcmFnbWVudCA9PT0gb3JkZXJlZEZyYWdtZW50c1swXSkge1xuXHRcdFx0XHRcdFx0Y3R4LmdhcEZyYWdtZW50ID0gbnVsbDtcblx0XHRcdFx0XHRcdGN0eC52aXNpYmxlRnJhZ21lbnRzLmNsZWFyKCk7XG5cdFx0XHRcdFx0XHRjaGFuZ2VBY3RpdmUoJycpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIGdldHRpbmcgcHJldmlvdXMgZnJhZ21lbnRcblx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IGZyYWdtZW50SW5kZXggPSBvcmRlcmVkRnJhZ21lbnRzLmluZGV4T2YoZnJhZ21lbnQpO1xuXHRcdFx0XHRcdFx0Y3R4LmdhcEZyYWdtZW50ID0gb3JkZXJlZEZyYWdtZW50c1tmcmFnbWVudEluZGV4IC0gMV0gfHwgbnVsbDtcblx0XHRcdFx0XHRcdGlmIChjdHguZ2FwRnJhZ21lbnQpIHtcblx0XHRcdFx0XHRcdFx0Y3R4LnZpc2libGVGcmFnbWVudHMuYWRkKGN0eC5nYXBGcmFnbWVudCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gZ2V0dGluZyB0aGUgZmlyc3QgdmlzaWJsZSBlbGVtZW50IGluIHRoZSBET00gb3JkZXIgb2YgdGhlIGZyYWdtZW50c1xuXHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIG9yZGVyZWRGcmFnbWVudHMpIHtcblx0XHRpZiAoY3R4LnZpc2libGVGcmFnbWVudHMuaGFzKGZyYWdtZW50KSkge1xuXHRcdFx0Y2hhbmdlQWN0aXZlKGZyYWdtZW50LmlkKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxufTtcbiJdfQ==