forked from CIT/Vmeda.Online
		
	MOBILE-3901 insights: Support insight action links
This commit is contained in:
		
							parent
							
								
									7618da4bfa
								
							
						
					
					
						commit
						94c656d015
					
				@ -1073,6 +1073,12 @@
 | 
			
		||||
  "addon.privatefiles.sitefiles": "moodle",
 | 
			
		||||
  "addon.qtype_essay.maxwordlimitboundary": "qtype_essay",
 | 
			
		||||
  "addon.qtype_essay.minwordlimitboundary": "qtype_essay",
 | 
			
		||||
  "addon.report_insights.actionsaved": "report_insights",
 | 
			
		||||
  "addon.report_insights.fixedack": "analytics",
 | 
			
		||||
  "addon.report_insights.incorrectlyflagged": "analytics",
 | 
			
		||||
  "addon.report_insights.notapplicable": "analytics",
 | 
			
		||||
  "addon.report_insights.notuseful": "analytics",
 | 
			
		||||
  "addon.report_insights.useful": "analytics",
 | 
			
		||||
  "addon.storagemanager.deletecourse": "local_moodlemobileapp",
 | 
			
		||||
  "addon.storagemanager.deletecourses": "local_moodlemobileapp",
 | 
			
		||||
  "addon.storagemanager.deletedatafrom": "local_moodlemobileapp",
 | 
			
		||||
 | 
			
		||||
@ -30,6 +30,7 @@ import { AddonPrivateFilesModule } from './privatefiles/privatefiles.module';
 | 
			
		||||
import { AddonQbehaviourModule } from './qbehaviour/qbehaviour.module';
 | 
			
		||||
import { AddonQtypeModule } from './qtype/qtype.module';
 | 
			
		||||
import { AddonRemoteThemesModule } from './remotethemes/remotethemes.module';
 | 
			
		||||
import { AddonReportModule } from './report/report.module';
 | 
			
		||||
import { AddonStorageManagerModule } from './storagemanager/storagemanager.module';
 | 
			
		||||
import { AddonUserProfileFieldModule } from './userprofilefield/userprofilefield.module';
 | 
			
		||||
 | 
			
		||||
@ -51,6 +52,7 @@ import { AddonUserProfileFieldModule } from './userprofilefield/userprofilefield
 | 
			
		||||
        AddonQbehaviourModule,
 | 
			
		||||
        AddonQtypeModule,
 | 
			
		||||
        AddonRemoteThemesModule,
 | 
			
		||||
        AddonReportModule,
 | 
			
		||||
        AddonStorageManagerModule,
 | 
			
		||||
        AddonUserProfileFieldModule,
 | 
			
		||||
    ],
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										33
									
								
								src/addons/report/insights/insights.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/addons/report/insights/insights.module.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
			
		||||
// (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 { APP_INITIALIZER, NgModule } from '@angular/core';
 | 
			
		||||
 | 
			
		||||
import { CoreContentLinksDelegate } from '@features/contentlinks/services/contentlinks-delegate';
 | 
			
		||||
import { AddonReportInsightsActionLinkHandler } from './services/handlers/action-link';
 | 
			
		||||
 | 
			
		||||
@NgModule({
 | 
			
		||||
    imports: [],
 | 
			
		||||
    exports: [],
 | 
			
		||||
    providers: [
 | 
			
		||||
        {
 | 
			
		||||
            provide: APP_INITIALIZER,
 | 
			
		||||
            multi: true,
 | 
			
		||||
            useValue: () => {
 | 
			
		||||
                CoreContentLinksDelegate.registerHandler(AddonReportInsightsActionLinkHandler.instance);
 | 
			
		||||
            },
 | 
			
		||||
        },
 | 
			
		||||
    ],
 | 
			
		||||
})
 | 
			
		||||
export class AddonReportInsightsModule {}
 | 
			
		||||
							
								
								
									
										8
									
								
								src/addons/report/insights/lang.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/addons/report/insights/lang.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
    "actionsaved": "Your feedback of '{{$a}}' has been saved",
 | 
			
		||||
    "fixedack": "Accept",
 | 
			
		||||
    "incorrectlyflagged": "Incorrectly flagged",
 | 
			
		||||
    "notapplicable": "Not applicable",
 | 
			
		||||
    "notuseful": "Not useful",
 | 
			
		||||
    "useful": "Useful"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										104
									
								
								src/addons/report/insights/services/handlers/action-link.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								src/addons/report/insights/services/handlers/action-link.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
