From ba4d2861f5d95fd827c0e0c6de5731314a0074ee Mon Sep 17 00:00:00 2001
From: Kristof De Langhe <kristof.delanghe@atmire.com>
Date: Mon, 8 Oct 2018 17:50:52 +0200
Subject: [PATCH] 55946: Start of Edit Item Page

---
 resources/i18n/en.json                        | 53 ++++++++++++++++++
 .../edit-item-page.component.html             | 52 ++++++++++++++++++
 .../edit-item-page.component.scss             |  0
 .../edit-item-page.component.spec.ts          |  0
 .../edit-item-page.component.ts               | 55 +++++++++++++++++++
 .../+item-page/item-page-routing.module.ts    | 10 ++++
 src/app/+item-page/item-page.module.ts        |  4 +-
 7 files changed, 173 insertions(+), 1 deletion(-)
 create mode 100644 src/app/+item-page/edit-item-page/edit-item-page.component.html
 create mode 100644 src/app/+item-page/edit-item-page/edit-item-page.component.scss
 create mode 100644 src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts
 create mode 100644 src/app/+item-page/edit-item-page/edit-item-page.component.ts

diff --git a/resources/i18n/en.json b/resources/i18n/en.json
index 86ff55da66..7c45b612f7 100644
--- a/resources/i18n/en.json
+++ b/resources/i18n/en.json
@@ -72,6 +72,59 @@
         "title": "Title"
       },
       "confirm": "Confirm selected"
