瀏覽代碼

Continued working on the spellcards. changed the spellmodal

Christopher Giese 2 年之前
父節點
當前提交
6d17ac01b7

+ 37 - 0
.nx/cache/d/daemon.log

@@ -460601,3 +460601,40 @@ To fix this, set a unique name for each project in a project.json inside the pro
 [NX Daemon Server] - 2023-12-01T06:32:54.611Z - Time taken for 'hash changed files from watcher' 43.12899994850159ms
 [NX Daemon Server] - 2023-12-01T06:32:54.612Z - [WATCHER]: Processing file changes in outputs
 [NX Daemon Server] - 2023-12-01T06:32:54.612Z - Done responding to the client null
+[NX Daemon Server] - 2023-12-02T09:01:15.865Z - Started listening on: \\.\pipe\nx\C:\Users\chris\AppData\Local\Temp\e6a479e02f1047051806\d.sock
+[NX Daemon Server] - 2023-12-02T09:01:15.868Z - [WATCHER]: Subscribed to changes within: c:\Users\chris\Softwareprojekte\Test\DnDTools (native)
+[NX Daemon Server] - 2023-12-02T09:01:15.869Z - Established a connection. Number of open connections: 1
+[NX Daemon Server] - 2023-12-02T09:01:15.870Z - Established a connection. Number of open connections: 2
+[NX Daemon Server] - 2023-12-02T09:01:15.871Z - Closed a connection. Number of open connections: 1
+[NX Daemon Server] - 2023-12-02T09:01:15.873Z - [REQUEST]: Client Request for Project Graph Received
+[NX Daemon Server] - 2023-12-02T09:01:16.588Z - Error detected when recomputing project file map: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+[NX Daemon Server] - 2023-12-02T09:01:16.588Z - [REQUEST]: Responding to the client with an error. Error when preparing serialized project graph. The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+Error: The following projects are defined in multiple locations:
+- DnDTools: 
+  - 
+  - .
+
+To fix this, set a unique name for each project in a project.json inside the project's root. If the project does not currently have a project.json, you can create one that contains only a name.
+    at readProjectConfigurationsFromRootMap (c:\Users\chris\Softwareprojekte\Test\DnDTools\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:97:15)
+    at buildProjectsConfigurationsFromProjectPathsAndPlugins (c:\Users\chris\Softwareprojekte\Test\DnDTools\node_modules\nx\src\project-graph\utils\project-configuration-utils.js:70:19)
+    at createProjectConfigurations (c:\Users\chris\Softwareprojekte\Test\DnDTools\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:131:129)
+    at WorkspaceContext.<anonymous> (c:\Users\chris\Softwareprojekte\Test\DnDTools\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:82:39)
+    at getProjectConfigurationsFromContext (c:\Users\chris\Softwareprojekte\Test\DnDTools\node_modules\nx\src\utils\workspace-context.js:26:29)
+    at _retrieveProjectConfigurations (c:\Users\chris\Softwareprojekte\Test\DnDTools\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:81:72)
+    at retrieveProjectConfigurations (c:\Users\chris\Softwareprojekte\Test\DnDTools\node_modules\nx\src\project-graph\utils\retrieve-workspace-files.js:58:12)
+    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+    at async processCollectedUpdatedAndDeletedFiles (c:\Users\chris\Softwareprojekte\Test\DnDTools\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:102:34)
+    at async processFilesAndCreateAndSerializeProjectGraph (c:\Users\chris\Softwareprojekte\Test\DnDTools\node_modules\nx\src\daemon\server\project-graph-incremental-recomputation.js:138:17)
+[NX Daemon Server] - 2023-12-02T09:01:16.589Z - Time taken for 'hash changed files from watcher' 70.00209999999788ms
+[NX Daemon Server] - 2023-12-02T09:01:16.590Z - [WATCHER]: Processing file changes in outputs
+[NX Daemon Server] - 2023-12-02T09:01:16.590Z - Done responding to the client null

+ 1 - 1
.nx/cache/d/server-process.json

@@ -1 +1 @@
-{"processId":10468}
+{"processId":15920}

+ 235 - 163
src/app/journal/journal-spellcards/journal-spellcards.component.html

@@ -1,185 +1,257 @@
-<div cdkDropListGroup>
-  <div class="example-container">
-    <h2>To do</h2>
-
-    <div
-      cdkDropList
-      cdkDropListOrientation="horizontal"
-      [cdkDropListData]="todo"
-      class="example-list"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of todo; track item) {
-      <div class="example-box" cdkDrag>{{ item }}</div>
-      }
-    </div>
-  </div>
+<div class="spellcards-container">
+  <div cdkDropListGroup>
+    <div class="example-container">
+      <h2>Zaubertricks</h2>
+      <button (click)="toggleSpellList(0)">Toggle Spell List</button>
 
-  <div class="example-container">
-    <h2>Done</h2>
-
-    <div
-      cdkDropList
-      cdkDropListOrientation="horizontal"
-      [cdkDropListData]="done"
-      class="example-list"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of done; track item) {
-      <div class="example-box" cdkDrag>{{ item }}</div>
-      }
+      <div
+        cdkDropList
+        cdkDropListOrientation="horizontal"
+        [cdkDropListData]="level0"
+        class="spell-list"
+        (cdkDropListDropped)="drop($event)"
+        [class]="showSpellList[0] ? '' : 'hidden'"
+      >
+        @for (spell of level0; let index = $index; track spell) {
+        <div class="spellcard" (click)="openModal(true, 0, index)" cdkDrag>
+          <div class="name">{{ spell.name }}</div>
+          <div>{{ spell.cost }}</div>
+          <div>{{ spell.level }}</div>
+          <div>{{ spell.school }}</div>
+        </div>
+        }
+        <div class="add-card" (click)="openModal(false, 0)">
+          <icon
+            class="add"
+            [size]="'l'"
+            [type]="'UI'"
+            [icon]="'add'"
+            [class]="'pointer'"
+          ></icon>
+        </div>
+      </div>
     </div>
