タスク管理ツールをReact + ASP.Coreで作る 011詳細画面(タスクのIDに応じて詳細情報を画面表示)


[前回](https://qiita.com/mosuma/items/e05bb7ac8e8ee80fda42)の続きです

### ガイド
全体Index：[タスク管理ツールをReact + ASP.Coreで作る - Index](https://qiita.com/mosuma/items/88e40dc44e7bff1a54d8)

## 流れ
- テーブル定義の更新
- DBを更新
- 個別データを取得する様にcontrollerを変更


## 構築

### テーブル定義の更新

これまで、リストに表示できる最低限の情報のみを表示できるようなテーブル定義になっていました。
これから、詳細画面に情報を表示していくにあたって、いくつか情報を増やそうと思います。

新しいデータモデルの定義は以下です

タスクの詳細な内容を定義する"description"と、完了した実績日を入れる"end_date_actual"を増やしました。

```diff_c_sharp:t_task.cs

using System;

+ #nullable enable

namespace server_app.Models.EDM
{
    public partial class t_task
    {
        public Guid id_task { get; set; }
        public string title { get; set; }
        public bool is_finish { get; set; }
+       public string? description { get; set; }
        public DateTime? end_date_scheduled { get; set; }
+       public DateTime? end_date_actual { get; set; }
    }
}

```


TaskOperationMain関数に、選択しているタスクのID番号を格納する「selectedId_task」というstateを導入します。
「selectedId_task」とselectedId_taskの値をセットする「setSelectedId_task」関数を「TaskList」コンポーネントに渡し、Listの操作によって「selectedId_task」の変更を行えるようにします。



### DBを更新する
データモデルを更新したので、再度マイグレーションを実施します。


```
>dotnet ef migrations add update
>dotnet ef database update
```

ちなみにTerminalでの表示は↓のような感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/0a5854d0-11bd-938f-a635-659649f5c518.png)

SQLiteで見てみるとテーブルが増えているのが分かります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/49105b33-399f-319e-96f7-b75dfbdf5b97.png)



```diff_c_sharp:TaskController.cs

        [HttpGet]
        public async Task<ActionResult<List<t_task>>> Get()
        {
            return await _context.t_tasks.ToListAsync();
        }
+        [HttpGet("{id}")]
+        public async Task<ActionResult<t_task>> Details(Guid id)
+        {
+            return await _context.t_tasks.FindAsync(id);
+        }
```

<details><summary>参考：TaskController.cs(開くと表示)</summary><div>




```diff_c_sharp:TaskController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using server_app.Models.EDM;

namespace server_app.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class TaskController : ControllerBase
    {
        private readonly DataContext _context;
        public TaskController(DataContext context)
        {
            _context = context;
        }
        [HttpGet]
        public async Task<ActionResult<List<t_task>>> Get()
        {
            return await _context.t_tasks.ToListAsync();
        }
        [HttpGet("{id}")]
        public async Task<ActionResult<t_task>> Details(Guid id)
        {
            return await _context.t_tasks.FindAsync(id);
        }
    }
}

```

</div></details>



この状態でAPIを実行すると個別のデータが表示されるはず・・・なのですが、うまく表示されません。
調べていった結果、GUIDは大文字である必要があるとのことで、最初に入れたGUIDは規格に沿っていない内容だった模様です。
以下の様に修正しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/b27c011c-9a4d-411b-9e26-83770a1ebb3a.png)

DBの登録データを修正した結果、APIは機能する様になりました。
(urlに打つときは小文字でもサーバーサイドで処理してくれる模様です。
DB側では小文字のデータを大文字に直すというような補正はしないということのようです)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664470/2d7ccfce-4385-6cfc-3421-a1d474c6e926.png)


### クライアントサイドを修正

TaskEditを以下の様に修正します。

```diff_tsx:TaskEdit.tsx

import { useEffect, useState } from "react";

interface Task {
    id_task: string;
    title: string;
    is_finish: boolean;
    description: string;
    end_date_scheduled: Date;
    end_date_actual: Date;
  }


interface Props {
    id_task: string
}


export const TaskEdit = ({id_task}: Props) => {    
    
    const [task, setTask] = useState<Task>();

    useEffect(() => {
        id_task !== "" && loadTaskDetails();
    }, [id_task]);
  
    const loadTaskDetails = async () => {
        const response = await fetch(`https://localhost:5001/task/${id_task}`);
        const data = await response.json();
        setTask(data);
    };

    return (
        <div>
            <h3>Task Detail : {task && task.title}</h3>
            { task &&
            <div>
                <input type="checkbox" defaultChecked={task.is_finish} disabled />
                <label>Finished</label>

                <br />

                <label>Description</label>
                <p>{task.description}</p>

                <label>Due date</label>
                <p>{task.end_date_scheduled && (new Date(task.end_date_scheduled).toDateString())}</p>

                <label>Completion Date</label>
                <p>{task.end_date_actual && (new Date(task.end_date_actual).toDateString())}</p>

            </div>
            }
        </div>
    )
}

```


## 実行してみる
上記の変更を盛り込んで実行してみると、以下の様な結果になります。
クリックすると切り替わっているのですが、情報が乏しいうえに何も入力されていない欄もあるので、イマイチまだ変化が分からないですね。
次回で、編集機能などを作りこんでいこうと思います。

https://youtu.be/D9zjUFNOkCs

今回は以上です。
続きは[次回](https://qiita.com/mosuma/items/07fa83299f70a548fce6)です