forked from EVOgeek/Vmeda.Online
		
	
						commit
						042619dd61
					
				| @ -51,12 +51,18 @@ jobs: | ||||
|       apt: | ||||
|         packages: | ||||
|         - libsecret-1-dev | ||||
|         - php5-cli | ||||
|         - php5-common | ||||
|   - stage: build | ||||
|     name: "Build iOS" | ||||
|     language: node_js | ||||
|     if: env(BUILD_IOS) = 1 AND (env(DEPLOY) = 1 OR (env(DEPLOY) = 2 AND tag IS NOT blank)) | ||||
|     os: osx | ||||
|     osx_image: xcode12.5 | ||||
|     osx_image: xcode13.1 | ||||
|     addons: | ||||
|       homebrew: | ||||
|         packages: | ||||
|         - jq | ||||
|   - stage: test | ||||
|     name: "End to end tests (mod_forum and mod_messages)" | ||||
|     services: | ||||
|  | ||||
| @ -69,7 +69,7 @@ | ||||
|     </ion-row> | ||||
| 
 | ||||
|     <core-empty-box *ngIf="filteredCourses.length == 0" image="assets/img/icons/courses.svg" | ||||
|         [message]="'addon.block_myoverview.nocourses' | translate" inline="true"> | ||||
|         [message]="'addon.block_myoverview.nocourses' | translate"> | ||||
|     </core-empty-box> | ||||
| 
 | ||||
|     <!-- List of courses. --> | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
|     </div> | ||||
| </ion-item-divider> | ||||
| <core-loading [hideUntil]="loaded" [fullscreen]="false"> | ||||
|     <core-empty-box *ngIf="courses.length == 0" image="assets/img/icons/courses.svg" inline="true" | ||||
|     <core-empty-box *ngIf="courses.length == 0" image="assets/img/icons/courses.svg" | ||||
|         [message]="'addon.block_recentlyaccessedcourses.nocourses' | translate"></core-empty-box> | ||||
|     <!-- List of courses. --> | ||||
|     <div [hidden]="courses.length === 0" [id]="scrollElementId" class="core-horizontal-scroll" | ||||
|  | ||||
| @ -37,7 +37,7 @@ | ||||
|         </div> | ||||
|     </div> | ||||
| 
 | ||||
|     <core-empty-box *ngIf="items.length <= 0" image="assets/img/icons/activities.svg" inline="true" | ||||
|     <core-empty-box *ngIf="items.length <= 0" image="assets/img/icons/activities.svg" | ||||
|         [message]="'addon.block_recentlyaccesseditems.noitems' | translate"></core-empty-box> | ||||
| 
 | ||||
| </core-loading> | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
|     </div> | ||||
| </ion-item-divider> | ||||
| <core-loading [hideUntil]="loaded" [fullscreen]="false"> | ||||
|     <core-empty-box *ngIf="courses.length == 0" image="assets/img/icons/courses.svg" inline="true" | ||||
|     <core-empty-box *ngIf="courses.length == 0" image="assets/img/icons/courses.svg" | ||||
|         [message]="'addon.block_starredcourses.nocourses' | translate"></core-empty-box> | ||||
|     <!-- List of courses. --> | ||||
|     <div [hidden]="courses.length === 0" [id]="scrollElementId" class="core-horizontal-scroll" | ||||
|  | ||||
| @ -79,5 +79,5 @@ | ||||
|         <p>{{'addon.block_timeline.noevents' | translate}}</p> | ||||
|     </ion-label> | ||||
| </ion-item> | ||||
| <core-empty-box *ngIf="empty && !course" image="assets/img/icons/activities.svg" inline="true" | ||||
|     [message]="'addon.block_timeline.noevents' | translate"></core-empty-box> | ||||
| <core-empty-box *ngIf="empty && !course" image="assets/img/icons/activities.svg" [message]="'addon.block_timeline.noevents' | translate"> | ||||
| </core-empty-box> | ||||
|  | ||||
| @ -66,7 +66,7 @@ | ||||
|             <addon-block-timeline-events [events]="course.events" [canLoadMore]="course.canLoadMore" (loadMore)="loadMore(course)" | ||||
|                 [course]="course" [from]="dataFrom" [to]="dataTo"></addon-block-timeline-events> | ||||
|         </ng-container> | ||||
|         <core-empty-box *ngIf="timelineCourses.courses.length == 0" image="assets/img/icons/courses.svg" inline="true" | ||||
|         <core-empty-box *ngIf="timelineCourses.courses.length == 0" image="assets/img/icons/courses.svg" | ||||
|             [message]="'addon.block_timeline.noevents' | translate"></core-empty-box> | ||||
|     </core-loading> | ||||
| </core-loading> | ||||
|  | ||||
| @ -59,7 +59,7 @@ | ||||
|                             </ion-item> | ||||
|                         </ion-card> | ||||
| 
 | ||||
