diff --git a/04_browser-api/uebungen/o02_website-with-plugins/README.md b/04_browser-api/uebungen/o02_website-with-plugins/README.md index 6b78232..9caf630 100644 --- a/04_browser-api/uebungen/o02_website-with-plugins/README.md +++ b/04_browser-api/uebungen/o02_website-with-plugins/README.md @@ -2,8 +2,8 @@ ## 1. Optimierung vom ProduktManager -- 1. Positionen sollen an die API gesendet werden und gespeichert werden. -- 2. Refactoring vom Modul +1. Positionen sollen an die API gesendet werden und gespeichert werden. +2. Refactoring vom Modul: - Optimierung der Übergabeparameter: Element oder Selector (CSS Selektion als String) kann übergeben werden. Tipp: `module instanceof HTMLElement` - Die Wiederholungen der Fetch Anfragen in eine `api.request` Methode zusammenfassen diff --git a/04_browser-api/uebungen/o02_website-with-plugins/README.pdf b/04_browser-api/uebungen/o02_website-with-plugins/README.pdf index fdc8bf8..15e9d7d 100644 Binary files a/04_browser-api/uebungen/o02_website-with-plugins/README.pdf and b/04_browser-api/uebungen/o02_website-with-plugins/README.pdf differ diff --git a/05_typescript/.vscode/extensions.json b/05_typescript/.vscode/extensions.json new file mode 100644 index 0000000..bb659e6 --- /dev/null +++ b/05_typescript/.vscode/extensions.json @@ -0,0 +1,15 @@ +{ + "recommendations": [ + "kamikillerto.vscode-colorize", + "sleistner.vscode-fileutils", + "bierner.github-markdown-preview", + "bradgashler.htmltagwrap", + "zhuangtongfa.material-theme", + "techer.open-in-browser", + "esbenp.prettier-vscode", + "pdconsec.vscode-print", + "vscode-icons-team.vscode-icons", + "formulahendry.auto-rename-tag", + "tomoki1207.pdf" + ] +} diff --git a/05_typescript/.vscode/marp-theme.css b/05_typescript/.vscode/marp-theme.css new file mode 100644 index 0000000..90ea8da --- /dev/null +++ b/05_typescript/.vscode/marp-theme.css @@ -0,0 +1,332 @@ +/* @theme marp-theme */ + +@charset "UTF-8"; +/*! + * Marp Dracula theme. + * @theme marp-theme + * @author Daniel Nicolas Gisolfi & modified by Philippe Botzek + * + * @auto-scaling true + * @size 4:3 960px 720px + * @size 16:9 1280px 720px + */ + +@import url('https://fonts.googleapis.com/css?family=Lato:400,900|IBM+Plex+Sans:400,700'); + +:root { + --dracula-background: #282a36; + --dracula-current-line: #44475a; + --dracula-foreground: #f8f8f2; + --dracula-comment: #6272a4; + --dracula-cyan: #8be9fd; + --dracula-green: #50fa7b; + --dracula-orange: #ffb86c; + --dracula-pink: #ff79c6; + --dracula-purple: #bd93f9; + --dracula-red: #ff5555; + --dracula-yellow: #f1fa8c; +} + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: var(--dracula-background); +} + +/* Dracula Foreground */ +.hljs, +.hljs-subst, +.hljs-typing, +.hljs-variable, +.hljs-template-variable { + color: var(--dracula-foreground); +} + +/* Dracula Comment */ +.hljs-comment, +.hljs-quote, +.hljs-deletion { + color: var(--dracula-comment); +} + +/* Dracula Cyan */ +.hljs-meta .hljs-doctag, +.hljs-built_in, +.hljs-selector-tag, +.hljs-section, +.hljs-link, +.hljs-class { + color: var(--dracula-cyan); +} + +/* Dracula Green */ +.hljs-title { + color: var(--dracula-green); +} + +/* Dracula Orange */ +.hljs-params { + color: var(--dracula-orange); +} + +/* Dracula Pink */ +.hljs-keyword { + color: var(--dracula-pink); +} + +/* Dracula Purple */ +.hljs-literal, +.hljs-number { + color: var(--dracula-purple); +} + +/* Dracula Red */ +.hljs-regexp { + color: var(--dracula-red); +} + +/* Dracula Yellow */ +.hljs-string, +.hljs-name, +.hljs-type, +.hljs-attr, +.hljs-symbol, +.hljs-bullet, +.hljs-addition, +.hljs-template-tag { + color: var(--dracula-yellow); +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-title, +.hljs-section, +.hljs-doctag, +.hljs-type, +.hljs-name, +.hljs-strong { + font-weight: bold; +} + +.hljs-params, +.hljs-emphasis { + font-style: italic; +} + +svg[data-marp-fitting='svg'] { + max-height: 580px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0.5em 0 0 0; + color: var(--dracula-pink); +} +h1 strong, +h2 strong, +h3 strong, +h4 strong, +h5 strong, +h6 strong { + font-weight: inherit; +} + +h1 { + font-size: 1.8em; +} + +h2 { + font-size: 1.5em; +} + +h3 { + font-size: 1.3em; +} + +h4 { + font-size: 1.1em; +} + +h5 { + font-size: 1em; +} + +h6 { + font-size: 0.9em; +} + +p, +blockquote { + margin: 1em 0 0 0; +} + +ul > li, +ol > li { + margin: 0.3em 0 0 0; + color: var(--dracula-cyan); +} +ul > li > p, +ol > li > p { + margin: 0.6em 0 0 0; +} + +code { + display: inline-block; + font-family: 'IBM Plex Mono', monospace; + font-size: 0.8em; + letter-spacing: 0; + margin: -0.1em 0.15em; + padding: 0.1em 0.2em; + vertical-align: baseline; + color: var(--dracula-green); +} + +pre { + display: block; + margin: 1em 0 0 0; + min-height: 1em; + overflow: visible; +} +pre code { + box-sizing: border-box; + margin: 0; + min-width: 100%; + padding: 0.5em; + font-size: 0.7em; +} +pre code svg[data-marp-fitting='svg'] { + max-height: calc(580px - 1em); +} + +blockquote { + margin: 1em 0 0 0; + padding: 0 1em; + position: relative; + color: var(--dracula-orange); +} +blockquote::after, +blockquote::before { + content: '“'; + display: block; + font-family: 'Times New Roman', serif; + font-weight: bold; + position: absolute; + color: var(--dracula-green); +} +blockquote::before { + top: 0; + left: 0; +} +blockquote::after { + right: 0; + bottom: 0; + transform: rotate(180deg); +} +blockquote > *:first-child { + margin-top: 0; +} + +mark { + background: transparent; +} + +table { + border-spacing: 0; + border-collapse: collapse; + margin: 1em 0 0 0; +} +table th, +table td { + padding: 0.2em 0.4em; + border-width: 1px; + border-style: solid; +} + +section { + font-size: 35px; + font-family: 'IBM Plex Sans'; + line-height: 1.35; + letter-spacing: 1.25px; + padding: 70px; + color: var(--dracula-foreground); + background-color: var(--dracula-background); +} +section > *:first-child, +section > header:first-child + * { + margin-top: 0; +} +section a, +section mark { + color: var(--dracula-red); +} +section code { + background: var(--dracula-current-line); + color: var(--dracula-current-green); +} +section h1 strong, +section h2 strong, +section h3 strong, +section h4 strong, +section h5 strong, +section h6 strong { + color: var(--dracula-current-line); +} +section pre > code { + background: var(--dracula-current-line); +} +section header, +section footer, +section section::after, +section blockquote::before, +section blockquote::after { + color: var(--dracula-comment); +} +section table th, +section table td { + border-color: var(--dracula-current-line); +} +section table thead th { + background: var(--dracula-current-line); + color: var(--dracula-yellow); +} +section table tbody > tr:nth-child(even) td, +section table tbody > tr:nth-child(even) th { + background: var(--dracula-current-line); +} + +header, +footer, +section::after { + box-sizing: border-box; + font-size: 66%; + height: 70px; + line-height: 50px; + overflow: hidden; + padding: 10px 25px; + position: absolute; + color: var(--dracula-comment); +} + +header { + left: 0; + right: 0; + top: 0; +} + +footer { + left: 0; + right: 0; + bottom: 0; +} + +section::after { + right: 0; + bottom: 0; + font-size: 80%; +} diff --git a/05_typescript/.vscode/settings.json b/05_typescript/.vscode/settings.json new file mode 100644 index 0000000..5035cdb --- /dev/null +++ b/05_typescript/.vscode/settings.json @@ -0,0 +1,33 @@ +{ + "terminal.explorerKind": "external", + "terminal.external.osxExec": "iTerm.app", + "terminal.external.windowsExec": "wt.exe", + "workbench.iconTheme": "vscode-icons", + "workbench.colorTheme": "One Dark Pro", + "prettier.printWidth": 120, + "prettier.singleQuote": true, + "editor.hover.enabled": "on", + "editor.wordWrap": "on", + "explorer.confirmDelete": false, + "explorer.confirmDragAndDrop": false, + "editor.quickSuggestionsDelay": 600, + "editor.tabSize": 2, + "editor.formatOnSave": true, + "emmet.includeLanguages": { + "javascript": "javascriptreact", + "ejs": "html" + }, + "html.format.unformatted": "wbr,%", + "files.associations": { + "*.ejs": "html" + }, + "editor.fontFamily": "'MesloLGS NF', Hack, Consolas, 'Courier New', monospace", + "oneDarkPro.markdownStyle": false, + "explorer.compactFolders": false, + "workbench.editor.labelFormat": "short", + "editor.hover.delay": 800, + "editor.bracketPairColorization.enabled": true, + "editor.guides.bracketPairs": "active", + "markdown.marp.themes": ["./.vscode/marp-theme.css"], + "markdown-preview-github-styles.colorTheme": "light" +} diff --git a/05_typescript/.vscode/snippets.code-snippets b/05_typescript/.vscode/snippets.code-snippets new file mode 100644 index 0000000..259f93d --- /dev/null +++ b/05_typescript/.vscode/snippets.code-snippets @@ -0,0 +1,73 @@ +{ + "Output HTML Element": { + "scope": "html", + "prefix": "output", + "body": ["
"], + "description": "generate a div Element with output alert and alert secondary class" + }, + "Bootstrap html": { + "scope": "html", + "prefix": "!bs", + "body": [ + "", + "", + "\t", + "\t\t", + "\t\t", + "\t\t$0", + "\t\t", + "\t", + "\t", + "\t\t
", + "\t\t\t
", + "\t\t\t\t

$0

", + "\t\t\t
", + "\t\t
", + "\t\t", + "\t", + "" + ], + "description": "Generate HTML with Bootstrap CDN and script-tag" + }, + "$ und $$ helper function": { + "scope": "javascript,typescript", + "prefix": "$$$", + "body": [ + "const $ = (qs) => document.querySelector(qs);", + "const $$ = (qs) => Array.from(document.querySelectorAll(qs));" + ], + "description": "$ and $$ shorthand helper function" + }, + + "JavaScript Dateivorlage": { + "scope": "javascript,typescript", + "prefix": "vjs", + "body": [ + "'use strict';", + "", + "(() => {", + "", + "\t// === DOM & VARS =======", + "\tconst DOM = {};", + "", + "\t// === INIT =============", + "\tconst init = () => {", + "", + "\t}", + "", + "\t// === EVENTHANDLER =====", + "", + "\t// === XHR/FETCH ========", + "", + "\t// === FUNCTIONS ========", + "", + "\tinit();", + "", + "})();" + ], + "description": "JavaScript Dateivorlage" + } +} diff --git a/05_typescript/agenda.md b/05_typescript/agenda.md new file mode 100644 index 0000000..fab089e --- /dev/null +++ b/05_typescript/agenda.md @@ -0,0 +1,505 @@ +--- +marp: true +theme: default +--- + +## JavaScript Grundlagen Teil 1. + +--- + +#### Tag 01 + +**Inhalt:** + +- Vorstellungsrunde +- Einrichtung der IDE +- Tools für die Webentwicklung (Emmet, Markdown, VS-Code, Co-Pilot) +- Arbeiten mit VSCode +- Konsolenausgaben mit `console.log()` + +**Übungen:** + +- Übungen: 1 - 3, Content Factory + +--- + +#### Tag 02 + +**Inhalt:** + +- Dialogfenster in JS `prompt()`, `alert()`, `confirm()` +- Kommentare in JS +- Rechnen in JS +- Datentyp String, Number, Boolean +- literal und typeof +- Prioritätsreihenfolge + +**Übungen:** + +Übung 3 - 6 (Content-Factory bis 1.3.3) + +--- + +#### Tag 03 + +**Inhalt:** + +- Variablen und Konstanten in JS +- Zusammengesetzte Zuweisungsoperatoren +- Increment & Decrement +- Strings verketten mit + +- Escape-Notation +- Implizite und explizite Typkonvertierung + +**Übungen:** + +Übung 7 - 12 + +--- + +#### Tag 04 + +**Inhalt:** + +- Escape-Notation +- Implizite und explizite Typkonvertierung +- NaN - Paradoxon +- Math Object +- Number.toFixed() +- isNaN +- Lexikographische Vergleiche + +**Übungen:** + +Übung 14 - 18 + +--- + +#### Tag 05 + +**Inhalt:** + +- Repetition der Inhalte +- Relationale Operatoren & Vergleichoperatoren +- **Exkurs: Webseitenstruktur + SASS HTML-Formularfelder** +- 1:1 Meeting + +**Übungen:** + +Übung Kontaktformular mit HTML und BS, +Lektion 10 erarbeiten + +--- + +#### Tag 06 + +**Inhalt:** + +- **Exkurs: HTML Formularfelder mit BS** +- if else Verzweigung und ternärer Operator + +**Übungen:** + +Übung 19 - 21 + Kontaktformular + +--- + +#### Tag 07 + +**Inhalt:** + +- logische Operatoren UND und ODER +- unärer Operator (!) +- String Methoden +- Funktionen in JS + mit Übergabeparameter + mit Rückgabewerten + +**Übungen:** + +Übung 22 - 31 + +--- + +#### Tag 08 + +**Inhalt:** + +- Funktionen mit Rückgabewerten +- Guards, Restparameter, Defaulparameter +- Array Part 1 + +**Übungen:** + +Übung 32 - 38 + +--- + +#### Tag 09 + +**Inhalt:** + +- Array Methoden toSorted, toReversed, toSpliced +- toSorted, toReversed +- Array sort mit "compare function" +- Array: Higher Order Funktionen Part (sort map, forEach, reduce, some, every) + +**Übungen:** + +Übung 39 - 45 + optionale Übung + +--- + +#### Tag 10 + +**Inhalt:** + +- Array.find und Array.findIndex +- Alle Array Higher Order Funktionen im Überblick +- local scoping +- Git SCM und Windows Terminal einrichten + +**Übungen:** + +Übung 46 - 48 + +--- + +## JavaScript für Fortgeschrittene + +--- + +#### Tag 11 + +**Inhalt:** + +- **Exkurs: Schleifen** +- Einführung in JS für Fortgeschrittene +- Objekte in JS + +**Übungen:** + +Projektarbeit +Abschlussquiz - JS Grundlagen + +--- + +#### Tag 12 + +**Inhalt:** + +- Destructuring von Objekten und Arrays +- Rekursion + +**Übungen:** + +Übung 01 - 09 + +--- + +#### Tag 13 + +**Inhalt:** + +- Promises +- Callback-Hell +- Promise Aufbau +- Promise in Funktionen +- File System von Node +- commonjs vs esm + +**Übungen:** + +Übung 10 - 11 + +--- + +#### Tag 14 + +**Inhalt:** + +- util promisify +- Promise.all() +- async await +- Mehrdimensionale Arrays +- Chess-Beispiel + +**Übungen:** + +Übung 12 - 19 + +--- + +#### Tag 15 + +**Inhalt:** + +- Wiederholung der Inhalte +- Arbeiten mit Fetch API +- **Exkurs: Switch Case Abfragen** +- **Exkurs: Statische Webseite mit Sass und HTML** +- **Exkurs: Versionierung mit Github Part (SSH)** +- 1:1 Meeting + +**Übungen:** + +Übung 20 - 24 + +--- + +#### Tag 15 + +**Inhalt:** + +- Wiederholung der Inhalte +- Promise.all() +- **Exkurs: Switch Case Abfragen** +- **Exkurs: Statische Webseite mit Sass und HTML** +- 1:1 Meeting + +**Übungen:** + +Übung 20 - 24 + + +--- + +#### Tag 16 + +**Inhalt:** + +- **Exkurs: Statische Webseite mit Sass und HTML Part II** +- Node Module: HTTP-Server, npm-run-all und SVGO + +**Übungen:** + +Projektarbeit + Wetter API Key besorgen + +--- + +#### Tag 17 + +**Inhalt:** + +- XML-HttpRequest und AJAX mit jQuery +- Node Module für die Projekt-Entwicklungsumgebung +- Wetter API auslesen +- fetch in der Praxis: Joke API auslesen +- Was ist Node.js? (Wiederholung) + +**Übungen:** + +Projektarbeit +Übungen Public API auslesen + +--- + +#### Tag 18 + +**Inhalt:** + +- Node Standardbib (fs, zlib (stream), Crypto) +- Import vs. require (Teil II) +- NPM Befehle +- Abschluss von JS für Fortgeschrittene +- Projektvorstellung 1 + 2 JS Advanced + + +**Übungen:** + +Übungen 25 - 31 + +--- + +# JavaScript und das Document Object Model (DOM) + +--- + + +#### Tag 19 + +- Einführung in JS DOM +- DOM Selection (querySelector, querySelectorAll, $ & $$ Helper) +- CSS Selektoren +- Typ-, Attribut-, Kombinator- und Pseudoklassen - Selektoren + + +**Übungen:** + +Übungen 01 - 05 + +--- + +#### Tag 20 + +**Inhalt:** + +- Chat Gestaltung (DOMTokenList Objekt) +- Defer & Async +- JS Dateien auslagern +- Optimierung von Projektstruktur +- **Exkurs: Projektstruktur mit Gulp** + +**Übungen:** + +Übung 06 - 07 + +--- + +#### Tag 21 + +**Inhalt:** + +- **Exkurs: Projektstruktur mit Gulp Part II** +- Events in JS MouseEvent, KeyboardEvent +- Projekt: Newsboard + + +**Übungen:** + +Übung 08 - 9 + +--- + +#### Tag 22 + +**Inhalt:** + +- HTML Element Progress +- IDL-Attribut vs. Content-Attribut +- HTML Attribute mit boolescher Zuweisung +- Tooltip: HTML erweitern mit Data-Attribut +- Dataset Attribut, DOMStringMap Objekt +- getComputedStyle, Attribute mit boolscher Zuweisung + +**Übungen:** + +Übung 10 - 14 + +--- + +#### Tag 23 + +**Inhalt:** + +- DOM Creation - Elemente erstellen +- createElement() & appendChild() +- Projekt: Produktmanager Part I +- DOM Creation Befehle +- Entfernen von Elementen + +**Übungen:** + +Übung 15 - 17 +**Projektarbeit / Content Factory** + +--- + +#### Tag 24 + +**Inhalt:** + +- Import von Modulen in JS (Browserseitig) +- Separation of Concerns +- Projekt: Produktmanager final +- DOM Traversal Befehle & alle DOM Bereiche +- insertBefore(), appendChild(), append(), prepend(), before(), after() +- Refactoring von Produktmanager mit Template +- JS DOM Projektvorstellung + +**Übungen:** + +Übung 18 + optionale Übungen +**Projektarbeit / Content Factory** + +--- + +#### Tag 25 + +**Inhalt:** + +- **Exkurs: Weitere Events: Drag and Drop** +- **Rest API erstellen mit Express** +- **Exkurs: DOM Inhalte über REST API mit Express Part I** +- CRUD - Create - (Read) - Update - Delete +- **Routing in JS** +- Abschlussquiz JS DOM +- **1:1 Meeting** + +**Übungen:** + +Projekte + +--- + +## BROWSER API + +--- + +#### Tag 26 + +**Inhalt:** + +- **Exkurs: DOM Inhalte mit REST API Express** +- **Erweiterung Frontend um REST API** +- CRUD - (Create - Read) - Update - Delete +- BREAD - Browse - Read - Edit - Add - Delete +- Verwendung von Modulen (Modal von BS, Toastify, Splide) + +**Übungen** + +Projekte & optionale Übungen + +--- + +#### Tag 27 + +- **Exkurs: Vite vs Gulp** +- **SASS 7 on 1 mit Bootstrap 6** +- **Projektfinalisierung Express + REST API** +- Einführung in Typescript + + +--- + +### Tag 28 + +**Inhalt:** + +- Typescript Grundlagen +- Typescript Annotationen +- Typescript "more Types" + +**Übungen:** + +Übungen 1 - 5 + +--- + +### Tag 29 + +**Inhalt:** + +- Typescript Annotationen +- Primitive Types, Object, Union Types +- type statement vs interface +- Type Assertion with as and <> +- Typescript "more Types" + +**Übungen:** + +Übungen 4 - 9 + +--- + +### Tag 30 + +**Inhalt:** + +- Typescript "more Types" + - Interface, as statement, literale +- Typescript Narrowing with Guards + - truthiness, equality, in-operator, type-predicate +- TS Funktionen und Objekte + +**Übungen:** + +Übungen 10 - 19 diff --git a/04_browser-api/linksammlung.md b/05_typescript/linksammlung.md similarity index 100% rename from 04_browser-api/linksammlung.md rename to 05_typescript/linksammlung.md