Moving admin functions to API calls
							parent
							
								
									bc02499bda
								
							
						
					
					
						commit
						b2f58fbe4b
					
				
							
								
								
									
										13
									
								
								lib/auth.js
								
								
								
								
							
							
						
						
									
										13
									
								
								lib/auth.js
								
								
								
								
							|  | @ -15,14 +15,13 @@ const restrictedRoutes = [ | ||||||
|     { route: '/admin/settings/update', response: 'json' }, |     { route: '/admin/settings/update', response: 'json' }, | ||||||
|     { route: '/admin/settings/pages/new', response: 'redirect' }, |     { route: '/admin/settings/pages/new', response: 'redirect' }, | ||||||
|     { route: '/admin/settings/pages/edit/:page', response: 'redirect' }, |     { route: '/admin/settings/pages/edit/:page', response: 'redirect' }, | ||||||
|     { route: '/admin/settings/pages/update', response: 'json' }, |     { route: '/admin/settings/pages', response: 'json' }, | ||||||
|     { route: '/admin/settings/pages/delete/:page', response: 'redirect' }, |     { route: '/admin/settings/page/delete/:page', response: 'json' }, | ||||||
|     { route: '/admin/settings/menu/new', response: 'redirect' }, |     { route: '/admin/settings/menu/new', response: 'json' }, | ||||||
|     { route: '/admin/settings/menu/update', response: 'redirect' }, |     { route: '/admin/settings/menu/update', response: 'json' }, | ||||||
|     { route: '/admin/settings/menu/delete/:menuid', response: 'redirect' }, |     { route: '/admin/settings/menu/delete', response: 'json' }, | ||||||
|     { route: '/admin/settings/menu/save_order', response: 'json' }, |     { route: '/admin/settings/menu/save_order', response: 'json' }, | ||||||
|     { route: '/admin/file/upload', response: 'redirect' }, |     { route: '/admin/file/upload', response: 'json' } | ||||||
|     { route: '/admin/file/delete', response: 'json' } |  | ||||||
| ]; | ]; | ||||||
| 
 | 
 | ||||||