// (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 } from '@angular/core';
 | 
			
		||||
 | 
			
		||||
import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler';
 | 
			
		||||
import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate';
 | 
			
		||||
import { CoreContentLinksHelper } from '@features/contentlinks/services/contentlinks-helper';
 | 
			
		||||
import { CoreSites } from '@services/sites';
 | 
			
		||||
import { CoreDomUtils } from '@services/utils/dom';
 | 
			
		||||
import { makeSingleton, Translate } from '@singletons';
 | 
			
		||||
import { AddonReportInsights } from '../insights';
 | 
			
		||||
 | 
			
		||||
// Bulk actions supported, along with the related lang string.
 | 
			
		||||
const BULK_ACTIONS = {
 | 
			
		||||
    fixed: 'addon.report_insights.fixedack',
 | 
			
		||||
    incorrectlyflagged: 'addon.report_insights.incorrectlyflagged',
 | 
			
		||||
    notapplicable: 'addon.report_insights.notapplicable',
 | 
			
		||||
    notuseful: 'addon.report_insights.notuseful',
 | 
			
		||||
    useful: 'addon.report_insights.useful',
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Content links handler for calendar view page.
 | 
			
		||||
 */
 | 
			
		||||
@Injectable({ providedIn: 'root' })
 | 
			
		||||
export class AddonReportInsightsActionLinkHandlerService extends CoreContentLinksHandlerBase {
 | 
			
		||||
 | 
			
		||||
    name = 'AddonReportInsightsActionLinkHandler';
 | 
			
		||||
    pattern = /\/report\/insights\/action\.php/;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @inheritdoc
 | 
			
		||||
     */
 | 
			
		||||
    getActions(
 | 
			
		||||
        siteIds: string[],
 | 
			
		||||
        url: string,
 | 
			
		||||
        params: Record<string, string>,
 | 
			
		||||
    ): CoreContentLinksAction[] | Promise<CoreContentLinksAction[]> {
 | 
			
		||||
        return [{
 | 
			
		||||
            action: async (siteId?: string): Promise<void> => {
 | 
			
		||||
                // Send the action.
 | 
			
		||||
                const modal = await CoreDomUtils.showModalLoading('core.sending', true);
 | 
			
		||||
 | 
			
		||||
                try {
 | 
			
		||||
                    await AddonReportInsights.sendActionExecuted(params.action, [Number(params.predictionid)], siteId);
 | 
			
		||||
                } catch (error) {
 | 
			
		||||
                    CoreDomUtils.showErrorModal(error);
 | 
			
		||||
 | 
			
		||||
                    return;
 | 
			
		||||
                } finally {
 | 
			
		||||
                    modal.dismiss();
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (BULK_ACTIONS[params.action]) {
 | 
			
		||||
                    // Done, display a toast.
 | 
			
		||||
                    CoreDomUtils.showToast(Translate.instant('addon.report_insights.actionsaved', {
 | 
			
		||||
                        $a: Translate.instant(BULK_ACTIONS[params.action]),
 | 
			
		||||
                    }));
 | 
			
		||||
                } else if (!params.forwardurl) {
 | 
			
		||||
                    // Forward URL not defined, display a toast.
 | 
			
		||||
                    CoreDomUtils.showToast('core.success', true);
 | 
			
		||||
                } else {
 | 
			
		||||
                    // Try to open the link in the app.
 | 
			
		||||
                    const forwardUrl = decodeURIComponent(params.forwardurl);
 | 
			
		||||
 | 
			
		||||
                    const treated = await CoreContentLinksHelper.handleLink(forwardUrl);
 | 
			
		||||
                    if (!treated) {
 | 
			
		||||
                        // Cannot be opened in the app, open in browser.
 | 
			
		||||
                        const site = await CoreSites.getSite(siteId);
 | 
			
		||||
 | 
			
		||||
                        await site.openInBrowserWithAutoLoginIfSameSite(forwardUrl);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
        }];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @inheritdoc
 | 
			
		||||
     */
 | 
			
		||||
    async isEnabled(siteId: string, url: string, params: Record<string, string>): Promise<boolean> {
 | 
			
		||||
        if (!params.action || !params.predictionid) {
 | 
			
		||||
            // Required params missing.
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return await AddonReportInsights.canSendActionInSite(siteId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const AddonReportInsightsActionLinkHandler = makeSingleton(AddonReportInsightsActionLinkHandlerService);
 | 
			
		||||
							
								
								
									
										93
									
								
								src/addons/report/insights/services/insights.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								src/addons/report/insights/services/insights.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,93 @@
 | 
			
		||||
// (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 } from '@angular/core';
 | 
			
		||||
 | 
			
		||||
import { CoreSites } from '@services/sites';
 | 
			
		||||
import { CoreSite } from '@classes/site';
 | 
			
		||||
import { makeSingleton } from '@singletons';
 | 
			
		||||
import { CoreWSExternalWarning } from '@services/ws';
 | 
			
		||||
import { CoreWSError } from '@classes/errors/wserror';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Service to handle insights.
 | 
			
		||||
 */
 | 
			
		||||
@Injectable({ providedIn: 'root' })
 | 
			
		||||
export class AddonReportInsightsService {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if site supports sending insight actions.
 | 
			
		||||
     *
 | 
			
		||||
     * @param siteId Site ID. If not defined, current site.
 | 
			
		||||
     * @return Promise resolved with boolean: whether it's supported.
 | 
			
		||||
     */
 | 
			
		||||
    async canSendActionInSite(siteId?: string): Promise<boolean> {
 | 
			
		||||
        const site = await CoreSites.getSite(siteId);
 | 
			
		||||
 | 
			
		||||
        return this.canSendAction(site);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Check if site supports sending insight actions.
 | 
			
		||||
     *
 | 
			
		||||
     * @param site Site. If not defined, current site.
 | 
			
		||||
     * @return Whether it's supported.
 | 
			
		||||
     */
 | 
			
		||||
    canSendAction(site?: CoreSite): boolean {
 | 
			
		||||
        site = site || CoreSites.getCurrentSite();
 | 
			
		||||
 | 
			
		||||
        return !!site?.wsAvailable('report_insights_action_executed');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Send an action.
 | 
			
		||||
     *
 | 
			
		||||
     * @param actionName Action name.
 | 
			
		||||
     * @param ids List of IDs.
 | 
			
		||||
     * @param siteId Site ID. If not defined, current site.
 | 
			
		||||
     * @return Promise resolved if success.
 | 
			
		||||
     */
 | 
			
		||||
    async sendActionExecuted(actionName: string, ids: number[], siteId?: string): Promise<void> {
 | 
			
		||||
        const site = await CoreSites.getSite(siteId);
 | 
			
		||||
 | 
			
		||||
        const params: AddonReportInsightsActionExecutedWSParams = {
 | 
			
		||||
            actionname: actionName,
 | 
			
		||||
            predictionids: ids,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        const result = await site.write<AddonReportInsightsActionExecutedWSResult>('report_insights_action_executed', params);
 | 
			
		||||
 | 
			
		||||
        if (result.warnings?.length) {
 | 
			
		||||
            throw new CoreWSError(result.warnings[0]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const AddonReportInsights = makeSingleton(AddonReportInsightsService);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Params of WS report_insights_action_executed.
 | 
			
		||||
 */
 | 
			
		||||
export type AddonReportInsightsActionExecutedWSParams = {
 | 
			
		||||
    actionname: string; // The name of the action.
 | 
			
		||||
    predictionids: number[]; // Array of prediction ids.
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Result of WS report_insights_action_executed.
 | 
			
		||||
 */
 | 
			
		||||
export type AddonReportInsightsActionExecutedWSResult = {
 | 
			
		||||
    warnings?: CoreWSExternalWarning[];
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										23
									
								
								src/addons/report/report.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/addons/report/report.module.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
// (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 { NgModule } from '@angular/core';
 | 
			
		||||
import { AddonReportInsightsModule } from './insights/insights.module';
 | 
			
		||||
 | 
			
		||||
@NgModule({
 | 
			
		||||
    imports: [
 | 
			
		||||
        AddonReportInsightsModule,
 | 
			
		||||
    ],
 | 
			
		||||
})
 | 
			
		||||
export class AddonReportModule { }
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user