commit
						e97480202e
					
				| @ -67,9 +67,7 @@ | |||||||
|     </ng-container> |     </ng-container> | ||||||
| 
 | 
 | ||||||
|     <div class="addon-data-contents addon-data-entries-{{data.id}}" *ngIf="!isEmpty"> |     <div class="addon-data-contents addon-data-entries-{{data.id}}" *ngIf="!isEmpty"> | ||||||
|         <style *ngIf="cssTemplate"> |         <core-style [css]="data.csstemplate" prefix=".addon-data-entries-{{data.id}}"></core-style> | ||||||
|             {{ cssTemplate }} |  | ||||||
|         </style> |  | ||||||
| 
 | 
 | ||||||
|         <core-compile-html [text]="entriesRendered" [jsData]="jsData" [extraImports]="extraImports"></core-compile-html> |         <core-compile-html [text]="entriesRendered" [jsData]="jsData" [extraImports]="extraImports"></core-compile-html> | ||||||
|     </div> |     </div> | ||||||
|  | |||||||
| @ -67,7 +67,6 @@ export class AddonModDataIndexComponent extends CoreCourseModuleMainActivityComp | |||||||
|     offlineActions: any; |     offlineActions: any; | ||||||
|     offlineEntries: any; |     offlineEntries: any; | ||||||
|     entriesRendered = ''; |     entriesRendered = ''; | ||||||
|     cssTemplate = ''; |  | ||||||
|     extraImports = [AddonModDataComponentsModule]; |     extraImports = [AddonModDataComponentsModule]; | ||||||
|     jsData; |     jsData; | ||||||
|     foundRecordsData; |     foundRecordsData; | ||||||
| @ -298,8 +297,6 @@ export class AddonModDataIndexComponent extends CoreCourseModuleMainActivityComp | |||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if (!this.isEmpty) { |             if (!this.isEmpty) { | ||||||
|                 this.cssTemplate = this.dataHelper.prefixCSS(this.data.csstemplate, '.addon-data-entries-' + this.data.id); |  | ||||||
| 
 |  | ||||||
|                 const siteInfo = this.sitesProvider.getCurrentSite().getInfo(), |                 const siteInfo = this.sitesProvider.getCurrentSite().getInfo(), | ||||||
|                     promises = []; |                     promises = []; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -18,10 +18,8 @@ | |||||||
|             </ion-select> |             </ion-select> | ||||||
|         </ion-item> |         </ion-item> | ||||||
| 
 | 
 | ||||||
|         <div class="addon-data-contents {{cssClass}}"> |         <div class="addon-data-contents addon-data-entries-{{data.id}}" *ngIf="data"> | ||||||
|             <style *ngIf="cssTemplate"> |             <core-style [css]="data.csstemplate" prefix=".addon-data-entries-{{data.id}}"></core-style> | ||||||
|                 {{ cssTemplate }} |  | ||||||
|             </style> |  | ||||||
| 
 | 
 | ||||||
|             <form (ngSubmit)="save($event)" [formGroup]="editForm"> |             <form (ngSubmit)="save($event)" [formGroup]="editForm"> | ||||||
|                 <core-compile-html [text]="editFormRender" [jsData]="jsData" [extraImports]="extraImports"></core-compile-html> |                 <core-compile-html [text]="editFormRender" [jsData]="jsData" [extraImports]="extraImports"></core-compile-html> | ||||||
|  | |||||||
| @ -57,7 +57,6 @@ export class AddonModDataEditPage { | |||||||
|     loaded = false; |     loaded = false; | ||||||
|     selectedGroup = 0; |     selectedGroup = 0; | ||||||
|     cssClass = ''; |     cssClass = ''; | ||||||
|     cssTemplate = ''; |  | ||||||
|     groupInfo: any; |     groupInfo: any; | ||||||
|     editFormRender = ''; |     editFormRender = ''; | ||||||
|     editForm: FormGroup; |     editForm: FormGroup; | ||||||
| @ -132,8 +131,6 @@ export class AddonModDataEditPage { | |||||||
| 
 | 
 | ||||||
|             return this.dataProvider.getDatabaseAccessInformation(data.id); |             return this.dataProvider.getDatabaseAccessInformation(data.id); | ||||||
|         }).then((accessData) => { |         }).then((accessData) => { | ||||||
|             this.cssTemplate = this.dataHelper.prefixCSS(this.data.csstemplate, '.' + this.cssClass); |  | ||||||
| 
 |  | ||||||
|             if (this.entryId) { |             if (this.entryId) { | ||||||
|                 return this.groupsProvider.getActivityGroupInfo(this.data.coursemodule, accessData.canmanageentries) |                 return this.groupsProvider.getActivityGroupInfo(this.data.coursemodule, accessData.canmanageentries) | ||||||
|                         .then((groupInfo) => { |                         .then((groupInfo) => { | ||||||
|  | |||||||
| @ -22,10 +22,8 @@ | |||||||
|             </ion-select> |             </ion-select> | ||||||
|         </ion-item> |         </ion-item> | ||||||
| 
 | 
 | ||||||
|         <div class="addon-data-contents {{cssClass}}" *ngIf="entry"> |         <div class="addon-data-contents addon-data-entries-{{data.id}}" *ngIf="entry"> | ||||||
|             <style *ngIf="cssTemplate"> |             <core-style [css]="data.csstemplate" prefix=".addon-data-entries-{{data.id}}"></core-style> | ||||||
|                 {{ cssTemplate }} |  | ||||||
|             </style> |  | ||||||
| 
 | 
 | ||||||
|             <core-compile-html [text]="entryRendered" [jsData]="jsData" [extraImports]="extraImports"></core-compile-html> |             <core-compile-html [text]="entryRendered" [jsData]="jsData" [extraImports]="extraImports"></core-compile-html> | ||||||
|         </div> |         </div> | ||||||
|  | |||||||
| @ -55,7 +55,6 @@ export class AddonModDataEntryPage implements OnDestroy { | |||||||
|     entry: any; |     entry: any; | ||||||
|     offlineActions = []; |     offlineActions = []; | ||||||
|     hasOffline = false; |     hasOffline = false; | ||||||
|     cssTemplate = ''; |  | ||||||
|     previousOffset: number; |     previousOffset: number; | ||||||
|     nextOffset: number; |     nextOffset: number; | ||||||
|     access: any; |     access: any; | ||||||
| @ -64,7 +63,6 @@ export class AddonModDataEntryPage implements OnDestroy { | |||||||
|     showComments: any; |     showComments: any; | ||||||
|     entryRendered = ''; |     entryRendered = ''; | ||||||
|     siteId: string; |     siteId: string; | ||||||
|     cssClass = ''; |  | ||||||
|     extraImports = [AddonModDataComponentsModule]; |     extraImports = [AddonModDataComponentsModule]; | ||||||
|     jsData; |     jsData; | ||||||
|     ratingInfo: CoreRatingInfo; |     ratingInfo: CoreRatingInfo; | ||||||
| @ -133,7 +131,6 @@ export class AddonModDataEntryPage implements OnDestroy { | |||||||
|         return this.dataProvider.getDatabase(this.courseId, this.module.id).then((data) => { |         return this.dataProvider.getDatabase(this.courseId, this.module.id).then((data) => { | ||||||
|             this.title = data.name || this.title; |             this.title = data.name || this.title; | ||||||
|             this.data = data; |             this.data = data; | ||||||
|             this.cssClass = 'addon-data-entries-' + data.id; |  | ||||||
| 
 | 
 | ||||||
|             return this.setEntryIdFromOffset(data.id, this.offset, this.selectedGroup).then(() => { |             return this.setEntryIdFromOffset(data.id, this.offset, this.selectedGroup).then(() => { | ||||||
|                 return this.dataProvider.getDatabaseAccessInformation(data.id); |                 return this.dataProvider.getDatabaseAccessInformation(data.id); | ||||||
| @ -167,8 +164,6 @@ export class AddonModDataEntryPage implements OnDestroy { | |||||||
|             this.ratingInfo = entry.ratinginfo; |             this.ratingInfo = entry.ratinginfo; | ||||||
|             entry = entry.entry; |             entry = entry.entry; | ||||||
| 
 | 
 | ||||||
|             this.cssTemplate = this.dataHelper.prefixCSS(this.data.csstemplate, '.' + this.cssClass); |  | ||||||
| 
 |  | ||||||
|             // Index contents by fieldid.
 |             // Index contents by fieldid.
 | ||||||
|             entry.contents = this.utils.arrayToObject(entry.contents, 'fieldid'); |             entry.contents = this.utils.arrayToObject(entry.contents, 'fieldid'); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -423,27 +423,6 @@ export class AddonModDataHelperProvider { | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * Add a prefix to all rules in a CSS string. |  | ||||||
|      * |  | ||||||
|      * @param {string} css      CSS code to be prefixed. |  | ||||||
|      * @param {string} prefix   Prefix css selector. |  | ||||||
|      * @return {string}         Prefixed CSS. |  | ||||||
|      */ |  | ||||||
|     prefixCSS(css: string, prefix: string): string { |  | ||||||
|         if (!css) { |  | ||||||
|             return ''; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Remove comments first.
 |  | ||||||
|         let regExp = /\/\*[\s\S]*?\*\/|([^:]|^)\/\/.*$/gm; |  | ||||||
|         css = css.replace(regExp, ''); |  | ||||||
|         // Add prefix.
 |  | ||||||
|         regExp = /([^]*?)({[^]*?}|,)/g; |  | ||||||
| 
 |  | ||||||
|         return css.replace(regExp, prefix + ' $1 $2'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |     /** | ||||||
|      * Given a list of files (either online files or local files), store the local files in a local folder |      * Given a list of files (either online files or local files), store the local files in a local folder | ||||||
|      * to be submitted later. |      * to be submitted later. | ||||||
|  | |||||||
| @ -51,6 +51,7 @@ import { CoreIonTabsComponent } from './ion-tabs/ion-tabs'; | |||||||
| import { CoreIonTabComponent } from './ion-tabs/ion-tab'; | import { CoreIonTabComponent } from './ion-tabs/ion-tab'; | ||||||
| import { CoreInfiniteLoadingComponent } from './infinite-loading/infinite-loading'; | import { CoreInfiniteLoadingComponent } from './infinite-loading/infinite-loading'; | ||||||
| import { CoreUserAvatarComponent } from './user-avatar/user-avatar'; | import { CoreUserAvatarComponent } from './user-avatar/user-avatar'; | ||||||
|  | import { CoreStyleComponent } from './style/style'; | ||||||
| 
 | 
 | ||||||
| @NgModule({ | @NgModule({ | ||||||
|     declarations: [ |     declarations: [ | ||||||
| @ -87,7 +88,8 @@ import { CoreUserAvatarComponent } from './user-avatar/user-avatar'; | |||||||
|         CoreIonTabsComponent, |         CoreIonTabsComponent, | ||||||
|         CoreIonTabComponent, |         CoreIonTabComponent, | ||||||
|         CoreInfiniteLoadingComponent, |         CoreInfiniteLoadingComponent, | ||||||
|         CoreUserAvatarComponent |         CoreUserAvatarComponent, | ||||||
|  |         CoreStyleComponent | ||||||
|     ], |     ], | ||||||
|     entryComponents: [ |     entryComponents: [ | ||||||
|         CoreContextMenuPopoverComponent, |         CoreContextMenuPopoverComponent, | ||||||
| @ -131,7 +133,8 @@ import { CoreUserAvatarComponent } from './user-avatar/user-avatar'; | |||||||
|         CoreIonTabsComponent, |         CoreIonTabsComponent, | ||||||
|         CoreIonTabComponent, |         CoreIonTabComponent, | ||||||
|         CoreInfiniteLoadingComponent, |         CoreInfiniteLoadingComponent, | ||||||
|         CoreUserAvatarComponent |         CoreUserAvatarComponent, | ||||||
|  |         CoreStyleComponent | ||||||
|     ] |     ] | ||||||
| }) | }) | ||||||
| export class CoreComponentsModule {} | export class CoreComponentsModule {} | ||||||
|  | |||||||
							
								
								
									
										73
									
								
								src/components/style/style.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/components/style/style.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,73 @@ | |||||||
|  | // (C) Copyright 2015 Martin Dougiamas
 | ||||||
|  | //
 | ||||||
|  | // 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, ElementRef, Input, OnChanges, SimpleChange } from '@angular/core'; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Component to add a <style> tag. | ||||||
|  |  * | ||||||
|  |  * @description | ||||||
|  |  * This component will include a <style> tag with some CSS rules that can optionally be pefixed. | ||||||
|  |  * | ||||||
|  |  * Example: | ||||||
|  |  * | ||||||
|  |  * <core-style [css]="'p { color: red; }'" prefix=".custom-rules"></core-style> | ||||||
|  |  */ | ||||||
|  | @Component({ | ||||||
|  |     selector: 'core-style', | ||||||
|  |     template: '' | ||||||
|  | }) | ||||||
|  | export class CoreStyleComponent implements OnChanges { | ||||||
|  |     @Input() css: string; // CSS rules.
 | ||||||
|  |     @Input() prefix?: string; // Prefix to add to CSS rules.
 | ||||||
|  | 
 | ||||||
|  |     constructor(private element: ElementRef) {} | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Component being changed. | ||||||
|  |      */ | ||||||
|  |     ngOnChanges(changes: { [name: string]: SimpleChange }): void { | ||||||
|  |         const css = this.prefixCSS(this.css, this.prefix); | ||||||
|  | 
 | ||||||
|  |         if (this.element && this.element.nativeElement) { | ||||||
|  |             this.element.nativeElement.innerHTML = '<style>' + css + '</style>'; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Add a prefix to all rules in a CSS string. | ||||||
|  |      * | ||||||
|  |      * @param {string} css CSS code to be prefixed. | ||||||
|  |      * @param {string} prefix Prefix css selector. | ||||||
|  |      * @return {string} Prefixed CSS. | ||||||
|  |      */ | ||||||
|  |     protected prefixCSS(css: string, prefix: string): string { | ||||||
|  |         if (!css) { | ||||||
|  |             return ''; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!prefix) { | ||||||
|  |             return css; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Remove comments first.
 | ||||||
|  |         let regExp = /\/\*[\s\S]*?\*\/|([^:]|^)\/\/.*$/gm; | ||||||
|  |         css = css.replace(regExp, ''); | ||||||
|  | 
 | ||||||
|  |         // Add prefix.
 | ||||||
|  |         regExp = /([^]*?)({[^]*?}|,)/g; | ||||||
|  | 
 | ||||||
|  |         return css.replace(regExp, prefix + ' $1 $2'); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user