|                         <core-empty-box *ngIf="!day.filteredEvents || !day.filteredEvents.length" icon="fas-calendar" inline="true" | ||||
|                         <core-empty-box *ngIf="!day.filteredEvents || !day.filteredEvents.length" icon="fas-calendar" | ||||
|                             [message]="'addon.calendar.noevents' | translate"> | ||||
|                         </core-empty-box> | ||||
| 
 | ||||
|  | ||||
| @ -52,7 +52,7 @@ | ||||
|         </ion-item> | ||||
|     </ion-card> | ||||
| 
 | ||||
|     <ion-card class="core-info-card" *ngIf="access && access.entrieslefttoview">> | ||||
|     <ion-card class="core-info-card" *ngIf="access && access.entrieslefttoview"> | ||||
|         <ion-item> | ||||
|             <ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon> | ||||
|             <ion-label> | ||||
| @ -61,7 +61,7 @@ | ||||
|         </ion-item> | ||||
|     </ion-card> | ||||
| 
 | ||||
|     <ion-card class="core-info-card" *ngIf="access && access.entrieslefttoadd">> | ||||
|     <ion-card class="core-info-card" *ngIf="access && access.entrieslefttoadd"> | ||||
|         <ion-item> | ||||
|             <ion-icon name="fas-info-circle" slot="start" aria-hidden="true"></ion-icon> | ||||
|             <ion-label> | ||||
|  | ||||
| @ -60,7 +60,7 @@ | ||||
|             <core-format-text *ngIf="pageContent" [component]="component" [componentId]="componentId" [text]="pageContent" | ||||
|                 contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"> | ||||
|             </core-format-text> | ||||
|             <core-empty-box *ngIf="!pageContent" icon="fas-file-alt" [message]="'addon.mod_wiki.nocontent' | translate" inline="true"> | ||||
|             <core-empty-box *ngIf="!pageContent" icon="fas-file-alt" [message]="'addon.mod_wiki.nocontent' | translate"> | ||||
|             </core-empty-box> | ||||
|         </article> | ||||
| 
 | ||||
|  | ||||
| @ -12,7 +12,6 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreUtils } from '@services/utils/utils'; | ||||
| import { CoreDom } from '@singletons/dom'; | ||||
| import { CoreEventObserver } from '@singletons/events'; | ||||
| @ -365,7 +364,7 @@ export class AddonQtypeDdImageOrTextQuestion { | ||||
|             this.pollForImageLoad(); | ||||
|         }); | ||||
| 
 | ||||
