From 96c862260851852dc02b44f17177b75681bcc4a0 Mon Sep 17 00:00:00 2001
From: Dani Palou
Date: Tue, 28 Jan 2020 12:52:56 +0100
Subject: [PATCH 1/9] MOBILE-3323 editor: Create new folder editor in src/core
---
.../pages/edit-event/edit-event.module.ts | 2 +
.../calendar/pages/edit-event/edit-event.ts | 4 +-
.../feedback/comments/comments.module.ts | 4 +-
.../onlinetext/onlinetext.module.ts | 4 +-
src/addon/mod/data/fields/field.module.ts | 2 +-
.../data/fields/textarea/textarea.module.ts | 4 +-
.../mod/forum/components/components.module.ts | 4 +-
.../forum/pages/edit-post/edit-post.module.ts | 2 +
.../new-discussion/new-discussion.module.ts | 2 +
.../pages/new-discussion/new-discussion.ts | 4 +-
.../mod/glossary/pages/edit/edit.module.ts | 2 +
.../mod/lesson/pages/player/player.module.ts | 2 +
src/addon/mod/wiki/pages/edit/edit.module.ts | 2 +
.../workshop/components/components.module.ts | 4 +-
.../pages/assessment/assessment.module.ts | 2 +
.../edit-submission/edit-submission.module.ts | 2 +
.../pages/submission/submission.module.ts | 2 +
src/addon/qtype/essay/essay.module.ts | 4 +-
.../textarea/textarea.module.ts | 4 +-
src/app/app.module.ts | 2 +
src/components/components.module.ts | 3 --
.../editor/components/components.module.ts | 41 +++++++++++++++++++
.../core-editor-rich-text-editor.html} | 0
.../rich-text-editor/rich-text-editor.scss | 0
.../rich-text-editor/rich-text-editor.ts | 14 ++-----
src/core/editor/editor.module.ts | 27 ++++++++++++
26 files changed, 118 insertions(+), 25 deletions(-)
create mode 100644 src/core/editor/components/components.module.ts
rename src/{components/rich-text-editor/core-rich-text-editor.html => core/editor/components/rich-text-editor/core-editor-rich-text-editor.html} (100%)
rename src/{ => core/editor}/components/rich-text-editor/rich-text-editor.scss (100%)
rename src/{ => core/editor}/components/rich-text-editor/rich-text-editor.ts (97%)
create mode 100644 src/core/editor/editor.module.ts
diff --git a/src/addon/calendar/pages/edit-event/edit-event.module.ts b/src/addon/calendar/pages/edit-event/edit-event.module.ts
index 32a1ac65a..5821de8a0 100644
--- a/src/addon/calendar/pages/edit-event/edit-event.module.ts
+++ b/src/addon/calendar/pages/edit-event/edit-event.module.ts
@@ -17,6 +17,7 @@ import { IonicPageModule } from 'ionic-angular';
import { TranslateModule } from '@ngx-translate/core';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
import { AddonCalendarEditEventPage } from './edit-event';
@NgModule({
@@ -26,6 +27,7 @@ import { AddonCalendarEditEventPage } from './edit-event';
imports: [
CoreComponentsModule,
CoreDirectivesModule,
+ CoreEditorComponentsModule,
IonicPageModule.forChild(AddonCalendarEditEventPage),
TranslateModule.forChild()
],
diff --git a/src/addon/calendar/pages/edit-event/edit-event.ts b/src/addon/calendar/pages/edit-event/edit-event.ts
index 293d1fd62..16f9350ce 100644
--- a/src/addon/calendar/pages/edit-event/edit-event.ts
+++ b/src/addon/calendar/pages/edit-event/edit-event.ts
@@ -25,7 +25,7 @@ import { CoreTimeUtilsProvider } from '@providers/utils/time';
import { CoreUtilsProvider } from '@providers/utils/utils';
import { CoreCoursesProvider } from '@core/courses/providers/courses';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
-import { CoreRichTextEditorComponent } from '@components/rich-text-editor/rich-text-editor.ts';
+import { CoreEditorRichTextEditorComponent } from '@core/editor/components/rich-text-editor/rich-text-editor.ts';
import { AddonCalendarProvider, AddonCalendarGetAccessInfoResult, AddonCalendarEvent } from '../../providers/calendar';
import { AddonCalendarOfflineProvider } from '../../providers/calendar-offline';
import { AddonCalendarHelperProvider } from '../../providers/helper';
@@ -43,7 +43,7 @@ import { CoreFilterHelperProvider } from '@core/filter/providers/helper';
})
export class AddonCalendarEditEventPage implements OnInit, OnDestroy {
- @ViewChild(CoreRichTextEditorComponent) descriptionEditor: CoreRichTextEditorComponent;
+ @ViewChild(CoreEditorRichTextEditorComponent) descriptionEditor: CoreEditorRichTextEditorComponent;
title: string;
dateFormat: string;
diff --git a/src/addon/mod/assign/feedback/comments/comments.module.ts b/src/addon/mod/assign/feedback/comments/comments.module.ts
index 491a88fde..cb23c6983 100644
--- a/src/addon/mod/assign/feedback/comments/comments.module.ts
+++ b/src/addon/mod/assign/feedback/comments/comments.module.ts
@@ -21,6 +21,7 @@ import { AddonModAssignFeedbackCommentsComponent } from './component/comments';
import { AddonModAssignFeedbackDelegate } from '../../providers/feedback-delegate';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -31,7 +32,8 @@ import { CoreDirectivesModule } from '@directives/directives.module';
IonicModule,
TranslateModule.forChild(),
CoreComponentsModule,
- CoreDirectivesModule
+ CoreDirectivesModule,
+ CoreEditorComponentsModule,
],
providers: [
AddonModAssignFeedbackCommentsHandler
diff --git a/src/addon/mod/assign/submission/onlinetext/onlinetext.module.ts b/src/addon/mod/assign/submission/onlinetext/onlinetext.module.ts
index 88de4de1d..5ac1e16f8 100644
--- a/src/addon/mod/assign/submission/onlinetext/onlinetext.module.ts
+++ b/src/addon/mod/assign/submission/onlinetext/onlinetext.module.ts
@@ -21,6 +21,7 @@ import { AddonModAssignSubmissionOnlineTextComponent } from './component/onlinet
import { AddonModAssignSubmissionDelegate } from '../../providers/submission-delegate';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -31,7 +32,8 @@ import { CoreDirectivesModule } from '@directives/directives.module';
IonicModule,
TranslateModule.forChild(),
CoreComponentsModule,
- CoreDirectivesModule
+ CoreDirectivesModule,
+ CoreEditorComponentsModule,
],
providers: [
AddonModAssignSubmissionOnlineTextHandler
diff --git a/src/addon/mod/data/fields/field.module.ts b/src/addon/mod/data/fields/field.module.ts
index 0e0467799..9a850d4f6 100644
--- a/src/addon/mod/data/fields/field.module.ts
+++ b/src/addon/mod/data/fields/field.module.ts
@@ -40,7 +40,7 @@ import { AddonModDataFieldUrlModule } from './url/url.module';
AddonModDataFieldRadiobuttonModule,
AddonModDataFieldTextModule,
AddonModDataFieldTextareaModule,
- AddonModDataFieldUrlModule
+ AddonModDataFieldUrlModule,
],
providers: [
],
diff --git a/src/addon/mod/data/fields/textarea/textarea.module.ts b/src/addon/mod/data/fields/textarea/textarea.module.ts
index 3f7070ef7..ead1184b6 100644
--- a/src/addon/mod/data/fields/textarea/textarea.module.ts
+++ b/src/addon/mod/data/fields/textarea/textarea.module.ts
@@ -20,6 +20,7 @@ import { AddonModDataFieldsDelegate } from '../../providers/fields-delegate';
import { AddonModDataFieldTextareaComponent } from './component/textarea';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -30,7 +31,8 @@ import { CoreDirectivesModule } from '@directives/directives.module';
IonicModule,
TranslateModule.forChild(),
CoreComponentsModule,
- CoreDirectivesModule
+ CoreDirectivesModule,
+ CoreEditorComponentsModule,
],
providers: [
AddonModDataFieldTextareaHandler
diff --git a/src/addon/mod/forum/components/components.module.ts b/src/addon/mod/forum/components/components.module.ts
index 5a3180af3..e9cdcba14 100644
--- a/src/addon/mod/forum/components/components.module.ts
+++ b/src/addon/mod/forum/components/components.module.ts
@@ -26,6 +26,7 @@ import { AddonModForumIndexComponent } from './index/index';
import { AddonModForumPostComponent } from './post/post';
import { AddonForumDiscussionOptionsMenuComponent } from './discussion-options-menu/discussion-options-menu';
import { AddonForumPostOptionsMenuComponent } from './post-options-menu/post-options-menu';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -43,7 +44,8 @@ import { AddonForumPostOptionsMenuComponent } from './post-options-menu/post-opt
CorePipesModule,
CoreCourseComponentsModule,
CoreRatingComponentsModule,
- CoreTagComponentsModule
+ CoreTagComponentsModule,
+ CoreEditorComponentsModule,
],
providers: [
],
diff --git a/src/addon/mod/forum/pages/edit-post/edit-post.module.ts b/src/addon/mod/forum/pages/edit-post/edit-post.module.ts
index 07f409742..89cf9ad4d 100644
--- a/src/addon/mod/forum/pages/edit-post/edit-post.module.ts
+++ b/src/addon/mod/forum/pages/edit-post/edit-post.module.ts
@@ -19,6 +19,7 @@ import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { AddonModForumComponentsModule } from '../../components/components.module';
import { AddonModForumEditPostPage } from './edit-post';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -28,6 +29,7 @@ import { AddonModForumEditPostPage } from './edit-post';
CoreComponentsModule,
CoreDirectivesModule,
AddonModForumComponentsModule,
+ CoreEditorComponentsModule,
IonicPageModule.forChild(AddonModForumEditPostPage),
TranslateModule.forChild()
],
diff --git a/src/addon/mod/forum/pages/new-discussion/new-discussion.module.ts b/src/addon/mod/forum/pages/new-discussion/new-discussion.module.ts
index c0add2f4c..0bb9e4038 100644
--- a/src/addon/mod/forum/pages/new-discussion/new-discussion.module.ts
+++ b/src/addon/mod/forum/pages/new-discussion/new-discussion.module.ts
@@ -18,6 +18,7 @@ import { TranslateModule } from '@ngx-translate/core';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { AddonModForumNewDiscussionPage } from './new-discussion';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -26,6 +27,7 @@ import { AddonModForumNewDiscussionPage } from './new-discussion';
imports: [
CoreComponentsModule,
CoreDirectivesModule,
+ CoreEditorComponentsModule,
IonicPageModule.forChild(AddonModForumNewDiscussionPage),
TranslateModule.forChild()
],
diff --git a/src/addon/mod/forum/pages/new-discussion/new-discussion.ts b/src/addon/mod/forum/pages/new-discussion/new-discussion.ts
index 091753865..68b44837b 100644
--- a/src/addon/mod/forum/pages/new-discussion/new-discussion.ts
+++ b/src/addon/mod/forum/pages/new-discussion/new-discussion.ts
@@ -25,7 +25,7 @@ import { CoreTextUtilsProvider } from '@providers/utils/text';
import { CoreUtilsProvider } from '@providers/utils/utils';
import { CoreFileUploaderProvider } from '@core/fileuploader/providers/fileuploader';
import { CoreSplitViewComponent } from '@components/split-view/split-view';
-import { CoreRichTextEditorComponent } from '@components/rich-text-editor/rich-text-editor.ts';
+import { CoreEditorRichTextEditorComponent } from '@core/editor/components/rich-text-editor/rich-text-editor.ts';
import { AddonModForumProvider } from '../../providers/forum';
import { AddonModForumOfflineProvider } from '../../providers/offline';
import { AddonModForumHelperProvider } from '../../providers/helper';
@@ -41,7 +41,7 @@ import { AddonModForumSyncProvider } from '../../providers/sync';
})
export class AddonModForumNewDiscussionPage implements OnDestroy {
- @ViewChild(CoreRichTextEditorComponent) messageEditor: CoreRichTextEditorComponent;
+ @ViewChild(CoreEditorRichTextEditorComponent) messageEditor: CoreEditorRichTextEditorComponent;
component = AddonModForumProvider.COMPONENT;
messageControl = new FormControl();
diff --git a/src/addon/mod/glossary/pages/edit/edit.module.ts b/src/addon/mod/glossary/pages/edit/edit.module.ts
index 0f606e93e..926f32ad6 100644
--- a/src/addon/mod/glossary/pages/edit/edit.module.ts
+++ b/src/addon/mod/glossary/pages/edit/edit.module.ts
@@ -18,6 +18,7 @@ import { TranslateModule } from '@ngx-translate/core';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { AddonModGlossaryEditPage } from './edit';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -26,6 +27,7 @@ import { AddonModGlossaryEditPage } from './edit';
imports: [
CoreComponentsModule,
CoreDirectivesModule,
+ CoreEditorComponentsModule,
IonicPageModule.forChild(AddonModGlossaryEditPage),
TranslateModule.forChild()
],
diff --git a/src/addon/mod/lesson/pages/player/player.module.ts b/src/addon/mod/lesson/pages/player/player.module.ts
index 361ae19ab..c6dd35097 100644
--- a/src/addon/mod/lesson/pages/player/player.module.ts
+++ b/src/addon/mod/lesson/pages/player/player.module.ts
@@ -18,6 +18,7 @@ import { TranslateModule } from '@ngx-translate/core';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { AddonModLessonPlayerPage } from './player';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -26,6 +27,7 @@ import { AddonModLessonPlayerPage } from './player';
imports: [
CoreComponentsModule,
CoreDirectivesModule,
+ CoreEditorComponentsModule,
IonicPageModule.forChild(AddonModLessonPlayerPage),
TranslateModule.forChild()
],
diff --git a/src/addon/mod/wiki/pages/edit/edit.module.ts b/src/addon/mod/wiki/pages/edit/edit.module.ts
index 20b25f6bc..ecf4b0fa4 100644
--- a/src/addon/mod/wiki/pages/edit/edit.module.ts
+++ b/src/addon/mod/wiki/pages/edit/edit.module.ts
@@ -18,6 +18,7 @@ import { TranslateModule } from '@ngx-translate/core';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { AddonModWikiEditPage } from './edit';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -26,6 +27,7 @@ import { AddonModWikiEditPage } from './edit';
imports: [
CoreComponentsModule,
CoreDirectivesModule,
+ CoreEditorComponentsModule,
IonicPageModule.forChild(AddonModWikiEditPage),
TranslateModule.forChild()
],
diff --git a/src/addon/mod/workshop/components/components.module.ts b/src/addon/mod/workshop/components/components.module.ts
index 775490396..279484ef6 100644
--- a/src/addon/mod/workshop/components/components.module.ts
+++ b/src/addon/mod/workshop/components/components.module.ts
@@ -24,6 +24,7 @@ import { AddonModWorkshopIndexComponent } from './index/index';
import { AddonModWorkshopSubmissionComponent } from './submission/submission';
import { AddonModWorkshopAssessmentComponent } from './assessment/assessment';
import { AddonModWorkshopAssessmentStrategyComponent } from './assessment-strategy/assessment-strategy';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -39,7 +40,8 @@ import { AddonModWorkshopAssessmentStrategyComponent } from './assessment-strate
CoreComponentsModule,
CoreDirectivesModule,
CorePipesModule,
- CoreCourseComponentsModule
+ CoreCourseComponentsModule,
+ CoreEditorComponentsModule,
],
providers: [
],
diff --git a/src/addon/mod/workshop/pages/assessment/assessment.module.ts b/src/addon/mod/workshop/pages/assessment/assessment.module.ts
index 21415631e..8a2314b34 100644
--- a/src/addon/mod/workshop/pages/assessment/assessment.module.ts
+++ b/src/addon/mod/workshop/pages/assessment/assessment.module.ts
@@ -19,6 +19,7 @@ import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { AddonModWorkshopComponentsModule } from '../../components/components.module';
import { AddonModWorkshopAssessmentPage } from './assessment';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -28,6 +29,7 @@ import { AddonModWorkshopAssessmentPage } from './assessment';
CoreDirectivesModule,
CoreComponentsModule,
AddonModWorkshopComponentsModule,
+ CoreEditorComponentsModule,
IonicPageModule.forChild(AddonModWorkshopAssessmentPage),
TranslateModule.forChild()
],
diff --git a/src/addon/mod/workshop/pages/edit-submission/edit-submission.module.ts b/src/addon/mod/workshop/pages/edit-submission/edit-submission.module.ts
index 25e5e4073..d3b216c60 100644
--- a/src/addon/mod/workshop/pages/edit-submission/edit-submission.module.ts
+++ b/src/addon/mod/workshop/pages/edit-submission/edit-submission.module.ts
@@ -18,6 +18,7 @@ import { TranslateModule } from '@ngx-translate/core';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { AddonModWorkshopEditSubmissionPage } from './edit-submission';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -26,6 +27,7 @@ import { AddonModWorkshopEditSubmissionPage } from './edit-submission';
imports: [
CoreDirectivesModule,
CoreComponentsModule,
+ CoreEditorComponentsModule,
IonicPageModule.forChild(AddonModWorkshopEditSubmissionPage),
TranslateModule.forChild()
],
diff --git a/src/addon/mod/workshop/pages/submission/submission.module.ts b/src/addon/mod/workshop/pages/submission/submission.module.ts
index b393b059b..6484fdc06 100644
--- a/src/addon/mod/workshop/pages/submission/submission.module.ts
+++ b/src/addon/mod/workshop/pages/submission/submission.module.ts
@@ -19,6 +19,7 @@ import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { AddonModWorkshopComponentsModule } from '../../components/components.module';
import { AddonModWorkshopSubmissionPage } from './submission';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -28,6 +29,7 @@ import { AddonModWorkshopSubmissionPage } from './submission';
CoreDirectivesModule,
CoreComponentsModule,
AddonModWorkshopComponentsModule,
+ CoreEditorComponentsModule,
IonicPageModule.forChild(AddonModWorkshopSubmissionPage),
TranslateModule.forChild()
],
diff --git a/src/addon/qtype/essay/essay.module.ts b/src/addon/qtype/essay/essay.module.ts
index da95a1363..d259137cc 100644
--- a/src/addon/qtype/essay/essay.module.ts
+++ b/src/addon/qtype/essay/essay.module.ts
@@ -20,6 +20,7 @@ import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
import { AddonQtypeEssayHandler } from './providers/handler';
import { AddonQtypeEssayComponent } from './component/essay';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -29,7 +30,8 @@ import { AddonQtypeEssayComponent } from './component/essay';
IonicModule,
TranslateModule.forChild(),
CoreComponentsModule,
- CoreDirectivesModule
+ CoreDirectivesModule,
+ CoreEditorComponentsModule,
],
providers: [
AddonQtypeEssayHandler
diff --git a/src/addon/userprofilefield/textarea/textarea.module.ts b/src/addon/userprofilefield/textarea/textarea.module.ts
index f64fc285d..68ad0e678 100644
--- a/src/addon/userprofilefield/textarea/textarea.module.ts
+++ b/src/addon/userprofilefield/textarea/textarea.module.ts
@@ -20,6 +20,7 @@ import { CoreUserProfileFieldDelegate } from '@core/user/providers/user-profile-
import { AddonUserProfileFieldTextareaComponent } from './component/textarea';
import { CoreComponentsModule } from '@components/components.module';
import { CoreDirectivesModule } from '@directives/directives.module';
+import { CoreEditorComponentsModule } from '@core/editor/components/components.module';
@NgModule({
declarations: [
@@ -29,7 +30,8 @@ import { CoreDirectivesModule } from '@directives/directives.module';
IonicModule,
TranslateModule.forChild(),
CoreComponentsModule,
- CoreDirectivesModule
+ CoreDirectivesModule,
+ CoreEditorComponentsModule,
],
providers: [
AddonUserProfileFieldTextareaHandler
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 38fff7b5d..81fdb84a7 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -87,6 +87,7 @@ import { CoreTagModule } from '@core/tag/tag.module';
import { CoreFilterModule } from '@core/filter/filter.module';
import { CoreH5PModule } from '@core/h5p/h5p.module';
import { CoreSearchModule } from '@core/search/search.module';
+import { CoreEditorModule } from '@core/editor/editor.module';
// Addon modules.
import { AddonBadgesModule } from '@addon/badges/badges.module';
@@ -235,6 +236,7 @@ export const WP_PROVIDER: any = null;
CoreFilterModule,
CoreH5PModule,
CoreSearchModule,
+ CoreEditorModule,
AddonBadgesModule,
AddonBlogModule,
AddonCalendarModule,
diff --git a/src/components/components.module.ts b/src/components/components.module.ts
index bdd2f6d4c..e48f29dd6 100644
--- a/src/components/components.module.ts
+++ b/src/components/components.module.ts
@@ -39,7 +39,6 @@ import { CoreLocalFileComponent } from './local-file/local-file';
import { CoreSitePickerComponent } from './site-picker/site-picker';
import { CoreTabsComponent } from './tabs/tabs';
import { CoreTabComponent } from './tabs/tab';
-import { CoreRichTextEditorComponent } from './rich-text-editor/rich-text-editor';
import { CoreNavBarButtonsComponent } from './navbar-buttons/navbar-buttons';
import { CoreDynamicComponent } from './dynamic-component/dynamic-component';
import { CoreSendMessageFormComponent } from './send-message-form/send-message-form';
@@ -79,7 +78,6 @@ import { CoreBSTooltipComponent } from './bs-tooltip/bs-tooltip';
CoreSitePickerComponent,
CoreTabsComponent,
CoreTabComponent,
- CoreRichTextEditorComponent,
CoreNavBarButtonsComponent,
CoreDynamicComponent,
CoreSendMessageFormComponent,
@@ -128,7 +126,6 @@ import { CoreBSTooltipComponent } from './bs-tooltip/bs-tooltip';
CoreSitePickerComponent,
CoreTabsComponent,
CoreTabComponent,
- CoreRichTextEditorComponent,
CoreNavBarButtonsComponent,
CoreDynamicComponent,
CoreSendMessageFormComponent,
diff --git a/src/core/editor/components/components.module.ts b/src/core/editor/components/components.module.ts
new file mode 100644
index 000000000..5d8edf3e7
--- /dev/null
+++ b/src/core/editor/components/components.module.ts
@@ -0,0 +1,41 @@
+// (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 { CommonModule } from '@angular/common';
+import { IonicModule } from 'ionic-angular';
+import { TranslateModule } from '@ngx-translate/core';
+import { CoreEditorRichTextEditorComponent } from './rich-text-editor/rich-text-editor';
+import { CoreComponentsModule } from '@components/components.module';
+
+@NgModule({
+ declarations: [
+ CoreEditorRichTextEditorComponent
+ ],
+ imports: [
+ CommonModule,
+ IonicModule,
+ TranslateModule.forChild(),
+ CoreComponentsModule,
+ ],
+ providers: [
+ ],
+ exports: [
+ CoreEditorRichTextEditorComponent
+ ],
+ entryComponents: [
+ CoreEditorRichTextEditorComponent
+ ]
+})
+export class CoreEditorComponentsModule {}
diff --git a/src/components/rich-text-editor/core-rich-text-editor.html b/src/core/editor/components/rich-text-editor/core-editor-rich-text-editor.html
similarity index 100%
rename from src/components/rich-text-editor/core-rich-text-editor.html
rename to src/core/editor/components/rich-text-editor/core-editor-rich-text-editor.html
diff --git a/src/components/rich-text-editor/rich-text-editor.scss b/src/core/editor/components/rich-text-editor/rich-text-editor.scss
similarity index 100%
rename from src/components/rich-text-editor/rich-text-editor.scss
rename to src/core/editor/components/rich-text-editor/rich-text-editor.scss
diff --git a/src/components/rich-text-editor/rich-text-editor.ts b/src/core/editor/components/rich-text-editor/rich-text-editor.ts
similarity index 97%
rename from src/components/rich-text-editor/rich-text-editor.ts
rename to src/core/editor/components/rich-text-editor/rich-text-editor.ts
index d4367e509..8520959c5 100644
--- a/src/components/rich-text-editor/rich-text-editor.ts
+++ b/src/core/editor/components/rich-text-editor/rich-text-editor.ts
@@ -25,24 +25,18 @@ import { FormControl } from '@angular/forms';
import { Subscription } from 'rxjs';
/**
- * Directive to display a rich text editor if enabled.
+ * Component to display a rich text editor if enabled.
*
- * If enabled, this directive will show a rich text editor. Otherwise it'll show a regular textarea.
- *
- * This directive requires an OBJECT model. The text written in the editor or textarea will be stored inside
- * a "text" property in that object. This is to ensure 2-way data-binding, since using a string as a model
- * could be easily broken.
+ * If enabled, this component will show a rich text editor. Otherwise it'll show a regular textarea.
*
* Example:
*
- *
- * In the example above, the text written in the editor will be stored in newpost.text.
*/
@Component({
selector: 'core-rich-text-editor',
- templateUrl: 'core-rich-text-editor.html'
+ templateUrl: 'core-editor-rich-text-editor.html'
})
-export class CoreRichTextEditorComponent implements AfterContentInit, OnDestroy {
+export class CoreEditorRichTextEditorComponent implements AfterContentInit, OnDestroy {
// Based on: https://github.com/judgewest2000/Ionic3RichText/
// @todo: Anchor button, fullscreen...
// @todo: Textarea height is not being updated when editor is resized. Height is calculated if any css is changed.
diff --git a/src/core/editor/editor.module.ts b/src/core/editor/editor.module.ts
new file mode 100644
index 000000000..1052cfb8b
--- /dev/null
+++ b/src/core/editor/editor.module.ts
@@ -0,0 +1,27 @@
+// (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 { CoreEditorComponentsModule } from './components/components.module';
+
+@NgModule({
+ declarations: [
+ ],
+ imports: [
+ CoreEditorComponentsModule
+ ],
+ providers: [
+ ]
+})
+export class CoreEditorModule {}
From d2f4df452e56cd02db42df3681a52e65aa86cd20 Mon Sep 17 00:00:00 2001
From: Dani Palou
Date: Tue, 28 Jan 2020 17:57:41 +0100
Subject: [PATCH 2/9] MOBILE-3323 editor: Create offline provider for editor
---
src/core/editor/editor.module.ts | 17 +-
src/core/editor/providers/editor-offline.ts | 254 ++++++++++++++++++++
2 files changed, 268 insertions(+), 3 deletions(-)
create mode 100644 src/core/editor/providers/editor-offline.ts
diff --git a/src/core/editor/editor.module.ts b/src/core/editor/editor.module.ts
index 1052cfb8b..e55c88a49 100644
--- a/src/core/editor/editor.module.ts
+++ b/src/core/editor/editor.module.ts
@@ -14,14 +14,25 @@
import { NgModule } from '@angular/core';
import { CoreEditorComponentsModule } from './components/components.module';
+import { CoreEditorOfflineProvider } from './providers/editor-offline';
+
+// List of providers (without handlers).
+export const CORE_GRADES_PROVIDERS: any[] = [
+ CoreEditorOfflineProvider,
+];
@NgModule({
declarations: [
],
imports: [
- CoreEditorComponentsModule
+ CoreEditorComponentsModule,
],
providers: [
- ]
+ CoreEditorOfflineProvider,
+ ],
})
-export class CoreEditorModule {}
+export class CoreEditorModule {
+ constructor(editorOffline: CoreEditorOfflineProvider) {
+ // Inject the helper even if it isn't used here it's instantiated.
+ }
+}
diff --git a/src/core/editor/providers/editor-offline.ts b/src/core/editor/providers/editor-offline.ts
new file mode 100644
index 000000000..0f0b5e28c
--- /dev/null
+++ b/src/core/editor/providers/editor-offline.ts
@@ -0,0 +1,254 @@
+// (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 { CoreLoggerProvider } from '@providers/logger';
+import { CoreSitesProvider, CoreSiteSchema } from '@providers/sites';
+import { CoreTextUtilsProvider } from '@providers/utils/text';
+import { CoreUtilsProvider } from '@providers/utils/utils';
+
+/**
+ * Service with features regarding rich text editor in offline.
+ */
+@Injectable()
+export class CoreEditorOfflineProvider {
+
+ protected DRAFT_TABLE = 'editor_draft';
+
+ protected logger;
+ protected siteSchema: CoreSiteSchema = {
+ name: 'CoreEditorProvider',
+ version: 1,
+ tables: [
+ {
+ name: this.DRAFT_TABLE,
+ columns: [
+ {
+ name: 'contextlevel',
+ type: 'TEXT',
+ },
+ {
+ name: 'contextinstanceid',
+ type: 'INTEGER',
+ },
+ {
+ name: 'elementid',
+ type: 'TEXT',
+ },
+ {
+ name: 'extraparams', // Moodle web uses a page hash built with URL. App will use some params stringified.
+ type: 'TEXT',
+ },
+ {
+ name: 'drafttext',
+ type: 'TEXT',
+ notNull: true
+ },
+ {
+ name: 'pageinstance',
+ type: 'TEXT',
+ notNull: true
+ },
+ {
+ name: 'timecreated',
+ type: 'INTEGER',
+ notNull: true
+ },
+ {
+ name: 'timemodified',
+ type: 'INTEGER',
+ notNull: true
+ },
+ ],
+ primaryKeys: ['contextlevel', 'contextinstanceid', 'elementid', 'extraparams']
+ },
+ ],
+ };
+
+ constructor(
+ logger: CoreLoggerProvider,
+ protected sitesProvider: CoreSitesProvider,
+ protected textUtils: CoreTextUtilsProvider,
+ protected utils: CoreUtilsProvider) {
+ this.logger = logger.getInstance('CoreEditorProvider');
+
+ this.sitesProvider.registerSiteSchema(this.siteSchema);
+ }
+
+ /**
+ * Delete a draft from DB.
+ *
+ * @param contextLevel Context level.
+ * @param contextInstanceId The instance ID related to the context.
+ * @param elementId Element ID.
+ * @param extraParams Object with extra params to identify the draft.
+ * @param siteId Site ID. If not defined, current site.
+ * @return Promise resolved when done.
+ */
+ async deleteDraft(contextLevel: string, contextInstanceId: number, elementId: string, extraParams: {[name: string]: any},
+ siteId?: string): Promise {
+
+ try {
+ const db = await this.sitesProvider.getSiteDb(siteId);
+
+ const params = this.fixDraftPrimaryData(contextLevel, contextInstanceId, elementId, extraParams);
+
+ return db.deleteRecords(this.DRAFT_TABLE, params);
+ } catch (error) {
+ // Ignore errors, probably no draft stored.
+ }
+ }
+
+ /**
+ * Return an object with the draft primary data converted to the right format.
+ *
+ * @param contextLevel Context level.
+ * @param contextInstanceId The instance ID related to the context.
+ * @param elementId Element ID.
+ * @param extraParams Object with extra params to identify the draft.
+ * @return Object with the fixed primary data.
+ */
+ protected fixDraftPrimaryData(contextLevel: string, contextInstanceId: number, elementId: string,
+ extraParams: {[name: string]: any}): CoreEditorDraftPrimaryData {
+
+ return {
+ contextlevel: contextLevel,
+ contextinstanceid: contextInstanceId,
+ elementid: elementId,
+ extraparams: this.utils.sortAndStringify(extraParams || {}),
+ };
+ }
+
+ /**
+ * Get a draft from DB.
+ *
+ * @param contextLevel Context level.
+ * @param contextInstanceId The instance ID related to the context.
+ * @param elementId Element ID.
+ * @param extraParams Object with extra params to identify the draft.
+ * @param siteId Site ID. If not defined, current site.
+ * @return Promise resolved with the draft data. Undefined if no draft stored.
+ */
+ async getDraft(contextLevel: string, contextInstanceId: number, elementId: string, extraParams: {[name: string]: any},
+ siteId?: string): Promise {
+
+ const db = await this.sitesProvider.getSiteDb(siteId);
+
+ const params = this.fixDraftPrimaryData(contextLevel, contextInstanceId, elementId, extraParams);
+
+ return db.getRecord(this.DRAFT_TABLE, params);
+ }
+
+ /**
+ * Get draft to resume it.
+ *
+ * @param contextLevel Context level.
+ * @param contextInstanceId The instance ID related to the context.
+ * @param elementId Element ID.
+ * @param extraParams Object with extra params to identify the draft.
+ * @param pageInstance Unique identifier to prevent storing data from several sources at the same time.
+ * @param siteId Site ID. If not defined, current site.
+ * @return Promise resolved with the draft text. Undefined if no draft stored.
+ */
+ async resumeDraft(contextLevel: string, contextInstanceId: number, elementId: string, extraParams: {[name: string]: any},
+ pageInstance: string, siteId?: string): Promise {
+
+ try {
+ // Check if there is a draft stored.
+ const entry = await this.getDraft(contextLevel, contextInstanceId, elementId, extraParams, siteId);
+
+ // There is a draft stored. Update its page instance.
+ try {
+ const db = await this.sitesProvider.getSiteDb(siteId);
+
+ entry.pageinstance = pageInstance;
+ entry.timemodified = Date.now();
+
+ await db.insertRecord(this.DRAFT_TABLE, entry);
+ } catch (error) {
+ // Ignore errors saving the draft. It shouldn't happen.
+ }
+
+ return entry.drafttext;
+ } catch (error) {
+ // No draft stored. Store an empty draft to save the pageinstance.
+ await this.saveDraft(contextLevel, contextInstanceId, elementId, extraParams, pageInstance, '', siteId);
+ }
+ }
+
+ /**
+ * Save a draft in DB.
+ *
+ * @param contextLevel Context level.
+ * @param contextInstanceId The instance ID related to the context.
+ * @param elementId Element ID.
+ * @param extraParams Object with extra params to identify the draft.
+ * @param pageInstance Unique identifier to prevent storing data from several sources at the same time.
+ * @param draftText The text to store.
+ * @param siteId Site ID. If not defined, current site.
+ * @return Promise resolved when done.
+ */
+ async saveDraft(contextLevel: string, contextInstanceId: number, elementId: string, extraParams: {[name: string]: any},
+ pageInstance: string, draftText: string, siteId?: string): Promise {
+
+ let timecreated = Date.now();
+ let entry: CoreEditorDraft;
+
+ // Check if there is a draft already stored.
+ try {
+ entry = await this.getDraft(contextLevel, contextInstanceId, elementId, extraParams, siteId);
+
+ timecreated = entry.timecreated;
+ } catch (error) {
+ // No draft already stored.
+ }
+
+ if (entry && entry.pageinstance != pageInstance) {
+ this.logger.warning(`Discarding draft because of pageinstance. Context '${contextLevel}' '${contextInstanceId}', ` +
+ `element '${elementId}'`);
+ throw null;
+ }
+
+ const db = await this.sitesProvider.getSiteDb(siteId);
+
+ const data: CoreEditorDraft = this.fixDraftPrimaryData(contextLevel, contextInstanceId, elementId, extraParams);
+
+ data.drafttext = (draftText || '').trim();
+ data.pageinstance = pageInstance;
+ data.timecreated = timecreated;
+ data.timemodified = Date.now();
+
+ await db.insertRecord(this.DRAFT_TABLE, data);
+ }
+}
+
+/**
+ * Primary data to identify a stored draft.
+ */
+type CoreEditorDraftPrimaryData = {
+ contextlevel: string; // Context level.
+ contextinstanceid: number; // The instance ID related to the context.
+ elementid: string; // Element ID.
+ extraparams: string; // Extra params stringified.
+};
+
+/**
+ * Draft data stored.
+ */
+type CoreEditorDraft = CoreEditorDraftPrimaryData & {
+ drafttext?: string; // Draft text stored.
+ pageinstance?: string; // Unique identifier to prevent storing data from several sources at the same time.
+ timecreated?: number; // Time created.
+ timemodified?: number; // Time modified.
+};
From 5a79151b01f1999de6c1f927cbe00c1fa28d303a Mon Sep 17 00:00:00 2001
From: Dani Palou
Date: Fri, 31 Jan 2020 10:08:24 +0100
Subject: [PATCH 3/9] MOBILE-3323 editor: Save and restore drafts
---
scripts/langindex.json | 2 +
.../calendar/pages/edit-event/edit-event.html | 2 +-
.../addon-mod-assign-feedback-comments.html | 3 +-
...ddon-mod-assign-submission-onlinetext.html | 2 +-
.../onlinetext/component/onlinetext.ts | 14 +-
.../addon-mod-data-field-textarea.html | 2 +-
.../fields/textarea/component/textarea.ts | 6 +-
.../components/post/addon-mod-forum-post.html | 2 +-
.../edit-post/addon-mod-forum-edit-post.html | 2 +-
.../pages/new-discussion/new-discussion.html | 2 +-
src/addon/mod/glossary/pages/edit/edit.html | 2 +-
src/addon/mod/glossary/pages/edit/edit.ts | 5 +
src/addon/mod/lesson/pages/player/player.html | 2 +-
src/addon/mod/wiki/pages/edit/edit.html | 2 +-
src/addon/mod/wiki/pages/edit/edit.ts | 15 ++
...ddon-mod-workshop-assessment-strategy.html | 2 +-
.../workshop/pages/assessment/assessment.html | 2 +-
.../edit-submission/edit-submission.html | 2 +-
.../pages/edit-submission/edit-submission.ts | 5 +
.../workshop/pages/submission/submission.html | 2 +-
.../essay/component/addon-qtype-essay.html | 2 +-
.../addon-user-profile-field-textarea.html | 2 +-
src/assets/lang/en.json | 2 +
.../core-editor-rich-text-editor.html | 13 +-
.../rich-text-editor/rich-text-editor.scss | 18 ++-
.../rich-text-editor/rich-text-editor.ts | 142 +++++++++++++++++-
src/core/editor/lang/en.json | 4 +
src/theme/variables.scss | 5 -
28 files changed, 228 insertions(+), 36 deletions(-)
create mode 100644 src/core/editor/lang/en.json
diff --git a/scripts/langindex.json b/scripts/langindex.json
index 344e7460d..339c56c5a 100644
--- a/scripts/langindex.json
+++ b/scripts/langindex.json
@@ -1482,6 +1482,8 @@
"core.downloaded": "local_moodlemobileapp",
"core.downloading": "local_moodlemobileapp",
"core.edit": "moodle",
+ "core.editor.autosavesucceeded": "editor_atto",
+ "core.editor.textrecovered": "editor_atto",
"core.emptysplit": "local_moodlemobileapp",
"core.error": "moodle",
"core.errorchangecompletion": "local_moodlemobileapp",
diff --git a/src/addon/calendar/pages/edit-event/edit-event.html b/src/addon/calendar/pages/edit-event/edit-event.html
index 9eae210f8..55a2cd584 100644
--- a/src/addon/calendar/pages/edit-event/edit-event.html
+++ b/src/addon/calendar/pages/edit-event/edit-event.html
@@ -86,7 +86,7 @@
{{ 'core.description' | translate }}
-
+
diff --git a/src/addon/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html b/src/addon/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html
index 6a2fff370..75892386b 100644
--- a/src/addon/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html
+++ b/src/addon/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html
@@ -19,5 +19,6 @@
-
+
+
diff --git a/src/addon/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html b/src/addon/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html
index a629ab325..a659af7a9 100644
--- a/src/addon/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html
+++ b/src/addon/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html
@@ -15,6 +15,6 @@
{{ 'core.numwords' | translate: {'$a': words + ' / ' + configs.wordlimit} }}
-
+
diff --git a/src/addon/mod/assign/submission/onlinetext/component/onlinetext.ts b/src/addon/mod/assign/submission/onlinetext/component/onlinetext.ts
index 70ee9d183..a788de667 100644
--- a/src/addon/mod/assign/submission/onlinetext/component/onlinetext.ts
+++ b/src/addon/mod/assign/submission/onlinetext/component/onlinetext.ts
@@ -14,6 +14,7 @@
import { Component, OnInit, ElementRef } from '@angular/core';
import { FormBuilder, FormControl } from '@angular/forms';
+import { CoreSitesProvider } from '@providers/sites';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreTextUtilsProvider } from '@providers/utils/text';
import { AddonModAssignProvider } from '../../../providers/assign';
@@ -35,16 +36,23 @@ export class AddonModAssignSubmissionOnlineTextComponent extends AddonModAssignS
text: string;
loaded: boolean;
wordLimitEnabled: boolean;
+ currentUserId: number;
protected wordCountTimeout: any;
protected element: HTMLElement;
- constructor(protected fb: FormBuilder, protected domUtils: CoreDomUtilsProvider, protected textUtils: CoreTextUtilsProvider,
- protected assignProvider: AddonModAssignProvider, protected assignOfflineProvider: AddonModAssignOfflineProvider,
- element: ElementRef) {
+ constructor(
+ protected fb: FormBuilder,
+ protected domUtils: CoreDomUtilsProvider,
+ protected textUtils: CoreTextUtilsProvider,
+ protected assignProvider: AddonModAssignProvider,
+ protected assignOfflineProvider: AddonModAssignOfflineProvider,
+ element: ElementRef,
+ sitesProvider: CoreSitesProvider) {
super();
this.element = element.nativeElement;
+ this.currentUserId = sitesProvider.getCurrentSiteUserId();
}
/**
diff --git a/src/addon/mod/data/fields/textarea/component/addon-mod-data-field-textarea.html b/src/addon/mod/data/fields/textarea/component/addon-mod-data-field-textarea.html
index 02ce6f367..680b92f89 100644
--- a/src/addon/mod/data/fields/textarea/component/addon-mod-data-field-textarea.html
+++ b/src/addon/mod/data/fields/textarea/component/addon-mod-data-field-textarea.html
@@ -2,7 +2,7 @@
-
+
diff --git a/src/addon/mod/data/fields/textarea/component/textarea.ts b/src/addon/mod/data/fields/textarea/component/textarea.ts
index ba54212d7..d0d03359a 100644
--- a/src/addon/mod/data/fields/textarea/component/textarea.ts
+++ b/src/addon/mod/data/fields/textarea/component/textarea.ts
@@ -49,10 +49,10 @@ export class AddonModDataFieldTextareaComponent extends AddonModDataFieldPluginC
* Initialize field.
*/
protected init(): void {
- if (this.isShowOrListMode()) {
- this.component = AddonModDataProvider.COMPONENT;
- this.componentId = this.database.coursemodule;
+ this.component = AddonModDataProvider.COMPONENT;
+ this.componentId = this.database.coursemodule;
+ if (this.isShowOrListMode()) {
return;
}
diff --git a/src/addon/mod/forum/components/post/addon-mod-forum-post.html b/src/addon/mod/forum/components/post/addon-mod-forum-post.html
index 02a3bbe42..cafe72514 100644
--- a/src/addon/mod/forum/components/post/addon-mod-forum-post.html
+++ b/src/addon/mod/forum/components/post/addon-mod-forum-post.html
@@ -64,7 +64,7 @@
{{ 'addon.mod_forum.message' | translate }}
-
+
{{ 'addon.mod_forum.privatereply' | translate }}
diff --git a/src/addon/mod/forum/pages/edit-post/addon-mod-forum-edit-post.html b/src/addon/mod/forum/pages/edit-post/addon-mod-forum-edit-post.html
index 0a934fa27..3fd8d6e4a 100644
--- a/src/addon/mod/forum/pages/edit-post/addon-mod-forum-edit-post.html
+++ b/src/addon/mod/forum/pages/edit-post/addon-mod-forum-edit-post.html
@@ -16,7 +16,7 @@
{{ 'addon.mod_forum.message' | translate }}
-
+
diff --git a/src/addon/mod/forum/pages/new-discussion/new-discussion.html b/src/addon/mod/forum/pages/new-discussion/new-discussion.html
index 95bb6e5ce..6cfeb39f8 100644
--- a/src/addon/mod/forum/pages/new-discussion/new-discussion.html
+++ b/src/addon/mod/forum/pages/new-discussion/new-discussion.html
@@ -19,7 +19,7 @@
{{ 'addon.mod_forum.message' | translate }}
-
+
diff --git a/src/addon/mod/glossary/pages/edit/edit.html b/src/addon/mod/glossary/pages/edit/edit.html
index 3c3bfa0d7..0bf02b458 100644
--- a/src/addon/mod/glossary/pages/edit/edit.html
+++ b/src/addon/mod/glossary/pages/edit/edit.html
@@ -15,7 +15,7 @@
{{ 'addon.mod_glossary.definition' | translate }}
-
+
0">
{{ 'addon.mod_glossary.categories' | translate }}
diff --git a/src/addon/mod/glossary/pages/edit/edit.ts b/src/addon/mod/glossary/pages/edit/edit.ts
index 7bb9e60eb..9cf8b4355 100644
--- a/src/addon/mod/glossary/pages/edit/edit.ts
+++ b/src/addon/mod/glossary/pages/edit/edit.ts
@@ -51,6 +51,7 @@ export class AddonModGlossaryEditPage implements OnInit {
attachments = [];
definitionControl = new FormControl();
categories = [];
+ editorExtraParams: {[name: string]: any} = {};
protected courseId: number;
protected module: any;
@@ -113,6 +114,10 @@ export class AddonModGlossaryEditPage implements OnInit {
this.originalData.files = files.slice();
});
}
+
+ if (entry.id) {
+ this.editorExtraParams.id = entry.id;
+ }
}
this.definitionControl.setValue(this.entry.definition);
diff --git a/src/addon/mod/lesson/pages/player/player.html b/src/addon/mod/lesson/pages/player/player.html
index 13c7e7f0b..b8526c401 100644
--- a/src/addon/mod/lesson/pages/player/player.html
+++ b/src/addon/mod/lesson/pages/player/player.html
@@ -57,7 +57,7 @@
-
+
{{ 'addon.mod_lesson.youranswer' | translate }}
diff --git a/src/addon/mod/wiki/pages/edit/edit.html b/src/addon/mod/wiki/pages/edit/edit.html
index c9f61f896..2381df6c3 100644
--- a/src/addon/mod/wiki/pages/edit/edit.html
+++ b/src/addon/mod/wiki/pages/edit/edit.html
@@ -17,7 +17,7 @@
-
+
diff --git a/src/addon/mod/wiki/pages/edit/edit.ts b/src/addon/mod/wiki/pages/edit/edit.ts
index 160bfeeb2..033ec982e 100644
--- a/src/addon/mod/wiki/pages/edit/edit.ts
+++ b/src/addon/mod/wiki/pages/edit/edit.ts
@@ -45,6 +45,7 @@ export class AddonModWikiEditPage implements OnInit, OnDestroy {
component = AddonModWikiProvider.COMPONENT; // Component to link the files to.
componentId: number; // Component ID to link the files to.
wrongVersionLock: boolean; // Whether the page lock doesn't match the initial one.
+ editorExtraParams: {[name: string]: any} = {};
protected module: any; // Wiki module instance.
protected courseId: number; // Course the wiki belongs to.
@@ -101,6 +102,20 @@ export class AddonModWikiEditPage implements OnInit, OnDestroy {
// Block the wiki so it cannot be synced.
this.syncProvider.blockOperation(this.component, this.blockId);
+
+ if (!this.module.id) {
+ this.editorExtraParams.type = 'wiki';
+ }
+
+ if (this.pageId) {
+ this.editorExtraParams.pageid = this.pageId;
+
+ if (this.section) {
+ this.editorExtraParams.section = this.section;
+ }
+ } else if (pageTitle) {
+ this.editorExtraParams.pagetitle = pageTitle;
+ }
}
/**
diff --git a/src/addon/mod/workshop/components/assessment-strategy/addon-mod-workshop-assessment-strategy.html b/src/addon/mod/workshop/components/assessment-strategy/addon-mod-workshop-assessment-strategy.html
index 7f3b2bba7..b79857e1d 100644
--- a/src/addon/mod/workshop/components/assessment-strategy/addon-mod-workshop-assessment-strategy.html
+++ b/src/addon/mod/workshop/components/assessment-strategy/addon-mod-workshop-assessment-strategy.html
@@ -16,7 +16,7 @@
{{ 'addon.mod_workshop.feedbackauthor' | translate }}
-
+
{{ 'addon.mod_workshop.feedbackreviewer' | translate }}
-
+
diff --git a/src/addon/mod/workshop/pages/edit-submission/edit-submission.html b/src/addon/mod/workshop/pages/edit-submission/edit-submission.html
index 71b1e535d..a7f3bad68 100644
--- a/src/addon/mod/workshop/pages/edit-submission/edit-submission.html
+++ b/src/addon/mod/workshop/pages/edit-submission/edit-submission.html
@@ -18,7 +18,7 @@
{{ 'addon.mod_workshop.submissioncontent' | translate }}
-
+
diff --git a/src/addon/mod/workshop/pages/edit-submission/edit-submission.ts b/src/addon/mod/workshop/pages/edit-submission/edit-submission.ts
index 816a29b46..c3fb1edbb 100644
--- a/src/addon/mod/workshop/pages/edit-submission/edit-submission.ts
+++ b/src/addon/mod/workshop/pages/edit-submission/edit-submission.ts
@@ -51,6 +51,7 @@ export class AddonModWorkshopEditSubmissionPage implements OnInit, OnDestroy {
component = AddonModWorkshopProvider.COMPONENT;
componentId: number;
editForm: FormGroup; // The form group.
+ editorExtraParams: {[name: string]: any} = {};
protected workshopId: number;
protected submissionId: number;
@@ -86,6 +87,10 @@ export class AddonModWorkshopEditSubmissionPage implements OnInit, OnDestroy {
this.editForm = new FormGroup({});
this.editForm.addControl('title', this.fb.control('', Validators.required));
this.editForm.addControl('content', this.fb.control(''));
+
+ if (this.submissionId) {
+ this.editorExtraParams.id = this.submissionId;
+ }
}
/**
diff --git a/src/addon/mod/workshop/pages/submission/submission.html b/src/addon/mod/workshop/pages/submission/submission.html
index 41fbecd1d..0951709ae 100644
--- a/src/addon/mod/workshop/pages/submission/submission.html
+++ b/src/addon/mod/workshop/pages/submission/submission.html
@@ -87,7 +87,7 @@
{{ 'addon.mod_workshop.feedbackauthor' | translate }}
-
+
diff --git a/src/addon/qtype/essay/component/addon-qtype-essay.html b/src/addon/qtype/essay/component/addon-qtype-essay.html
index 5c171fedc..13462423b 100644
--- a/src/addon/qtype/essay/component/addon-qtype-essay.html
+++ b/src/addon/qtype/essay/component/addon-qtype-essay.html
@@ -11,7 +11,7 @@
-
+
diff --git a/src/addon/userprofilefield/textarea/component/addon-user-profile-field-textarea.html b/src/addon/userprofilefield/textarea/component/addon-user-profile-field-textarea.html
index 1d149a8ed..8908db521 100644
--- a/src/addon/userprofilefield/textarea/component/addon-user-profile-field-textarea.html
+++ b/src/addon/userprofilefield/textarea/component/addon-user-profile-field-textarea.html
@@ -9,5 +9,5 @@
{{ field.name }}
-
+
\ No newline at end of file
diff --git a/src/assets/lang/en.json b/src/assets/lang/en.json
index e9673f525..d3f4ff056 100644
--- a/src/assets/lang/en.json
+++ b/src/assets/lang/en.json
@@ -1482,6 +1482,8 @@
"core.downloaded": "Downloaded",
"core.downloading": "Downloading",
"core.edit": "Edit",
+ "core.editor.autosavesucceeded": "Draft saved.",
+ "core.editor.textrecovered": "A draft version of this text was automatically restored.",
"core.emptysplit": "This page will appear blank if the left panel is empty or is loading.",
"core.error": "Error",
"core.errorchangecompletion": "An error occurred while changing the completion status. Please try again.",
diff --git a/src/core/editor/components/rich-text-editor/core-editor-rich-text-editor.html b/src/core/editor/components/rich-text-editor/core-editor-rich-text-editor.html
index ba2bd897f..6b3a503ed 100644
--- a/src/core/editor/components/rich-text-editor/core-editor-rich-text-editor.html
+++ b/src/core/editor/components/rich-text-editor/core-editor-rich-text-editor.html
@@ -1,7 +1,14 @@
-
-
+
+
+
-
+
+
+
+
+ {{ infoMessage | translate }}
+
+
-
-
+
{{username}}
diff --git a/src/core/login/pages/reconnect/reconnect.ts b/src/core/login/pages/reconnect/reconnect.ts
index 9372ed2b7..73b551574 100644
--- a/src/core/login/pages/reconnect/reconnect.ts
+++ b/src/core/login/pages/reconnect/reconnect.ts
@@ -12,9 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { Component } from '@angular/core';
+import { Component, ViewChild, ElementRef } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { CoreAppProvider } from '@providers/app';
+import { CoreEventsProvider } from '@providers/events';
import { CoreSitesProvider } from '@providers/sites';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreLoginHelperProvider } from '../../providers/helper';
@@ -29,6 +30,9 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
templateUrl: 'reconnect.html',
})
export class CoreLoginReconnectPage {
+
+ @ViewChild('reconnectForm') formElement: ElementRef;
+
credForm: FormGroup;
siteUrl: string;
username: string;
@@ -47,13 +51,14 @@ export class CoreLoginReconnectPage {
protected isLoggedOut: boolean;
protected siteId: string;
- constructor(private navCtrl: NavController,
+ constructor(protected navCtrl: NavController,
navParams: NavParams,
fb: FormBuilder,
- private appProvider: CoreAppProvider,
- private sitesProvider: CoreSitesProvider,
- private loginHelper: CoreLoginHelperProvider,
- private domUtils: CoreDomUtilsProvider) {
+ protected appProvider: CoreAppProvider,
+ protected sitesProvider: CoreSitesProvider,
+ protected loginHelper: CoreLoginHelperProvider,
+ protected domUtils: CoreDomUtilsProvider,
+ protected eventsProvider: CoreEventsProvider) {
const currentSite = this.sitesProvider.getCurrentSite();
@@ -175,6 +180,12 @@ export class CoreLoginReconnectPage {
// Start the authentication process.
this.sitesProvider.getUserToken(siteUrl, username, password).then((data) => {
return this.sitesProvider.updateSiteToken(this.infoSiteUrl, username, data.token, data.privateToken).then(() => {
+
+ this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
+ form: this.formElement.nativeElement,
+ online: true,
+ });
+
// Update site info too because functions might have changed (e.g. unisntall local_mobile).
return this.sitesProvider.updateSiteInfoByUrl(this.infoSiteUrl, username).then(() => {
// Reset fields so the data is not in the view anymore.
diff --git a/src/core/login/pages/site/site.html b/src/core/login/pages/site/site.html
index 6a4b40f36..8da75c237 100644
--- a/src/core/login/pages/site/site.html
+++ b/src/core/login/pages/site/site.html
@@ -17,7 +17,7 @@
-
+
{{ 'core.login.newsitedescription' | translate }}
diff --git a/src/core/login/pages/site/site.ts b/src/core/login/pages/site/site.ts
index 5a231d27c..d20b510f7 100644
--- a/src/core/login/pages/site/site.ts
+++ b/src/core/login/pages/site/site.ts
@@ -12,9 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import { Component } from '@angular/core';
+import { Component, ViewChild, ElementRef } from '@angular/core';
import { IonicPage, NavController, ModalController, NavParams } from 'ionic-angular';
import { CoreAppProvider } from '@providers/app';
+import { CoreEventsProvider } from '@providers/events';
import { CoreSitesProvider, CoreSiteCheckResponse } from '@providers/sites';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreConfigConstants } from '../../../../configconstants';
@@ -31,6 +32,9 @@ import { CoreUrl } from '@classes/utils/url';
templateUrl: 'site.html',
})
export class CoreLoginSitePage {
+
+ @ViewChild('siteFormEl') formElement: ElementRef;
+
siteForm: FormGroup;
fixedSites: any[];
filteredSites: any[];
@@ -38,9 +42,15 @@ export class CoreLoginSitePage {
showKeyboard = false;
filter = '';
- constructor(navParams: NavParams, private navCtrl: NavController, fb: FormBuilder, private appProvider: CoreAppProvider,
- private sitesProvider: CoreSitesProvider, private loginHelper: CoreLoginHelperProvider,
- private modalCtrl: ModalController, private domUtils: CoreDomUtilsProvider) {
+ constructor(navParams: NavParams,
+ protected navCtrl: NavController,
+ fb: FormBuilder,
+ protected appProvider: CoreAppProvider,
+ protected sitesProvider: CoreSitesProvider,
+ protected loginHelper: CoreLoginHelperProvider,
+ protected modalCtrl: ModalController,
+ protected domUtils: CoreDomUtilsProvider,
+ protected eventsProvider: CoreEventsProvider) {
this.showKeyboard = !!navParams.get('showKeyboard');
@@ -96,6 +106,12 @@ export class CoreLoginSitePage {
// It's a demo site.
this.sitesProvider.getUserToken(siteData.url, siteData.username, siteData.password).then((data) => {
return this.sitesProvider.newSite(data.siteUrl, data.token, data.privateToken).then(() => {
+
+ this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
+ form: this.formElement.nativeElement,
+ online: true,
+ });
+
return this.loginHelper.goToSiteInitialPage();
}, (error) => {
this.loginHelper.treatUserTokenError(siteData.url, error, siteData.username, siteData.password);
@@ -175,6 +191,12 @@ export class CoreLoginSitePage {
*/
protected async login(response: CoreSiteCheckResponse): Promise {
return this.sitesProvider.checkRequiredMinimumVersion(response.config).then(() => {
+
+ this.eventsProvider.trigger(CoreEventsProvider.FORM_SUBMITTED, {
+ form: this.formElement.nativeElement,
+ online: true,
+ });
+
if (response.warning) {
this.domUtils.showErrorModal(response.warning, true, 4000);
}
diff --git a/src/core/search/components/search-box/core-search-box.html b/src/core/search/components/search-box/core-search-box.html
index adc00c50b..be186a40b 100644
--- a/src/core/search/components/search-box/core-search-box.html
+++ b/src/core/search/components/search-box/core-search-box.html
@@ -1,5 +1,5 @@
-
+