jb-infinite-scroll 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -20
- package/dist/jb-infinite-scroll.cjs.js +1 -1
- package/dist/jb-infinite-scroll.cjs.js.br +0 -0
- package/dist/jb-infinite-scroll.cjs.js.gz +0 -0
- package/dist/jb-infinite-scroll.cjs.js.map +1 -1
- package/dist/jb-infinite-scroll.js +1 -1
- package/dist/jb-infinite-scroll.js.br +0 -0
- package/dist/jb-infinite-scroll.js.gz +0 -0
- package/dist/jb-infinite-scroll.js.map +1 -1
- package/dist/jb-infinite-scroll.umd.js +1 -1
- package/dist/jb-infinite-scroll.umd.js.br +0 -0
- package/dist/jb-infinite-scroll.umd.js.gz +0 -0
- package/dist/jb-infinite-scroll.umd.js.map +1 -1
- package/dist/web-component/jb-infinite-scroll/lib/jb-infinite-scroll.d.ts +1 -13
- package/lib/jb-infinite-scroll.html +10 -12
- package/lib/jb-infinite-scroll.scss +35 -20
- package/lib/jb-infinite-scroll.ts +212 -202
- package/package.json +1 -1
- package/react/README.md +11 -8
- package/react/dist/JBInfiniteScroll.cjs.js +10 -17
- package/react/dist/JBInfiniteScroll.cjs.js.map +1 -1
- package/react/dist/JBInfiniteScroll.js +11 -18
- package/react/dist/JBInfiniteScroll.js.map +1 -1
- package/react/dist/JBInfiniteScroll.umd.js +10 -17
- package/react/dist/JBInfiniteScroll.umd.js.map +1 -1
- package/react/lib/JBInfiniteScroll.tsx +16 -20
package/README.md
CHANGED
|
@@ -23,15 +23,13 @@ Infinite scroll web-component with additional features including:
|
|
|
23
23
|
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
##
|
|
26
|
+
## show content
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
you can show your content by placing any element with slot attribute `slot="infinite-scroll-content"` like the example below:
|
|
28
|
+
you can show your content by placing any element with slot attribute `slot="content"` like the example below:
|
|
31
29
|
|
|
32
30
|
```html
|
|
33
31
|
<jb-infinite-scroll>
|
|
34
|
-
<div slot="
|
|
32
|
+
<div slot="content">
|
|
35
33
|
<div>item 1</div>
|
|
36
34
|
<div>item 2</div>
|
|
37
35
|
<div>item 3</div>
|
|
@@ -39,7 +37,8 @@ you can show your content by placing any element with slot attribute `slot="infi
|
|
|
39
37
|
</jb-infinite-scroll>
|
|
40
38
|
|
|
41
39
|
```
|
|
42
|
-
|
|
40
|
+
|
|
41
|
+
## add scroll callback
|
|
43
42
|
|
|
44
43
|
you can add your onscroll callback function to `scrollEnd` event listener.
|
|
45
44
|
|
|
@@ -53,7 +52,7 @@ if `is-loading` ,`is-list-empty` ,`is-list-ended` or `disable-capture-scroll` is
|
|
|
53
52
|
})
|
|
54
53
|
```
|
|
55
54
|
|
|
56
|
-
|
|
55
|
+
## set loading
|
|
57
56
|
|
|
58
57
|
you can show loading by setting `is-loading ="true"` attribute or `isLoading` property.
|
|
59
58
|
|
|
@@ -61,18 +60,18 @@ you can show loading by setting `is-loading ="true"` attribute or `isLoading` pr
|
|
|
61
60
|
const jbInfiniteScroll = document.getElementByTagName('jb-infinite-scroll');
|
|
62
61
|
jbInfiniteScroll.isLoading = true;
|
|
63
62
|
```
|
|
64
|
-
you can also set your own loading ui by adding a slot with `slot="loading
|
|
63
|
+
you can also set your own loading ui by adding a slot with `slot="loading"` like the example below:
|
|
65
64
|
|
|
66
65
|
```html
|
|
67
66
|
<jb-infinite-scroll is-loading="true">
|
|
68
|
-
<div slot="loading
|
|
67
|
+
<div slot="loading">
|
|
69
68
|
<p>your loading</p>
|
|
70
69
|
</div>
|
|
71
70
|
</jb-infinite-scroll>
|
|
72
71
|
|
|
73
72
|
```
|
|
74
73
|
|
|
75
|
-
|
|
74
|
+
## set list empty
|
|
76
75
|
|
|
77
76
|
if there is no data to show you can set `is-list-empty = "true"`.
|
|
78
77
|
|
|
@@ -80,16 +79,16 @@ if there is no data to show you can set `is-list-empty = "true"`.
|
|
|
80
79
|
const jbInfiniteScroll = document.getElementByTagName('jb-infinite-scroll');
|
|
81
80
|
jbInfiniteScroll.isListEmpty = true;
|
|
82
81
|
```
|
|
83
|
-
you can set your own empty list ui by adding a slot with `slot="empty
|
|
82
|
+
you can set your own empty list ui by adding a slot with `slot="empty"` like the example below:
|
|
84
83
|
```html
|
|
85
84
|
<jb-infinite-scroll is-list-empty="true">
|
|
86
|
-
<div slot="empty
|
|
85
|
+
<div slot="empty">
|
|
87
86
|
<p>list is empty</p>
|
|
88
87
|
</div>
|
|
89
88
|
</jb-infinite-scroll>
|
|
90
89
|
|
|
91
90
|
```
|
|
92
|
-
|
|
91
|
+
## set list ended
|
|
93
92
|
if there is no more data to show you can set `is-list-ended = "true"`.this disables scroll capturing and `scrollEnd` event won't be called after.
|
|
94
93
|
|
|
95
94
|
```js
|
|
@@ -102,7 +101,7 @@ if there is no more data to show you can set `is-list-ended = "true"`.this disab
|
|
|
102
101
|
|
|
103
102
|
```
|
|
104
103
|
|
|
105
|
-
|
|
104
|
+
## disable scroll capture
|
|
106
105
|
in some cases if you want to disable capture scroll you can set `disable-capture-scroll = "true"`'
|
|
107
106
|
|
|
108
107
|
```js
|
|
@@ -113,29 +112,43 @@ in some cases if you want to disable capture scroll you can set `disable-capture
|
|
|
113
112
|
|
|
114
113
|
|
|
115
114
|
|
|
116
|
-
|
|
115
|
+
## state-change-waiting-behavior
|
|
117
116
|
|
|
118
|
-
by default `state-change-waiting-behavior` is `FORCE_WAIT` thats means when an scroll event fires,scroll is not captured until
|
|
119
|
-
if you want to change this behavior you can set `state-change-waiting-behavior` to `NO_WAIT`.
|
|
117
|
+
by default `state-change-waiting-behavior` is `FORCE_WAIT` thats means when an scroll event fires,scroll is not captured until one of the `is-loading` ,`is-list-empty` ,`is-list-ended` states updates.
|
|
118
|
+
if you want to change this behavior you can set `state-change-waiting-behavior` to `NO_WAIT`. that means the scroll callback in not dependent on `is-loading`,`is-list-empty`,`is-list-ended` state update.
|
|
120
119
|
|
|
120
|
+
we do this to prevent multiple call for one scroll to the end, because in most cases you would set some loading or list ended state or list is empty state after the scroll end called. but if you want to handle states by yourself and not use our state manager mechanism you can just set this to `NO_WAIT` to handle everything by yourself
|
|
121
121
|
|
|
122
122
|
### usage overview
|
|
123
123
|
```html
|
|
124
124
|
<jb-infinite-scroll is-list-empty="true" is-loading="true">
|
|
125
|
-
<div slot="
|
|
125
|
+
<div slot="content">
|
|
126
126
|
<div>item 1</div>
|
|
127
127
|
<div>item 2</div>
|
|
128
128
|
<div>item 3</div>
|
|
129
129
|
</div>
|
|
130
|
-
<div slot="empty
|
|
130
|
+
<div slot="empty">
|
|
131
131
|
<p>list is empty</p>
|
|
132
132
|
</div>
|
|
133
|
-
<div slot="loading
|
|
133
|
+
<div slot="loading">
|
|
134
134
|
<p>loading</p>
|
|
135
135
|
</div>
|
|
136
136
|
</jb-infinite-scroll>
|
|
137
137
|
```
|
|
138
138
|
|
|
139
|
+
## styling
|
|
140
|
+
you can use `::part` to apply style on our web-component part
|
|
141
|
+
```css
|
|
142
|
+
jb-infinite-scroll::part(content-wrapper){
|
|
143
|
+
display:'flex'
|
|
144
|
+
}
|
|
145
|
+
jb-infinite-scroll:states(loading)::part(loading-wrapper){
|
|
146
|
+
background:red;
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
we have `content-wrapper`, `loading-wrapper`, `empty-list-wrapper`, `default-loading` as a supported part in our component. you can also combine them with `loading`, `empty` states for different style in different states.
|
|
150
|
+
if you want to style default loading see [jb-loading](https://github.com/javadbat/jb-loading) styling section.
|
|
151
|
+
|
|
139
152
|
## Other Related Docs:
|
|
140
153
|
|
|
141
154
|
- see [jb-infinite-scroll/react](https://github.com/javadbat/jb-infinite-scroll/tree/main/react) if you want to use this component in react.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";function t(t,e,n,i){if("a"===n&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!i:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?i:"a"===n?i.call(t):i?i.value:e.get(t)}function e(t,e,n,i,s){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!s)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?s.call(t,n):s?s.value=n:e.set(t,n),n}require("jb-loading"),"function"==typeof SuppressedError&&SuppressedError;var n,i,s,a,r,o,l,c,h;exports.StateChangeWaitingBehavior=void 0,(n=exports.StateChangeWaitingBehavior||(exports.StateChangeWaitingBehavior={})).forceWait="FORCE_WAIT",n.noWait="NO_WAIT";class
|
|
1
|
+
"use strict";function t(t,e,n,i){if("a"===n&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!i:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?i:"a"===n?i.call(t):i?i.value:e.get(t)}function e(t,e,n,i,s){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!s)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?s.call(t,n):s?s.value=n:e.set(t,n),n}require("jb-loading"),"function"==typeof SuppressedError&&SuppressedError;var n,i,s,a,r,o,l,c,h,p,d,m,f,g,u,w,v,y,W,b,E;exports.StateChangeWaitingBehavior=void 0,(n=exports.StateChangeWaitingBehavior||(exports.StateChangeWaitingBehavior={})).forceWait="FORCE_WAIT",n.noWait="NO_WAIT";class C extends HTMLElement{constructor(){super(),i.add(this),s.set(this,!1),a.set(this,0),r.set(this,!1),o.set(this,!1),l.set(this,!1),c.set(this,null),h.set(this,void 0),d.set(this,exports.StateChangeWaitingBehavior.forceWait),"function"==typeof this.attachInternals&&e(this,h,this.attachInternals(),"f"),t(this,i,"m",g).call(this)}set stateChangeWaitingBehavior(n){e(this,d,t(this,i,"m",m).call(this,n),"f")}get stateChangeWaitingBehavior(){return t(this,d,"f")}get disableCaptureScroll(){return t(this,l,"f")}set disableCaptureScroll(n){e(this,l,n,"f"),t(this,i,"m",b).call(this,!1)}get isListEnded(){return t(this,r,"f")}set isListEnded(n){e(this,r,n,"f"),t(this,i,"m",b).call(this,!1)}get isLoading(){return t(this,s,"f")}set isLoading(n){e(this,s,n,"f"),t(this,i,"m",b).call(this,!1),n?(this.elements?.loading.classList.add("--show"),t(this,h,"f").states?.add("loading")):(this.elements?.loading.classList.remove("--show"),t(this,h,"f").states?.delete("loading"),t(this,i,"m",f).call(this),t(this,i,"m",v).call(this))}get isListEmpty(){return t(this,c,"f")}set isListEmpty(n){e(this,c,n,"f"),n?t(this,h,"f").states?.add("empty"):t(this,h,"f").states?.delete("empty"),t(this,i,"m",b).call(this,!1),t(this,i,"m",f).call(this)}connectedCallback(){this.callOnLoadEvent(),t(this,i,"m",w).call(this),this.callOnInitEvent()}callOnLoadEvent(){const t=new CustomEvent("load",{bubbles:!0,composed:!0});this.dispatchEvent(t)}callOnInitEvent(){const t=new CustomEvent("init",{bubbles:!0,composed:!0});this.dispatchEvent(t)}get canCaptureScroll(){return!(t(this,s,"f")||t(this,i,"a",p)||t(this,r,"f")||t(this,o,"f")||t(this,l,"f"))}static get observedAttributes(){return["is-loading","is-list-empty","is-list-ended","disable-capture-scroll","state-change-waiting-behavior"]}attributeChangedCallback(e,n,s){t(this,i,"m",E).call(this,e,s)}}s=new WeakMap,a=new WeakMap,r=new WeakMap,o=new WeakMap,l=new WeakMap,c=new WeakMap,h=new WeakMap,d=new WeakMap,i=new WeakSet,p=function(){if(null!==t(this,c,"f"))return t(this,c,"f")},m=function(t){switch(t){case"FORCE_WAIT":default:return exports.StateChangeWaitingBehavior.forceWait;case"NO_WAIT":return exports.StateChangeWaitingBehavior.noWait}},f=function(){t(this,i,"a",p)?(this.elements?.emptyListWrapper.classList.add("--show"),this.elements?.contentWrapper.classList.remove("--show")):(this.elements?.contentWrapper.classList.add("--show"),this.elements?.emptyListWrapper.classList.remove("--show"))},g=function(){const t=this.attachShadow({mode:"open"}),e=document.createElement("template");e.innerHTML='<style>:host {\n width: 100%;\n height: 100%;\n display: block;\n}\n\n.infinite-scroll-component {\n height: 100%;\n}\n.infinite-scroll-component .content-wrapper {\n width: 100%;\n height: 100%;\n display: none;\n overflow: auto;\n}\n.infinite-scroll-component .content-wrapper.--show {\n display: block;\n}\n.infinite-scroll-component .content-wrapper ::slotted([slot=content]) {\n height: auto;\n}\n.infinite-scroll-component .loading-wrapper {\n display: none;\n}\n.infinite-scroll-component .loading-wrapper .default-loading {\n width: 40px;\n height: 40px;\n margin: 0 auto;\n}\n.infinite-scroll-component .loading-wrapper.--show {\n display: block;\n}\n.infinite-scroll-component .empty-list-wrapper {\n width: 100%;\n height: 100%;\n display: none;\n}\n.infinite-scroll-component .empty-list-wrapper.--show {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.infinite-scroll-component .empty-list-wrapper ::slotted([slot=empty]) {\n height: 100%;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n max-height: 100%;\n overflow-y: hidden;\n background-color: transparent;\n padding: 1rem;\n box-sizing: border-box;\n}</style>\n<div class="infinite-scroll-component">\r\n <div class="content-wrapper" part="content-wrapper">\r\n <slot name="content"></slot>\r\n <div class="loading-wrapper" part="loading-wrapper">\r\n <slot name="loading">\r\n <div class="default-loading">\r\n <jb-loading part="default-loading"></jb-loading>\r\n </div>\r\n </slot>\r\n </div>\r\n </div>\r\n <div class="empty-list-wrapper" part="empty-list-wrapper">\r\n <slot name="empty">\r\n </slot>\r\n </div>\r\n \r\n</div>',t.appendChild(e.content.cloneNode(!0)),this.elements={loading:t.querySelector(".loading-wrapper"),componentWrapper:t.querySelector(".Infinite-scroll-component"),contentWrapper:t.querySelector(".content-wrapper"),loadingWrapper:t.querySelector(".loading-wrapper"),emptyListWrapper:t.querySelector(".empty-list-wrapper")}},u=function(){this.elements.contentWrapper.addEventListener("scroll",t(this,i,"m",W).bind(this),{passive:!0})},w=function(){t(this,i,"m",u).call(this),t(this,i,"m",v).call(this)},v=function(){const{scrollHeight:e,clientHeight:n}=this.elements.contentWrapper;e<=n&&this.canCaptureScroll&&t(this,i,"m",y).call(this)},y=function(){t(this,i,"m",b).call(this,!0);const e=new CustomEvent("scrollEnd");this.dispatchEvent(e)},W=function(){const{scrollTop:e,scrollHeight:n,clientHeight:s}=this.elements.contentWrapper;e+s+t(this,a,"f")>=n&&this.canCaptureScroll&&t(this,i,"m",y).call(this)},b=function(n){if(n)if(t(this,d,"f")===exports.StateChangeWaitingBehavior.forceWait)e(this,o,!0,"f");else if(t(this,d,"f")===exports.StateChangeWaitingBehavior.noWait)return;e(this,o,!1,"f")},E=function(n,s){switch(n){case"is-loading":this.isLoading="true"===s;break;case"is-list-empty":this.isListEmpty="true"===s;break;case"is-list-ended":e(this,r,"true"===s,"f");break;case"disable-capture-scroll":e(this,l,"true"===s,"f");break;case"state-change-waiting-behavior":e(this,d,t(this,i,"m",m).call(this,s),"f")}};!customElements.get("jb-infinite-scroll")&&window.customElements.define("jb-infinite-scroll",C),exports.JBInfiniteScrollWebComponent=C;
|
|
2
2
|
//# sourceMappingURL=jb-infinite-scroll.cjs.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jb-infinite-scroll.cjs.js","sources":["../lib/types.ts","../lib/jb-infinite-scroll.ts"],"sourcesContent":["export type Elements = {\r\n loading: HTMLDivElement,\r\n contentWrapper: HTMLDivElement,\r\n componentWrapper: HTMLDivElement,\r\n emptyListWrapper: HTMLDivElement,\r\n loadingWrapper: HTMLDivElement,\r\n}\r\n\r\nexport enum StateChangeWaitingBehavior {\r\n // when user scroll we lock event call and wait for user to change isLoading (good for React or any other ui framework solution)\r\n forceWait = \"FORCE_WAIT\",\r\n // when user scroll we dont lock its event listener and developer should handle extra scroll by it self (good for pure js solution)\r\n noWait = \"NO_WAIT\",\r\n}","import HTML from './jb-infinite-scroll.html';\r\nimport CSS from './jb-infinite-scroll.scss';\r\nimport { Elements, StateChangeWaitingBehavior } from './types.js';\r\nimport \"jb-loading\";\r\n\r\nexport * from \"./types.js\";\r\n\r\nexport class JBInfiniteScrollWebComponent extends HTMLElement {\r\n elements!: Elements;\r\n #isLoading = false;\r\n //the amount of space that we listen to for trigger refresh \r\n #endPageGap = 0;\r\n #isLastPage = false;\r\n\r\n #isListEnded = false;\r\n //used when user scroll and we dont want to capture multiple scroll at one and wait for prev scroll event to finish\r\n #isWaitingForStateChange = false;\r\n #disableCaptureScroll = false;\r\n #isListEmpty = false;\r\n #stateChangeWaitingBehavior: StateChangeWaitingBehavior = StateChangeWaitingBehavior.forceWait;\r\n\r\n\r\n constructor() {\r\n super();\r\n this.initWebComponent();\r\n }\r\n mapStateChangeWaitingBehavior(state: string) {\r\n switch (state) {\r\n case \"FORCE_WAIT\":\r\n return StateChangeWaitingBehavior.forceWait;\r\n case \"NO_WAIT\":\r\n return StateChangeWaitingBehavior.noWait;\r\n\r\n default:\r\n return StateChangeWaitingBehavior.forceWait;\r\n\r\n }\r\n\r\n }\r\n set stateChangeWaitingBehavior(value: string) {\r\n this.#stateChangeWaitingBehavior = this.mapStateChangeWaitingBehavior(value);\r\n }\r\n get stateChangeWaitingBehavior() {\r\n return this.#stateChangeWaitingBehavior;\r\n }\r\n get disableCaptureScroll() {\r\n return this.#disableCaptureScroll;\r\n }\r\n\r\n set disableCaptureScroll(value: boolean) {\r\n this.#disableCaptureScroll = value;\r\n this.setIsWaitingForStatChange(false);\r\n }\r\n get isListEnded() {\r\n return this.#isListEnded;\r\n }\r\n set isListEnded(value: boolean) {\r\n this.#isListEnded = value;\r\n this.setIsWaitingForStatChange(false);\r\n\r\n }\r\n get isLoading() {\r\n return this.#isLoading;\r\n }\r\n set isLoading(value: boolean) {\r\n this.#isLoading = value;\r\n this.setIsWaitingForStatChange(false);\r\n if (value) {\r\n this.elements?.loading.classList.add('--show');\r\n } else {\r\n this.elements?.loading.classList.remove('--show');\r\n this.checkEmptyListState();\r\n this.checkScrollHeight();\r\n }\r\n }\r\n get isListEmpty() {\r\n return this.#isListEmpty;\r\n }\r\n set isListEmpty(value: boolean) {\r\n this.#isListEmpty = value;\r\n this.setIsWaitingForStatChange(false);\r\n\r\n\r\n }\r\n get isLastPage() {\r\n return this.#isLastPage;\r\n }\r\n set isLastPage(value: boolean) {\r\n this.#isLastPage = value;\r\n }\r\n checkEmptyListState() {\r\n if (this.#isListEmpty) {\r\n this.elements?.emptyListWrapper.classList.add('--show');\r\n this.elements?.contentWrapper.classList.remove('--show');\r\n\r\n } else {\r\n this.elements?.contentWrapper.classList.add('--show');\r\n this.elements?.emptyListWrapper.classList.remove('--show');\r\n\r\n }\r\n }\r\n connectedCallback() {\r\n // standard web component event that called when all of dom is bounded\r\n this.callOnLoadEvent();\r\n this.initProp();\r\n this.callOnInitEvent();\r\n\r\n }\r\n callOnLoadEvent() {\r\n const event = new CustomEvent('load', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n callOnInitEvent() {\r\n const event = new CustomEvent('init', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n initWebComponent() {\r\n const shadowRoot = this.attachShadow({\r\n mode: 'open'\r\n });\r\n const html = `<style>${CSS}</style>` + '\\n' + HTML;\r\n const element = document.createElement('template');\r\n element.innerHTML = html;\r\n shadowRoot.appendChild(element.content.cloneNode(true));\r\n this.elements = {\r\n loading: shadowRoot.querySelector('.loading-wrapper')!,\r\n componentWrapper: shadowRoot.querySelector('.Infinite-scroll-component')!,\r\n contentWrapper: shadowRoot.querySelector('.content-wrapper')!,\r\n loadingWrapper: shadowRoot.querySelector('.loading-wrapper')!,\r\n emptyListWrapper: shadowRoot.querySelector('.empty-list-wrapper')!,\r\n };\r\n\r\n }\r\n registerEventListener() {\r\n this.elements.contentWrapper.addEventListener('scroll', this.onScroll.bind(this), { passive: true });\r\n }\r\n initProp() {\r\n this.registerEventListener();\r\n this.checkScrollHeight();\r\n }\r\n checkScrollHeight() {\r\n //check if our container is bigger than our content we call scroll end event\r\n const { scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollHeight <= clientHeight && this.canCaptureScroll) {\r\n this.onScrollEnd();\r\n }\r\n }\r\n onScrollEnd() { \r\n this.setIsWaitingForStatChange(true);\r\n const event = new CustomEvent('scrollEnd');\r\n this.dispatchEvent(event);\r\n }\r\n onScroll() {\r\n const { scrollTop, scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollTop + clientHeight + this.#endPageGap >= scrollHeight) {\r\n if (this.canCaptureScroll) {\r\n this.onScrollEnd();\r\n }\r\n }\r\n }\r\n setIsWaitingForStatChange(isWaitingStatus: boolean) {\r\n\r\n if (isWaitingStatus) {\r\n if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.forceWait) {\r\n this.#isWaitingForStateChange = true;\r\n } else if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.noWait) {\r\n return;\r\n }\r\n }\r\n this.#isWaitingForStateChange = false;\r\n\r\n\r\n\r\n }\r\n get canCaptureScroll() {\r\n if (!(this.#isLoading || this.#isListEmpty || this.#isListEnded || this.#isWaitingForStateChange || this.#disableCaptureScroll)) {\r\n return true;\r\n\r\n }\r\n return false;\r\n }\r\n\r\n static get observedAttributes() {\r\n return ['is-loading', 'is-list-empty', 'is-list-ended', 'disable-capture-scroll', 'state-change-waiting-behavior'];\r\n }\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n // do something when an attribute has changed\r\n this.onAttributeChange(name, newValue);\r\n }\r\n onAttributeChange(name: string, value: string) {\r\n switch (name) {\r\n case 'is-loading':\r\n if (value === 'true') {\r\n this.isLoading = true;\r\n } else {\r\n this.isLoading = false;\r\n }\r\n break;\r\n case 'is-list-empty':\r\n if (value === 'true') {\r\n this.isListEmpty = true;\r\n } else {\r\n this.isListEmpty = false;\r\n\r\n }\r\n break;\r\n case 'is-list-ended':\r\n if (value === 'true') {\r\n this.#isListEnded = true;\r\n } else {\r\n this.#isListEnded = false;\r\n\r\n }\r\n break;\r\n\r\n case 'disable-capture-scroll':\r\n if (value === 'true') {\r\n this.#disableCaptureScroll = true;\r\n } else {\r\n this.#disableCaptureScroll = false;\r\n\r\n }\r\n break;\r\n case 'state-change-waiting-behavior':\r\n this.#stateChangeWaitingBehavior = this.mapStateChangeWaitingBehavior(value);\r\n break;\r\n\r\n\r\n }\r\n\r\n }\r\n}\r\nconst myElementNotExists = !customElements.get('jb-infinite-scroll');\r\nif (myElementNotExists) {\r\n window.customElements.define('jb-infinite-scroll', JBInfiniteScrollWebComponent);\r\n}\r\n"],"names":["StateChangeWaitingBehavior","JBInfiniteScrollWebComponent","HTMLElement","constructor","super","_JBInfiniteScrollWebComponent_isLoading","set","this","_JBInfiniteScrollWebComponent_endPageGap","_JBInfiniteScrollWebComponent_isLastPage","_JBInfiniteScrollWebComponent_isListEnded","_JBInfiniteScrollWebComponent_isWaitingForStateChange","_JBInfiniteScrollWebComponent_disableCaptureScroll","_JBInfiniteScrollWebComponent_isListEmpty","_JBInfiniteScrollWebComponent_stateChangeWaitingBehavior","forceWait","initWebComponent","mapStateChangeWaitingBehavior","state","noWait","stateChangeWaitingBehavior","value","__classPrivateFieldSet","__classPrivateFieldGet","disableCaptureScroll","setIsWaitingForStatChange","isListEnded","isLoading","elements","loading","classList","add","remove","checkEmptyListState","checkScrollHeight","isListEmpty","isLastPage","emptyListWrapper","contentWrapper","connectedCallback","callOnLoadEvent","initProp","callOnInitEvent","event","CustomEvent","bubbles","composed","dispatchEvent","shadowRoot","attachShadow","mode","element","document","createElement","innerHTML","appendChild","content","cloneNode","querySelector","componentWrapper","loadingWrapper","registerEventListener","addEventListener","onScroll","bind","passive","scrollHeight","clientHeight","canCaptureScroll","onScrollEnd","scrollTop","isWaitingStatus","observedAttributes","attributeChangedCallback","name","oldValue","newValue","onAttributeChange","customElements","get","window","define"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jb-infinite-scroll.cjs.js","sources":["../lib/types.ts","../lib/jb-infinite-scroll.ts"],"sourcesContent":["export type Elements = {\r\n loading: HTMLDivElement,\r\n contentWrapper: HTMLDivElement,\r\n componentWrapper: HTMLDivElement,\r\n emptyListWrapper: HTMLDivElement,\r\n loadingWrapper: HTMLDivElement,\r\n}\r\n\r\nexport enum StateChangeWaitingBehavior {\r\n // when user scroll we lock event call and wait for user to change isLoading (good for React or any other ui framework solution)\r\n forceWait = \"FORCE_WAIT\",\r\n // when user scroll we dont lock its event listener and developer should handle extra scroll by it self (good for pure js solution)\r\n noWait = \"NO_WAIT\",\r\n}","import HTML from './jb-infinite-scroll.html';\r\nimport CSS from './jb-infinite-scroll.scss';\r\nimport { Elements, StateChangeWaitingBehavior } from './types.js';\r\nimport \"jb-loading\";\r\n\r\nexport * from \"./types.js\";\r\n\r\nexport class JBInfiniteScrollWebComponent extends HTMLElement {\r\n elements!: Elements;\r\n #isLoading = false;\r\n //the amount of space that we listen to for trigger refresh \r\n #endPageGap = 0;\r\n\r\n #isListEnded = false;\r\n //used when user scroll and we dont want to capture multiple scroll at one and wait for prev scroll event to finish\r\n #isWaitingForStateChange = false;\r\n #disableCaptureScroll = false;\r\n // if user set empty state from outside (change to manual mode)\r\n #externalIsListEmpty: boolean | null = null;\r\n #internals: ElementInternals;\r\n get #isListEmpty() {\r\n if (this.#externalIsListEmpty !== null) {\r\n return this.#externalIsListEmpty;\r\n }\r\n }\r\n #stateChangeWaitingBehavior: StateChangeWaitingBehavior = StateChangeWaitingBehavior.forceWait;\r\n\r\n constructor() {\r\n super();\r\n if (typeof this.attachInternals == \"function\") {\r\n //some browser dont support attachInternals\r\n this.#internals = this.attachInternals();\r\n }\r\n this.#initWebComponent();\r\n }\r\n #mapStateChangeWaitingBehavior(state: string) {\r\n switch (state) {\r\n case \"FORCE_WAIT\":\r\n return StateChangeWaitingBehavior.forceWait;\r\n case \"NO_WAIT\":\r\n return StateChangeWaitingBehavior.noWait;\r\n\r\n default:\r\n return StateChangeWaitingBehavior.forceWait;\r\n\r\n }\r\n\r\n }\r\n set stateChangeWaitingBehavior(value: string) {\r\n this.#stateChangeWaitingBehavior = this.#mapStateChangeWaitingBehavior(value);\r\n }\r\n get stateChangeWaitingBehavior() {\r\n return this.#stateChangeWaitingBehavior;\r\n }\r\n get disableCaptureScroll() {\r\n return this.#disableCaptureScroll;\r\n }\r\n\r\n set disableCaptureScroll(value: boolean) {\r\n this.#disableCaptureScroll = value;\r\n this.#setIsWaitingForStatChange(false);\r\n }\r\n get isListEnded() {\r\n return this.#isListEnded;\r\n }\r\n set isListEnded(value: boolean) {\r\n this.#isListEnded = value;\r\n this.#setIsWaitingForStatChange(false);\r\n\r\n }\r\n get isLoading() {\r\n return this.#isLoading;\r\n }\r\n set isLoading(value: boolean) {\r\n this.#isLoading = value;\r\n this.#setIsWaitingForStatChange(false);\r\n if (value) {\r\n this.elements?.loading.classList.add('--show');\r\n (this.#internals as any).states?.add(\"loading\");\r\n } else {\r\n this.elements?.loading.classList.remove('--show');\r\n (this.#internals as any).states?.delete(\"loading\");\r\n this.#checkEmptyListState();\r\n this.#checkScrollHeight();\r\n }\r\n }\r\n get isListEmpty() {\r\n return this.#externalIsListEmpty;\r\n }\r\n set isListEmpty(value: boolean) {\r\n this.#externalIsListEmpty = value;\r\n if(value){\r\n (this.#internals as any).states?.add(\"empty\");\r\n }else{\r\n (this.#internals as any).states?.delete(\"empty\");\r\n }\r\n this.#setIsWaitingForStatChange(false);\r\n this.#checkEmptyListState();\r\n\r\n }\r\n #checkEmptyListState() {\r\n if (this.#isListEmpty) {\r\n this.elements?.emptyListWrapper.classList.add('--show');\r\n this.elements?.contentWrapper.classList.remove('--show');\r\n\r\n } else {\r\n this.elements?.contentWrapper.classList.add('--show');\r\n this.elements?.emptyListWrapper.classList.remove('--show');\r\n\r\n }\r\n }\r\n connectedCallback() {\r\n // standard web component event that called when all of dom is bounded\r\n this.callOnLoadEvent();\r\n this.#initProp();\r\n this.callOnInitEvent();\r\n\r\n }\r\n callOnLoadEvent() {\r\n const event = new CustomEvent('load', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n callOnInitEvent() {\r\n const event = new CustomEvent('init', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n #initWebComponent() {\r\n const shadowRoot = this.attachShadow({\r\n mode: 'open'\r\n });\r\n const html = `<style>${CSS}</style>` + '\\n' + HTML;\r\n const element = document.createElement('template');\r\n element.innerHTML = html;\r\n shadowRoot.appendChild(element.content.cloneNode(true));\r\n this.elements = {\r\n loading: shadowRoot.querySelector('.loading-wrapper')!,\r\n componentWrapper: shadowRoot.querySelector('.Infinite-scroll-component')!,\r\n contentWrapper: shadowRoot.querySelector('.content-wrapper')!,\r\n loadingWrapper: shadowRoot.querySelector('.loading-wrapper')!,\r\n emptyListWrapper: shadowRoot.querySelector('.empty-list-wrapper')!,\r\n } as const;\r\n\r\n }\r\n #registerEventListener() {\r\n this.elements.contentWrapper.addEventListener('scroll', this.#onScroll.bind(this), { passive: true });\r\n }\r\n #initProp() {\r\n this.#registerEventListener();\r\n this.#checkScrollHeight();\r\n }\r\n #checkScrollHeight() {\r\n //check if our container is bigger than our content we call scroll end event\r\n const { scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollHeight <= clientHeight && this.canCaptureScroll) {\r\n this.#onScrollEnd();\r\n }\r\n }\r\n #onScrollEnd() {\r\n this.#setIsWaitingForStatChange(true);\r\n const event = new CustomEvent('scrollEnd');\r\n this.dispatchEvent(event);\r\n }\r\n #onScroll() {\r\n const { scrollTop, scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollTop + clientHeight + this.#endPageGap >= scrollHeight) {\r\n if (this.canCaptureScroll) {\r\n this.#onScrollEnd();\r\n }\r\n }\r\n }\r\n #setIsWaitingForStatChange(isWaitingStatus: boolean) {\r\n\r\n if (isWaitingStatus) {\r\n if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.forceWait) {\r\n this.#isWaitingForStateChange = true;\r\n } else if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.noWait) {\r\n return;\r\n }\r\n }\r\n this.#isWaitingForStateChange = false;\r\n\r\n\r\n\r\n }\r\n get canCaptureScroll() {\r\n if (!(this.#isLoading || this.#isListEmpty || this.#isListEnded || this.#isWaitingForStateChange || this.#disableCaptureScroll)) {\r\n return true;\r\n\r\n }\r\n return false;\r\n }\r\n\r\n static get observedAttributes() {\r\n return ['is-loading', 'is-list-empty', 'is-list-ended', 'disable-capture-scroll', 'state-change-waiting-behavior'];\r\n }\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n // do something when an attribute has changed\r\n this.#onAttributeChange(name, newValue);\r\n }\r\n #onAttributeChange(name: string, value: string) {\r\n switch (name) {\r\n case 'is-loading':\r\n if (value === 'true') {\r\n this.isLoading = true;\r\n } else {\r\n this.isLoading = false;\r\n }\r\n break;\r\n case 'is-list-empty':\r\n if (value === 'true') {\r\n this.isListEmpty = true;\r\n } else {\r\n this.isListEmpty = false;\r\n\r\n }\r\n break;\r\n case 'is-list-ended':\r\n if (value === 'true') {\r\n this.#isListEnded = true;\r\n } else {\r\n this.#isListEnded = false;\r\n\r\n }\r\n break;\r\n\r\n case 'disable-capture-scroll':\r\n if (value === 'true') {\r\n this.#disableCaptureScroll = true;\r\n } else {\r\n this.#disableCaptureScroll = false;\r\n\r\n }\r\n break;\r\n case 'state-change-waiting-behavior':\r\n this.#stateChangeWaitingBehavior = this.#mapStateChangeWaitingBehavior(value);\r\n break;\r\n\r\n\r\n }\r\n\r\n }\r\n}\r\nconst myElementNotExists = !customElements.get('jb-infinite-scroll');\r\nif (myElementNotExists) {\r\n window.customElements.define('jb-infinite-scroll', JBInfiniteScrollWebComponent);\r\n}\r\n"],"names":["StateChangeWaitingBehavior","JBInfiniteScrollWebComponent","HTMLElement","constructor","super","_JBInfiniteScrollWebComponent_isLoading","set","this","_JBInfiniteScrollWebComponent_endPageGap","_JBInfiniteScrollWebComponent_isListEnded","_JBInfiniteScrollWebComponent_isWaitingForStateChange","_JBInfiniteScrollWebComponent_disableCaptureScroll","_JBInfiniteScrollWebComponent_externalIsListEmpty","_JBInfiniteScrollWebComponent_internals","_JBInfiniteScrollWebComponent_stateChangeWaitingBehavior","forceWait","attachInternals","__classPrivateFieldSet","__classPrivateFieldGet","_JBInfiniteScrollWebComponent_instances","_JBInfiniteScrollWebComponent_initWebComponent","call","stateChangeWaitingBehavior","value","_JBInfiniteScrollWebComponent_mapStateChangeWaitingBehavior","disableCaptureScroll","_JBInfiniteScrollWebComponent_setIsWaitingForStatChange","isListEnded","isLoading","elements","loading","classList","add","states","remove","delete","_JBInfiniteScrollWebComponent_checkEmptyListState","_JBInfiniteScrollWebComponent_checkScrollHeight","isListEmpty","connectedCallback","callOnLoadEvent","_JBInfiniteScrollWebComponent_initProp","callOnInitEvent","event","CustomEvent","bubbles","composed","dispatchEvent","canCaptureScroll","_JBInfiniteScrollWebComponent_isListEmpty_get","observedAttributes","attributeChangedCallback","name","oldValue","newValue","state","noWait","emptyListWrapper","contentWrapper","shadowRoot","attachShadow","mode","element","document","createElement","innerHTML","appendChild","content","cloneNode","querySelector","componentWrapper","loadingWrapper","_JBInfiniteScrollWebComponent_registerEventListener","addEventListener","_JBInfiniteScrollWebComponent_onScroll","bind","passive","scrollHeight","clientHeight","_JBInfiniteScrollWebComponent_onScrollEnd","scrollTop","isWaitingStatus","_JBInfiniteScrollWebComponent_onAttributeChange","customElements","get","window","define"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"jb-loading";function t(t,e,n,i){if("a"===n&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!i:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?i:"a"===n?i.call(t):i?i.value:e.get(t)}function e(t,e,n,i,s){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!s)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?s.call(t,n):s?s.value=n:e.set(t,n),n}"function"==typeof SuppressedError&&SuppressedError;var n,i,s,r,
|
|
1
|
+
import"jb-loading";function t(t,e,n,i){if("a"===n&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!i:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?i:"a"===n?i.call(t):i?i.value:e.get(t)}function e(t,e,n,i,s){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!s)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?s.call(t,n):s?s.value=n:e.set(t,n),n}"function"==typeof SuppressedError&&SuppressedError;var n,i,s,a,r,o,l,c,h,p,d,m,f,u,w,g,y,v,b,W,E;!function(t){t.forceWait="FORCE_WAIT",t.noWait="NO_WAIT"}(n||(n={}));class L extends HTMLElement{constructor(){super(),i.add(this),s.set(this,!1),a.set(this,0),r.set(this,!1),o.set(this,!1),l.set(this,!1),c.set(this,null),h.set(this,void 0),d.set(this,n.forceWait),"function"==typeof this.attachInternals&&e(this,h,this.attachInternals(),"f"),t(this,i,"m",u).call(this)}set stateChangeWaitingBehavior(n){e(this,d,t(this,i,"m",m).call(this,n),"f")}get stateChangeWaitingBehavior(){return t(this,d,"f")}get disableCaptureScroll(){return t(this,l,"f")}set disableCaptureScroll(n){e(this,l,n,"f"),t(this,i,"m",W).call(this,!1)}get isListEnded(){return t(this,r,"f")}set isListEnded(n){e(this,r,n,"f"),t(this,i,"m",W).call(this,!1)}get isLoading(){return t(this,s,"f")}set isLoading(n){e(this,s,n,"f"),t(this,i,"m",W).call(this,!1),n?(this.elements?.loading.classList.add("--show"),t(this,h,"f").states?.add("loading")):(this.elements?.loading.classList.remove("--show"),t(this,h,"f").states?.delete("loading"),t(this,i,"m",f).call(this),t(this,i,"m",y).call(this))}get isListEmpty(){return t(this,c,"f")}set isListEmpty(n){e(this,c,n,"f"),n?t(this,h,"f").states?.add("empty"):t(this,h,"f").states?.delete("empty"),t(this,i,"m",W).call(this,!1),t(this,i,"m",f).call(this)}connectedCallback(){this.callOnLoadEvent(),t(this,i,"m",g).call(this),this.callOnInitEvent()}callOnLoadEvent(){const t=new CustomEvent("load",{bubbles:!0,composed:!0});this.dispatchEvent(t)}callOnInitEvent(){const t=new CustomEvent("init",{bubbles:!0,composed:!0});this.dispatchEvent(t)}get canCaptureScroll(){return!(t(this,s,"f")||t(this,i,"a",p)||t(this,r,"f")||t(this,o,"f")||t(this,l,"f"))}static get observedAttributes(){return["is-loading","is-list-empty","is-list-ended","disable-capture-scroll","state-change-waiting-behavior"]}attributeChangedCallback(e,n,s){t(this,i,"m",E).call(this,e,s)}}s=new WeakMap,a=new WeakMap,r=new WeakMap,o=new WeakMap,l=new WeakMap,c=new WeakMap,h=new WeakMap,d=new WeakMap,i=new WeakSet,p=function(){if(null!==t(this,c,"f"))return t(this,c,"f")},m=function(t){switch(t){case"FORCE_WAIT":default:return n.forceWait;case"NO_WAIT":return n.noWait}},f=function(){t(this,i,"a",p)?(this.elements?.emptyListWrapper.classList.add("--show"),this.elements?.contentWrapper.classList.remove("--show")):(this.elements?.contentWrapper.classList.add("--show"),this.elements?.emptyListWrapper.classList.remove("--show"))},u=function(){const t=this.attachShadow({mode:"open"}),e=document.createElement("template");e.innerHTML='<style>:host {\n width: 100%;\n height: 100%;\n display: block;\n}\n\n.infinite-scroll-component {\n height: 100%;\n}\n.infinite-scroll-component .content-wrapper {\n width: 100%;\n height: 100%;\n display: none;\n overflow: auto;\n}\n.infinite-scroll-component .content-wrapper.--show {\n display: block;\n}\n.infinite-scroll-component .content-wrapper ::slotted([slot=content]) {\n height: auto;\n}\n.infinite-scroll-component .loading-wrapper {\n display: none;\n}\n.infinite-scroll-component .loading-wrapper .default-loading {\n width: 40px;\n height: 40px;\n margin: 0 auto;\n}\n.infinite-scroll-component .loading-wrapper.--show {\n display: block;\n}\n.infinite-scroll-component .empty-list-wrapper {\n width: 100%;\n height: 100%;\n display: none;\n}\n.infinite-scroll-component .empty-list-wrapper.--show {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.infinite-scroll-component .empty-list-wrapper ::slotted([slot=empty]) {\n height: 100%;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n max-height: 100%;\n overflow-y: hidden;\n background-color: transparent;\n padding: 1rem;\n box-sizing: border-box;\n}</style>\n<div class="infinite-scroll-component">\r\n <div class="content-wrapper" part="content-wrapper">\r\n <slot name="content"></slot>\r\n <div class="loading-wrapper" part="loading-wrapper">\r\n <slot name="loading">\r\n <div class="default-loading">\r\n <jb-loading part="default-loading"></jb-loading>\r\n </div>\r\n </slot>\r\n </div>\r\n </div>\r\n <div class="empty-list-wrapper" part="empty-list-wrapper">\r\n <slot name="empty">\r\n </slot>\r\n </div>\r\n \r\n</div>',t.appendChild(e.content.cloneNode(!0)),this.elements={loading:t.querySelector(".loading-wrapper"),componentWrapper:t.querySelector(".Infinite-scroll-component"),contentWrapper:t.querySelector(".content-wrapper"),loadingWrapper:t.querySelector(".loading-wrapper"),emptyListWrapper:t.querySelector(".empty-list-wrapper")}},w=function(){this.elements.contentWrapper.addEventListener("scroll",t(this,i,"m",b).bind(this),{passive:!0})},g=function(){t(this,i,"m",w).call(this),t(this,i,"m",y).call(this)},y=function(){const{scrollHeight:e,clientHeight:n}=this.elements.contentWrapper;e<=n&&this.canCaptureScroll&&t(this,i,"m",v).call(this)},v=function(){t(this,i,"m",W).call(this,!0);const e=new CustomEvent("scrollEnd");this.dispatchEvent(e)},b=function(){const{scrollTop:e,scrollHeight:n,clientHeight:s}=this.elements.contentWrapper;e+s+t(this,a,"f")>=n&&this.canCaptureScroll&&t(this,i,"m",v).call(this)},W=function(i){if(i)if(t(this,d,"f")===n.forceWait)e(this,o,!0,"f");else if(t(this,d,"f")===n.noWait)return;e(this,o,!1,"f")},E=function(n,s){switch(n){case"is-loading":this.isLoading="true"===s;break;case"is-list-empty":this.isListEmpty="true"===s;break;case"is-list-ended":e(this,r,"true"===s,"f");break;case"disable-capture-scroll":e(this,l,"true"===s,"f");break;case"state-change-waiting-behavior":e(this,d,t(this,i,"m",m).call(this,s),"f")}};!customElements.get("jb-infinite-scroll")&&window.customElements.define("jb-infinite-scroll",L);export{L as JBInfiniteScrollWebComponent,n as StateChangeWaitingBehavior};
|
|
2
2
|
//# sourceMappingURL=jb-infinite-scroll.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jb-infinite-scroll.js","sources":["../lib/types.ts","../lib/jb-infinite-scroll.ts"],"sourcesContent":["export type Elements = {\r\n loading: HTMLDivElement,\r\n contentWrapper: HTMLDivElement,\r\n componentWrapper: HTMLDivElement,\r\n emptyListWrapper: HTMLDivElement,\r\n loadingWrapper: HTMLDivElement,\r\n}\r\n\r\nexport enum StateChangeWaitingBehavior {\r\n // when user scroll we lock event call and wait for user to change isLoading (good for React or any other ui framework solution)\r\n forceWait = \"FORCE_WAIT\",\r\n // when user scroll we dont lock its event listener and developer should handle extra scroll by it self (good for pure js solution)\r\n noWait = \"NO_WAIT\",\r\n}","import HTML from './jb-infinite-scroll.html';\r\nimport CSS from './jb-infinite-scroll.scss';\r\nimport { Elements, StateChangeWaitingBehavior } from './types.js';\r\nimport \"jb-loading\";\r\n\r\nexport * from \"./types.js\";\r\n\r\nexport class JBInfiniteScrollWebComponent extends HTMLElement {\r\n elements!: Elements;\r\n #isLoading = false;\r\n //the amount of space that we listen to for trigger refresh \r\n #endPageGap = 0;\r\n #isLastPage = false;\r\n\r\n #isListEnded = false;\r\n //used when user scroll and we dont want to capture multiple scroll at one and wait for prev scroll event to finish\r\n #isWaitingForStateChange = false;\r\n #disableCaptureScroll = false;\r\n #isListEmpty = false;\r\n #stateChangeWaitingBehavior: StateChangeWaitingBehavior = StateChangeWaitingBehavior.forceWait;\r\n\r\n\r\n constructor() {\r\n super();\r\n this.initWebComponent();\r\n }\r\n mapStateChangeWaitingBehavior(state: string) {\r\n switch (state) {\r\n case \"FORCE_WAIT\":\r\n return StateChangeWaitingBehavior.forceWait;\r\n case \"NO_WAIT\":\r\n return StateChangeWaitingBehavior.noWait;\r\n\r\n default:\r\n return StateChangeWaitingBehavior.forceWait;\r\n\r\n }\r\n\r\n }\r\n set stateChangeWaitingBehavior(value: string) {\r\n this.#stateChangeWaitingBehavior = this.mapStateChangeWaitingBehavior(value);\r\n }\r\n get stateChangeWaitingBehavior() {\r\n return this.#stateChangeWaitingBehavior;\r\n }\r\n get disableCaptureScroll() {\r\n return this.#disableCaptureScroll;\r\n }\r\n\r\n set disableCaptureScroll(value: boolean) {\r\n this.#disableCaptureScroll = value;\r\n this.setIsWaitingForStatChange(false);\r\n }\r\n get isListEnded() {\r\n return this.#isListEnded;\r\n }\r\n set isListEnded(value: boolean) {\r\n this.#isListEnded = value;\r\n this.setIsWaitingForStatChange(false);\r\n\r\n }\r\n get isLoading() {\r\n return this.#isLoading;\r\n }\r\n set isLoading(value: boolean) {\r\n this.#isLoading = value;\r\n this.setIsWaitingForStatChange(false);\r\n if (value) {\r\n this.elements?.loading.classList.add('--show');\r\n } else {\r\n this.elements?.loading.classList.remove('--show');\r\n this.checkEmptyListState();\r\n this.checkScrollHeight();\r\n }\r\n }\r\n get isListEmpty() {\r\n return this.#isListEmpty;\r\n }\r\n set isListEmpty(value: boolean) {\r\n this.#isListEmpty = value;\r\n this.setIsWaitingForStatChange(false);\r\n\r\n\r\n }\r\n get isLastPage() {\r\n return this.#isLastPage;\r\n }\r\n set isLastPage(value: boolean) {\r\n this.#isLastPage = value;\r\n }\r\n checkEmptyListState() {\r\n if (this.#isListEmpty) {\r\n this.elements?.emptyListWrapper.classList.add('--show');\r\n this.elements?.contentWrapper.classList.remove('--show');\r\n\r\n } else {\r\n this.elements?.contentWrapper.classList.add('--show');\r\n this.elements?.emptyListWrapper.classList.remove('--show');\r\n\r\n }\r\n }\r\n connectedCallback() {\r\n // standard web component event that called when all of dom is bounded\r\n this.callOnLoadEvent();\r\n this.initProp();\r\n this.callOnInitEvent();\r\n\r\n }\r\n callOnLoadEvent() {\r\n const event = new CustomEvent('load', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n callOnInitEvent() {\r\n const event = new CustomEvent('init', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n initWebComponent() {\r\n const shadowRoot = this.attachShadow({\r\n mode: 'open'\r\n });\r\n const html = `<style>${CSS}</style>` + '\\n' + HTML;\r\n const element = document.createElement('template');\r\n element.innerHTML = html;\r\n shadowRoot.appendChild(element.content.cloneNode(true));\r\n this.elements = {\r\n loading: shadowRoot.querySelector('.loading-wrapper')!,\r\n componentWrapper: shadowRoot.querySelector('.Infinite-scroll-component')!,\r\n contentWrapper: shadowRoot.querySelector('.content-wrapper')!,\r\n loadingWrapper: shadowRoot.querySelector('.loading-wrapper')!,\r\n emptyListWrapper: shadowRoot.querySelector('.empty-list-wrapper')!,\r\n };\r\n\r\n }\r\n registerEventListener() {\r\n this.elements.contentWrapper.addEventListener('scroll', this.onScroll.bind(this), { passive: true });\r\n }\r\n initProp() {\r\n this.registerEventListener();\r\n this.checkScrollHeight();\r\n }\r\n checkScrollHeight() {\r\n //check if our container is bigger than our content we call scroll end event\r\n const { scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollHeight <= clientHeight && this.canCaptureScroll) {\r\n this.onScrollEnd();\r\n }\r\n }\r\n onScrollEnd() { \r\n this.setIsWaitingForStatChange(true);\r\n const event = new CustomEvent('scrollEnd');\r\n this.dispatchEvent(event);\r\n }\r\n onScroll() {\r\n const { scrollTop, scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollTop + clientHeight + this.#endPageGap >= scrollHeight) {\r\n if (this.canCaptureScroll) {\r\n this.onScrollEnd();\r\n }\r\n }\r\n }\r\n setIsWaitingForStatChange(isWaitingStatus: boolean) {\r\n\r\n if (isWaitingStatus) {\r\n if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.forceWait) {\r\n this.#isWaitingForStateChange = true;\r\n } else if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.noWait) {\r\n return;\r\n }\r\n }\r\n this.#isWaitingForStateChange = false;\r\n\r\n\r\n\r\n }\r\n get canCaptureScroll() {\r\n if (!(this.#isLoading || this.#isListEmpty || this.#isListEnded || this.#isWaitingForStateChange || this.#disableCaptureScroll)) {\r\n return true;\r\n\r\n }\r\n return false;\r\n }\r\n\r\n static get observedAttributes() {\r\n return ['is-loading', 'is-list-empty', 'is-list-ended', 'disable-capture-scroll', 'state-change-waiting-behavior'];\r\n }\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n // do something when an attribute has changed\r\n this.onAttributeChange(name, newValue);\r\n }\r\n onAttributeChange(name: string, value: string) {\r\n switch (name) {\r\n case 'is-loading':\r\n if (value === 'true') {\r\n this.isLoading = true;\r\n } else {\r\n this.isLoading = false;\r\n }\r\n break;\r\n case 'is-list-empty':\r\n if (value === 'true') {\r\n this.isListEmpty = true;\r\n } else {\r\n this.isListEmpty = false;\r\n\r\n }\r\n break;\r\n case 'is-list-ended':\r\n if (value === 'true') {\r\n this.#isListEnded = true;\r\n } else {\r\n this.#isListEnded = false;\r\n\r\n }\r\n break;\r\n\r\n case 'disable-capture-scroll':\r\n if (value === 'true') {\r\n this.#disableCaptureScroll = true;\r\n } else {\r\n this.#disableCaptureScroll = false;\r\n\r\n }\r\n break;\r\n case 'state-change-waiting-behavior':\r\n this.#stateChangeWaitingBehavior = this.mapStateChangeWaitingBehavior(value);\r\n break;\r\n\r\n\r\n }\r\n\r\n }\r\n}\r\nconst myElementNotExists = !customElements.get('jb-infinite-scroll');\r\nif (myElementNotExists) {\r\n window.customElements.define('jb-infinite-scroll', JBInfiniteScrollWebComponent);\r\n}\r\n"],"names":["StateChangeWaitingBehavior","JBInfiniteScrollWebComponent","HTMLElement","constructor","super","_JBInfiniteScrollWebComponent_isLoading","set","this","_JBInfiniteScrollWebComponent_endPageGap","_JBInfiniteScrollWebComponent_isLastPage","_JBInfiniteScrollWebComponent_isListEnded","_JBInfiniteScrollWebComponent_isWaitingForStateChange","_JBInfiniteScrollWebComponent_disableCaptureScroll","_JBInfiniteScrollWebComponent_isListEmpty","_JBInfiniteScrollWebComponent_stateChangeWaitingBehavior","forceWait","initWebComponent","mapStateChangeWaitingBehavior","state","noWait","stateChangeWaitingBehavior","value","__classPrivateFieldSet","__classPrivateFieldGet","disableCaptureScroll","setIsWaitingForStatChange","isListEnded","isLoading","elements","loading","classList","add","remove","checkEmptyListState","checkScrollHeight","isListEmpty","isLastPage","emptyListWrapper","contentWrapper","connectedCallback","callOnLoadEvent","initProp","callOnInitEvent","event","CustomEvent","bubbles","composed","dispatchEvent","shadowRoot","attachShadow","mode","element","document","createElement","innerHTML","appendChild","content","cloneNode","querySelector","componentWrapper","loadingWrapper","registerEventListener","addEventListener","onScroll","bind","passive","scrollHeight","clientHeight","canCaptureScroll","onScrollEnd","scrollTop","isWaitingStatus","observedAttributes","attributeChangedCallback","name","oldValue","newValue","onAttributeChange","customElements","get","window","define"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jb-infinite-scroll.js","sources":["../lib/types.ts","../lib/jb-infinite-scroll.ts"],"sourcesContent":["export type Elements = {\r\n loading: HTMLDivElement,\r\n contentWrapper: HTMLDivElement,\r\n componentWrapper: HTMLDivElement,\r\n emptyListWrapper: HTMLDivElement,\r\n loadingWrapper: HTMLDivElement,\r\n}\r\n\r\nexport enum StateChangeWaitingBehavior {\r\n // when user scroll we lock event call and wait for user to change isLoading (good for React or any other ui framework solution)\r\n forceWait = \"FORCE_WAIT\",\r\n // when user scroll we dont lock its event listener and developer should handle extra scroll by it self (good for pure js solution)\r\n noWait = \"NO_WAIT\",\r\n}","import HTML from './jb-infinite-scroll.html';\r\nimport CSS from './jb-infinite-scroll.scss';\r\nimport { Elements, StateChangeWaitingBehavior } from './types.js';\r\nimport \"jb-loading\";\r\n\r\nexport * from \"./types.js\";\r\n\r\nexport class JBInfiniteScrollWebComponent extends HTMLElement {\r\n elements!: Elements;\r\n #isLoading = false;\r\n //the amount of space that we listen to for trigger refresh \r\n #endPageGap = 0;\r\n\r\n #isListEnded = false;\r\n //used when user scroll and we dont want to capture multiple scroll at one and wait for prev scroll event to finish\r\n #isWaitingForStateChange = false;\r\n #disableCaptureScroll = false;\r\n // if user set empty state from outside (change to manual mode)\r\n #externalIsListEmpty: boolean | null = null;\r\n #internals: ElementInternals;\r\n get #isListEmpty() {\r\n if (this.#externalIsListEmpty !== null) {\r\n return this.#externalIsListEmpty;\r\n }\r\n }\r\n #stateChangeWaitingBehavior: StateChangeWaitingBehavior = StateChangeWaitingBehavior.forceWait;\r\n\r\n constructor() {\r\n super();\r\n if (typeof this.attachInternals == \"function\") {\r\n //some browser dont support attachInternals\r\n this.#internals = this.attachInternals();\r\n }\r\n this.#initWebComponent();\r\n }\r\n #mapStateChangeWaitingBehavior(state: string) {\r\n switch (state) {\r\n case \"FORCE_WAIT\":\r\n return StateChangeWaitingBehavior.forceWait;\r\n case \"NO_WAIT\":\r\n return StateChangeWaitingBehavior.noWait;\r\n\r\n default:\r\n return StateChangeWaitingBehavior.forceWait;\r\n\r\n }\r\n\r\n }\r\n set stateChangeWaitingBehavior(value: string) {\r\n this.#stateChangeWaitingBehavior = this.#mapStateChangeWaitingBehavior(value);\r\n }\r\n get stateChangeWaitingBehavior() {\r\n return this.#stateChangeWaitingBehavior;\r\n }\r\n get disableCaptureScroll() {\r\n return this.#disableCaptureScroll;\r\n }\r\n\r\n set disableCaptureScroll(value: boolean) {\r\n this.#disableCaptureScroll = value;\r\n this.#setIsWaitingForStatChange(false);\r\n }\r\n get isListEnded() {\r\n return this.#isListEnded;\r\n }\r\n set isListEnded(value: boolean) {\r\n this.#isListEnded = value;\r\n this.#setIsWaitingForStatChange(false);\r\n\r\n }\r\n get isLoading() {\r\n return this.#isLoading;\r\n }\r\n set isLoading(value: boolean) {\r\n this.#isLoading = value;\r\n this.#setIsWaitingForStatChange(false);\r\n if (value) {\r\n this.elements?.loading.classList.add('--show');\r\n (this.#internals as any).states?.add(\"loading\");\r\n } else {\r\n this.elements?.loading.classList.remove('--show');\r\n (this.#internals as any).states?.delete(\"loading\");\r\n this.#checkEmptyListState();\r\n this.#checkScrollHeight();\r\n }\r\n }\r\n get isListEmpty() {\r\n return this.#externalIsListEmpty;\r\n }\r\n set isListEmpty(value: boolean) {\r\n this.#externalIsListEmpty = value;\r\n if(value){\r\n (this.#internals as any).states?.add(\"empty\");\r\n }else{\r\n (this.#internals as any).states?.delete(\"empty\");\r\n }\r\n this.#setIsWaitingForStatChange(false);\r\n this.#checkEmptyListState();\r\n\r\n }\r\n #checkEmptyListState() {\r\n if (this.#isListEmpty) {\r\n this.elements?.emptyListWrapper.classList.add('--show');\r\n this.elements?.contentWrapper.classList.remove('--show');\r\n\r\n } else {\r\n this.elements?.contentWrapper.classList.add('--show');\r\n this.elements?.emptyListWrapper.classList.remove('--show');\r\n\r\n }\r\n }\r\n connectedCallback() {\r\n // standard web component event that called when all of dom is bounded\r\n this.callOnLoadEvent();\r\n this.#initProp();\r\n this.callOnInitEvent();\r\n\r\n }\r\n callOnLoadEvent() {\r\n const event = new CustomEvent('load', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n callOnInitEvent() {\r\n const event = new CustomEvent('init', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n #initWebComponent() {\r\n const shadowRoot = this.attachShadow({\r\n mode: 'open'\r\n });\r\n const html = `<style>${CSS}</style>` + '\\n' + HTML;\r\n const element = document.createElement('template');\r\n element.innerHTML = html;\r\n shadowRoot.appendChild(element.content.cloneNode(true));\r\n this.elements = {\r\n loading: shadowRoot.querySelector('.loading-wrapper')!,\r\n componentWrapper: shadowRoot.querySelector('.Infinite-scroll-component')!,\r\n contentWrapper: shadowRoot.querySelector('.content-wrapper')!,\r\n loadingWrapper: shadowRoot.querySelector('.loading-wrapper')!,\r\n emptyListWrapper: shadowRoot.querySelector('.empty-list-wrapper')!,\r\n } as const;\r\n\r\n }\r\n #registerEventListener() {\r\n this.elements.contentWrapper.addEventListener('scroll', this.#onScroll.bind(this), { passive: true });\r\n }\r\n #initProp() {\r\n this.#registerEventListener();\r\n this.#checkScrollHeight();\r\n }\r\n #checkScrollHeight() {\r\n //check if our container is bigger than our content we call scroll end event\r\n const { scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollHeight <= clientHeight && this.canCaptureScroll) {\r\n this.#onScrollEnd();\r\n }\r\n }\r\n #onScrollEnd() {\r\n this.#setIsWaitingForStatChange(true);\r\n const event = new CustomEvent('scrollEnd');\r\n this.dispatchEvent(event);\r\n }\r\n #onScroll() {\r\n const { scrollTop, scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollTop + clientHeight + this.#endPageGap >= scrollHeight) {\r\n if (this.canCaptureScroll) {\r\n this.#onScrollEnd();\r\n }\r\n }\r\n }\r\n #setIsWaitingForStatChange(isWaitingStatus: boolean) {\r\n\r\n if (isWaitingStatus) {\r\n if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.forceWait) {\r\n this.#isWaitingForStateChange = true;\r\n } else if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.noWait) {\r\n return;\r\n }\r\n }\r\n this.#isWaitingForStateChange = false;\r\n\r\n\r\n\r\n }\r\n get canCaptureScroll() {\r\n if (!(this.#isLoading || this.#isListEmpty || this.#isListEnded || this.#isWaitingForStateChange || this.#disableCaptureScroll)) {\r\n return true;\r\n\r\n }\r\n return false;\r\n }\r\n\r\n static get observedAttributes() {\r\n return ['is-loading', 'is-list-empty', 'is-list-ended', 'disable-capture-scroll', 'state-change-waiting-behavior'];\r\n }\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n // do something when an attribute has changed\r\n this.#onAttributeChange(name, newValue);\r\n }\r\n #onAttributeChange(name: string, value: string) {\r\n switch (name) {\r\n case 'is-loading':\r\n if (value === 'true') {\r\n this.isLoading = true;\r\n } else {\r\n this.isLoading = false;\r\n }\r\n break;\r\n case 'is-list-empty':\r\n if (value === 'true') {\r\n this.isListEmpty = true;\r\n } else {\r\n this.isListEmpty = false;\r\n\r\n }\r\n break;\r\n case 'is-list-ended':\r\n if (value === 'true') {\r\n this.#isListEnded = true;\r\n } else {\r\n this.#isListEnded = false;\r\n\r\n }\r\n break;\r\n\r\n case 'disable-capture-scroll':\r\n if (value === 'true') {\r\n this.#disableCaptureScroll = true;\r\n } else {\r\n this.#disableCaptureScroll = false;\r\n\r\n }\r\n break;\r\n case 'state-change-waiting-behavior':\r\n this.#stateChangeWaitingBehavior = this.#mapStateChangeWaitingBehavior(value);\r\n break;\r\n\r\n\r\n }\r\n\r\n }\r\n}\r\nconst myElementNotExists = !customElements.get('jb-infinite-scroll');\r\nif (myElementNotExists) {\r\n window.customElements.define('jb-infinite-scroll', JBInfiniteScrollWebComponent);\r\n}\r\n"],"names":["StateChangeWaitingBehavior","JBInfiniteScrollWebComponent","HTMLElement","constructor","super","_JBInfiniteScrollWebComponent_isLoading","set","this","_JBInfiniteScrollWebComponent_endPageGap","_JBInfiniteScrollWebComponent_isListEnded","_JBInfiniteScrollWebComponent_isWaitingForStateChange","_JBInfiniteScrollWebComponent_disableCaptureScroll","_JBInfiniteScrollWebComponent_externalIsListEmpty","_JBInfiniteScrollWebComponent_internals","_JBInfiniteScrollWebComponent_stateChangeWaitingBehavior","forceWait","attachInternals","__classPrivateFieldSet","__classPrivateFieldGet","_JBInfiniteScrollWebComponent_instances","_JBInfiniteScrollWebComponent_initWebComponent","call","stateChangeWaitingBehavior","value","_JBInfiniteScrollWebComponent_mapStateChangeWaitingBehavior","disableCaptureScroll","_JBInfiniteScrollWebComponent_setIsWaitingForStatChange","isListEnded","isLoading","elements","loading","classList","add","states","remove","delete","_JBInfiniteScrollWebComponent_checkEmptyListState","_JBInfiniteScrollWebComponent_checkScrollHeight","isListEmpty","connectedCallback","callOnLoadEvent","_JBInfiniteScrollWebComponent_initProp","callOnInitEvent","event","CustomEvent","bubbles","composed","dispatchEvent","canCaptureScroll","_JBInfiniteScrollWebComponent_isListEmpty_get","observedAttributes","attributeChangedCallback","name","oldValue","newValue","state","noWait","emptyListWrapper","contentWrapper","shadowRoot","attachShadow","mode","element","document","createElement","innerHTML","appendChild","content","cloneNode","querySelector","componentWrapper","loadingWrapper","_JBInfiniteScrollWebComponent_registerEventListener","addEventListener","_JBInfiniteScrollWebComponent_onScroll","bind","passive","scrollHeight","clientHeight","_JBInfiniteScrollWebComponent_onScrollEnd","scrollTop","isWaitingStatus","_JBInfiniteScrollWebComponent_onAttributeChange","customElements","get","window","define"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jb-loading")):"function"==typeof define&&define.amd?define(["exports","jb-loading"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).JBInfiniteScroll={})}(this,(function(t){"use strict";function e(t,e,n,i){if("a"===n&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!i:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?i:"a"===n?i.call(t):i?i.value:e.get(t)}function n(t,e,n,i,s){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!s)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?s.call(t,n):s?s.value=n:e.set(t,n),n}"function"==typeof SuppressedError&&SuppressedError;var i,s,a,r,
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jb-loading")):"function"==typeof define&&define.amd?define(["exports","jb-loading"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).JBInfiniteScroll={})}(this,(function(t){"use strict";function e(t,e,n,i){if("a"===n&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!i:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?i:"a"===n?i.call(t):i?i.value:e.get(t)}function n(t,e,n,i,s){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!s)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?s.call(t,n):s?s.value=n:e.set(t,n),n}"function"==typeof SuppressedError&&SuppressedError;var i,s,a,o,r,l,c,h,p,d,f,m,u,g,w,v,y,b,W,E,C;t.StateChangeWaitingBehavior=void 0,(i=t.StateChangeWaitingBehavior||(t.StateChangeWaitingBehavior={})).forceWait="FORCE_WAIT",i.noWait="NO_WAIT";class S extends HTMLElement{constructor(){super(),s.add(this),a.set(this,!1),o.set(this,0),r.set(this,!1),l.set(this,!1),c.set(this,!1),h.set(this,null),p.set(this,void 0),f.set(this,t.StateChangeWaitingBehavior.forceWait),"function"==typeof this.attachInternals&&n(this,p,this.attachInternals(),"f"),e(this,s,"m",g).call(this)}set stateChangeWaitingBehavior(t){n(this,f,e(this,s,"m",m).call(this,t),"f")}get stateChangeWaitingBehavior(){return e(this,f,"f")}get disableCaptureScroll(){return e(this,c,"f")}set disableCaptureScroll(t){n(this,c,t,"f"),e(this,s,"m",E).call(this,!1)}get isListEnded(){return e(this,r,"f")}set isListEnded(t){n(this,r,t,"f"),e(this,s,"m",E).call(this,!1)}get isLoading(){return e(this,a,"f")}set isLoading(t){n(this,a,t,"f"),e(this,s,"m",E).call(this,!1),t?(this.elements?.loading.classList.add("--show"),e(this,p,"f").states?.add("loading")):(this.elements?.loading.classList.remove("--show"),e(this,p,"f").states?.delete("loading"),e(this,s,"m",u).call(this),e(this,s,"m",y).call(this))}get isListEmpty(){return e(this,h,"f")}set isListEmpty(t){n(this,h,t,"f"),t?e(this,p,"f").states?.add("empty"):e(this,p,"f").states?.delete("empty"),e(this,s,"m",E).call(this,!1),e(this,s,"m",u).call(this)}connectedCallback(){this.callOnLoadEvent(),e(this,s,"m",v).call(this),this.callOnInitEvent()}callOnLoadEvent(){const t=new CustomEvent("load",{bubbles:!0,composed:!0});this.dispatchEvent(t)}callOnInitEvent(){const t=new CustomEvent("init",{bubbles:!0,composed:!0});this.dispatchEvent(t)}get canCaptureScroll(){return!(e(this,a,"f")||e(this,s,"a",d)||e(this,r,"f")||e(this,l,"f")||e(this,c,"f"))}static get observedAttributes(){return["is-loading","is-list-empty","is-list-ended","disable-capture-scroll","state-change-waiting-behavior"]}attributeChangedCallback(t,n,i){e(this,s,"m",C).call(this,t,i)}}a=new WeakMap,o=new WeakMap,r=new WeakMap,l=new WeakMap,c=new WeakMap,h=new WeakMap,p=new WeakMap,f=new WeakMap,s=new WeakSet,d=function(){if(null!==e(this,h,"f"))return e(this,h,"f")},m=function(e){switch(e){case"FORCE_WAIT":default:return t.StateChangeWaitingBehavior.forceWait;case"NO_WAIT":return t.StateChangeWaitingBehavior.noWait}},u=function(){e(this,s,"a",d)?(this.elements?.emptyListWrapper.classList.add("--show"),this.elements?.contentWrapper.classList.remove("--show")):(this.elements?.contentWrapper.classList.add("--show"),this.elements?.emptyListWrapper.classList.remove("--show"))},g=function(){const t=this.attachShadow({mode:"open"}),e=document.createElement("template");e.innerHTML='<style>:host {\n width: 100%;\n height: 100%;\n display: block;\n}\n\n.infinite-scroll-component {\n height: 100%;\n}\n.infinite-scroll-component .content-wrapper {\n width: 100%;\n height: 100%;\n display: none;\n overflow: auto;\n}\n.infinite-scroll-component .content-wrapper.--show {\n display: block;\n}\n.infinite-scroll-component .content-wrapper ::slotted([slot=content]) {\n height: auto;\n}\n.infinite-scroll-component .loading-wrapper {\n display: none;\n}\n.infinite-scroll-component .loading-wrapper .default-loading {\n width: 40px;\n height: 40px;\n margin: 0 auto;\n}\n.infinite-scroll-component .loading-wrapper.--show {\n display: block;\n}\n.infinite-scroll-component .empty-list-wrapper {\n width: 100%;\n height: 100%;\n display: none;\n}\n.infinite-scroll-component .empty-list-wrapper.--show {\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.infinite-scroll-component .empty-list-wrapper ::slotted([slot=empty]) {\n height: 100%;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n max-height: 100%;\n overflow-y: hidden;\n background-color: transparent;\n padding: 1rem;\n box-sizing: border-box;\n}</style>\n<div class="infinite-scroll-component">\r\n <div class="content-wrapper" part="content-wrapper">\r\n <slot name="content"></slot>\r\n <div class="loading-wrapper" part="loading-wrapper">\r\n <slot name="loading">\r\n <div class="default-loading">\r\n <jb-loading part="default-loading"></jb-loading>\r\n </div>\r\n </slot>\r\n </div>\r\n </div>\r\n <div class="empty-list-wrapper" part="empty-list-wrapper">\r\n <slot name="empty">\r\n </slot>\r\n </div>\r\n \r\n</div>',t.appendChild(e.content.cloneNode(!0)),this.elements={loading:t.querySelector(".loading-wrapper"),componentWrapper:t.querySelector(".Infinite-scroll-component"),contentWrapper:t.querySelector(".content-wrapper"),loadingWrapper:t.querySelector(".loading-wrapper"),emptyListWrapper:t.querySelector(".empty-list-wrapper")}},w=function(){this.elements.contentWrapper.addEventListener("scroll",e(this,s,"m",W).bind(this),{passive:!0})},v=function(){e(this,s,"m",w).call(this),e(this,s,"m",y).call(this)},y=function(){const{scrollHeight:t,clientHeight:n}=this.elements.contentWrapper;t<=n&&this.canCaptureScroll&&e(this,s,"m",b).call(this)},b=function(){e(this,s,"m",E).call(this,!0);const t=new CustomEvent("scrollEnd");this.dispatchEvent(t)},W=function(){const{scrollTop:t,scrollHeight:n,clientHeight:i}=this.elements.contentWrapper;t+i+e(this,o,"f")>=n&&this.canCaptureScroll&&e(this,s,"m",b).call(this)},E=function(i){if(i)if(e(this,f,"f")===t.StateChangeWaitingBehavior.forceWait)n(this,l,!0,"f");else if(e(this,f,"f")===t.StateChangeWaitingBehavior.noWait)return;n(this,l,!1,"f")},C=function(t,i){switch(t){case"is-loading":this.isLoading="true"===i;break;case"is-list-empty":this.isListEmpty="true"===i;break;case"is-list-ended":n(this,r,"true"===i,"f");break;case"disable-capture-scroll":n(this,c,"true"===i,"f");break;case"state-change-waiting-behavior":n(this,f,e(this,s,"m",m).call(this,i),"f")}};!customElements.get("jb-infinite-scroll")&&window.customElements.define("jb-infinite-scroll",S),t.JBInfiniteScrollWebComponent=S}));
|
|
2
2
|
//# sourceMappingURL=jb-infinite-scroll.umd.js.map
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jb-infinite-scroll.umd.js","sources":["../lib/types.ts","../lib/jb-infinite-scroll.ts"],"sourcesContent":["export type Elements = {\r\n loading: HTMLDivElement,\r\n contentWrapper: HTMLDivElement,\r\n componentWrapper: HTMLDivElement,\r\n emptyListWrapper: HTMLDivElement,\r\n loadingWrapper: HTMLDivElement,\r\n}\r\n\r\nexport enum StateChangeWaitingBehavior {\r\n // when user scroll we lock event call and wait for user to change isLoading (good for React or any other ui framework solution)\r\n forceWait = \"FORCE_WAIT\",\r\n // when user scroll we dont lock its event listener and developer should handle extra scroll by it self (good for pure js solution)\r\n noWait = \"NO_WAIT\",\r\n}","import HTML from './jb-infinite-scroll.html';\r\nimport CSS from './jb-infinite-scroll.scss';\r\nimport { Elements, StateChangeWaitingBehavior } from './types.js';\r\nimport \"jb-loading\";\r\n\r\nexport * from \"./types.js\";\r\n\r\nexport class JBInfiniteScrollWebComponent extends HTMLElement {\r\n elements!: Elements;\r\n #isLoading = false;\r\n //the amount of space that we listen to for trigger refresh \r\n #endPageGap = 0;\r\n #isLastPage = false;\r\n\r\n #isListEnded = false;\r\n //used when user scroll and we dont want to capture multiple scroll at one and wait for prev scroll event to finish\r\n #isWaitingForStateChange = false;\r\n #disableCaptureScroll = false;\r\n #isListEmpty = false;\r\n #stateChangeWaitingBehavior: StateChangeWaitingBehavior = StateChangeWaitingBehavior.forceWait;\r\n\r\n\r\n constructor() {\r\n super();\r\n this.initWebComponent();\r\n }\r\n mapStateChangeWaitingBehavior(state: string) {\r\n switch (state) {\r\n case \"FORCE_WAIT\":\r\n return StateChangeWaitingBehavior.forceWait;\r\n case \"NO_WAIT\":\r\n return StateChangeWaitingBehavior.noWait;\r\n\r\n default:\r\n return StateChangeWaitingBehavior.forceWait;\r\n\r\n }\r\n\r\n }\r\n set stateChangeWaitingBehavior(value: string) {\r\n this.#stateChangeWaitingBehavior = this.mapStateChangeWaitingBehavior(value);\r\n }\r\n get stateChangeWaitingBehavior() {\r\n return this.#stateChangeWaitingBehavior;\r\n }\r\n get disableCaptureScroll() {\r\n return this.#disableCaptureScroll;\r\n }\r\n\r\n set disableCaptureScroll(value: boolean) {\r\n this.#disableCaptureScroll = value;\r\n this.setIsWaitingForStatChange(false);\r\n }\r\n get isListEnded() {\r\n return this.#isListEnded;\r\n }\r\n set isListEnded(value: boolean) {\r\n this.#isListEnded = value;\r\n this.setIsWaitingForStatChange(false);\r\n\r\n }\r\n get isLoading() {\r\n return this.#isLoading;\r\n }\r\n set isLoading(value: boolean) {\r\n this.#isLoading = value;\r\n this.setIsWaitingForStatChange(false);\r\n if (value) {\r\n this.elements?.loading.classList.add('--show');\r\n } else {\r\n this.elements?.loading.classList.remove('--show');\r\n this.checkEmptyListState();\r\n this.checkScrollHeight();\r\n }\r\n }\r\n get isListEmpty() {\r\n return this.#isListEmpty;\r\n }\r\n set isListEmpty(value: boolean) {\r\n this.#isListEmpty = value;\r\n this.setIsWaitingForStatChange(false);\r\n\r\n\r\n }\r\n get isLastPage() {\r\n return this.#isLastPage;\r\n }\r\n set isLastPage(value: boolean) {\r\n this.#isLastPage = value;\r\n }\r\n checkEmptyListState() {\r\n if (this.#isListEmpty) {\r\n this.elements?.emptyListWrapper.classList.add('--show');\r\n this.elements?.contentWrapper.classList.remove('--show');\r\n\r\n } else {\r\n this.elements?.contentWrapper.classList.add('--show');\r\n this.elements?.emptyListWrapper.classList.remove('--show');\r\n\r\n }\r\n }\r\n connectedCallback() {\r\n // standard web component event that called when all of dom is bounded\r\n this.callOnLoadEvent();\r\n this.initProp();\r\n this.callOnInitEvent();\r\n\r\n }\r\n callOnLoadEvent() {\r\n const event = new CustomEvent('load', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n callOnInitEvent() {\r\n const event = new CustomEvent('init', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n initWebComponent() {\r\n const shadowRoot = this.attachShadow({\r\n mode: 'open'\r\n });\r\n const html = `<style>${CSS}</style>` + '\\n' + HTML;\r\n const element = document.createElement('template');\r\n element.innerHTML = html;\r\n shadowRoot.appendChild(element.content.cloneNode(true));\r\n this.elements = {\r\n loading: shadowRoot.querySelector('.loading-wrapper')!,\r\n componentWrapper: shadowRoot.querySelector('.Infinite-scroll-component')!,\r\n contentWrapper: shadowRoot.querySelector('.content-wrapper')!,\r\n loadingWrapper: shadowRoot.querySelector('.loading-wrapper')!,\r\n emptyListWrapper: shadowRoot.querySelector('.empty-list-wrapper')!,\r\n };\r\n\r\n }\r\n registerEventListener() {\r\n this.elements.contentWrapper.addEventListener('scroll', this.onScroll.bind(this), { passive: true });\r\n }\r\n initProp() {\r\n this.registerEventListener();\r\n this.checkScrollHeight();\r\n }\r\n checkScrollHeight() {\r\n //check if our container is bigger than our content we call scroll end event\r\n const { scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollHeight <= clientHeight && this.canCaptureScroll) {\r\n this.onScrollEnd();\r\n }\r\n }\r\n onScrollEnd() { \r\n this.setIsWaitingForStatChange(true);\r\n const event = new CustomEvent('scrollEnd');\r\n this.dispatchEvent(event);\r\n }\r\n onScroll() {\r\n const { scrollTop, scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollTop + clientHeight + this.#endPageGap >= scrollHeight) {\r\n if (this.canCaptureScroll) {\r\n this.onScrollEnd();\r\n }\r\n }\r\n }\r\n setIsWaitingForStatChange(isWaitingStatus: boolean) {\r\n\r\n if (isWaitingStatus) {\r\n if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.forceWait) {\r\n this.#isWaitingForStateChange = true;\r\n } else if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.noWait) {\r\n return;\r\n }\r\n }\r\n this.#isWaitingForStateChange = false;\r\n\r\n\r\n\r\n }\r\n get canCaptureScroll() {\r\n if (!(this.#isLoading || this.#isListEmpty || this.#isListEnded || this.#isWaitingForStateChange || this.#disableCaptureScroll)) {\r\n return true;\r\n\r\n }\r\n return false;\r\n }\r\n\r\n static get observedAttributes() {\r\n return ['is-loading', 'is-list-empty', 'is-list-ended', 'disable-capture-scroll', 'state-change-waiting-behavior'];\r\n }\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n // do something when an attribute has changed\r\n this.onAttributeChange(name, newValue);\r\n }\r\n onAttributeChange(name: string, value: string) {\r\n switch (name) {\r\n case 'is-loading':\r\n if (value === 'true') {\r\n this.isLoading = true;\r\n } else {\r\n this.isLoading = false;\r\n }\r\n break;\r\n case 'is-list-empty':\r\n if (value === 'true') {\r\n this.isListEmpty = true;\r\n } else {\r\n this.isListEmpty = false;\r\n\r\n }\r\n break;\r\n case 'is-list-ended':\r\n if (value === 'true') {\r\n this.#isListEnded = true;\r\n } else {\r\n this.#isListEnded = false;\r\n\r\n }\r\n break;\r\n\r\n case 'disable-capture-scroll':\r\n if (value === 'true') {\r\n this.#disableCaptureScroll = true;\r\n } else {\r\n this.#disableCaptureScroll = false;\r\n\r\n }\r\n break;\r\n case 'state-change-waiting-behavior':\r\n this.#stateChangeWaitingBehavior = this.mapStateChangeWaitingBehavior(value);\r\n break;\r\n\r\n\r\n }\r\n\r\n }\r\n}\r\nconst myElementNotExists = !customElements.get('jb-infinite-scroll');\r\nif (myElementNotExists) {\r\n window.customElements.define('jb-infinite-scroll', JBInfiniteScrollWebComponent);\r\n}\r\n"],"names":["StateChangeWaitingBehavior","exports","JBInfiniteScrollWebComponent","HTMLElement","constructor","super","_JBInfiniteScrollWebComponent_isLoading","set","this","_JBInfiniteScrollWebComponent_endPageGap","_JBInfiniteScrollWebComponent_isLastPage","_JBInfiniteScrollWebComponent_isListEnded","_JBInfiniteScrollWebComponent_isWaitingForStateChange","_JBInfiniteScrollWebComponent_disableCaptureScroll","_JBInfiniteScrollWebComponent_isListEmpty","_JBInfiniteScrollWebComponent_stateChangeWaitingBehavior","forceWait","initWebComponent","mapStateChangeWaitingBehavior","state","noWait","stateChangeWaitingBehavior","value","__classPrivateFieldSet","__classPrivateFieldGet","disableCaptureScroll","setIsWaitingForStatChange","isListEnded","isLoading","elements","loading","classList","add","remove","checkEmptyListState","checkScrollHeight","isListEmpty","isLastPage","emptyListWrapper","contentWrapper","connectedCallback","callOnLoadEvent","initProp","callOnInitEvent","event","CustomEvent","bubbles","composed","dispatchEvent","shadowRoot","attachShadow","mode","element","document","createElement","innerHTML","appendChild","content","cloneNode","querySelector","componentWrapper","loadingWrapper","registerEventListener","addEventListener","onScroll","bind","passive","scrollHeight","clientHeight","canCaptureScroll","onScrollEnd","scrollTop","isWaitingStatus","observedAttributes","attributeChangedCallback","name","oldValue","newValue","onAttributeChange","customElements","get","window","define"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jb-infinite-scroll.umd.js","sources":["../lib/types.ts","../lib/jb-infinite-scroll.ts"],"sourcesContent":["export type Elements = {\r\n loading: HTMLDivElement,\r\n contentWrapper: HTMLDivElement,\r\n componentWrapper: HTMLDivElement,\r\n emptyListWrapper: HTMLDivElement,\r\n loadingWrapper: HTMLDivElement,\r\n}\r\n\r\nexport enum StateChangeWaitingBehavior {\r\n // when user scroll we lock event call and wait for user to change isLoading (good for React or any other ui framework solution)\r\n forceWait = \"FORCE_WAIT\",\r\n // when user scroll we dont lock its event listener and developer should handle extra scroll by it self (good for pure js solution)\r\n noWait = \"NO_WAIT\",\r\n}","import HTML from './jb-infinite-scroll.html';\r\nimport CSS from './jb-infinite-scroll.scss';\r\nimport { Elements, StateChangeWaitingBehavior } from './types.js';\r\nimport \"jb-loading\";\r\n\r\nexport * from \"./types.js\";\r\n\r\nexport class JBInfiniteScrollWebComponent extends HTMLElement {\r\n elements!: Elements;\r\n #isLoading = false;\r\n //the amount of space that we listen to for trigger refresh \r\n #endPageGap = 0;\r\n\r\n #isListEnded = false;\r\n //used when user scroll and we dont want to capture multiple scroll at one and wait for prev scroll event to finish\r\n #isWaitingForStateChange = false;\r\n #disableCaptureScroll = false;\r\n // if user set empty state from outside (change to manual mode)\r\n #externalIsListEmpty: boolean | null = null;\r\n #internals: ElementInternals;\r\n get #isListEmpty() {\r\n if (this.#externalIsListEmpty !== null) {\r\n return this.#externalIsListEmpty;\r\n }\r\n }\r\n #stateChangeWaitingBehavior: StateChangeWaitingBehavior = StateChangeWaitingBehavior.forceWait;\r\n\r\n constructor() {\r\n super();\r\n if (typeof this.attachInternals == \"function\") {\r\n //some browser dont support attachInternals\r\n this.#internals = this.attachInternals();\r\n }\r\n this.#initWebComponent();\r\n }\r\n #mapStateChangeWaitingBehavior(state: string) {\r\n switch (state) {\r\n case \"FORCE_WAIT\":\r\n return StateChangeWaitingBehavior.forceWait;\r\n case \"NO_WAIT\":\r\n return StateChangeWaitingBehavior.noWait;\r\n\r\n default:\r\n return StateChangeWaitingBehavior.forceWait;\r\n\r\n }\r\n\r\n }\r\n set stateChangeWaitingBehavior(value: string) {\r\n this.#stateChangeWaitingBehavior = this.#mapStateChangeWaitingBehavior(value);\r\n }\r\n get stateChangeWaitingBehavior() {\r\n return this.#stateChangeWaitingBehavior;\r\n }\r\n get disableCaptureScroll() {\r\n return this.#disableCaptureScroll;\r\n }\r\n\r\n set disableCaptureScroll(value: boolean) {\r\n this.#disableCaptureScroll = value;\r\n this.#setIsWaitingForStatChange(false);\r\n }\r\n get isListEnded() {\r\n return this.#isListEnded;\r\n }\r\n set isListEnded(value: boolean) {\r\n this.#isListEnded = value;\r\n this.#setIsWaitingForStatChange(false);\r\n\r\n }\r\n get isLoading() {\r\n return this.#isLoading;\r\n }\r\n set isLoading(value: boolean) {\r\n this.#isLoading = value;\r\n this.#setIsWaitingForStatChange(false);\r\n if (value) {\r\n this.elements?.loading.classList.add('--show');\r\n (this.#internals as any).states?.add(\"loading\");\r\n } else {\r\n this.elements?.loading.classList.remove('--show');\r\n (this.#internals as any).states?.delete(\"loading\");\r\n this.#checkEmptyListState();\r\n this.#checkScrollHeight();\r\n }\r\n }\r\n get isListEmpty() {\r\n return this.#externalIsListEmpty;\r\n }\r\n set isListEmpty(value: boolean) {\r\n this.#externalIsListEmpty = value;\r\n if(value){\r\n (this.#internals as any).states?.add(\"empty\");\r\n }else{\r\n (this.#internals as any).states?.delete(\"empty\");\r\n }\r\n this.#setIsWaitingForStatChange(false);\r\n this.#checkEmptyListState();\r\n\r\n }\r\n #checkEmptyListState() {\r\n if (this.#isListEmpty) {\r\n this.elements?.emptyListWrapper.classList.add('--show');\r\n this.elements?.contentWrapper.classList.remove('--show');\r\n\r\n } else {\r\n this.elements?.contentWrapper.classList.add('--show');\r\n this.elements?.emptyListWrapper.classList.remove('--show');\r\n\r\n }\r\n }\r\n connectedCallback() {\r\n // standard web component event that called when all of dom is bounded\r\n this.callOnLoadEvent();\r\n this.#initProp();\r\n this.callOnInitEvent();\r\n\r\n }\r\n callOnLoadEvent() {\r\n const event = new CustomEvent('load', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n callOnInitEvent() {\r\n const event = new CustomEvent('init', { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n #initWebComponent() {\r\n const shadowRoot = this.attachShadow({\r\n mode: 'open'\r\n });\r\n const html = `<style>${CSS}</style>` + '\\n' + HTML;\r\n const element = document.createElement('template');\r\n element.innerHTML = html;\r\n shadowRoot.appendChild(element.content.cloneNode(true));\r\n this.elements = {\r\n loading: shadowRoot.querySelector('.loading-wrapper')!,\r\n componentWrapper: shadowRoot.querySelector('.Infinite-scroll-component')!,\r\n contentWrapper: shadowRoot.querySelector('.content-wrapper')!,\r\n loadingWrapper: shadowRoot.querySelector('.loading-wrapper')!,\r\n emptyListWrapper: shadowRoot.querySelector('.empty-list-wrapper')!,\r\n } as const;\r\n\r\n }\r\n #registerEventListener() {\r\n this.elements.contentWrapper.addEventListener('scroll', this.#onScroll.bind(this), { passive: true });\r\n }\r\n #initProp() {\r\n this.#registerEventListener();\r\n this.#checkScrollHeight();\r\n }\r\n #checkScrollHeight() {\r\n //check if our container is bigger than our content we call scroll end event\r\n const { scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollHeight <= clientHeight && this.canCaptureScroll) {\r\n this.#onScrollEnd();\r\n }\r\n }\r\n #onScrollEnd() {\r\n this.#setIsWaitingForStatChange(true);\r\n const event = new CustomEvent('scrollEnd');\r\n this.dispatchEvent(event);\r\n }\r\n #onScroll() {\r\n const { scrollTop, scrollHeight, clientHeight } = this.elements.contentWrapper;\r\n if (scrollTop + clientHeight + this.#endPageGap >= scrollHeight) {\r\n if (this.canCaptureScroll) {\r\n this.#onScrollEnd();\r\n }\r\n }\r\n }\r\n #setIsWaitingForStatChange(isWaitingStatus: boolean) {\r\n\r\n if (isWaitingStatus) {\r\n if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.forceWait) {\r\n this.#isWaitingForStateChange = true;\r\n } else if (this.#stateChangeWaitingBehavior === StateChangeWaitingBehavior.noWait) {\r\n return;\r\n }\r\n }\r\n this.#isWaitingForStateChange = false;\r\n\r\n\r\n\r\n }\r\n get canCaptureScroll() {\r\n if (!(this.#isLoading || this.#isListEmpty || this.#isListEnded || this.#isWaitingForStateChange || this.#disableCaptureScroll)) {\r\n return true;\r\n\r\n }\r\n return false;\r\n }\r\n\r\n static get observedAttributes() {\r\n return ['is-loading', 'is-list-empty', 'is-list-ended', 'disable-capture-scroll', 'state-change-waiting-behavior'];\r\n }\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n // do something when an attribute has changed\r\n this.#onAttributeChange(name, newValue);\r\n }\r\n #onAttributeChange(name: string, value: string) {\r\n switch (name) {\r\n case 'is-loading':\r\n if (value === 'true') {\r\n this.isLoading = true;\r\n } else {\r\n this.isLoading = false;\r\n }\r\n break;\r\n case 'is-list-empty':\r\n if (value === 'true') {\r\n this.isListEmpty = true;\r\n } else {\r\n this.isListEmpty = false;\r\n\r\n }\r\n break;\r\n case 'is-list-ended':\r\n if (value === 'true') {\r\n this.#isListEnded = true;\r\n } else {\r\n this.#isListEnded = false;\r\n\r\n }\r\n break;\r\n\r\n case 'disable-capture-scroll':\r\n if (value === 'true') {\r\n this.#disableCaptureScroll = true;\r\n } else {\r\n this.#disableCaptureScroll = false;\r\n\r\n }\r\n break;\r\n case 'state-change-waiting-behavior':\r\n this.#stateChangeWaitingBehavior = this.#mapStateChangeWaitingBehavior(value);\r\n break;\r\n\r\n\r\n }\r\n\r\n }\r\n}\r\nconst myElementNotExists = !customElements.get('jb-infinite-scroll');\r\nif (myElementNotExists) {\r\n window.customElements.define('jb-infinite-scroll', JBInfiniteScrollWebComponent);\r\n}\r\n"],"names":["StateChangeWaitingBehavior","exports","JBInfiniteScrollWebComponent","HTMLElement","constructor","super","_JBInfiniteScrollWebComponent_isLoading","set","this","_JBInfiniteScrollWebComponent_endPageGap","_JBInfiniteScrollWebComponent_isListEnded","_JBInfiniteScrollWebComponent_isWaitingForStateChange","_JBInfiniteScrollWebComponent_disableCaptureScroll","_JBInfiniteScrollWebComponent_externalIsListEmpty","_JBInfiniteScrollWebComponent_internals","_JBInfiniteScrollWebComponent_stateChangeWaitingBehavior","forceWait","attachInternals","__classPrivateFieldSet","__classPrivateFieldGet","_JBInfiniteScrollWebComponent_instances","_JBInfiniteScrollWebComponent_initWebComponent","call","stateChangeWaitingBehavior","value","_JBInfiniteScrollWebComponent_mapStateChangeWaitingBehavior","disableCaptureScroll","_JBInfiniteScrollWebComponent_setIsWaitingForStatChange","isListEnded","isLoading","elements","loading","classList","add","states","remove","delete","_JBInfiniteScrollWebComponent_checkEmptyListState","_JBInfiniteScrollWebComponent_checkScrollHeight","isListEmpty","connectedCallback","callOnLoadEvent","_JBInfiniteScrollWebComponent_initProp","callOnInitEvent","event","CustomEvent","bubbles","composed","dispatchEvent","canCaptureScroll","_JBInfiniteScrollWebComponent_isListEmpty_get","observedAttributes","attributeChangedCallback","name","oldValue","newValue","state","noWait","emptyListWrapper","contentWrapper","shadowRoot","attachShadow","mode","element","document","createElement","innerHTML","appendChild","content","cloneNode","querySelector","componentWrapper","loadingWrapper","_JBInfiniteScrollWebComponent_registerEventListener","addEventListener","_JBInfiniteScrollWebComponent_onScroll","bind","passive","scrollHeight","clientHeight","_JBInfiniteScrollWebComponent_onScrollEnd","scrollTop","isWaitingStatus","_JBInfiniteScrollWebComponent_onAttributeChange","customElements","get","window","define"],"mappings":"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"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { Elements
|
|
1
|
+
import { Elements } from './types.js';
|
|
2
2
|
import "jb-loading";
|
|
3
3
|
export * from "./types.js";
|
|
4
4
|
export declare class JBInfiniteScrollWebComponent extends HTMLElement {
|
|
5
5
|
#private;
|
|
6
6
|
elements: Elements;
|
|
7
7
|
constructor();
|
|
8
|
-
mapStateChangeWaitingBehavior(state: string): StateChangeWaitingBehavior;
|
|
9
8
|
set stateChangeWaitingBehavior(value: string);
|
|
10
9
|
get stateChangeWaitingBehavior(): string;
|
|
11
10
|
get disableCaptureScroll(): boolean;
|
|
@@ -16,21 +15,10 @@ export declare class JBInfiniteScrollWebComponent extends HTMLElement {
|
|
|
16
15
|
set isLoading(value: boolean);
|
|
17
16
|
get isListEmpty(): boolean;
|
|
18
17
|
set isListEmpty(value: boolean);
|
|
19
|
-
get isLastPage(): boolean;
|
|
20
|
-
set isLastPage(value: boolean);
|
|
21
|
-
checkEmptyListState(): void;
|
|
22
18
|
connectedCallback(): void;
|
|
23
19
|
callOnLoadEvent(): void;
|
|
24
20
|
callOnInitEvent(): void;
|
|
25
|
-
initWebComponent(): void;
|
|
26
|
-
registerEventListener(): void;
|
|
27
|
-
initProp(): void;
|
|
28
|
-
checkScrollHeight(): void;
|
|
29
|
-
onScrollEnd(): void;
|
|
30
|
-
onScroll(): void;
|
|
31
|
-
setIsWaitingForStatChange(isWaitingStatus: boolean): void;
|
|
32
21
|
get canCaptureScroll(): boolean;
|
|
33
22
|
static get observedAttributes(): string[];
|
|
34
23
|
attributeChangedCallback(name: string, oldValue: string, newValue: string): void;
|
|
35
|
-
onAttributeChange(name: string, value: string): void;
|
|
36
24
|
}
|
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
<div class="infinite-scroll-component">
|
|
2
2
|
<div class="content-wrapper" part="content-wrapper">
|
|
3
|
-
<slot name="
|
|
3
|
+
<slot name="content"></slot>
|
|
4
|
+
<div class="loading-wrapper" part="loading-wrapper">
|
|
5
|
+
<slot name="loading">
|
|
6
|
+
<div class="default-loading">
|
|
7
|
+
<jb-loading part="default-loading"></jb-loading>
|
|
8
|
+
</div>
|
|
9
|
+
</slot>
|
|
10
|
+
</div>
|
|
4
11
|
</div>
|
|
5
12
|
<div class="empty-list-wrapper" part="empty-list-wrapper">
|
|
6
|
-
<slot name="empty
|
|
7
|
-
<div class="default-empty-list">
|
|
8
|
-
<p>empty list</p>
|
|
9
|
-
</div>
|
|
10
|
-
</slot>
|
|
11
|
-
</div>
|
|
12
|
-
<div class="loading-wrapper" part="loading-wrapper">
|
|
13
|
-
<slot name="loading-content">
|
|
14
|
-
<div class="default-loading">
|
|
15
|
-
<jb-loading></jb-loading>
|
|
16
|
-
</div>
|
|
13
|
+
<slot name="empty">
|
|
17
14
|
</slot>
|
|
18
15
|
</div>
|
|
16
|
+
|
|
19
17
|
</div>
|