|         this.resizeListener = CoreDomUtils.onWindowResize(() => { | ||||
|         this.resizeListener = CoreDom.onWindowResize(() => { | ||||
|             this.repositionDragsForQuestion(); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
| @ -619,7 +619,7 @@ export class AddonQtypeDdMarkerQuestion { | ||||
|             this.pollForImageLoad(); | ||||
|         }); | ||||
| 
 | ||||
|         this.resizeListener = CoreDomUtils.onWindowResize(() => { | ||||
|         this.resizeListener = CoreDom.onWindowResize(() => { | ||||
|             this.redrawDragsAndDrops(); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
| @ -13,7 +13,6 @@ | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { CoreFormatTextDirective } from '@directives/format-text'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreTextUtils } from '@services/utils/text'; | ||||
| import { CoreUtils } from '@services/utils/utils'; | ||||
| import { CoreComponentsRegistry } from '@singletons/components-registry'; | ||||
| @ -208,7 +207,7 @@ export class AddonQtypeDdwtosQuestion { | ||||
| 
 | ||||
|         this.positionDragItems(); | ||||
| 
 | ||||
|         this.resizeListener = CoreDomUtils.onWindowResize(() => { | ||||
|         this.resizeListener = CoreDom.onWindowResize(() => { | ||||
|             this.positionDragItems(); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
| @ -33,7 +33,7 @@ import { Platform, Translate } from '@singletons'; | ||||
| import { CoreSettingsHelper } from '@features/settings/services/settings-helper'; | ||||
| import { CoreAriaRoleTab, CoreAriaRoleTabFindable } from './aria-role-tab'; | ||||
| import { CoreEventObserver } from '@singletons/events'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreDom } from '@singletons/dom'; | ||||
| 
 | ||||
| /** | ||||
|  * Class to abstract some common code for tabs. | ||||
| @ -135,7 +135,7 @@ export class CoreTabsBaseComponent<T extends CoreTabBase> implements OnInit, Aft | ||||
|             await this.initializeTabs(); | ||||
|         } | ||||
| 
 | ||||
|         this.resizeListener = CoreDomUtils.onWindowResize(() => { | ||||
|         this.resizeListener = CoreDom.onWindowResize(() => { | ||||
|             this.windowResized(); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
| @ -1,8 +1,4 @@ | ||||
| <div class="core-empty-box ion-padding" [class.core-empty-box-inline]="(!image && !icon) || inline"> | ||||
|     <div class="core-empty-box-content"> | ||||
|         <img *ngIf="image && !icon" [src]="image" role="presentation" alt=""> | ||||
|         <ion-icon *ngIf="icon" [name]="icon" aria-hidden="true"></ion-icon> | ||||
|         <p *ngIf="message" [class.ion-padding-top]="image || icon">{{ message }}</p> | ||||
|         <ng-content></ng-content> | ||||
|     </div> | ||||
| </div> | ||||
| <img *ngIf="image && !icon" [src]="image" role="presentation" alt=""> | ||||
| <ion-icon *ngIf="icon" [name]="icon" aria-hidden="true"></ion-icon> | ||||
| <p *ngIf="message">{{ message }}</p> | ||||
| <ng-content></ng-content> | ||||
|  | ||||
| @ -1,74 +1,35 @@ | ||||
| @import "~theme/globals"; | ||||
| 
 | ||||
| :host { | ||||
|     display: contents; | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     align-items: center; | ||||
|     justify-content: center; | ||||
|     flex-grow: 1; | ||||
| 
 | ||||
|     color: var(--text-color); | ||||
|     margin: 0 auto; | ||||
|     text-align: center; | ||||
|     padding: 16px; | ||||
|     --image-size: 120px; | ||||
| 
 | ||||
|     .core-empty-box { | ||||
|         position: absolute; | ||||
|         top: 0; | ||||
|         right: 0; | ||||
|         bottom: 0; | ||||
|         left: 0; | ||||
|         display: table; | ||||
|         height: 100%; | ||||
|         width: 100%; | ||||
|         margin: 0; | ||||
|         clear: both; | ||||
|         pointer-events: none; | ||||
| 
 | ||||
|         .core-empty-box-content { | ||||
|             margin: 0; | ||||
|             display: table-cell; | ||||
|             text-align: center; | ||||
|             vertical-align: middle; | ||||
|             pointer-events: auto; | ||||
|         } | ||||
| 
 | ||||
|         &.core-empty-box-inline { | ||||
|             position: relative; | ||||
|             z-index: initial; | ||||
|             top: initial; | ||||
|             right: initial; | ||||
|             bottom: 0; | ||||
|             left: initial; | ||||
|             height: auto; | ||||
|         } | ||||
| 
 | ||||
|         ion-icon { | ||||
|             font-size: 120px; | ||||
|         } | ||||
|         img { | ||||
|             height: 125px; | ||||
|             width: 145px; | ||||
|             margin: 0 auto; | ||||
|         } | ||||
|         p { | ||||
|             font-size: 120%; | ||||
|         } | ||||
|     ion-icon { | ||||
|         font-size: var(--image-size); | ||||
|     } | ||||
|     img { | ||||
|         height: var(--image-size); | ||||
|     } | ||||
|     p { | ||||
|         font-size: 120%; | ||||
|     } | ||||
| 
 | ||||
|     &.core-empty-box-clickable .core-empty-box { | ||||
|     &.core-empty-box-clickable { | ||||
|         z-index: 0; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|     @media (max-height: 550px) { | ||||
|         .core-empty-box { | ||||
|             position: relative; | ||||
|             height: auto; | ||||
|             margin-top: 50px; | ||||
| 
 | ||||
|             ion-icon { | ||||
|                 font-size: 100px; | ||||
|             } | ||||
|             img { | ||||
|                 height: 104px; | ||||
|                 width: 121px; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|      &.core-empty-inline .core-empty-box { | ||||
|         position: relative; | ||||
|         z-index: initial; | ||||
|         height: auto; | ||||
| @include media-breakpoint-down(sm) { | ||||
|     :host { | ||||
|         --image-size: 100px; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -32,12 +32,11 @@ export class CoreEmptyBoxComponent { | ||||
|     @Input() message = ''; // Message to display.
 | ||||
|     @Input() icon?: string; // Name of the icon to use.
 | ||||
|     @Input() image?: string; // Image source. If an icon is provided, image won't be used.
 | ||||
| 
 | ||||
|     /** | ||||
|      * If this has to be shown inline instead of occupying whole page. | ||||
|      * If image or icon is not supplied, it's true by default. | ||||
|      */ | ||||
|     @Input() inline = false; | ||||
|     @Input() flipIconRtl = false; // Whether to flip the icon in RTL. Defaults to false.
 | ||||
| 
 | ||||
|     /** | ||||
|      * @deprecated not used anymore. | ||||
|      */ | ||||
|     @Input() inline = false; | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
|     --menu-display: flex; | ||||
|     --content-display: block; | ||||
|     --content-outlet-display: none; | ||||
|     --content-placeholder-display: var(--content-display); | ||||
|     --content-placeholder-display: flex; | ||||
| 
 | ||||
|     top: 0; | ||||
|     right: 0; | ||||
| @ -70,6 +70,7 @@ | ||||
|     --menu-min-width: 0px; | ||||
|     --menu-max-width: 100%; | ||||
|     --content-display: none; | ||||
|     --content-placeholder-display: none; | ||||
|     --menu-border-width: 0px; | ||||
|     --menu-box-shadow: none; | ||||
|     --menu-z: 0px; | ||||
|  | ||||
| @ -21,7 +21,6 @@ import { CoreComponentsRegistry } from '@singletons/components-registry'; | ||||
| import { CoreFormatTextDirective } from './format-text'; | ||||
| import { CoreEventObserver } from '@singletons/events'; | ||||
| import { CoreLoadingComponent } from '@components/loading/loading'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreCancellablePromise } from '@classes/cancellable-promise'; | ||||
| import { CoreDom } from '@singletons/dom'; | ||||
| 
 | ||||
| @ -154,7 +153,7 @@ export class CoreCollapsibleFooterDirective implements OnInit, OnDestroy { | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         this.resizeListener = CoreDomUtils.onWindowResize(() => { | ||||
|         this.resizeListener = CoreDom.onWindowResize(() => { | ||||
|             this.calculateHeight(); | ||||
|         }, 50); | ||||
|     } | ||||
|  | ||||
| @ -18,9 +18,9 @@ import { CoreLoadingComponent } from '@components/loading/loading'; | ||||
| import { CoreTabsOutletComponent } from '@components/tabs-outlet/tabs-outlet'; | ||||
| import { CoreSettingsHelper } from '@features/settings/services/settings-helper'; | ||||
| import { ScrollDetail } from '@ionic/core'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreUtils } from '@services/utils/utils'; | ||||
| import { CoreComponentsRegistry } from '@singletons/components-registry'; | ||||
| import { CoreDom } from '@singletons/dom'; | ||||
| import { CoreEventObserver } from '@singletons/events'; | ||||
| import { CoreMath } from '@singletons/math'; | ||||
| import { Subscription } from 'rxjs'; | ||||
| @ -156,7 +156,7 @@ export class CoreCollapsibleHeaderDirective implements OnInit, OnChanges, OnDest | ||||
|             this.enteredPromise.reject(new Error('[collapsible-header] Waiting for ionViewDidEnter timeout reached')); | ||||
|         }, 5000); | ||||
| 
 | ||||
|         this.resizeListener = CoreDomUtils.onWindowResize(() => { | ||||
|         this.resizeListener = CoreDom.onWindowResize(() => { | ||||
|             this.initializeFloatingTitle(); | ||||
|         }, 50); | ||||
| 
 | ||||
|  | ||||
| @ -15,7 +15,6 @@ | ||||
| import { Directive, ElementRef, Input, OnDestroy, OnInit } from '@angular/core'; | ||||
| import { CoreCancellablePromise } from '@classes/cancellable-promise'; | ||||
| import { CoreLoadingComponent } from '@components/loading/loading'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreUtils } from '@services/utils/utils'; | ||||
| import { Translate } from '@singletons'; | ||||
| import { CoreComponentsRegistry } from '@singletons/components-registry'; | ||||
| @ -90,7 +89,7 @@ export class CoreCollapsibleItemDirective implements OnInit, OnDestroy { | ||||
| 
 | ||||
|         await this.calculateHeight(); | ||||
| 
 | ||||
|         this.resizeListener = CoreDomUtils.onWindowResize(() => { | ||||
|         this.resizeListener = CoreDom.onWindowResize(() => { | ||||
|             this.calculateHeight(); | ||||
|         }, 50); | ||||
|     } | ||||
|  | ||||
| @ -254,7 +254,7 @@ export class CoreEditorRichTextEditorComponent implements OnInit, AfterViewInit, | ||||
|             ); | ||||
|         }); | ||||
| 
 | ||||
|         this.resizeListener = CoreDomUtils.onWindowResize(() => { | ||||
|         this.resizeListener = CoreDom.onWindowResize(() => { | ||||
|             this.windowResized(); | ||||
|         }, 50); | ||||
| 
 | ||||
|  | ||||
| @ -29,7 +29,7 @@ import { filter } from 'rxjs/operators'; | ||||
| import { NavigationEnd } from '@angular/router'; | ||||
| import { trigger, state, style, transition, animate } from '@angular/animations'; | ||||
| import { CoreSites } from '@services/sites'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreDom } from '@singletons/dom'; | ||||
| 
 | ||||
| /** | ||||
|  * Page that displays the main menu of the app. | ||||
| @ -122,7 +122,7 @@ export class CoreMainMenuPage implements OnInit, OnDestroy { | ||||
|             } | ||||
|         }); | ||||
| 
 | ||||
|         this.resizeListener = CoreDomUtils.onWindowResize(() => { | ||||
|         this.resizeListener = CoreDom.onWindowResize(() => { | ||||
|             this.initHandlers(); | ||||
|         }); | ||||
|         document.addEventListener('ionBackButton', this.backButtonFunction); | ||||
|  | ||||
| @ -26,7 +26,7 @@ import { CoreContentLinksHelper } from '@features/contentlinks/services/contentl | ||||
| import { CoreTextUtils } from '@services/utils/text'; | ||||
| import { Translate } from '@singletons'; | ||||
| import { CoreMainMenuDeepLinkManager } from '@features/mainmenu/classes/deep-link-manager'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreDom } from '@singletons/dom'; | ||||
| 
 | ||||
| /** | ||||
|  * Page that displays the more page of the app. | ||||
| @ -73,7 +73,7 @@ export class CoreMainMenuMorePage implements OnInit, OnDestroy { | ||||
|             this.initHandlers(); | ||||
|         }); | ||||
| 
 | ||||
|         this.resizeListener = CoreDomUtils.onWindowResize(() => { | ||||
|         this.resizeListener = CoreDom.onWindowResize(() => { | ||||
|             this.initHandlers(); | ||||
|         }); | ||||
| 
 | ||||
|  | ||||
| @ -53,7 +53,6 @@ import { NavigationStart } from '@angular/router'; | ||||
| import { filter } from 'rxjs/operators'; | ||||
| import { Subscription } from 'rxjs'; | ||||
| import { CoreComponentsRegistry } from '@singletons/components-registry'; | ||||
| import { CoreEventObserver } from '@singletons/events'; | ||||
| import { CoreDom } from '@singletons/dom'; | ||||
| 
 | ||||
| /* | ||||
| @ -93,30 +92,6 @@ export class CoreDomUtilsProvider { | ||||
|         this.debugDisplay = debugDisplay != 0; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Window resize is widely checked and may have many performance issues, debouce usage is needed to avoid calling it too much. | ||||
|      * This function helps setting up the debounce feature and remove listener easily. | ||||
|      * | ||||
|      * @param resizeFunction Function to execute on resize. | ||||
|      * @param debounceDelay Debounce time in ms. | ||||
|      * @return Event observer to call off when finished. | ||||
|      */ | ||||
|     onWindowResize(resizeFunction: (ev?: Event) => void, debounceDelay = 20): CoreEventObserver { | ||||
|         const resizeListener = CoreUtils.debounce(async (ev?: Event) => { | ||||
|             await this.waitForResizeDone(); | ||||
| 
 | ||||
|             resizeFunction(ev); | ||||
|         }, debounceDelay); | ||||
| 
 | ||||
|         window.addEventListener('resize', resizeListener); | ||||
| 
 | ||||
|         return { | ||||
|             off: (): void => { | ||||
|                 window.removeEventListener('resize', resizeListener); | ||||
|             }, | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Equivalent to element.closest(). If the browser doesn't support element.closest, it will | ||||
|      * traverse the parents to achieve the same functionality. | ||||
| @ -1902,7 +1877,7 @@ export class CoreDomUtilsProvider { | ||||
|     /** | ||||
|      * Trigger form cancelled event. | ||||
|      * | ||||
|      * @param form Form element. | ||||
|      * @param formRef Form element. | ||||
|      * @param siteId The site affected. If not provided, no site affected. | ||||
|      * @deprecated since 3.9.5. Function has been moved to CoreForms. | ||||
|      */ | ||||
| @ -1913,7 +1888,7 @@ export class CoreDomUtilsProvider { | ||||
|     /** | ||||
|      * Trigger form submitted event. | ||||
|      * | ||||
|      * @param form Form element. | ||||
|      * @param formRef Form element. | ||||
|      * @param online Whether the action was done in offline or not. | ||||
|      * @param siteId The site affected. If not provided, no site affected. | ||||
|      * @deprecated since 3.9.5. Function has been moved to CoreForms. | ||||
| @ -1924,7 +1899,7 @@ export class CoreDomUtilsProvider { | ||||
| 
 | ||||
|     /** | ||||
|      * In iOS the resize event is triggered before the window size changes. Wait for the size to change. | ||||
|      * Use of this function is discouraged. Please use onWindowResize to check window resize event. | ||||
|      * Use of this function is discouraged. Please use CoreDom.onWindowResize to check window resize event. | ||||
|      * | ||||
|      * @param windowWidth Initial window width. | ||||
|      * @param windowHeight Initial window height. | ||||
|  | ||||
| @ -13,6 +13,9 @@ | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { CoreCancellablePromise } from '@classes/cancellable-promise'; | ||||
| import { CoreDomUtils } from '@services/utils/dom'; | ||||
| import { CoreUtils } from '@services/utils/utils'; | ||||
| import { CoreEventObserver } from '@singletons/events'; | ||||
| 
 | ||||
| /** | ||||
|  * Singleton with helper functions for dom. | ||||
| @ -147,6 +150,30 @@ export class CoreDom { | ||||
|         slot.addEventListener('slotchange', slotListener);; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Window resize is widely checked and may have many performance issues, debouce usage is needed to avoid calling it too much. | ||||
|      * This function helps setting up the debounce feature and remove listener easily. | ||||
|      * | ||||
|      * @param resizeFunction Function to execute on resize. | ||||
|      * @param debounceDelay Debounce time in ms. | ||||
|      * @return Event observer to call off when finished. | ||||
|      */ | ||||
|     static onWindowResize(resizeFunction: (ev?: Event) => void, debounceDelay = 20): CoreEventObserver { | ||||
|         const resizeListener = CoreUtils.debounce(async (ev?: Event) => { | ||||
|             await CoreDomUtils.waitForResizeDone(); | ||||
| 
 | ||||
|             resizeFunction(ev); | ||||
|         }, debounceDelay); | ||||
| 
 | ||||
|         window.addEventListener('resize', resizeListener); | ||||
| 
 | ||||
|         return { | ||||
|             off: (): void => { | ||||
|                 window.removeEventListener('resize', resizeListener); | ||||
|             }, | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Scroll to a certain element. | ||||
|      * | ||||
|  | ||||
| @ -29,6 +29,8 @@ | ||||
|         --core-header-toolbar-border-width: 0; | ||||
|         ion-toolbar { | ||||
|             --background: transparent; | ||||
|             --core-header-buttons-background: var(--ion-background-color); | ||||
|             --core-header-buttons-color: var(--text-color); | ||||
|         } | ||||
| 
 | ||||
|         h1 { | ||||
|  | ||||
| @ -152,9 +152,11 @@ ion-toolbar { | ||||
| // Header. | ||||
| ion-header { | ||||
|     z-index: 12; // To hide ion-slides on scroll. | ||||
|     --core-header-buttons-background: var(--core-header-toolbar-background); | ||||
| 
 | ||||
|     ion-toolbar { | ||||
|         --core-header-buttons-background: var(--core-header-toolbar-background); | ||||
|         --core-header-buttons-color: var(--core-header-toolbar-color); | ||||
| 
 | ||||
|         ion-spinner { | ||||
|             margin: 10px; | ||||
|         } | ||||
| @ -164,11 +166,11 @@ ion-header { | ||||
|         .in-toolbar.button-solid, | ||||
|         .button.button-clear, | ||||
|         .button.button-solid { | ||||
|             --color: var(--core-header-toolbar-color); | ||||
|             --color: var(--core-header-buttons-color); | ||||
|             --background: var(--core-header-buttons-background); | ||||
|             --ion-toolbar-color: var(--core-header-toolbar-color); | ||||
|             --ion-toolbar-color: var(--core-header-buttons-color); | ||||
|             --border-radius: var(--huge-radius); | ||||
|             --primary: var(--core-header-toolbar-color); | ||||
|             --primary: var(--core-header-buttons-color); | ||||
|         } | ||||
|         ion-back-button::part(text) { | ||||
|             display: none; | ||||
| @ -1490,7 +1492,11 @@ ion-header.no-title { | ||||
|     --core-header-toolbar-border-width: 0; | ||||
|     --core-header-toolbar-background: transparent; | ||||
|     --core-header-shadow: none !important; | ||||
|     --core-header-buttons-background: var(--ion-background-color); | ||||
|     ion-toolbar { | ||||
|         --core-header-buttons-background: var(--ion-background-color); | ||||
|         --core-header-buttons-color: var(--text-color); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // To make core-swipe-slides fill the remaining height. | ||||
| @ -1514,7 +1520,8 @@ ion-header.no-title { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| .has-spacer { | ||||
| .has-spacer, | ||||
| .core-flex-fill { | ||||
|     display: flex; | ||||
|     flex-direction: column; | ||||
|     min-height: 100%; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user