removed file upload dialog

removes file upload dialog from frontend, upload from backend along with parsing dependencies
This commit is contained in:
2026-05-01 22:34:26 +02:00
parent e5f9e737b2
commit 51d063b0e5
13 changed files with 9 additions and 294 deletions
+3 -119
View File
@@ -16,7 +16,6 @@
"cors": "^2.8.5", "cors": "^2.8.5",
"express": "^4.18.2", "express": "^4.18.2",
"mongoose": "^7.4.1", "mongoose": "^7.4.1",
"multer": "^2.0.2",
"node-schedule": "^2.1.1", "node-schedule": "^2.1.1",
"passport": "^0.6.0", "passport": "^0.6.0",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
@@ -24,8 +23,7 @@
"speakeasy": "^2.0.0", "speakeasy": "^2.0.0",
"tx2": "^1.0.5", "tx2": "^1.0.5",
"underscore": "^1.13.8", "underscore": "^1.13.8",
"web-push": "^3.6.7", "web-push": "^3.6.7"
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz"
}, },
"devDependencies": { "devDependencies": {
"@types/bcryptjs": "^2.4.2", "@types/bcryptjs": "^2.4.2",
@@ -33,7 +31,6 @@
"@types/cors": "^2.8.13", "@types/cors": "^2.8.13",
"@types/express": "^4.17.17", "@types/express": "^4.17.17",
"@types/express-session": "^1.17.7", "@types/express-session": "^1.17.7",
"@types/multer": "^1.4.11",
"@types/node-schedule": "^2.1.7", "@types/node-schedule": "^2.1.7",
"@types/passport": "^1.0.12", "@types/passport": "^1.0.12",
"@types/passport-local": "^1.0.35", "@types/passport-local": "^1.0.35",
@@ -271,15 +268,6 @@
"integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
"dev": true "dev": true
}, },
"node_modules/@types/multer": {
"version": "1.4.11",
"resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz",
"integrity": "sha512-svK240gr6LVWvv3YGyhLlA+6LRRWA4mnGIU7RcNmgjBYFl6665wcXrRfxGp5tEPVHUNm5FMcmq7too9bxCwX/w==",
"dev": true,
"dependencies": {
"@types/express": "*"
}
},
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.4.5", "version": "20.4.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.5.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.5.tgz",
@@ -787,11 +775,6 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/append-field": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
"integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
},
"node_modules/array-differ": { "node_modules/array-differ": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
@@ -1040,18 +1023,8 @@
"node_modules/buffer-from": { "node_modules/buffer-from": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
}, "dev": true
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
"dependencies": {
"streamsearch": "^1.1.0"
},
"engines": {
"node": ">=10.16.0"
}
}, },
"node_modules/bytes": { "node_modules/bytes": {
"version": "3.1.2", "version": "3.1.2",
@@ -1293,21 +1266,6 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true "dev": true
}, },
"node_modules/concat-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
"integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
"engines": [
"node >= 6.0"
],
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.0.2",
"typedarray": "^0.0.6"
}
},
"node_modules/connect-history-api-fallback": { "node_modules/connect-history-api-fallback": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
@@ -2951,25 +2909,6 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
}, },
"node_modules/multer": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/multer/-/multer-2.1.0.tgz",
"integrity": "sha512-TBm6j41rxNohqawsxlsWsNNh/VdV4QFXcBvRcPhXaA05EZ79z0qJ2bQFpync6JBoHTeNY5Q1JpG7AlTjdlfAEA==",
"license": "MIT",
"dependencies": {
"append-field": "^1.0.0",
"busboy": "^1.6.0",
"concat-stream": "^2.0.0",
"type-is": "^1.6.18"
},
"engines": {
"node": ">= 10.16.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/multi-stage-sourcemap": { "node_modules/multi-stage-sourcemap": {
"version": "0.3.1", "version": "0.3.1",
"resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.3.1.tgz", "resolved": "https://registry.npmjs.org/multi-stage-sourcemap/-/multi-stage-sourcemap-0.3.1.tgz",
@@ -3470,20 +3409,6 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/readdirp": { "node_modules/readdirp": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
@@ -3911,23 +3836,6 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/streamsearch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/string-template": { "node_modules/string-template": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz", "resolved": "https://registry.npmjs.org/string-template/-/string-template-1.0.0.tgz",
@@ -4182,12 +4090,6 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
"license": "MIT"
},
"node_modules/typescript": { "node_modules/typescript": {
"version": "5.3.3", "version": "5.3.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
@@ -4279,12 +4181,6 @@
"which-typed-array": "^1.1.2" "which-typed-array": "^1.1.2"
} }
}, },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
"node_modules/utils-merge": { "node_modules/utils-merge": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -4584,18 +4480,6 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/xlsx": {
"version": "0.20.1",
"resolved": "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz",
"integrity": "sha512-hA7SYmn/H3cJ1VGi7kmSKxbEXCEn5UVJlwYFSFXhLe54wPUvW+80TmR5l+TZh4nJCw8G/e0SuZUfvqlTIh40hw==",
"license": "Apache-2.0",
"bin": {
"xlsx": "bin/xlsx.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/yallist": { "node_modules/yallist": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+1 -4
View File
@@ -18,7 +18,6 @@
"cors": "^2.8.5", "cors": "^2.8.5",
"express": "^4.18.2", "express": "^4.18.2",
"mongoose": "^7.4.1", "mongoose": "^7.4.1",
"multer": "^2.0.2",
"node-schedule": "^2.1.1", "node-schedule": "^2.1.1",
"passport": "^0.6.0", "passport": "^0.6.0",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
@@ -26,8 +25,7 @@
"speakeasy": "^2.0.0", "speakeasy": "^2.0.0",
"tx2": "^1.0.5", "tx2": "^1.0.5",
"underscore": "^1.13.8", "underscore": "^1.13.8",
"web-push": "^3.6.7", "web-push": "^3.6.7"
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz"
}, },
"devDependencies": { "devDependencies": {
"@types/bcryptjs": "^2.4.2", "@types/bcryptjs": "^2.4.2",
@@ -35,7 +33,6 @@
"@types/cors": "^2.8.13", "@types/cors": "^2.8.13",
"@types/express": "^4.17.17", "@types/express": "^4.17.17",
"@types/express-session": "^1.17.7", "@types/express-session": "^1.17.7",
"@types/multer": "^1.4.11",
"@types/node-schedule": "^2.1.7", "@types/node-schedule": "^2.1.7",
"@types/passport": "^1.0.12", "@types/passport": "^1.0.12",
"@types/passport-local": "^1.0.35", "@types/passport-local": "^1.0.35",
-56
View File
@@ -1,24 +1,11 @@
import { Router } from "express" import { Router } from "express"
import { Perms, adminPerm, project } from "@/utility" import { Perms, adminPerm, project } from "@/utility"
import multer from "multer"
import * as XLSX from "xlsx"
import Menu from "@schemas/Menu" import Menu from "@schemas/Menu"
import { editorRouter } from "./editor" import { editorRouter } from "./editor"
import usettings, { Features } from "@/helpers/usettings" import usettings, { Features } from "@/helpers/usettings"
const menuRouter = Router() const menuRouter = Router()
const storage = multer.memoryStorage()
const upload = multer({storage: storage})
interface sheetObject {
day: string;
sn: string;
sn2: string;
ob: string;
kol: string;
}
menuRouter.use(adminPerm(Perms.Menu)) menuRouter.use(adminPerm(Perms.Menu))
menuRouter.use(usettings.mw(Features.Menu)) menuRouter.use(usettings.mw(Features.Menu))
@@ -120,49 +107,6 @@ menuRouter.post('/:start/:count', async (req, res) => {
} }
}) })
menuRouter.post('/upload', upload.single('menu'), async (req,res)=> {
if (!req.file) {
res.status(400).send("File required")
return
}
var sheet = XLSX.read(req.file.buffer)
var data: sheetObject[] = XLSX.utils.sheet_to_json(sheet.Sheets[sheet.SheetNames[0]], {raw: true, header: ["day", "sn", "sn2", "ob", "kol"], range: 2})
data = data.map((val, i) => {
var result: any = {}
var dateparts = val.day.match(/(\d{2})\.(\d{2})\.(\d{4})/)
if (dateparts) {
var date = new Date(parseInt(dateparts[3]),parseInt(dateparts[2])-1,parseInt(dateparts[1]))
date.setUTCHours(0,0,0,0)
} else {
res.sendStatus(500)
return
}
result.day = date
result.sn = val.sn.split('\n')
result.sn.push(val.sn2)
//#region ob
var ob = val.ob
ob = ob.replace(/^\s*\n/gm, "")
ob = ob.replace(/ \/ /gm, "\n")
ob = ob.replace(/:(?!\s)/gm, ": ")
result.ob = ob.split('\n')
//#endregion
result.kol = val.kol
if (date.getUTCDay() == 5) {
result.kol = null
}
return result
})
if (await Menu.insertMany(data)) {
res.status(201).send({status: 201})
} else {
res.sendStatus(500)
}
})
menuRouter.put('/:id', async (req, res) => { menuRouter.put('/:id', async (req, res) => {
let menu = await Menu.findById(req.params.id) let menu = await Menu.findById(req.params.id)
if (!menu) { if (!menu) {
@@ -3,7 +3,6 @@
<mat-radio-group [(ngModel)]="type"> <mat-radio-group [(ngModel)]="type">
<mat-radio-button value="day">Dzień</mat-radio-button> <mat-radio-button value="day">Dzień</mat-radio-button>
<mat-radio-button value="week">Tydzień</mat-radio-button> <mat-radio-button value="week">Tydzień</mat-radio-button>
<mat-radio-button value="file">Plik</mat-radio-button>
</mat-radio-group> </mat-radio-group>
<div> <div>
@switch (type) { @switch (type) {
@@ -21,9 +20,6 @@
<mat-date-range-picker #picker></mat-date-range-picker> <mat-date-range-picker #picker></mat-date-range-picker>
</mat-form-field> </mat-form-field>
} }
@case ("file") {
<button mat-flat-button (click)="activateUpload()">Otwórz okno</button>
}
} }
</div> </div>
</mat-dialog-content> </mat-dialog-content>
@@ -0,0 +1,3 @@
mat-dialog-content {
padding-bottom: 5px !important;
}
@@ -1,6 +1,5 @@
import { Component, inject, signal } from '@angular/core' import { Component, inject, signal } from '@angular/core'
import { MenuUploadComponent } from '../menu-upload/menu-upload.component' import { MatDialogRef } from '@angular/material/dialog'
import { MatDialog, MatDialogRef } from '@angular/material/dialog'
import { FDSelection } from 'src/app/fd.da' import { FDSelection } from 'src/app/fd.da'
import { FormControl, FormGroup } from '@angular/forms' import { FormControl, FormGroup } from '@angular/forms'
import { MAT_DATE_RANGE_SELECTION_STRATEGY } from '@angular/material/datepicker' import { MAT_DATE_RANGE_SELECTION_STRATEGY } from '@angular/material/datepicker'
@@ -18,7 +17,6 @@ import { weekendFilter } from 'src/app/util'
}) })
export class MenuAddComponent { export class MenuAddComponent {
public dialogRef: MatDialogRef<MenuAddComponent> = inject(MatDialogRef) public dialogRef: MatDialogRef<MenuAddComponent> = inject(MatDialogRef)
private dialog = inject(MatDialog)
type: string | undefined type: string | undefined
filter = weekendFilter filter = weekendFilter
@@ -45,15 +43,4 @@ export class MenuAddComponent {
break break
} }
} }
activateUpload() {
this.dialog
.open(MenuUploadComponent)
.afterClosed()
.subscribe(data => {
if (data) {
this.dialogRef.close({ type: 'file', ...data })
}
})
}
} }
@@ -5,7 +5,6 @@ import { FDSelection } from 'src/app/fd.da'
import { Menu } from 'src/app/types/menu' import { Menu } from 'src/app/types/menu'
import { MatTableDataSource } from '@angular/material/table' import { MatTableDataSource } from '@angular/material/table'
import { MatDialog } from '@angular/material/dialog' import { MatDialog } from '@angular/material/dialog'
import { MenuUploadComponent } from './menu-upload/menu-upload.component'
import { Status } from 'src/app/types/status' import { Status } from 'src/app/types/status'
import { MatSnackBar } from '@angular/material/snack-bar' import { MatSnackBar } from '@angular/material/snack-bar'
import { MenuAddComponent } from './menu-add/menu-add.component' import { MenuAddComponent } from './menu-add/menu-add.component'
@@ -121,15 +120,6 @@ export class MenuEditComponent implements OnDestroy {
if (s.status.toString().match(/2\d\d/)) this.refresh() if (s.status.toString().match(/2\d\d/)) this.refresh()
} }
activateUpload() {
this.dialog
.open(MenuUploadComponent)
.afterClosed()
.subscribe(data => {
if (data) this.refresh()
})
}
editSn(id: string) { editSn(id: string) {
this.ac this.ac
.editSn(id, this.dataSource.data.find(v => v._id == id)!.sn) .editSn(id, this.dataSource.data.find(v => v._id == id)!.sn)
@@ -1,20 +0,0 @@
<h1 mat-dialog-title>Import z pliku</h1>
<mat-dialog-content>
<input type="file" name="menu" #fu style="display: none;" (change)="onFileChange($event)" accept=".xlsx,.ods,application/vnd.oasis.opendocument.spreadsheet">
<button matButton="outlined" (click)="fu.click()">Wybierz plik</button>
<div style="color: red;">
<h1>UWAGA!</h1>
<h3>Przed wysłaniem upewnij się że</h3>
<ul>
<li>Daty w pliku są prawidłowe i poprawnie sformatowane (DD.MM.RRRR)</li>
<li>Wszystkie pozycje w menu są w osobnych linijkach</li>
<li>Załączony dokument to arkusz w formacie XLSX lub ODS</li>
</ul>
<h2>Nie spełnienie któregokolwiek z tych wymagań może skutkować szkodami w programie!</h2>
<h3>Późniejsza modyfikacja danych jest niemożliwa w tej wersji programu.</h3>
</div>
</mat-dialog-content>
<mat-dialog-actions>
<button matButton="outlined" class="error-color" [disabled]="file === undefined" (click)="submit()">Wyślij</button>
<button mat-button mat-dialog-close>Anuluj</button>
</mat-dialog-actions>
@@ -1,4 +0,0 @@
:host {
margin: 8pt;
display: block;
}
@@ -1,29 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'
import { MenuUploadComponent } from './menu-upload.component'
import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'
import { MenuEditService } from '../menu-edit.service'
xdescribe('MenuUploadComponent', () => {
let component: MenuUploadComponent
let fixture: ComponentFixture<MenuUploadComponent>
beforeEach(() => {
const acMock = jasmine.createSpyObj('AdminCommService')
TestBed.configureTestingModule({
declarations: [MenuUploadComponent],
providers: [
{ provide: MenuEditService, useValue: acMock },
{ provide: MatDialogRef, useValue: {} },
],
imports: [MatDialogModule],
})
fixture = TestBed.createComponent(MenuUploadComponent)
component = fixture.componentInstance
fixture.detectChanges()
})
it('should create', () => {
expect(component).toBeTruthy()
})
})
@@ -1,30 +0,0 @@
import { Component, inject } from '@angular/core'
import { MatDialogRef } from '@angular/material/dialog'
import { MenuEditService } from '../menu-edit.service'
@Component({
selector: 'app-upload-edit',
templateUrl: './menu-upload.component.html',
styleUrls: ['./menu-upload.component.scss'],
standalone: false,
})
export class MenuUploadComponent {
private ac = inject(MenuEditService)
public dialogRef: MatDialogRef<MenuUploadComponent> = inject(MatDialogRef)
protected file: File | undefined
onFileChange(event: Event) {
const file: File = (event.target as HTMLInputElement).files![0]
if (file) {
this.file = file
} else {
this.file = undefined
}
}
submit() {
this.ac.postMenu(this.file!)?.subscribe(value => {
this.dialogRef.close(value)
})
}
}
-2
View File
@@ -26,7 +26,6 @@ import { LogoutConfirmationComponent } from './app-view/personal/logout-confirma
import { PersonalComponent } from './app-view/personal/personal.component' import { PersonalComponent } from './app-view/personal/personal.component'
import { AppComponent } from './app.component' import { AppComponent } from './app.component'
import { LoginComponent } from './login/login.component' import { LoginComponent } from './login/login.component'
import { MenuUploadComponent } from './admin-view/menu-edit/menu-upload/menu-upload.component'
import { NewsEditComponent } from './admin-view/news-edit/news-edit.component' import { NewsEditComponent } from './admin-view/news-edit/news-edit.component'
import { MatSnackBarModule } from '@angular/material/snack-bar' import { MatSnackBarModule } from '@angular/material/snack-bar'
import { NewPostComponent } from './admin-view/news-edit/new-post/edit-post.component' import { NewPostComponent } from './admin-view/news-edit/new-post/edit-post.component'
@@ -109,7 +108,6 @@ import { MatTooltipModule } from "@angular/material/tooltip";
LogoutConfirmationComponent, LogoutConfirmationComponent,
DateSelectorComponent, DateSelectorComponent,
AdminViewComponent, AdminViewComponent,
MenuUploadComponent,
NewsEditComponent, NewsEditComponent,
NewPostComponent, NewPostComponent,
AccountMgmtComponent, AccountMgmtComponent,
@@ -10,7 +10,6 @@ import {
withInterceptorsFromDi, withInterceptorsFromDi,
} from '@angular/common/http' } from '@angular/common/http'
import { environment } from 'src/environments/environment' import { environment } from 'src/environments/environment'
import { firstValueFrom } from 'rxjs'
describe('UpdatesService', () => { describe('UpdatesService', () => {
let service: UpdatesService let service: UpdatesService
@@ -33,7 +32,7 @@ describe('UpdatesService', () => {
}) })
it('should grab news', () => { it('should grab news', () => {
const res = firstValueFrom(service.getNews()) const res = service.getNews()
const req = httpTestingController.expectOne(environment.apiEndpoint+`/app/news`) const req = httpTestingController.expectOne(environment.apiEndpoint+`/app/news`)
expect(res).withContext("empty news array").toBeDefined() expect(res).withContext("empty news array").toBeDefined()