-  </div>
-</div>
 
-<!-- <div cdkDropListGroup>
-  <div class="level-container">
-    <h2>Zaubertrick</h2>
-
-    <div
-      cdkDropList
-      [cdkDropListData]="level0"
-      class="level-table"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of level0; track item) {
-      <div class="spellcard" cdkDrag>{{ item }}</div>
-      }
-    </div>
-  </div>
+    <div class="example-container">
+      <h2>Level 1</h2>
+      <button (click)="toggleSpellList(1)">Toggle Spell List</button>
 
-  <div class="level-container">
-    <h2>Level 1</h2>
-
-    <div
-      cdkDropList
-      [cdkDropListData]="level1"
-      class="level-table"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of level1; track item) {
-      <div class="spellcard" cdkDrag>{{ item }}</div>
-      }
+      <div
+        cdkDropList
+        cdkDropListOrientation="horizontal"
+        [cdkDropListData]="level1"
+        class="spell-list"
+        (cdkDropListDropped)="drop($event)"
+        [class]="showSpellList[1] ? '' : 'hidden'"
+      >
+        @for (item of level1; track item) {
+        <div class="spellcard" cdkDrag>
+          <div>{{ item.name }}</div>
+          <div>{{ item.cost }}</div>
+          <div>{{ item.level }}</div>
+          <div>{{ item.school }}</div>
+        </div>
+        }
+        <div class="add-card" (click)="openModal(false, 1)">
+          <icon
+            class="add"
+            [size]="'l'"
+            [type]="'UI'"
+            [icon]="'add'"
+            [class]="'pointer'"
+          ></icon>
+        </div>
+      </div>
     </div>
-  </div>
 
-  <div class="level-container">
-    <h2>Level 2</h2>
-
-    <div
-      cdkDropList
-      [cdkDropListData]="level2"
-      class="level-table"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of level2; track item) {
-      <div class="spellcard" cdkDrag>{{ item }}</div>
-      }
+    <div class="example-container">
+      <h2>Level 2</h2>
+      <button (click)="toggleSpellList(2)">Toggle Spell List</button>
+
+      <div
+        cdkDropList
+        cdkDropListOrientation="horizontal"
+        [cdkDropListData]="level2"
+        class="spell-list"
+        (cdkDropListDropped)="drop($event)"
+        [class]="showSpellList[2] ? '' : 'hidden'"
+      >
+        @for (item of level2; track item) {
+        <div class="spellcard" cdkDrag>
+          <div>{{ item.name }}</div>
+          <div>{{ item.cost }}</div>
+          <div>{{ item.level }}</div>
+          <div>{{ item.school }}</div>
+        </div>
+        }
+        <div class="add-card">
+          <icon
+            class="add"
+            [size]="'l'"
+            [type]="'UI'"
+            [icon]="'add'"
+            [class]="'pointer'"
+          ></icon>
+        </div>
+      </div>
     </div>
-  </div>
 
-  <div class="level-container">
-    <h2>Level 3</h2>
-
-    <div
-      cdkDropList
-      [cdkDropListData]="level3"
-      class="level-table"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of level3; track item) {
-      <div class="spellcard" cdkDrag>{{ item }}</div>
-      }
+    <div class="example-container">
+      <h2>Level 3</h2>
+      <button (click)="toggleSpellList(3)">Toggle Spell List</button>
+
+      <div
+        cdkDropList
+        cdkDropListOrientation="horizontal"
+        [cdkDropListData]="level3"
+        class="spell-list"
+        (cdkDropListDropped)="drop($event)"
+        [class]="showSpellList[3] ? '' : 'hidden'"
+      >
+        @for (item of level3; track item) {
+        <div class="spellcard" cdkDrag>
+          <div>{{ item.name }}</div>
+          <div>{{ item.cost }}</div>
+          <div>{{ item.level }}</div>
+          <div>{{ item.school }}</div>
+        </div>
+        }
+        <div class="add-card">
+          <icon
+            class="add"
+            [size]="'l'"
+            [type]="'UI'"
+            [icon]="'add'"
+            [class]="'pointer'"
+          ></icon>
+        </div>
+      </div>
     </div>
-  </div>
 
-  <div class="level-container">
-    <h2>Level 4</h2>
-
-    <div
-      cdkDropList
-      [cdkDropListData]="level4"
-      class="level-table"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of level4; track item) {
-      <div class="spellcard" cdkDrag>{{ item }}</div>
-      }
+    <div class="example-container">
+      <h2>Level 4</h2>
+
+      <div
+        cdkDropList
+        cdkDropListOrientation="horizontal"
+        [cdkDropListData]="level4"
+        class="spell-list"
+        (cdkDropListDropped)="drop($event)"
+      >
+        @for (item of level4; track item) {
+        <div class="spellcard" cdkDrag>
+          <div>{{ item.name }}</div>
+          <div>{{ item.cost }}</div>
+          <div>{{ item.level }}</div>
+          <div>{{ item.school }}</div>
+        </div>
+        }
+      </div>
     </div>
-  </div>
 
