Commit f0f44d55 authored by Hasitha Samarasekara's avatar Hasitha Samarasekara

Merge branch 'IT18050240' into 'master'

It18050240

See merge request !16
parents f14423bd 274a44c9
module.exports = {
mongoURI: 'mongodb+srv://admin:admin@cluster0.wmb3b.mongodb.net/SmartCoach?retryWrites=true&w=majority',
};
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
let Answer = new Schema({
answer_id: mongoose.Schema.Types.ObjectId,
student_id: {
type: String
},
student_name:{
type:String
},
lesson_no:{
type:Number
},
no_of_questions:{
type:Number
},
question_text:{
type:String
},
question_answer:{
type:String
},
defult_mark:{
type:Number
}
});
module.exports = mongoose.model('Answer',Answer);
\ No newline at end of file
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const ImageSchema = new Schema({
caption: {
required: true,
type: String,
},
lessonname: {
required: true,
type: String,
},
lessonno: {
required: true,
type: String,
},
filename: {
required: true,
type: String,
},
fileId: {
required: true,
type: String,
},
createdAt: {
default: Date.now(),
type: Date,
},
});
const Image = mongoose.model('Image', ImageSchema);
module.exports = Image;
\ No newline at end of file
......@@ -4,10 +4,10 @@ const Schema = mongoose.Schema;
let Question = new Schema({
question_id: mongoose.Schema.Types.ObjectId,
category:{
type:String
lesson_no:{
type:Number
},
name:{
lesson_name:{
type:String
},
question_text:{
......@@ -17,10 +17,7 @@ let Question = new Schema({
type:String
},
defult_mark:{
type: Number
},
q_type:{
type: String
type:Number
},
time_createdby:{
type: Date
......
This diff is collapsed.
......@@ -10,14 +10,12 @@
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.21.4",
"cors": "^2.8.5",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"mongoose": "^5.12.15"
},
"devDependencies": {
"nodemailer": "^6.6.2",
"request": "^2.88.2"
"nodemailer": "^6.6.2"
}
}
const answerRoute = require('express').Router();
let answer = require('../models/answer.model');
const mongoose = require('mongoose');
answerRoute.route('/').get(function(req, res) {
answer.find(function(err, questions) {
if (err) {
console.log(err);
res.render('index');
} else {
res.json(questions);
}
});
});
answerRoute.route('/:id').get(function (req, res) {
let id = req.params.id;
answer.findById(id, function (err, question) {
res.json(question);
});
});
answerRoute.route('/questionId/:id').get(function (req, res) {
console.log("Question ID");
console.log(req.params.id);
let id = req.params.id;
answer.find({"_id" : id}, function (err, question) {
res.json(question);
});
});
answerRoute.route('/add').post(function(req, res) {
const ans = new answer({
answer_id: new mongoose.Types.ObjectId(),
student_id : req.body.student_id,
student_name : req.body.student_name,
lesson_no : req.body.lesson_no,
no_of_questions : req.body.no_of_questions,
question_text: req.body.question_text,
question_answer:req.body.question_answer,
defult_mark: req.body.defult_mark,
});
ans.save().then(ans =>{
res.json('Item update!');
})
.catch(err =>{
res.status(400).send("Update not possible");
});
});
answerRoute.route('/update/:id').post((req, res) => {
answer.findById(req.params.id,function(err, answer){
if(!answer)
req.status(404).send("data is not found");
else {
answer.lesson_no = req.body.lesson_no,
answer.student_id = req.body.student_id,
answer.student_name = req.body.student_name,
answer.no_of_questions = req.body.no_of_questions,
answer.question_text = req.body.question_text,
answer.question_answer = req.body.question_answer,
answer.defult_mark = req.body.defult_mark
}
answer.save().then(answer =>{
res.json('Item update!');
})
.catch(err =>{
res.status(400).send("Update not possible");
});
});
});
answerRoute.route('/lessonNo/:id').get(function (req, res) {
console.log("Product Item ID");
console.log(req.params.id);
let id = req.params.id;
answer.find({"lesson_no" : id}, function (err, answer) {
res.json(answer);
});
});
answerRoute.route('/delete/:id').delete((req, res) => {
answer.findByIdAndDelete(req.params.id)
.then(() => res.json('Product Deleted.'))
.catch(err => res.status(400).json('Error: ' + err));
});
module.exports = answerRoute;
\ No newline at end of file
const express = require('express');
const imageRouter = express.Router();
const mongoose = require('mongoose');
const Image = require('../models/pdf.model');
const config = require('../config');
module.exports = (upload) => {
const url = config.mongoURI;
const connect = mongoose.createConnection(url, {useNewUrlParser: true, useUnifiedTopology: true});
let gfs;
connect.once('open', () => {
// initialize stream
gfs = new mongoose.mongo.GridFSBucket(connect.db, {
bucketName: "uploads"
});
});
/*
POST: Upload a single image/file to Image collection
*/
imageRouter.route('/')
.post(upload.single('file'), (req, res, next) => {
console.log(req.body);
// check for existing images
Image.findOne({caption: req.body.caption})
.then((image) => {
console.log(image);
if (image) {
return res.status(200).json({
success: false,
message: 'Image already exists',
});
}
let newImage = new Image({
lessonname: req.body.lessonname,
lessonno: req.body.lessonno,
caption: req.body.caption,
filename: req.file.filename,
fileId: req.file.id,
});
newImage.save()
.then((image) => {
res.status(200).json({
success: true,
image,
});
})
.catch(err => res.status(500).json(err));
})
.catch(err => res.status(500).json(err));
})
.get((req, res, next) => {
Image.find({})
.then(images => {
res.status(200).json({
success: true,
images,
});
})
.catch(err => res.status(500).json(err));
});
/*
GET: Delete an image from the collection
*/
imageRouter.route('/delete/:id')
.get((req, res, next) => {
Image.findOne({_id: req.params.id})
.then((image) => {
if (image) {
Image.deleteOne({_id: req.params.id})
.then(() => {
return res.status(200).json({
success: true,
message: `File with ID: ${req.params.id} deleted`,
});
})
.catch(err => {
return res.status(500).json(err)
});
} else {
res.status(200).json({
success: false,
message: `File with ID: ${req.params.id} not found`,
});
}
})
.catch(err => res.status(500).json(err));
});
/*
GET: Fetch most recently added record
*/
imageRouter.route('/recent')
.get((req, res, next) => {
Image.findOne({}, {}, {sort: {'_id': -1}})
.then((image) => {
res.status(200).json({
success: true,
image,
});
})
.catch(err => res.status(500).json(err));
});
/*
POST: Upload multiple files upto 3
*/
imageRouter.route('/multiple')
.post(upload.array('file', 3), (req, res, next) => {
res.status(200).json({
success: true,
message: `${req.files.length} files uploaded successfully`,
});
});
/*
GET: Fetches all the files in the uploads collection
*/
imageRouter.route('/')
.get((req, res, next) => {
gfs.find().toArray((err, files) => {
if (!files || files.length === 0) {
return res.status(200).json({
success: false,
message: 'No files available'
});
}
files.map(file => {
if (file.contentType === 'image/jpeg' || file.contentType === 'image/png' || file.contentType === 'image/svg') {
file.isImage = true;
} else {
file.isImage = false;
}
});
res.status(200).json({
success: true,
files,
});
});
});
/*
GET: Fetches a particular file by filename
*/
imageRouter.route('/file/:filename')
.get((req, res, next) => {
gfs.find({ filename: req.params.filename }).toArray((err, files) => {
if (!files[0] || files.length === 0) {
return res.status(200).json({
success: false,
message: 'No files available',
});
}
res.status(200).json({
success: true,
file: files[0],
});
});
});
/*
GET: Fetches a particular image and render on browser
*/
imageRouter.route('/image/:filename')
.get((req, res, next) => {
gfs.find({ filename: req.params.filename }).toArray((err, files) => {
if (!files[0] || files.length === 0) {
return res.status(200).json({
success: false,
message: 'No files available',
});
}
if (files[0].contentType === 'image/jpeg' || files[0].contentType === 'image/png' || files[0].contentType === 'image/svg+xml') {
// render image to browser
gfs.openDownloadStreamByName(req.params.filename).pipe(res);
} else {
res.status(404).json({
err: 'Not an image',
});
}
});
});
/*
GET: Fetches a particular PDF and render on browser
*/
imageRouter.route('/pdf/:filename')
.get((req, res, next) => {
gfs.find({ filename: req.params.filename }).toArray((err, files) => {
if (!files[0] || files.length === 0) {
return res.status(200).json({
success: false,
message: 'No files available',
});
}
if (files[0].contentType === 'application/pdf' || files[0].contentType === 'application/vnd.ms-powerpoint'|| files[0].contentType === 'application/vnd.openxmlformats-officedocument.presentationml.presentation') {
// render PDF to browser
gfs.openDownloadStreamByName(req.params.filename).pipe(res);
} else {
res.status(404).json({
err: 'Not a PDF',
});
}
});
});
/*
DELETE: Delete a particular file by an ID
*/
imageRouter.route('/file/del/:id')
.post((req, res, next) => {
console.log(req.params.id);
gfs.delete(new mongoose.Types.ObjectId(req.params.id), (err, data) => {
if (err) {
return res.status(404).json({ err: err });
}
res.status(200).json({
success: true,
message: `File with ID ${req.params.id} is deleted`,
});
});
});
return imageRouter;
};
\ No newline at end of file
......@@ -13,6 +13,7 @@ questionRouter.route('/').get(function(req, res) {
});
});
questionRouter.route('/:id').get(function (req, res) {
let id = req.params.id;
Question.findById(id, function (err, question) {
......@@ -32,43 +33,20 @@ questionRouter.route('/questionId/:id').get(function (req, res) {
questionRouter.route('/add').post(function(req, res) {
const question = new Question({
question_id: new mongoose.Types.ObjectId(),
category : req.body.category,
name : req.body.name,
lesson_no : req.body.lesson_no,
lesson_name : req.body.lesson_name,
question_text: req.body.question_text,
question_answer:req.body.question_answer,
defult_mark: req.body.defult_mark,
q_type: req.body.q_type,
time_createdby: req.body.time_createdby,
time_modifiedby: req.body.time_modifiedby,
general_feedback: req.body.general_feedback
});
question
.save()
.then(result => {
res.json(result);
console.log(result);
res.status(201).json({
message: "Created product successfully",
createdProduct: {
category: result.category,
name: result.name,
question_text: result.question_text,
defult_mark: result.defult_mark,
q_type: result.q_type,
time_createdby: req.body.time_createdby,
time_modifiedby: req.body.time_modifiedby,
general_feedback: req.body.general_feedback,
question_id: result.question_id,
request: {
type: 'GET',
url: "http://localhost:5000/questions/" + result._id
}
}
});
})
.catch(err => {
console.log(err);
res.status(500).json({error: err});
question.save().then(question =>{
res.json('Item update!');
})
.catch(err =>{
res.status(400).send("Update not possible");
});
});
......@@ -77,8 +55,8 @@ questionRouter.route('/update/:id').post((req, res) => {
if(!question)
req.status(404).send("data is not found");
else {
question.category = req.body.category;
question.name = req.body.name;
question.lesson_no = req.body.lesson_no;
question.lesson_name = req.body.lesson_name;
question.question_text = req.body.question_text;
question.question_answer = req.body.question_answer;
question.defult_mark = req.body.defult_mark;
......@@ -96,7 +74,14 @@ questionRouter.route('/update/:id').post((req, res) => {
});
});
questionRouter.route('c').get(function (req, res) {
console.log("Product Item ID");
console.log(req.params.id);
let id = req.params.id;
Question.find({"lesson_no" : id}, function (err, product) {
res.json(product);
});
});
questionRouter.route('/delete/:id').delete((req, res) => {
Question.findByIdAndDelete(req.params.id)
......
const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const methodOverride = require('method-override');
const config = require('./config');
const multer = require('multer');
const {GridFsStorage} = require('multer-gridfs-storage');
const crypto = require('crypto');
const cors = require('cors');
const bodyParser = require('body-parser');
const mongoose =require('mongoose');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 5001;
const port = process.env.PORT || 5000;
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(cors({
origin: '*',
}));
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(methodOverride('_method'));
app.use(express.static(path.join(__dirname, 'public')));
mongoose.Promise = require('bluebird');
const uri = process.env.ATLAS_URI;
mongoose.connect(uri,{useNewUrlParser:true, useUnifiedTopology: true, useCreateIndex:true, useFindAndModify: false });
const url = config.mongoURI;
const connect = mongoose.connect(url, { useNewUrlParser:true, useUnifiedTopology: true, useCreateIndex:true, useFindAndModify: false });
const connection = mongoose.connection;
connection.once('open',() => {
console.log("MongoDB database connection established successfully");
}).catch(err => {
console.error('App starting error:', err.stack);
process.exit(1);
connect.then(() => {
console.log('Connected to database: GridApp');
}, (err) => console.log(err));
// create storage engine
const storage = new GridFsStorage({
url: config.mongoURI,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString('hex') + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'uploads'
};
resolve(fileInfo);
});
});
}
});
const upload = multer({ storage });
// const connection = mongoose.connection;
// connection.once('open',() => {
// console.log("MongoDB database connection established successfully");
// }).catch(err => {
// console.error('App starting error:', err.stack);
// process.exit(1);
// });
const studentRouter = require('./routes/student.route');
const tutorRouter = require('./routes/tutor.route');
const instituteRouter = require('./routes/institute.route');
......@@ -29,21 +81,19 @@ const userAccount = require('./routes/userAccount.route');
const questionManage = require('./routes/question.route');
const financeRouter = require('./routes/finance.route');
const studentResult = require('./routes/studentALResult.route');
const tutorRating = require('./routes/tutorRatings.route');
const filteredList = require('./routes/filteredListNew.route');
const createClassRoute = require('./routes/createClass.route');
const imageRouter = require('./routes/pdf.route');
const answerManage = require('./routes/answer_route');
app.use('/studentSingUp',studentRouter);
app.use('/tutorSingUp',tutorRouter);
app.use('/instituteSingUp',instituteRouter);
app.use('/userAccount',userAccount);
app.use('/questions', questionManage);
app.use('/answer', answerManage);
app.use('/admin/finance', financeRouter);
app.use('/studentResults', studentResult);
app.use('/tutorRatings', tutorRating);
app.use('/filteredList', filteredList);
app.use('/createClass', createClassRoute);
app.use('/', imageRouter(upload));
app.listen(port, () => {
console.log(`Server is running on Port: ${port}`);
});
\ No newline at end of file
});
......@@ -2305,11 +2305,28 @@
"resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz",
"integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA=="
},
"@types/prop-types": {
"version": "15.7.4",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
"integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==",
"dev": true
},
"@types/q": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
"integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug=="
},
"@types/react": {
"version": "17.0.26",
"resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.26.tgz",
"integrity": "sha512-MXxuXrH2xOcv5cp/su4oz69dNQnSA90JjFw5HBd5wifw6Ihi94j7dRJm7qNsB30tnruXSCPc9qmlhGop4nh9Hw==",
"dev": true,
"requires": {
"@types/prop-types": "*",
"@types/scheduler": "*",
"csstype": "^3.0.2"
}
},
"@types/resolve": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
......@@ -2318,6 +2335,12 @@
"@types/node": "*"
}
},
"@types/scheduler": {
"version": "0.16.2",
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
"integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==",
"dev": true
},
"@types/source-list-map": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
......@@ -4775,6 +4798,12 @@
}
}
},
"csstype": {
"version": "3.0.9",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz",
"integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==",
"dev": true
},
"cyclist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
......@@ -12341,6 +12370,14 @@
"object-assign": "^4.1.1"
}
},
"react-addons-shallow-compare": {
"version": "15.6.3",
"resolved": "https://registry.npmjs.org/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.3.tgz",
"integrity": "sha512-EDJbgKTtGRLhr3wiGDXK/+AEJ59yqGS+tKE6mue0aNXT6ZMR7VJbbzIiT6akotmHg1BLj46ElJSb+NBMp80XBg==",
"requires": {
"object-assign": "^4.1.0"
}
},
"react-app-polyfill": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz",
......@@ -12645,6 +12682,14 @@
"prop-types": "^15.6.1"
}
},
"react.pure.component": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/react.pure.component/-/react.pure.component-1.2.0.tgz",
"integrity": "sha1-8nuetnM3rtQ8XQ2sY4lD7Zux3hE=",
"requires": {
"react-addons-shallow-compare": "^15.3.2"
}
},
"read-pkg": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
......@@ -14881,6 +14926,11 @@
"is-typedarray": "^1.0.0"
}
},
"typescript": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz",
"integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA=="
},
"unbox-primitive": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
......
......@@ -18,7 +18,9 @@
"react-scripts": "4.0.3",
"react-select-search": "^3.0.8",
"react-star-rating-component": "^1.4.1",
"react.pure.component": "^1.2.0",
"sweetalert": "^2.1.2",
"typescript": "^4.4.3",
"web-vitals": "^1.1.1"
},
"scripts": {
......@@ -46,6 +48,7 @@
]
},
"devDependencies": {
"@types/react": "^17.0.26",
"axios": "^0.21.1",
"react-notify-toast": "^0.5.1"
}
......
......@@ -11,7 +11,9 @@
<link rel="stylesheet" href="DashboardAssets/css/dashboard.css">
<link rel="stylesheet" href="DashboardAssets/css/custom.css">
<!-- fa fa icons cdn -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.7/css/all.css">
</head>
<body>
......
......@@ -14,9 +14,11 @@ import Dashboard from "./Components/Admin/Dashboard";
import StudentDashboard from "./Components/Student/StudentDashboard";
import QuestionDetails from "./Components/IT18050240/question_details"
import QuestionLayout from "./Components/IT18050240/question_layout"
//import AdminQuestionManagement from "./Components/IT18050240/admin_question_management.js"
import AdminQuestionManagement from "./Components/IT18050240/admin_question_management.js"
import QuestionBank from "./Components/IT18050240/question_bank"
import TutorProfileView from "./Components/HomePage/TutorProfileView";
import LessonAndExam from "./Components/IT18050240/lessonandexampage";
import AutomaticQuestion from "./Components/IT18050240/automatic_question"
import Upload from "./Components/IT18050240/UploadPage";
function App() {
return (
......@@ -28,8 +30,7 @@ function App() {
<Route path="/SignUp" exact component={SignUp}/>
<Route path="/beforeConfirm" exact component={beforeConfirmation}/>
<Route path="/AccountVerified/:id" exact component={VerifiedAccount}/>
<Route path="/Home/ViewProfile/:id" exact component={TutorProfileView}/>
<Route path="/studentDashboard" exact component={StudentDashboard}/>
{/*<Route path="/studentDashboard" exact component={StudentDashboard}/>*/}
{/*<Route path="/" exact component={Dashboard}/>*/}
......@@ -37,10 +38,13 @@ function App() {
<Route path="/admin"><Dashboard/></Route>
<Route path="/studentDashboard"><StudentDashboard/></Route>
<Route path="/questiondetails" exact component={QuestionDetails}/>
<Route path="/question" exact component={QuestionLayout}/>
{/*<Route path="/questionmanagement" exact component={AdminQuestionManagement}/>*/}
<Route path="/question/:id" exact component={QuestionLayout}/>
<Route path="/questionmanagement/:id" exact component={AdminQuestionManagement}/>
<Route path="/questionbank" exact component={QuestionBank}/>
{/*<Route path="/edititem/:id" exact component={AdminQuestionManagement}/>*/}
<Route path="/questionmanagement" exact component={AdminQuestionManagement}/>
<Route path="/lesson" exact component={LessonAndExam}/>
<Route path="/automaticquestion" exact component={AutomaticQuestion}/>
<Route path="/upload" exact component={Upload}/>
</Switch>
......
......@@ -382,6 +382,37 @@ export default class Dashboard extends Component {
{/*</Link>*/}
</li>
<li>
<a href="#">
<i className="metismenu-icon fa fa-book"></i>
Exams
<i className="metismenu-state-icon fa fa-caret-down"></i>
</a>
<ul>
<li>
<NavLink to={"/questionbank"}>
<i className="metismenu-icon"></i>
Question Bank
</NavLink>
</li>
</ul>
</li>
<li>
<a href="#">
<i className="metismenu-icon fa fa-book"></i>
Lesson
<i className="metismenu-state-icon fa fa-caret-down"></i>
</a>
<ul>
<li>
<NavLink to={"/upload"}>
<i className="metismenu-icon"></i>
Lesson upload
</NavLink>
</li>
</ul>
</li>
<li>
<a href="#">
......
import React, { PureComponent } from 'react';
import axios from 'axios';
import PDF from '../../Images/pdficon.png';
import PW from '../../Images/pptxicon.png';
interface UploadState {
recentImage: any;
caption: string;
uploadedImageUrl: string;
uploadedImage: any;
imagename: string;
filetype :string,
lessonname:string,
lessonno: any,
filename :string
};
class UploadPage extends PureComponent<{}, UploadState> {
constructor(props: {}) {
super(props);
this.state = {
recentImage: {},
caption: '',
uploadedImageUrl: '',
uploadedImage: {},
imagename : '',
filetype: '',
lessonname:'',
lessonno:'',
filename:''
};
}
componentDidMount = () => {
this.fetchRecent();
}
componentDidUpdate=()=> {
this.fetchRecent();
}
fetchRecent = () => {
axios.get('http://localhost:5000/recent')
.then((response) => {
this.setState({
filename: response.data.filename,
lessonname :response.data.lessonname,
lessonno :response.data.lessonno
});
})
.catch(err => alert('Error: ' + err));
//let str = this.state.filename;
//
// if (str.includes(".pdf")) {
// this.setState({
// imagename: PDF,
// filetype : ".pdf"
// });
// }else if (str.includes(".pptx")) {
// this.setState({
// imagename: PW,
// filetype :".pptx"
// });
// }
}
uploadImage = () => {
if (!this.state.caption.trim() || !this.state.uploadedImage.name) {
return alert('Caption or file is missing');
}
let formData = new FormData();
formData.append('caption', this.state.caption);
formData.append('file', this.state.uploadedImage);
formData.append('lessonno', this.state.lessonno);
formData.append('lessonname', this.state.lessonname);
axios.post('http://localhost:5000/', formData)
.then((response) => {
response.data.success ? alert('File successfully uploaded') : alert('File already exists');
this.fetchRecent();
})
.catch(err => alert('Error: ' + err));
}
render() {
return (
<div className="UploadPage">
<div className="Recent">
<div className="container text-left">
<div className="col-10" >
<hr />
<div className="row">
<div className="col-sm-6">
<label>Lesson name: </label>
<div style={{padding: '0px'}}>
<input type="text" required className="form-control"
onChange={event => this.setState({ lessonname: event.target.value })}
value={this.state.lessonname}/>
</div>
</div>
<div className="col-sm-6">
<label>Lesson no: </label>
<div style={{padding: '0px'}}>
<input type="text" required className="form-control"
onChange={event => this.setState({ lessonno: event.target.value })}
value={this.state.lessonno}/>
</div>
</div>
</div>
<div className="row">
<div className="col-sm-6">
<label>Lesson caption: </label>
<div style={{padding: '0px'}}>
<input
type="text"
className="form-control"
placeholder="Enter caption..."
onChange={event => this.setState({ caption: event.target.value })}
value={this.state.caption}
/>
</div>
</div>
<div className="col-sm-6">
<label>Upload file: </label>
<div style={{padding: '0px'}}>
<input
type="file"
className="Upload__Input"
onChange={(event: any) => {
this.setState({
uploadedImageUrl: URL.createObjectURL(event.target.files[0]),
uploadedImage: event.target.files[0],
})
}}
/>
</div>
</div>
</div>
<div className="row">
<div className="col-sm-12">
<button type ="submit" value ="Submit"
className = "btn btn-block btn-success mt-3" onClick={this.uploadImage}> ADD
</button>
</div>
</div>
<br/><br/>
<div className="border">
<div style={{margin: "15px"}}>
<h5 className="text-center"> Recent Upload File </h5>
<p className="text-center"> File type : (.pdf) <img src={PDF} alt="upload-image" style={{width:'30px'}}/> </p>
<p className="text-center"> Lesson No: 1 {this.state.lessonno} </p>
<p className="text-center"> Lesson Name: Accounting{this.state.lessonname} </p>
</div>
</div>
</div>
<br/><br/>
</div></div>
</div>
);
}
}
export default UploadPage;
import React, { Component } from 'react';
import axios from 'axios';
//import swal from 'sweetalert';
import { Link } from "react-router-dom";
import swal from "sweetalert";
export default class Automatic_question extends Component {
constructor(props){
super(props);
this.onChangeLessonNo = this.onChangeLessonNo.bind(this);
this.onChangeLessonName = this.onChangeLessonName.bind(this);
this.onChangeDefultMark = this.onChangeDefultMark.bind(this);
this.onChangeFeedBack = this.onChangeFeedBack.bind(this);
this.onSubmit = this.onSubmit.bind(this);
this.state = {
lesson_no : '',
lesson_name : '',
defult_mark : '',
general_feedback : '',
}
}
onChangeLessonNo(e){
this.setState({
lesson_no :e.target.value
});
}
onChangeLessonName(e){
this.setState({
lesson_name :e.target.value
});
}
onChangeDefultMark(e){
this.setState({
defult_mark :e.target.value
});
}
onChangeFeedBack(e){
this.setState({
general_feedback :e.target.value
});
}
async onSubmit(e) {
e.preventDefault();
//if(this.state.item_name != null && this.state.item_description != null && this.state.item_category != null && this.state.item_quantity != null && this.state.item_price){
console.log(`Form submitted:`);
console.log(`Lesson Name: ${this.state.lesson_name}`);
console.log(`Lesson No: ${this.state.lesson_no}`);
console.log(`Defualt mark: ${this.state.defult_mark}`);
console.log(`Genaral Feedback: ${this.state.general_feedback}`);
const newQuestion = {
lesson_no: this.state.lesson_no,
lesson_name: this.state.lesson_name,
defult_mark: this.state.defult_mark,
general_feedback: this.state.general_feedback,
};
let options = {
uri: 'http://127.0.0.1:5000/generate',
body: JSON.stringify(newQuestion),
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
}
let response = await axios.post(options.uri, options.body);
console.log(response.data.result);
// axios.post('http://127.0.0.1:5000/generate')
// .then(res => {this.setState({
// question_id: res.data.question_id})
// })
// .catch(//swal("Good job!", "You clicked the button!", "warning"
// );
// swal("Data Saved Successfully!", "Your Details has been Saved Successfully!", "success");
}
render() {
return (
<div className="container">
<form onSubmit={this.onSubmit}>
<div className="row">
<div className="col-sm-5">
<label>Lesson no: </label>
<div style={{padding: '0px'}}>
<input type="text" required
className="form-control"
value={this.state.lesson_no}
onChange={this.onChangeLessonNo}
/>
</div>
</div>
<div className="col-sm-5">
<label>Lesson name: </label>
<div style={{padding: '0px'}}>
<input type="text" required
className="form-control"
value={this.state.lesson_name}
onChange={this.onChangeLessonName}
/>
</div>
</div>
<div className="col-sm-5">
<label>defult_mark: </label>
<div style={{padding: '0px'}}>
<input type="text" required
className="form-control"
value={this.state.defult_mark}
onChange={this.onChangeDefultMark}
/>
</div>
</div>
<div className="col-sm-5">
<label>general_feedback: </label>
<div style={{padding: '0px'}}>
<input type="text" required
className="form-control"
value={this.state.general_feedback}
onChange={this.onChangeFeedBack}
/>
</div>
</div>
</div>
<div className="row">
<div className="col-sm-10">
<label style={{textAlign: 'left'}} >Question text: </label>
<textarea
className="form-control" required
/>
<br/>
<button className="btn btn-block btn btn-secondary" type="submit" value="Submit" style={{ color: "white" }}>Create New Quiz</button>
</div>
</div>
</form>
</div>
)
}
}
\ No newline at end of file
import React, {Component} from 'react';
import axios from 'axios';
import {Link} from "react-router-dom";
import EX from '../../Images/exam.png';
import LS from '../../Images/lesson.png';
export default class LessonAndExam extends Component {
constructor(props) {
super(props);
this.state = {
lessonList:[]
}
}
componentDidMount = () => {
let quizLessonTemp = []
axios.get('http://localhost:5000/')
.then(response => {
console.log(response);
this.setState({ lessonList: response.data.images });
console.log(this.state.lessonList.length)
})
.catch(err => alert(err));
}
render(){
return(
<div className="container">
{this.state.lessonList.map((file) => (
<div className="">
<div className="p-3 mb-2 bg-light text-dark text-left">Accounting Lecture {file.lessonno}</div>
<div className="text-left ml-3">
</div>
<div className="row">
<div className="col-1">
<div style={{padding: '0px'}}>
<img src={EX} alt="upload-image" style={{width:'35px'}}/>
<hr/>
<img src={LS} alt="upload-image" style={{width:'35px'}}/>
</div>
</div>
<div style={{padding: '0px'}}>
<a href={'http://localhost:5000/pdf/'+ file.filename}><p style={{marginTop: '7px'}}>{file.lessonname}</p></a>
<br/>
<a href={'/question/'+ file.lessonno}><p style={{marginTop: '7px'}}>Exam {file.lessonno}</p></a>
</div>
</div>
</div>
))
}
</div>
)
}
}
\ No newline at end of file
import React, { Component } from 'react';
import axios from 'axios';
import { Link } from "react-router-dom";
import swal from 'sweetalert';
const Quantity = props => (
<tr>
{/*<td>{props.quantity.item_id}</td>*/}
<td>{props.quantity.question_text}</td>
<td>{props.quantity.question_answer}</td>
<td>{props.quantity.time_modifiedby}</td>
<td>{props.questions.lesson_no}</td>
<td>{props.questions.question_text}</td>
<td>{props.questions.question_answer}</td>
<td>
<div>
<Link className="mx-1 text-success fas fa-pen text-decoration-none" to={"/edititem/"+props.quantity._id}></Link> <span className=" mx-1 text-danger fas fa-trash" href='#' onClick={()=>{props.deleteProduct(props.quantity._id)}} ></span>
<Link className="text-success fas fa-edit" to={"/questionmanagement/"+props.questions._id}></Link> <span className=" mx-1 text-danger fas fa-trash" href='#' onClick={()=>{props.deleteProduct(props.questions._id)}} ></span>
</div>
</td>
</tr>
......@@ -29,13 +28,13 @@ export default class QuestionBankUI extends Component {
this.state = {
q_type: '',
quantity: []
questions: []
}
}
quantityList() {
return this.state.quantity.map(currentTodo => {
return <Quantity quantity={currentTodo} deleteProduct={this.deleteProduct} key={currentTodo._id} />
return this.state.questions.map(currentTodo => {
return <Quantity questions={currentTodo} deleteProduct={this.deleteProduct} key={currentTodo._id} />
});
}
......@@ -43,7 +42,7 @@ export default class QuestionBankUI extends Component {
axios.get('http://localhost:5000/questions/')
.then(response => {
this.setState({ quantity: response.data });
this.setState({ questions: response.data });
})
.catch(function (error) {
console.log(error);
......@@ -56,7 +55,7 @@ export default class QuestionBankUI extends Component {
axios.get('http://localhost:5000/questions/')
.then(response => {
this.setState({ quantity: response.data });
this.setState({ questions: response.data });
})
.catch(function (error) {
console.log(error);
......@@ -74,13 +73,9 @@ export default class QuestionBankUI extends Component {
onSubmit(e) {
e.preventDefault();
console.log(`Question type: ${this.state.q_type}`);
if (this.state.q_type == "Multiple_choice") {
window.location = '/questionmanagement/';
} else {
//console.log(`Question type: ${this.state.q_type}`);
window.location = '/questionmanagement/';
}
//window.location = '/admin/pcategory';
}
......@@ -88,7 +83,7 @@ export default class QuestionBankUI extends Component {
axios.delete('http://localhost:5000/questions/delete/'+pid)
.then(res => console.log(res.data));
this.setState({
quantity:this.state.quantity.filter(el => el.pid !==pid)
questions:this.state.questions.filter(el => el.pid !==pid)
});
}
......@@ -96,46 +91,27 @@ export default class QuestionBankUI extends Component {
return (
<div className="container text-left">
<div className="col-sm-10" >
<h4> Business Studies</h4>
<h6>Dashboard/My courses/Business Studies/Question bank/Questions</h6>
<hr />
</div>
<form onSubmit={this.onSubmit}>
<div className="col-sm-10" >
<div className="row" >
<div className="col-sm-1 mt-1"><label>Category: </label>
</div>
<div className="col-sm-5">
<div style={{ padding: '0px' }}>
<select style={{ width: '100%' }} className="browser-default custom-select"
onChange={(e) => this.onChangeQType(e)}>
<option>Select Question Type</option>
<option key="Multiple_choice" value="Multiple_choice">Multiple choice</option>
<option key="True_False" value="True_False">True/False</option>)
</select>
</div>
</div>
<div className="col-sm-3">
<button className="btn btn-block btn btn-secondary" type="submit" value="Submit" style={{ color: "white" }}>Create new Question</button>
<Link style={{textDecoration:"none"}} to={"/questionmanagement"}><button className="btn btn-block btn btn-secondary" style={{color:"white"}}>Create new Question</button></Link>
</div>
<div className="col-sm-3">
<button className="btn btn-block btn btn-info" type="submit" value="Submit" style={{ color: "white" }}>Auto Genarate Question</button>
<Link style={{textDecoration:"none"}} to={"/automaticquestion"}><button className="btn btn-block btn btn-info" style={{color:"white"}}>Auto Genarate Question</button></Link>
</div>
</div></div>
</form>
<br/>
......@@ -144,9 +120,9 @@ export default class QuestionBankUI extends Component {
<table className="table" >
<thead>
<tr>
<th><h6>Question Text</h6></th>
<th><h6>Question Answer</h6></th>
<th><h6>Last modified by</h6></th>
<th><h6>Lesson</h6></th>
<th><h6>Question</h6></th>
<th><h6>Answer</h6></th>
<th className="col-sm-1"><h6>Action </h6></th>
</tr>
</thead>
......
......@@ -99,7 +99,7 @@ export default class QuestionLayout extends Component {
// if (this.state.item_id != null) {
axios.get('http://localhost:5000/questions/')
axios.get('http://localhost:5000/questions/lessonNo/1')
.then(response => {
//this.setState({productQuantities: response.data});
let CategoryList = [];
......
......@@ -388,8 +388,9 @@ export default class StudentDashboard extends Component {
<ul>
<li>
<a href="#">
<i className="metismenu-icon"></i>
<i className="metismenu-icon"> </i>
19-Acc-Sasip
</a>
</li>
<li>
......@@ -409,7 +410,7 @@ export default class StudentDashboard extends Component {
</a>
<ul>
<li>
<a href="#">
<a href="/lesson">
<i className="metismenu-icon"></i>
19-Acc-Sasip
</a>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment