Skip to content

Commit

Permalink
Implemented #7181 - Advanced header mobile view (#7182)
Browse files Browse the repository at this point in the history
* Implemented #7181 - Cover mobile view

* Work for #7181 - Cover mobile view - added components for Angular, Vue2 and Vue3

* Work for #7181 - Cover mobile view - renamed sv-cover to sv-header

* Work for #7181 - Cover mobile view - renamed some files

* Work for #7181 - Cover mobile view - added VR-test

* Work for #7181 - Advanced header mobile view - fixed renderin for all platforms

* Work for #7181 - Advanced header mobile view - fixed Vue3 build

* Work for #7181 - Advanced header mobile view - try fix build

---------

Co-authored-by: tsv2013 <tsv2013@noreply.github.com>
  • Loading branch information
tsv2013 and tsv2013 committed Oct 19, 2023
1 parent 69e7ff9 commit c90a0cc
Show file tree
Hide file tree
Showing 39 changed files with 422 additions and 184 deletions.
9 changes: 5 additions & 4 deletions packages/survey-angular-ui/src/angular-ui.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,9 @@ import { NotifierComponent } from "./components/notifier/notifier.component";
import { ComponentsContainerComponent } from "./components-container.component";
import { MultipleTextRowComponent } from "./questions/multipletextrow.component";
import { LoadingIndicatorComponent } from "./angular-ui";
import { CoverComponent } from "./components/cover/cover.component";
import { CoverCellComponent } from "./components/cover/cover-cell.component";
import { HeaderComponent } from "./components/header/header.component";
import { HeaderCellComponent } from "./components/header/header-cell.component";
import { HeaderMobileComponent } from "./components/header/header-mobile.component";
import { ChooseFileBtn } from "./components/file/choose-file.component";
import { FilePreviewComponent } from "./components/file/file-preview.component";

Expand All @@ -133,7 +134,7 @@ import { FilePreviewComponent } from "./components/file/file-preview.component";
MultipleTextComponent, MultipleTextItemComponent, DynamicComponentDirective, RankingQuestionComponent, RankingItemComponent, PanelDynamicQuestionComponent, EmbeddedViewContentComponent, CustomWidgetComponent, MatrixCellComponent, MatrixTableComponent, MatrixDropdownComponent,
MatrixDynamicComponent, MatrixDetailButtonComponent, MatrixDynamicRemoveButtonComponent, MatrixDynamicDragDropIconComponent, MatrixRequiredHeader, ExpressionComponent, SafeResourceUrlPipe, BrandInfoComponent,
CustomQuestionComponent, CompositeQuestionComponent, ButtonGroupItemComponent, ButtonGroupQuestionComponent, MatrixRowComponent, ModalComponent, LogoImageComponent, SkeletonComponent, TimerPanelComponent, PaneldynamicRemoveButtonComponent,
NotifierComponent, ComponentsContainerComponent, MultipleTextRowComponent, LoadingIndicatorComponent, CoverComponent, CoverCellComponent, ChooseFileBtn, FilePreviewComponent
NotifierComponent, ComponentsContainerComponent, MultipleTextRowComponent, LoadingIndicatorComponent, HeaderComponent, HeaderCellComponent, HeaderMobileComponent, ChooseFileBtn, FilePreviewComponent
],
imports: [
CommonModule, FormsModule
Expand All @@ -154,7 +155,7 @@ import { FilePreviewComponent } from "./components/file/file-preview.component";
MultipleTextComponent, MultipleTextItemComponent, DynamicComponentDirective, RankingQuestionComponent, RankingItemComponent, PanelDynamicQuestionComponent, EmbeddedViewContentComponent, CustomWidgetComponent, MatrixCellComponent, MatrixTableComponent, MatrixDropdownComponent,
MatrixDynamicComponent, MatrixDetailButtonComponent, MatrixDynamicRemoveButtonComponent, MatrixDynamicDragDropIconComponent, MatrixRequiredHeader, ExpressionComponent, SafeResourceUrlPipe,
CustomQuestionComponent, CompositeQuestionComponent, ButtonGroupQuestionComponent, ModalComponent, LogoImageComponent, SkeletonComponent, TimerPanelComponent, PaneldynamicRemoveButtonComponent,
NotifierComponent, ComponentsContainerComponent, MultipleTextRowComponent, LoadingIndicatorComponent, CoverComponent, CoverCellComponent, FilePreviewComponent
NotifierComponent, ComponentsContainerComponent, MultipleTextRowComponent, LoadingIndicatorComponent, HeaderComponent, HeaderCellComponent, HeaderMobileComponent, FilePreviewComponent
],
providers: [PopupService],
})
Expand Down
5 changes: 3 additions & 2 deletions packages/survey-angular-ui/src/angular-ui.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,9 @@ export * from "./questions/custom.component";
export * from "./questions/composite.component";
export * from "./base-angular";
export * from "./components/loading-indicator/loading-indicator.component";
export * from "./components/cover/cover.component";
export * from "./components/cover/cover-cell.component";
export * from "./components/header/header.component";
export * from "./components/header/header-cell.component";
export * from "./components/header/header-mobile.component";