-  <div class="level-container">
-    <h2>Level 5</h2>
-
-    <div
-      cdkDropList
-      [cdkDropListData]="level5"
-      class="level-table"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of level5; track item) {
-      <div class="spellcard" cdkDrag>{{ item }}</div>
-      }
+    <div class="example-container">
+      <h2>Level 5</h2>
+
+      <div
+        cdkDropList
+        cdkDropListOrientation="horizontal"
+        [cdkDropListData]="level5"
+        class="spell-list"
+        (cdkDropListDropped)="drop($event)"
+      >
+        @for (item of level5; track item) {
+        <div class="spellcard" cdkDrag>
+          <div>{{ item.name }}</div>
+          <div>{{ item.cost }}</div>
+          <div>{{ item.level }}</div>
+          <div>{{ item.school }}</div>
+        </div>
+        }
+      </div>
     </div>
-  </div>
 
-  <div class="level-container">
-    <h2>Level 6</h2>
-
-    <div
-      cdkDropList
-      [cdkDropListData]="level6"
-      class="level-table"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of level6; track item) {
-      <div class="spellcard" cdkDrag>{{ item }}</div>
-      }
+    <div class="example-container">
+      <h2>Level 6</h2>
+
+      <div
+        cdkDropList
+        cdkDropListOrientation="horizontal"
+        [cdkDropListData]="level6"
+        class="spell-list"
+        (cdkDropListDropped)="drop($event)"
+      >
+        @for (item of level6; track item) {
+        <div class="spellcard" cdkDrag>
+          <div>{{ item.name }}</div>
+          <div>{{ item.cost }}</div>
+          <div>{{ item.level }}</div>
+          <div>{{ item.school }}</div>
+        </div>
+        }
+      </div>
     </div>
-  </div>
 
-  <div class="level-container">
-    <h2>Level 7</h2>
-
-    <div
-      cdkDropList
-      [cdkDropListData]="level7"
-      class="level-table"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of level7; track item) {
-      <div class="spellcard" cdkDrag>{{ item }}</div>
-      }
+    <div class="example-container">
+      <h2>Level 7</h2>
+
+      <div
+        cdkDropList
+        cdkDropListOrientation="horizontal"
+        [cdkDropListData]="level7"
+        class="spell-list"
+        (cdkDropListDropped)="drop($event)"
+      >
+        @for (item of level7; track item) {
+        <div class="spellcard" cdkDrag>
+          <div>{{ item.name }}</div>
+          <div>{{ item.cost }}</div>
+          <div>{{ item.level }}</div>
+          <div>{{ item.school }}</div>
+        </div>
+        }
+      </div>
     </div>
-  </div>
 
-  <div class="level-container">
-    <h2>Level 8</h2>
-
-    <div
-      cdkDropList
-      [cdkDropListData]="level8"
-      class="level-table"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of level8; track item) {
-      <div class="spellcard" cdkDrag>{{ item }}</div>
-      }
+    <div class="example-container">
+      <h2>Level 8</h2>
+
+      <div
+        cdkDropList
+        cdkDropListOrientation="horizontal"
+        [cdkDropListData]="level8"
+        class="spell-list"
+        (cdkDropListDropped)="drop($event)"
+      >
+        @for (item of level8; track item) {
+        <div class="spellcard" cdkDrag>
+          <div>{{ item.name }}</div>
+          <div>{{ item.cost }}</div>
+          <div>{{ item.level }}</div>
+          <div>{{ item.school }}</div>
+        </div>
+        }
+      </div>
     </div>
-  </div>
 
-  <div class="level-container">
-    <h2>Level 9</h2>
-
-    <div
-      cdkDropList
-      [cdkDropListData]="level9"
-      class="level-table"
-      (cdkDropListDropped)="drop($event)"
-    >
-      @for (item of level9; track item) {
-      <div class="spellcard" cdkDrag>{{ item }}</div>
-      }
+    <div class="example-container">
+      <h2>Level 9</h2>
+
+      <div
+        cdkDropList
+        cdkDropListOrientation="horizontal"
+        [cdkDropListData]="level9"
+        class="spell-list"
+        (cdkDropListDropped)="drop($event)"
+      >
+        @for (item of level9; track item) {
+        <div class="spellcard" cdkDrag>
+          <div>{{ item.name }}</div>
+          <div>{{ item.cost }}</div>
+          <div>{{ item.level }}</div>
+          <div>{{ item.school }}</div>
+        </div>
+        }
+      </div>
     </div>
   </div>
-</div> -->
+</div>

+ 70 - 23
src/app/journal/journal-spellcards/journal-spellcards.component.scss

@@ -1,29 +1,71 @@
-.example-list {
-  width: 1000px;
-  max-width: 100%;
+.spellcards-container {
+  width: 100%;
+  height: 88vh;
+  padding: 2rem;
+  overflow-y: auto;
+}
+
+
+.example-container {
+
+}
+
+.spell-list {
   border: solid 1px #ccc;
-  min-height: 60px;
-  display: flex;
-  flex-direction: row;
+  height: 16rem;
+  width: 96%;
+  margin: 0 1rem;
   background: white;
   border-radius: 4px;
   overflow: hidden;
-}
-
-.example-box {
-  padding: 20px 10px;
-  border-right: solid 1px #ccc;
-  color: rgba(0, 0, 0, 0.87);
   display: flex;
   flex-direction: row;
   align-items: center;
-  justify-content: space-between;
-  box-sizing: border-box;
-  cursor: move;
+  gap: 1rem;
+  padding: 0 1rem;
+  overflow-x: auto;
+  transition: height 0.4s ease-in-out;
+
+  &.hidden{
+    height: 0;
+    overflow: hidden;
+    transition: height 0.4s ease-in-out;
+    border:none;
+  }
+}
+
+@mixin card{
+  height: 14rem;
+  // width: 10rem;
+  flex: 0 0 10rem;
+  border: solid 1px var(--border-color);
+  border-radius: 10px;
   background: white;
-  font-size: 14px;
-  flex-grow: 1;
-  flex-basis: 0;
+}
+
+.spellcard {
+  @include card;
+  cursor: move;
+
+  .name{
+    font-weight: 600;
+    font-size: 1.125rem;
+    text-align: center;
+    margin-top: 0.25rem;
+  }  
+}
+
+.add-card{
+  @include card;
+  position: relative;
+  cursor: pointer;
+
+  .add{
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);  
+  }
 }
 
 .cdk-drag-preview {
@@ -35,17 +77,22 @@
 }
 
 .cdk-drag-placeholder {
-  opacity: 0;
+  background: #e0e0e0;
+  border: dotted 3px #999;
+  min-height: 60px;
+  transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
+  font-size: 0 !important;
+
+  .name{
+    display: none;
+  }
 }
 
 .cdk-drag-animating {
   transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
 }
 