+    },
+    "edit": {
+      "head": "Edit Item",
+      "tabs": {
+        "status": {
+          "head": "Item Status",
+          "description": "Welcome to the item management page. From here you can withdraw, reinstate, move or delete the item. You may also update or add new metadata / bitstreams on the other tabs.",
+          "labels": {
+            "id": "Item Internal ID",
+            "handle": "Handle",
+            "lastModified": "Last Modified",
+            "itemPage": "Item Page"
+          },
+          "buttons": {
+            "authorizations": {
+              "label": "Edit item's authorization policies",
+              "button": "Authorizations..."
+            },
+            "withdraw": {
+              "label": "Withdraw item from the repository",
+              "button": "Withdraw..."
+            },
+            "move": {
+              "label": "Move item to another collection",
+              "button": "Move..."
+            },
+            "private": {
+              "label": "Make item private",
+              "button": "Make it private..."
+            },
+            "delete": {
+              "label": "Completely expunge item",
+              "button": "Permanently delete"
+            },
+            "mapped-collections": {
+              "label": "Manage mapped collections",
+              "button": "Mapped collections"
+            }
+          }
+        },
+        "bitstreams": {
+          "head": "Item Bitstreams"
+        },
+        "metadata": {
+          "head": "Item Metadata"
+        },
+        "view": {
+          "head": "View Item"
+        },
+        "curate": {
+          "head": "Curate"
+        }
+      }
     }
   },
   "nav": {
diff --git a/src/app/+item-page/edit-item-page/edit-item-page.component.html b/src/app/+item-page/edit-item-page/edit-item-page.component.html
new file mode 100644
index 0000000000..ca15e83ab9
--- /dev/null
+++ b/src/app/+item-page/edit-item-page/edit-item-page.component.html
@@ -0,0 +1,52 @@
+<div class="container">
+  <div class="row">
+    <div class="col-12">
+      <h2 class="border-bottom">{{'item.edit.head' | translate}}</h2>
+      <div class="pt-2">
+        <ngb-tabset>
+          <ngb-tab title="{{'item.edit.tabs.status.head' | translate}}">
+            <ng-template ngbTabContent>
+              <p class="mt-2">{{'item.edit.tabs.status.description' | translate}}</p>
+              <div class="row">
+                <div *ngFor="let statusKey of objectKeys(statusData$ | async)" class="w-100">
+                  <div class="col-3 float-left">
+                    {{'item.edit.tabs.status.labels.' + statusKey | translate}}:
+                  </div>
+                  <div class="col-9 float-left">
+                    {{(statusData$ | async)[statusKey]}}
+                  </div>
+                </div>
+                <div class="col-3 float-left">
+                  {{'item.edit.tabs.status.labels.itemPage' | translate}}:
+                </div>
+                <div class="col-9 float-left">
+                  <a href="{{getItemPage()}}">{{getItemPage()}}</a>
+                </div>
+              </div>
+            </ng-template>
+          </ngb-tab>
+          <ngb-tab title="{{'item.edit.tabs.bitstreams.head' | translate}}">
+            <ng-template ngbTabContent>
+
+            </ng-template>
+          </ngb-tab>
+          <ngb-tab title="{{'item.edit.tabs.metadata.head' | translate}}">
+            <ng-template ngbTabContent>
+
+            </ng-template>
+          </ngb-tab>
+          <ngb-tab title="{{'item.edit.tabs.view.head' | translate}}">
+            <ng-template ngbTabContent>
+
+            </ng-template>
+          </ngb-tab>
+          <ngb-tab title="{{'item.edit.tabs.curate.head' | translate}}">
+            <ng-template ngbTabContent>
+
+            </ng-template>
+          </ngb-tab>
+        </ngb-tabset>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/src/app/+item-page/edit-item-page/edit-item-page.component.scss b/src/app/+item-page/edit-item-page/edit-item-page.component.scss
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts b/src/app/+item-page/edit-item-page/edit-item-page.component.spec.ts
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/src/app/+item-page/edit-item-page/edit-item-page.component.ts b/src/app/+item-page/edit-item-page/edit-item-page.component.ts
new file mode 100644
index 0000000000..eb017669fc
--- /dev/null
+++ b/src/app/+item-page/edit-item-page/edit-item-page.component.ts
@@ -0,0 +1,55 @@
+import { fadeIn, fadeInOut } from '../../shared/animations/fade';
+import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
+import { ItemDataService } from '../../core/data/item-data.service';
+import { ActivatedRoute, Router } from '@angular/router';
+import { Observable } from 'rxjs/Observable';
+import { RemoteData } from '../../core/data/remote-data';
+import { Item } from '../../core/shared/item.model';
+import { getSucceededRemoteData } from '../../core/shared/operators';
+import { map } from 'rxjs/operators';
+
+@Component({
+  selector: 'ds-edit-item-page',
+  styleUrls: ['./edit-item-page.component.scss'],
+  templateUrl: './edit-item-page.component.html',
+  changeDetection: ChangeDetectionStrategy.OnPush,
+  animations: [
+    fadeIn,
+    fadeInOut
+  ]
+})
+/**
+ * Page component for editing an item
+ */
+export class EditItemPageComponent implements OnInit {
+
+  objectKeys = Object.keys;
+
+  /**
+   * The item to edit
+   */
+  itemRD$: Observable<RemoteData<Item>>;
+  statusData$: Observable<any>;
+
+  constructor(private route: ActivatedRoute,
+              private router: Router) {
+  }
+
+  ngOnInit(): void {
+    this.itemRD$ = this.route.data.map((data) => data.item);
+    this.statusData$ = this.itemRD$.pipe(
+      getSucceededRemoteData(),
+      map((itemRD: RemoteData<Item>) => itemRD.payload),
+      map((item: Item) => Object.assign({
+        id: item.id,
+        handle: item.handle,
+        lastModified: item.lastModified
+      }))
+    )
+  }
+
+  getItemPage(): string {
+    return this.router.url.substr(0, this.router.url.lastIndexOf('/'));
+  }
+
+}
diff --git a/src/app/+item-page/item-page-routing.module.ts b/src/app/+item-page/item-page-routing.module.ts
index 96158b867e..0105c947e9 100644
--- a/src/app/+item-page/item-page-routing.module.ts
+++ b/src/app/+item-page/item-page-routing.module.ts
@@ -4,6 +4,8 @@ import { RouterModule } from '@angular/router';
 import { ItemPageComponent } from './simple/item-page.component';
 import { FullItemPageComponent } from './full/full-item-page.component';
 import { ItemPageResolver } from './item-page.resolver';
+import { AuthenticatedGuard } from '../core/auth/authenticated.guard';
+import { EditItemPageComponent } from './edit-item-page/edit-item-page.component';
 
 @NgModule({
   imports: [
@@ -22,6 +24,14 @@ import { ItemPageResolver } from './item-page.resolver';
         resolve: {
           item: ItemPageResolver
         }
+      },
+      {
+        path: ':id/edit',
+        component: EditItemPageComponent,
+        resolve: {
+          item: ItemPageResolver
+        },
+        canActivate: [AuthenticatedGuard]
       }
     ])
   ],
diff --git a/src/app/+item-page/item-page.module.ts b/src/app/+item-page/item-page.module.ts
index bd801923e3..45251bb1d8 100644
--- a/src/app/+item-page/item-page.module.ts
+++ b/src/app/+item-page/item-page.module.ts
@@ -18,6 +18,7 @@ import { FileSectionComponent } from './simple/field-components/file-section/fil
 import { CollectionsComponent } from './field-components/collections/collections.component';
 import { FullItemPageComponent } from './full/full-item-page.component';
 import { FullFileSectionComponent } from './full/field-components/file-section/full-file-section.component';
+import { EditItemPageComponent } from './edit-item-page/edit-item-page.component';
 
 @NgModule({
   imports: [
@@ -39,7 +40,8 @@ import { FullFileSectionComponent } from './full/field-components/file-section/f
     ItemPageSpecificFieldComponent,
     FileSectionComponent,
     CollectionsComponent,
-    FullFileSectionComponent
+    FullFileSectionComponent,
+    EditItemPageComponent
   ]
 })
 export class ItemPageModule {
-- 
GitLab