diff --git a/src/app/components/nodes/file-box/file-box-page.component.ts b/src/app/components/nodes/file-box/file-box-page.component.ts
index d7eb88b..4edc8e4 100644
--- a/src/app/components/nodes/file-box/file-box-page.component.ts
+++ b/src/app/components/nodes/file-box/file-box-page.component.ts
@@ -5,7 +5,7 @@ import {EditorService} from '../../../service/editor.service';
selector: 'noded-file-box-page',
template: `
-
+
`,
styles: [
@@ -24,6 +24,7 @@ import {EditorService} from '../../../service/editor.service';
export class FileBoxPageComponent implements OnInit {
@Input() nodeId: string;
@Input() pageId: string;
+ @Input() boxId?: string;
public ready = false;
diff --git a/src/app/components/nodes/file-box/file-box.component.ts b/src/app/components/nodes/file-box/file-box.component.ts
index 8234da7..4bfde39 100644
--- a/src/app/components/nodes/file-box/file-box.component.ts
+++ b/src/app/components/nodes/file-box/file-box.component.ts
@@ -40,6 +40,7 @@ export class FileBoxComponent extends EditorNodeContract implements OnInit {
@Input() nodeId: string;
@Input() editorUUID: string;
@Input() fullPage = false;
+ @Input() boxId?: string;
@ViewChild('fileInput') fileInput: ElementRef;
categoryIcons = {
@@ -126,6 +127,17 @@ export class FileBoxComponent extends EditorNodeContract implements OnInit {
this.fileBoxName = this.record.name;
+ if ( this.boxId ) {
+ const targetBox = await this.api.getFileBox(this.page.UUID, this.node.UUID, this.boxId);
+ if ( targetBox ) {
+ const history = await this.api.getFileBoxHistory(this.page.UUID, this.node.UUID, this.boxId);
+ if ( targetBox && Array.isArray(history) ) {
+ this.history = history;
+ this.record = targetBox;
+ }
+ }
+ }
+
await this.loadBox();
if ( this.dirty ) {
diff --git a/src/app/components/search/Search.component.scss b/src/app/components/search/Search.component.scss
index 4b029b7..40c4eac 100644
--- a/src/app/components/search/Search.component.scss
+++ b/src/app/components/search/Search.component.scss
@@ -37,7 +37,7 @@
}
}
- &.files {
+ &.files, &.file_box {
.search-icon {
color: var(--noded-background-files);
}
@@ -48,6 +48,60 @@
color: var(--noded-background-markdown);
}
}
+
+ &.file_box-document {
+ .search-icon {
+ color: #4269a5;
+ }
+ }
+
+ &.file_box-spreadsheet {
+ .search-icon {
+ color: #39825a;
+ }
+ }
+
+ &.file_box-presentation {
+ .search-icon {
+ color: #dc6141;
+ }
+ }
+
+ &.file_box-image {
+ .search-icon {
+ color: #cf9f20;
+ }
+ }
+
+ &.file_box-pdf {
+ .search-icon {
+ color: #d32f2f;
+ }
+ }
+
+ &.file_box-video {
+ .search-icon {
+ color: #8049c0;
+ }
+ }
+
+ &.file_box-code {
+ .search-icon {
+ color: #ff4500;
+ }
+ }
+
+ &.file_box-text {
+ .search-icon {
+ color: #444444;
+ }
+ }
+
+ &.file_box-folder {
+ .search-icon {
+ color: #ac9379;
+ }
+ }
}
.search-assoc {
diff --git a/src/app/components/search/Search.component.ts b/src/app/components/search/Search.component.ts
index 1c67a0c..f41f4f3 100644
--- a/src/app/components/search/Search.component.ts
+++ b/src/app/components/search/Search.component.ts
@@ -4,13 +4,16 @@ import {ApiService} from '../../service/api.service';
import {BehaviorSubject} from 'rxjs';
import {Router} from '@angular/router';
import {NodeTypeIcons} from '../../structures/node-types';
-import {debounce} from "../../utility";
+import {debounce} from '../../utility';
+import {DatabasePageComponent} from '../editor/database/database-page.component';
+import {FileBoxPageComponent} from '../nodes/file-box/file-box-page.component';
export interface SearchResult {
title: string;
short_title: string;
- type: 'page' | 'node' | 'code';
+ type: string;
id: string;
+ boxId?: string;
associated?: {
title: string,
type: 'page',
@@ -38,13 +41,13 @@ export class SearchComponent implements OnInit {
}, 1000);
constructor(
- protected modal: ModalController,
+ protected ionModalController: ModalController,
protected api: ApiService,
protected router: Router,
) { }
async dismiss() {
- await this.modal.dismiss();
+ await this.ionModalController.dismiss();
}
ngOnInit() {
@@ -68,7 +71,7 @@ export class SearchComponent implements OnInit {
async openResult(result: SearchResult) {
const nodeTypes = [
- 'node', 'code', 'db', 'files', 'markdown',
+ 'node', 'code', 'files', 'markdown',
];
if ( result.type === 'page' ) {
@@ -77,6 +80,10 @@ export class SearchComponent implements OnInit {
} else if ( nodeTypes.includes(result.type) ) {
await this.router.navigate(['/editor', { id: result.associated.id, node_id: result.id }]);
await this.dismiss();
+ } else if ( result.type === 'db' ) {
+ await this.openDatabase(result.associated.id, result.id);
+ } else if ( result.type.startsWith('file_box') ) {
+ await this.openFileBox(result.associated.id, result.id, result.boxId);
}
}
@@ -91,4 +98,45 @@ export class SearchComponent implements OnInit {
}
}
}
+
+ async openDatabase(pageId: string, nodeId: string) {
+ const modal = await this.ionModalController.create({
+ component: DatabasePageComponent,
+ componentProps: {
+ nodeId,
+ pageId,
+ },
+ cssClass: 'modal-big',
+ });
+
+ const modalState = {
+ modal : true,
+ desc : 'Open Database'
+ };
+
+ history.pushState(modalState, null);
+
+ await modal.present();
+ }
+
+ async openFileBox(pageId: string, nodeId: string, boxId?: string) {
+ const modal = await this.ionModalController.create({
+ component: FileBoxPageComponent,
+ componentProps: {
+ nodeId,
+ pageId,
+ boxId,
+ },
+ cssClass: 'modal-big',
+ });
+
+ const modalState = {
+ modal : true,
+ desc : 'Open File Box'
+ };
+
+ history.pushState(modalState, null);
+
+ await modal.present();
+ }
}
diff --git a/src/app/service/api.service.ts b/src/app/service/api.service.ts
index 16ef267..b605c09 100644
--- a/src/app/service/api.service.ts
+++ b/src/app/service/api.service.ts
@@ -1257,6 +1257,21 @@ export class ApiService {
});
}
+ public getFileBoxHistory(PageId: string, NodeId: string, FileBoxId: string): Promise {
+ return new Promise(async (res, rej) => {
+ if ( this.isOffline ) {
+ return rej(new ResourceNotAvailableOfflineError());
+ }
+
+ this.get(`/file-box/${PageId}/${NodeId}/${FileBoxId}/history`).subscribe({
+ next: async result => {
+ res(result.data);
+ },
+ error: rej,
+ });
+ });
+ }
+
public getFileBoxFiles(PageId: string, NodeId: string, FileBoxId: string): Promise {
return new Promise(async (res, rej) => {
if ( this.isOffline ) {
diff --git a/src/app/structures/node-types.ts b/src/app/structures/node-types.ts
index 92504ec..f74b751 100644
--- a/src/app/structures/node-types.ts
+++ b/src/app/structures/node-types.ts
@@ -20,4 +20,15 @@ export const NodeTypeIcons = {
form_input_multiselect: 'fa fa-check-double noded-form',
form_input_textarea: 'fa fa-paragraph noded-form',
form_input_wysiwyg: 'fa fa-quote-right noded-form',
+
+ // Icons specific to uploaded file types
+ 'file_box-document': 'fa fa-file-word',
+ 'file_box-spreadsheet': 'fa fa-file-excel',
+ 'file_box-presentation': 'fa fa-file-powerpoint',
+ 'file_box-image': 'fa fa-file-image',
+ 'file_box-pdf': 'fa fa-file-pdf',
+ 'file_box-video': 'fa fa-file-video',
+ 'file_box-code': 'fa fa-file-script',
+ 'file_box-text': 'fa fa-file-alt',
+ 'file_box-other': 'fa fa-file',
};