Skip to content

Commit

Permalink
work for #4780 : lazy-loading
Browse files Browse the repository at this point in the history
  • Loading branch information
OlgaLarina committed Oct 10, 2022
1 parent 7da4564 commit 9d260b6
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 30 deletions.
@@ -1,4 +1,4 @@
import { Component, Input } from "@angular/core";
import { AfterViewInit, Component, Input } from "@angular/core";
import { ListModel, Action } from "survey-core";
import { BaseAngular } from "../../base-angular";
import { AngularComponentFactory } from "../../component-factory";
Expand All @@ -9,7 +9,7 @@ import { AngularComponentFactory } from "../../component-factory";
styleUrls: ["../../hide-host.scss"],
})

export class ListItemComponent extends BaseAngular {
export class ListItemComponent extends BaseAngular implements AfterViewInit {
@Input() element: any;
@Input() model!: Action;
@Input() listModel!: ListModel;
Expand All @@ -34,6 +34,10 @@ export class ListItemComponent extends BaseAngular {
getModel() {
return this.model;
}

ngAfterViewInit(): void {
this.listModel.onLastItemRended(this.model);
}
}

AngularComponentFactory.Instance.registerComponent("sv-list-item", ListItemComponent);
32 changes: 15 additions & 17 deletions src/dropdownListModel.ts
Expand Up @@ -112,6 +112,11 @@ export class DropdownListModel extends Base {
}
const res = new ListModel(visibleItems, _onSelectionChanged, true, this.question.selectedItem);
res.locOwner = this.question;
res.onPropertyChanged.add((sender: any, options: any) => {
if (options.name == "hasVerticalScroller") {
this.hasScroll = options.newValue;
}
});
return res;
}
protected resetFilterString(): void {
Expand All @@ -137,6 +142,12 @@ export class DropdownListModel extends Base {
target.onSetFilterString();
}
}) filterString: string;
@property({
defaultValue: false,
onSet: (newVal: boolean, target: DropdownListModel) => {
// addEventListener
}
}) hasScroll: boolean;

constructor(protected question: Question, protected onSelectionChanged?: (item: IAction, ...params: any[]) => void) {
super();
Expand Down Expand Up @@ -220,7 +231,10 @@ export class DropdownListModel extends Base {
doKey2ClickUp(event, { processEsc: false, disableTabStop: this.question.isInputReadOnly });
}
}

onScroll(event: Event):void {
const target = event.target;
// load next items
}
onBlur(event: any): void {
this.resetFilterString();
this._popupModel.isVisible = false;
Expand All @@ -229,21 +243,5 @@ export class DropdownListModel extends Base {
}
scrollToFocusedItem(): void {
this.listModel.scrollToFocusedItem();
// setTimeout(() => {
// let visiblePopup: Element = undefined;
// document.querySelectorAll(".sv-popup").forEach((el) => {
// const style = window.getComputedStyle(el);
// if((style.display !== "none") && (style.visibility !== "hidden")) {
// visiblePopup = el;
// }
// });

// if(!visiblePopup) return;

// const item = visiblePopup.querySelector("." + defaultListCss.itemFocused);
// if(item) {
// item.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "start" });
// }
// }, 0);
}
}
2 changes: 1 addition & 1 deletion src/knockout/components/list/list.html
Expand Up @@ -13,7 +13,7 @@
</div>
<ul role="listbox"
data-bind="css: model.cssClasses.itemsContainer, event: { mousedown: function (data, e) { e.preventDefault(); }, keydown: function(data, e) { $data.model.onKeyDown(event); return true; }, mousemove: function(data, e) { $data.model.onMouseMove(event); return true; } }">
<!--ko foreach: model.renderedActions -->
<!-- ko template: { foreach: model.renderedActions, afterRender: $data.afterItemRender } -->
<!-- ko component: { name: 'sv-list-item', params: { item: $data, model: $parent.model } } -->
<!-- /ko -->
<!-- /ko -->
Expand Down
11 changes: 9 additions & 2 deletions src/knockout/components/list/list.ts
@@ -1,5 +1,5 @@
import * as ko from "knockout";
import { ListModel } from "survey-core";
import { Action, ListModel } from "survey-core";
import { ImplementorBase } from "../../kobase";
import { ActionContainerImplementor } from "../action-bar/action-bar";

Expand All @@ -15,7 +15,14 @@ ko.components.register("sv-list", {
const model: ListModel = params.model;
const _implementor: ImplementorBase = new ActionContainerImplementor(model);
model.initListContainerHtmlElement(componentInfo.element);
return { model: model, dispose: () => { _implementor.dispose(); } };
return {
model: model,
dispose: () => { _implementor.dispose(); },
afterItemRender: (_: any, action: Action) => {
!!ko.tasks && ko.tasks.runEarly();
model.onLastItemRended(action);
}
};
},
},
template: template,
Expand Down
17 changes: 9 additions & 8 deletions src/list.ts
Expand Up @@ -148,6 +148,9 @@ export class ListModel extends ActionContainer {
public get emptyMessage(): string {
return this.getLocalizationString("emptyMessage");
}
public get scrollableContainer(): HTMLElement {
return this.listContainerHtmlElement.querySelector("." + this.getDefaultCssClasses().itemsContainer);
}

public goToItems(event: KeyboardEvent): void {
if (event.key === "ArrowDown" || event.keyCode === 40) {
Expand Down Expand Up @@ -224,21 +227,19 @@ export class ListModel extends ActionContainer {
public initListContainerHtmlElement(htmlElement: HTMLElement): void {
this.listContainerHtmlElement = htmlElement;
}
public onLastItemRended(item: Action): void {
if(item === this.actions[this.actions.length - 1] && !!this.listContainerHtmlElement) {
this.hasVerticalScroller = ElementHelper.hasVerticalScroller(this.scrollableContainer);
}
}
public scrollToFocusedItem(): void {
setTimeout(() => {
if(!this.listContainerHtmlElement) return;

const item = this.listContainerHtmlElement.querySelector("." + defaultListCss.itemFocused);
const item = this.listContainerHtmlElement.querySelector("." + this.getDefaultCssClasses().itemFocused);
if(item) {
item.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "start" });
}
}, 0);
}
public setItems(items: Array<IAction>, sortByVisibleIndex?: boolean): void {
super.setItems(items, sortByVisibleIndex);

if(!!this.listContainerHtmlElement) {
this.hasVerticalScroller = ElementHelper.hasVerticalScroller(this.listContainerHtmlElement);
}
}
}
4 changes: 4 additions & 0 deletions src/react/components/list/list-item.tsx
Expand Up @@ -77,7 +77,11 @@ export class ListItem extends SurveyElementBase<IListItemProps, any> {
</li>
);
}
componentDidMount() {
super.componentDidMount();

this.model.onLastItemRended(this.item);
}
}

ReactElementFactory.Instance.registerElement("sv-list-item", (props) => {
Expand Down
3 changes: 3 additions & 0 deletions src/vue/components/list/list-item.vue
Expand Up @@ -56,6 +56,9 @@ export class ListItem extends BaseVue {
this.model.onItemClick(this.item as any);
event.stopPropagation();
}
protected onMounted() {
this.model.onLastItemRended(<any>this.item);
}
}
Vue.component("sv-list-item", ListItem);
Expand Down

0 comments on commit 9d260b6

Please sign in to comment.