Commit 76e5fd8933cf722ee29f7e5f9339b3ae4603d53e

Authored by Adhidarma Hadiwinoto
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">&copy; 2020</p> 55 <p class="mt-5 mb-3 text-muted">&copy; 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 &nbsp; 267 &nbsp;
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 &copy; PT TEKNOLOGI TRANSAKSI DIGITAL (TEKTRANS) 2020</span> 280 <span>Copyright &copy; 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