commit
						84f59bb8ee
					
				@ -2578,6 +2578,7 @@
 | 
				
			|||||||
  "core.tag.searchtags": "tag",
 | 
					  "core.tag.searchtags": "tag",
 | 
				
			||||||
  "core.tag.showingfirsttags": "tag",
 | 
					  "core.tag.showingfirsttags": "tag",
 | 
				
			||||||
  "core.tag.tag": "moodle",
 | 
					  "core.tag.tag": "moodle",
 | 
				
			||||||
 | 
					  "core.tag.tagarea_badge": "badges",
 | 
				
			||||||
  "core.tag.tagarea_course": "tag",
 | 
					  "core.tag.tagarea_course": "tag",
 | 
				
			||||||
  "core.tag.tagarea_course_modules": "tag",
 | 
					  "core.tag.tagarea_course_modules": "tag",
 | 
				
			||||||
  "core.tag.tagarea_post": "tag",
 | 
					  "core.tag.tagarea_post": "tag",
 | 
				
			||||||
 | 
				
			|||||||
@ -23,6 +23,8 @@ import { AddonBadgesUserHandler } from './services/handlers/user';
 | 
				
			|||||||
import { CoreMainMenuTabRoutingModule } from '@features/mainmenu/mainmenu-tab-routing.module';
 | 
					import { CoreMainMenuTabRoutingModule } from '@features/mainmenu/mainmenu-tab-routing.module';
 | 
				
			||||||
import { CorePushNotificationsDelegate } from '@features/pushnotifications/services/push-delegate';
 | 
					import { CorePushNotificationsDelegate } from '@features/pushnotifications/services/push-delegate';
 | 
				
			||||||
import { AddonBadgesPushClickHandler } from './services/handlers/push-click';
 | 
					import { AddonBadgesPushClickHandler } from './services/handlers/push-click';
 | 
				
			||||||
 | 
					import { CoreTagAreaDelegate } from '@features/tag/services/tag-area-delegate';
 | 
				
			||||||
 | 
					import { AddonBadgesTagAreaHandler } from './services/handlers/tag-area';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Get badges services.
 | 
					 * Get badges services.
 | 
				
			||||||
