diff --git a/mocks/data.json b/mocks/data.json
index 09fa3d9..d5c39ec 100644
--- a/mocks/data.json
+++ b/mocks/data.json
@@ -1,21 +1,11 @@
{
"courses": [
- {
- "id": "1",
- "title": "Video about Denmark",
- "createdAtDate": "1/1/2019",
- "durationTime": 120,
- "topRated": true,
- "authors": [],
- "description": "Lorem, ipsum dolor sit amet consectetur adipisicing elit. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla."
- },
{
"id": "2",
"title": "Video about Canada",
- "createdAtDate": "5/20/2020",
+ "createdAtDate": "5/2/2020",
"durationTime": 180,
"authors": [
- "me",
"me"
],
"description": "Lorem, ipsum dolor sit amet consectetur adipisicing elit. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla."
@@ -23,11 +13,10 @@
{
"id": "3",
"title": "Video about Brazil",
- "createdAtDate": "12/14/2021",
+ "createdAtDate": "12/12/2021",
"durationTime": 180,
"topRated": false,
"authors": [
- "me",
"me",
"id3"
],
@@ -36,11 +25,10 @@
{
"id": "4",
"title": "Video about Australia",
- "createdAtDate": "10/20/2020",
+ "createdAtDate": "11/12/2020",
"durationTime": 132,
"topRated": false,
"authors": [
- "me",
"me",
"id4"
],
@@ -53,7 +41,6 @@
"durationTime": 119,
"topRated": true,
"authors": [
- "me",
"me",
"id6"
],
@@ -61,13 +48,33 @@
},
{
"title": "yurikmurik",
- "createdAtDate": "2020-05-20T21:00:00.000Z",
- "durationTime": "12",
+ "createdAtDate": "04/05/2020",
+ "durationTime": 12,
"description": "123",
"authors": [
"df"
],
"id": "l9muna723"
+ },
+ {
+ "title": "Video about Canada",
+ "description": "Lorem, ipsum dolor sit amet consectetur adipisicing elit. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla.",
+ "durationTime": 180,
+ "createdAtDate": "5/2/2020",
+ "authors": [
+ "me"
+ ],
+ "id": "bwqs6nfo6"
+ },
+ {
+ "title": "asa",
+ "description": "a",
+ "durationTime": 12,
+ "createdAtDate": "12/12/1212",
+ "authors": [
+ "Andrew Vorobiev"
+ ],
+ "id": "dfh962g0a"
}
],
"users": [
@@ -79,5 +86,19 @@
"password": "12345",
"token": "randomtoken_1234556789$"
}
+ ],
+ "authors": [
+ {
+ "id": "1",
+ "name": "Andrew Vorobiev"
+ },
+ {
+ "id": "2",
+ "name": "Andrey Morozov"
+ },
+ {
+ "id": "3",
+ "name": "Andy Panda"
+ }
]
}
\ No newline at end of file
diff --git a/src/app/add-course-page/add-course-page.component.html b/src/app/add-course-page/add-course-page.component.html
index 42f3c6c..44975ea 100644
--- a/src/app/add-course-page/add-course-page.component.html
+++ b/src/app/add-course-page/add-course-page.component.html
@@ -1,77 +1,125 @@
-
diff --git a/src/app/add-course-page/add-course-page.component.less b/src/app/add-course-page/add-course-page.component.less
index 34761e4..4cd0bc6 100644
--- a/src/app/add-course-page/add-course-page.component.less
+++ b/src/app/add-course-page/add-course-page.component.less
@@ -1,6 +1,6 @@
@import '../../assets/less/modules/variables';
-mat-card {
+.add-course-card {
display: flex;
flex-direction: column;
max-width: 60%;
@@ -11,12 +11,248 @@ mat-card {
left: 0;
margin: 0 auto;
margin-top: 30px;
+ background-color: @color-white;
+
+ &-header {
+ margin-bottom: 15px;
+
+ p {
+ font-family: 'SourseSansPro Regular';
+ font-size: 16px;
+ text-align: left;
+ }
+ }
.add-course-form {
+ &-label, &-label-time, &-label-time-duration {
+ text-align: left;
+ display: block;
+ font-family: 'SourseSansPro Semibold';
+ font-size: 14px;
+ margin-bottom: 15px;
+
+ p {
+ margin-bottom: 0;
+ padding-left: 7px;
+ font-family: 'SourseSansPro Semibold';
+ }
+
+ input, textarea {
+ border: 1px solid @color-gray;
+ border-radius: 2px;
+ padding: 7px;
+ width: 100%;
+ font-family: 'SourseSansPro Semibold';
+ font-size: 14px;
+ color: @color-black;
+ box-sizing: border-box;
+
+ &:focus {
+ outline: 1px solid @color-gray2;
+ }
+
+ &::placeholder {
+ color: @color-gray2;
+ }
+ }
+
+ textarea {
+ resize: vertical;
+ min-height: 125px;
+ max-height: 300px;
+ }
+ }
+
+ &-label {
+ app-authors-input {
+
+ .tags-clouds {
+ display: flex;
+ border: 1px solid @color-gray;
+ border-radius: 2px;
+ width: 100%;
+
+ &-categories {
+ display: flex;
+ align-items: center;
+ span {
+ display: flex;
+ flex-wrap: nowrap;
+ border: 1px solid @color-gray;
+ padding-left: 5px;
+ padding-right: 5px;
+ margin-left: 5px;
+ }
+ &-delete {
+ border: none;
+ margin-left: 5px;
+ padding-left: 5px;
+ padding-right: 5px;
+ cursor: pointer;
+ }
+ }
+
+ input {
+ border: none;
+ width: auto;
+ &:focus {
+ outline: none;
+ }
+ }
+ }
+
+ .tags-clouds-list {
+ margin-top: -15px;
+ ul {
+ list-style-type: none;
+ text-align: left;
+ padding-left: 0px;
+
+ li {
+ font-family: 'SourseSansPro Semibold';
+ border: 1px solid @color-gray2;
+ padding: 5px;
+ width: 50%;
+ }
+ }
+ }
+
+ &.ng-touched.ng-invalid {
+ .tags-clouds {
+ border: 1px solid @color-red;
+ }
+ }
+ }
+ }
+
+ &-label-time-duration {
+ app-duration-field {
+ &.ng-invalid.ng-touched input {
+ border-color: @color-red;
+ }
+
+ input {
+ border: 1px solid @color-gray;
+ border-radius: 2px;
+ padding: 7px;
+ width: 100%;
+ font-family: 'SourseSansPro Semibold';
+ font-size: 14px;
+ color: @color-black;
+ box-sizing: border-box;
+ width: 50%;
+
+ &::placeholder {
+ color: @color-gray2;
+ }
+
+ &:focus {
+ outline: 1px solid @color-gray2;
+ }
+ }
+
+ .transformed-duration {
+ margin-left: 20px;
+ }
+ }
+ }
+
+ &-label-time {
+ app-created-at-date-field {
+
+ &.ng-invalid.ng-touched input {
+ border-color: @color-red;
+ }
+
+ input {
+ border: 1px solid @color-gray;
+ border-radius: 2px;
+ padding: 7px;
+ width: 100%;
+ font-family: 'SourseSansPro Semibold';
+ font-size: 14px;
+ color: @color-black;
+ box-sizing: border-box;
+
+ &::placeholder {
+ color: @color-gray2;
+ }
+
+ &:focus {
+ outline: 1px solid @color-gray2;
+ }
+ }
+ }
+ }
+
+ .error {
+ text-align: left;
+ &-input-validation {
+ border-color: @color-red;
+ }
+ &-message {
+ color: @color-red;
+ padding-left: 10px;
+ text-align: left;
+ margin-bottom: 10px;
+ margin-top: -10px;
+ }
+ input, textarea {
+ &:focus {
+ outline: 1px solid @color-red;
+ }
+ }
+ }
+
+ &-label-time {
+ width: 20%;
+
+ &-picker {
+ position: relative;
+ mat-datepicker-toggle {
+ position: absolute;
+ top: -2px;
+ right: 0px;
+ }
+ }
+ &-duration {
+ width: 40%;
+ }
+ }
+
&-field {
max-width: 50%;
}
+
+ &-actions {
+ display: flex;
+ justify-content: flex-end;
+ margin-top: 35px;
+
+ button {
+ transition-duration: 0.4s;
+
+ &.add-course-form-button-cancel {
+ background-color: @color-gray;
+ color: @color-dark;
+ }
+ &.add-course-form-button-save {
+ color: @color-white;
+ background-color: @color-green1;
+ margin-left: 10px;
+
+ &--disabled {
+ background-color: @color-green2;
+ transition: none;
+ box-shadow: none;
+ }
+ }
+ &:hover {
+ box-shadow: inset 0 0 100px 100px @color-black1;
+ }
+ }
+ }
}
}
@@ -59,24 +295,3 @@ mat-card-content {
}
}
-mat-card-actions {
- display: flex;
- justify-content: end;
-
- button {
- transition-duration: 0.4s;
-
- &.add-course-form-button-cancel {
- background-color: @color-gray;
- color: @color-dark;
- }
- &.add-course-form-button-save {
- color: @color-white;
- background-color: @color-green1;
- margin-left: 10px;
- }
- &:hover {
- box-shadow: inset 0 0 100px 100px @color-black1;
- }
- }
-}
\ No newline at end of file
diff --git a/src/app/add-course-page/add-course-page.component.ts b/src/app/add-course-page/add-course-page.component.ts
index 08a7044..d0678c3 100644
--- a/src/app/add-course-page/add-course-page.component.ts
+++ b/src/app/add-course-page/add-course-page.component.ts
@@ -1,49 +1,94 @@
-import { Component } from '@angular/core';
-import { Router } from '@angular/router';
+import { Component, OnInit, ViewEncapsulation } from '@angular/core';
+import { FormBuilder, FormGroup, Validators } from '@angular/forms';
+import { ActivatedRoute, Router } from '@angular/router';
+import { Observable } from 'rxjs';
+import { CourseItemInfo, GetFormControls } from '../core/models';
import { HomePageService } from '../core/services/home-page.service';
-import { CourseItemInfo } from '../core/models';
-import { MatDatepickerInputEvent } from '@angular/material/datepicker';
const coursesURL: string = '/courses';
@Component({
selector: 'app-add-course-page',
templateUrl: './add-course-page.component.html',
- styleUrls: ['./add-course-page.component.less']
+ styleUrls: ['./add-course-page.component.less'],
+ encapsulation: ViewEncapsulation.None
})
-export class AddCoursePageComponent {
- public title: string;
- public description: string;
- public duration: number;
- public datapicker: Date;
- public authors: string;
+export class AddCoursePageComponent implements OnInit {
+ public addNewCourseForm: FormGroup;
+ public editableCourseItems: CourseItemInfo;
+ public courseId: string;
+ public pageTitle: string;
constructor (
private router: Router,
+ private activatedRoute: ActivatedRoute,
private homePageService: HomePageService,
+ private fb: FormBuilder,
) { }
+ public ngOnInit(): void {
+ this.addNewCourseForm = this.fb.group({
+ title: [(this.editableCourseItems && this.editableCourseItems.title), [
+ Validators.required,
+ Validators.maxLength(50)
+ ]],
+ description: ['', [
+ Validators.required,
+ Validators.maxLength(500)
+ ]],
+ durationTime: ['', [Validators.required]],
+ createdAtDate: ['', Validators.required],
+ authors: [[]]
+ });
+
+ this.activatedRoute.paramMap.subscribe(params => {
+ const courseId: string = params.get('courseId');
+ this.courseId = courseId;
+ courseId
+ ? this.pageTitle = 'Edit course'
+ : this.pageTitle = 'Add new course';
+ if (courseId) {
+ this.getCourseItemById(courseId);
+ }
+ });
+ }
+
+ public getCourseItemById(id: string): void {
+ this.homePageService.getCourseById(id).subscribe(
+ data => this.editCourse(data));
+ }
+
+ public editCourse(course: CourseItemInfo): void {
+ this.addNewCourseForm.patchValue({
+ title: course.title,
+ description: course.description,
+ durationTime: +course.durationTime,
+ createdAtDate: course.createdAtDate,
+ authors: course.authors
+ });
+ }
+
public cancelClick(): void {
this.router.navigate([coursesURL]);
}
public addNewCourse(): void {
- const authorsArr: string[] = this.authors.split(', ');
- const sentDataCourse: CourseItemInfo = {
- title: this.title,
- createdAtDate: this.datapicker,
- durationTime: this.duration,
- description: this.description,
- authors: authorsArr
- };
-
- this.homePageService.createCourse(sentDataCourse).subscribe (
+ const sentDataCourse: CourseItemInfo = this.addNewCourseForm.value;
+ let changeCourseItems: Observable