export * from "./component-factory";
export * from "./angular-ui.module";
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@

<ng-template #template>
<div [class]="model.css" [style]="model.style">
<div class="sv-cover__cell-content" [style]="model.contentStyle">
<div *ngIf="model.showLogo" class="sv-cover__logo">
<div class="sv-header__cell-content" [style]="model.contentStyle">
<div *ngIf="model.showLogo" class="sv-header__logo">
<div [class]="model.survey.logoClassNames">
<ng-template [component]="{ name: model.survey.getElementWrapperComponentName(model.survey, 'logo-image'), data: { data: model.survey.getElementWrapperComponentData(model.survey, 'logo-image') } }"></ng-template>
</div>
</div>
<div *ngIf="model.showTitle" class="sv-cover__title" [style]="{ maxWidth: model.textAreaWidth }">
<div *ngIf="model.showTitle" class="sv-header__title" [style]="{ maxWidth: model.textAreaWidth }">
<sv-ng-element-title [element]="model.survey"></sv-ng-element-title>
</div>
<div *ngIf="model.showDescription" class="sv-cover__description" [style]="{ maxWidth: model.textAreaWidth }">
<div *ngIf="model.showDescription" class="sv-header__description" [style]="{ maxWidth: model.textAreaWidth }">
<h5 *ngIf="model.survey.renderedHasDescription" [class]="model.survey.css.description" [model]="model.survey.locDescription" sv-ng-string></h5>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import { AngularComponentFactory } from "../../component-factory";
import { Cover, CoverCell, SurveyModel } from "survey-core";

@Component({
selector: "sv-ng-cover-cell",
templateUrl: "./cover-cell.component.html",
selector: "sv-ng-header-cell",
templateUrl: "./header-cell.component.html",
styles: [":host { display: none; }"],
})
export class CoverCellComponent extends EmbeddedViewContentComponent {
export class HeaderCellComponent extends EmbeddedViewContentComponent {
@Input() model!: CoverCell;
@ViewChild("actionContent", { read: ViewContainerRef, static: true }) actionContent!: ViewContainerRef;
}

AngularComponentFactory.Instance.registerComponent("sv-cover-cell", CoverCellComponent);
AngularComponentFactory.Instance.registerComponent("sv-header-cell", HeaderCellComponent);
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

<ng-template #template>
<div class="sv-header--mobile">
<div *ngIf="model.survey.hasLogo" class="sv-header__logo">
<div [class]="model.survey.logoClassNames">
<ng-template [component]="{ name: model.survey.getElementWrapperComponentName(model.survey, 'logo-image'), data: { data: model.survey.getElementWrapperComponentData(model.survey, 'logo-image') } }"></ng-template>
</div>
</div>
<div *ngIf="model.survey.hasTitle" class="sv-header__title" [style]="{ maxWidth: model.textAreaWidth }">
<sv-ng-element-title [element]="model.survey"></sv-ng-element-title>
</div>
<div *ngIf="model.survey.renderedHasDescription" class="sv-header__description" [style]="{ maxWidth: model.textAreaWidth }">
<h5 *ngIf="model.survey.renderedHasDescription" [class]="model.survey.css.description" [model]="model.survey.locDescription" sv-ng-string></h5>
</div>
</div>
</ng-template>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Component, Input, ViewChild, ViewContainerRef } from "@angular/core";
import { BaseAngular } from "../../base-angular";
import { EmbeddedViewContentComponent } from "../../embedded-view-content.component";
import { AngularComponentFactory } from "../../component-factory";
import { Cover, CoverCell, SurveyModel } from "survey-core";

@Component({
selector: "sv-ng-header-mobile",
templateUrl: "./header-mobile.component.html",
styles: [":host { display: none; }"],
})
export class HeaderMobileComponent extends EmbeddedViewContentComponent {
@Input() model!: Cover;
@ViewChild("actionContent", { read: ViewContainerRef, static: true }) actionContent!: ViewContainerRef;
}

