+
+
+
+
+
+
+
+
+ setOrderingValues();
+ include BASE_PATH . '/forms/filters.php'; ?>
+
+
+
+
+
+
+
+
+
+
+
diff --git a/qrcode/authenticate.php b/qrcode/authenticate.php
new file mode 100644
index 0000000..fbe9910
--- /dev/null
+++ b/qrcode/authenticate.php
@@ -0,0 +1,80 @@
+
+* @copyright Copyright (c) 2020-2021
+* @license https://opensource.org/licenses/MIT MIT License
+* @link https://github.com/giandonatoinverso/PHP-Dynamic-Qr-code
+* @version 1.0
+*/
+
+require_once 'config/config.php';
+session_start();
+
+if ($_SERVER['REQUEST_METHOD'] === 'POST')
+{
+ $username = filter_input(INPUT_POST, 'username');
+ $password = filter_input(INPUT_POST, 'password');
+ $remember = filter_input(INPUT_POST, 'remember');
+
+ // Get DB instance.
+ $db = getDbInstance();
+
+ $db->where('user_name', $username);
+ $row = $db->getOne('admin_accounts');
+
+ if ($db->count >= 1)
+ {
+ $db_password = $row['password'];
+ $user_id = $row['id'];
+
+ if (password_verify($password, $db_password))
+ {
+ $_SESSION['user_logged_in'] = TRUE;
+ $_SESSION['admin_type'] = $row['admin_type'];
+ $_SESSION['user_id'] = $row['id'];
+
+ if ($remember)
+ {
+ $series_id = randomString(16);
+ $remember_token = getSecureRandomToken(20);
+ $encryted_remember_token = password_hash($remember_token,PASSWORD_DEFAULT);
+
+ $expiry_time = date('Y-m-d H:i:s', strtotime(' + 30 days'));
+ $expires = strtotime($expiry_time);
+
+ setcookie('series_id', $series_id, $expires, '/');
+ setcookie('remember_token', $remember_token, $expires, '/');
+
+ $db = getDbInstance();
+ $db->where ('id',$user_id);
+
+ $update_remember = array(
+ 'series_id'=> $series_id,
+ 'remember_token' => $encryted_remember_token,
+ 'expires' =>$expiry_time
+ );
+ $db->update('admin_accounts', $update_remember);
+ }
+ // Authentication successfull redirect user
+ header('Location: index.php');
+ }
+ else
+ {
+ $_SESSION['login_failure'] = 'Invalid username or password';
+ header('Location: login.php');
+ }
+ exit;
+ }
+ else
+ {
+ $_SESSION['login_failure'] = 'Invalid username or password';
+ header('Location: login.php');
+ exit;
+ }
+}
+else
+{
+ die('Method Not allowed');
+}
diff --git a/qrcode/build/config/postcss.config.js b/qrcode/build/config/postcss.config.js
new file mode 100644
index 0000000..157291f
--- /dev/null
+++ b/qrcode/build/config/postcss.config.js
@@ -0,0 +1,14 @@
+'use strict'
+
+module.exports = (ctx) => ({
+ map: ctx.file.dirname.includes('examples') ? false : {
+ inline: false,
+ annotation: true,
+ sourcesContent: true
+ },
+ plugins: {
+ autoprefixer: {
+ cascade: false
+ }
+ }
+})
diff --git a/qrcode/build/config/rollup.config.js b/qrcode/build/config/rollup.config.js
new file mode 100644
index 0000000..1f08394
--- /dev/null
+++ b/qrcode/build/config/rollup.config.js
@@ -0,0 +1,29 @@
+import babel from 'rollup-plugin-babel'
+
+const pkg = require('../../package')
+const year = new Date().getFullYear()
+
+const globals = {
+ jquery: 'jQuery'
+}
+
+export default {
+ input : 'build/js/AdminLTE.js',
+ output : {
+ banner: `/*!
+ * AdminLTE v${pkg.version} (${pkg.homepage})
+ * Copyright 2014-${year} ${pkg.author}
+ * Licensed under MIT (https://github.com/ColorlibHQ/AdminLTE/blob/master/LICENSE)
+ */`,
+ file : 'dist/js/adminlte.js',
+ format: 'umd',
+ globals,
+ name : 'adminlte'
+ },
+ plugins: [
+ babel({
+ exclude: 'node_modules/**',
+ externalHelpers: true
+ })
+ ]
+}
diff --git a/qrcode/build/js/AdminLTE.js b/qrcode/build/js/AdminLTE.js
new file mode 100644
index 0000000..3658c13
--- /dev/null
+++ b/qrcode/build/js/AdminLTE.js
@@ -0,0 +1,23 @@
+import ControlSidebar from './ControlSidebar'
+import Layout from './Layout'
+import PushMenu from './PushMenu'
+import Treeview from './Treeview'
+import DirectChat from './DirectChat'
+import TodoList from './TodoList'
+import CardWidget from './CardWidget'
+import CardRefresh from './CardRefresh'
+import Dropdown from './Dropdown'
+import Toasts from './Toasts'
+
+export {
+ ControlSidebar,
+ Layout,
+ PushMenu,
+ Treeview,
+ DirectChat,
+ TodoList,
+ CardWidget,
+ CardRefresh,
+ Dropdown,
+ Toasts
+}
diff --git a/qrcode/build/js/CardRefresh.js b/qrcode/build/js/CardRefresh.js
new file mode 100644
index 0000000..cacc7b1
--- /dev/null
+++ b/qrcode/build/js/CardRefresh.js
@@ -0,0 +1,168 @@
+/**
+ * --------------------------------------------
+ * AdminLTE CardRefresh.js
+ * License MIT
+ * --------------------------------------------
+ */
+
+const CardRefresh = (($) => {
+ /**
+ * Constants
+ * ====================================================
+ */
+
+ const NAME = 'CardRefresh'
+ const DATA_KEY = 'lte.cardrefresh'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+
+ const Event = {
+ LOADED: `loaded${EVENT_KEY}`,
+ OVERLAY_ADDED: `overlay.added${EVENT_KEY}`,
+ OVERLAY_REMOVED: `overlay.removed${EVENT_KEY}`,
+ }
+
+ const ClassName = {
+ CARD: 'card',
+ }
+
+ const Selector = {
+ CARD: `.${ClassName.CARD}`,
+ DATA_REFRESH: '[data-card-widget="card-refresh"]',
+ }
+
+ const Default = {
+ source: '',
+ sourceSelector: '',
+ params: {},
+ trigger: Selector.DATA_REFRESH,
+ content: '.card-body',
+ loadInContent: true,
+ loadOnInit: true,
+ responseType: '',
+ overlayTemplate: '
',
+ onLoadStart: function () {
+ },
+ onLoadDone: function (response) {
+ return response;
+ }
+ }
+
+ class CardRefresh {
+ constructor(element, settings) {
+ this._element = element
+ this._parent = element.parents(Selector.CARD).first()
+ this._settings = $.extend({}, Default, settings)
+ this._overlay = $(this._settings.overlayTemplate)
+
+ if (element.hasClass(ClassName.CARD)) {
+ this._parent = element
+ }
+
+ if (this._settings.source === '') {
+ throw new Error('Source url was not defined. Please specify a url in your CardRefresh source option.');
+ }
+ }
+
+ load() {
+ this._addOverlay()
+ this._settings.onLoadStart.call($(this))
+
+ $.get(this._settings.source, this._settings.params, function (response) {
+ if (this._settings.loadInContent) {
+ if (this._settings.sourceSelector != '') {
+ response = $(response).find(this._settings.sourceSelector).html()
+ }
+
+ this._parent.find(this._settings.content).html(response)
+ }
+
+ this._settings.onLoadDone.call($(this), response)
+ this._removeOverlay();
+ }.bind(this), this._settings.responseType !== '' && this._settings.responseType)
+
+ const loadedEvent = $.Event(Event.LOADED)
+ $(this._element).trigger(loadedEvent)
+ }
+
+ _addOverlay() {
+ this._parent.append(this._overlay)
+
+ const overlayAddedEvent = $.Event(Event.OVERLAY_ADDED)
+ $(this._element).trigger(overlayAddedEvent)
+ };
+
+ _removeOverlay() {
+ this._parent.find(this._overlay).remove()
+
+ const overlayRemovedEvent = $.Event(Event.OVERLAY_REMOVED)
+ $(this._element).trigger(overlayRemovedEvent)
+ };
+
+
+ // Private
+
+ _init(card) {
+ $(this).find(this._settings.trigger).on('click', () => {
+ this.load()
+ })
+
+ if (this._settings.loadOnInit) {
+ this.load()
+ }
+ }
+
+ // Static
+
+ static _jQueryInterface(config) {
+ let data = $(this).data(DATA_KEY)
+ const _options = $.extend({}, Default, $(this).data())
+
+ if (!data) {
+ data = new CardRefresh($(this), _options)
+ $(this).data(DATA_KEY, typeof config === 'string' ? data: config)
+ }
+
+ if (typeof config === 'string' && config.match(/load/)) {
+ data[config]()
+ } else {
+ data._init($(this))
+ }
+ }
+ }
+
+ /**
+ * Data API
+ * ====================================================
+ */
+
+ $(document).on('click', Selector.DATA_REFRESH, function (event) {
+ if (event) {
+ event.preventDefault()
+ }
+
+ CardRefresh._jQueryInterface.call($(this), 'load')
+ })
+
+ $(document).ready(function () {
+ $(Selector.DATA_REFRESH).each(function() {
+ CardRefresh._jQueryInterface.call($(this))
+ })
+ })
+
+ /**
+ * jQuery API
+ * ====================================================
+ */
+
+ $.fn[NAME] = CardRefresh._jQueryInterface
+ $.fn[NAME].Constructor = CardRefresh
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return CardRefresh._jQueryInterface
+ }
+
+ return CardRefresh
+})(jQuery)
+
+export default CardRefresh
diff --git a/qrcode/build/js/CardWidget.js b/qrcode/build/js/CardWidget.js
new file mode 100644
index 0000000..3bd0403
--- /dev/null
+++ b/qrcode/build/js/CardWidget.js
@@ -0,0 +1,253 @@
+/**
+ * --------------------------------------------
+ * AdminLTE CardWidget.js
+ * License MIT
+ * --------------------------------------------
+ */
+
+const CardWidget = (($) => {
+ /**
+ * Constants
+ * ====================================================
+ */
+
+ const NAME = 'CardWidget'
+ const DATA_KEY = 'lte.cardwidget'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+
+ const Event = {
+ EXPANDED: `expanded${EVENT_KEY}`,
+ COLLAPSED: `collapsed${EVENT_KEY}`,
+ MAXIMIZED: `maximized${EVENT_KEY}`,
+ MINIMIZED: `minimized${EVENT_KEY}`,
+ REMOVED: `removed${EVENT_KEY}`
+ }
+
+ const ClassName = {
+ CARD: 'card',
+ COLLAPSED: 'collapsed-card',
+ COLLAPSING: 'collapsing-card',
+ EXPANDING: 'expanding-card',
+ WAS_COLLAPSED: 'was-collapsed',
+ MAXIMIZED: 'maximized-card',
+ }
+
+ const Selector = {
+ DATA_REMOVE: '[data-card-widget="remove"]',
+ DATA_COLLAPSE: '[data-card-widget="collapse"]',
+ DATA_MAXIMIZE: '[data-card-widget="maximize"]',
+ CARD: `.${ClassName.CARD}`,
+ CARD_HEADER: '.card-header',
+ CARD_BODY: '.card-body',
+ CARD_FOOTER: '.card-footer',
+ COLLAPSED: `.${ClassName.COLLAPSED}`,
+ }
+
+ const Default = {
+ animationSpeed: 'normal',
+ collapseTrigger: Selector.DATA_COLLAPSE,
+ removeTrigger: Selector.DATA_REMOVE,
+ maximizeTrigger: Selector.DATA_MAXIMIZE,
+ collapseIcon: 'fa-minus',
+ expandIcon: 'fa-plus',
+ maximizeIcon: 'fa-expand',
+ minimizeIcon: 'fa-compress',
+ }
+
+ class CardWidget {
+ constructor(element, settings) {
+ this._element = element
+ this._parent = element.parents(Selector.CARD).first()
+
+ if (element.hasClass(ClassName.CARD)) {
+ this._parent = element
+ }
+
+ this._settings = $.extend({}, Default, settings)
+ }
+
+ collapse() {
+ this._parent.addClass(ClassName.COLLAPSING).children(`${Selector.CARD_BODY}, ${Selector.CARD_FOOTER}`)
+ .slideUp(this._settings.animationSpeed, () => {
+ this._parent.addClass(ClassName.COLLAPSED).removeClass(ClassName.COLLAPSING)
+ })
+
+ this._parent.find('> ' + Selector.CARD_HEADER + ' ' + this._settings.collapseTrigger + ' .' + this._settings.collapseIcon)
+ .addClass(this._settings.expandIcon)
+ .removeClass(this._settings.collapseIcon)
+
+ const collapsed = $.Event(Event.COLLAPSED)
+
+ this._element.trigger(collapsed, this._parent)
+ }
+
+ expand() {
+ this._parent.addClass(ClassName.EXPANDING).children(`${Selector.CARD_BODY}, ${Selector.CARD_FOOTER}`)
+ .slideDown(this._settings.animationSpeed, () => {
+ this._parent.removeClass(ClassName.COLLAPSED).removeClass(ClassName.EXPANDING)
+ })
+
+ this._parent.find('> ' + Selector.CARD_HEADER + ' ' + this._settings.collapseTrigger + ' .' + this._settings.expandIcon)
+ .addClass(this._settings.collapseIcon)
+ .removeClass(this._settings.expandIcon)
+
+ const expanded = $.Event(Event.EXPANDED)
+
+ this._element.trigger(expanded, this._parent)
+ }
+
+ remove() {
+ this._parent.slideUp()
+
+ const removed = $.Event(Event.REMOVED)
+
+ this._element.trigger(removed, this._parent)
+ }
+
+ toggle() {
+ if (this._parent.hasClass(ClassName.COLLAPSED)) {
+ this.expand()
+ return
+ }
+
+ this.collapse()
+ }
+
+ maximize() {
+ this._parent.find(this._settings.maximizeTrigger + ' .' + this._settings.maximizeIcon)
+ .addClass(this._settings.minimizeIcon)
+ .removeClass(this._settings.maximizeIcon)
+ this._parent.css({
+ 'height': this._parent.height(),
+ 'width': this._parent.width(),
+ 'transition': 'all .15s'
+ }).delay(150).queue(function(){
+ $(this).addClass(ClassName.MAXIMIZED)
+ $('html').addClass(ClassName.MAXIMIZED)
+ if ($(this).hasClass(ClassName.COLLAPSED)) {
+ $(this).addClass(ClassName.WAS_COLLAPSED)
+ }
+ $(this).dequeue()
+ })
+
+ const maximized = $.Event(Event.MAXIMIZED)
+
+ this._element.trigger(maximized, this._parent)
+ }
+
+ minimize() {
+ this._parent.find(this._settings.maximizeTrigger + ' .' + this._settings.minimizeIcon)
+ .addClass(this._settings.maximizeIcon)
+ .removeClass(this._settings.minimizeIcon)
+ this._parent.css('cssText', 'height:' + this._parent[0].style.height + ' !important;' +
+ 'width:' + this._parent[0].style.width + ' !important; transition: all .15s;'
+ ).delay(10).queue(function(){
+ $(this).removeClass(ClassName.MAXIMIZED)
+ $('html').removeClass(ClassName.MAXIMIZED)
+ $(this).css({
+ 'height': 'inherit',
+ 'width': 'inherit'
+ })
+ if ($(this).hasClass(ClassName.WAS_COLLAPSED)) {
+ $(this).removeClass(ClassName.WAS_COLLAPSED)
+ }
+ $(this).dequeue()
+ })
+
+ const MINIMIZED = $.Event(Event.MINIMIZED)
+
+ this._element.trigger(MINIMIZED, this._parent)
+ }
+
+ toggleMaximize() {
+ if (this._parent.hasClass(ClassName.MAXIMIZED)) {
+ this.minimize()
+ return
+ }
+
+ this.maximize()
+ }
+
+ // Private
+
+ _init(card) {
+ this._parent = card
+
+ $(this).find(this._settings.collapseTrigger).click(() => {
+ this.toggle()
+ })
+
+ $(this).find(this._settings.maximizeTrigger).click(() => {
+ this.toggleMaximize()
+ })
+
+ $(this).find(this._settings.removeTrigger).click(() => {
+ this.remove()
+ })
+ }
+
+ // Static
+
+ static _jQueryInterface(config) {
+ let data = $(this).data(DATA_KEY)
+ const _options = $.extend({}, Default, $(this).data())
+
+ if (!data) {
+ data = new CardWidget($(this), _options)
+ $(this).data(DATA_KEY, typeof config === 'string' ? data: config)
+ }
+
+ if (typeof config === 'string' && config.match(/collapse|expand|remove|toggle|maximize|minimize|toggleMaximize/)) {
+ data[config]()
+ } else if (typeof config === 'object') {
+ data._init($(this))
+ }
+ }
+ }
+
+ /**
+ * Data API
+ * ====================================================
+ */
+
+ $(document).on('click', Selector.DATA_COLLAPSE, function (event) {
+ if (event) {
+ event.preventDefault()
+ }
+
+ CardWidget._jQueryInterface.call($(this), 'toggle')
+ })
+
+ $(document).on('click', Selector.DATA_REMOVE, function (event) {
+ if (event) {
+ event.preventDefault()
+ }
+
+ CardWidget._jQueryInterface.call($(this), 'remove')
+ })
+
+ $(document).on('click', Selector.DATA_MAXIMIZE, function (event) {
+ if (event) {
+ event.preventDefault()
+ }
+
+ CardWidget._jQueryInterface.call($(this), 'toggleMaximize')
+ })
+
+ /**
+ * jQuery API
+ * ====================================================
+ */
+
+ $.fn[NAME] = CardWidget._jQueryInterface
+ $.fn[NAME].Constructor = CardWidget
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return CardWidget._jQueryInterface
+ }
+
+ return CardWidget
+})(jQuery)
+
+export default CardWidget
diff --git a/qrcode/build/js/ControlSidebar.js b/qrcode/build/js/ControlSidebar.js
new file mode 100644
index 0000000..a330885
--- /dev/null
+++ b/qrcode/build/js/ControlSidebar.js
@@ -0,0 +1,292 @@
+/**
+ * --------------------------------------------
+ * AdminLTE ControlSidebar.js
+ * License MIT
+ * --------------------------------------------
+ */
+
+const ControlSidebar = (($) => {
+ /**
+ * Constants
+ * ====================================================
+ */
+
+ const NAME = 'ControlSidebar'
+ const DATA_KEY = 'lte.controlsidebar'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+ const DATA_API_KEY = '.data-api'
+
+ const Event = {
+ COLLAPSED: `collapsed${EVENT_KEY}`,
+ EXPANDED: `expanded${EVENT_KEY}`,
+ }
+
+ const Selector = {
+ CONTROL_SIDEBAR: '.control-sidebar',
+ CONTROL_SIDEBAR_CONTENT: '.control-sidebar-content',
+ DATA_TOGGLE: '[data-widget="control-sidebar"]',
+ CONTENT: '.content-wrapper',
+ HEADER: '.main-header',
+ FOOTER: '.main-footer',
+ }
+
+ const ClassName = {
+ CONTROL_SIDEBAR_ANIMATE: 'control-sidebar-animate',
+ CONTROL_SIDEBAR_OPEN: 'control-sidebar-open',
+ CONTROL_SIDEBAR_SLIDE: 'control-sidebar-slide-open',
+ LAYOUT_FIXED: 'layout-fixed',
+ NAVBAR_FIXED: 'layout-navbar-fixed',
+ NAVBAR_SM_FIXED: 'layout-sm-navbar-fixed',
+ NAVBAR_MD_FIXED: 'layout-md-navbar-fixed',
+ NAVBAR_LG_FIXED: 'layout-lg-navbar-fixed',
+ NAVBAR_XL_FIXED: 'layout-xl-navbar-fixed',
+ FOOTER_FIXED: 'layout-footer-fixed',
+ FOOTER_SM_FIXED: 'layout-sm-footer-fixed',
+ FOOTER_MD_FIXED: 'layout-md-footer-fixed',
+ FOOTER_LG_FIXED: 'layout-lg-footer-fixed',
+ FOOTER_XL_FIXED: 'layout-xl-footer-fixed',
+ }
+
+ const Default = {
+ controlsidebarSlide: true,
+ scrollbarTheme : 'os-theme-light',
+ scrollbarAutoHide: 'l',
+ }
+
+ /**
+ * Class Definition
+ * ====================================================
+ */
+
+ class ControlSidebar {
+ constructor(element, config) {
+ this._element = element
+ this._config = config
+
+ this._init()
+ }
+
+ // Public
+
+ collapse() {
+ // Show the control sidebar
+ if (this._config.controlsidebarSlide) {
+ $('html').addClass(ClassName.CONTROL_SIDEBAR_ANIMATE)
+ $('body').removeClass(ClassName.CONTROL_SIDEBAR_SLIDE).delay(300).queue(function(){
+ $(Selector.CONTROL_SIDEBAR).hide()
+ $('html').removeClass(ClassName.CONTROL_SIDEBAR_ANIMATE)
+ $(this).dequeue()
+ })
+ } else {
+ $('body').removeClass(ClassName.CONTROL_SIDEBAR_OPEN)
+ }
+
+ const collapsedEvent = $.Event(Event.COLLAPSED)
+ $(this._element).trigger(collapsedEvent)
+ }
+
+ show() {
+ // Collapse the control sidebar
+ if (this._config.controlsidebarSlide) {
+ $('html').addClass(ClassName.CONTROL_SIDEBAR_ANIMATE)
+ $(Selector.CONTROL_SIDEBAR).show().delay(10).queue(function(){
+ $('body').addClass(ClassName.CONTROL_SIDEBAR_SLIDE).delay(300).queue(function(){
+ $('html').removeClass(ClassName.CONTROL_SIDEBAR_ANIMATE)
+ $(this).dequeue()
+ })
+ $(this).dequeue()
+ })
+ } else {
+ $('body').addClass(ClassName.CONTROL_SIDEBAR_OPEN)
+ }
+
+ const expandedEvent = $.Event(Event.EXPANDED)
+ $(this._element).trigger(expandedEvent)
+ }
+
+ toggle() {
+ const shouldClose = $('body').hasClass(ClassName.CONTROL_SIDEBAR_OPEN) || $('body')
+ .hasClass(ClassName.CONTROL_SIDEBAR_SLIDE)
+ if (shouldClose) {
+ // Close the control sidebar
+ this.collapse()
+ } else {
+ // Open the control sidebar
+ this.show()
+ }
+ }
+
+ // Private
+
+ _init() {
+ this._fixHeight()
+ this._fixScrollHeight()
+
+ $(window).resize(() => {
+ this._fixHeight()
+ this._fixScrollHeight()
+ })
+
+ $(window).scroll(() => {
+ if ($('body').hasClass(ClassName.CONTROL_SIDEBAR_OPEN) || $('body').hasClass(ClassName.CONTROL_SIDEBAR_SLIDE)) {
+ this._fixScrollHeight()
+ }
+ })
+ }
+
+ _fixScrollHeight() {
+ const heights = {
+ scroll: $(document).height(),
+ window: $(window).height(),
+ header: $(Selector.HEADER).outerHeight(),
+ footer: $(Selector.FOOTER).outerHeight(),
+ }
+ const positions = {
+ bottom: Math.abs((heights.window + $(window).scrollTop()) - heights.scroll),
+ top: $(window).scrollTop(),
+ }
+
+ let navbarFixed = false;
+ let footerFixed = false;
+
+ if ($('body').hasClass(ClassName.LAYOUT_FIXED)) {
+ if (
+ $('body').hasClass(ClassName.NAVBAR_FIXED)
+ || $('body').hasClass(ClassName.NAVBAR_SM_FIXED)
+ || $('body').hasClass(ClassName.NAVBAR_MD_FIXED)
+ || $('body').hasClass(ClassName.NAVBAR_LG_FIXED)
+ || $('body').hasClass(ClassName.NAVBAR_XL_FIXED)
+ ) {
+ if ($(Selector.HEADER).css("position") === "fixed") {
+ navbarFixed = true;
+ }
+ }
+ if (
+ $('body').hasClass(ClassName.FOOTER_FIXED)
+ || $('body').hasClass(ClassName.FOOTER_SM_FIXED)
+ || $('body').hasClass(ClassName.FOOTER_MD_FIXED)
+ || $('body').hasClass(ClassName.FOOTER_LG_FIXED)
+ || $('body').hasClass(ClassName.FOOTER_XL_FIXED)
+ ) {
+ if ($(Selector.FOOTER).css("position") === "fixed") {
+ footerFixed = true;
+ }
+ }
+
+ if (positions.top === 0 && positions.bottom === 0) {
+ $(Selector.CONTROL_SIDEBAR).css('bottom', heights.footer);
+ $(Selector.CONTROL_SIDEBAR).css('top', heights.header);
+ $(Selector.CONTROL_SIDEBAR + ', ' + Selector.CONTROL_SIDEBAR + ' ' + Selector.CONTROL_SIDEBAR_CONTENT).css('height', heights.window - (heights.header + heights.footer))
+ } else if (positions.bottom <= heights.footer) {
+ if (footerFixed === false) {
+ $(Selector.CONTROL_SIDEBAR).css('bottom', heights.footer - positions.bottom);
+ $(Selector.CONTROL_SIDEBAR + ', ' + Selector.CONTROL_SIDEBAR + ' ' + Selector.CONTROL_SIDEBAR_CONTENT).css('height', heights.window - (heights.footer - positions.bottom))
+ } else {
+ $(Selector.CONTROL_SIDEBAR).css('bottom', heights.footer);
+ }
+ } else if (positions.top <= heights.header) {
+ if (navbarFixed === false) {
+ $(Selector.CONTROL_SIDEBAR).css('top', heights.header - positions.top);
+ $(Selector.CONTROL_SIDEBAR + ', ' + Selector.CONTROL_SIDEBAR + ' ' + Selector.CONTROL_SIDEBAR_CONTENT).css('height', heights.window - (heights.header - positions.top))
+ } else {
+ $(Selector.CONTROL_SIDEBAR).css('top', heights.header);
+ }
+ } else {
+ if (navbarFixed === false) {
+ $(Selector.CONTROL_SIDEBAR).css('top', 0);
+ $(Selector.CONTROL_SIDEBAR + ', ' + Selector.CONTROL_SIDEBAR + ' ' + Selector.CONTROL_SIDEBAR_CONTENT).css('height', heights.window)
+ } else {
+ $(Selector.CONTROL_SIDEBAR).css('top', heights.header);
+ }
+ }
+ }
+ }
+
+ _fixHeight() {
+ const heights = {
+ window: $(window).height(),
+ header: $(Selector.HEADER).outerHeight(),
+ footer: $(Selector.FOOTER).outerHeight(),
+ }
+
+ if ($('body').hasClass(ClassName.LAYOUT_FIXED)) {
+ let sidebarHeight = heights.window - heights.header;
+
+ if (
+ $('body').hasClass(ClassName.FOOTER_FIXED)
+ || $('body').hasClass(ClassName.FOOTER_SM_FIXED)
+ || $('body').hasClass(ClassName.FOOTER_MD_FIXED)
+ || $('body').hasClass(ClassName.FOOTER_LG_FIXED)
+ || $('body').hasClass(ClassName.FOOTER_XL_FIXED)
+ ) {
+ if ($(Selector.FOOTER).css("position") === "fixed") {
+ sidebarHeight = heights.window - heights.header - heights.footer;
+ }
+ }
+
+ $(Selector.CONTROL_SIDEBAR + ' ' + Selector.CONTROL_SIDEBAR_CONTENT).css('height', sidebarHeight)
+
+ if (typeof $.fn.overlayScrollbars !== 'undefined') {
+ $(Selector.CONTROL_SIDEBAR + ' ' + Selector.CONTROL_SIDEBAR_CONTENT).overlayScrollbars({
+ className : this._config.scrollbarTheme,
+ sizeAutoCapable : true,
+ scrollbars : {
+ autoHide: this._config.scrollbarAutoHide,
+ clickScrolling : true
+ }
+ })
+ }
+ }
+ }
+
+
+ // Static
+
+ static _jQueryInterface(operation) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+ const _options = $.extend({}, Default, $(this).data())
+
+ if (!data) {
+ data = new ControlSidebar(this, _options)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (data[operation] === 'undefined') {
+ throw new Error(`${operation} is not a function`)
+ }
+
+ data[operation]()
+ })
+ }
+ }
+
+ /**
+ *
+ * Data Api implementation
+ * ====================================================
+ */
+ $(document).on('click', Selector.DATA_TOGGLE, function (event) {
+ event.preventDefault()
+
+ ControlSidebar._jQueryInterface.call($(this), 'toggle')
+ })
+
+ /**
+ * jQuery API
+ * ====================================================
+ */
+
+ $.fn[NAME] = ControlSidebar._jQueryInterface
+ $.fn[NAME].Constructor = ControlSidebar
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return ControlSidebar._jQueryInterface
+ }
+
+ return ControlSidebar
+})(jQuery)
+
+export default ControlSidebar
+
diff --git a/qrcode/build/js/Dropdown.js b/qrcode/build/js/Dropdown.js
new file mode 100644
index 0000000..a28c927
--- /dev/null
+++ b/qrcode/build/js/Dropdown.js
@@ -0,0 +1,143 @@
+/**
+ * --------------------------------------------
+ * AdminLTE Dropdown.js
+ * License MIT
+ * --------------------------------------------
+ */
+
+const Dropdown = (($) => {
+ /**
+ * Constants
+ * ====================================================
+ */
+
+ const NAME = 'Dropdown'
+ const DATA_KEY = 'lte.dropdown'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+
+ const Selector = {
+ NAVBAR: '.navbar',
+ DROPDOWN_MENU: '.dropdown-menu',
+ DROPDOWN_MENU_ACTIVE: '.dropdown-menu.show',
+ DROPDOWN_TOGGLE: '[data-toggle="dropdown"]',
+ }
+
+ const ClassName = {
+ DROPDOWN_HOVER: 'dropdown-hover',
+ DROPDOWN_RIGHT: 'dropdown-menu-right'
+ }
+
+ const Default = {
+ }
+
+
+ /**
+ * Class Definition
+ * ====================================================
+ */
+
+ class Dropdown {
+ constructor(element, config) {
+ this._config = config
+ this._element = element
+ }
+
+ // Public
+
+ toggleSubmenu() {
+ this._element.siblings().show().toggleClass("show")
+
+ if (! this._element.next().hasClass('show')) {
+ this._element.parents('.dropdown-menu').first().find('.show').removeClass("show").hide()
+ }
+
+ this._element.parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function(e) {
+ $('.dropdown-submenu .show').removeClass("show").hide()
+ })
+ }
+
+ fixPosition() {
+ let elm = $(Selector.DROPDOWN_MENU_ACTIVE)
+
+ if (elm.length !== 0) {
+ if (elm.hasClass(ClassName.DROPDOWN_RIGHT)) {
+ elm.css('left', 'inherit')
+ elm.css('right', 0)
+ } else {
+ elm.css('left', 0)
+ elm.css('right', 'inherit')
+ }
+
+ let offset = elm.offset()
+ let width = elm.width()
+ let windowWidth = $(window).width()
+ let visiblePart = windowWidth - offset.left
+
+ if (offset.left < 0) {
+ elm.css('left', 'inherit')
+ elm.css('right', (offset.left - 5))
+ } else {
+ if (visiblePart < width) {
+ elm.css('left', 'inherit')
+ elm.css('right', 0)
+ }
+ }
+ }
+ }
+
+ // Static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+ const _config = $.extend({}, Default, $(this).data())
+
+ if (!data) {
+ data = new Dropdown($(this), _config)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (config === 'toggleSubmenu' || config == 'fixPosition') {
+ data[config]()
+ }
+ })
+ }
+ }
+
+ /**
+ * Data API
+ * ====================================================
+ */
+
+ $(Selector.DROPDOWN_MENU + ' ' + Selector.DROPDOWN_TOGGLE).on("click", function(event) {
+ event.preventDefault()
+ event.stopPropagation()
+
+ Dropdown._jQueryInterface.call($(this), 'toggleSubmenu')
+ });
+
+ $(Selector.NAVBAR + ' ' + Selector.DROPDOWN_TOGGLE).on("click", function(event) {
+ event.preventDefault()
+
+ setTimeout(function() {
+ Dropdown._jQueryInterface.call($(this), 'fixPosition')
+ }, 1)
+ });
+
+ /**
+ * jQuery API
+ * ====================================================
+ */
+
+ $.fn[NAME] = Dropdown._jQueryInterface
+ $.fn[NAME].Constructor = Dropdown
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Dropdown._jQueryInterface
+ }
+
+ return Dropdown
+})(jQuery)
+
+export default Dropdown
diff --git a/qrcode/build/js/Layout.js b/qrcode/build/js/Layout.js
new file mode 100644
index 0000000..510d475
--- /dev/null
+++ b/qrcode/build/js/Layout.js
@@ -0,0 +1,252 @@
+/**
+ * --------------------------------------------
+ * AdminLTE Layout.js
+ * License MIT
+ * --------------------------------------------
+ */
+
+const Layout = (($) => {
+ /**
+ * Constants
+ * ====================================================
+ */
+
+ const NAME = 'Layout'
+ const DATA_KEY = 'lte.layout'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+
+ const Event = {
+ SIDEBAR: 'sidebar'
+ }
+
+ const Selector = {
+ HEADER : '.main-header',
+ MAIN_SIDEBAR : '.main-sidebar',
+ SIDEBAR : '.main-sidebar .sidebar',
+ CONTENT : '.content-wrapper',
+ BRAND : '.brand-link',
+ CONTENT_HEADER : '.content-header',
+ WRAPPER : '.wrapper',
+ CONTROL_SIDEBAR: '.control-sidebar',
+ CONTROL_SIDEBAR_CONTENT: '.control-sidebar-content',
+ CONTROL_SIDEBAR_BTN: '[data-widget="control-sidebar"]',
+ LAYOUT_FIXED : '.layout-fixed',
+ FOOTER : '.main-footer',
+ PUSHMENU_BTN : '[data-widget="pushmenu"]',
+ LOGIN_BOX : '.login-box',
+ REGISTER_BOX : '.register-box'
+ }
+
+ const ClassName = {
+ HOLD : 'hold-transition',
+ SIDEBAR : 'main-sidebar',
+ CONTENT_FIXED : 'content-fixed',
+ SIDEBAR_FOCUSED: 'sidebar-focused',
+ LAYOUT_FIXED : 'layout-fixed',
+ NAVBAR_FIXED : 'layout-navbar-fixed',
+ FOOTER_FIXED : 'layout-footer-fixed',
+ LOGIN_PAGE : 'login-page',
+ REGISTER_PAGE : 'register-page',
+ CONTROL_SIDEBAR_SLIDE_OPEN: 'control-sidebar-slide-open',
+ CONTROL_SIDEBAR_OPEN: 'control-sidebar-open',
+ }
+
+ const Default = {
+ scrollbarTheme : 'os-theme-light',
+ scrollbarAutoHide: 'l',
+ panelAutoHeight: true,
+ loginRegisterAutoHeight: true,
+ }
+
+ /**
+ * Class Definition
+ * ====================================================
+ */
+
+ class Layout {
+ constructor(element, config) {
+ this._config = config
+ this._element = element
+
+ this._init()
+ }
+
+ // Public
+
+ fixLayoutHeight(extra = null) {
+ let control_sidebar = 0
+
+ if ($('body').hasClass(ClassName.CONTROL_SIDEBAR_SLIDE_OPEN) || $('body').hasClass(ClassName.CONTROL_SIDEBAR_OPEN) || extra == 'control_sidebar') {
+ control_sidebar = $(Selector.CONTROL_SIDEBAR_CONTENT).height()
+ }
+
+ const heights = {
+ window: $(window).height(),
+ header: $(Selector.HEADER).length !== 0 ? $(Selector.HEADER).outerHeight() : 0,
+ footer: $(Selector.FOOTER).length !== 0 ? $(Selector.FOOTER).outerHeight() : 0,
+ sidebar: $(Selector.SIDEBAR).length !== 0 ? $(Selector.SIDEBAR).height() : 0,
+ control_sidebar: control_sidebar,
+ }
+
+ const max = this._max(heights)
+ let offset = this._config.panelAutoHeight
+
+ if (offset === true) {
+ offset = 0;
+ }
+
+ if (offset !== false) {
+ if (max == heights.control_sidebar) {
+ $(Selector.CONTENT).css('min-height', (max + offset))
+ } else if (max == heights.window) {
+ $(Selector.CONTENT).css('min-height', (max + offset) - heights.header - heights.footer)
+ } else {
+ $(Selector.CONTENT).css('min-height', (max + offset) - heights.header)
+ }
+ if (this._isFooterFixed()) {
+ $(Selector.CONTENT).css('min-height', parseFloat($(Selector.CONTENT).css('min-height')) + heights.footer);
+ }
+ }
+
+ if ($('body').hasClass(ClassName.LAYOUT_FIXED)) {
+ if (offset !== false) {
+ $(Selector.CONTENT).css('min-height', (max + offset) - heights.header - heights.footer)
+ }
+
+ if (typeof $.fn.overlayScrollbars !== 'undefined') {
+ $(Selector.SIDEBAR).overlayScrollbars({
+ className : this._config.scrollbarTheme,
+ sizeAutoCapable : true,
+ scrollbars : {
+ autoHide: this._config.scrollbarAutoHide,
+ clickScrolling : true
+ }
+ })
+ }
+ }
+ }
+
+ fixLoginRegisterHeight() {
+ if ($(Selector.LOGIN_BOX + ', ' + Selector.REGISTER_BOX).length === 0) {
+ $('body, html').css('height', 'auto')
+ } else if ($(Selector.LOGIN_BOX + ', ' + Selector.REGISTER_BOX).length !== 0) {
+ let box_height = $(Selector.LOGIN_BOX + ', ' + Selector.REGISTER_BOX).height()
+
+ if ($('body').css('min-height') !== box_height) {
+ $('body').css('min-height', box_height)
+ }
+ }
+ }
+
+ // Private
+
+ _init() {
+ // Activate layout height watcher
+ this.fixLayoutHeight()
+
+ if (this._config.loginRegisterAutoHeight === true) {
+ this.fixLoginRegisterHeight()
+ } else if (Number.isInteger(this._config.loginRegisterAutoHeight)) {
+ setInterval(this.fixLoginRegisterHeight, this._config.loginRegisterAutoHeight);
+ }
+
+ $(Selector.SIDEBAR)
+ .on('collapsed.lte.treeview expanded.lte.treeview', () => {
+ this.fixLayoutHeight()
+ })
+
+ $(Selector.PUSHMENU_BTN)
+ .on('collapsed.lte.pushmenu shown.lte.pushmenu', () => {
+ this.fixLayoutHeight()
+ })
+
+ $(Selector.CONTROL_SIDEBAR_BTN)
+ .on('collapsed.lte.controlsidebar', () => {
+ this.fixLayoutHeight()
+ })
+ .on('expanded.lte.controlsidebar', () => {
+ this.fixLayoutHeight('control_sidebar')
+ })
+
+ $(window).resize(() => {
+ this.fixLayoutHeight()
+ })
+
+ setTimeout(() => {
+ $('body.hold-transition').removeClass('hold-transition')
+
+ }, 50);
+ }
+
+ _max(numbers) {
+ // Calculate the maximum number in a list
+ let max = 0
+
+ Object.keys(numbers).forEach((key) => {
+ if (numbers[key] > max) {
+ max = numbers[key]
+ }
+ })
+
+ return max
+ }
+
+ _isFooterFixed() {
+ return $('.main-footer').css('position') === 'fixed';
+ }
+
+ // Static
+
+ static _jQueryInterface(config = '') {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+ const _options = $.extend({}, Default, $(this).data())
+
+ if (!data) {
+ data = new Layout($(this), _options)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (config === 'init' || config === '') {
+ data['_init']()
+ } else if (config === 'fixLayoutHeight' || config === 'fixLoginRegisterHeight') {
+ data[config]()
+ }
+ })
+ }
+ }
+
+ /**
+ * Data API
+ * ====================================================
+ */
+
+ $(window).on('load', () => {
+ Layout._jQueryInterface.call($('body'))
+ })
+
+ $(Selector.SIDEBAR + ' a').on('focusin', () => {
+ $(Selector.MAIN_SIDEBAR).addClass(ClassName.SIDEBAR_FOCUSED);
+ })
+
+ $(Selector.SIDEBAR + ' a').on('focusout', () => {
+ $(Selector.MAIN_SIDEBAR).removeClass(ClassName.SIDEBAR_FOCUSED);
+ })
+
+ /**
+ * jQuery API
+ * ====================================================
+ */
+
+ $.fn[NAME] = Layout._jQueryInterface
+ $.fn[NAME].Constructor = Layout
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Layout._jQueryInterface
+ }
+
+ return Layout
+})(jQuery)
+
+export default Layout
diff --git a/qrcode/build/js/PushMenu.js b/qrcode/build/js/PushMenu.js
new file mode 100644
index 0000000..5a73360
--- /dev/null
+++ b/qrcode/build/js/PushMenu.js
@@ -0,0 +1,225 @@
+/**
+ * --------------------------------------------
+ * AdminLTE PushMenu.js
+ * License MIT
+ * --------------------------------------------
+ */
+
+const PushMenu = (($) => {
+ /**
+ * Constants
+ * ====================================================
+ */
+
+ const NAME = 'PushMenu'
+ const DATA_KEY = 'lte.pushmenu'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+
+ const Event = {
+ COLLAPSED: `collapsed${EVENT_KEY}`,
+ SHOWN: `shown${EVENT_KEY}`
+ }
+
+ const Default = {
+ autoCollapseSize: 992,
+ enableRemember: false,
+ noTransitionAfterReload: true
+ }
+
+ const Selector = {
+ TOGGLE_BUTTON: '[data-widget="pushmenu"]',
+ SIDEBAR_MINI: '.sidebar-mini',
+ SIDEBAR_COLLAPSED: '.sidebar-collapse',
+ BODY: 'body',
+ OVERLAY: '#sidebar-overlay',
+ WRAPPER: '.wrapper'
+ }
+
+ const ClassName = {
+ COLLAPSED: 'sidebar-collapse',
+ OPEN: 'sidebar-open',
+ CLOSED: 'sidebar-closed'
+ }
+
+ /**
+ * Class Definition
+ * ====================================================
+ */
+
+ class PushMenu {
+ constructor(element, options) {
+ this._element = element
+ this._options = $.extend({}, Default, options)
+
+ if (!$(Selector.OVERLAY).length) {
+ this._addOverlay()
+ }
+
+ this._init()
+ }
+
+ // Public
+
+ expand() {
+ if (this._options.autoCollapseSize) {
+ if ($(window).width() <= this._options.autoCollapseSize) {
+ $(Selector.BODY).addClass(ClassName.OPEN)
+ }
+ }
+
+ $(Selector.BODY).removeClass(ClassName.COLLAPSED).removeClass(ClassName.CLOSED)
+
+ if(this._options.enableRemember) {
+ localStorage.setItem(`remember${EVENT_KEY}`, ClassName.OPEN)
+ }
+
+ const shownEvent = $.Event(Event.SHOWN)
+ $(this._element).trigger(shownEvent)
+ }
+
+ collapse() {
+ if (this._options.autoCollapseSize) {
+ if ($(window).width() <= this._options.autoCollapseSize) {
+ $(Selector.BODY).removeClass(ClassName.OPEN).addClass(ClassName.CLOSED)
+ }
+ }
+
+ $(Selector.BODY).addClass(ClassName.COLLAPSED)
+
+ if(this._options.enableRemember) {
+ localStorage.setItem(`remember${EVENT_KEY}`, ClassName.COLLAPSED)
+ }
+
+ const collapsedEvent = $.Event(Event.COLLAPSED)
+ $(this._element).trigger(collapsedEvent)
+ }
+
+ toggle() {
+ if (!$(Selector.BODY).hasClass(ClassName.COLLAPSED)) {
+ this.collapse()
+ } else {
+ this.expand()
+ }
+ }
+
+ autoCollapse(resize = false) {
+ if (this._options.autoCollapseSize) {
+ if ($(window).width() <= this._options.autoCollapseSize) {
+ if (!$(Selector.BODY).hasClass(ClassName.OPEN)) {
+ this.collapse()
+ }
+ } else if (resize == true) {
+ if ($(Selector.BODY).hasClass(ClassName.OPEN)) {
+ $(Selector.BODY).removeClass(ClassName.OPEN)
+ } else if($(Selector.BODY).hasClass(ClassName.CLOSED)) {
+ this.expand()
+ }
+ }
+ }
+ }
+
+ remember() {
+ if(this._options.enableRemember) {
+ let toggleState = localStorage.getItem(`remember${EVENT_KEY}`)
+ if (toggleState == ClassName.COLLAPSED){
+ if (this._options.noTransitionAfterReload) {
+ $("body").addClass('hold-transition').addClass(ClassName.COLLAPSED).delay(50).queue(function() {
+ $(this).removeClass('hold-transition')
+ $(this).dequeue()
+ })
+ } else {
+ $("body").addClass(ClassName.COLLAPSED)
+ }
+ } else {
+ if (this._options.noTransitionAfterReload) {
+ $("body").addClass('hold-transition').removeClass(ClassName.COLLAPSED).delay(50).queue(function() {
+ $(this).removeClass('hold-transition')
+ $(this).dequeue()
+ })
+ } else {
+ $("body").removeClass(ClassName.COLLAPSED)
+ }
+ }
+ }
+ }
+
+ // Private
+
+ _init() {
+ this.remember()
+ this.autoCollapse()
+
+ $(window).resize(() => {
+ this.autoCollapse(true)
+ })
+ }
+
+ _addOverlay() {
+ const overlay = $('
', {
+ id: 'sidebar-overlay'
+ })
+
+ overlay.on('click', () => {
+ this.collapse()
+ })
+
+ $(Selector.WRAPPER).append(overlay)
+ }
+
+ // Static
+
+ static _jQueryInterface(operation) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+ const _options = $.extend({}, Default, $(this).data())
+
+ if (!data) {
+ data = new PushMenu(this, _options)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (typeof operation === 'string' && operation.match(/collapse|expand|toggle/)) {
+ data[operation]()
+ }
+ })
+ }
+ }
+
+ /**
+ * Data API
+ * ====================================================
+ */
+
+ $(document).on('click', Selector.TOGGLE_BUTTON, (event) => {
+ event.preventDefault()
+
+ let button = event.currentTarget
+
+ if ($(button).data('widget') !== 'pushmenu') {
+ button = $(button).closest(Selector.TOGGLE_BUTTON)
+ }
+
+ PushMenu._jQueryInterface.call($(button), 'toggle')
+ })
+
+ $(window).on('load', () => {
+ PushMenu._jQueryInterface.call($(Selector.TOGGLE_BUTTON))
+ })
+
+ /**
+ * jQuery API
+ * ====================================================
+ */
+
+ $.fn[NAME] = PushMenu._jQueryInterface
+ $.fn[NAME].Constructor = PushMenu
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return PushMenu._jQueryInterface
+ }
+
+ return PushMenu
+})(jQuery)
+
+export default PushMenu
diff --git a/qrcode/build/js/Treeview.js b/qrcode/build/js/Treeview.js
new file mode 100644
index 0000000..2e29b56
--- /dev/null
+++ b/qrcode/build/js/Treeview.js
@@ -0,0 +1,185 @@
+/**
+ * --------------------------------------------
+ * AdminLTE Treeview.js
+ * License MIT
+ * --------------------------------------------
+ */
+
+const Treeview = (($) => {
+ /**
+ * Constants
+ * ====================================================
+ */
+
+ const NAME = 'Treeview'
+ const DATA_KEY = 'lte.treeview'
+ const EVENT_KEY = `.${DATA_KEY}`
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+
+ const Event = {
+ SELECTED : `selected${EVENT_KEY}`,
+ EXPANDED : `expanded${EVENT_KEY}`,
+ COLLAPSED : `collapsed${EVENT_KEY}`,
+ LOAD_DATA_API: `load${EVENT_KEY}`
+ }
+
+ const Selector = {
+ LI : '.nav-item',
+ LINK : '.nav-link',
+ TREEVIEW_MENU: '.nav-treeview',
+ OPEN : '.menu-open',
+ DATA_WIDGET : '[data-widget="treeview"]'
+ }
+
+ const ClassName = {
+ LI : 'nav-item',
+ LINK : 'nav-link',
+ TREEVIEW_MENU : 'nav-treeview',
+ OPEN : 'menu-open',
+ SIDEBAR_COLLAPSED: 'sidebar-collapse'
+ }
+
+ const Default = {
+ trigger : `${Selector.DATA_WIDGET} ${Selector.LINK}`,
+ animationSpeed : 300,
+ accordion : true,
+ expandSidebar : false,
+ sidebarButtonSelector: '[data-widget="pushmenu"]'
+ }
+
+ /**
+ * Class Definition
+ * ====================================================
+ */
+ class Treeview {
+ constructor(element, config) {
+ this._config = config
+ this._element = element
+ }
+
+ // Public
+
+ init() {
+ this._setupListeners()
+ }
+
+ expand(treeviewMenu, parentLi) {
+ const expandedEvent = $.Event(Event.EXPANDED)
+
+ if (this._config.accordion) {
+ const openMenuLi = parentLi.siblings(Selector.OPEN).first()
+ const openTreeview = openMenuLi.find(Selector.TREEVIEW_MENU).first()
+ this.collapse(openTreeview, openMenuLi)
+ }
+
+ treeviewMenu.stop().slideDown(this._config.animationSpeed, () => {
+ parentLi.addClass(ClassName.OPEN)
+ $(this._element).trigger(expandedEvent)
+ })
+
+ if (this._config.expandSidebar) {
+ this._expandSidebar()
+ }
+ }
+
+ collapse(treeviewMenu, parentLi) {
+ const collapsedEvent = $.Event(Event.COLLAPSED)
+
+ treeviewMenu.stop().slideUp(this._config.animationSpeed, () => {
+ parentLi.removeClass(ClassName.OPEN)
+ $(this._element).trigger(collapsedEvent)
+ treeviewMenu.find(`${Selector.OPEN} > ${Selector.TREEVIEW_MENU}`).slideUp()
+ treeviewMenu.find(Selector.OPEN).removeClass(ClassName.OPEN)
+ })
+ }
+
+ toggle(event) {
+
+ const $relativeTarget = $(event.currentTarget)
+ const $parent = $relativeTarget.parent()
+
+ let treeviewMenu = $parent.find('> ' + Selector.TREEVIEW_MENU)
+
+ if (!treeviewMenu.is(Selector.TREEVIEW_MENU)) {
+
+ if (!$parent.is(Selector.LI)) {
+ treeviewMenu = $parent.parent().find('> ' + Selector.TREEVIEW_MENU)
+ }
+
+ if (!treeviewMenu.is(Selector.TREEVIEW_MENU)) {
+ return
+ }
+ }
+
+ event.preventDefault()
+
+ const parentLi = $relativeTarget.parents(Selector.LI).first()
+ const isOpen = parentLi.hasClass(ClassName.OPEN)
+
+ if (isOpen) {
+ this.collapse($(treeviewMenu), parentLi)
+ } else {
+ this.expand($(treeviewMenu), parentLi)
+ }
+ }
+
+ // Private
+
+ _setupListeners() {
+ $(document).on('click', this._config.trigger, (event) => {
+ this.toggle(event)
+ })
+ }
+
+ _expandSidebar() {
+ if ($('body').hasClass(ClassName.SIDEBAR_COLLAPSED)) {
+ $(this._config.sidebarButtonSelector).PushMenu('expand')
+ }
+ }
+
+ // Static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ let data = $(this).data(DATA_KEY)
+ const _options = $.extend({}, Default, $(this).data())
+
+ if (!data) {
+ data = new Treeview($(this), _options)
+ $(this).data(DATA_KEY, data)
+ }
+
+ if (config === 'init') {
+ data[config]()
+ }
+ })
+ }
+ }
+
+ /**
+ * Data API
+ * ====================================================
+ */
+
+ $(window).on(Event.LOAD_DATA_API, () => {
+ $(Selector.DATA_WIDGET).each(function () {
+ Treeview._jQueryInterface.call($(this), 'init')
+ })
+ })
+
+ /**
+ * jQuery API
+ * ====================================================
+ */
+
+ $.fn[NAME] = Treeview._jQueryInterface
+ $.fn[NAME].Constructor = Treeview
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Treeview._jQueryInterface
+ }
+
+ return Treeview
+})(jQuery)
+
+export default Treeview
diff --git a/qrcode/delete_dynamic.php b/qrcode/delete_dynamic.php
new file mode 100644
index 0000000..88afd3d
--- /dev/null
+++ b/qrcode/delete_dynamic.php
@@ -0,0 +1,21 @@
+
+* @copyright Copyright (c) 2020-2021
+* @license https://opensource.org/licenses/MIT MIT License
+* @link https://github.com/giandonatoinverso/PHP-Dynamic-Qr-code
+* @version 1.0
+*/
+
+session_start();
+require_once 'includes/auth_validate.php';
+require_once './config/config.php';
+
+// Dynamic qrcode class
+require_once BASE_PATH . '/lib/Dynamic_Qrcode/Dynamic_Qrcode.php';
+$dynamic_qrcode = new Dynamic_Qrcode();
+
+if ($_SERVER['REQUEST_METHOD'] === 'POST')
+ $dynamic_qrcode->cancel($_POST['del_id'], $_POST['filename']);
diff --git a/qrcode/delete_static.php b/qrcode/delete_static.php
new file mode 100644
index 0000000..ea79503
--- /dev/null
+++ b/qrcode/delete_static.php
@@ -0,0 +1,21 @@
+
+* @copyright Copyright (c) 2020-2021
+* @license https://opensource.org/licenses/MIT MIT License
+* @link https://github.com/giandonatoinverso/PHP-Dynamic-Qr-code
+* @version 1.0
+*/
+
+session_start();
+require_once 'includes/auth_validate.php';
+require_once './config/config.php';
+
+// Dynamic qrcode class
+require_once BASE_PATH . '/lib/Static_Qrcode/Static_Qrcode.php';
+$static_qrcode = new Static_Qrcode();
+
+if ($_SERVER['REQUEST_METHOD'] === 'POST')
+ $static_qrcode->cancel($_POST['del_id'], $_POST['filename']);
diff --git a/qrcode/delete_user.php b/qrcode/delete_user.php
new file mode 100644
index 0000000..799738d
--- /dev/null
+++ b/qrcode/delete_user.php
@@ -0,0 +1,22 @@
+
+* @copyright Copyright (c) 2020-2021
+* @license https://opensource.org/licenses/MIT MIT License
+* @link https://github.com/giandonatoinverso/PHP-Dynamic-Qr-code
+* @version 1.0
+*/
+
+session_start();
+require_once 'includes/auth_validate.php';
+require_once './config/config.php';
+
+// Users class
+require_once BASE_PATH . '/lib/Users/Users.php';
+$Users = new Users();
+
+// Delete a user using user_id
+if ($_SERVER['REQUEST_METHOD'] === 'POST')
+ $Users->cancel($_POST['del_id']);
diff --git a/qrcode/dist/css/adminlte.css b/qrcode/dist/css/adminlte.css
new file mode 100644
index 0000000..ef63cdd
--- /dev/null
+++ b/qrcode/dist/css/adminlte.css
@@ -0,0 +1,31221 @@
+/*!
+ * AdminLTE v3.0.5
+ * Author: Colorlib
+ * Website: AdminLTE.io