spell-table.component.html 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <div class="spell-box">
  2. <div class="heading-list">
  3. <div>Typ</div>
  4. <div>Name</div>
  5. <div>Stufe</div>
  6. <div>Bonus</div>
  7. <div>Effekt</div>
  8. <div>Reichweite</div>
  9. </div>
  10. <div
  11. id="spells-table"
  12. cdkDropList
  13. class="item-list table-content"
  14. (cdkDropListDropped)="dropSpells($event)"
  15. >
  16. @for(spell of spells; let index = $index; track spell){
  17. <div class="item" cdkDrag (click)="showFullSpellcard(index)">
  18. <!-- Range Icon -->
  19. <ng-container
  20. [ngTemplateOutlet]="distanceIconTemplate"
  21. [ngTemplateOutletContext]="{ spell: spell }"
  22. ></ng-container>
  23. <div class="vertical-line"></div>
  24. <!-- Name -->
  25. <ng-container
  26. [ngTemplateOutlet]="spellNameTemplate"
  27. [ngTemplateOutletContext]="{ spell: spell }"
  28. ></ng-container>
  29. <div class="vertical-line"></div>
  30. <!-- Level -->
  31. <ng-container
  32. [ngTemplateOutlet]="spellLevelTemplate"
  33. [ngTemplateOutletContext]="{ spell: spell }"
  34. ></ng-container>
  35. <div class="vertical-line"></div>
  36. <!-- Attack -->
  37. <ng-container
  38. [ngTemplateOutlet]="spellAttackTemplate"
  39. [ngTemplateOutletContext]="{ spell: spell }"
  40. ></ng-container>
  41. <div class="vertical-line"></div>
  42. <!-- Damage/Heal -->
  43. <ng-container
  44. [ngTemplateOutlet]="spellDamageTemplate"
  45. [ngTemplateOutletContext]="{ spell: spell }"
  46. ></ng-container>
  47. <div class="vertical-line"></div>
  48. <!-- Range -->
  49. <ng-container
  50. [ngTemplateOutlet]="spellRangeTemplate"
  51. [ngTemplateOutletContext]="{ spell: spell }"
  52. ></ng-container>
  53. </div>
  54. }@empty{
  55. <div
  56. style="
  57. text-align: center;
  58. margin-top: 2rem;
  59. font-size: 1.25rem;
  60. font-weight: 500;
  61. "
  62. >
  63. Noch keine Zauber hinzugefügt
  64. </div>
  65. }
  66. </div>
  67. <input
  68. id="typeahead-basic"
  69. type="text"
  70. [class]="showInput ? 'spellInput' : 'spellInput hidden'"
  71. (selectItem)="onSpellSelect($event.item); $event.preventDefault()"
  72. [(ngModel)]="newSpellName"
  73. [ngbTypeahead]="search"
  74. placement="top-start"
  75. placeholder="Name des vorbereiteten Zaubers"
  76. />
  77. <div class="footer"></div>
  78. <button
  79. [class]="showInput ? 'slide-button cancel-button' : 'slide-button'"
  80. (click)="toggleInput()"
  81. >
  82. @if(showInput){ Abbrechen} @else { Hinzufügen}
  83. </button>
  84. </div>
  85. <!-- Templates -->
  86. <!-- ICON -->
  87. <ng-template #distanceIconTemplate let-spell="spell">
  88. <icon
  89. [size]="'s'"
  90. [type]="'weapon'"
  91. [icon]="spell.isRanged ? 'distance' : 'touch'"
  92. ></icon>
  93. </ng-template>
  94. <!-- NAME -->
  95. <ng-template #spellNameTemplate let-spell="spell">
  96. <div>
  97. <div class="bold">{{ spell.german }}</div>
  98. <div class="bold small">
  99. <span *ngIf="spell.cost === 'action'">A</span>
  100. <span *ngIf="spell.cost === 'bonus'">B</span>
  101. <span *ngIf="spell.cost === 'reaction'">R</span>
  102. <span> | </span>
  103. <span *ngIf="spell.needsConcentration">C | </span>
  104. <span *ngIf="spell.needsVerbal">V </span>
  105. <span *ngIf="spell.needsSomatic">G </span>
  106. <span *ngIf="spell.needsMaterial">M </span>
  107. <div></div>
  108. </div>
  109. </div>
  110. </ng-template>
  111. <!-- Level -->
  112. <ng-template #spellLevelTemplate let-spell="spell">
  113. <div *ngIf="spell.level !== 0" class="bold">{{ spell.level }}</div>
  114. <div *ngIf="spell.level === 0" class="bold">Trick</div>
  115. </ng-template>
  116. <!-- Attack -->
  117. <ng-template #spellAttackTemplate let-spell="spell">
  118. <div>
  119. <div *ngIf="spell.needsSavingThrow">
  120. <div>
  121. {{ attributes[spell.savingThrowAttribute!] }}
  122. </div>
  123. <div>{{ spellSaveDC }}</div>
  124. </div>
  125. <div *ngIf="spell.needsAttackRoll">
  126. <div>{{ spellAttackBonus }}</div>
  127. </div>
  128. <div *ngIf="!spell.needsSavingThrow && !spell.needsAttackRoll">-</div>
  129. </div>
  130. </ng-template>
  131. <!-- Damage/Heal -->
  132. <ng-template #spellDamageTemplate let-spell="spell">
  133. <div>
  134. @if(spell.doesDamage){
  135. <div *ngFor="let damage of spell.damage; let index = index">
  136. <span>{{ damage.diceNumber }} {{ damage.diceType }} </span>
  137. <span>
  138. <icon [size]="'xs'" [type]="'damage'" [icon]="damage.damageType"></icon>
  139. </span>
  140. </div>
  141. } @if(spell.doesHeal){
  142. <div class="heal">
  143. <span>{{ spell.heal.diceNumber }} {{ spell.heal.diceType }} </span>
  144. <span *ngIf="spell.heal.additionalHeal"
  145. >+{{ spell.heal.additionalHeal }}
  146. </span>
  147. <span>
  148. <icon [size]="'xs'" [type]="'damage'" [icon]="'heal'"></icon>
  149. </span>
  150. </div>
  151. }
  152. </div>
  153. </ng-template>
  154. <!-- Range -->
  155. <ng-template #spellRangeTemplate let-spell="spell">
  156. <div class="spell-range">
  157. <div *ngIf="spell.isRanged">{{ spell.range }} ft.</div>
  158. <div *ngIf="!spell.isRanged">Berührung</div>
  159. <div *ngIf="spell.hasAreaOfEffect">
  160. <span>{{ spell.radius }} ft. {{ areas[spell.areaOfEffectType] }} </span>
  161. </div>
  162. </div>
  163. </ng-template>