Ei kuvausta
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

danka-detail.html 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. <app-header></app-header>
  2. <div class="breadcrumb">
  3. ホーム &gt; 檀家(世帯) &gt; {{ danka?.householdName }}
  4. </div>
  5. <div class="danka-detail-page">
  6. <app-side-menu></app-side-menu>
  7. <main class="danka-detail-main">
  8. <section class="detail-panel">
  9. @if (danka) {
  10. <div class="page-title-row">
  11. <div>
  12. <h1>
  13. 檀家詳細 - {{ danka.householdName }}
  14. </h1>
  15. <nav class="tab-list">
  16. <button
  17. type="button"
  18. class="tab-button"
  19. [class.active]="selectedTab === 'basic'"
  20. (click)="selectedTab = 'basic'"
  21. >
  22. 基本情報
  23. </button>
  24. <button
  25. type="button"
  26. class="tab-button"
  27. [class.active]="selectedTab === 'family'"
  28. (click)="selectedTab = 'family'"
  29. >
  30. 家族
  31. </button>
  32. <button
  33. type="button"
  34. class="tab-button"
  35. [class.active]="selectedTab === 'kakocho'"
  36. (click)="selectedTab = 'kakocho'"
  37. >
  38. 過去帳
  39. </button>
  40. <button
  41. type="button"
  42. class="tab-button"
  43. [class.active]="selectedTab === 'familyTree'"
  44. (click)="selectedTab = 'familyTree'"
  45. >
  46. 家系図
  47. </button>
  48. </nav>
  49. </div>
  50. @if (selectedTab === 'basic') {
  51. <button
  52. type="button"
  53. class="edit-button"
  54. [routerLink]="['/danka-edit', danka.id]"
  55. >
  56. 編集
  57. </button>
  58. }
  59. @if (selectedTab === 'kakocho') {
  60. <button
  61. type="button"
  62. class="add-button"
  63. [routerLink]="['/kakocho-edit', danka.id]"
  64. >
  65. 故人を登録
  66. </button>
  67. }
  68. </div>
  69. @if (selectedTab === 'basic' || selectedTab === 'kakocho') {
  70. <section class="family-summary">
  71. @if (selectedTab === 'basic') {
  72. <div class="family-name-area">
  73. <p class="family-name">{{ danka.householdName }}</p>
  74. <p class="family-head">更新日: {{ formatUpdatedAt(danka.updatedAt) }}</p>
  75. </div>
  76. }
  77. @if (selectedTab === 'kakocho') {
  78. <div class="family-name-area">
  79. <p class="family-name">{{ danka.householdName }}の過去帳{{ kakocholist.length }} 名</p>
  80. </div>
  81. }
  82. </section>
  83. }
  84. @if (selectedTab === 'basic') {
  85. <div class="detail-content">
  86. <section class="basic-info-section">
  87. <div class="section-heading">
  88. <h2>基本情報</h2>
  89. </div>
  90. <div class="info-form">
  91. <div class="info-row">
  92. <div class="info-label">世帯名</div>
  93. <div class="info-value">{{ danka.householdName }}</div>
  94. </div>
  95. <div class="info-row">
  96. <div class="info-label">世帯主</div>
  97. <div class="info-value">{{ danka.householder }}</div>
  98. </div>
  99. <div class="info-row">
  100. <div class="info-label">郵便番号</div>
  101. <div class="info-value">{{ danka.postalCode }}</div>
  102. </div>
  103. <div class="info-row">
  104. <div class="info-label">住所</div>
  105. <div class="info-value">{{ danka.address }}</div>
  106. </div>
  107. <div class="info-row phone-row">
  108. <div class="info-label">電話番号</div>
  109. <div class="phone-table">
  110. <div class="phone-header">
  111. <div>番号</div>
  112. <div>備考</div>
  113. </div>
  114. @for (phone of danka.phones; track $index) {
  115. <div class="phone-item">
  116. <div>{{ phone.tel }}</div>
  117. <div>{{ phone.note }}</div>
  118. </div>
  119. }
  120. </div>
  121. </div>
  122. </div>
  123. </section>
  124. <aside class="status-panel">
  125. <h2>この世帯の状況</h2>
  126. <div class="status-card-list">
  127. <button
  128. type="button"
  129. class="status-card"
  130. (click)="selectedTab = 'family'">
  131. <p class="status-label">家族</p>
  132. <p class="status-count">{{ families.length }} 名</p>
  133. <p class="status-link">詳細へ</p>
  134. </button>
  135. <button
  136. type="button"
  137. class="status-card"
  138. (click)="selectedTab = 'kakocho'">
  139. <p class="status-label">過去帳</p>
  140. <p class="status-count">{{ kakocholist.length }} 名</p>
  141. <p class="status-link">詳細へ</p>
  142. </button>
  143. </div>
  144. <section class="next-memorial">
  145. <h3>次の法要</h3>
  146. <div class="memorial-card">
  147. @if (nextMemorial) {
  148. <p class="memorial-title">
  149. {{ nextMemorial.name }} - {{ nextMemorial.memorialType }}
  150. </p>
  151. <p class="memorial-text">
  152. 対象年 {{ nextMemorial.targetYear }} / 没年月日 {{ nextMemorial.deathDate }}
  153. </p>
  154. } @else {
  155. <p class="memorial-title">対象の法要はありません</p>
  156. <p class="memorial-text">
  157. 今年の年忌法要対象者がいる場合に表示されます。
  158. </p>
  159. }
  160. </div>
  161. </section>
  162. </aside>
  163. </div>
  164. }
  165. @if (selectedTab === 'family') {
  166. <section class="family-tab-content">
  167. <div class="section-heading">
  168. <h2>家族情報</h2>
  169. </div>
  170. <section class="family-list-summary">
  171. <div>
  172. <p class="family-list-title">
  173. {{ danka.householdName }}の家族 {{ families.length }}名
  174. </p>
  175. </div>
  176. <p class="family-list-head">
  177. ※ 世帯主:{{ danka.householder }}
  178. </p>
  179. </section>
  180. <section class="family-table-section">
  181. @if (families.length > 0) {
  182. <div class="family-table">
  183. <div class="family-table-header">
  184. <div>氏名</div>
  185. <div>ふりがな</div>
  186. <div>生年月日</div>
  187. <div>年齢</div>
  188. <div>関係</div>
  189. <div>備考</div>
  190. <div>操作</div>
  191. </div>
  192. @for (family of families; track family.id) {
  193. <div class="family-table-row">
  194. <div class="family-person-name">
  195. {{ family.name }}
  196. </div>
  197. <div>
  198. {{ family.furigana }}
  199. </div>
  200. <div>
  201. {{ family.birthDate || '未登録' }}
  202. </div>
  203. <div>
  204. {{ getAge(family.birthDate) }}
  205. </div>
  206. <div>
  207. {{ family.relationship || '未登録' }}
  208. </div>
  209. <div>
  210. {{ family.note || '' }}
  211. </div>
  212. <div class="family-table-action">
  213. <a
  214. class="family-edit-link"
  215. [routerLink]="['/danka', danka.id, 'family', family.id, 'edit']"
  216. >
  217. 編集
  218. </a>
  219. </div>
  220. </div>
  221. }
  222. </div>
  223. } @else {
  224. <div class="empty-family-message">
  225. 登録されている家族情報はありません。
  226. </div>
  227. }
  228. </section>
  229. </section>
  230. }
  231. @if (selectedTab === 'kakocho') {
  232. <section class="coming-soon-section">
  233. <div class="section-heading">
  234. <h2>過去帳</h2>
  235. </div>
  236. <p class="empty-family-message">
  237. @if (kakocholist.length > 0) {
  238. <div class="family-table">
  239. <div class="family-table-header">
  240. <div>戒名</div>
  241. <div>俗名</div>
  242. <div>没年月日</div>
  243. <div>関係</div>
  244. <div>回忌</div>
  245. <div>備考</div>
  246. </div>
  247. @for (kakocho of kakocholist; track kakocho.id) {
  248. <div class="family-table-row">
  249. <div class="family-person-name">
  250. {{ kakocho.kaimyo }}
  251. </div>
  252. <div>
  253. {{ kakocho.name }}
  254. </div>
  255. <div>
  256. {{ kakocho.deathDate }}
  257. </div>
  258. <div>
  259. {{ kakocho.relationship }}
  260. </div>
  261. <div>
  262. {{ getKaiki(kakocho.deathDate) }}回忌
  263. </div>
  264. <div>
  265. {{ kakocho.note || '' }}
  266. </div>
  267. </div>
  268. }
  269. </div>
  270. } @else {
  271. <div class="empty-family-message">
  272. 登録されている家族情報はありません。
  273. </div>
  274. }
  275. </p>
  276. </section>
  277. }
  278. @if (selectedTab === 'familyTree') {
  279. <section class="family-tree-tab-content">
  280. <div class="section-heading">
  281. <h2>家系図</h2>
  282. <p>
  283. 家族情報に登録された親子・配偶者の関係をもとに表示します。
  284. </p>
  285. </div>
  286. @if (families.length > 0) {
  287. <div class="family-tree-layout">
  288. <section class="family-tree-area">
  289. <div class="family-tree-toolbar">
  290. <div>
  291. <p class="family-tree-title">
  292. {{ danka.householdName }}の家系図
  293. </p>
  294. <p class="family-tree-caption">
  295. 人物カードを選択すると、右側に関係情報が表示されます。
  296. </p>
  297. </div>
  298. <div class="family-tree-action-list">
  299. <button type="button" class="tree-action-button"
  300. [routerLink]="['/danka', danka.id, 'family-new']"
  301. [queryParams]="{relationMode: 'child', baseFamilyId: selectedFamily?.id}">
  302. 親子を追加
  303. </button>
  304. <button type="button" class="tree-action-button"
  305. [routerLink]="['/danka', danka.id, 'family-new']"
  306. [queryParams]="{relationMode: 'spouse', baseFamilyId: selectedFamily?.id}">
  307. 配偶者を追加
  308. </button>
  309. </div>
  310. </div>
  311. @if (selectedFamily) {
  312. <div class="family-tree-diagram">
  313. <div class="tree-generation parent-generation">
  314. @if (getFather(selectedFamily)) {
  315. <button
  316. type="button"
  317. class="family-tree-card small"
  318. (click)="selectFamily(getFather(selectedFamily)!)">
  319. <span class="tree-card-name">{{ getFather(selectedFamily)?.name }}</span>
  320. <span class="tree-card-relationship">父</span>
  321. </button>
  322. }
  323. @if (getMother(selectedFamily)) {
  324. <button type="button" class="family-tree-card small"
  325. (click)="selectFamily(getMother(selectedFamily)!)">
  326. <span class="tree-card-name">{{ getMother(selectedFamily)?.name }}</span>
  327. <span class="tree-card-relationship">母</span>
  328. </button>
  329. }
  330. </div>
  331. <div class="tree-generation main-generation">
  332. <button type="button"
  333. class="family-tree-card active main-person">
  334. <span class="tree-card-name">
  335. {{ selectedFamily.name }}
  336. </span>
  337. <span class="tree-card-relationship">
  338. {{ selectedFamily.relationship || '関係未登録' }}
  339. </span>
  340. <span class="tree-card-birth">
  341. {{ selectedFamily.birthDate || '生年月日未登録' }}
  342. </span>
  343. </button>
  344. @if (getSpouse(selectedFamily)) {
  345. <button
  346. type="button"
  347. class="family-tree-card spouse-person"
  348. (click)="selectFamily(getSpouse(selectedFamily)!)">
  349. <span class="tree-card-name">
  350. {{ getSpouse(selectedFamily)?.name }}
  351. </span>
  352. <span class="tree-card-relationship">配偶者</span>
  353. <span class="tree-card-birth">
  354. {{ getSpouse(selectedFamily)?.birthDate || '生年月日未登録' }}
  355. </span>
  356. </button>
  357. }
  358. </div>
  359. <div class="tree-generation child-generation">
  360. @if (getChildren(selectedFamily).length > 0) {
  361. @for (child of getChildren(selectedFamily); track child.id) {
  362. <button
  363. type="button"
  364. class="family-tree-card small"
  365. (click)="selectFamily(child)">
  366. <span class="tree-card-name">
  367. {{ child.name }}
  368. </span>
  369. <span class="tree-card-relationship">
  370. {{ child.relationship || '子' }}
  371. </span>
  372. </button>
  373. }
  374. } @else {
  375. <p class="tree-empty-text">
  376. 子どもの登録はありません。
  377. </p>
  378. }
  379. </div>
  380. </div>
  381. <div class="family-tree-member-list">
  382. <p class="member-list-title">人物一覧</p>
  383. <div class="member-chip-list">
  384. @for (family of families; track family.id) {
  385. <button
  386. type="button"
  387. class="member-chip"
  388. [class.active]="selectedFamily.id === family.id"
  389. (click)="selectFamily(family)"
  390. >
  391. {{ family.name }}
  392. </button>
  393. }
  394. </div>
  395. </div>
  396. } @else {
  397. <p class="empty-family-message">
  398. 人物カードを選択してください。
  399. </p>
  400. }
  401. </section>
  402. <aside class="family-tree-side-panel">
  403. <h3>選択中の人物情報</h3>
  404. @if (selectedFamily) {
  405. <div class="selected-person-card">
  406. <p class="selected-person-name">
  407. {{ selectedFamily.name }}
  408. </p>
  409. <p class="selected-person-sub">
  410. {{ selectedFamily.furigana || 'ふりがな未登録' }}
  411. </p>
  412. </div>
  413. <div class="selected-info-list">
  414. <div class="selected-info-row">
  415. <span>関係</span>
  416. <strong>{{ selectedFamily.relationship || '未登録' }}</strong>
  417. </div>
  418. <div class="selected-info-row">
  419. <span>生年月日</span>
  420. <strong>{{ selectedFamily.birthDate || '未登録' }}</strong>
  421. </div>
  422. <div class="selected-info-row">
  423. <span>父</span>
  424. <strong>{{ getFather(selectedFamily)?.name || '未登録' }}</strong>
  425. </div>
  426. <div class="selected-info-row">
  427. <span>母</span>
  428. <strong>{{ getMother(selectedFamily)?.name || '未登録' }}</strong>
  429. </div>
  430. <div class="selected-info-row">
  431. <span>配偶者</span>
  432. <strong>{{ getSpouse(selectedFamily)?.name || '未登録' }}</strong>
  433. </div>
  434. <div class="selected-info-row children-row">
  435. <span>子</span>
  436. <strong>
  437. @if (getChildren(selectedFamily).length > 0) {
  438. @for (child of getChildren(selectedFamily); track child.id) {
  439. <span class="child-name">
  440. {{ child.name }}
  441. </span>
  442. }
  443. } @else {
  444. 未登録
  445. }
  446. </strong>
  447. </div>
  448. </div>
  449. <section class="marriage-summary-panel">
  450. <h4>配偶関係</h4>
  451. <div class="marriage-summary-block">
  452. <p class="marriage-summary-label">現在の配偶者</p>
  453. @if (getCurrentMarriage(selectedFamily); as currentMarriage) {
  454. @if (getMarriagePartner(currentMarriage, selectedFamily); as currentPartner) {
  455. <button
  456. type="button"
  457. class="marriage-person-button"
  458. (click)="selectFamily(currentPartner)"
  459. >
  460. {{ currentPartner.name }}
  461. </button>
  462. } @else {
  463. <p class="marriage-empty-text">未登録</p>
  464. }
  465. } @else {
  466. <p class="marriage-empty-text">未登録</p>
  467. }
  468. </div>
  469. <div class="marriage-summary-block">
  470. <p class="marriage-summary-label">過去の配偶者</p>
  471. @if (getPastMarriages(selectedFamily).length > 0) {
  472. <div class="marriage-history-list">
  473. @for (relation of getPastMarriages(selectedFamily); track relation.id) {
  474. @if (getMarriagePartner(relation, selectedFamily); as pastPartner) {
  475. <button
  476. type="button"
  477. class="marriage-person-button secondary"
  478. (click)="selectFamily(pastPartner)"
  479. >
  480. <span>{{ pastPartner.name }}</span>
  481. <small>{{ getMarriageStatusLabel(relation.status) }}</small>
  482. </button>
  483. }
  484. }
  485. </div>
  486. } @else {
  487. <p class="marriage-empty-text">未登録</p>
  488. }
  489. </div>
  490. </section>
  491. <div class="selected-person-actions">
  492. <a
  493. class="selected-person-button"
  494. [routerLink]="['/danka', danka.id, 'family', selectedFamily.id, 'edit']"
  495. >
  496. 個人情報を編集
  497. </a>
  498. <button
  499. type="button"
  500. class="selected-person-button secondary"
  501. (click)="selectedTab = 'kakocho'"
  502. >
  503. 過去帳を確認
  504. </button>
  505. </div>
  506. } @else {
  507. <p class="empty-family-message">
  508. 人物カードを選択してください。
  509. </p>
  510. }
  511. </aside>
  512. </div>
  513. } @else {
  514. <div class="empty-family-message">
  515. 登録されている家族情報はありません。
  516. </div>
  517. }
  518. </section>
  519. }
  520. } @else {
  521. <p class="empty-family-message">
  522. 檀家情報が見つかりませんでした。
  523. </p>
  524. }
  525. </section>
  526. </main>
  527. </div>