Bez popisu
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-list.ts 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import { Component, OnInit } from '@angular/core';
  2. import { RouterLink } from '@angular/router';
  3. import { DankaService } from '../../services/dankaService';
  4. import { FamilyService } from '../../services/family-service';
  5. import { AppHeader } from '../../share/header/app-header';
  6. import { AppSideMenu } from '../../share/side-menu/app-side-menu';
  7. import { Danka } from '../../models/danka';
  8. import { FormsModule } from '@angular/forms';
  9. type KanaRowValue =
  10. | 'all'
  11. | 'a'
  12. | 'ka'
  13. | 'sa'
  14. | 'ta'
  15. | 'na'
  16. | 'ha'
  17. | 'ma'
  18. | 'ya'
  19. | 'ra'
  20. | 'wa';
  21. @Component({
  22. selector: 'app-danka-list',
  23. imports: [AppHeader, AppSideMenu, RouterLink, FormsModule],
  24. templateUrl: './danka-list.html',
  25. styleUrl: './danka-list.scss',
  26. })
  27. export class DankaList implements OnInit {
  28. dankaList: Danka[] = [];
  29. filterDankaList: Danka[] = [];
  30. searchKeyword: string = '';
  31. dankaDisplay: number = 0;
  32. selectedFilter = 'all';
  33. selectedKanaRow: KanaRowValue = 'all';
  34. kanaRows: { label: string; value: KanaRowValue }[] = [
  35. { label: '全件', value: 'all' },
  36. { label: 'あ行', value: 'a' },
  37. { label: 'か行', value: 'ka' },
  38. { label: 'さ行', value: 'sa' },
  39. { label: 'た行', value: 'ta' },
  40. { label: 'な行', value: 'na' },
  41. { label: 'は行', value: 'ha' },
  42. { label: 'ま行', value: 'ma' },
  43. { label: 'や行', value: 'ya' },
  44. { label: 'ら行', value: 'ra' },
  45. { label: 'わ行', value: 'wa' },
  46. ];
  47. private readonly kanaRowMap: Record<Exclude<KanaRowValue, 'all'>, string[]> = {
  48. a: ['あ','い','う','え','お','ア','イ','ウ','エ','オ'],
  49. ka: ['か','き','く','け','こ','が','ぎ','ぐ','げ','ご','カ','キ','ク','ケ','コ','ガ','ギ','グ','ゲ','ゴ'],
  50. sa: ['さ','し','す','せ','そ','ざ','じ','ず','ぜ','ぞ','サ','シ','ス','セ','ソ','ザ','ジ','ズ','ゼ','ゾ'],
  51. ta: ['た','ち','つ','て','と','だ','ぢ','づ','で','ど','タ','チ','ツ','テ','ト','ダ','ヂ','ヅ','デ','ド'],
  52. na: ['な','に','ぬ','ね','の','ナ','ニ','ヌ','ネ','ノ'],
  53. ha: ['は','ひ','ふ','へ','ほ','ば','び','ぶ','べ','ぼ','ぱ','ぴ','ぷ','ぺ','ぽ','ハ','ヒ','フ','ヘ','ホ','バ','ビ','ブ','ベ','ボ','パ','ピ','プ','ペ','ポ'],
  54. ma: ['ま','み','む','め','も','マ','ミ','ム','メ','モ'],
  55. ya: ['や','ゆ','よ','ヤ','ユ','ヨ'],
  56. ra: ['ら','り','る','れ','ろ','ラ','リ','ル','レ','ロ'],
  57. wa: ['わ','を','ん','ワ','ヲ','ン'],
  58. };
  59. constructor(
  60. private dankaService: DankaService,
  61. private familyService: FamilyService,
  62. ) {}
  63. // 非同期初期化
  64. ngOnInit(): void {
  65. this.init();
  66. }
  67. async init(): Promise<void> {
  68. this.dankaList = await this.dankaService.getDankaList();
  69. this.showAllDanka();
  70. }
  71. showAllDanka() {
  72. this.selectedFilter = 'all';
  73. this.selectedKanaRow = 'all';
  74. this.searchKeyword = '';
  75. this.filterDankaList = this.dankaList;
  76. this.dankaDisplay = this.filterDankaList.length;
  77. }
  78. filterPhoneAvailable() {
  79. this.selectedFilter = 'phone';
  80. this.selectedKanaRow = 'all';
  81. this.filterDankaList = this.dankaList.filter((danka) =>
  82. danka.phones.some((phone) => phone.tel.trim() !== '')
  83. );
  84. this.dankaDisplay = this.filterDankaList.length;
  85. }
  86. searchDanka() {
  87. this.selectedFilter = 'search';
  88. this.selectedKanaRow = 'all';
  89. const keyword = this.searchKeyword.trim();
  90. if (keyword === '') {
  91. this.showAllDanka();
  92. return;
  93. }
  94. this.filterDankaList = this.dankaList.filter((danka) =>
  95. danka.householdName.includes(keyword) ||
  96. danka.householdFurigana.includes(keyword) ||
  97. danka.householder.includes(keyword) ||
  98. danka.householderFurigana.includes(keyword) ||
  99. danka.postalCode.includes(keyword) ||
  100. danka.address.includes(keyword) ||
  101. danka.phones.some((p) => p.tel.includes(keyword) || p.note.includes(keyword))
  102. );
  103. this.dankaDisplay = this.filterDankaList.length;
  104. }
  105. filterByKanaRow(row: KanaRowValue): void {
  106. this.selectedFilter = 'kana';
  107. this.selectedKanaRow = row;
  108. this.searchKeyword = '';
  109. if (row === 'all') {
  110. this.showAllDanka();
  111. return;
  112. }
  113. this.filterDankaList = this.dankaList.filter(async (danka) => {
  114. const firstKana = (await this.getDankaSortText(danka)).charAt(0);
  115. return this.kanaRowMap[row].includes(firstKana);
  116. });
  117. this.dankaDisplay = this.filterDankaList.length;
  118. }
  119. clearDanka() {
  120. this.selectedFilter = '';
  121. this.selectedKanaRow = 'all';
  122. this.searchKeyword = '';
  123. this.filterDankaList = [];
  124. this.dankaDisplay = 0;
  125. }
  126. private async getDankaSortText(danka: Danka): Promise<string> {
  127. const householderName = this.normalizeName(danka.householder);
  128. const householderFamily = (await this.familyService
  129. .getFamiliesByDankaId(danka.id))
  130. .find((f) => this.normalizeName(f.name) === householderName);
  131. return (householderFamily?.furigana || danka.householder).trim();
  132. }
  133. private normalizeName(name: string): string {
  134. return name.replace(/\s/g, '');
  135. }
  136. }