MOBILE-3749 core: Add new spacer component
parent
7851a97e6d
commit
abd722396b
|
@ -4,9 +4,7 @@
|
||||||
<ion-label>{{ 'addon.calendar.' + type + 'events' | translate}}</ion-label>
|
<ion-label>{{ 'addon.calendar.' + type + 'events' | translate}}</ion-label>
|
||||||
<ion-toggle [(ngModel)]="filter[type]" (ionChange)="onChange()" slot="end"></ion-toggle>
|
<ion-toggle [(ngModel)]="filter[type]" (ionChange)="onChange()" slot="end"></ion-toggle>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item-divider *ngIf="filter.course || filter.category || filter.group">
|
<core-spacer *ngIf="filter.course || filter.category || filter.group"></core-spacer>
|
||||||
<ion-label></ion-label>
|
|
||||||
</ion-item-divider>
|
|
||||||
<ng-container *ngIf="filter.course || filter.category || filter.group">
|
<ng-container *ngIf="filter.course || filter.category || filter.group">
|
||||||
<ion-radio-group [(ngModel)]="courseId" (ionChange)="onChange()">
|
<ion-radio-group [(ngModel)]="courseId" (ionChange)="onChange()">
|
||||||
<ion-item class="ion-text-wrap" *ngFor="let course of courses">
|
<ion-item class="ion-text-wrap" *ngFor="let course of courses">
|
||||||
|
|
|
@ -33,9 +33,7 @@
|
||||||
</ion-item >
|
</ion-item >
|
||||||
<ng-container *ngIf="items && items.length">
|
<ng-container *ngIf="items && items.length">
|
||||||
<ng-container *ngFor="let item of items">
|
<ng-container *ngFor="let item of items">
|
||||||
<ion-item-divider *ngIf="item.typ == 'pagebreak'">
|
<core-spacer *ngIf="item.typ == 'pagebreak'"></core-spacer>
|
||||||
<ion-label></ion-label>
|
|
||||||
</ion-item-divider>
|
|
||||||
<ion-item class="ion-text-wrap" *ngIf="item.typ != 'pagebreak'" [color]="item.dependitem > 0 ? 'light' : ''">
|
<ion-item class="ion-text-wrap" *ngIf="item.typ != 'pagebreak'" [color]="item.dependitem > 0 ? 'light' : ''">
|
||||||
<ion-label>
|
<ion-label>
|
||||||
<h2 *ngIf="item.name" [core-mark-required]="item.required">
|
<h2 *ngIf="item.name" [core-mark-required]="item.required">
|
||||||
|
|
|
@ -21,9 +21,7 @@
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ng-container *ngFor="let item of items">
|
<ng-container *ngFor="let item of items">
|
||||||
<ion-item-divider *ngIf="item.typ == 'pagebreak'">
|
<core-spacer *ngIf="item.typ == 'pagebreak'"></core-spacer>
|
||||||
<ion-label></ion-label>
|
|
||||||
</ion-item-divider>
|
|
||||||
<ng-container *ngIf="item.typ != 'pagebreak'">
|
<ng-container *ngIf="item.typ != 'pagebreak'">
|
||||||
<ion-item class="ion-text-wrap addon-mod_feedback-item" [color]="item.dependitem > 0 ? 'light' : ''"
|
<ion-item class="ion-text-wrap addon-mod_feedback-item" [color]="item.dependitem > 0 ? 'light' : ''"
|
||||||
[class.core-danger-item]="item.isEmpty || item.hasError">
|
[class.core-danger-item]="item.isEmpty || item.hasError">
|
||||||
|
|
|
@ -101,7 +101,7 @@
|
||||||
|
|
||||||
<ion-card *ngIf="sort != 'nested'">
|
<ion-card *ngIf="sort != 'nested'">
|
||||||
<ng-container *ngFor="let post of posts; first as first">
|
<ng-container *ngFor="let post of posts; first as first">
|
||||||
<ion-item-divider *ngIf="!first"><ion-label></ion-label></ion-item-divider>
|
<core-spacer *ngIf="!first"></core-spacer>
|
||||||
<addon-mod-forum-post
|
<addon-mod-forum-post
|
||||||
[post]="post" [courseId]="courseId" [discussionId]="discussionId"
|
[post]="post" [courseId]="courseId" [discussionId]="discussionId"
|
||||||
[component]="component" [componentId]="cmId" [replyData]="replyData"
|
[component]="component" [componentId]="cmId" [replyData]="replyData"
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
<core-dynamic-component [component]="data.component" [data]="data.data">
|
<core-dynamic-component [component]="data.component" [data]="data.data">
|
||||||
<p class="ion-padding">Couldn't find the directive to render this access rule.</p>
|
<p class="ion-padding">Couldn't find the directive to render this access rule.</p>
|
||||||
</core-dynamic-component>
|
</core-dynamic-component>
|
||||||
<ion-item-divider *ngIf="!last"><ion-label></ion-label></ion-item-divider>
|
<core-spacer *ngIf="!last"></core-spacer>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ion-button expand="block" type="submit" class="ion-margin">
|
<ion-button expand="block" type="submit" class="ion-margin">
|
||||||
|
|
|
@ -56,6 +56,7 @@ import { CoreTabsOutletComponent } from './tabs-outlet/tabs-outlet';
|
||||||
import { CoreTimerComponent } from './timer/timer';
|
import { CoreTimerComponent } from './timer/timer';
|
||||||
import { CoreUserAvatarComponent } from './user-avatar/user-avatar';
|
import { CoreUserAvatarComponent } from './user-avatar/user-avatar';
|
||||||
import { CoreComboboxComponent } from './combobox/combobox';
|
import { CoreComboboxComponent } from './combobox/combobox';
|
||||||
|
import { CoreSpacerComponent } from './spacer/spacer';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [
|
declarations: [
|
||||||
|
@ -94,6 +95,7 @@ import { CoreComboboxComponent } from './combobox/combobox';
|
||||||
CoreTimerComponent,
|
CoreTimerComponent,
|
||||||
CoreUserAvatarComponent,
|
CoreUserAvatarComponent,
|
||||||
CoreComboboxComponent,
|
CoreComboboxComponent,
|
||||||
|
CoreSpacerComponent,
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
|
@ -139,6 +141,7 @@ import { CoreComboboxComponent } from './combobox/combobox';
|
||||||
CoreTimerComponent,
|
CoreTimerComponent,
|
||||||
CoreUserAvatarComponent,
|
CoreUserAvatarComponent,
|
||||||
CoreComboboxComponent,
|
CoreComboboxComponent,
|
||||||
|
CoreSpacerComponent,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
export class CoreComponentsModule {}
|
export class CoreComponentsModule {}
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component to display an empty spacer using item divider.
|
||||||
|
*
|
||||||
|
* Example usage:
|
||||||
|
* <core-spacer></core-spacer>
|
||||||
|
*/
|
||||||
|
@Component({
|
||||||
|
selector: 'core-spacer',
|
||||||
|
template: '<ion-item-divider><ion-label></ion-label></ion-item-divider>',
|
||||||
|
styles: [':host {--item-divider-min-height: 30px;}'],
|
||||||
|
})
|
||||||
|
export class CoreSpacerComponent {
|
||||||
|
|
||||||
|
}
|
|
@ -44,14 +44,14 @@ import {
|
||||||
})
|
})
|
||||||
export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
|
|
||||||
@Input() module?: CoreCourseModule; // The module to render.
|
@Input() module!: CoreCourseModule; // The module to render.
|
||||||
@Input() courseId?: number; // The course the module belongs to.
|
@Input() courseId?: number; // The course the module belongs to.
|
||||||
@Input() section?: CoreCourseSection; // The section the module belongs to.
|
@Input() section?: CoreCourseSection; // The section the module belongs to.
|
||||||
// eslint-disable-next-line @angular-eslint/no-input-rename
|
// eslint-disable-next-line @angular-eslint/no-input-rename
|
||||||
@Input('downloadEnabled') set enabled(value: boolean) {
|
@Input('downloadEnabled') set enabled(value: boolean) {
|
||||||
this.downloadEnabled = value;
|
this.downloadEnabled = value;
|
||||||
|
|
||||||
if (!this.module?.handlerData?.showDownloadButton || !this.downloadEnabled || this.statusCalculated) {
|
if (!this.module.handlerData?.showDownloadButton || !this.downloadEnabled || this.statusCalculated) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,10 +81,6 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
* Component being initialized.
|
* Component being initialized.
|
||||||
*/
|
*/
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
if (!this.module) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.courseId = this.courseId || this.module.course;
|
this.courseId = this.courseId || this.module.course;
|
||||||
this.modNameTranslated = CoreCourse.translateModuleName(this.module.modname) || '';
|
this.modNameTranslated = CoreCourse.translateModuleName(this.module.modname) || '';
|
||||||
|
|
||||||
|
@ -125,7 +121,7 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
* @param event Click event.
|
* @param event Click event.
|
||||||
*/
|
*/
|
||||||
moduleClicked(event: Event): void {
|
moduleClicked(event: Event): void {
|
||||||
if (this.module?.uservisible !== false && this.module?.handlerData?.action) {
|
if (this.module.uservisible !== false && this.module.handlerData?.action) {
|
||||||
this.module.handlerData.action(event, this.module, this.courseId!);
|
this.module.handlerData.action(event, this.module, this.courseId!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -195,7 +191,7 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
this.spinner = false;
|
this.spinner = false;
|
||||||
this.downloadStatus = status;
|
this.downloadStatus = status;
|
||||||
|
|
||||||
this.module?.handlerData?.updateStatus?.(status);
|
this.module.handlerData?.updateStatus?.(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -218,7 +214,7 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
*/
|
*/
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
// this.statusObserver?.off();
|
// this.statusObserver?.off();
|
||||||
this.module?.handlerData?.onDestroy?.();
|
this.module.handlerData?.onDestroy?.();
|
||||||
this.isDestroyed = true;
|
this.isDestroyed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
<h2>{{contact.fullname}}</h2>
|
<h2>{{contact.fullname}}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item-divider><ion-label></ion-label></ion-item-divider>
|
<core-spacer></core-spacer>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ion-item class="ion-text-wrap" *ngIf="course.customfields">
|
<ion-item class="ion-text-wrap" *ngIf="course.customfields">
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
<p>{{ siteUrl }}</p>
|
<p>{{ siteUrl }}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item-divider><ion-label></ion-label></ion-item-divider>
|
<core-spacer></core-spacer>
|
||||||
<ion-item class="ion-text-center" *ngIf="(!handlers || !handlers.length) && !handlersLoaded">
|
<ion-item class="ion-text-center" *ngIf="(!handlers || !handlers.length) && !handlersLoaded">
|
||||||
<ion-label><ion-spinner></ion-spinner></ion-label>
|
<ion-label><ion-spinner></ion-spinner></ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
@ -82,7 +82,7 @@
|
||||||
<h2>{{ logoutLabel | translate }}</h2>
|
<h2>{{ logoutLabel | translate }}</h2>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item-divider><ion-label></ion-label></ion-item-divider>
|
<core-spacer></core-spacer>
|
||||||
<ion-item button (click)="openSettings()" [attr.aria-label]="'core.settings.appsettings' | translate" detail="true">
|
<ion-item button (click)="openSettings()" [attr.aria-label]="'core.settings.appsettings' | translate" detail="true">
|
||||||
<ion-icon name="fas-cogs" slot="start" aria-hidden="true"></ion-icon>
|
<ion-icon name="fas-cogs" slot="start" aria-hidden="true"></ion-icon>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
<p>{{ siteUrl }}</p>
|
<p>{{ siteUrl }}</p>
|
||||||
</ion-label>
|
</ion-label>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item-divider><ion-label></ion-label></ion-item-divider>
|
<core-spacer></core-spacer>
|
||||||
|
|
||||||
<ion-item *ngFor="let handler of handlers.items" [ngClass]="['core-settings-handler', handler.class]"
|
<ion-item *ngFor="let handler of handlers.items" [ngClass]="['core-settings-handler', handler.class]"
|
||||||
[attr.aria-label]="handler.title | translate" detail="true" (click)="handlers.select(handler)" button
|
[attr.aria-label]="handler.title | translate" detail="true" (click)="handlers.select(handler)" button
|
||||||
|
|
|
@ -31,9 +31,7 @@
|
||||||
|
|
||||||
<!-- Site home items: news, categories, courses, etc. -->
|
<!-- Site home items: news, categories, courses, etc. -->
|
||||||
<ng-container *ngIf="items.length > 0">
|
<ng-container *ngIf="items.length > 0">
|
||||||
<ion-item-divider *ngIf="section && section!.hasContent">
|
<core-spacer *ngIf="section && section!.hasContent"></core-spacer>
|
||||||
<ion-label></ion-label>
|
|
||||||
</ion-item-divider>
|
|
||||||
<ng-container *ngFor="let item of items">
|
<ng-container *ngFor="let item of items">
|
||||||
<ng-container [ngSwitch]="item">
|
<ng-container [ngSwitch]="item">
|
||||||
<ng-container *ngSwitchCase="'LIST_OF_COURSE'">
|
<ng-container *ngSwitchCase="'LIST_OF_COURSE'">
|
||||||
|
|
|
@ -193,11 +193,6 @@ ion-item-divider {
|
||||||
opacity: var(--ion-item-detail-icon-opacity);
|
opacity: var(--ion-item-detail-icon-opacity);
|
||||||
padding-inline-end: 16px;
|
padding-inline-end: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.ios {
|
|
||||||
padding-top: 10px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ionic list.
|
// Ionic list.
|
||||||
|
|
|
@ -171,10 +171,11 @@
|
||||||
--detail-icon-opacity: var(--ion-item-detail-icon-opacity);
|
--detail-icon-opacity: var(--ion-item-detail-icon-opacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
--item-divider-min-height: calc(var(--a11y-min-target-size) + 8px);
|
||||||
ion-item-divider {
|
ion-item-divider {
|
||||||
--background: var(--gray-lighter);
|
--background: var(--gray-lighter);
|
||||||
--color: inherit;
|
--color: inherit;
|
||||||
min-height: calc(var(--a11y-min-target-size) + 8px);
|
min-height: var(--item-divider-min-height);
|
||||||
}
|
}
|
||||||
|
|
||||||
--core-combobox-background: var(--ion-item-background);
|
--core-combobox-background: var(--ion-item-background);
|
||||||
|
|
Loading…
Reference in New Issue