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 6, 2022
1 parent 8e992b2 commit 80c8615
Show file tree
Hide file tree
Showing 9 changed files with 78 additions and 24 deletions.
@@ -1,5 +1,5 @@
<ng-template #template>
<div [class]="model.cssClasses.root">
<div [class]="model.cssClasses.root" #listContainerElement>
<div *ngIf="model.showFilter" [class]="model.cssClasses.filter">
<div [class]="model.cssClasses.filterIcon">
<svg [iconName]="'icon-search'" [size]="24" sv-ng-svg-icon></svg>
Expand Down
10 changes: 8 additions & 2 deletions packages/survey-angular-ui/src/components/list/list.component.ts
@@ -1,4 +1,4 @@
import { Component, Input } from "@angular/core";
import { AfterViewInit, Component, ElementRef, Input, ViewChild } from "@angular/core";
import { BaseAngular } from "../../base-angular";
import { AngularComponentFactory } from "../../component-factory";

Expand All @@ -7,8 +7,9 @@ import { AngularComponentFactory } from "../../component-factory";
templateUrl: "./list.component.html",
styleUrls: ["../../hide-host.scss"]
})
export class ListComponent extends BaseAngular {
export class ListComponent extends BaseAngular implements AfterViewInit {
@Input() model: any;
@ViewChild("listContainerElement") listContainerElement!: ElementRef<HTMLDivElement>;

getModel() {
return this.model;
Expand All @@ -25,6 +26,11 @@ export class ListComponent extends BaseAngular {
onMouseMove(event: Event): void {
this.model.onMouseMove(event);
}
ngAfterViewInit(): void {
if(!!this.listContainerElement?.nativeElement) {
this.model.initListContainerHtmlElement(this.listContainerElement.nativeElement);
}
}
}

AngularComponentFactory.Instance.registerComponent("sv-list", ListComponent);
33 changes: 17 additions & 16 deletions src/dropdownListModel.ts
Expand Up @@ -228,21 +228,22 @@ export class DropdownListModel extends Base {
doKey2ClickBlur(event);
}
scrollToFocusedItem(): void {
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);
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);
}
}
12 changes: 12 additions & 0 deletions src/element-helper.ts
Expand Up @@ -23,4 +23,16 @@ export class ElementHelper {
return this.getNextElementPostorder(result);
}
}
static hasHorizontalScroller(element: HTMLElement): boolean {
if (!!element) {
return element.scrollWidth > element.offsetWidth;
}
return false;
}
static hasVerticalScroller(element: HTMLElement): boolean {
if (!!element) {
return element.scrollHeight > element.offsetHeight;
}
return false;
}
}
1 change: 1 addition & 0 deletions src/knockout/components/list/list.ts
Expand Up @@ -14,6 +14,7 @@ ko.components.register("sv-list", {
createViewModel: (params: any, componentInfo: any) => {
const model: ListModel = params.model;
const _implementor: ImplementorBase = new ActionContainerImplementor(model);
model.initListContainerHtmlElement(componentInfo.element);
return { model: model, dispose: () => { _implementor.dispose(); } };
},
},
Expand Down
23 changes: 23 additions & 0 deletions src/list.ts
Expand Up @@ -29,6 +29,8 @@ export interface IListModel {
onFilterStringChangedCallback?: (text: string) => void;
}
export class ListModel extends ActionContainer {
private listContainerHtmlElement: HTMLElement;

@property({
defaultValue: true,
onSet: (newValue: boolean, target: ListModel) => {
Expand All @@ -48,6 +50,7 @@ export class ListModel extends ActionContainer {
target.onFilterStringChanged(target.filterString);
}
}) filterString: string;
@property({ defaultValue: false }) hasVerticalScroller: boolean;

public static INDENT: number = 16;
public static MINELEMENTCOUNT: number = 10;
Expand Down Expand Up @@ -218,4 +221,24 @@ export class ListModel extends ActionContainer {
public selectFocusedItem(): void {
this.onItemClick(this.focusedItem);
}
public initListContainerHtmlElement(htmlElement: HTMLElement): void {
this.listContainerHtmlElement = htmlElement;
}
public scrollToFocusedItem(): void {
setTimeout(() => {
if(!this.listContainerHtmlElement) return;

const item = this.listContainerHtmlElement.querySelector("." + defaultListCss.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);
}
}
}
6 changes: 3 additions & 3 deletions src/question_dropdown.ts
Expand Up @@ -198,9 +198,9 @@ export class QuestionDropdownModel extends QuestionSelectBase {
}
return this.dropdownListModel?.popupModel;
}
public get lazyLoading(): boolean {
return true;
}
// public get lazyLoading(): boolean {
// return true;
// }

public onOpened: EventBase<QuestionDropdownModel> = this.addEvent<QuestionDropdownModel>();
public onOpenedCallBack(): void {
Expand Down
9 changes: 8 additions & 1 deletion src/react/components/list/list.tsx
Expand Up @@ -10,11 +10,14 @@ interface IListProps {
}

export class List extends SurveyElementBase<IListProps, any> {
private listContainerRef: React.RefObject<HTMLDivElement>;

constructor(props: any) {
super(props);
this.state = {
filterString: this.model.filterString || ""
};
this.listContainerRef = React.createRef();
}
get model(): ListModel {
return this.props.model;
Expand All @@ -28,10 +31,14 @@ export class List extends SurveyElementBase<IListProps, any> {
getStateElement() {
return this.model;
}
componentDidMount(): void {
super.componentDidMount();
this.model.initListContainerHtmlElement(this.listContainerRef.current);
}
renderElement() {
const items = this.renderItems();
return (
<div className={this.model.cssClasses.root}>
<div className={this.model.cssClasses.root} ref={this.listContainerRef}>
{this.searchElementContent()}
{this.emptyContent()}
<ul
Expand Down
6 changes: 5 additions & 1 deletion src/vue/components/list/list.vue
@@ -1,5 +1,5 @@
<template>
<div v-bind:class="model.cssClasses.root">
<div v-bind:class="model.cssClasses.root" ref="listContainerElement">
<div v-bind:class="model.cssClasses.filter" v-if="model.showFilter">
<div v-bind:class="model.cssClasses.filterIcon">
<sv-svg-icon :iconName="'icon-search'" :size="'auto'"> </sv-svg-icon>
Expand Down Expand Up @@ -70,6 +70,10 @@ export class List extends BaseVue {
mouseMove(event: any) {
this.model.onMouseMove(event);
}
mounted() {
super.mounted();
this.model.initListContainerHtmlElement(this.$refs["listContainerElement"]);
}
}
Vue.component("sv-list", List);
Expand Down

0 comments on commit 80c8615

Please sign in to comment.