-.example-box:last-child {
-  border: none;
-}
 
-.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder) {
+.spell-list.cdk-drop-list-dragging .spellcard:not(.cdk-drag-placeholder) {
   transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
 }

+ 136 - 183
src/app/journal/journal-spellcards/journal-spellcards.component.ts

@@ -8,6 +8,9 @@ import {
   transferArrayItem,
 } from '@angular/cdk/drag-drop';
 import { Spell } from 'src/interfaces/spell';
+import { DataService } from 'src/services/data/data.service';
+import { ModalService } from 'src/services/modal/modal.service';
+import { SpellModalComponent } from 'src/app/journal/spell-modal/spell-modal.component';
 
 @Component({
   selector: 'app-journal-spellcards',
@@ -15,196 +18,99 @@ import { Spell } from 'src/interfaces/spell';
   styleUrls: ['./journal-spellcards.component.scss'],
 })
 export class JournalSpellcardsComponent {
-  todo = ['Get to work', 'Pick up groceries', 'Go home', 'Fall asleep'];
-
-  done = ['Get up', 'Brush teeth', 'Take a shower', 'Check e-mail', 'Walk dog'];
-
-  // public level0: Spell[] = [
-  //   {
-  //     name: 'Vampiric Touch',
-  //     level: 3,
-  //     cost: 'action',
-  //     canRitual: false,
-  //     needsVerbal: true,
-  //     needsSomatic: true,
-  //     needsMaterial: false,
-  //     needsConcentration: true,
-  //     needsAttackRoll: true,
-  //     needsSavingThrow: false,
-  //     doesDamage: true,
-  //     doesHeal: false,
-  //     heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
-  //     description:
-  //       'Die Berührung deiner schattenumrankten Hand kann anderen die Lebenskraft entziehen, um deine Wunden zu heilen. Führe einen Nahkampf-Zauberangriff gegen eine Kreatur in deiner Reichweite aus. Bei einem Treffer erleidet das Ziel 3W6 nekrotischen Schaden, und du erhältst Trefferpunkte in Höhe der Hälfte des zugefügten nekrotischen Schadens zurück. Bis der Zauber endet, kannst du den Angriff in jeder deiner Runden als Aktion wiederholen. Wenn du diesen Zauber mit einem Zauberplatz des 4. Grades oder höher wirkst, erhöht sich der Schaden um 1W6 für jeden Grad über dem 3.',
-  //     school: 'necromancy',
-  //     damage: [{ diceNumber: '3', diceType: 'd6', damageType: 'necrotic' }],
-  //     isRanged: false,
-  //     range: 5,
-  //     hasAreaOfEffect: false,
-  //     areaOfEffectType: '',
-  //     radius: 0,
-  //   },
-  //   {
-  //     name: 'Heilende Berührung',
-  //     level: 1,
-  //     cost: 'action',
-  //     canRitual: false,
-  //     needsVerbal: true,
-  //     needsSomatic: true,
-  //     needsMaterial: false,
-  //     needsConcentration: false,
-  //     needsAttackRoll: false,
-  //     needsSavingThrow: false,
-  //     doesDamage: false,
-  //     damage: [{ diceNumber: '', diceType: '', damageType: '' }],
-  //     doesHeal: true,
-  //     heal: { diceNumber: '1', diceType: 'd8', additionalHeal: 5 },
-  //     description:
-  //       'Deine Berührung kann Wunden heilen. Berühre eine Kreatur und spende ihr 1W8 + deinem Fertigkeitsbonus Trefferpunkte. Dieser Zauber hat keine Wirkung auf Untote oder Konstrukte. Wenn du diesen Zauber mit einem Zauberplatz des 2. Grades oder höher wirkst, erhöht sich die Heilung um 1W8 für jeden Grad über dem 1.',
-  //     school: 'evocation',
-  //     isRanged: false,
-  //     range: 5,
-  //     hasAreaOfEffect: false,
-  //     areaOfEffectType: '',
-  //     radius: 0,
-  //   },
-  // ];
-
-  // public level1: Spell[] = [
-  //   {
-  //     name: 'Feuerball',
-  //     level: 3,
-  //     cost: 'action',
-  //     canRitual: false,
-  //     needsVerbal: true,
-  //     needsSomatic: true,
-  //     needsMaterial: true,
-  //     needsConcentration: false,
-  //     needsAttackRoll: false,
-  //     needsSavingThrow: true,
-  //     savingThrowAttribute: 'dexterity',
-  //     school: 'evocation',
-  //     doesDamage: true,
-  //     damage: [
-  //       { diceNumber: '8', diceType: 'd6', damageType: 'fire' },
-  //       { diceNumber: '8', diceType: 'd6', damageType: 'fire' },
-  //     ],
-  //     doesHeal: false,
-  //     heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
-  //     isRanged: true,
-  //     description:
-  //       'Ein heller Strahl schießt von deinem Zeigefinger zu einem von dir gewählten Punkt in Reichweite und blüht dann mit einem tiefen Brüllen zu einer Flammenexplosion auf. Jede Kreatur in einem Umkreis von 6 Metern um diesen Punkt muss einen Rettungswurf auf Geschicklichkeit machen. Bei einem misslungenen Rettungswurf erleidet das Ziel 8W6 Feuerschaden, bei einem erfolgreichen Wurf die Hälfte des Schadens. Das Feuer breitet sich um Ecken aus. Es entzündet brennbare Gegenstände in der Umgebung, die nicht getragen werden. Wenn du diesen Zauber mit einem Zauberplatz des 4. Grades oder höher wirkst, erhöht sich der Schaden um 1W6 für jeden Grad über dem 3.',
-  //     range: 150,
-  //     hasAreaOfEffect: true,
-  //     radius: 20,
-  //     areaOfEffectType: 'sphere',
-  //   },
-  //   {
-  //     name: 'Feuerpfeil',
-  //     level: 0,
-  //     cost: 'action',
-  //     canRitual: false,
-  //     needsVerbal: true,
-  //     needsSomatic: true,
-  //     needsMaterial: true,
-  //     needsConcentration: false,
-  //     needsAttackRoll: true,
-  //     needsSavingThrow: false,
-  //     school: 'evocation',
-  //     doesDamage: true,
-  //     doesHeal: false,
-  //     heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
-  //     description:
-  //       'Du schleuderst einen Splitter aus Feuer auf eine Kreatur in Reichweite. Lege einen Fernkampf-Zauberangriff gegen das Ziel ab. Bei einem Treffer erleidet das Ziel 1W10 Feuerschaden. Ein brennbarer Gegenstand, der von diesem Zauber getroffen wird, geht in Flammen auf, wenn er nicht getragen oder in der Hand gehalten wird. Der Schaden dieses Zaubers steigt um 1W10, wenn du die 5. Stufe (2W10), die 11. Stufe (3W10) und die 17. Stufe (4W10) erreichst.  ',
-  //     damage: [{ diceNumber: '1', diceType: 'd10', damageType: 'fire' }],
-  //     isRanged: true,
-  //     range: 120,
-  //     hasAreaOfEffect: false,
-  //     areaOfEffectType: '',
-  //     radius: 0,
-  //   },
-  // ];
-
-  // public level2: Spell[] = [
-  //   {
-  //     name: 'Feuerball2',
-  //     level: 3,
-  //     cost: 'action',
-  //     canRitual: false,
-  //     needsVerbal: true,
-  //     needsSomatic: true,
-  //     needsMaterial: true,
-  //     needsConcentration: false,
-  //     needsAttackRoll: false,
-  //     needsSavingThrow: true,
-  //     savingThrowAttribute: 'dexterity',
-  //     school: 'evocation',
-  //     doesDamage: true,
-  //     damage: [
-  //       { diceNumber: '8', diceType: 'd6', damageType: 'fire' },
-  //       { diceNumber: '8', diceType: 'd6', damageType: 'fire' },
-  //     ],
-  //     doesHeal: false,
-  //     heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
-  //     isRanged: true,
-  //     description:
-  //       'Ein heller Strahl schießt von deinem Zeigefinger zu einem von dir gewählten Punkt in Reichweite und blüht dann mit einem tiefen Brüllen zu einer Flammenexplosion auf. Jede Kreatur in einem Umkreis von 6 Metern um diesen Punkt muss einen Rettungswurf auf Geschicklichkeit machen. Bei einem misslungenen Rettungswurf erleidet das Ziel 8W6 Feuerschaden, bei einem erfolgreichen Wurf die Hälfte des Schadens. Das Feuer breitet sich um Ecken aus. Es entzündet brennbare Gegenstände in der Umgebung, die nicht getragen werden. Wenn du diesen Zauber mit einem Zauberplatz des 4. Grades oder höher wirkst, erhöht sich der Schaden um 1W6 für jeden Grad über dem 3.',
-  //     range: 150,
-  //     hasAreaOfEffect: true,
-  //     radius: 20,
-  //     areaOfEffectType: 'sphere',
-  //   },
-  //   {
-  //     name: 'Feuerpfeil2',
-  //     level: 0,
-  //     cost: 'action',
-  //     canRitual: false,
-  //     needsVerbal: true,
-  //     needsSomatic: true,
-  //     needsMaterial: true,
-  //     needsConcentration: false,
-  //     needsAttackRoll: true,
-  //     needsSavingThrow: false,
-  //     school: 'evocation',
-  //     doesDamage: true,
-  //     doesHeal: false,
-  //     heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
-  //     description:
-  //       'Du schleuderst einen Splitter aus Feuer auf eine Kreatur in Reichweite. Lege einen Fernkampf-Zauberangriff gegen das Ziel ab. Bei einem Treffer erleidet das Ziel 1W10 Feuerschaden. Ein brennbarer Gegenstand, der von diesem Zauber getroffen wird, geht in Flammen auf, wenn er nicht getragen oder in der Hand gehalten wird. Der Schaden dieses Zaubers steigt um 1W10, wenn du die 5. Stufe (2W10), die 11. Stufe (3W10) und die 17. Stufe (4W10) erreichst.  ',
-  //     damage: [{ diceNumber: '1', diceType: 'd10', damageType: 'fire' }],
-  //     isRanged: true,
-  //     range: 120,
-  //     hasAreaOfEffect: false,
-  //     areaOfEffectType: '',
-  //     radius: 0,
-  //   },
-  // ];
-
-  public level0: any[] = ['Hund', 'Katze', 'Maus', 'Elefant', 'Giraffe'];
-
-  public level1: any[] = [
-    'Feuerball',
-    'Heilende Berührung',
-    'Feuerpfeil',
-    'Wasserball',
-  ];
-
-  public level2: any[] = ['Hamburg', 'Berlin', 'München', 'Köln'];
+  public constructor(
+    public dataAccessor: DataService,
+    private modalAccessor: ModalService
+  ) {
+    this.loadSpells();
+  }
 
+  public level0: Spell[] = [];
+  public level1: Spell[] = [];
+  public level2: Spell[] = [];
   public level3: Spell[] = [];
-
   public level4: Spell[] = [];
-
   public level5: Spell[] = [];
-
   public level6: Spell[] = [];
-
   public level7: Spell[] = [];
-
   public level8: Spell[] = [];
-
   public level9: Spell[] = [];
 
+  public listTranslator: any = {
+    0: this.level0,
+    1: this.level1,
+    2: this.level2,
+    3: this.level3,
+    4: this.level4,
+    5: this.level5,
+    6: this.level6,
+    7: this.level7,
+    8: this.level8,
+    9: this.level9,
+  };
+
+  public showSpellList: boolean[] = [
+    true,
+    true,
+    true,
+    true,
+    true,
+    true,
+    true,
+    true,
+    true,
+    true,
+  ];
+
+  ///////// FUNCTIONS //////////
+
+  public openModal(
+    isUpdate: boolean,
+    level: number,
+    spellIndex?: number
+  ): void {
+    console.log(spellIndex);
+    this.modalAccessor.openModal(SpellModalComponent, {
+      spell:
+        spellIndex !== undefined
+          ? JSON.parse(JSON.stringify(this.listTranslator[level][spellIndex]))
+          : undefined,
+      isUpdate: isUpdate,
+      level: level,
+    });
+    const resultSubscription = this.modalAccessor.result$.subscribe(
+      (result) => {
+        if (result.state === 'update') {
+          console.log(result.data);
+          this.updateSpell(result.data, level!, spellIndex!);
+        } else if (result.state === 'add') {
+          console.log('im else: ', result.data);
+          this.addSpell(result.data, level);
+        }
+        resultSubscription.unsubscribe();
+      }
+    );
+  }
+
+  public addSpell(spell: Spell, level: number) {
+    console.log('The level: ', level);
+    console.log('The levellist:', this.listTranslator[level]);
+    console.log('The new spell: ', spell);
+    this.listTranslator[level].push(spell);
+    console.log(this.listTranslator[level]);
+    // this.updateSpellsInDatabase();
+  }
+
+  public updateSpell(spell: Spell, level: number, index: number): void {
+    this.listTranslator[level][index] = spell;
+    // this.updateSpellsInDatabase();
+  }
+
+  toggleSpellList(index: number) {
+    console.log(index);
+    this.showSpellList[index] = !this.showSpellList[index];
+  }
+
   drop(event: CdkDragDrop<any[]>) {
     if (event.previousContainer === event.container) {
       moveItemInArray(
@@ -220,8 +126,55 @@ export class JournalSpellcardsComponent {
         event.previousIndex,
         event.currentIndex
       );
-      console.log(event.previousContainer.data);
-      console.log(event.container.data);
+
+      const movedSpell = event.container.data[event.currentIndex];
+      const newContainer = event.container.id;
+
+      switch (newContainer) {
+        case 'cdk-drop-list-0':
+          movedSpell.level = 0;
+          break;
+        case 'cdk-drop-list-1':
+          movedSpell.level = 1;
+          break;
+        case 'cdk-drop-list-2':
+          movedSpell.level = 2;
+          break;
+        case 'cdk-drop-list-3':
+          movedSpell.level = 3;
+          break;
+        case 'cdk-drop-list-4':
+          movedSpell.level = 4;
+          break;
+        case 'cdk-drop-list-5':
+          movedSpell.level = 5;
+          break;
+        case 'cdk-drop-list-6':
+          movedSpell.level = 6;
+          break;
+        case 'cdk-drop-list-7':
+          movedSpell.level = 7;
+          break;
+        case 'cdk-drop-list-8':
+          movedSpell.level = 8;
+          break;
+        case 'cdk-drop-list-9':
+          movedSpell.level = 9;
+          break;
+      }
     }
   }
+
+  private loadSpells(): void {
+    this.level0 = this.dataAccessor.spellLevel0;
+    this.level1 = this.dataAccessor.spellLevel1;
+    this.level2 = this.dataAccessor.spellLevel2;
+    // this.level3 = this.dataAccessor.spellLevel3;
+    // this.level4 = this.dataAccessor.spellLevel4;
+    // this.level5 = this.dataAccessor.spellLevel5;
+    // this.level6 = this.dataAccessor.spellLevel6;
+    // this.level7 = this.dataAccessor.spellLevel7;
+    // this.level8 = this.dataAccessor.spellLevel8;
+    // this.level9 = this.dataAccessor.spellLevel9;
+  }
 }

+ 2 - 2
src/app/journal/journal-stats/weapons-container/spell-table/spell-table.component.ts

@@ -46,7 +46,7 @@ export class SpellTableComponent {
   };
 
   public ngOnInit(): void {
-    this.spells = this.dataAccessor.getSpells();
+    this.spells = this.dataAccessor.favoriteSpells;
     this.subscribeToData();
   }
 
@@ -115,7 +115,7 @@ export class SpellTableComponent {
   }
 
   public updateSpellsInDatabase(): void {
-    this.dataAccessor.setSpells(this.spells);
+    this.dataAccessor.favoriteSpells = this.spells;
   }
 
   private computeSpellAttackBonusAndSaveDC(): void {

+ 0 - 1
src/app/journal/journal.module.ts

@@ -27,7 +27,6 @@ import { DeathSaveComponent } from './journal-stats/info-row/death-save/death-sa
 import { LifeComponent } from './journal-stats/life-container/life/life.component';
 import { IconComponent } from './icon/icon.component';
 import { WeaponTableComponent } from './journal-stats/weapons-container/weapon-table/weapon-table.component';
-// import { WeaponModalComponent } from './weapon-modal/weapon-modal.component';
 import { WeaponModalComponent } from './journal-stats/weapons-container/weapon-table/weapon-modal/weapon-modal.component';
 import { SpellTableComponent } from './journal-stats/weapons-container/spell-table/spell-table.component';
 import { SpellModalComponent } from './spell-modal/spell-modal.component';

+ 3 - 2
src/app/journal/spell-modal/spell-modal.component.ts

@@ -13,9 +13,10 @@ export class SpellModalComponent {
   public constructor(private modalAccessor: ModalService) {}
   @Input() public spell: any;
   @Input() public isUpdate: boolean = false;
+  @Input() public level: number = 0;
 
   public name: string = '';
-  public level: number = 0;
+  // public level: number = 0;
   public cost: string = 'action';
   public canRitual: boolean = false;
   public needsConcentration: boolean = false;
@@ -133,7 +134,7 @@ export class SpellModalComponent {
   }
 
   private loadspell(): void {
-    console.log(this.spell.school);
+    console.log(this.spell);
     this.name = this.spell.name;
     this.level = this.spell.level;
     this.cost = this.spell.cost;

+ 215 - 6
src/services/data/data.service.ts

@@ -204,7 +204,7 @@ export class DataService {
     console.log('weapons updated from data service: ', this.weapons);
   }
 
-  private spells: Spell[] = [
+  private _favoriteSpells: Spell[] = [
     {
       name: 'Feuerball',
       level: 3,
@@ -307,13 +307,222 @@ export class DataService {
     },
   ];
 
-  public getSpells(): Spell[] {
-    return this.spells;
+  public get favoriteSpells(): Spell[] {
+    return this._favoriteSpells;
   }
 
-  public setSpells(spells: Spell[]): void {
-    this.spells = spells;
-    console.log('spells updated from data service: ', this.spells);
+  public set favoriteSpells(spells: Spell[]) {
+    this._favoriteSpells = spells;
+    console.log('spells updated from data service: ', this._favoriteSpells);
+  }
+
+  private _spellLevel0: Spell[] = [
+    {
+      name: 'Führung',
+      level: 0,
+      cost: 'action',
+      canRitual: false,
+      needsVerbal: true,
+      needsSomatic: true,
+      needsMaterial: true,
+      needsConcentration: true,
+      needsAttackRoll: false,
+      needsSavingThrow: false,
+      doesDamage: false,
+      damage: [{ diceNumber: '', diceType: '', damageType: '' }],
+      doesHeal: false,
+      heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
+      description:
+        'Du berührst eine Kreatur und bis zum Ende des Zuges erhält sie einen Bonus von 1W4 auf Angriffs- und Rettungswürfe.',
+      school: 'enchantment',
+      isRanged: false,
+      range: 5,
+      hasAreaOfEffect: false,
+      areaOfEffectType: '',
+      radius: 0,
+    },
+    {
+      name: 'Totenläuten',
+      level: 0,
+      cost: 'action',
+      canRitual: false,
+      needsVerbal: true,
+      needsSomatic: false,
+      needsMaterial: true,
+      needsConcentration: false,
+      needsAttackRoll: false,
+      needsSavingThrow: true,
+      savingThrowAttribute: 'wisdom',
+      doesDamage: true,
+      damage: [{ diceNumber: '1', diceType: 'd8', damageType: 'necrotic' }],
+      doesHeal: false,
+      heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
+      description:
+        'Eine Kreatur, die du berührst, erleidet 1W8 Nekrotischen Schaden, wenn sie einen Rettungswurf auf Konstitution nicht besteht.',
+      school: 'necromancy',
+      isRanged: true,
+      range: 60,
+      hasAreaOfEffect: false,
+      areaOfEffectType: '',
+      radius: 0,
+    },
+    {
+      name: 'Thaumaturgie',
+      level: 0,
+      cost: 'action',
+      canRitual: false,
+      needsVerbal: true,
+      needsSomatic: true,
+      needsMaterial: false,
+      needsConcentration: false,
+      needsAttackRoll: false,
+      needsSavingThrow: false,
+      doesDamage: false,
+      damage: [{ diceNumber: '', diceType: '', damageType: '' }],
+      doesHeal: false,
+      heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
+      description:
+        'Du öffnest eine Tür, entzündest eine Kerze oder machst ein Geräusch, das du innerhalb der Reichweite deiner Stimme erzeugen kannst. Du kannst auch deine Stimme bis zum Ende deines nächsten Zuges um das Dreifache verstärken.',
+      school: 'transmutation',
+      isRanged: false,
+      range: 30,
+      hasAreaOfEffect: false,
+      areaOfEffectType: '',
+      radius: 0,
+    },
+  ];
+
+  public get spellLevel0(): Spell[] {
+    return this._spellLevel0;
+  }
+
+  public set spellLevel0(spells: Spell[]) {
+    this._spellLevel0 = spells;
+    console.log('spells updated from data service: ', this._spellLevel0);
+  }
+
+  private _spellLevel1: Spell[] = [
+    {
+      name: 'Heilende Berührung',
+      level: 1,
+      cost: 'action',
+      canRitual: false,
+      needsVerbal: true,
+      needsSomatic: true,
+      needsMaterial: false,
+      needsConcentration: false,
+      needsAttackRoll: false,
+      needsSavingThrow: false,
+      doesDamage: false,
+      damage: [{ diceNumber: '', diceType: '', damageType: '' }],
+      doesHeal: true,
+      heal: { diceNumber: '1', diceType: 'd8', additionalHeal: 5 },
+      description:
+        'Deine Berührung kann Wunden heilen. Berühre eine Kreatur und spende ihr 1W8 + deinem Fertigkeitsbonus Trefferpunkte. Dieser Zauber hat keine Wirkung auf Untote oder Konstrukte. Wenn du diesen Zauber mit einem Zauberplatz des 2. Grades oder höher wirkst, erhöht sich die Heilung um 1W8 für jeden Grad über dem 1.',
+      school: 'evocation',
+      isRanged: false,
+      range: 5,
+      hasAreaOfEffect: false,
+      areaOfEffectType: '',
+      radius: 0,
+    },
+    {
+      name: 'Magie entdecken',
+      level: 1,
+      cost: 'action',
+      canRitual: true,
+      needsVerbal: true,
+      needsSomatic: true,
+      needsMaterial: true,
+      needsConcentration: false,
+      needsAttackRoll: false,
+      needsSavingThrow: false,
+      doesDamage: false,
+      damage: [{ diceNumber: '', diceType: '', damageType: '' }],
+      doesHeal: false,
+      heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
+      description:
+        'Dein Blick wird magisch, um magische Kräfte zu erkennen. Für die Dauer erfährst du die Anzahl und die Art aller magischen Kräfte, die du innerhalb von 30 Fuß wahrnehmen kannst. Du erfährst auch die Schule der Magie, falls vorhanden.',
+      school: 'divination',
+      isRanged: false,
+      range: 30,
+      hasAreaOfEffect: false,
+      areaOfEffectType: '',
+      radius: 0,
+    },
+  ];
+
+  public get spellLevel1(): Spell[] {
+    return this._spellLevel1;
+  }
+
+  public set spellLevel1(spells: Spell[]) {
+    this._spellLevel1 = spells;
+    console.log('spells updated from data service: ', this._spellLevel1);
+  }
+
+  private _spellLevel2: Spell[] = [
+    {
+      name: 'Feuerball',
+      level: 2,
+      cost: 'action',
+      canRitual: false,
+      needsVerbal: true,
+      needsSomatic: true,
+      needsMaterial: true,
+      needsConcentration: false,
+      needsSavingThrow: true,
+      needsAttackRoll: false,
+      savingThrowAttribute: 'dexterity',
+      school: 'evocation',
+      doesDamage: true,
+      damage: [
+        { diceNumber: '8', diceType: 'd6', damageType: 'fire' },
+        { diceNumber: '8', diceType: 'd6', damageType: 'fire' },
+      ],
+      doesHeal: false,
+      heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
+      isRanged: true,
+      description:
+        'Ein heller Strahl schießt von deinem Zeigefinger zu einem von dir gewählten Punkt in Reichweite und blüht dann mit einem tiefen Brüllen zu einer Flammenexplosion auf. Jede Kreatur in einem Umkreis von 6 Metern um diesen Punkt muss einen Rettungswurf auf Geschicklichkeit machen. Bei einem misslungenen Rettungswurf erleidet das Ziel 8W6 Feuerschaden, bei einem erfolgreichen Wurf die Hälfte des Schadens. Das Feuer breitet sich um Ecken aus. Es entzündet brennbare Gegenstände in der Umgebung, die nicht getragen werden. Wenn du diesen Zauber mit einem Zauberplatz des 4. Grades oder höher wirkst, erhöht sich der Schaden um 1W6 für jeden Grad über dem 3.',
+      range: 150,
+      hasAreaOfEffect: true,
+      radius: 20,
+      areaOfEffectType: 'sphere',
+    },
+    {
+      name: 'Vampiric Touch',
+      level: 3,
+      cost: 'action',
+      canRitual: false,
+      needsVerbal: true,
+      needsSomatic: true,
+      needsMaterial: false,
+      needsConcentration: true,
+      needsSavingThrow: false,
+      needsAttackRoll: true,
+      doesDamage: true,
+      damage: [{ diceNumber: '3', diceType: 'd6', damageType: 'necrotic' }],
+      doesHeal: false,
+      heal: { diceNumber: '', diceType: '', additionalHeal: 0 },
+      description:
+        'Die Berührung deiner schattenumrankten Hand kann anderen die Lebenskraft entziehen, um deine Wunden zu heilen. Führe einen Nahkampf-Zauberangriff gegen eine Kreatur in deiner Reichweite aus. Bei einem Treffer erleidet das Ziel 3W6 nekrotischen Schaden, und du erhältst Trefferpunkte in Höhe der Hälfte des zugefügten nekrotischen Schadens zurück. Bis der Zauber endet, kannst du den Angriff in jeder deiner Runden als Aktion wiederholen. Wenn du diesen Zauber mit einem Zauberplatz des 4. Grades oder höher wirkst, erhöht sich der Schaden um 1W6 für jeden Grad über dem 3.',
+      school: 'necromancy',
+      isRanged: false,
+      range: 5,
+      hasAreaOfEffect: false,
+      areaOfEffectType: '',
+      radius: 0,
+    },
+  ];
+
+  public get spellLevel2(): Spell[] {
+    return this._spellLevel2;
+  }
+
+  public set spellLevel2(spells: Spell[]) {
+    this._spellLevel2 = spells;
+    console.log('spells updated from data service: ', this._spellLevel2);
   }
 
   private abilities: Ability[] = [

+ 1 - 0
src/styles.scss

@@ -68,6 +68,7 @@ $dialog-position-right: 20%;
     ::-webkit-scrollbar {
         width: 0.5rem;
         margin: 0.125rem 0;
+        height: 0.5rem;
 
     }