@ -57,6 +59,7 @@ const mainMenuRoutes: Routes = [
 | 
				
			|||||||
                CoreContentLinksDelegate.registerHandler(AddonBadgesBadgeLinkHandler.instance);
 | 
					                CoreContentLinksDelegate.registerHandler(AddonBadgesBadgeLinkHandler.instance);
 | 
				
			||||||
                CoreUserDelegate.registerHandler(AddonBadgesUserHandler.instance);
 | 
					                CoreUserDelegate.registerHandler(AddonBadgesUserHandler.instance);
 | 
				
			||||||
                CorePushNotificationsDelegate.registerClickHandler(AddonBadgesPushClickHandler.instance);
 | 
					                CorePushNotificationsDelegate.registerClickHandler(AddonBadgesPushClickHandler.instance);
 | 
				
			||||||
 | 
					                CoreTagAreaDelegate.registerHandler(AddonBadgesTagAreaHandler.instance);
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										53
									
								
								src/addons/badges/services/handlers/tag-area.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/addons/badges/services/handlers/tag-area.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					// (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 { Injectable, Type } from '@angular/core';
 | 
				
			||||||
 | 
					import { CoreTagFeedComponent } from '@features/tag/components/feed/feed';
 | 
				
			||||||
 | 
					import { CoreTagAreaHandler } from '@features/tag/services/tag-area-delegate';
 | 
				
			||||||
 | 
					import { CoreTagFeedElement, CoreTagHelper } from '@features/tag/services/tag-helper';
 | 
				
			||||||
 | 
					import { makeSingleton } from '@singletons';
 | 
				
			||||||
 | 
					import { AddonBadges } from '../badges';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Handler to support tags.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Injectable({ providedIn: 'root' })
 | 
				
			||||||
 | 
					export class AddonBadgesTagAreaHandlerService implements CoreTagAreaHandler {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    name = 'AddonBadgesTagAreaHandler';
 | 
				
			||||||
 | 
					    type = 'core_badges/badge';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @inheritdoc
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    isEnabled(): Promise<boolean> {
 | 
				
			||||||
 | 
					        return AddonBadges.isPluginEnabled();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @inheritdoc
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    async parseContent(content: string): Promise<CoreTagFeedElement[]> {
 | 
				
			||||||
 | 
					        return CoreTagHelper.parseFeedContent(content);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @inheritdoc
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    getComponent(): Type<unknown> | Promise<Type<unknown>> {
 | 
				
			||||||
 | 
					        return CoreTagFeedComponent;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					export const AddonBadgesTagAreaHandler = makeSingleton(AddonBadgesTagAreaHandlerService);
 | 
				
			||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
<ion-card *ngFor="let item of items">
 | 
					<ion-card *ngFor="let item of items">
 | 
				
			||||||
    <ion-item class="ion-text-wrap" [href]="item.url" core-link [capture]="true">
 | 
					    <ion-item class="ion-text-wrap" [href]="item.url" core-link [capture]="true">
 | 
				
			||||||
        <core-user-avatar *ngIf="item.avatarUrl" [profileUrl]="item.avatarUrl" slot="start" [linkProfile]="false" />
 | 
					        <core-user-avatar *ngIf="item.avatarUrl" [profileUrl]="item.avatarUrl" [fullname]="item.fullname" slot="start"
 | 
				
			||||||
 | 
					            [linkProfile]="false" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <core-mod-icon *ngIf="item.iconUrl" [modicon]="item.iconUrl" slot="start" [showAlt]="false" [isBranded]="item.branded" />
 | 
					        <core-mod-icon *ngIf="item.iconUrl" [modicon]="item.iconUrl" slot="start" [showAlt]="false" [isBranded]="item.branded" />
 | 
				
			||||||
        <ion-label>
 | 
					        <ion-label>
 | 
				
			||||||
 | 
				
			|||||||
@ -8,8 +8,9 @@
 | 
				
			|||||||
    "searchtags": "Search tags",
 | 
					    "searchtags": "Search tags",
 | 
				
			||||||
    "showingfirsttags": "Showing {{$a}} most popular tags",
 | 
					    "showingfirsttags": "Showing {{$a}} most popular tags",
 | 
				
			||||||
    "tag": "Tag",
 | 
					    "tag": "Tag",
 | 
				
			||||||
    "tagarea_course": "Courses",
 | 
					    "tagarea_badge": "Badges",
 | 
				
			||||||
    "tagarea_course_modules": "Activities and resources",
 | 
					    "tagarea_course_modules": "Activities and resources",
 | 
				
			||||||
 | 
					    "tagarea_course": "Courses",
 | 
				
			||||||
    "tagarea_post": "Blog posts",
 | 
					    "tagarea_post": "Blog posts",
 | 
				
			||||||
    "tagarea_user": "User interests",
 | 
					    "tagarea_user": "User interests",
 | 
				
			||||||
    "tagareabadgedescription": "There are {{count}} items.",
 | 
					    "tagareabadgedescription": "There are {{count}} items.",
 | 
				
			||||||
 | 
				
			|||||||
@ -69,7 +69,7 @@ export class CoreTagAreaDelegateService extends CoreDelegate<CoreTagAreaHandler>
 | 
				
			|||||||
     * @returns String key.
 | 
					     * @returns String key.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    getDisplayNameKey(component: string, itemType: string): string {
 | 
					    getDisplayNameKey(component: string, itemType: string): string {
 | 
				
			||||||
        return (component == 'core' ? 'core.tag' : 'addon.' + component) + '.tagarea_' + itemType;
 | 
					        return (component === 'core' || component.startsWith('core_') ? 'core.tag' : 'addon.' + component) + '.tagarea_' + itemType;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
				
			|||||||
@ -32,11 +32,11 @@ export class CoreTagHelperProvider {
 | 
				
			|||||||
        const items: CoreTagFeedElement[] = [];
 | 
					        const items: CoreTagFeedElement[] = [];
 | 
				
			||||||
        const element = CoreDomUtils.convertToElement(content);
 | 
					        const element = CoreDomUtils.convertToElement(content);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Array.from(element.querySelectorAll('ul.tag_feed > li.media')).forEach((itemElement) => {
 | 
					        Array.from(element.querySelectorAll('ul.tag_feed > li')).forEach((itemElement) => {
 | 
				
			||||||
            const item: CoreTagFeedElement = { details: [] };
 | 
					            const item: CoreTagFeedElement = { details: [] };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Array.from(itemElement.querySelectorAll('div.media-body > div')).forEach((div: HTMLElement) => {
 | 
					            Array.from(itemElement.querySelectorAll('div.media-body > div, div.flex-grow-1 > div')).forEach((div: HTMLElement) => {
 | 
				
			||||||
                if (div.classList.contains('media-heading')) {
 | 
					                if (div.classList.contains('media-heading') || div.classList.contains('item-heading')) {
 | 
				
			||||||
                    item.heading = div.innerText.trim();
 | 
					                    item.heading = div.innerText.trim();
 | 
				
			||||||
                    const link = div.querySelector('a');
 | 
					                    const link = div.querySelector('a');
 | 
				
			||||||
                    if (link) {
 | 
					                    if (link) {
 | 
				
			||||||
@ -46,11 +46,11 @@ export class CoreTagHelperProvider {
 | 
				
			|||||||
                    // Separate details by lines.
 | 
					                    // Separate details by lines.
 | 
				
			||||||
                    const lines = [''];
 | 
					                    const lines = [''];
 | 
				
			||||||
                    Array.from(div.childNodes).forEach((childNode: Node) => {
 | 
					                    Array.from(div.childNodes).forEach((childNode: Node) => {
 | 
				
			||||||
                        if (childNode.nodeType == Node.TEXT_NODE) {
 | 
					                        if (childNode.nodeType === Node.TEXT_NODE) {
 | 
				
			||||||
                            lines[lines.length - 1] += childNode.textContent;
 | 
					                            lines[lines.length - 1] += childNode.textContent;
 | 
				
			||||||
                        } else if (childNode.nodeType == Node.ELEMENT_NODE) {
 | 
					                        } else if (childNode.nodeType === Node.ELEMENT_NODE) {
 | 
				
			||||||
                            const childElement = childNode as HTMLElement;
 | 
					                            const childElement = childNode as HTMLElement;
 | 
				
			||||||
                            if (childElement.tagName == 'BR') {
 | 
					                            if (childElement.tagName === 'BR') {
 | 
				
			||||||
                                lines.push('');
 | 
					                                lines.push('');
 | 
				
			||||||
                            } else {
 | 
					                            } else {
 | 
				
			||||||
                                lines[lines.length - 1] += childElement.innerText;
 | 
					                                lines[lines.length - 1] += childElement.innerText;
 | 
				
			||||||
@ -61,13 +61,20 @@ export class CoreTagHelperProvider {
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const image = itemElement.querySelector('div.itemimage img');
 | 
					            const image = itemElement.querySelector('div.itemimage img, div.flex-shrink-0 img');
 | 
				
			||||||
            if (image) {
 | 
					            if (image) {
 | 
				
			||||||
                if (image.classList.contains('userpicture')) {
 | 
					                if (image.classList.contains('userpicture')) {
 | 
				
			||||||
                    item.avatarUrl = image.getAttribute('src');
 | 
					                    item.avatarUrl = image.getAttribute('src');
 | 
				
			||||||
 | 
					                    item.fullname = image.getAttribute('title');
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    item.iconUrl = image.getAttribute('src');
 | 
					                    item.iconUrl = image.getAttribute('src');
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                const initials = itemElement.querySelector('div.itemimage .userinitials, div.flex-shrink-0 .userinitials');
 | 
				
			||||||
 | 
					                if (initials) {
 | 
				
			||||||
 | 
					                    item.avatarUrl = 'error'; // Use 'error' to show the default avatar.
 | 
				
			||||||
 | 
					                    item.fullname = initials.getAttribute('title');
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (item.heading && item.url) {
 | 
					            if (item.heading && item.url) {
 | 
				
			||||||
@ -91,4 +98,5 @@ export type CoreTagFeedElement = {
 | 
				
			|||||||
    iconUrl?: string | null;
 | 
					    iconUrl?: string | null;
 | 
				
			||||||
    avatarUrl?: string | null;
 | 
					    avatarUrl?: string | null;
 | 
				
			||||||
    url?: string | null;
 | 
					    url?: string | null;
 | 
				
			||||||
 | 
					    fullname?: string | null;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user