| const restrict = (req, res, next) => { | const restrict = (req, res, next) => { | ||||||
|  |  | ||||||
|  | @ -165,5 +165,6 @@ | ||||||
| 	"New user": "New user", | 	"New user": "New user", | ||||||
| 	"Payment ID": "Payment ID", | 	"Payment ID": "Payment ID", | ||||||
| 	"Payment Message": "Payment Message", | 	"Payment Message": "Payment Message", | ||||||
| 	"Password": "Password" | 	"Password": "Password", | ||||||
|  | 	"Cart Email": "Cart Email" | ||||||
| } | } | ||||||
|  | @ -284,30 +284,11 @@ $(document).ready(function (){ | ||||||
|         customCss.setValue(customCssBeautified); |         customCss.setValue(customCssBeautified); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // call update settings API
 |  | ||||||
|     $('#settings-menu-new').on('click', function(e){ |  | ||||||
|         e.preventDefault(); |  | ||||||
|         $.ajax({ |  | ||||||
|             method: 'POST', |  | ||||||
|             url: '/admin/settings/menu/new', |  | ||||||
|             data: { |  | ||||||
|                 navMenu: $('#navMenu').val(), |  | ||||||
|                 navLink: $('#navLink').val() |  | ||||||
|             } |  | ||||||
|         }) |  | ||||||
|         .done(function(msg){ |  | ||||||
|             showNotification(msg.message, 'success', true); |  | ||||||
|         }) |  | ||||||
|         .fail(function(msg){ |  | ||||||
|             showNotification(msg.message, 'danger', true); |  | ||||||
|         }); |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     $(document).on('click', '#btnPageUpdate', function(e){ |     $(document).on('click', '#btnPageUpdate', function(e){ | ||||||
|         e.preventDefault(); |         e.preventDefault(); | ||||||
|         $.ajax({ |         $.ajax({ | ||||||
|             method: 'POST', |             method: 'POST', | ||||||
|             url: '/admin/settings/pages/update', |             url: '/admin/settings/page', | ||||||
|             data: { |             data: { | ||||||
|                 page_id: $('#page_id').val(), |                 page_id: $('#page_id').val(), | ||||||
|                 pageName: $('#pageName').val(), |                 pageName: $('#pageName').val(), | ||||||
|  | @ -323,4 +304,104 @@ $(document).ready(function (){ | ||||||
|             showNotification(msg.responseJSON.message, 'danger'); |             showNotification(msg.responseJSON.message, 'danger'); | ||||||
|         }); |         }); | ||||||
|     }); |     }); | ||||||
|  | 
 | ||||||
|  |     $(document).on('click', '#btnPageDelete', function(e){ | ||||||
|  |         e.preventDefault(); | ||||||
|  |         if(confirm('Are you sure?')){ | ||||||
|  |             $.ajax({ | ||||||
|  |                 method: 'POST', | ||||||
|  |                 url: '/admin/settings/page/delete', | ||||||
|  |                 data: { | ||||||
|  |                     pageId: $(this).attr('data-id') | ||||||
|  |                 } | ||||||
|  |             }) | ||||||
|  |             .done(function(msg){ | ||||||
|  |                 showNotification(msg.message, 'success', true); | ||||||
|  |             }) | ||||||
|  |             .fail(function(msg){ | ||||||
|  |                 showNotification(msg.message, 'danger', true); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     $(document).on('click', '#settings-menu-new', function(e){ | ||||||
|  |         e.preventDefault(); | ||||||
|  |         $.ajax({ | ||||||
|  |             method: 'POST', | ||||||
|  |             url: '/admin/settings/menu/new', | ||||||
|  |             data: { | ||||||
|  |                 navMenu: $('#newNavMenu').val(), | ||||||
|  |                 navLink: $('#newNavLink').val() | ||||||
|  |             } | ||||||
|  |         }) | ||||||
|  |         .done(function(msg){ | ||||||
|  |             showNotification(msg.message, 'success', true); | ||||||
|  |         }) | ||||||
|  |         .fail(function(msg){ | ||||||
|  |             showNotification(msg.message, 'danger', true); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     $(document).on('click', '#settings-menu-update', function(e){ | ||||||
|  |         e.preventDefault(); | ||||||
|  |         var id = $(this).attr('data-id'); | ||||||
|  |         var parentEl = $('#menuId-' + id); | ||||||
|  |         $.ajax({ | ||||||
|  |             method: 'POST', | ||||||
|  |             url: '/admin/settings/menu/update', | ||||||
|  |             data: { | ||||||
|  |                 navId: parentEl.find('.navId').val(), | ||||||
|  |                 navMenu: parentEl.find('.navMenu').val(), | ||||||
|  |                 navLink: parentEl.find('.navLink').val() | ||||||
|  |             } | ||||||
|  |         }) | ||||||
|  |         .done(function(msg){ | ||||||
|  |             showNotification(msg.message, 'success', true); | ||||||
|  |         }) | ||||||
|  |         .fail(function(msg){ | ||||||
|  |             showNotification(msg.message, 'danger', true); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     $(document).on('click', '.settings-menu-delete', function(e){ | ||||||
|  |         e.preventDefault(); | ||||||
|  | 
 | ||||||
|  |         if(confirm('Are you sure?')){ | ||||||
|  |             $.ajax({ | ||||||
|  |                 method: 'POST', | ||||||
|  |                 url: '/admin/settings/menu/delete', | ||||||
|  |                 data: { | ||||||
|  |                     menuId: $(this).attr('data-id') | ||||||
|  |                 } | ||||||
|  |             }) | ||||||
|  |             .done(function(msg){ | ||||||
|  |                 showNotification(msg.message, 'success', true); | ||||||
|  |             }) | ||||||
|  |             .fail(function(msg){ | ||||||
|  |                 showNotification(msg.message, 'danger', true); | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     $(document).on('click', '#uploadButton', function(e){ | ||||||
|  |         e.preventDefault(); | ||||||
|  |         var formData = new FormData($('#uploadForm')[0]); | ||||||
|  |         formData.append('productId', $('#productId').val()); | ||||||
|  | 
 | ||||||
|  |         // Upload file
 | ||||||
|  |         $.ajax({ | ||||||
|  |             method: 'POST', | ||||||
|  |             url: '/admin/file/upload', | ||||||
|  |             processData: false, | ||||||
|  |             contentType: false, | ||||||
|  |             cache: false, | ||||||
|  |             data: formData | ||||||
|  |         }) | ||||||
|  |         .done(function(msg){ | ||||||
|  |             showNotification(msg.message, 'success', true); | ||||||
|  |         }) | ||||||
|  |         .fail(function(msg){ | ||||||
|  |             showNotification(msg.responseJSON.message, 'danger'); | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
| }); | }); | ||||||
|  |  | ||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										155
									
								
								routes/admin.js
								
								
								
								
							
							
						
						
									
										155
									
								
								routes/admin.js
								
								
								
								
							|  | @ -7,7 +7,6 @@ const bcrypt = require('bcryptjs'); | ||||||
| const fs = require('fs'); | const fs = require('fs'); | ||||||
| const path = require('path'); | const path = require('path'); | ||||||
| const multer = require('multer'); | const multer = require('multer'); | ||||||
| const glob = require('glob'); |  | ||||||
| const mime = require('mime-type/with-db'); | const mime = require('mime-type/with-db'); | ||||||
| const ObjectId = require('mongodb').ObjectID; | const ObjectId = require('mongodb').ObjectID; | ||||||
| const router = express.Router(); | const router = express.Router(); | ||||||
|  | @ -132,7 +131,7 @@ router.post('/admin/setup_action', async (req, res) => { | ||||||
|     res.redirect('/admin/login'); |     res.redirect('/admin/login'); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // settings update
 | // settings
 | ||||||
| router.get('/admin/settings', restrict, (req, res) => { | router.get('/admin/settings', restrict, (req, res) => { | ||||||
|     res.render('settings', { |     res.render('settings', { | ||||||
|         title: 'Cart settings', |         title: 'Cart settings', | ||||||
|  | @ -148,7 +147,7 @@ router.get('/admin/settings', restrict, (req, res) => { | ||||||
|     }); |     }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // settings update
 | // create API key
 | ||||||
| router.post('/admin/createApiKey', restrict, checkAccess, async (req, res) => { | router.post('/admin/createApiKey', restrict, checkAccess, async (req, res) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
|     const result = await db.users.findOneAndUpdate({ |     const result = await db.users.findOneAndUpdate({ | ||||||
|  | @ -180,7 +179,7 @@ router.post('/admin/settings/update', restrict, checkAccess, (req, res) => { | ||||||
|     res.status(400).json({ message: 'Permission denied' }); |     res.status(400).json({ message: 'Permission denied' }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // settings update
 | // settings menu
 | ||||||
| router.get('/admin/settings/menu', restrict, async (req, res) => { | router.get('/admin/settings/menu', restrict, async (req, res) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
|     res.render('settings_menu', { |     res.render('settings_menu', { | ||||||
|  | @ -195,7 +194,7 @@ router.get('/admin/settings/menu', restrict, async (req, res) => { | ||||||
|     }); |     }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // settings page list
 | // page list
 | ||||||
| router.get('/admin/settings/pages', restrict, async (req, res) => { | router.get('/admin/settings/pages', restrict, async (req, res) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
|     const pages = await db.pages.find({}).toArray(); |     const pages = await db.pages.find({}).toArray(); | ||||||
|  | @ -213,11 +212,11 @@ router.get('/admin/settings/pages', restrict, async (req, res) => { | ||||||
|     }); |     }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // settings pages new
 | // pages new
 | ||||||
| router.get('/admin/settings/pages/new', restrict, checkAccess, async (req, res) => { | router.get('/admin/settings/pages/new', restrict, checkAccess, async (req, res) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
| 
 | 
 | ||||||
|     res.render('settings_page_edit', { |     res.render('settings_page', { | ||||||
|         title: 'Static pages', |         title: 'Static pages', | ||||||
|         session: req.session, |         session: req.session, | ||||||
|         admin: true, |         admin: true, | ||||||
|  | @ -230,7 +229,7 @@ router.get('/admin/settings/pages/new', restrict, checkAccess, async (req, res) | ||||||
|     }); |     }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // settings pages editor
 | // pages editor
 | ||||||
| router.get('/admin/settings/pages/edit/:page', restrict, checkAccess, async (req, res) => { | router.get('/admin/settings/pages/edit/:page', restrict, checkAccess, async (req, res) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
|     const page = await db.pages.findOne({ _id: common.getId(req.params.page) }); |     const page = await db.pages.findOne({ _id: common.getId(req.params.page) }); | ||||||
|  | @ -247,7 +246,7 @@ router.get('/admin/settings/pages/edit/:page', restrict, checkAccess, async (req | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     res.render('settings_page_edit', { |     res.render('settings_page', { | ||||||
|         title: 'Static pages', |         title: 'Static pages', | ||||||
|         page: page, |         page: page, | ||||||
|         button_text: 'Update', |         button_text: 'Update', | ||||||
|  | @ -261,8 +260,8 @@ router.get('/admin/settings/pages/edit/:page', restrict, checkAccess, async (req | ||||||
|     }); |     }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // settings update page
 | // insert/update page
 | ||||||
| router.post('/admin/settings/pages/update', restrict, checkAccess, async (req, res) => { | router.post('/admin/settings/page', restrict, checkAccess, async (req, res) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
| 
 | 
 | ||||||
|     const doc = { |     const doc = { | ||||||
|  | @ -297,50 +296,46 @@ router.post('/admin/settings/pages/update', restrict, checkAccess, async (req, r | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // settings delete page
 | // delete page
 | ||||||
| router.get('/admin/settings/pages/delete/:page', restrict, checkAccess, async (req, res) => { | router.post('/admin/settings/page/delete', restrict, checkAccess, async (req, res) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
|     try{ |     try{ | ||||||
|         await db.pages.deleteOne({ _id: common.getId(req.params.page) }, {}); |         await db.pages.deleteOne({ _id: common.getId(req.body.pageId) }, {}); | ||||||
|         req.session.message = 'Page successfully deleted'; |         res.status(200).json({ message: 'Page successfully deleted' }); | ||||||
|         req.session.messageType = 'success'; |  | ||||||
|         res.redirect('/admin/settings/pages'); |  | ||||||
|         return; |         return; | ||||||
|     }catch(ex){ |     }catch(ex){ | ||||||
|         req.session.message = 'Error deleting page. Please try again.'; |         res.status(400).json({ message: 'Error deleting page. Please try again.' }); | ||||||
|         req.session.messageType = 'danger'; |  | ||||||
|         res.redirect('/admin/settings/pages'); |  | ||||||
|     } |     } | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // new menu item
 | // new menu item
 | ||||||
| router.post('/admin/settings/menu/new', restrict, checkAccess, (req, res) => { | router.post('/admin/settings/menu/new', restrict, checkAccess, (req, res) => { | ||||||
|     const result = common.newMenu(req, res); |     const result = common.newMenu(req); | ||||||
|     if(result === false){ |     if(result === false){ | ||||||
|         req.session.message = 'Failed creating menu.'; |         res.status(400).json({ message: 'Failed creating menu.' }); | ||||||
|         req.session.messageType = 'danger'; |         return; | ||||||
|     } |     } | ||||||
|     res.redirect('/admin/settings/menu'); |     res.status(200).json({ message: 'Menu created successfully.' }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // update existing menu item
 | // update existing menu item
 | ||||||
| router.post('/admin/settings/menu/update', restrict, checkAccess, (req, res) => { | router.post('/admin/settings/menu/update', restrict, checkAccess, (req, res) => { | ||||||
|     const result = common.updateMenu(req, res); |     const result = common.updateMenu(req); | ||||||
|     if(result === false){ |     if(result === false){ | ||||||
|         req.session.message = 'Failed updating menu.'; |         res.status(400).json({ message: 'Failed updating menu.' }); | ||||||
|         req.session.messageType = 'danger'; |         return; | ||||||
|     } |     } | ||||||
|     res.redirect('/admin/settings/menu'); |     res.status(200).json({ message: 'Menu updated successfully.' }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // delete menu item
 | // delete menu item
 | ||||||
| router.get('/admin/settings/menu/delete/:menuid', restrict, checkAccess, (req, res) => { | router.post('/admin/settings/menu/delete', restrict, checkAccess, (req, res) => { | ||||||
|     const result = common.deleteMenu(req, res, req.params.menuid); |     const result = common.deleteMenu(req, req.body.menuId); | ||||||
|     if(result === false){ |     if(result === false){ | ||||||
|         req.session.message = 'Failed deleting menu.'; |         res.status(400).json({ message: 'Failed deleting menu.' }); | ||||||
|         req.session.messageType = 'danger'; |         return; | ||||||
|     } |     } | ||||||
|     res.redirect('/admin/settings/menu'); |     res.status(200).json({ message: 'Menu deleted successfully.' }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // We call this via a Ajax call to save the order from the sortable list
 | // We call this via a Ajax call to save the order from the sortable list
 | ||||||
|  | @ -376,7 +371,7 @@ router.post('/admin/api/validate_permalink', async (req, res) => { | ||||||
| 
 | 
 | ||||||
| // upload the file
 | // upload the file
 | ||||||
| const upload = multer({ dest: 'public/uploads/' }); | const upload = multer({ dest: 'public/uploads/' }); | ||||||
| router.post('/admin/file/upload', restrict, checkAccess, upload.single('upload_file'), async (req, res, next) => { | router.post('/admin/file/upload', restrict, checkAccess, upload.single('uploadFile'), async (req, res) => { | ||||||
|     const db = req.app.db; |     const db = req.app.db; | ||||||
| 
 | 
 | ||||||
|     if(req.file){ |     if(req.file){ | ||||||
|  | @ -390,10 +385,8 @@ router.post('/admin/file/upload', restrict, checkAccess, upload.single('upload_f | ||||||
|             // Remove temp file
 |             // Remove temp file
 | ||||||
|             fs.unlinkSync(file.path); |             fs.unlinkSync(file.path); | ||||||
| 
 | 
 | ||||||
|             // Redirect to error
 |             // Return error
 | ||||||
|             req.session.message = 'File type not allowed or too large. Please try again.'; |             res.status(400).json({ message: 'File type not allowed or too large. Please try again.' }); | ||||||
|             req.session.messageType = 'danger'; |  | ||||||
|             res.redirect('/admin/product/edit/' + req.body.productId); |  | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -403,10 +396,8 @@ router.post('/admin/file/upload', restrict, checkAccess, upload.single('upload_f | ||||||
|             // delete the temp file.
 |             // delete the temp file.
 | ||||||
|             fs.unlinkSync(file.path); |             fs.unlinkSync(file.path); | ||||||
| 
 | 
 | ||||||
|             // Redirect to error
 |             // Return error
 | ||||||
|             req.session.message = 'File upload error. Please try again.'; |             res.status(400).json({ message: 'File upload error. Please try again.' }); | ||||||
|             req.session.messageType = 'danger'; |  | ||||||
|             res.redirect('/admin/product/edit/' + req.body.productId); |  | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -431,20 +422,13 @@ router.post('/admin/file/upload', restrict, checkAccess, upload.single('upload_f | ||||||
|         // if there isn't a product featured image, set this one
 |         // if there isn't a product featured image, set this one
 | ||||||
|         if(!product.productImage){ |         if(!product.productImage){ | ||||||
|             await db.products.updateOne({ _id: common.getId(req.body.productId) }, { $set: { productImage: imagePath } }, { multi: false }); |             await db.products.updateOne({ _id: common.getId(req.body.productId) }, { $set: { productImage: imagePath } }, { multi: false }); | ||||||
|             req.session.message = 'File uploaded successfully'; |         } | ||||||
|             req.session.messageType = 'success'; |          // Return success message
 | ||||||
|             res.redirect('/admin/product/edit/' + req.body.productId); |         res.status(200).json({ message: 'File uploaded successfully' }); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|         req.session.message = 'File uploaded successfully'; |     // Return error
 | ||||||
|         req.session.messageType = 'success'; |     res.status(400).json({ message: 'File upload error. Please try again.' }); | ||||||
|         res.redirect('/admin/product/edit/' + req.body.productId); |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
|     // Redirect to error
 |  | ||||||
|     req.session.message = 'File upload error. Please select a file.'; |  | ||||||
|     req.session.messageType = 'danger'; |  | ||||||
|     res.redirect('/admin/product/edit/' + req.body.productId); |  | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // delete a file via ajax request
 | // delete a file via ajax request
 | ||||||
|  | @ -455,67 +439,4 @@ router.post('/admin/testEmail', restrict, (req, res) => { | ||||||
|     res.status(200).json({ message: 'Test email sent' }); |     res.status(200).json({ message: 'Test email sent' }); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| // delete a file via ajax request
 |  | ||||||
| router.post('/admin/file/delete', restrict, checkAccess, async (req, res) => { |  | ||||||
|     req.session.message = null; |  | ||||||
|     req.session.messageType = null; |  | ||||||
| 
 |  | ||||||
|     try{ |  | ||||||
|         await fs.unlinkSync('public/' + req.body.img); |  | ||||||
|         res.writeHead(200, { 'Content-Type': 'application/text' }); |  | ||||||
|         res.end('File deleted successfully'); |  | ||||||
|     }catch(ex){ |  | ||||||
|         console.error(colors.red('File delete error: ' + ex)); |  | ||||||
|         res.writeHead(400, { 'Content-Type': 'application/text' }); |  | ||||||
|         res.end('Failed to delete file: ' + ex); |  | ||||||
|     } |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| router.get('/admin/files', restrict, async (req, res) => { |  | ||||||
|     // loop files in /public/uploads/
 |  | ||||||
|     const files = await glob.sync('public/uploads/**', { nosort: true }); |  | ||||||
| 
 |  | ||||||
|     // sort array
 |  | ||||||
|     files.sort(); |  | ||||||
| 
 |  | ||||||
|     // declare the array of objects
 |  | ||||||
|     const fileList = []; |  | ||||||
|     const dirList = []; |  | ||||||
| 
 |  | ||||||
|     // loop these files
 |  | ||||||
|     for(let i = 0; i < files.length; i++){ |  | ||||||
|         // only want files
 |  | ||||||
|         if(fs.lstatSync(files[i]).isDirectory() === false){ |  | ||||||
|             // declare the file object and set its values
 |  | ||||||
|             const file = { |  | ||||||
|                 id: i, |  | ||||||
|                 path: files[i].substring(6) |  | ||||||
|             }; |  | ||||||
| 
 |  | ||||||
|             // push the file object into the array
 |  | ||||||
|             fileList.push(file); |  | ||||||
|         }else{ |  | ||||||
|             const dir = { |  | ||||||
|                 id: i, |  | ||||||
|                 path: files[i].substring(6) |  | ||||||
|             }; |  | ||||||
| 
 |  | ||||||
|             // push the dir object into the array
 |  | ||||||
|             dirList.push(dir); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // render the files route
 |  | ||||||
|     res.render('files', { |  | ||||||
|         title: 'Files', |  | ||||||
|         files: fileList, |  | ||||||
|         admin: true, |  | ||||||
|         dirs: dirList, |  | ||||||
|         session: req.session, |  | ||||||
|         config: common.get(), |  | ||||||
|         message: common.clearSessionValue(req.session, 'message'), |  | ||||||
|         messageType: common.clearSessionValue(req.session, 'messageType') |  | ||||||
|     }); |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| module.exports = router; | module.exports = router; | ||||||
|  |  | ||||||
|  | @ -168,22 +168,21 @@ | ||||||
| <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> | <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> | ||||||
|     <div class="modal-dialog"> |     <div class="modal-dialog"> | ||||||
|         <div class="modal-content"> |         <div class="modal-content"> | ||||||
|             <form method="post" id="upload_form" name="upload_form" action="/admin/file/upload" enctype="multipart/form-data"> |             <form method="post" id="uploadForm" enctype="multipart/form-data"></form> | ||||||
|             <div class="modal-header"> |             <div class="modal-header"> | ||||||
|                 <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> |                 <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> | ||||||
|                 <h4 class="modal-title" id="myModalLabel">{{ @root.__ "Product image upload" }}</h4> |                 <h4 class="modal-title" id="myModalLabel">{{ @root.__ "Product image upload" }}</h4> | ||||||
|             </div> |             </div> | ||||||
|             <div class="modal-body"> |             <div class="modal-body"> | ||||||
|                 <span class="btn btn-info btn-file"> |                 <span class="btn btn-info btn-file"> | ||||||
|                         {{ @root.__ "Select file" }}<input type="file" name="upload_file" id="upload_file"> |                     {{ @root.__ "Select file" }}<input type="file" name="uploadFile" id="uploadFile" form="uploadForm"> | ||||||
|                 </span> |                 </span> | ||||||
|                 <input type="hidden" id="productId" name="productId" value="{{result._id}}"/> |                 <input type="hidden" id="productId" name="productId" value="{{result._id}}"/> | ||||||
|             </div> |             </div> | ||||||
|             <div class="modal-footer"> |             <div class="modal-footer"> | ||||||
|                 <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> |                 <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> | ||||||
|                     <button type="submit" id="saveButton" name="saveButton" class="btn btn-primary">{{ @root.__ "Upload" }}</button> |                 <button type="button" id="uploadButton" class="btn btn-primary">{{ @root.__ "Upload" }}</button> | ||||||
|             </div> |             </div> | ||||||
|             </form> |  | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  | @ -11,42 +11,38 @@ | ||||||
|                 <th></th> |                 <th></th> | ||||||
|                 <tbody id="draggable_list"> |                 <tbody id="draggable_list"> | ||||||
|                     {{#each menu.items}} |                     {{#each menu.items}} | ||||||
|                         <tr class="drag-row"> |                         <tr class="drag-row" id="menuId-{{@key}}"> | ||||||
|                             <form method="post" action="/admin/settings/menu/update"> |                             <input type="hidden" class="navId" value="{{title}}"> | ||||||
|                             <input type="hidden" class="navId" name="navId" value="{{title}}"> |  | ||||||
|                             <td class="dragable_item col-md-1 td-pad"><i class="fa fa-arrows"></i></td> |                             <td class="dragable_item col-md-1 td-pad"><i class="fa fa-arrows"></i></td> | ||||||
|                             <td class="dragable_item col-md-2"> |                             <td class="dragable_item col-md-2"> | ||||||
|                                 <input type="text" class="form-control input-sm test" name="navMenu" value="{{title}}"> |                                 <input type="text" class="form-control input-sm navMenu" value="{{title}}"> | ||||||
|                             </td> |                             </td> | ||||||
|                             <td class="dragable_item col-md-6"> |                             <td class="dragable_item col-md-6"> | ||||||
|                                 <input type="text" class="form-control input-sm test" name="navLink" value="{{link}}"> |                                 <input type="text" class="form-control input-sm navLink" value="{{link}}"> | ||||||
|                             </td> |                             </td> | ||||||
|                             <td class="col-md-2"> |                             <td class="col-md-2"> | ||||||
|                                 <a class="btn btn-danger btn-sm" onclick="return confirm('Are you sure?');" href="/admin/settings/menu/delete/{{@key}}"> |                                 <a class="btn btn-danger btn-sm settings-menu-delete" data-id="{{@key}}"> | ||||||
|                                     <i class="fa fa-trash-o"></i> |                                     <i class="fa fa-trash-o"></i> | ||||||
|                                 </a> |                                 </a> | ||||||
|                                 <button type="submit" class="btn btn-success btn-sm"> |                                 <button type="submit" class="btn btn-success btn-sm" id="settings-menu-update" > | ||||||
|                                     <i class="fa fa-floppy-o"></i> |                                     <i class="fa fa-floppy-o"></i> | ||||||
|                                 </button> |                                 </button> | ||||||
|                             </td> |                             </td> | ||||||
|                             </form> |  | ||||||
|                         </tr> |                         </tr> | ||||||
|                     {{/each}} |                     {{/each}} | ||||||
|                         <tr> |                         <tr> | ||||||
|                             <form method="post" action="/admin/settings/menu/new"> |  | ||||||
|                             <td class="dragable_item col-md-1"></td> |                             <td class="dragable_item col-md-1"></td> | ||||||
|                             <td class="dragable_item col-md-2"> |                             <td class="dragable_item col-md-2"> | ||||||
|                                 <input type="text" class="form-control input-sm test" name="navMenu"> |                                 <input type="text" class="form-control input-sm" id="newNavMenu"> | ||||||
|                             </td> |                             </td> | ||||||
|                             <td class="dragable_item col-md-6"> |                             <td class="dragable_item col-md-6"> | ||||||
|                                 <input type="text" class="form-control input-sm test" name="navLink"> |                                 <input type="text" class="form-control input-sm" id="newNavLink"> | ||||||
|                             </td> |                             </td> | ||||||
|                             <td class="col-md-2"> |                             <td class="col-md-2"> | ||||||
|                                 <button type="submit" class="btn btn-success btn-sm"> |                                 <button type="submit" id="settings-menu-new" class="btn btn-success btn-sm"> | ||||||
|                                     <i class="fa fa-plus"></i> |                                     <i class="fa fa-plus"></i> | ||||||
|                                 </button> |                                 </button> | ||||||
|                             </td> |                             </td> | ||||||
|                             </form> |  | ||||||
|                         </tr> |                         </tr> | ||||||
|                 </tbody> |                 </tbody> | ||||||
|             </table> |             </table> | ||||||
|  |  | ||||||
|  | @ -16,7 +16,7 @@ | ||||||
|                                 </div> |                                 </div> | ||||||
|                                 <div class="col-lg-4 text-right"> |                                 <div class="col-lg-4 text-right"> | ||||||
|                                     <a class="btn btn-sm btn-success" href="/admin/settings/pages/edit/{{_id}}">{{ @root.__ "Edit" }}</a> |                                     <a class="btn btn-sm btn-success" href="/admin/settings/pages/edit/{{_id}}">{{ @root.__ "Edit" }}</a> | ||||||
|                                     <a class="btn btn-sm btn-danger" href="/admin/settings/pages/delete/{{_id}}">{{ @root.__ "Delete" }}</a> |                                     <button class="btn btn-sm btn-danger" id="btnPageDelete" data-id="{{_id}}">{{ @root.__ "Delete" }}</button> | ||||||
|                                 </div> |                                 </div> | ||||||
|                             </div> |                             </div> | ||||||
|                         </li> |                         </li> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue