├── .gitignore ├── Ch01 ├── 01_02 │ ├── tsconfig.json │ ├── src │ │ ├── model.ts │ │ ├── add-item │ │ │ ├── add-item.css │ │ │ ├── inventoryEditor.js │ │ │ ├── inventoryEditor.computer.js │ │ │ └── inventoryEditor.furniture.js │ │ ├── app.css │ │ ├── inventory │ │ │ ├── inventoryDetails.js │ │ │ ├── inventory.css │ │ │ ├── inventoryDetails.computer.js │ │ │ └── inventoryDetails.furniture.js │ │ └── Storage.js │ └── index.html ├── 01_03 │ ├── tsconfig.json │ ├── src │ │ ├── add-item │ │ │ ├── add-item.css │ │ │ ├── inventoryEditor.js │ │ │ ├── inventoryEditor.computer.js │ │ │ └── inventoryEditor.furniture.js │ │ ├── app.css │ │ ├── inventory │ │ │ ├── inventoryDetails.js │ │ │ ├── inventory.css │ │ │ ├── inventoryDetails.computer.js │ │ │ └── inventoryDetails.furniture.js │ │ ├── model.ts │ │ └── Storage.js │ └── index.html ├── 01_01_End │ ├── tsconfig.json │ ├── src │ │ ├── model.ts │ │ ├── add-item │ │ │ ├── add-item.css │ │ │ ├── inventoryEditor.js │ │ │ ├── inventoryEditor.computer.js │ │ │ └── inventoryEditor.furniture.js │ │ ├── app.css │ │ ├── inventory │ │ │ ├── inventoryDetails.js │ │ │ ├── inventory.css │ │ │ ├── inventoryDetails.computer.js │ │ │ └── inventoryDetails.furniture.js │ │ └── Storage.js │ └── index.html ├── 01_02_End │ ├── tsconfig.json │ ├── src │ │ ├── add-item │ │ │ ├── add-item.css │ │ │ ├── inventoryEditor.js │ │ │ ├── inventoryEditor.computer.js │ │ │ └── inventoryEditor.furniture.js │ │ ├── app.css │ │ ├── inventory │ │ │ ├── inventoryDetails.js │ │ │ ├── inventory.css │ │ │ ├── inventoryDetails.computer.js │ │ │ └── inventoryDetails.furniture.js │ │ ├── model.ts │ │ └── Storage.js │ └── index.html ├── 01_03_End │ ├── tsconfig.json │ ├── src │ │ ├── add-item │ │ │ ├── add-item.css │ │ │ ├── inventoryEditor.js │ │ │ ├── inventoryEditor.computer.js │ │ │ └── inventoryEditor.furniture.js │ │ ├── app.css │ │ ├── inventory │ │ │ ├── inventoryDetails.js │ │ │ ├── inventory.css │ │ │ ├── inventoryDetails.computer.js │ │ │ └── inventoryDetails.furniture.js │ │ ├── Storage.js │ │ └── model.ts │ └── index.html └── 01_01 │ ├── src │ ├── add-item │ │ ├── add-item.css │ │ ├── inventoryEditor.js │ │ ├── inventoryEditor.computer.js │ │ └── inventoryEditor.furniture.js │ ├── app.css │ ├── inventory │ │ ├── inventoryDetails.js │ │ ├── inventory.css │ │ ├── inventoryDetails.computer.js │ │ └── inventoryDetails.furniture.js │ └── Storage.js │ └── index.html ├── Ch02 ├── 02_01 │ ├── tsconfig.json │ ├── src │ │ ├── add-item │ │ │ ├── add-item.css │ │ │ ├── inventoryEditor.js │ │ │ ├── inventoryEditor.computer.js │ │ │ └── inventoryEditor.furniture.js │ │ ├── app.css │ │ ├── inventory │ │ │ ├── inventoryDetails.js │ │ │ ├── inventory.css │ │ │ ├── inventoryDetails.computer.js │ │ │ └── inventoryDetails.furniture.js │ │ ├── model.ts │ │ └── Storage.js │ └── index.html ├── 02_02 │ ├── tsconfig.json │ ├── src │ │ ├── add-item │ │ │ ├── add-item.css │ │ │ ├── inventoryEditor.js │ │ │ ├── inventoryEditor.computer.js │ │ │ └── inventoryEditor.furniture.js │ │ ├── app.css │ │ ├── inventory │ │ │ ├── inventoryDetails.js │ │ │ ├── inventory.css │ │ │ ├── inventoryDetails.computer.js │ │ │ └── inventoryDetails.furniture.js │ │ ├── Storage.js │ │ └── model.ts │ └── index.html ├── 02_03 │ ├── tsconfig.json │ ├── src │ │ ├── pages │ │ │ ├── addItem.css │ │ │ └── inventory.css │ │ ├── app.css │ │ ├── Storage.js │ │ └── model.ts │ └── index.html ├── 02_04 │ ├── tsconfig.json │ ├── src │ │ ├── pages │ │ │ ├── addItem.css │ │ │ └── inventory.css │ │ ├── app.css │ │ ├── Storage.js │ │ └── model.ts │ └── index.html ├── 02_01_End │ ├── tsconfig.json │ ├── src │ │ ├── add-item │ │ │ ├── add-item.css │ │ │ ├── inventoryEditor.js │ │ │ ├── inventoryEditor.computer.js │ │ │ └── inventoryEditor.furniture.js │ │ ├── app.css │ │ ├── inventory │ │ │ ├── inventoryDetails.js │ │ │ ├── inventory.css │ │ │ ├── inventoryDetails.computer.js │ │ │ └── inventoryDetails.furniture.js │ │ ├── Storage.js │ │ └── model.ts │ └── index.html ├── 02_02_End │ ├── tsconfig.json │ ├── src │ │ ├── pages │ │ │ ├── addItem.css │ │ │ └── inventory.css │ │ ├── app.css │ │ ├── Storage.js │ │ └── model.ts │ └── index.html ├── 02_03_End │ ├── tsconfig.json │ ├── src │ │ ├── pages │ │ │ ├── addItem.css │ │ │ └── inventory.css │ │ ├── app.css │ │ ├── Storage.js │ │ └── model.ts │ └── index.html └── 02_04_End │ ├── tsconfig.json │ ├── src │ ├── pages │ │ ├── addItem.css │ │ └── inventory.css │ ├── app.css │ ├── Storage.js │ └── model.ts │ └── index.html ├── Ch03 ├── 03_01 │ ├── tsconfig.json │ ├── src │ │ ├── pages │ │ │ ├── addItem.css │ │ │ └── inventory.css │ │ ├── app.css │ │ ├── Storage.js │ │ └── model.ts │ └── index.html ├── 03_02 │ ├── tsconfig.json │ ├── src │ │ ├── pages │ │ │ ├── addItem.css │ │ │ └── inventory.css │ │ ├── app.css │ │ ├── Storage.js │ │ └── model.ts │ └── index.html ├── 03_03 │ ├── tsconfig.json │ ├── src │ │ ├── pages │ │ │ ├── addItem.css │ │ │ └── inventory.css │ │ ├── app.css │ │ ├── Storage.js │ │ └── model.ts │ └── index.html ├── 03_01_End │ ├── tsconfig.json │ ├── src │ │ ├── pages │ │ │ ├── addItem.css │ │ │ └── inventory.css │ │ ├── app.css │ │ ├── Storage.js │ │ └── model.ts │ └── index.html ├── 03_02_End │ ├── tsconfig.json │ ├── src │ │ ├── pages │ │ │ ├── addItem.css │ │ │ └── inventory.css │ │ ├── app.css │ │ ├── Storage.js │ │ └── model.ts │ └── index.html └── 03_03_End │ ├── tsconfig.json │ ├── src │ ├── pages │ │ ├── addItem.css │ │ └── inventory.css │ ├── app.css │ ├── Storage.js │ └── model.ts │ └── index.html └── Ch04 ├── 04_01 ├── tsconfig.json ├── src │ ├── pages │ │ ├── addItem.css │ │ └── inventory.css │ ├── app.css │ ├── Storage.js │ └── model.ts └── index.html ├── 04_02 ├── tsconfig.json ├── src │ ├── pages │ │ ├── addItem.css │ │ └── inventory.css │ ├── app.css │ ├── Storage.js │ └── model.ts └── index.html ├── 04_01_End ├── tsconfig.json ├── src │ ├── pages │ │ ├── addItem.css │ │ └── inventory.css │ ├── app.css │ ├── Storage.js │ └── model.ts └── index.html ├── 04_03 ├── tsconfig.json ├── src │ ├── pages │ │ ├── addItem.css │ │ └── inventory.css │ ├── app.css │ ├── Storage.js │ └── model.ts └── index.html ├── 04_02_End ├── tsconfig.json ├── src │ ├── pages │ │ ├── addItem.css │ │ └── inventory.css │ ├── app.css │ ├── Storage.js │ └── model.ts └── index.html ├── 04_04 ├── tsconfig.json ├── src │ ├── pages │ │ ├── addItem.css │ │ └── inventory.css │ ├── app.css │ ├── Storage.js │ └── model.ts └── index.html ├── 04_03_End ├── tsconfig.json ├── src │ ├── pages │ │ ├── addItem.css │ │ └── inventory.css │ ├── app.css │ ├── Storage.js │ └── model.ts └── index.html └── 04_04_End ├── tsconfig.json ├── src ├── pages │ ├── addItem.css │ └── inventory.css ├── app.css └── Storage.js ├── node_modules └── @types │ ├── sizzle │ ├── README.md │ └── LICENSE │ └── jquery │ ├── LICENSE │ └── README.md ├── index.html └── package-lock.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /Ch01/01_02/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch01/01_03/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch02/02_01/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch02/02_02/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch02/02_03/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch02/02_04/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch03/03_01/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch03/03_02/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch03/03_03/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch04/04_01/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch04/04_02/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch01/01_01_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch01/01_02_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch01/01_03_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch02/02_01_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch02/02_02_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch02/02_03_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch02/02_04_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch03/03_01_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch03/03_02_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch03/03_03_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch04/04_01_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist" 5 | } 6 | } -------------------------------------------------------------------------------- /Ch04/04_03/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist", 5 | "allowJs": true, 6 | "checkJs": true 7 | } 8 | } -------------------------------------------------------------------------------- /Ch04/04_02_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist", 5 | "allowJs": true, 6 | "checkJs": true 7 | } 8 | } -------------------------------------------------------------------------------- /Ch04/04_04/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist", 5 | "allowJs": true, 6 | "checkJs": true, 7 | "lib": ["es2015.promise", "webworker", "dom"] 8 | } 9 | } -------------------------------------------------------------------------------- /Ch04/04_03_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist", 5 | "allowJs": true, 6 | "checkJs": true, 7 | "lib": ["es2015.promise", "webworker", "dom"] 8 | } 9 | } -------------------------------------------------------------------------------- /Ch04/04_04_End/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "outDir": "dist", 5 | "allowJs": true, 6 | "checkJs": true, 7 | "lib": ["es2015.promise", "webworker", "dom"] 8 | } 9 | } -------------------------------------------------------------------------------- /Ch01/01_02/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName = "Jess's standing desk"; 2 | let inventoryType = "furniture"; 3 | let trackingNumber = "FD123455"; 4 | let createDate = new Date(); 5 | let originalCost = 425; 6 | 7 | function getInventoryItem(trackingNumber) { 8 | 9 | } 10 | 11 | function saveInventoryItem(item) { 12 | 13 | } 14 | 15 | let inventoryItem = getInventoryItem(trackingNumber); 16 | 17 | inventoryItem.createDate = new Date(); 18 | 19 | saveInventoryItem(inventoryItem); -------------------------------------------------------------------------------- /Ch01/01_01_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName = "Jess's standing desk"; 2 | let inventoryType = "furniture"; 3 | let trackingNumber = "FD123455"; 4 | let createDate = new Date(); 5 | let originalCost = 425; 6 | 7 | function getInventoryItem(trackingNumber) { 8 | 9 | } 10 | 11 | function saveInventoryItem(item) { 12 | 13 | } 14 | 15 | let inventoryItem = getInventoryItem(trackingNumber); 16 | 17 | inventoryItem.createDate = new Date(); 18 | 19 | saveInventoryItem(inventoryItem); -------------------------------------------------------------------------------- /Ch01/01_01/src/add-item/add-item.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } 23 | -------------------------------------------------------------------------------- /Ch01/01_02/src/add-item/add-item.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } 23 | -------------------------------------------------------------------------------- /Ch01/01_03/src/add-item/add-item.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } 23 | -------------------------------------------------------------------------------- /Ch02/02_01/src/add-item/add-item.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } 23 | -------------------------------------------------------------------------------- /Ch02/02_02/src/add-item/add-item.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } 23 | -------------------------------------------------------------------------------- /Ch01/01_01_End/src/add-item/add-item.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } 23 | -------------------------------------------------------------------------------- /Ch01/01_02_End/src/add-item/add-item.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } 23 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/add-item/add-item.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } 23 | -------------------------------------------------------------------------------- /Ch02/02_01_End/src/add-item/add-item.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } 23 | -------------------------------------------------------------------------------- /Ch02/02_02_End/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch02/02_03/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch02/02_03_End/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch02/02_04/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch02/02_04_End/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch03/03_01/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch03/03_01_End/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch03/03_02/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch03/03_02_End/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch03/03_03/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch03/03_03_End/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch04/04_01/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch04/04_01_End/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch04/04_02/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch04/04_02_End/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch04/04_03/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch04/04_03_End/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch04/04_04/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch04/04_04_End/src/pages/addItem.css: -------------------------------------------------------------------------------- 1 | .form-container { 2 | position: relative; 3 | } 4 | 5 | .form-container form { 6 | padding: 2em; 7 | } 8 | 9 | .saving { 10 | position: absolute; 11 | z-index: 1000; 12 | display: flex; 13 | background-color: rgba(200, 200, 200, 0.6); 14 | width: 100%; 15 | height: 100%; 16 | align-items: center; 17 | justify-content: center; 18 | font-size: 200%; 19 | font-weight: bold; 20 | font-style: italic; 21 | border-radius: 10px; 22 | } -------------------------------------------------------------------------------- /Ch01/01_01/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("add-item/add-item.css"); 3 | @import url("inventory/inventory.css"); 4 | 5 | body { 6 | width: 80%; 7 | margin: auto; 8 | } 9 | 10 | #main-content { 11 | } 12 | 13 | .flex { 14 | display: flex; 15 | } 16 | .grow { 17 | flex-grow: 1; 18 | } 19 | 20 | .title { 21 | margin-bottom: 1em; 22 | } 23 | 24 | .loading { 25 | font-size: 150%; 26 | padding-top: 50%; 27 | text-align: center; 28 | } 29 | -------------------------------------------------------------------------------- /Ch01/01_01_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("add-item/add-item.css"); 3 | @import url("inventory/inventory.css"); 4 | 5 | body { 6 | width: 80%; 7 | margin: auto; 8 | } 9 | 10 | #main-content { 11 | } 12 | 13 | .flex { 14 | display: flex; 15 | } 16 | .grow { 17 | flex-grow: 1; 18 | } 19 | 20 | .title { 21 | margin-bottom: 1em; 22 | } 23 | 24 | .loading { 25 | font-size: 150%; 26 | padding-top: 50%; 27 | text-align: center; 28 | } 29 | -------------------------------------------------------------------------------- /Ch01/01_02/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("add-item/add-item.css"); 3 | @import url("inventory/inventory.css"); 4 | 5 | body { 6 | width: 80%; 7 | margin: auto; 8 | } 9 | 10 | #main-content { 11 | } 12 | 13 | .flex { 14 | display: flex; 15 | } 16 | .grow { 17 | flex-grow: 1; 18 | } 19 | 20 | .title { 21 | margin-bottom: 1em; 22 | } 23 | 24 | .loading { 25 | font-size: 150%; 26 | padding-top: 50%; 27 | text-align: center; 28 | } 29 | -------------------------------------------------------------------------------- /Ch01/01_02_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("add-item/add-item.css"); 3 | @import url("inventory/inventory.css"); 4 | 5 | body { 6 | width: 80%; 7 | margin: auto; 8 | } 9 | 10 | #main-content { 11 | } 12 | 13 | .flex { 14 | display: flex; 15 | } 16 | .grow { 17 | flex-grow: 1; 18 | } 19 | 20 | .title { 21 | margin-bottom: 1em; 22 | } 23 | 24 | .loading { 25 | font-size: 150%; 26 | padding-top: 50%; 27 | text-align: center; 28 | } 29 | -------------------------------------------------------------------------------- /Ch01/01_03/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("add-item/add-item.css"); 3 | @import url("inventory/inventory.css"); 4 | 5 | body { 6 | width: 80%; 7 | margin: auto; 8 | } 9 | 10 | #main-content { 11 | } 12 | 13 | .flex { 14 | display: flex; 15 | } 16 | .grow { 17 | flex-grow: 1; 18 | } 19 | 20 | .title { 21 | margin-bottom: 1em; 22 | } 23 | 24 | .loading { 25 | font-size: 150%; 26 | padding-top: 50%; 27 | text-align: center; 28 | } 29 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("add-item/add-item.css"); 3 | @import url("inventory/inventory.css"); 4 | 5 | body { 6 | width: 80%; 7 | margin: auto; 8 | } 9 | 10 | #main-content { 11 | } 12 | 13 | .flex { 14 | display: flex; 15 | } 16 | .grow { 17 | flex-grow: 1; 18 | } 19 | 20 | .title { 21 | margin-bottom: 1em; 22 | } 23 | 24 | .loading { 25 | font-size: 150%; 26 | padding-top: 50%; 27 | text-align: center; 28 | } 29 | -------------------------------------------------------------------------------- /Ch02/02_01/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("add-item/add-item.css"); 3 | @import url("inventory/inventory.css"); 4 | 5 | body { 6 | width: 80%; 7 | margin: auto; 8 | } 9 | 10 | #main-content { 11 | } 12 | 13 | .flex { 14 | display: flex; 15 | } 16 | .grow { 17 | flex-grow: 1; 18 | } 19 | 20 | .title { 21 | margin-bottom: 1em; 22 | } 23 | 24 | .loading { 25 | font-size: 150%; 26 | padding-top: 50%; 27 | text-align: center; 28 | } 29 | -------------------------------------------------------------------------------- /Ch02/02_01_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("add-item/add-item.css"); 3 | @import url("inventory/inventory.css"); 4 | 5 | body { 6 | width: 80%; 7 | margin: auto; 8 | } 9 | 10 | #main-content { 11 | } 12 | 13 | .flex { 14 | display: flex; 15 | } 16 | .grow { 17 | flex-grow: 1; 18 | } 19 | 20 | .title { 21 | margin-bottom: 1em; 22 | } 23 | 24 | .loading { 25 | font-size: 150%; 26 | padding-top: 50%; 27 | text-align: center; 28 | } 29 | -------------------------------------------------------------------------------- /Ch02/02_02/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("add-item/add-item.css"); 3 | @import url("inventory/inventory.css"); 4 | 5 | body { 6 | width: 80%; 7 | margin: auto; 8 | } 9 | 10 | #main-content { 11 | } 12 | 13 | .flex { 14 | display: flex; 15 | } 16 | .grow { 17 | flex-grow: 1; 18 | } 19 | 20 | .title { 21 | margin-bottom: 1em; 22 | } 23 | 24 | .loading { 25 | font-size: 150%; 26 | padding-top: 50%; 27 | text-align: center; 28 | } 29 | -------------------------------------------------------------------------------- /Ch04/04_04_End/node_modules/@types/sizzle/README.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | > `npm install --save @types/sizzle` 3 | 4 | # Summary 5 | This package contains type definitions for sizzle (https://sizzlejs.com). 6 | 7 | # Details 8 | Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/sizzle 9 | 10 | Additional Details 11 | * Last updated: Sat, 06 Oct 2018 20:51:02 GMT 12 | * Dependencies: none 13 | * Global values: Sizzle 14 | 15 | # Credits 16 | These definitions were written by Leonard Thieu . 17 | -------------------------------------------------------------------------------- /Ch02/02_03/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch02/02_04/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch03/03_01/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch03/03_02/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch03/03_03/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch04/04_01/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch04/04_02/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch04/04_03/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch04/04_04/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch02/02_02_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch02/02_03_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch02/02_04_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch03/03_01_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch03/03_02_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch03/03_03_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch04/04_01_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch04/04_02_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch04/04_03_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch04/04_04_End/src/app.css: -------------------------------------------------------------------------------- 1 | @import url("https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"); 2 | @import url("https://cdn.jsdelivr.net/gh/FortAwesome/Font-Awesome@5.8.1/css/all.min.css"); 3 | @import url("pages/addItem.css"); 4 | @import url("pages/inventory.css"); 5 | 6 | body { 7 | width: 80%; 8 | margin: auto; 9 | } 10 | 11 | .flex { 12 | display: flex; 13 | } 14 | .grow { 15 | flex-grow: 1; 16 | } 17 | 18 | .title { 19 | margin-bottom: 1em; 20 | } 21 | 22 | .loading { 23 | font-size: 150%; 24 | padding-top: 40%; 25 | text-align: center; 26 | } 27 | -------------------------------------------------------------------------------- /Ch01/01_01/src/add-item/inventoryEditor.js: -------------------------------------------------------------------------------- 1 | import computerEditor from "./inventoryEditor.computer.js"; 2 | import furnitureEditor from "./inventoryEditor.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item", "category"], 6 | render(createEditor) { 7 | let editor = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | editor = computerEditor; 12 | break; 13 | 14 | case "furniture": 15 | editor = furnitureEditor; 16 | break; 17 | } 18 | 19 | return createEditor(editor, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_01/src/inventory/inventoryDetails.js: -------------------------------------------------------------------------------- 1 | import computerDetails from "./inventoryDetails.computer.js"; 2 | import furnitureDetails from "./inventoryDetails.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item"], 6 | render(createDetails) { 7 | let details = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | details = computerDetails; 12 | break; 13 | 14 | case "furniture": 15 | details = furnitureDetails; 16 | break; 17 | } 18 | 19 | return createDetails(details, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_02/src/add-item/inventoryEditor.js: -------------------------------------------------------------------------------- 1 | import computerEditor from "./inventoryEditor.computer.js"; 2 | import furnitureEditor from "./inventoryEditor.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item", "category"], 6 | render(createEditor) { 7 | let editor = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | editor = computerEditor; 12 | break; 13 | 14 | case "furniture": 15 | editor = furnitureEditor; 16 | break; 17 | } 18 | 19 | return createEditor(editor, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_02/src/inventory/inventoryDetails.js: -------------------------------------------------------------------------------- 1 | import computerDetails from "./inventoryDetails.computer.js"; 2 | import furnitureDetails from "./inventoryDetails.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item"], 6 | render(createDetails) { 7 | let details = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | details = computerDetails; 12 | break; 13 | 14 | case "furniture": 15 | details = furnitureDetails; 16 | break; 17 | } 18 | 19 | return createDetails(details, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_03/src/add-item/inventoryEditor.js: -------------------------------------------------------------------------------- 1 | import computerEditor from "./inventoryEditor.computer.js"; 2 | import furnitureEditor from "./inventoryEditor.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item", "category"], 6 | render(createEditor) { 7 | let editor = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | editor = computerEditor; 12 | break; 13 | 14 | case "furniture": 15 | editor = furnitureEditor; 16 | break; 17 | } 18 | 19 | return createEditor(editor, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_03/src/inventory/inventoryDetails.js: -------------------------------------------------------------------------------- 1 | import computerDetails from "./inventoryDetails.computer.js"; 2 | import furnitureDetails from "./inventoryDetails.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item"], 6 | render(createDetails) { 7 | let details = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | details = computerDetails; 12 | break; 13 | 14 | case "furniture": 15 | details = furnitureDetails; 16 | break; 17 | } 18 | 19 | return createDetails(details, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch02/02_01/src/add-item/inventoryEditor.js: -------------------------------------------------------------------------------- 1 | import computerEditor from "./inventoryEditor.computer.js"; 2 | import furnitureEditor from "./inventoryEditor.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item", "category"], 6 | render(createEditor) { 7 | let editor = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | editor = computerEditor; 12 | break; 13 | 14 | case "furniture": 15 | editor = furnitureEditor; 16 | break; 17 | } 18 | 19 | return createEditor(editor, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch02/02_01/src/inventory/inventoryDetails.js: -------------------------------------------------------------------------------- 1 | import computerDetails from "./inventoryDetails.computer.js"; 2 | import furnitureDetails from "./inventoryDetails.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item"], 6 | render(createDetails) { 7 | let details = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | details = computerDetails; 12 | break; 13 | 14 | case "furniture": 15 | details = furnitureDetails; 16 | break; 17 | } 18 | 19 | return createDetails(details, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch02/02_02/src/add-item/inventoryEditor.js: -------------------------------------------------------------------------------- 1 | import computerEditor from "./inventoryEditor.computer.js"; 2 | import furnitureEditor from "./inventoryEditor.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item", "category"], 6 | render(createEditor) { 7 | let editor = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | editor = computerEditor; 12 | break; 13 | 14 | case "furniture": 15 | editor = furnitureEditor; 16 | break; 17 | } 18 | 19 | return createEditor(editor, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch02/02_02/src/inventory/inventoryDetails.js: -------------------------------------------------------------------------------- 1 | import computerDetails from "./inventoryDetails.computer.js"; 2 | import furnitureDetails from "./inventoryDetails.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item"], 6 | render(createDetails) { 7 | let details = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | details = computerDetails; 12 | break; 13 | 14 | case "furniture": 15 | details = furnitureDetails; 16 | break; 17 | } 18 | 19 | return createDetails(details, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_01_End/src/add-item/inventoryEditor.js: -------------------------------------------------------------------------------- 1 | import computerEditor from "./inventoryEditor.computer.js"; 2 | import furnitureEditor from "./inventoryEditor.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item", "category"], 6 | render(createEditor) { 7 | let editor = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | editor = computerEditor; 12 | break; 13 | 14 | case "furniture": 15 | editor = furnitureEditor; 16 | break; 17 | } 18 | 19 | return createEditor(editor, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_01_End/src/inventory/inventoryDetails.js: -------------------------------------------------------------------------------- 1 | import computerDetails from "./inventoryDetails.computer.js"; 2 | import furnitureDetails from "./inventoryDetails.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item"], 6 | render(createDetails) { 7 | let details = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | details = computerDetails; 12 | break; 13 | 14 | case "furniture": 15 | details = furnitureDetails; 16 | break; 17 | } 18 | 19 | return createDetails(details, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_02_End/src/add-item/inventoryEditor.js: -------------------------------------------------------------------------------- 1 | import computerEditor from "./inventoryEditor.computer.js"; 2 | import furnitureEditor from "./inventoryEditor.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item", "category"], 6 | render(createEditor) { 7 | let editor = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | editor = computerEditor; 12 | break; 13 | 14 | case "furniture": 15 | editor = furnitureEditor; 16 | break; 17 | } 18 | 19 | return createEditor(editor, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_02_End/src/inventory/inventoryDetails.js: -------------------------------------------------------------------------------- 1 | import computerDetails from "./inventoryDetails.computer.js"; 2 | import furnitureDetails from "./inventoryDetails.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item"], 6 | render(createDetails) { 7 | let details = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | details = computerDetails; 12 | break; 13 | 14 | case "furniture": 15 | details = furnitureDetails; 16 | break; 17 | } 18 | 19 | return createDetails(details, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/add-item/inventoryEditor.js: -------------------------------------------------------------------------------- 1 | import computerEditor from "./inventoryEditor.computer.js"; 2 | import furnitureEditor from "./inventoryEditor.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item", "category"], 6 | render(createEditor) { 7 | let editor = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | editor = computerEditor; 12 | break; 13 | 14 | case "furniture": 15 | editor = furnitureEditor; 16 | break; 17 | } 18 | 19 | return createEditor(editor, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/inventory/inventoryDetails.js: -------------------------------------------------------------------------------- 1 | import computerDetails from "./inventoryDetails.computer.js"; 2 | import furnitureDetails from "./inventoryDetails.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item"], 6 | render(createDetails) { 7 | let details = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | details = computerDetails; 12 | break; 13 | 14 | case "furniture": 15 | details = furnitureDetails; 16 | break; 17 | } 18 | 19 | return createDetails(details, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch02/02_01_End/src/add-item/inventoryEditor.js: -------------------------------------------------------------------------------- 1 | import computerEditor from "./inventoryEditor.computer.js"; 2 | import furnitureEditor from "./inventoryEditor.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item", "category"], 6 | render(createEditor) { 7 | let editor = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | editor = computerEditor; 12 | break; 13 | 14 | case "furniture": 15 | editor = furnitureEditor; 16 | break; 17 | } 18 | 19 | return createEditor(editor, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch02/02_01_End/src/inventory/inventoryDetails.js: -------------------------------------------------------------------------------- 1 | import computerDetails from "./inventoryDetails.computer.js"; 2 | import furnitureDetails from "./inventoryDetails.furniture.js"; 3 | 4 | export default Vue.extend({ 5 | props: ["item"], 6 | render(createDetails) { 7 | let details = null; 8 | 9 | switch (this.item.inventoryType) { 10 | case "computer": 11 | details = computerDetails; 12 | break; 13 | 14 | case "furniture": 15 | details = furnitureDetails; 16 | break; 17 | } 18 | 19 | return createDetails(details, { props: this.$props }); 20 | } 21 | }); 22 | -------------------------------------------------------------------------------- /Ch02/02_02_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch02/02_03/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch02/02_03_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch02/02_04/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch02/02_04_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch03/03_01/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch03/03_01_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch03/03_02/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch03/03_02_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch03/03_03/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch03/03_03_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch04/04_01/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch04/04_01_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch04/04_02/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch04/04_02_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch04/04_03/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch04/04_03_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch04/04_04/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch04/04_04_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Ch01/01_03/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | let originalCost: number = 425; 6 | 7 | function getInventoryItem(trackingNumber: string): { 8 | displayName: string; 9 | inventoryType: string; 10 | trackingNumber: string; 11 | createDate: Date; 12 | originalCost: number; 13 | } { 14 | return null; 15 | } 16 | 17 | function saveInventoryItem(item) { 18 | 19 | } 20 | 21 | let inventoryItem = getInventoryItem(trackingNumber); 22 | 23 | inventoryItem.createDate = new Date(); 24 | 25 | saveInventoryItem(inventoryItem); -------------------------------------------------------------------------------- /Ch01/01_02_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | let originalCost: number = 425; 6 | 7 | function getInventoryItem(trackingNumber: string): { 8 | displayName: string; 9 | inventoryType: string; 10 | trackingNumber: string; 11 | createDate: Date; 12 | originalCost: number; 13 | } { 14 | return null; 15 | } 16 | 17 | function saveInventoryItem(item) { 18 | 19 | } 20 | 21 | let inventoryItem = getInventoryItem(trackingNumber); 22 | 23 | inventoryItem.createDate = new Date(); 24 | 25 | saveInventoryItem(inventoryItem); -------------------------------------------------------------------------------- /Ch02/02_01/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | let originalCost = 425; 6 | 7 | function getInventoryItem(trackingNumber: string): { 8 | displayName: string; 9 | inventoryType: string; 10 | trackingNumber: string; 11 | createDate: Date; 12 | originalCost: number; 13 | } { 14 | return null; 15 | } 16 | 17 | function saveInventoryItem(item) { 18 | 19 | } 20 | 21 | let inventoryItem = getInventoryItem(trackingNumber); 22 | 23 | let updatedInventoryItem = inventoryItem; 24 | 25 | inventoryItem.createDate = new Date(); 26 | 27 | saveInventoryItem(inventoryItem); -------------------------------------------------------------------------------- /Ch04/04_04_End/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "@types/jquery": { 6 | "version": "3.3.29", 7 | "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.29.tgz", 8 | "integrity": "sha512-FhJvBninYD36v3k6c+bVk1DSZwh7B5Dpb/Pyk3HKVsiohn0nhbefZZ+3JXbWQhFyt0MxSl2jRDdGQPHeOHFXrQ==", 9 | "requires": { 10 | "@types/sizzle": "*" 11 | } 12 | }, 13 | "@types/sizzle": { 14 | "version": "2.3.2", 15 | "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", 16 | "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Ch01/01_01/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch01/01_02/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch01/01_03/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch02/02_01/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch02/02_02/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch02/02_03/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch02/02_04/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch03/03_01/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch03/03_02/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch03/03_03/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch04/04_01/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch04/04_02/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch04/04_03/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch04/04_04/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch01/01_01_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch01/01_02_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch02/02_01_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch02/02_02_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch02/02_03_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch02/02_04_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch03/03_01_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch03/03_02_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch03/03_03_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch04/04_01_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch04/04_02_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch04/04_03_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch04/04_04_End/src/Storage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Retrieves data from storage 3 | */ 4 | function getFromStorage(key) { 5 | return __delay(() => { 6 | const serialized = localStorage.getItem(key) || ""; 7 | return JSON.parse(serialized); 8 | }); 9 | } 10 | 11 | /** 12 | * Save data to storage 13 | */ 14 | function saveToStorage(key, data) { 15 | return __delay(() => { 16 | const serialized = JSON.stringify(data); 17 | localStorage.setItem(key, serialized); 18 | }); 19 | } 20 | 21 | /** helper function to introduce a random delay to simulate network conditions */ 22 | function __delay(action) { 23 | return new Promise(done => { 24 | setTimeout( 25 | () => done(action()), 26 | Math.random() * 2000 // delay from 0-2 seconds 27 | ); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | let originalCost: any = 425; 6 | originalCost = "A LOT of money!"; 7 | 8 | function getInventoryItem(trackingNumber: string): { 9 | displayName: string; 10 | inventoryType: string; 11 | trackingNumber: string; 12 | createDate: Date; 13 | originalCost: number; 14 | } { 15 | return null; 16 | } 17 | 18 | function saveInventoryItem(item) { 19 | 20 | } 21 | 22 | let inventoryItem = getInventoryItem(trackingNumber); 23 | 24 | let updatedInventoryItem = inventoryItem; 25 | 26 | inventoryItem.createDate = new Date(); 27 | 28 | saveInventoryItem(inventoryItem); -------------------------------------------------------------------------------- /Ch02/02_02/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | let originalCost = 425; 6 | 7 | interface InventoryItem { 8 | displayName: string; 9 | inventoryType: string; 10 | trackingNumber: string; 11 | createDate: Date; 12 | originalCost: number; 13 | } 14 | 15 | function getInventoryItem(trackingNumber: string): InventoryItem { 16 | return null; 17 | } 18 | 19 | function saveInventoryItem(item: InventoryItem) { 20 | 21 | } 22 | 23 | let inventoryItem = getInventoryItem(trackingNumber); 24 | 25 | let updatedInventoryItem = inventoryItem; 26 | 27 | inventoryItem.createDate = new Date(); 28 | 29 | saveInventoryItem(inventoryItem); -------------------------------------------------------------------------------- /Ch02/02_01_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | let originalCost = 425; 6 | 7 | interface InventoryItem { 8 | displayName: string; 9 | inventoryType: string; 10 | trackingNumber: string; 11 | createDate: Date; 12 | originalCost: number; 13 | } 14 | 15 | function getInventoryItem(trackingNumber: string): InventoryItem { 16 | return null; 17 | } 18 | 19 | function saveInventoryItem(item: InventoryItem) { 20 | 21 | } 22 | 23 | let inventoryItem = getInventoryItem(trackingNumber); 24 | 25 | let updatedInventoryItem = inventoryItem; 26 | 27 | inventoryItem.createDate = new Date(); 28 | 29 | saveInventoryItem(inventoryItem); -------------------------------------------------------------------------------- /Ch01/01_01/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Ch01/01_02/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Ch01/01_03/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Ch02/02_01/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Ch02/02_02/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Ch01/01_01_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Ch01/01_02_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Ch01/01_03_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Ch02/02_01_End/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Professional Inventory System 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Ch01/01_01/src/inventory/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch01/01_02/src/inventory/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch01/01_03/src/inventory/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch02/02_01/src/inventory/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch02/02_02/src/inventory/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch01/01_01_End/src/inventory/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch01/01_02_End/src/inventory/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/inventory/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch02/02_01_End/src/inventory/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch02/02_02_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | let originalCost = 425; 6 | 7 | interface InventoryItem { 8 | displayName: string; 9 | inventoryType: string; 10 | readonly trackingNumber: string; 11 | createDate: Date; 12 | originalCost?: number; 13 | 14 | addNote?: (note: string) => string; 15 | } 16 | 17 | function getInventoryItem(trackingNumber: string): InventoryItem { 18 | return null; 19 | } 20 | 21 | function saveInventoryItem(item: InventoryItem) { 22 | } 23 | 24 | let inventoryItem = getInventoryItem(trackingNumber); 25 | 26 | let updatedInventoryItem = inventoryItem; 27 | 28 | inventoryItem.createDate = new Date(); 29 | 30 | saveInventoryItem({ 31 | displayName: "MacBook Pro 15 Retina", 32 | inventoryType: "computer", 33 | trackingNumber: "MBP123456", 34 | createDate: new Date(), 35 | }); -------------------------------------------------------------------------------- /Ch02/02_03/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | let originalCost = 425; 6 | 7 | interface InventoryItem { 8 | displayName: string; 9 | inventoryType: string; 10 | readonly trackingNumber: string; 11 | createDate: Date; 12 | originalCost?: number; 13 | 14 | addNote?: (note: string) => string; 15 | } 16 | 17 | function getInventoryItem(trackingNumber: string): InventoryItem { 18 | return null; 19 | } 20 | 21 | function saveInventoryItem(item: InventoryItem) { 22 | } 23 | 24 | let inventoryItem = getInventoryItem(trackingNumber); 25 | 26 | let updatedInventoryItem = inventoryItem; 27 | 28 | inventoryItem.createDate = new Date(); 29 | 30 | saveInventoryItem({ 31 | displayName: "MacBook Pro 15 Retina", 32 | inventoryType: "computer", 33 | trackingNumber: "MBP123456", 34 | createDate: new Date(), 35 | }); -------------------------------------------------------------------------------- /Ch01/01_01/src/inventory/inventoryDetails.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 | 10 |
11 | 12 | {{item.assignedTo}} 13 |
14 | 15 |
16 | 17 | {{item.brand}} 18 |
19 | 20 |
21 | 22 | {{item.serialNumber}} 23 |
24 | 25 |
26 | 27 | {{item.year}} {{item.model}} 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch01/01_01_End/src/inventory/inventoryDetails.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 | 10 |
11 | 12 | {{item.assignedTo}} 13 |
14 | 15 |
16 | 17 | {{item.brand}} 18 |
19 | 20 |
21 | 22 | {{item.serialNumber}} 23 |
24 | 25 |
26 | 27 | {{item.year}} {{item.model}} 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch01/01_02/src/inventory/inventoryDetails.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 | 10 |
11 | 12 | {{item.assignedTo}} 13 |
14 | 15 |
16 | 17 | {{item.brand}} 18 |
19 | 20 |
21 | 22 | {{item.serialNumber}} 23 |
24 | 25 |
26 | 27 | {{item.year}} {{item.model}} 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch01/01_02_End/src/inventory/inventoryDetails.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 | 10 |
11 | 12 | {{item.assignedTo}} 13 |
14 | 15 |
16 | 17 | {{item.brand}} 18 |
19 | 20 |
21 | 22 | {{item.serialNumber}} 23 |
24 | 25 |
26 | 27 | {{item.year}} {{item.model}} 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch01/01_03/src/inventory/inventoryDetails.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 | 10 |
11 | 12 | {{item.assignedTo}} 13 |
14 | 15 |
16 | 17 | {{item.brand}} 18 |
19 | 20 |
21 | 22 | {{item.serialNumber}} 23 |
24 | 25 |
26 | 27 | {{item.year}} {{item.model}} 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/inventory/inventoryDetails.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 | 10 |
11 | 12 | {{item.assignedTo}} 13 |
14 | 15 |
16 | 17 | {{item.brand}} 18 |
19 | 20 |
21 | 22 | {{item.serialNumber}} 23 |
24 | 25 |
26 | 27 | {{item.year}} {{item.model}} 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch02/02_01/src/inventory/inventoryDetails.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 | 10 |
11 | 12 | {{item.assignedTo}} 13 |
14 | 15 |
16 | 17 | {{item.brand}} 18 |
19 | 20 |
21 | 22 | {{item.serialNumber}} 23 |
24 | 25 |
26 | 27 | {{item.year}} {{item.model}} 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch02/02_01_End/src/inventory/inventoryDetails.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 | 10 |
11 | 12 | {{item.assignedTo}} 13 |
14 | 15 |
16 | 17 | {{item.brand}} 18 |
19 | 20 |
21 | 22 | {{item.serialNumber}} 23 |
24 | 25 |
26 | 27 | {{item.year}} {{item.model}} 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch02/02_02/src/inventory/inventoryDetails.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 | 10 |
11 | 12 | {{item.assignedTo}} 13 |
14 | 15 |
16 | 17 | {{item.brand}} 18 |
19 | 20 |
21 | 22 | {{item.serialNumber}} 23 |
24 | 25 |
26 | 27 | {{item.year}} {{item.model}} 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch02/02_03/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch02/02_04/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch03/03_01/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch03/03_02/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch03/03_03/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch04/04_01/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch04/04_02/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch04/04_03/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch04/04_04/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch02/02_02_End/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch02/02_03_End/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch02/02_04_End/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch03/03_01_End/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch03/03_02_End/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch03/03_03_End/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch04/04_01_End/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch04/04_02_End/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch04/04_03_End/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch04/04_04_End/src/pages/inventory.css: -------------------------------------------------------------------------------- 1 | .menu-bar { 2 | margin-top: -50px; 3 | z-index: 10; 4 | } 5 | 6 | .inventory-list { 7 | width: 30%; 8 | min-width: 30%; 9 | max-width: 30%; 10 | } 11 | 12 | .inventory-list .list-group-item:first-child { 13 | border-top-right-radius: 0; 14 | } 15 | .inventory-list .list-group-item:last-child { 16 | border-bottom-right-radius: 0; 17 | } 18 | 19 | .list-group-item .delete { 20 | display: none; 21 | } 22 | .list-group-item:hover .delete { 23 | display: inline-block; 24 | color: red; 25 | cursor: pointer; 26 | z-index: 10; 27 | } 28 | 29 | .inventory-panel { 30 | display: flex; 31 | height: 100%; 32 | flex-direction: column; 33 | border-top-left-radius: 0; 34 | border-bottom-left-radius: 0; 35 | border-left: 0; 36 | } 37 | 38 | .add-item.btn { 39 | margin: 0.5em; 40 | } 41 | 42 | .inventory-panel label { 43 | width: 8em; 44 | padding-right: 1em; 45 | text-align: right; 46 | } 47 | -------------------------------------------------------------------------------- /Ch01/01_01/src/inventory/inventoryDetails.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 |
10 | 11 | {{item.assignedTo}} 12 |
13 |
14 | 15 | {{item.manufacturer}} 16 |
17 |
18 | 19 | {{item.model}} 20 |
21 |
22 | 23 | {{item.material}} 24 |
25 |
26 | 27 | {{item.color}} 28 |
29 |
30 | ` 31 | }); 32 | -------------------------------------------------------------------------------- /Ch01/01_02/src/inventory/inventoryDetails.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 |
10 | 11 | {{item.assignedTo}} 12 |
13 |
14 | 15 | {{item.manufacturer}} 16 |
17 |
18 | 19 | {{item.model}} 20 |
21 |
22 | 23 | {{item.material}} 24 |
25 |
26 | 27 | {{item.color}} 28 |
29 |
30 | ` 31 | }); 32 | -------------------------------------------------------------------------------- /Ch01/01_03/src/inventory/inventoryDetails.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 |
10 | 11 | {{item.assignedTo}} 12 |
13 |
14 | 15 | {{item.manufacturer}} 16 |
17 |
18 | 19 | {{item.model}} 20 |
21 |
22 | 23 | {{item.material}} 24 |
25 |
26 | 27 | {{item.color}} 28 |
29 |
30 | ` 31 | }); 32 | -------------------------------------------------------------------------------- /Ch02/02_01/src/inventory/inventoryDetails.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 |
10 | 11 | {{item.assignedTo}} 12 |
13 |
14 | 15 | {{item.manufacturer}} 16 |
17 |
18 | 19 | {{item.model}} 20 |
21 |
22 | 23 | {{item.material}} 24 |
25 |
26 | 27 | {{item.color}} 28 |
29 |
30 | ` 31 | }); 32 | -------------------------------------------------------------------------------- /Ch02/02_02/src/inventory/inventoryDetails.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 |
10 | 11 | {{item.assignedTo}} 12 |
13 |
14 | 15 | {{item.manufacturer}} 16 |
17 |
18 | 19 | {{item.model}} 20 |
21 |
22 | 23 | {{item.material}} 24 |
25 |
26 | 27 | {{item.color}} 28 |
29 |
30 | ` 31 | }); 32 | -------------------------------------------------------------------------------- /Ch01/01_01_End/src/inventory/inventoryDetails.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 |
10 | 11 | {{item.assignedTo}} 12 |
13 |
14 | 15 | {{item.manufacturer}} 16 |
17 |
18 | 19 | {{item.model}} 20 |
21 |
22 | 23 | {{item.material}} 24 |
25 |
26 | 27 | {{item.color}} 28 |
29 |
30 | ` 31 | }); 32 | -------------------------------------------------------------------------------- /Ch01/01_02_End/src/inventory/inventoryDetails.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 |
10 | 11 | {{item.assignedTo}} 12 |
13 |
14 | 15 | {{item.manufacturer}} 16 |
17 |
18 | 19 | {{item.model}} 20 |
21 |
22 | 23 | {{item.material}} 24 |
25 |
26 | 27 | {{item.color}} 28 |
29 |
30 | ` 31 | }); 32 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/inventory/inventoryDetails.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 |
10 | 11 | {{item.assignedTo}} 12 |
13 |
14 | 15 | {{item.manufacturer}} 16 |
17 |
18 | 19 | {{item.model}} 20 |
21 |
22 | 23 | {{item.material}} 24 |
25 |
26 | 27 | {{item.color}} 28 |
29 |
30 | ` 31 | }); 32 | -------------------------------------------------------------------------------- /Ch02/02_01_End/src/inventory/inventoryDetails.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | template: ` 4 |
5 |
6 | 7 | {{item.trackingNumber}} 8 |
9 |
10 | 11 | {{item.assignedTo}} 12 |
13 |
14 | 15 | {{item.manufacturer}} 16 |
17 |
18 | 19 | {{item.model}} 20 |
21 |
22 | 23 | {{item.material}} 24 |
25 |
26 | 27 | {{item.color}} 28 |
29 |
30 | ` 31 | }); 32 | -------------------------------------------------------------------------------- /Ch02/02_03_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | let originalCost = 425; 6 | 7 | enum InventoryItemType { 8 | Computer = "computer", 9 | Furniture = "furniture" 10 | } 11 | 12 | interface InventoryItem { 13 | displayName: string; 14 | inventoryType: InventoryItemType; 15 | readonly trackingNumber: string; 16 | createDate: Date; 17 | originalCost?: number; 18 | 19 | addNote?: (note: string) => string; 20 | } 21 | 22 | function getInventoryItem(trackingNumber: string): InventoryItem { 23 | return null; 24 | } 25 | 26 | function saveInventoryItem(item: InventoryItem) { 27 | } 28 | 29 | let inventoryItem = getInventoryItem(trackingNumber); 30 | 31 | let updatedInventoryItem = inventoryItem; 32 | 33 | inventoryItem.createDate = new Date(); 34 | 35 | saveInventoryItem({ 36 | displayName: "MacBook Pro 15 Retina", 37 | inventoryType: InventoryItemType.Computer, 38 | trackingNumber: "MBP123456", 39 | createDate: new Date(), 40 | }); -------------------------------------------------------------------------------- /Ch02/02_04/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | let originalCost: any = 425; 6 | originalCost = "A LOT of money!"; 7 | 8 | enum InventoryItemType { 9 | Computer = "computer", 10 | Furniture = "furniture" 11 | } 12 | 13 | interface InventoryItem { 14 | displayName: string; 15 | inventoryType: "computer" | "furniture"; 16 | readonly trackingNumber: string; 17 | createDate: Date; 18 | originalCost?: number; 19 | 20 | addNote?: (note: string) => string; 21 | } 22 | 23 | function getInventoryItem(trackingNumber: string): InventoryItem { 24 | return null; 25 | } 26 | 27 | function saveInventoryItem(item: InventoryItem) { 28 | } 29 | 30 | let inventoryItem = getInventoryItem(trackingNumber); 31 | 32 | let updatedInventoryItem = inventoryItem; 33 | 34 | inventoryItem.createDate = new Date(); 35 | 36 | saveInventoryItem({ 37 | displayName: "MacBook Pro 15 Retina", 38 | inventoryType: InventoryItemType.Computer, 39 | trackingNumber: "MBP123456", 40 | createDate: new Date(), 41 | }); -------------------------------------------------------------------------------- /Ch01/01_01/src/add-item/inventoryEditor.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | data: () => ({ 4 | minYear: 2010, 5 | maxYear: new Date().getFullYear() 6 | }), 7 | template: ` 8 |
9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 |
24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch01/01_01_End/src/add-item/inventoryEditor.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | data: () => ({ 4 | minYear: 2010, 5 | maxYear: new Date().getFullYear() 6 | }), 7 | template: ` 8 |
9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 |
24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch01/01_02/src/add-item/inventoryEditor.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | data: () => ({ 4 | minYear: 2010, 5 | maxYear: new Date().getFullYear() 6 | }), 7 | template: ` 8 |
9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 |
24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch01/01_02_End/src/add-item/inventoryEditor.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | data: () => ({ 4 | minYear: 2010, 5 | maxYear: new Date().getFullYear() 6 | }), 7 | template: ` 8 |
9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 |
24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch01/01_03/src/add-item/inventoryEditor.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | data: () => ({ 4 | minYear: 2010, 5 | maxYear: new Date().getFullYear() 6 | }), 7 | template: ` 8 |
9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 |
24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/add-item/inventoryEditor.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | data: () => ({ 4 | minYear: 2010, 5 | maxYear: new Date().getFullYear() 6 | }), 7 | template: ` 8 |
9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 |
24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch02/02_01/src/add-item/inventoryEditor.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | data: () => ({ 4 | minYear: 2010, 5 | maxYear: new Date().getFullYear() 6 | }), 7 | template: ` 8 |
9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 |
24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch02/02_01_End/src/add-item/inventoryEditor.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | data: () => ({ 4 | minYear: 2010, 5 | maxYear: new Date().getFullYear() 6 | }), 7 | template: ` 8 |
9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 |
24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch02/02_02/src/add-item/inventoryEditor.computer.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item"], 3 | data: () => ({ 4 | minYear: 2010, 5 | maxYear: new Date().getFullYear() 6 | }), 7 | template: ` 8 |
9 | 10 |
11 | 12 | 13 |
14 | 15 |
16 | 17 | 18 |
19 | 20 |
21 | 22 | 23 |
24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | ` 32 | }); 33 | -------------------------------------------------------------------------------- /Ch04/04_04_End/node_modules/@types/jquery/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /Ch04/04_04_End/node_modules/@types/sizzle/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /Ch03/03_01/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); -------------------------------------------------------------------------------- /Ch03/03_02/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); -------------------------------------------------------------------------------- /Ch03/03_03/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); -------------------------------------------------------------------------------- /Ch02/02_04_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); -------------------------------------------------------------------------------- /Ch03/03_01_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); -------------------------------------------------------------------------------- /Ch03/03_02_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); -------------------------------------------------------------------------------- /Ch03/03_03_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); -------------------------------------------------------------------------------- /Ch04/04_01/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); 50 | 51 | function clone(source) { 52 | const serialized = JSON.stringify(source); 53 | return JSON.parse(serialized); 54 | } 55 | 56 | -------------------------------------------------------------------------------- /Ch01/01_01/src/add-item/inventoryEditor.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item", "category"], 3 | computed: { 4 | colors() { 5 | return this.category.colors; 6 | } 7 | }, 8 | template: ` 9 |
10 | 11 |
12 | 13 | 14 |
15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 34 |
35 | 36 |
37 | ` 38 | }); 39 | -------------------------------------------------------------------------------- /Ch01/01_02/src/add-item/inventoryEditor.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item", "category"], 3 | computed: { 4 | colors() { 5 | return this.category.colors; 6 | } 7 | }, 8 | template: ` 9 |
10 | 11 |
12 | 13 | 14 |
15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 34 |
35 | 36 |
37 | ` 38 | }); 39 | -------------------------------------------------------------------------------- /Ch01/01_03/src/add-item/inventoryEditor.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item", "category"], 3 | computed: { 4 | colors() { 5 | return this.category.colors; 6 | } 7 | }, 8 | template: ` 9 |
10 | 11 |
12 | 13 | 14 |
15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 34 |
35 | 36 |
37 | ` 38 | }); 39 | -------------------------------------------------------------------------------- /Ch02/02_01/src/add-item/inventoryEditor.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item", "category"], 3 | computed: { 4 | colors() { 5 | return this.category.colors; 6 | } 7 | }, 8 | template: ` 9 |
10 | 11 |
12 | 13 | 14 |
15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 34 |
35 | 36 |
37 | ` 38 | }); 39 | -------------------------------------------------------------------------------- /Ch02/02_02/src/add-item/inventoryEditor.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item", "category"], 3 | computed: { 4 | colors() { 5 | return this.category.colors; 6 | } 7 | }, 8 | template: ` 9 |
10 | 11 |
12 | 13 | 14 |
15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 34 |
35 | 36 |
37 | ` 38 | }); 39 | -------------------------------------------------------------------------------- /Ch01/01_01_End/src/add-item/inventoryEditor.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item", "category"], 3 | computed: { 4 | colors() { 5 | return this.category.colors; 6 | } 7 | }, 8 | template: ` 9 |
10 | 11 |
12 | 13 | 14 |
15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 34 |
35 | 36 |
37 | ` 38 | }); 39 | -------------------------------------------------------------------------------- /Ch01/01_02_End/src/add-item/inventoryEditor.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item", "category"], 3 | computed: { 4 | colors() { 5 | return this.category.colors; 6 | } 7 | }, 8 | template: ` 9 |
10 | 11 |
12 | 13 | 14 |
15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 34 |
35 | 36 |
37 | ` 38 | }); 39 | -------------------------------------------------------------------------------- /Ch01/01_03_End/src/add-item/inventoryEditor.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item", "category"], 3 | computed: { 4 | colors() { 5 | return this.category.colors; 6 | } 7 | }, 8 | template: ` 9 |
10 | 11 |
12 | 13 | 14 |
15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 34 |
35 | 36 |
37 | ` 38 | }); 39 | -------------------------------------------------------------------------------- /Ch02/02_01_End/src/add-item/inventoryEditor.furniture.js: -------------------------------------------------------------------------------- 1 | export default Vue.extend({ 2 | props: ["item", "category"], 3 | computed: { 4 | colors() { 5 | return this.category.colors; 6 | } 7 | }, 8 | template: ` 9 |
10 | 11 |
12 | 13 | 14 |
15 | 16 |
17 | 18 | 19 |
20 | 21 |
22 | 23 | 24 |
25 | 26 |
27 | 28 | 34 |
35 | 36 |
37 | ` 38 | }); 39 | -------------------------------------------------------------------------------- /Ch04/04_04_End/node_modules/@types/jquery/README.md: -------------------------------------------------------------------------------- 1 | # Installation 2 | > `npm install --save @types/jquery` 3 | 4 | # Summary 5 | This package contains type definitions for jquery (https://jquery.com). 6 | 7 | # Details 8 | Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/jquery 9 | 10 | Additional Details 11 | * Last updated: Tue, 25 Dec 2018 21:10:47 GMT 12 | * Dependencies: @types/sizzle 13 | * Global values: $, Symbol, jQuery 14 | 15 | # Credits 16 | These definitions were written by Leonard Thieu , Boris Yankov , Christian Hoffmeister , Steve Fenton , Diullei Gomes , Tass Iliopoulos , Jason Swearingen , Sean Hill , Guus Goossens , Kelly Summerlin , Basarat Ali Syed , Nicholas Wolverson , Derek Cicerone , Andrew Gaspar , Seikichi Kondo , Benjamin Jackman , Poul Sorensen , Josh Strobl , John Reilly , Dick van den Brink , Thomas Schulz , Terry Mun . 17 | -------------------------------------------------------------------------------- /Ch04/04_02/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); 50 | 51 | function clone(source: T, options: U): T { 52 | const serialized = JSON.stringify(source); 53 | return JSON.parse(serialized); 54 | } 55 | 56 | const cloned = clone(inventoryItem, { deep: true }); 57 | 58 | class KeyValuePair { 59 | Key: TKey; 60 | Value: TValue; 61 | } 62 | 63 | var keyValue: KeyValuePair = { Key: "something", Value: 1234 }; 64 | var keyValue2: KeyValuePair = { Key: 1234, Value: true }; 65 | -------------------------------------------------------------------------------- /Ch04/04_03/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); 50 | 51 | function clone(source: T, options: U): T { 52 | const serialized = JSON.stringify(source); 53 | return JSON.parse(serialized); 54 | } 55 | 56 | const cloned = clone(inventoryItem, { deep: true }); 57 | 58 | class KeyValuePair { 59 | Key: TKey; 60 | Value: TValue; 61 | } 62 | 63 | var keyValue: KeyValuePair = { Key: "something", Value: 1234 }; 64 | var keyValue2: KeyValuePair = { Key: 1234, Value: true }; 65 | -------------------------------------------------------------------------------- /Ch04/04_04/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); 50 | 51 | function clone(source: T, options: U): T { 52 | const serialized = JSON.stringify(source); 53 | return JSON.parse(serialized); 54 | } 55 | 56 | const cloned = clone(inventoryItem, { deep: true }); 57 | 58 | class KeyValuePair { 59 | Key: TKey; 60 | Value: TValue; 61 | } 62 | 63 | var keyValue: KeyValuePair = { Key: "something", Value: 1234 }; 64 | var keyValue2: KeyValuePair = { Key: 1234, Value: true }; 65 | -------------------------------------------------------------------------------- /Ch04/04_01_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); 50 | 51 | function clone(source: T, options: U): T { 52 | const serialized = JSON.stringify(source); 53 | return JSON.parse(serialized); 54 | } 55 | 56 | const cloned = clone(inventoryItem, { deep: true }); 57 | 58 | class KeyValuePair { 59 | Key: TKey; 60 | Value: TValue; 61 | } 62 | 63 | var keyValue: KeyValuePair = { Key: "something", Value: 1234 }; 64 | var keyValue2: KeyValuePair = { Key: 1234, Value: true }; 65 | -------------------------------------------------------------------------------- /Ch04/04_02_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); 50 | 51 | function clone(source: T, options: U): T { 52 | const serialized = JSON.stringify(source); 53 | return JSON.parse(serialized); 54 | } 55 | 56 | const cloned = clone(inventoryItem, { deep: true }); 57 | 58 | class KeyValuePair { 59 | Key: TKey; 60 | Value: TValue; 61 | } 62 | 63 | var keyValue: KeyValuePair = { Key: "something", Value: 1234 }; 64 | var keyValue2: KeyValuePair = { Key: 1234, Value: true }; 65 | -------------------------------------------------------------------------------- /Ch04/04_03_End/src/model.ts: -------------------------------------------------------------------------------- 1 | let displayName: string = "Jess's standing desk"; 2 | let inventoryType: string = "furniture"; 3 | let trackingNumber: string = "FD123455"; 4 | let createDate: Date = new Date(); 5 | 6 | type Cost = number | string; 7 | 8 | let originalCost: Cost; 9 | 10 | if (typeof originalCost === "number") { 11 | let cost: number = originalCost; 12 | } else { 13 | let x = originalCost; 14 | } 15 | 16 | enum InventoryItemType { 17 | Computer = "computer", 18 | Furniture = "furniture" 19 | } 20 | 21 | interface InventoryItem { 22 | displayName: string; 23 | inventoryType: "computer" | "furniture"; 24 | readonly trackingNumber: string; 25 | createDate: Date; 26 | originalCost?: number; 27 | 28 | addNote?: (note: string) => string; 29 | } 30 | 31 | function getInventoryItem(trackingNumber: string): InventoryItem { 32 | return null; 33 | } 34 | 35 | function saveInventoryItem(item: InventoryItem) { 36 | } 37 | 38 | let inventoryItem = getInventoryItem(trackingNumber); 39 | 40 | let updatedInventoryItem = inventoryItem; 41 | 42 | inventoryItem.createDate = new Date(); 43 | 44 | saveInventoryItem({ 45 | displayName: "MacBook Pro 15 Retina", 46 | inventoryType: "computer", 47 | trackingNumber: "MBP123456", 48 | createDate: new Date(), 49 | }); 50 | 51 | function clone(source: T, options: U): T { 52 | const serialized = JSON.stringify(source); 53 | return JSON.parse(serialized); 54 | } 55 | 56 | const cloned = clone(inventoryItem, { deep: true }); 57 | 58 | class KeyValuePair { 59 | Key: TKey; 60 | Value: TValue; 61 | } 62 | 63 | var keyValue: KeyValuePair = { Key: "something", Value: 1234 }; 64 | var keyValue2: KeyValuePair = { Key: 1234, Value: true }; 65 | --------------------------------------------------------------------------------