Commit 76e5fd8933cf722ee29f7e5f9339b3ae4603d53e
1 parent
f23855ee46
Exists in
master
HANDLER NAME on control panel
Showing 3 changed files with 7 additions and 4 deletions Inline Diff
lib/control-panel/index.js
1 | const MODULE_NAME = 'SDK-SUPPLIER-PRODUCT-QUOTA.CONTROL-PANEL'; | 1 | const MODULE_NAME = 'SDK-SUPPLIER-PRODUCT-QUOTA.CONTROL-PANEL'; |
2 | 2 | ||
3 | const path = require('path'); | 3 | const path = require('path'); |
4 | const express = require('express'); | 4 | const express = require('express'); |
5 | const nunjucks = require('nunjucks'); | 5 | const nunjucks = require('nunjucks'); |
6 | const session = require('express-session'); | 6 | const session = require('express-session'); |
7 | const uniqid = require('uniqid'); | 7 | const uniqid = require('uniqid'); |
8 | 8 | ||
9 | const config = require('komodo-sdk/config'); | 9 | const config = require('komodo-sdk/config'); |
10 | const logger = require('komodo-sdk/logger'); | 10 | const logger = require('komodo-sdk/logger'); |
11 | 11 | ||
12 | const routerMain = require('./routers/main'); | 12 | const routerMain = require('./routers/main'); |
13 | const coreTerminalAuth = require('../core-terminal-auth'); | 13 | const coreTerminalAuth = require('../core-terminal-auth'); |
14 | 14 | ||
15 | const app = express(); | 15 | const app = express(); |
16 | 16 | ||
17 | app.use(session({ | 17 | app.use(session({ |
18 | secret: config.sdk_supplier_product_quota.session_secret, | 18 | secret: config.sdk_supplier_product_quota.session_secret, |
19 | resave: true, | 19 | resave: true, |
20 | saveUninitialized: false, | 20 | saveUninitialized: false, |
21 | })); | 21 | })); |
22 | 22 | ||
23 | const viewsDir = path.join(__dirname, 'views'); | 23 | const viewsDir = path.join(__dirname, 'views'); |
24 | nunjucks.configure(viewsDir, { | 24 | nunjucks.configure(viewsDir, { |
25 | autoescape: true, | 25 | autoescape: true, |
26 | express: app, | 26 | express: app, |
27 | noCache: true, | 27 | noCache: true, |
28 | }); | 28 | }); |
29 | 29 | ||
30 | const staticDir = path.join(__dirname, 'public'); | 30 | const staticDir = path.join(__dirname, 'public'); |
31 | app.use(express.static(staticDir)); | 31 | app.use(express.static(staticDir)); |
32 | logger.info(`${MODULE_NAME}: Serving static files on ${staticDir}`); | 32 | logger.info(`${MODULE_NAME}: Serving static files on ${staticDir}`); |
33 | 33 | ||
34 | function validateSession(req, res, next) { | 34 | function validateSession(req, res, next) { |
35 | if (!req.session.terminal || !req.session.terminal.id) { | 35 | if (!req.session.terminal || !req.session.terminal.id) { |
36 | res.redirect('/login'); | 36 | res.redirect('/login'); |
37 | return; | 37 | return; |
38 | } | 38 | } |
39 | 39 | ||
40 | next(); | 40 | next(); |
41 | } | 41 | } |
42 | 42 | ||
43 | app.use((req, res, next) => { | 43 | app.use((req, res, next) => { |
44 | res.locals.handler_name = config.handler_name; | ||
44 | res.locals.xid = uniqid(); | 45 | res.locals.xid = uniqid(); |
45 | next(); | 46 | next(); |
46 | }); | 47 | }); |
47 | 48 | ||
48 | app.get('/', (req, res) => { | 49 | app.get('/', (req, res) => { |
49 | res.redirect('/main'); | 50 | res.redirect('/main'); |
50 | }); | 51 | }); |
51 | 52 | ||
52 | app.get('/logout', (req, res) => { | 53 | app.get('/logout', (req, res) => { |
53 | req.session.terminal = null; | 54 | req.session.terminal = null; |
54 | req.session.store = null; | 55 | req.session.store = null; |
55 | 56 | ||
56 | res.redirect('/login'); | 57 | res.redirect('/login'); |
57 | }); | 58 | }); |
58 | 59 | ||
59 | app.get('/login', (req, res) => { | 60 | app.get('/login', (req, res) => { |
60 | res.render('signin.njk'); | 61 | res.render('signin.njk'); |
61 | }); | 62 | }); |
62 | 63 | ||
63 | app.post('/login', express.urlencoded({ extended: false }), async (req, res) => { | 64 | app.post('/login', express.urlencoded({ extended: false }), async (req, res) => { |
64 | const { username, password } = req.body; | 65 | const { username, password } = req.body; |
65 | const terminal = await coreTerminalAuth.validateWebPassword(username, password); | 66 | const terminal = await coreTerminalAuth.validateWebPassword(username, password); |
66 | 67 | ||
67 | if (!terminal || !terminal.terminal_is_super || !terminal.store_is_super) { | 68 | if (!terminal || !terminal.terminal_is_super || !terminal.store_is_super) { |
68 | res.redirect('/login'); | 69 | res.redirect('/login'); |
69 | return; | 70 | return; |
70 | } | 71 | } |
71 | 72 | ||
72 | req.session.terminal = { | 73 | req.session.terminal = { |
73 | id: terminal.id, | 74 | id: terminal.id, |
74 | name: terminal.name, | 75 | name: terminal.name, |
75 | super: terminal.terminal_is_super, | 76 | super: terminal.terminal_is_super, |
76 | }; | 77 | }; |
77 | 78 | ||
78 | req.session.store = { | 79 | req.session.store = { |
79 | id: terminal.store_id, | 80 | id: terminal.store_id, |
80 | name: terminal.store_name, | 81 | name: terminal.store_name, |
81 | super: terminal.store_is_super, | 82 | super: terminal.store_is_super, |
82 | }; | 83 | }; |
83 | 84 | ||
84 | res.redirect('/'); | 85 | res.redirect('/'); |
85 | }); | 86 | }); |
86 | 87 | ||
87 | app.use('/main', validateSession, routerMain); | 88 | app.use('/main', validateSession, routerMain); |
88 | 89 | ||
89 | const listenPort = config.sdk_supplier_product_quota && config.sdk_supplier_product_quota.port; | 90 | const listenPort = config.sdk_supplier_product_quota && config.sdk_supplier_product_quota.port; |
90 | if (listenPort) { | 91 | if (listenPort) { |
91 | app.listen(listenPort, () => { | 92 | app.listen(listenPort, () => { |
92 | logger.info(`4226C307 ${MODULE_NAME}: Control panel ready`, { listenPort }); | 93 | logger.info(`4226C307 ${MODULE_NAME}: Control panel ready`, { listenPort }); |
93 | }).on('error', (err) => { | 94 | }).on('error', (err) => { |
94 | logger.warn(`83FB2789 ${MODULE_NAME}: Control panel failed to start`, { | 95 | logger.warn(`83FB2789 ${MODULE_NAME}: Control panel failed to start`, { |
95 | listenPort, eCode: err.code, eMessage: err.message, | 96 | listenPort, eCode: err.code, eMessage: err.message, |
96 | }); | 97 | }); |
97 | }); | 98 | }); |
98 | } | 99 | } |
99 | 100 |
lib/control-panel/views/signin.njk
1 | <!doctype html> | 1 | <!doctype html> |
2 | <html lang="en"> | 2 | <html lang="en"> |
3 | <head> | 3 | <head> |
4 | <meta charset="utf-8"> | 4 | <meta charset="utf-8"> |
5 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | 5 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
6 | <meta name="description" content=""> | 6 | <meta name="description" content=""> |
7 | <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors"> | 7 | <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors"> |
8 | <meta name="generator" content="Jekyll v4.0.1"> | 8 | <meta name="generator" content="Jekyll v4.0.1"> |
9 | <title>Signin Template · Bootstrap</title> | 9 | <title>Manajemen Kuota - {{ handler_name }}</title> |
10 | 10 | ||
11 | <link rel="canonical" href="https://getbootstrap.com/docs/4.5/examples/sign-in/"> | 11 | <link rel="canonical" href="https://getbootstrap.com/docs/4.5/examples/sign-in/"> |
12 | 12 | ||
13 | <!-- Bootstrap core CSS --> | 13 | <!-- Bootstrap core CSS --> |
14 | <link href="/vendors/bootstrap/4.5/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> | 14 | <link href="/vendors/bootstrap/4.5/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> |
15 | 15 | ||
16 | <!-- Favicons --> | 16 | <!-- Favicons --> |
17 | <link rel="apple-touch-icon" href="/vendors/bootstrap/4.5/assets/img/favicons/apple-touch-icon.png" sizes="180x180"> | 17 | <link rel="apple-touch-icon" href="/vendors/bootstrap/4.5/assets/img/favicons/apple-touch-icon.png" sizes="180x180"> |
18 | <link rel="icon" href="/vendors/bootstrap/4.5/assets/img/favicons/favicon-32x32.png" sizes="32x32" type="image/png"> | 18 | <link rel="icon" href="/vendors/bootstrap/4.5/assets/img/favicons/favicon-32x32.png" sizes="32x32" type="image/png"> |
19 | <link rel="icon" href="/vendors/bootstrap/4.5/assets/img/favicons/favicon-16x16.png" sizes="16x16" type="image/png"> | 19 | <link rel="icon" href="/vendors/bootstrap/4.5/assets/img/favicons/favicon-16x16.png" sizes="16x16" type="image/png"> |
20 | <link rel="manifest" href="/vendors/bootstrap/4.5/assets/img/favicons/manifest.json"> | 20 | <link rel="manifest" href="/vendors/bootstrap/4.5/assets/img/favicons/manifest.json"> |
21 | <link rel="mask-icon" href="/vendors/bootstrap/4.5/assets/img/favicons/safari-pinned-tab.svg" color="#563d7c"> | 21 | <link rel="mask-icon" href="/vendors/bootstrap/4.5/assets/img/favicons/safari-pinned-tab.svg" color="#563d7c"> |
22 | <link rel="icon" href="/vendors/bootstrap/4.5/assets/img/favicons/favicon.ico"> | 22 | <link rel="icon" href="/vendors/bootstrap/4.5/assets/img/favicons/favicon.ico"> |
23 | <meta name="msapplication-config" content="/vendors/bootstrap/4.5/assets/img/favicons/browserconfig.xml"> | 23 | <meta name="msapplication-config" content="/vendors/bootstrap/4.5/assets/img/favicons/browserconfig.xml"> |
24 | <meta name="theme-color" content="#563d7c"> | 24 | <meta name="theme-color" content="#563d7c"> |
25 | 25 | ||
26 | 26 | ||
27 | <style> | 27 | <style> |
28 | .bd-placeholder-img { | 28 | .bd-placeholder-img { |
29 | font-size: 1.125rem; | 29 | font-size: 1.125rem; |
30 | text-anchor: middle; | 30 | text-anchor: middle; |
31 | -webkit-user-select: none; | 31 | -webkit-user-select: none; |
32 | -moz-user-select: none; | 32 | -moz-user-select: none; |
33 | -ms-user-select: none; | 33 | -ms-user-select: none; |
34 | user-select: none; | 34 | user-select: none; |
35 | } | 35 | } |
36 | 36 | ||
37 | @media (min-width: 768px) { | 37 | @media (min-width: 768px) { |
38 | .bd-placeholder-img-lg { | 38 | .bd-placeholder-img-lg { |
39 | font-size: 3.5rem; | 39 | font-size: 3.5rem; |
40 | } | 40 | } |
41 | } | 41 | } |
42 | </style> | 42 | </style> |
43 | <!-- Custom styles for this template --> | 43 | <!-- Custom styles for this template --> |
44 | <link href="/vendors/bootstrap/4.5/css/signin.css" rel="stylesheet"> | 44 | <link href="/vendors/bootstrap/4.5/css/signin.css" rel="stylesheet"> |
45 | </head> | 45 | </head> |
46 | <body class="text-center"> | 46 | <body class="text-center"> |
47 | <form class="form-signin" method="POST"> | 47 | <form class="form-signin" method="POST"> |
48 | {# <img class="mb-4" src="/vendors/bootstrap/4.5/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72"> #} | 48 | {# <img class="mb-4" src="/vendors/bootstrap/4.5/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72"> #} |
49 | <h1 class="h3 mb-3 font-weight-normal">Please sign in</h1> | 49 | <h1 class="h3 mb-3 font-weight-normal">Manajemen Kuota {{ handler_name }}</h1> |
50 | <label for="inputUsername" class="sr-only">Username</label> | 50 | <label for="inputUsername" class="sr-only">Username</label> |
51 | <input name="username" type="text" id="inputUsername" class="form-control" placeholder="Your username" required autofocus> | 51 | <input name="username" type="text" id="inputUsername" class="form-control" placeholder="Your username" required autofocus> |
52 | <label for="inputPassword" class="sr-only">Password</label> | 52 | <label for="inputPassword" class="sr-only">Password</label> |
53 | <input name="password" type="password" id="inputPassword" class="form-control" placeholder="Password" required> | 53 | <input name="password" type="password" id="inputPassword" class="form-control" placeholder="Password" required> |
54 | <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> | 54 | <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> |
55 | <p class="mt-5 mb-3 text-muted">© 2020</p> | 55 | <p class="mt-5 mb-3 text-muted">© PT. TEKNOLOGI TRANSAKSI DIGITAL (TEKTRANS) 2020</p> |
56 | </form> | 56 | </form> |
57 | </body> | 57 | </body> |
58 | </html> | 58 | </html> |
59 | 59 |
lib/control-panel/views/template.sbadmin2.njk
1 | <!DOCTYPE html> | 1 | <!DOCTYPE html> |
2 | <html lang="en"> | 2 | <html lang="en"> |
3 | 3 | ||
4 | <head> | 4 | <head> |
5 | 5 | ||
6 | <meta charset="utf-8"> | 6 | <meta charset="utf-8"> |
7 | <meta http-equiv="X-UA-Compatible" content="IE=edge"> | 7 | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
8 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | 8 | <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
9 | <meta name="description" content=""> | 9 | <meta name="description" content=""> |
10 | <meta name="author" content=""> | 10 | <meta name="author" content=""> |
11 | 11 | ||
12 | <title>{{ pageTitle }} - Manajemen Kuota</title> | 12 | <title>{{ pageTitle }} - Manajemen Kuota {{ handler_name }}</title> |
13 | 13 | ||
14 | <!-- Custom fonts for this template--> | 14 | <!-- Custom fonts for this template--> |
15 | <link href="/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css"> | 15 | <link href="/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css"> |
16 | <link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet"> | 16 | <link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet"> |
17 | 17 | ||
18 | <!-- Custom styles for this template--> | 18 | <!-- Custom styles for this template--> |
19 | <link href="/css/sb-admin-2.min.css" rel="stylesheet"> | 19 | <link href="/css/sb-admin-2.min.css" rel="stylesheet"> |
20 | 20 | ||
21 | </head> | 21 | </head> |
22 | 22 | ||
23 | <body id="page-top"> | 23 | <body id="page-top"> |
24 | 24 | ||
25 | <!-- Page Wrapper --> | 25 | <!-- Page Wrapper --> |
26 | <div id="wrapper"> | 26 | <div id="wrapper"> |
27 | 27 | ||
28 | <!-- Sidebar --> | 28 | <!-- Sidebar --> |
29 | <ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar"> | 29 | <ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar"> |
30 | 30 | ||
31 | <!-- Sidebar - Brand --> | 31 | <!-- Sidebar - Brand --> |
32 | <a class="sidebar-brand d-flex align-items-center justify-content-center" href="/"> | 32 | <a class="sidebar-brand d-flex align-items-center justify-content-center" href="/"> |
33 | <div class="sidebar-brand-icon rotate-n-15"> | 33 | <div class="sidebar-brand-icon rotate-n-15"> |
34 | <i class="fas fa-laugh-wink"></i> | 34 | <i class="fas fa-laugh-wink"></i> |
35 | </div> | 35 | </div> |
36 | <div class="sidebar-brand-text mx-3">Kuota Suplier</div> | 36 | <div class="sidebar-brand-text mx-3">Kuota Suplier</div> |
37 | </a> | 37 | </a> |
38 | 38 | ||
39 | <!-- Divider --> | 39 | <!-- Divider --> |
40 | <hr class="sidebar-divider my-0"> | 40 | <hr class="sidebar-divider my-0"> |
41 | 41 | ||
42 | <!-- Nav Item - Dashboard --> | 42 | <!-- Nav Item - Dashboard --> |
43 | <li class="nav-item"> | 43 | <li class="nav-item"> |
44 | <a class="nav-link" href="/"> | 44 | <a class="nav-link" href="/"> |
45 | <i class="fas fa-fw fa-tachometer-alt"></i> | 45 | <i class="fas fa-fw fa-tachometer-alt"></i> |
46 | <span>Dashboard</span></a> | 46 | <span>Dashboard</span></a> |
47 | </li> | 47 | </li> |
48 | 48 | ||
49 | <!-- Divider --> | 49 | <!-- Divider --> |
50 | <hr class="sidebar-divider d-none d-md-block"> | 50 | <hr class="sidebar-divider d-none d-md-block"> |
51 | 51 | ||
52 | <!-- Sidebar Toggler (Sidebar) --> | 52 | <!-- Sidebar Toggler (Sidebar) --> |
53 | <div class="text-center d-none d-md-inline"> | 53 | <div class="text-center d-none d-md-inline"> |
54 | <button class="rounded-circle border-0" id="sidebarToggle"></button> | 54 | <button class="rounded-circle border-0" id="sidebarToggle"></button> |
55 | </div> | 55 | </div> |
56 | </ul> | 56 | </ul> |
57 | <!-- End of Sidebar --> | 57 | <!-- End of Sidebar --> |
58 | 58 | ||
59 | <!-- Content Wrapper --> | 59 | <!-- Content Wrapper --> |
60 | <div id="content-wrapper" class="d-flex flex-column"> | 60 | <div id="content-wrapper" class="d-flex flex-column"> |
61 | 61 | ||
62 | <!-- Main Content --> | 62 | <!-- Main Content --> |
63 | <div id="content"> | 63 | <div id="content"> |
64 | 64 | ||
65 | <!-- Topbar --> | 65 | <!-- Topbar --> |
66 | <nav class="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow"> | 66 | <nav class="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow"> |
67 | 67 | ||
68 | <!-- Sidebar Toggle (Topbar) --> | 68 | <!-- Sidebar Toggle (Topbar) --> |
69 | <button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3"> | 69 | <button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3"> |
70 | <i class="fa fa-bars"></i> | 70 | <i class="fa fa-bars"></i> |
71 | </button> | 71 | </button> |
72 | 72 | ||
73 | <h1>{{ handler_name }}</h1> | ||
74 | |||
73 | {# <!-- Topbar Search --> | 75 | {# <!-- Topbar Search --> |
74 | <form class="d-none d-sm-inline-block form-inline mr-auto ml-md-3 my-2 my-md-0 mw-100 navbar-search"> | 76 | <form class="d-none d-sm-inline-block form-inline mr-auto ml-md-3 my-2 my-md-0 mw-100 navbar-search"> |
75 | <div class="input-group"> | 77 | <div class="input-group"> |
76 | <input type="text" class="form-control bg-light border-0 small" placeholder="Search for..." aria-label="Search" aria-describedby="basic-addon2"> | 78 | <input type="text" class="form-control bg-light border-0 small" placeholder="Search for..." aria-label="Search" aria-describedby="basic-addon2"> |
77 | <div class="input-group-append"> | 79 | <div class="input-group-append"> |
78 | <button class="btn btn-primary" type="button"> | 80 | <button class="btn btn-primary" type="button"> |
79 | <i class="fas fa-search fa-sm"></i> | 81 | <i class="fas fa-search fa-sm"></i> |
80 | </button> | 82 | </button> |
81 | </div> | 83 | </div> |
82 | </div> | 84 | </div> |
83 | </form> #} | 85 | </form> #} |
84 | 86 | ||
85 | <!-- Topbar Navbar --> | 87 | <!-- Topbar Navbar --> |
86 | <ul class="navbar-nav ml-auto"> | 88 | <ul class="navbar-nav ml-auto"> |
87 | 89 | ||
88 | {# <!-- Nav Item - Search Dropdown (Visible Only XS) --> | 90 | {# <!-- Nav Item - Search Dropdown (Visible Only XS) --> |
89 | <li class="nav-item dropdown no-arrow d-sm-none"> | 91 | <li class="nav-item dropdown no-arrow d-sm-none"> |
90 | <a class="nav-link dropdown-toggle" href="#" id="searchDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 92 | <a class="nav-link dropdown-toggle" href="#" id="searchDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
91 | <i class="fas fa-search fa-fw"></i> | 93 | <i class="fas fa-search fa-fw"></i> |
92 | </a> | 94 | </a> |
93 | <!-- Dropdown - Messages --> | 95 | <!-- Dropdown - Messages --> |
94 | <div class="dropdown-menu dropdown-menu-right p-3 shadow animated--grow-in" aria-labelledby="searchDropdown"> | 96 | <div class="dropdown-menu dropdown-menu-right p-3 shadow animated--grow-in" aria-labelledby="searchDropdown"> |
95 | <form class="form-inline mr-auto w-100 navbar-search"> | 97 | <form class="form-inline mr-auto w-100 navbar-search"> |
96 | <div class="input-group"> | 98 | <div class="input-group"> |
97 | <input type="text" class="form-control bg-light border-0 small" placeholder="Search for..." aria-label="Search" aria-describedby="basic-addon2"> | 99 | <input type="text" class="form-control bg-light border-0 small" placeholder="Search for..." aria-label="Search" aria-describedby="basic-addon2"> |
98 | <div class="input-group-append"> | 100 | <div class="input-group-append"> |
99 | <button class="btn btn-primary" type="button"> | 101 | <button class="btn btn-primary" type="button"> |
100 | <i class="fas fa-search fa-sm"></i> | 102 | <i class="fas fa-search fa-sm"></i> |
101 | </button> | 103 | </button> |
102 | </div> | 104 | </div> |
103 | </div> | 105 | </div> |
104 | </form> | 106 | </form> |
105 | </div> | 107 | </div> |
106 | </li> | 108 | </li> |
107 | 109 | ||
108 | <!-- Nav Item - Alerts --> | 110 | <!-- Nav Item - Alerts --> |
109 | <li class="nav-item dropdown no-arrow mx-1"> | 111 | <li class="nav-item dropdown no-arrow mx-1"> |
110 | <a class="nav-link dropdown-toggle" href="#" id="alertsDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 112 | <a class="nav-link dropdown-toggle" href="#" id="alertsDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
111 | <i class="fas fa-bell fa-fw"></i> | 113 | <i class="fas fa-bell fa-fw"></i> |
112 | <!-- Counter - Alerts --> | 114 | <!-- Counter - Alerts --> |
113 | <span class="badge badge-danger badge-counter">3+</span> | 115 | <span class="badge badge-danger badge-counter">3+</span> |
114 | </a> | 116 | </a> |
115 | <!-- Dropdown - Alerts --> | 117 | <!-- Dropdown - Alerts --> |
116 | <div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in" aria-labelledby="alertsDropdown"> | 118 | <div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in" aria-labelledby="alertsDropdown"> |
117 | <h6 class="dropdown-header"> | 119 | <h6 class="dropdown-header"> |
118 | Alerts Center | 120 | Alerts Center |
119 | </h6> | 121 | </h6> |
120 | <a class="dropdown-item d-flex align-items-center" href="#"> | 122 | <a class="dropdown-item d-flex align-items-center" href="#"> |
121 | <div class="mr-3"> | 123 | <div class="mr-3"> |
122 | <div class="icon-circle bg-primary"> | 124 | <div class="icon-circle bg-primary"> |
123 | <i class="fas fa-file-alt text-white"></i> | 125 | <i class="fas fa-file-alt text-white"></i> |
124 | </div> | 126 | </div> |
125 | </div> | 127 | </div> |
126 | <div> | 128 | <div> |
127 | <div class="small text-gray-500">December 12, 2019</div> | 129 | <div class="small text-gray-500">December 12, 2019</div> |
128 | <span class="font-weight-bold">A new monthly report is ready to download!</span> | 130 | <span class="font-weight-bold">A new monthly report is ready to download!</span> |
129 | </div> | 131 | </div> |
130 | </a> | 132 | </a> |
131 | <a class="dropdown-item d-flex align-items-center" href="#"> | 133 | <a class="dropdown-item d-flex align-items-center" href="#"> |
132 | <div class="mr-3"> | 134 | <div class="mr-3"> |
133 | <div class="icon-circle bg-success"> | 135 | <div class="icon-circle bg-success"> |
134 | <i class="fas fa-donate text-white"></i> | 136 | <i class="fas fa-donate text-white"></i> |
135 | </div> | 137 | </div> |
136 | </div> | 138 | </div> |
137 | <div> | 139 | <div> |
138 | <div class="small text-gray-500">December 7, 2019</div> | 140 | <div class="small text-gray-500">December 7, 2019</div> |
139 | $290.29 has been deposited into your account! | 141 | $290.29 has been deposited into your account! |
140 | </div> | 142 | </div> |
141 | </a> | 143 | </a> |
142 | <a class="dropdown-item d-flex align-items-center" href="#"> | 144 | <a class="dropdown-item d-flex align-items-center" href="#"> |
143 | <div class="mr-3"> | 145 | <div class="mr-3"> |
144 | <div class="icon-circle bg-warning"> | 146 | <div class="icon-circle bg-warning"> |
145 | <i class="fas fa-exclamation-triangle text-white"></i> | 147 | <i class="fas fa-exclamation-triangle text-white"></i> |
146 | </div> | 148 | </div> |
147 | </div> | 149 | </div> |
148 | <div> | 150 | <div> |
149 | <div class="small text-gray-500">December 2, 2019</div> | 151 | <div class="small text-gray-500">December 2, 2019</div> |
150 | Spending Alert: We've noticed unusually high spending for your account. | 152 | Spending Alert: We've noticed unusually high spending for your account. |
151 | </div> | 153 | </div> |
152 | </a> | 154 | </a> |
153 | <a class="dropdown-item text-center small text-gray-500" href="#">Show All Alerts</a> | 155 | <a class="dropdown-item text-center small text-gray-500" href="#">Show All Alerts</a> |
154 | </div> | 156 | </div> |
155 | </li> | 157 | </li> |
156 | 158 | ||
157 | <!-- Nav Item - Messages --> | 159 | <!-- Nav Item - Messages --> |
158 | <li class="nav-item dropdown no-arrow mx-1"> | 160 | <li class="nav-item dropdown no-arrow mx-1"> |
159 | <a class="nav-link dropdown-toggle" href="#" id="messagesDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 161 | <a class="nav-link dropdown-toggle" href="#" id="messagesDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
160 | <i class="fas fa-envelope fa-fw"></i> | 162 | <i class="fas fa-envelope fa-fw"></i> |
161 | <!-- Counter - Messages --> | 163 | <!-- Counter - Messages --> |
162 | <span class="badge badge-danger badge-counter">7</span> | 164 | <span class="badge badge-danger badge-counter">7</span> |
163 | </a> | 165 | </a> |
164 | <!-- Dropdown - Messages --> | 166 | <!-- Dropdown - Messages --> |
165 | <div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in" aria-labelledby="messagesDropdown"> | 167 | <div class="dropdown-list dropdown-menu dropdown-menu-right shadow animated--grow-in" aria-labelledby="messagesDropdown"> |
166 | <h6 class="dropdown-header"> | 168 | <h6 class="dropdown-header"> |
167 | Message Center | 169 | Message Center |
168 | </h6> | 170 | </h6> |
169 | <a class="dropdown-item d-flex align-items-center" href="#"> | 171 | <a class="dropdown-item d-flex align-items-center" href="#"> |
170 | <div class="dropdown-list-image mr-3"> | 172 | <div class="dropdown-list-image mr-3"> |
171 | <img class="rounded-circle" src="https://source.unsplash.com/fn_BT9fwg_E/60x60" alt=""> | 173 | <img class="rounded-circle" src="https://source.unsplash.com/fn_BT9fwg_E/60x60" alt=""> |
172 | <div class="status-indicator bg-success"></div> | 174 | <div class="status-indicator bg-success"></div> |
173 | </div> | 175 | </div> |
174 | <div class="font-weight-bold"> | 176 | <div class="font-weight-bold"> |
175 | <div class="text-truncate">Hi there! I am wondering if you can help me with a problem I've been having.</div> | 177 | <div class="text-truncate">Hi there! I am wondering if you can help me with a problem I've been having.</div> |
176 | <div class="small text-gray-500">Emily Fowler · 58m</div> | 178 | <div class="small text-gray-500">Emily Fowler · 58m</div> |
177 | </div> | 179 | </div> |
178 | </a> | 180 | </a> |
179 | <a class="dropdown-item d-flex align-items-center" href="#"> | 181 | <a class="dropdown-item d-flex align-items-center" href="#"> |
180 | <div class="dropdown-list-image mr-3"> | 182 | <div class="dropdown-list-image mr-3"> |
181 | <img class="rounded-circle" src="https://source.unsplash.com/AU4VPcFN4LE/60x60" alt=""> | 183 | <img class="rounded-circle" src="https://source.unsplash.com/AU4VPcFN4LE/60x60" alt=""> |
182 | <div class="status-indicator"></div> | 184 | <div class="status-indicator"></div> |
183 | </div> | 185 | </div> |
184 | <div> | 186 | <div> |
185 | <div class="text-truncate">I have the photos that you ordered last month, how would you like them sent to you?</div> | 187 | <div class="text-truncate">I have the photos that you ordered last month, how would you like them sent to you?</div> |
186 | <div class="small text-gray-500">Jae Chun · 1d</div> | 188 | <div class="small text-gray-500">Jae Chun · 1d</div> |
187 | </div> | 189 | </div> |
188 | </a> | 190 | </a> |
189 | <a class="dropdown-item d-flex align-items-center" href="#"> | 191 | <a class="dropdown-item d-flex align-items-center" href="#"> |
190 | <div class="dropdown-list-image mr-3"> | 192 | <div class="dropdown-list-image mr-3"> |
191 | <img class="rounded-circle" src="https://source.unsplash.com/CS2uCrpNzJY/60x60" alt=""> | 193 | <img class="rounded-circle" src="https://source.unsplash.com/CS2uCrpNzJY/60x60" alt=""> |
192 | <div class="status-indicator bg-warning"></div> | 194 | <div class="status-indicator bg-warning"></div> |
193 | </div> | 195 | </div> |
194 | <div> | 196 | <div> |
195 | <div class="text-truncate">Last month's report looks great, I am very happy with the progress so far, keep up the good work!</div> | 197 | <div class="text-truncate">Last month's report looks great, I am very happy with the progress so far, keep up the good work!</div> |
196 | <div class="small text-gray-500">Morgan Alvarez · 2d</div> | 198 | <div class="small text-gray-500">Morgan Alvarez · 2d</div> |
197 | </div> | 199 | </div> |
198 | </a> | 200 | </a> |
199 | <a class="dropdown-item d-flex align-items-center" href="#"> | 201 | <a class="dropdown-item d-flex align-items-center" href="#"> |
200 | <div class="dropdown-list-image mr-3"> | 202 | <div class="dropdown-list-image mr-3"> |
201 | <img class="rounded-circle" src="https://source.unsplash.com/Mv9hjnEUHR4/60x60" alt=""> | 203 | <img class="rounded-circle" src="https://source.unsplash.com/Mv9hjnEUHR4/60x60" alt=""> |
202 | <div class="status-indicator bg-success"></div> | 204 | <div class="status-indicator bg-success"></div> |
203 | </div> | 205 | </div> |
204 | <div> | 206 | <div> |
205 | <div class="text-truncate">Am I a good boy? The reason I ask is because someone told me that people say this to all dogs, even if they aren't good...</div> | 207 | <div class="text-truncate">Am I a good boy? The reason I ask is because someone told me that people say this to all dogs, even if they aren't good...</div> |
206 | <div class="small text-gray-500">Chicken the Dog · 2w</div> | 208 | <div class="small text-gray-500">Chicken the Dog · 2w</div> |
207 | </div> | 209 | </div> |
208 | </a> | 210 | </a> |
209 | <a class="dropdown-item text-center small text-gray-500" href="#">Read More Messages</a> | 211 | <a class="dropdown-item text-center small text-gray-500" href="#">Read More Messages</a> |
210 | </div> | 212 | </div> |
211 | </li> #} | 213 | </li> #} |
212 | 214 | ||
213 | <div class="topbar-divider d-none d-sm-block"></div> | 215 | <div class="topbar-divider d-none d-sm-block"></div> |
214 | 216 | ||
215 | {# | 217 | {# |
216 | <!-- Nav Item - User Information --> | 218 | <!-- Nav Item - User Information --> |
217 | <li class="nav-item dropdown no-arrow"> | 219 | <li class="nav-item dropdown no-arrow"> |
218 | <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | 220 | <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> |
219 | <span class="mr-2 d-none d-lg-inline text-gray-600 small">Valerie Luna</span> | 221 | <span class="mr-2 d-none d-lg-inline text-gray-600 small">Valerie Luna</span> |
220 | <img class="img-profile rounded-circle" src="https://source.unsplash.com/QAB-WJcbgJk/60x60"> | 222 | <img class="img-profile rounded-circle" src="https://source.unsplash.com/QAB-WJcbgJk/60x60"> |
221 | </a> | 223 | </a> |
222 | <!-- Dropdown - User Information --> | 224 | <!-- Dropdown - User Information --> |
223 | <div class="dropdown-menu dropdown-menu-right shadow animated--grow-in" aria-labelledby="userDropdown"> | 225 | <div class="dropdown-menu dropdown-menu-right shadow animated--grow-in" aria-labelledby="userDropdown"> |
224 | <a class="dropdown-item" href="#"> | 226 | <a class="dropdown-item" href="#"> |
225 | <i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i> | 227 | <i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i> |
226 | Profile | 228 | Profile |
227 | </a> | 229 | </a> |
228 | <a class="dropdown-item" href="#"> | 230 | <a class="dropdown-item" href="#"> |
229 | <i class="fas fa-cogs fa-sm fa-fw mr-2 text-gray-400"></i> | 231 | <i class="fas fa-cogs fa-sm fa-fw mr-2 text-gray-400"></i> |
230 | Settings | 232 | Settings |
231 | </a> | 233 | </a> |
232 | <a class="dropdown-item" href="#"> | 234 | <a class="dropdown-item" href="#"> |
233 | <i class="fas fa-list fa-sm fa-fw mr-2 text-gray-400"></i> | 235 | <i class="fas fa-list fa-sm fa-fw mr-2 text-gray-400"></i> |
234 | Activity Log | 236 | Activity Log |
235 | </a> | 237 | </a> |
236 | <div class="dropdown-divider"></div> | 238 | <div class="dropdown-divider"></div> |
237 | <a class="dropdown-item" href="#" data-toggle="modal" data-target="#logoutModal"> | 239 | <a class="dropdown-item" href="#" data-toggle="modal" data-target="#logoutModal"> |
238 | <i class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i> | 240 | <i class="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i> |
239 | Logout | 241 | Logout |
240 | </a> | 242 | </a> |
241 | </div> | 243 | </div> |
242 | </li> | 244 | </li> |
243 | #} | 245 | #} |
244 | 246 | ||
245 | <li class="nav-item"> | 247 | <li class="nav-item"> |
246 | <a class="nav-link" href="/logout"> | 248 | <a class="nav-link" href="/logout"> |
247 | Logout | 249 | Logout |
248 | </a> | 250 | </a> |
249 | </li> | 251 | </li> |
250 | 252 | ||
251 | </ul> | 253 | </ul> |
252 | 254 | ||
253 | </nav> | 255 | </nav> |
254 | <!-- End of Topbar --> | 256 | <!-- End of Topbar --> |
255 | 257 | ||
256 | <!-- Begin Page Content --> | 258 | <!-- Begin Page Content --> |
257 | <div class="container-fluid"> | 259 | <div class="container-fluid"> |
258 | 260 | ||
259 | {% if pageTitle %} | 261 | {% if pageTitle %} |
260 | <!-- Page Heading --> | 262 | <!-- Page Heading --> |
261 | <h1 class="h3 mb-4 text-gray-800">{{ pageTitle }}</h1> | 263 | <h1 class="h3 mb-4 text-gray-800">{{ pageTitle }}</h1> |
262 | {% endif %} | 264 | {% endif %} |
263 | 265 | ||
264 | {% block content %} | 266 | {% block content %} |
265 | | 267 | |
266 | {% endblock %} | 268 | {% endblock %} |
267 | 269 | ||
268 | </div> | 270 | </div> |
269 | <!-- /.container-fluid --> | 271 | <!-- /.container-fluid --> |
270 | 272 | ||
271 | </div> | 273 | </div> |
272 | <!-- End of Main Content --> | 274 | <!-- End of Main Content --> |
273 | 275 | ||
274 | <!-- Footer --> | 276 | <!-- Footer --> |
275 | <footer class="sticky-footer bg-white"> | 277 | <footer class="sticky-footer bg-white"> |
276 | <div class="container my-auto"> | 278 | <div class="container my-auto"> |
277 | <div class="copyright text-center my-auto"> | 279 | <div class="copyright text-center my-auto"> |
278 | <span>Copyright © PT TEKNOLOGI TRANSAKSI DIGITAL (TEKTRANS) 2020</span> | 280 | <span>Copyright © PT TEKNOLOGI TRANSAKSI DIGITAL (TEKTRANS) 2020</span> |
279 | </div> | 281 | </div> |
280 | </div> | 282 | </div> |
281 | </footer> | 283 | </footer> |
282 | <!-- End of Footer --> | 284 | <!-- End of Footer --> |
283 | 285 | ||
284 | </div> | 286 | </div> |
285 | <!-- End of Content Wrapper --> | 287 | <!-- End of Content Wrapper --> |
286 | 288 | ||
287 | </div> | 289 | </div> |
288 | <!-- End of Page Wrapper --> | 290 | <!-- End of Page Wrapper --> |
289 | 291 | ||
290 | <!-- Scroll to Top Button--> | 292 | <!-- Scroll to Top Button--> |
291 | <a class="scroll-to-top rounded" href="#page-top"> | 293 | <a class="scroll-to-top rounded" href="#page-top"> |
292 | <i class="fas fa-angle-up"></i> | 294 | <i class="fas fa-angle-up"></i> |
293 | </a> | 295 | </a> |
294 | 296 | ||
295 | <!-- Logout Modal--> | 297 | <!-- Logout Modal--> |
296 | <div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> | 298 | <div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> |
297 | <div class="modal-dialog" role="document"> | 299 | <div class="modal-dialog" role="document"> |
298 | <div class="modal-content"> | 300 | <div class="modal-content"> |
299 | <div class="modal-header"> | 301 | <div class="modal-header"> |
300 | <h5 class="modal-title" id="exampleModalLabel">Ready to Leave?</h5> | 302 | <h5 class="modal-title" id="exampleModalLabel">Ready to Leave?</h5> |
301 | <button class="close" type="button" data-dismiss="modal" aria-label="Close"> | 303 | <button class="close" type="button" data-dismiss="modal" aria-label="Close"> |
302 | <span aria-hidden="true">×</span> | 304 | <span aria-hidden="true">×</span> |
303 | </button> | 305 | </button> |
304 | </div> | 306 | </div> |
305 | <div class="modal-body">Select "Logout" below if you are ready to end your current session.</div> | 307 | <div class="modal-body">Select "Logout" below if you are ready to end your current session.</div> |
306 | <div class="modal-footer"> | 308 | <div class="modal-footer"> |
307 | <button class="btn btn-secondary" type="button" data-dismiss="modal">Cancel</button> | 309 | <button class="btn btn-secondary" type="button" data-dismiss="modal">Cancel</button> |
308 | <a class="btn btn-primary" href="login.html">Logout</a> | 310 | <a class="btn btn-primary" href="login.html">Logout</a> |
309 | </div> | 311 | </div> |
310 | </div> | 312 | </div> |
311 | </div> | 313 | </div> |
312 | </div> | 314 | </div> |
313 | 315 | ||
314 | <!-- Bootstrap core JavaScript--> | 316 | <!-- Bootstrap core JavaScript--> |
315 | <script src="/vendor/jquery/jquery.min.js"></script> | 317 | <script src="/vendor/jquery/jquery.min.js"></script> |
316 | <script src="/vendor/bootstrap/js/bootstrap.bundle.min.js"></script> | 318 | <script src="/vendor/bootstrap/js/bootstrap.bundle.min.js"></script> |
317 | 319 | ||
318 | <!-- Core plugin JavaScript--> | 320 | <!-- Core plugin JavaScript--> |
319 | <script src="/vendor/jquery-easing/jquery.easing.min.js"></script> | 321 | <script src="/vendor/jquery-easing/jquery.easing.min.js"></script> |
320 | 322 | ||
321 | <!-- Custom scripts for all pages--> | 323 | <!-- Custom scripts for all pages--> |
322 | <script src="/js/sb-admin-2.min.js"></script> | 324 | <script src="/js/sb-admin-2.min.js"></script> |
323 | 325 | ||
324 | {% block postScriptOnBody %} | 326 | {% block postScriptOnBody %} |
325 | {% endblock %} | 327 | {% endblock %} |
326 | 328 | ||
327 | </body> | 329 | </body> |
328 | 330 | ||
329 | </html> | 331 | </html> |
330 | 332 |