@dataclouder/ngx-lessons 0.1.25 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Pipe, InjectionToken, inject, Input, Component, ChangeDetectionStrategy, signal, EventEmitter, Output, Injectable, ViewContainerRef, ViewChild, input, viewChild, Renderer2, computed, effect,
|
|
2
|
+
import { Pipe, InjectionToken, inject, Input, Component, ChangeDetectionStrategy, signal, EventEmitter, Output, Injectable, ViewContainerRef, ViewChild, input, viewChild, Renderer2, computed, effect, output } from '@angular/core';
|
|
3
3
|
import * as i1$5 from '@angular/router';
|
|
4
4
|
import { RouterModule, ActivatedRoute, RouterOutlet, RouterLink } from '@angular/router';
|
|
5
|
-
import { EntityCommunicationService, EntityBaseListV2Component, DCFilterBarComponent, QuickTableComponent, TOAST_ALERTS_TOKEN, LoadingBarService, FormUtilsService, EModelQuality, UiStateService, MobileService, EntityBaseFormComponent, PromptService, DcManageableFormComponent, DcLearnableFormComponent, HttpCoreService,
|
|
5
|
+
import { EntityCommunicationService, EntityBaseListV2Component, DCFilterBarComponent, QuickTableComponent, TOAST_ALERTS_TOKEN, LoadingBarService, FormUtilsService, EModelQuality, UiStateService, MobileService, EntityBaseFormComponent, PromptService, DcManageableFormComponent, DcLearnableFormComponent, HttpCoreService, LangDescTranslation, EntityBaseDetailComponent, getSupportedLanguageOptions } from '@dataclouder/ngx-core';
|
|
6
6
|
import * as i1 from '@angular/forms';
|
|
7
7
|
import { FormBuilder, FormControl, FormArray, FormsModule, ReactiveFormsModule, UntypedFormControl, FormGroup, Validators } from '@angular/forms';
|
|
8
8
|
import * as i1$1 from 'primeng/button';
|
|
@@ -36,7 +36,7 @@ import * as i4$2 from 'primeng/tooltip';
|
|
|
36
36
|
import { TooltipModule } from 'primeng/tooltip';
|
|
37
37
|
import { ResolutionType, AspectType, AssetsLoaderComponent, CropperComponentModal } from '@dataclouder/ngx-cloud-storage';
|
|
38
38
|
import { DialogModule } from 'primeng/dialog';
|
|
39
|
-
import { CONVERSATION_AI_TOKEN, ChatRole,
|
|
39
|
+
import { CONVERSATION_AI_TOKEN, ChatRole, SystemPromptType, EDoActionType, ConditionOperator, ConditionType, ConversationEvents, TextEngines, ConversationType, ChatEventType, DCChatComponent } from '@dataclouder/ngx-agent-cards';
|
|
40
40
|
import * as i5 from 'primeng/inputgroup';
|
|
41
41
|
import { InputGroupModule } from 'primeng/inputgroup';
|
|
42
42
|
import * as i6 from 'primeng/divider';
|
|
@@ -1833,6 +1833,11 @@ const EngagementSkill = `
|
|
|
1833
1833
|
You are an engagement assistant, start by greeting the user, asking something about the lesson, and then continue the conversation. always ask one or two friendly questions.
|
|
1834
1834
|
that makes sense for the lesson.
|
|
1835
1835
|
`;
|
|
1836
|
+
const EvalResultStringDefinition = `
|
|
1837
|
+
interface SimpleEvalResult {
|
|
1838
|
+
score: number; // Score of the user's response 0 to 3
|
|
1839
|
+
feedback: string; // Feedback of the user's understanding of the conversation
|
|
1840
|
+
}`;
|
|
1836
1841
|
class LessonConversationService {
|
|
1837
1842
|
constructor() {
|
|
1838
1843
|
this.lessonsService = inject(LESSONS_TOKEN, { optional: true }) ?? inject(DefaultLessonsService);
|
|
@@ -1981,7 +1986,7 @@ ${userInformationPrompt}`;
|
|
|
1981
1986
|
autoStart: true,
|
|
1982
1987
|
messages: [initialMessage],
|
|
1983
1988
|
model: { provider: 'google' },
|
|
1984
|
-
|
|
1989
|
+
voice: { main: { voice: getRandomQuickVoice(baseLang || 'en', 'female') } },
|
|
1985
1990
|
};
|
|
1986
1991
|
return conversationSettings;
|
|
1987
1992
|
}
|
|
@@ -2039,8 +2044,8 @@ class DCLessonRendererComponent {
|
|
|
2039
2044
|
content: `Siempre, responde en español, e intenta ser conciso, tus respuestas deben ser entre 10 palabras y hasta un parrafo, dependiendo de la pregunta y contexto de la convesación`,
|
|
2040
2045
|
},
|
|
2041
2046
|
],
|
|
2042
|
-
|
|
2043
|
-
voice: 'es-US-Chirp3-HD-algenib',
|
|
2047
|
+
voice: {
|
|
2048
|
+
main: { voice: 'es-US-Chirp3-HD-algenib' },
|
|
2044
2049
|
},
|
|
2045
2050
|
};
|
|
2046
2051
|
// Effect to fetch lesson data if ID is provided and lesson object isn't
|
|
@@ -2181,7 +2186,7 @@ class DCLessonRendererComponent {
|
|
|
2181
2186
|
}
|
|
2182
2187
|
}
|
|
2183
2188
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DCLessonRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2184
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: DCLessonRendererComponent, isStandalone: true, selector: "dc-lesson-renderer", inputs: { lessonInput: { classPropertyName: "lessonInput", publicName: "lessonInput", isSignal: true, isRequired: false, transformFunction: null }, lessonIdInput: { classPropertyName: "lessonIdInput", publicName: "lessonIdInput", isSignal: true, isRequired: false, transformFunction: null }, settings: { classPropertyName: "settings", publicName: "settings", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { wordClicked: "wordClicked" }, viewQueries: [{ propertyName: "dynamicLessonRef", first: true, predicate: ["dynamicLessonRef"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (lesson()?.format === 'markdown' || !lesson()?.textCoded) {\n<h3>Mostrando markdown</h3>\n\n<markdown>\n {{ lesson()?.markdown }}\n</markdown>\n} @else {\n<div>\n <div #dynamicLessonRef class=\"targetclass\">\n <ng-template #target></ng-template>\n </div>\n</div>\n}\n\n<br />\n<div style=\"display: flex; gap: 10px\">\n @if ((mainForm.controls | keyvalue)?.length) {\n <div>\n <p-button label=\"Calificar Lecci\u00F3n\" icon=\"pi pi-check-circle\" (click)=\"evaluateForms()\" [rounded]=\"true\"></p-button>\n </div>\n }\n\n <p-button icon=\"pi pi-verified\" [rounded]=\"true\" (click)=\"startAI()\" label=\"Repasar con IA\" />\n</div>\n<br /><br />\n\n@if(uiStateService?.chatDrawerVisible()) {\n<p-drawer\n header=\"Conversation\"\n [visible]=\"uiStateService?.chatDrawerVisible()\"\n (visibleChange)=\"onVisibleChange($event)\"\n position=\"bottom\"\n [styleClass]=\"mobileService.hasReponsiveView() ? 'p-drawer-bottom-chat-mobile' : 'p-drawer-bottom-chat'\">\n <dc-chat\n [conversationFlow]=\"lessonConversationService.conversationFlow()\"\n [conversationSettings]=\"lessonConversationService.conversationSettings()\"\n (goalCompleted)=\"handleGoalCompleted($event)\"\n (chatEvent)=\"onChatMessage($event)\"></dc-chat>\n</p-drawer>\n\n}\n", styles: ["::ng-deep .targetclass *:not(h1,h2,h3,h4,h5,h6){font-family:\"math\",sans-serif,system-ui,monospace!important}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: DCChatComponent, selector: "dc-chat", inputs: ["chatUserSettings", "conversationSettings", "conversationFlow", "agentCard", "parseDict"], outputs: ["chatEvent", "goalCompleted"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i2$4.Drawer, selector: "p-drawer", inputs: ["appendTo", "motionOptions", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "component", type: MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }] }); }
|
|
2189
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: DCLessonRendererComponent, isStandalone: true, selector: "dc-lesson-renderer", inputs: { lessonInput: { classPropertyName: "lessonInput", publicName: "lessonInput", isSignal: true, isRequired: false, transformFunction: null }, lessonIdInput: { classPropertyName: "lessonIdInput", publicName: "lessonIdInput", isSignal: true, isRequired: false, transformFunction: null }, settings: { classPropertyName: "settings", publicName: "settings", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { wordClicked: "wordClicked" }, viewQueries: [{ propertyName: "dynamicLessonRef", first: true, predicate: ["dynamicLessonRef"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (lesson()?.format === 'markdown' || !lesson()?.textCoded) {\n<h3>Mostrando markdown</h3>\n\n<markdown>\n {{ lesson()?.markdown }}\n</markdown>\n} @else {\n<div>\n <div #dynamicLessonRef class=\"targetclass\">\n <ng-template #target></ng-template>\n </div>\n</div>\n}\n\n<br />\n<div style=\"display: flex; gap: 10px\">\n @if ((mainForm.controls | keyvalue)?.length) {\n <div>\n <p-button label=\"Calificar Lecci\u00F3n\" icon=\"pi pi-check-circle\" (click)=\"evaluateForms()\" [rounded]=\"true\"></p-button>\n </div>\n }\n\n <p-button icon=\"pi pi-verified\" [rounded]=\"true\" (click)=\"startAI()\" label=\"Repasar con IA\" />\n</div>\n<br /><br />\n\n@if(uiStateService?.chatDrawerVisible()) {\n<p-drawer\n header=\"Conversation\"\n [visible]=\"uiStateService?.chatDrawerVisible()\"\n (visibleChange)=\"onVisibleChange($event)\"\n position=\"bottom\"\n [styleClass]=\"mobileService.hasReponsiveView() ? 'p-drawer-bottom-chat-mobile' : 'p-drawer-bottom-chat'\">\n <dc-chat\n [conversationFlow]=\"lessonConversationService.conversationFlow()\"\n [conversationSettings]=\"lessonConversationService.conversationSettings()\"\n (goalCompleted)=\"handleGoalCompleted($event)\"\n (chatEvent)=\"onChatMessage($event)\"></dc-chat>\n</p-drawer>\n\n}\n", styles: ["::ng-deep .targetclass *:not(h1,h2,h3,h4,h5,h6){font-family:\"math\",sans-serif,system-ui,monospace!important}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: DCChatComponent, selector: "dc-chat", inputs: ["chatUserSettings", "conversationSettings", "conversationFlow", "agentCard", "micSettings", "observerConfig", "parseDict"], outputs: ["chatEvent", "goalCompleted"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i2$4.Drawer, selector: "p-drawer", inputs: ["appendTo", "motionOptions", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "component", type: MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }] }); }
|
|
2185
2190
|
}
|
|
2186
2191
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: DCLessonRendererComponent, decorators: [{
|
|
2187
2192
|
type: Component,
|
|
@@ -2563,22 +2568,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
2563
2568
|
}]
|
|
2564
2569
|
}], ctorParameters: () => [] });
|
|
2565
2570
|
|
|
2566
|
-
class CourseListComponent extends
|
|
2571
|
+
class CourseListComponent extends EntityBaseListV2Component {
|
|
2567
2572
|
constructor() {
|
|
2568
2573
|
super(...arguments);
|
|
2569
|
-
|
|
2570
|
-
this.toastService = inject(TOAST_ALERTS_TOKEN);
|
|
2571
|
-
this.courseService = inject(CourseService);
|
|
2574
|
+
this.entityCommunicationService = inject(CourseService);
|
|
2572
2575
|
this.userService = inject(UserService);
|
|
2573
|
-
this.cdr = inject(ChangeDetectorRef);
|
|
2574
|
-
// Inputs
|
|
2575
|
-
this.viewType = 'card';
|
|
2576
2576
|
this.onlyView = input(true, ...(ngDevMode ? [{ debugName: "onlyView" }] : /* istanbul ignore next */ []));
|
|
2577
|
-
this.onSelect = output();
|
|
2578
2577
|
// States
|
|
2579
|
-
this.courses = signal([], ...(ngDevMode ? [{ debugName: "courses" }] : /* istanbul ignore next */ []));
|
|
2580
2578
|
this.columns = ['name', 'description', 'updatedAt', 'image'];
|
|
2581
|
-
this.filterBarOptions = { showActions: true, showCreateButton: true, showViewButton: true };
|
|
2582
2579
|
}
|
|
2583
2580
|
getCustomButtons(item) {
|
|
2584
2581
|
return [
|
|
@@ -2603,64 +2600,15 @@ class CourseListComponent extends PaginationBase {
|
|
|
2603
2600
|
const user = this.userService.user();
|
|
2604
2601
|
const targetLang = user?.settings?.['targetLanguage'];
|
|
2605
2602
|
const baseLang = user?.settings?.['baseLanguage'];
|
|
2606
|
-
|
|
2607
|
-
this.
|
|
2608
|
-
...
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
// this.filterConfig.filters = { targetLang: 'de', baseLang: 'es' };
|
|
2613
|
-
const response = await this.courseService.query(this.filterConfig());
|
|
2614
|
-
this.courses.set(response.rows);
|
|
2615
|
-
this.cdr.detectChanges();
|
|
2616
|
-
console.log(this.courses(), this.viewType);
|
|
2617
|
-
this.cdr.detectChanges();
|
|
2618
|
-
}
|
|
2619
|
-
loadData() {
|
|
2620
|
-
throw new Error('Method not implemented.');
|
|
2621
|
-
}
|
|
2622
|
-
onNew() {
|
|
2623
|
-
console.log('onNew');
|
|
2624
|
-
this.router.navigate(['./edit'], { relativeTo: this.route });
|
|
2625
|
-
}
|
|
2626
|
-
toggleView() {
|
|
2627
|
-
this.viewType = this.viewType === 'card' ? 'table' : 'card';
|
|
2628
|
-
console.log(this.viewType, this.courses());
|
|
2629
|
-
this.cdr.detectChanges();
|
|
2630
|
-
}
|
|
2631
|
-
selectItem(course) {
|
|
2632
|
-
console.log('onSelect');
|
|
2633
|
-
this.onSelect.emit(course);
|
|
2634
|
-
}
|
|
2635
|
-
async doAction(actionEvent) {
|
|
2636
|
-
const { item, action } = actionEvent;
|
|
2637
|
-
if (action == 'changeView') {
|
|
2638
|
-
this.toggleView();
|
|
2639
|
-
}
|
|
2640
|
-
const id = item.id || item._id;
|
|
2641
|
-
switch (action) {
|
|
2642
|
-
case 'view':
|
|
2643
|
-
this.router.navigate(['./details', id], { relativeTo: this.route });
|
|
2644
|
-
break;
|
|
2645
|
-
case 'delete':
|
|
2646
|
-
const areYouSure = confirm('¿Estás seguro de querer eliminar este origen?');
|
|
2647
|
-
if (areYouSure) {
|
|
2648
|
-
await this.courseService.remove(id);
|
|
2649
|
-
this.courses.set(this.courses().filter((course) => course._id !== id));
|
|
2650
|
-
this.toastService.success({
|
|
2651
|
-
title: 'Origen eliminado',
|
|
2652
|
-
subtitle: 'El origen ha sido eliminado correctamente',
|
|
2653
|
-
});
|
|
2654
|
-
this.cdr.detectChanges();
|
|
2655
|
-
}
|
|
2656
|
-
break;
|
|
2657
|
-
case 'edit':
|
|
2658
|
-
this.router.navigate(['./edit', id], { relativeTo: this.route });
|
|
2659
|
-
break;
|
|
2660
|
-
}
|
|
2603
|
+
this.fixedQuery = { ...this.fixedQuery, baseLang, targetLang };
|
|
2604
|
+
this.mongoState.projection = {
|
|
2605
|
+
...this.mongoState.projection,
|
|
2606
|
+
_id: 1, id: 1, name: 1, description: 1, updatedAt: 1, image: 1, baseLang: 1, targetLang: 1, auditable: 1
|
|
2607
|
+
};
|
|
2608
|
+
await super.ngOnInit();
|
|
2661
2609
|
}
|
|
2662
2610
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CourseListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
2663
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: CourseListComponent, isStandalone: true, selector: "app-course-list", inputs: {
|
|
2611
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: CourseListComponent, isStandalone: true, selector: "app-course-list", inputs: { onlyView: { classPropertyName: "onlyView", publicName: "onlyView", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "@if (!onlyView()) {\n<p-button [icon]=\"viewType() === 'card' ? 'pi pi-table' : 'pi pi-list'\" label=\"Change View\" [link]=\"true\" (click)=\"toggleView()\" />\n}\n<div class=\"course-list-container\">\n <dc-filter-bar [isAdmin]=\"userService.isAdmin()\" [options]=\"filterBarOptions\" (onNew)=\"onNew()\" (onFilterAction)=\"doAction($event)\"></dc-filter-bar>\n\n @if (viewType() === 'card') {\n <div class=\"course-list-content\">\n @for (course of items(); track course.id) {\n <div class=\"card-source\">\n <div style=\"position: absolute; top: 4px; right: 4px; z-index: 1000\">\n <p-speeddial\n [model]=\"getCustomButtons(course)\"\n [radius]=\"70\"\n type=\"quarter-circle\"\n direction=\"down-left\"\n [buttonProps]=\"{ severity: 'primary', rounded: true, outlined: true }\"\n [tooltipOptions]=\"{ tooltipPosition: 'top' }\" />\n </div>\n <p-card [header]=\"course.name\">\n <p class=\"m-0\">{{ course.description | slice : 0 : 250 }}...</p>\n <span>{{ course?.auditable?.createdAt | date : 'dd/MM/yyyy HH:mm' }}</span>\n\n <p-tag severity=\"success\" [value]=\"course.baseLang | langDesc : 'es'\" [rounded]=\"true\" />\n ->\n <p-tag severity=\"info\" [value]=\"course.targetLang | langDesc : 'es'\" [rounded]=\"true\" />\n </p-card>\n </div>\n } @if (items().length === 0) {\n <p-card>\n <p>No courses found</p>\n </p-card>\n }\n </div>\n } @else if (viewType() === 'table'){\n\n <app-quick-table [tableData]=\"items()\"></app-quick-table>\n\n }\n\n <div class=\"paginator-container\">\n <p-paginator\n currentPageReportTemplate=\"{{ totalRecords() }} conversations\"\n [showCurrentPageReport]=\"true\"\n (onPageChange)=\"onPageChange($event)\"\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"[10, 20, 30]\">\n </p-paginator>\n </div>\n</div>\n", styles: [":host{display:block;height:100%}.course-list-container{display:flex;flex-direction:column;height:100%}.course-list-content{margin:20px;flex:1;overflow-y:auto;padding-bottom:10px}.card-source{margin:20px;position:relative}.paginator-container{margin-top:auto;padding-top:10px}\n"], dependencies: [{ kind: "ngmodule", type: CardModule }, { kind: "component", type: i3.Card, selector: "p-card", inputs: ["header", "subheader", "style", "styleClass"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: DCFilterBarComponent, selector: "dc-filter-bar", inputs: ["items", "options", "customFilters", "customSortOptions", "isAdmin", "persistenceKey"], outputs: ["onFilterAction", "onNew"] }, { kind: "ngmodule", type: SpeedDialModule }, { kind: "component", type: i2$2.SpeedDial, selector: "p-speeddial, p-speedDial, p-speed-dial", inputs: ["id", "model", "visible", "style", "className", "direction", "transitionDelay", "type", "radius", "mask", "disabled", "hideOnClickOutside", "buttonStyle", "buttonClassName", "maskStyle", "maskClassName", "showIcon", "hideIcon", "rotateAnimation", "ariaLabel", "ariaLabelledBy", "tooltipOptions", "buttonProps"], outputs: ["onVisibleChange", "visibleChange", "onClick", "onShow", "onHide"] }, { kind: "ngmodule", type: PaginatorModule }, { kind: "component", type: i1$2.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first", "appendTo"], outputs: ["onPageChange"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: QuickTableComponent, selector: "app-quick-table", inputs: ["columns", "tableData", "actions"], outputs: ["onAction"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i4$1.Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: SlicePipe, name: "slice" }, { kind: "pipe", type: LangDescTranslation, name: "langDesc" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2664
2612
|
}
|
|
2665
2613
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CourseListComponent, decorators: [{
|
|
2666
2614
|
type: Component,
|
|
@@ -2677,10 +2625,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
|
|
|
2677
2625
|
QuickTableComponent,
|
|
2678
2626
|
TagModule,
|
|
2679
2627
|
LangDescTranslation,
|
|
2680
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!onlyView()) {\n<p-button [icon]=\"viewType === 'card' ? 'pi pi-table' : 'pi pi-list'\" label=\"Change View\" [link]=\"true\" (click)=\"toggleView()\" />\n}\n<div class=\"course-list-container\">\n <dc-filter-bar [isAdmin]=\"userService.isAdmin()\" [options]=\"filterBarOptions\" (onNew)=\"onNew()\" (onFilterAction)=\"doAction($event)\"></dc-filter-bar>\n\n @if (viewType === 'card') {\n <div class=\"course-list-content\">\n @for (course of
|
|
2681
|
-
}], propDecorators: {
|
|
2682
|
-
type: Input
|
|
2683
|
-
}], onlyView: [{ type: i0.Input, args: [{ isSignal: true, alias: "onlyView", required: false }] }], onSelect: [{ type: i0.Output, args: ["onSelect"] }] } });
|
|
2628
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!onlyView()) {\n<p-button [icon]=\"viewType() === 'card' ? 'pi pi-table' : 'pi pi-list'\" label=\"Change View\" [link]=\"true\" (click)=\"toggleView()\" />\n}\n<div class=\"course-list-container\">\n <dc-filter-bar [isAdmin]=\"userService.isAdmin()\" [options]=\"filterBarOptions\" (onNew)=\"onNew()\" (onFilterAction)=\"doAction($event)\"></dc-filter-bar>\n\n @if (viewType() === 'card') {\n <div class=\"course-list-content\">\n @for (course of items(); track course.id) {\n <div class=\"card-source\">\n <div style=\"position: absolute; top: 4px; right: 4px; z-index: 1000\">\n <p-speeddial\n [model]=\"getCustomButtons(course)\"\n [radius]=\"70\"\n type=\"quarter-circle\"\n direction=\"down-left\"\n [buttonProps]=\"{ severity: 'primary', rounded: true, outlined: true }\"\n [tooltipOptions]=\"{ tooltipPosition: 'top' }\" />\n </div>\n <p-card [header]=\"course.name\">\n <p class=\"m-0\">{{ course.description | slice : 0 : 250 }}...</p>\n <span>{{ course?.auditable?.createdAt | date : 'dd/MM/yyyy HH:mm' }}</span>\n\n <p-tag severity=\"success\" [value]=\"course.baseLang | langDesc : 'es'\" [rounded]=\"true\" />\n ->\n <p-tag severity=\"info\" [value]=\"course.targetLang | langDesc : 'es'\" [rounded]=\"true\" />\n </p-card>\n </div>\n } @if (items().length === 0) {\n <p-card>\n <p>No courses found</p>\n </p-card>\n }\n </div>\n } @else if (viewType() === 'table'){\n\n <app-quick-table [tableData]=\"items()\"></app-quick-table>\n\n }\n\n <div class=\"paginator-container\">\n <p-paginator\n currentPageReportTemplate=\"{{ totalRecords() }} conversations\"\n [showCurrentPageReport]=\"true\"\n (onPageChange)=\"onPageChange($event)\"\n [first]=\"first()\"\n [rows]=\"rows()\"\n [totalRecords]=\"totalRecords()\"\n [rowsPerPageOptions]=\"[10, 20, 30]\">\n </p-paginator>\n </div>\n</div>\n", styles: [":host{display:block;height:100%}.course-list-container{display:flex;flex-direction:column;height:100%}.course-list-content{margin:20px;flex:1;overflow-y:auto;padding-bottom:10px}.card-source{margin:20px;position:relative}.paginator-container{margin-top:auto;padding-top:10px}\n"] }]
|
|
2629
|
+
}], propDecorators: { onlyView: [{ type: i0.Input, args: [{ isSignal: true, alias: "onlyView", required: false }] }] } });
|
|
2684
2630
|
|
|
2685
2631
|
class CourseDetailComponent extends EntityBaseDetailComponent {
|
|
2686
2632
|
constructor() {
|