0" class="col-12">
+
diff --git a/rubberduckvba.client/src/app/components/feature-info/feature-info.component.ts b/rubberduckvba.client/src/app/components/feature-info/feature-info.component.ts
index 1c51009..19de4d5 100644
--- a/rubberduckvba.client/src/app/components/feature-info/feature-info.component.ts
+++ b/rubberduckvba.client/src/app/components/feature-info/feature-info.component.ts
@@ -1,17 +1,24 @@
import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';
-import { AnnotationViewModel, AnnotationsFeatureViewModel, BlogLink, FeatureViewModel, InspectionViewModel, InspectionsFeatureViewModel, QuickFixViewModel, QuickFixesFeatureViewModel, SubFeatureViewModel, XmlDocItemViewModel, XmlDocOrFeatureViewModel, XmlDocViewModel } from '../../model/feature.model';
+import { AnnotationViewModel, AnnotationsFeatureViewModel, BlogLink, FeatureViewModel, InspectionViewModel, InspectionsFeatureViewModel, QuickFixViewModel, QuickFixesFeatureViewModel, SubFeatureViewModel, UserViewModel, XmlDocItemViewModel, XmlDocOrFeatureViewModel, XmlDocViewModel } from '../../model/feature.model';
import { BehaviorSubject } from 'rxjs';
import { FaIconLibrary } from '@fortawesome/angular-fontawesome';
import { fas } from '@fortawesome/free-solid-svg-icons';
import { ApiClientService } from '../../services/api-client.service';
+import { AuthService } from '../../services/auth.service';
+import { AdminAction } from '../edit-feature/edit-feature.component';
@Component({
selector: 'feature-info',
templateUrl: './feature-info.component.html',
})
-export class FeatureInfoComponent implements OnInit, OnChanges {
+export class FeatureInfoComponent implements OnInit {
private readonly _info: BehaviorSubject
= new BehaviorSubject(null!);
+ private readonly _user: BehaviorSubject = new BehaviorSubject(null!);
+
+ public editAction: AdminAction = AdminAction.Edit;
+ public createAction: AdminAction = AdminAction.Create;
+ public deleteAction: AdminAction = AdminAction.Delete;
public filterState = {
// searchbox
@@ -68,11 +75,20 @@ export class FeatureInfoComponent implements OnInit, OnChanges {
return feature?.links ?? [];
}
- constructor(private api: ApiClientService, private fa: FaIconLibrary) {
+ public get user(): UserViewModel {
+ return this._user.getValue();
+ }
+
+ constructor(private auth: AuthService, private api: ApiClientService, private fa: FaIconLibrary) {
fa.addIconPacks(fas);
}
ngOnInit(): void {
+ this.auth.getUser().subscribe(result => {
+ if (result) {
+ this._user.next(result as UserViewModel);
+ }
+ });
this.api.getFeature('quickfixes').subscribe(result => {
if (result) {
this._quickfixes.next((result as QuickFixesFeatureViewModel).quickFixes.slice());
@@ -80,10 +96,6 @@ export class FeatureInfoComponent implements OnInit, OnChanges {
});
}
-
- ngOnChanges(changes: SimpleChanges): void {
- }
-
public onFilter(): void {
this.filterByNameOrDescription(this.filterState.filterText);
}
diff --git a/rubberduckvba.client/src/app/model/feature.model.ts b/rubberduckvba.client/src/app/model/feature.model.ts
index 97a0534..fad751f 100644
--- a/rubberduckvba.client/src/app/model/feature.model.ts
+++ b/rubberduckvba.client/src/app/model/feature.model.ts
@@ -1,5 +1,5 @@
export interface ViewModel {
- id: number;
+ id: number | undefined;
dateInserted: string;
dateUpdated: string;
name: string;
@@ -10,6 +10,10 @@ export interface ViewModel {
isDetailsCollapsed: boolean;
}
+export interface MarkdownContent {
+ content: string;
+}
+
export interface SubFeatureViewModel extends ViewModel {
featureId?: number;
featureName?: string;
@@ -17,6 +21,7 @@ export interface SubFeatureViewModel extends ViewModel {
title: string;
description: string;
+ shortDescription: string;
}
export interface XmlDocViewModel extends SubFeatureViewModel {
@@ -185,7 +190,7 @@ export interface AnnotationViewModel extends XmlDocViewModel {
export type XmlDocItemViewModel = InspectionViewModel | QuickFixViewModel | AnnotationViewModel;
export class ViewModelBase implements ViewModel {
- id: number;
+ id: number | undefined;
dateInserted: string;
dateUpdated: string;
name: string;
@@ -261,17 +266,29 @@ export class SubFeatureViewModelClass extends ViewModelBase implements SubFeatur
featureTitle?: string | undefined;
title: string;
description: string;
+ shortDescription: string;
constructor(model: SubFeatureViewModel) {
super(model);
this.title = model.title;
this.description = model.description;
+ this.shortDescription = model.shortDescription;
this.isDetailsCollapsed = true;
this.featureId = model.featureId;
this.featureName = model.featureName;
}
}
+export class EditSubFeatureViewModelClass extends SubFeatureViewModelClass {
+ constructor(model: SubFeatureViewModel) {
+ super(model);
+ this.isDetailsCollapsed = false;
+ this.descriptionPreview = model.description;
+ }
+
+ public descriptionPreview: string;
+}
+
export class InspectionViewModelClass extends SubFeatureViewModelClass implements InspectionViewModel {
inspectionType: string;
defaultSeverity: string;
diff --git a/rubberduckvba.client/src/app/routes/features/features.component.html b/rubberduckvba.client/src/app/routes/features/features.component.html
index 2366bed..f55801a 100644
--- a/rubberduckvba.client/src/app/routes/features/features.component.html
+++ b/rubberduckvba.client/src/app/routes/features/features.component.html
@@ -25,7 +25,7 @@ Your IDE is incomplete without...
diff --git a/rubberduckvba.client/src/app/routes/features/features.component.ts b/rubberduckvba.client/src/app/routes/features/features.component.ts
index cf7c8e6..5e1acd7 100644
--- a/rubberduckvba.client/src/app/routes/features/features.component.ts
+++ b/rubberduckvba.client/src/app/routes/features/features.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnChanges, OnInit, SimpleChanges } from '@angular/core';
+import { Component, OnInit } from '@angular/core';
import { ApiClientService } from "../../services/api-client.service";
import { FaIconLibrary } from '@fortawesome/angular-fontawesome';
import { fas } from '@fortawesome/free-solid-svg-icons';
@@ -9,7 +9,7 @@ import { FeatureViewModel, QuickFixViewModel } from '../../model/feature.model';
selector: 'app-features',
templateUrl: './features.component.html',
})
-export class FeaturesComponent implements OnInit, OnChanges {
+export class FeaturesComponent implements OnInit {
private readonly _features: BehaviorSubject = new BehaviorSubject(null!);
public set features(value: FeatureViewModel[]) {
@@ -19,19 +19,10 @@ export class FeaturesComponent implements OnInit, OnChanges {
return this._features.getValue();
}
- private readonly _quickFixes: BehaviorSubject = new BehaviorSubject(null!);
- public get quickFixes(): QuickFixViewModel[] {
- return this._quickFixes.value;
- }
-
constructor(private api: ApiClientService, private fa: FaIconLibrary) {
fa.addIconPacks(fas);
}
- ngOnChanges(changes: SimpleChanges): void {
- console.log(changes);
- }
-
ngOnInit(): void {
this.api.getFeatureSummaries().subscribe(result => {
if (result) {
diff --git a/rubberduckvba.client/src/app/services/api-client.service.ts b/rubberduckvba.client/src/app/services/api-client.service.ts
index 5be402b..431441d 100644
--- a/rubberduckvba.client/src/app/services/api-client.service.ts
+++ b/rubberduckvba.client/src/app/services/api-client.service.ts
@@ -1,6 +1,6 @@
import { Injectable } from "@angular/core";
import { LatestTags, Tag } from "../model/tags.model";
-import { AnnotationViewModel, AnnotationViewModelClass, AnnotationsFeatureViewModel, AnnotationsFeatureViewModelClass, FeatureViewModel, FeatureViewModelClass, InspectionViewModel, InspectionViewModelClass, InspectionsFeatureViewModel, InspectionsFeatureViewModelClass, QuickFixViewModel, QuickFixViewModelClass, QuickFixesFeatureViewModel, QuickFixesFeatureViewModelClass, SubFeatureViewModel, SubFeatureViewModelClass, UserViewModel, XmlDocOrFeatureViewModel } from "../model/feature.model";
+import { AnnotationViewModel, AnnotationViewModelClass, AnnotationsFeatureViewModel, AnnotationsFeatureViewModelClass, FeatureViewModel, FeatureViewModelClass, InspectionViewModel, InspectionViewModelClass, InspectionsFeatureViewModel, InspectionsFeatureViewModelClass, MarkdownContent, QuickFixViewModel, QuickFixViewModelClass, QuickFixesFeatureViewModel, QuickFixesFeatureViewModelClass, SubFeatureViewModel, SubFeatureViewModelClass, UserViewModel, XmlDocOrFeatureViewModel } from "../model/feature.model";
import { DownloadInfo } from "../model/downloads.model";
import { DataService } from "./data.service";
import { environment } from "../../environments/environment.prod";
@@ -82,4 +82,27 @@ export class ApiClientService {
return model;
}));
}
+
+ public createFeature(model: SubFeatureViewModel): Observable {
+ const url = `${environment.apiBaseUrl}features/create`;
+ return this.data.postAsync(url, model).pipe(map(result => new SubFeatureViewModelClass(result as SubFeatureViewModel)));
+ }
+
+ public saveFeature(model: SubFeatureViewModel): Observable {
+ const url = `${environment.apiBaseUrl}features/update`;
+ return this.data.postAsync(url, model).pipe(map(result => new SubFeatureViewModelClass(result as SubFeatureViewModel)));
+ }
+
+ public deleteFeature(model: SubFeatureViewModel): Observable {
+ const url = `${environment.apiBaseUrl}features/delete`;
+ return this.data.postAsync(url, model).pipe(map(() => model));
+ }
+
+ public formatMarkdown(raw: string): Observable {
+ const url = `${environment.apiBaseUrl}markdown/format`;
+ const content: MarkdownContent = {
+ content: raw
+ };
+ return this.data.postAsync(url, content);
+ }
}
diff --git a/rubberduckvba.client/src/app/services/data.service.ts b/rubberduckvba.client/src/app/services/data.service.ts
index c66a376..748b7ea 100644
--- a/rubberduckvba.client/src/app/services/data.service.ts
+++ b/rubberduckvba.client/src/app/services/data.service.ts
@@ -14,13 +14,11 @@ export class DataService {
let headers = new HttpHeaders()
.append('accept', 'application/json');
const token = sessionStorage.getItem('github:access_token');
- let withCreds = false;
if (token) {
headers = headers.append('X-ACCESS-TOKEN', token);
- withCreds = true;
}
- return this.http.get(url, { headers, withCredentials: withCreds })
+ return this.http.get(url, { headers })
.pipe(
map(result => result),
timeout(this.timeout),
@@ -38,15 +36,13 @@ export class DataService {
.append('Content-Type', 'application/json; charset=utf-8');
const token = sessionStorage.getItem('github:access_token');
- let withCreds = false;
if (token) {
headers = headers.append('X-ACCESS-TOKEN', token);
- withCreds = true;
}
return (content
- ? this.http.post(url, content, { headers, withCredentials: withCreds })
- : this.http.post(url, null, { headers, withCredentials: withCreds }))
+ ? this.http.post(url, content, { headers } )
+ : this.http.post(url, null, { headers }))
.pipe(
map(result => result),
timeout(this.timeout),
diff --git a/rubberduckvba.client/src/environments/environment.prod.ts b/rubberduckvba.client/src/environments/environment.prod.ts
index d3de473..e95e3c7 100644
--- a/rubberduckvba.client/src/environments/environment.prod.ts
+++ b/rubberduckvba.client/src/environments/environment.prod.ts
@@ -1,4 +1,4 @@
export const environment = {
production: true,
- apiBaseUrl: 'https://api.rubberduckvba.com/'
+ apiBaseUrl: 'https://localhost:44314/'
};
diff --git a/rubberduckvba.client/src/environments/environment.ts b/rubberduckvba.client/src/environments/environment.ts
index fbede92..0fd806b 100644
--- a/rubberduckvba.client/src/environments/environment.ts
+++ b/rubberduckvba.client/src/environments/environment.ts
@@ -4,7 +4,7 @@
export const environment = {
production: false,
- apiBaseUrl: 'https://api.rubberduckvba.com/'
+ apiBaseUrl: 'https://localhost:44314/'
};
/*