AngularComponentFactory.Instance.registerComponent("sv-header-cell", HeaderMobileComponent);
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
<ng-template #template>
<div *ngIf="(survey.headerView === 'advanced' && survey.renderedHasHeader)" [class]="model.coverClasses" [style]="{ height: model.renderedHeight }">
<div *ngIf="!!model.backgroundImage" [style]="model.backgroundImageStyle" [class]="model.backgroundImageClasses"></div>
<div [class]="model.contentClasses" [style.width]="model.maxWidth">
<div *ngIf="!survey.isMobile" [class]="model.contentClasses" [style.width]="model.maxWidth">
<ng-container *ngFor="let cell of model.cells">
<sv-ng-cover-cell [model]="cell"></sv-ng-cover-cell>
<sv-ng-header-cell [model]="cell"></sv-ng-header-cell>
</ng-container>
</div>
<div *ngIf="survey.isMobile">
<sv-ng-header-mobile [model]="model"></sv-ng-header-mobile>
</div>
</div>
</ng-template>
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import { BaseAngular } from "../../base-angular";
import { Cover, CoverCell, SurveyModel } from "survey-core";

@Component({
selector: "sv-cover, sv-ng-cover",
templateUrl: "./cover.component.html",
selector: "sv-header, sv-ng-header",
templateUrl: "./header.component.html",
styles: [":host { display: none }"]
})
export class CoverComponent extends BaseAngular<Cover> {
export class HeaderComponent extends BaseAngular<Cover> {
@Input() model!: Cover;
@Input() survey!: SurveyModel;
@ViewChild("container") container!: ElementRef<HTMLDivElement>;
Expand All @@ -18,4 +18,4 @@ export class CoverComponent extends BaseAngular<Cover> {
}
}

AngularComponentFactory.Instance.registerComponent("sv-cover", CoverComponent);
AngularComponentFactory.Instance.registerComponent("sv-header", HeaderComponent);
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
<template>
<div :class="model.coverClasses" :style="{ 'height': model.renderedHeight }">
<div v-if="!!model.backgroundImage" :class="model.backgroundImageClasses" :style="model.backgroundImageStyle"></div>
<div :class="model.contentClasses" :style="{ maxWidth: model.maxWidth }">
<sv-cover-cell
<div v-if="!survey.isMobile" :class="model.contentClasses" :style="{ maxWidth: model.maxWidth }">
<sv-header-cell
v-for="cell in model.cells"
:model="cell"
></sv-cover-cell>
></sv-header-cell>
</div>
<div v-if="survey.isMobile">
<sv-header-mobile :model="model"></sv-header-mobile>
</div>
</div>
</template>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<template>
<div :class="model.css" :style="model.style">
<div class="sv-cover__cell-content" :style="model.contentStyle">
<div v-if="model.showLogo" class="sv-cover__logo">
<div class="sv-header__cell-content" :style="model.contentStyle">
<div v-if="model.showLogo" class="sv-header__logo">
<div :class="model.survey.logoClassNames">
<img
:class="model.survey.css.logoImage"
Expand All @@ -13,10 +13,10 @@
/>
</div>
</div>
<div v-if="model.showTitle" class="sv-cover__title" :style="{ 'maxWidth': model.textAreaWidth }">
<div v-if="model.showTitle" class="sv-header__title" :style="{ 'maxWidth': model.textAreaWidth }">
<survey-element-title :element="model.survey" :css="model.survey.css" />
</div>
<div v-if="model.showDescription" class="sv-cover__description" :style="{ 'maxWidth': model.textAreaWidth }">
<div v-if="model.showDescription" class="sv-header__description" :style="{ 'maxWidth': model.textAreaWidth }">
<h5 v-if="model.survey.renderedHasDescription" :class="model.survey.css.description">
<survey-string :locString="model.survey.locDescription" />
</h5>
Expand Down
33 changes: 33 additions & 0 deletions packages/survey-vue3-ui/src/components/header/HeaderMobile.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<template>
<div class="sv-header--mobile">
<div v-if="model.survey.hasLogo" class="sv-header__logo">
<div :class="model.survey.logoClassNames">
<img
:class="model.survey.css.logoImage"
:src="model.survey.locLogo.renderedHtml"
:width="model.survey.renderedLogoWidth"
:height="model.survey.renderedLogoHeight"
:alt="model.survey.locTitle.renderedHtml"
:style="{ 'objectFit': model.survey.logoFit, 'width': model.survey.renderedStyleLogoWidth, 'height': model.survey.renderedStyleLogoHeight } as any"
/>
</div>
</div>
<div v-if="model.survey.hasTitle" class="sv-header__title" :style="{ 'maxWidth': model.textAreaWidth }">
<survey-element-title :element="model.survey" :css="model.survey.css" />
</div>
<div v-if="model.survey.renderedHasDescription" class="sv-header__description" :style="{ 'maxWidth': model.textAreaWidth }">
<h5 v-if="model.survey.renderedHasDescription" :class="model.survey.css.description">
<survey-string :locString="model.survey.locDescription" />
</h5>
</div>
</div>
</template>

<script lang="ts" setup>
import { Base, SurveyModel, Cover, CoverCell } from "survey-core";
import { onMounted, onUnmounted, ref } from "vue";
const props = defineProps<{
model: Cover;
}>();
</script>
14 changes: 8 additions & 6 deletions packages/survey-vue3-ui/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Page from "./Page.vue";
import Header from "./Header.vue";
import HeaderBasic from "./Header.vue";
import Row from "./Row.vue";
import Element from "./Element.vue";
import Panel from "./Panel.vue";
Expand Down Expand Up @@ -102,8 +102,9 @@ import Custom from "./Custom.vue";
import TimerPanel from "./TimerPanel.vue";
import LoadingIndicator from "./components/LoadingIndicator.vue";

import Cover from "./components/cover/Cover.vue";
import CoverCell from "./components/cover/CoverCell.vue";
import Header from "./components/header/Header.vue";
import HeaderCell from "./components/header/HeaderCell.vue";
import HeaderMobile from "./components/header/HeaderMobile.vue";

import {
SurveyModel,
Expand All @@ -127,7 +128,7 @@ function registerComponents(app: App) {
app.component("survey", SurveyVue);
app.component("popup-survey", PopupSurvey);

app.component("survey-header", Header);
app.component("survey-header", HeaderBasic);
app.component("survey-page", Page);
app.component("survey-row", Row);
app.component("survey-element", Element);
Expand Down Expand Up @@ -239,8 +240,9 @@ function registerComponents(app: App) {
app.component("sv-timerpanel", TimerPanel);
app.component("sv-loading-indicator", LoadingIndicator);

app.component("sv-cover", Cover);
app.component("sv-cover-cell", CoverCell);
app.component("sv-header", Header);
app.component("sv-header-cell", HeaderCell);
app.component("sv-header-mobile", HeaderMobile);

app.directive("key2click", {
// When the bound element is inserted into the DOM...
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
.sv-cover {
.sv-header {
position: relative;
background-color: $cover-backcolor;
}

.sv-header--mobile {
padding: calcSize(3);
}

.sv-conver__overlap {
margin-bottom: calcSize(-14);
padding-bottom: calcSize(8);
Expand Down Expand Up @@ -35,7 +39,7 @@
margin-right: auto;
}

.sv-cover__background-image {
.sv-header__background-image {
width: 100%;
height: 100%;
position: absolute;
Expand All @@ -46,15 +50,15 @@
background-position-x: center;
}

.sv-cover__background-image--contain {
.sv-header__background-image--contain {
background-repeat: no-repeat;
}

.sv-cover__cell {
.sv-header__cell {
position: relative;
}

.sv-cover__cell-content {
.sv-header__cell-content {
display: flex;
flex-direction: column;
position: absolute;
Expand All @@ -63,60 +67,61 @@
bottom: 0;
}

.sv-cover__cell--left {
.sv-cover__cell-content {
.sv-header__cell--left {
.sv-header__cell-content {
left: 0;
}
}

.sv-cover__cell--center {
.sv-cover__cell-content {
.sv-header__cell--center {
.sv-header__cell-content {
min-width: 100%;
}
}

.sv-cover__cell--right {
.sv-cover__cell-content {
.sv-header__cell--right {
.sv-header__cell-content {
right: 0;
}
}

.sv-cover__logo {
.sv-header__logo {
display: flex;
}

.sv-cover__title {
.sv-header__title {
display: flex;
}

.sv-cover__title .sd-title {
.sv-header__title .sd-title {
@include cover_title;
margin: 0;
color: $cover-title-forecolor;
font-family: $font-surveytitle-family;
font-weight: $font-surveytitle-weight;
}

.sv-cover__logo ~ .sv-cover__title {
.sv-header__logo~.sv-header__title {
margin-top: calcSize(4);
}

.sv-cover__logo ~ .sv-cover__description {
.sv-header__logo~.sv-header__description {
margin-top: calcSize(4);
}

.sv-cover__title ~ .sv-cover__description {
.sv-header__title~.sv-header__description {
margin-top: calcSize(1);
}

.sv-cover__description {
.sv-header__description {
display: flex;
}

.sv-cover__description .sd-description {
.sv-header__description .sd-description {
margin: 0;
color: $cover-description-forecolor;
}

.sv-conver__content .sd-header__text h3 {
margin: 0;
}
}

0 comments on commit c90a0cc

Please sign in to comment.