diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index 70e847d..68466ff 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -17,7 +17,7 @@ const routes: Routes = [
},
{
path: 'editor',
- loadChildren: () => import('./pages/editor/editor.module').then( m => m.EditorPageModule)
+ loadChildren: () => import('./components/components.module').then( m => m.ComponentsModule)
}
];
diff --git a/src/app/components/components.module.ts b/src/app/components/components.module.ts
index ed5df46..cd9a930 100644
--- a/src/app/components/components.module.ts
+++ b/src/app/components/components.module.ts
@@ -31,6 +31,8 @@ import {MarkdownComponent as MarkdownEditorComponent} from './nodes/markdown/mar
import {DirectivesModule} from '../directives/directives.module';
import {MarkdownModule} from 'ngx-markdown';
import {VersionModalComponent} from './version-modal/version-modal.component';
+import {EditorPageRoutingModule} from '../pages/editor/editor-routing.module';
+import {EditorPage} from '../pages/editor/editor.page';
@NgModule({
declarations: [
@@ -58,6 +60,7 @@ import {VersionModalComponent} from './version-modal/version-modal.component';
NormComponent,
MarkdownEditorComponent,
VersionModalComponent,
+ EditorPage,
],
imports: [
CommonModule,
@@ -69,6 +72,7 @@ import {VersionModalComponent} from './version-modal/version-modal.component';
MonacoEditorModule,
DirectivesModule,
MarkdownModule,
+ EditorPageRoutingModule,
],
entryComponents: [
NodePickerComponent,
@@ -95,6 +99,7 @@ import {VersionModalComponent} from './version-modal/version-modal.component';
NormComponent,
MarkdownEditorComponent,
VersionModalComponent,
+ EditorPage,
],
exports: [
NodePickerComponent,
@@ -121,6 +126,7 @@ import {VersionModalComponent} from './version-modal/version-modal.component';
NormComponent,
MarkdownEditorComponent,
VersionModalComponent,
+ EditorPage,
]
})
export class ComponentsModule {}
diff --git a/src/app/components/version-modal/version-modal.component.html b/src/app/components/version-modal/version-modal.component.html
index f36646a..2e51f90 100644
--- a/src/app/components/version-modal/version-modal.component.html
+++ b/src/app/components/version-modal/version-modal.component.html
@@ -19,7 +19,7 @@
- Page preview will be here.
+
\ No newline at end of file
diff --git a/src/app/components/version-modal/version-modal.component.scss b/src/app/components/version-modal/version-modal.component.scss
index b87676d..4019b3a 100644
--- a/src/app/components/version-modal/version-modal.component.scss
+++ b/src/app/components/version-modal/version-modal.component.scss
@@ -23,7 +23,7 @@
.contents {
height: 100%;
- overflow-y: scroll;
+ overflow-y: hidden;
display: flex;
flex-direction: row;
@@ -35,6 +35,8 @@
.preview {
flex: 1;
+ height: 100%;
+ overflow-y: scroll;
}
.version-date {
diff --git a/src/app/components/version-modal/version-modal.component.ts b/src/app/components/version-modal/version-modal.component.ts
index 42a0232..87c8aa7 100644
--- a/src/app/components/version-modal/version-modal.component.ts
+++ b/src/app/components/version-modal/version-modal.component.ts
@@ -1,7 +1,8 @@
-import {Component, Input, OnInit} from '@angular/core';
+import {Component, Input, OnInit, ViewChild} from '@angular/core';
import {AlertController, ModalController} from '@ionic/angular';
import {EditorService} from '../../service/editor.service';
import {PageVersionRecord} from '../../structures/PageRecord';
+import {EditorPage} from '../../pages/editor/editor.page';
@Component({
selector: 'app-version-modal',
@@ -10,6 +11,8 @@ import {PageVersionRecord} from '../../structures/PageRecord';
})
export class VersionModalComponent implements OnInit {
@Input() pageId: string;
+ @ViewChild('editor') editor: EditorPage;
+
public pageVersions: PageVersionRecord[] = [];
public selectedVersion?: PageVersionRecord;
@@ -23,7 +26,10 @@ export class VersionModalComponent implements OnInit {
async ngOnInit() {
this.pageVersions = await this.editorService.loadPageVersions(this.pageId);
- await this.onVersionClick(this.pageVersions[0]);
+ this.selectedVersion = this.pageVersions[0];
+ setTimeout(() => {
+ this.onVersionClick(this.pageVersions[0]);
+ }, 100);
}
dismiss() {
@@ -32,5 +38,8 @@ export class VersionModalComponent implements OnInit {
async onVersionClick(version: PageVersionRecord) {
this.selectedVersion = version;
+ if ( this.editor ) {
+ this.editor.ionViewDidEnter();
+ }
}
}
diff --git a/src/app/pages/editor/editor.module.ts b/src/app/pages/editor/editor.module.ts
deleted file mode 100644
index eb4263e..0000000
--- a/src/app/pages/editor/editor.module.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { FormsModule } from '@angular/forms';
-
-import { IonicModule } from '@ionic/angular';
-
-import { EditorPageRoutingModule } from './editor-routing.module';
-
-import { EditorPage } from './editor.page';
-import {ComponentsModule} from '../../components/components.module';
-
-@NgModule({
- imports: [
- CommonModule,
- FormsModule,
- IonicModule,
- EditorPageRoutingModule,
- ComponentsModule
- ],
- declarations: [EditorPage]
-})
-export class EditorPageModule {}
diff --git a/src/app/pages/editor/editor.page.html b/src/app/pages/editor/editor.page.html
index 8cdc5e0..fb2ab08 100644
--- a/src/app/pages/editor/editor.page.html
+++ b/src/app/pages/editor/editor.page.html
@@ -7,6 +7,7 @@
@@ -43,7 +44,7 @@
>
-
@@ -63,7 +64,7 @@
-
+
Add Node
diff --git a/src/app/pages/editor/editor.page.ts b/src/app/pages/editor/editor.page.ts
index 56a9da1..f051458 100644
--- a/src/app/pages/editor/editor.page.ts
+++ b/src/app/pages/editor/editor.page.ts
@@ -17,6 +17,17 @@ import {VersionModalComponent} from '../../components/version-modal/version-moda
export class EditorPage implements OnInit {
public typeIcons = NodeTypeIcons;
@Input() pageId: string;
+ @Input() hosted = false;
+ @Input() version?: number;
+
+ @Input()
+ set readonly(val: boolean) {
+ this.editorService.forceReadonly = val;
+ }
+
+ get readonly() {
+ return this.editorService.forceReadonly;
+ }
constructor(
protected route: ActivatedRoute,
@@ -39,7 +50,7 @@ export class EditorPage implements OnInit {
ionViewDidEnter() {
if ( this.pageId ) {
this.editorService.startEditing(this.pageId);
- } else {
+ } else if ( !this.hosted ) {
this.router.navigate(['/home']);
}
}
diff --git a/src/app/service/action.types.ts b/src/app/service/action.types.ts
deleted file mode 100644
index b006565..0000000
--- a/src/app/service/action.types.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export interface RedirectAction {
- type: 'redirect';
- args: {
- destination: string
- blank?: boolean
- appUrl?: boolean
- };
-}
-
-export type Action = RedirectAction;
diff --git a/src/app/service/actions.service.ts b/src/app/service/actions.service.ts
deleted file mode 100644
index 622f672..0000000
--- a/src/app/service/actions.service.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import { Injectable } from '@angular/core';
-import { Action } from './action.types';
-import {SessionService} from './session.service';
-
-@Injectable({
- providedIn: 'root'
-})
-export class ActionsService {
- constructor(
- protected readonly session: SessionService,
- ) { }
-
- async perform(action: Action) {
- if ( action.type === 'redirect' ) {
- let destination = action.args.destination;
- if ( action.args.appUrl ) {
- destination = this.session.buildAppUrl(destination);
- }
-
- if ( action.args.blank ) {
- window.open(destination, '_blank');
- } else {
- window.location.href = destination;
- }
- }
- }
-}
diff --git a/src/app/service/editor.service.ts b/src/app/service/editor.service.ts
index 101a93d..cb8c9f8 100644
--- a/src/app/service/editor.service.ts
+++ b/src/app/service/editor.service.ts
@@ -31,6 +31,7 @@ export class EditorService {
protected ready$: BehaviorSubject = new BehaviorSubject(false);
protected subs: Subscription[] = [];
protected saving = false;
+ public forceReadonly = false;
protected saveTriggered = false;
public notAvailable = false;
public readonly instanceUUID: string;
@@ -139,7 +140,7 @@ export class EditorService {
}
async save() {
- if ( !(await this.needsSave()) || this.saving ) {
+ if ( !(await this.needsSave()) || this.saving || this.forceReadonly ) {
return;
}
@@ -170,6 +171,10 @@ export class EditorService {
throw new NoPageLoadedError();
}
+ if ( this.forceReadonly ) {
+ return;
+ }
+
const nodeIndex = this.currentNodes.findIndex(maybeNode => maybeNode.UUID === node.UUID);
if ( nodeIndex < 0 ) {
return;
@@ -417,6 +422,10 @@ export class EditorService {
}
async needsSave() {
+ if ( this.forceReadonly ) {
+ return false;
+ }
+
if ( this.dirtyOverride ) {
return true;
}
@@ -432,6 +441,10 @@ export class EditorService {
throw new NoPageLoadedError();
}
+ if ( this.forceReadonly ) {
+ return;
+ }
+
const node = this.currentNodes.find(maybeNode => maybeNode.UUID === nodeId);
if ( !node ) {
throw new Error('Invalid node ID.');
@@ -463,6 +476,10 @@ export class EditorService {
throw new NoPageLoadedError();
}
+ if ( this.forceReadonly ) {
+ return;
+ }
+
const baseHost = new HostRecord();
baseHost.type = type;
baseHost.PageId = this.currentPage.UUID;
@@ -495,11 +512,7 @@ export class EditorService {
}
canEdit() {
- if ( !this.currentPage ) {
- throw new NoPageLoadedError();
- }
-
- return !this.currentPage.isViewOnly();
+ return this.currentPage && !this.currentPage.isViewOnly() && !this.forceReadonly;
}
async registerNodeEditor(nodeId: string, editor: EditorNodeContract) {
diff --git a/src/app/service/page.service.ts b/src/app/service/page.service.ts
deleted file mode 100644
index a6580f0..0000000
--- a/src/app/service/page.service.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import {Host, Injectable} from '@angular/core';
-import {Observable} from 'rxjs';
-import PageRecord from '../structures/PageRecord';
-import {ApiService} from './api.service';
-import HostRecord from '../structures/HostRecord';
-
-@Injectable({
- providedIn: 'root'
-})
-export class PageService {
-
- constructor(
- protected api: ApiService,
- ) { }
-
- load(id: string): Observable {
- return new Observable(sub => {
- this.api.get(`/page/${id}`).subscribe(response => {
- if ( response.status === 200 ) {
- sub.next(new PageRecord(response.data));
- sub.complete();
- } else {
- throw new Error(response.message);
- }
- });
- });
- }
-
- save(page: PageRecord): Observable {
- return new Observable(sub => {
- this.api.post(`/page/${page.UUID}/save`, page.toSave()).subscribe(res => {
- sub.next(new PageRecord(res.data));
- sub.complete();
- });
- });
- }
-
- get_nodes(page: PageRecord): Observable> {
- return new Observable>(sub => {
- this.api.get(`/page/${page.UUID}/nodes`).subscribe(res => {
- const returns = [];
- res.data.forEach(rec => {
- const host = new HostRecord(rec.Value.Value);
- host.load(rec);
- returns.push(host);
- });
-
- sub.next(returns);
- sub.complete();
- });
- });
- }
-
- save_nodes(page: PageRecord, nodes: Array): Observable> {
- return new Observable>(sub => {
- nodes = nodes.map(x => {
- x.PageId = page.UUID;
- return x.toSave();
- });
-
- this.api.post(`/page/${page.UUID}/nodes/save`, nodes).subscribe(res => {
- const returns = [];
- res.data.forEach(rec => {
- const host = new HostRecord(rec.Value.Value);
- host.load(rec);
- returns.push(host);
- });
-
- sub.next(returns);
- sub.complete();
- });
- });
- }
-}