Compare commits

..

61 Commits

Author SHA1 Message Date
c71b50a041 release version 1.1.1 2020-04-24 15:37:41 +02:00
af9d5662b1 dependencie error popup corrections
table reload after deleting corrections
2020-04-24 15:32:33 +02:00
a71c1a09a6 reconnection to the mqtt server if failed on startup 2020-04-24 14:34:58 +02:00
05cc2f83d6 Update .gitlab-ci.yml 2020-04-18 12:13:51 +00:00
f94fd7d037 add gitlab ci 2020-04-18 12:09:56 +00:00
Lukas Heiligenbrunner
59cb7c3c4f added jar build 2020-04-18 13:49:34 +02:00
Lukas Heiligenbrunner
2ac3cf629f added build argument 2020-04-18 13:46:16 +02:00
Lukas Heiligenbrunner
506c6f9b09 improved action 2020-04-18 13:45:03 +02:00
Lukas Heiligenbrunner
ba5048e119 added github action 2020-04-18 13:40:50 +02:00
Lukas Heiligenbrunner
26279130b7 logintodb nonstatic 2020-04-17 18:36:05 +02:00
Lukas-Heiligenbrunner
30b51f9032
Merge pull request #12 from IngProjDutzlerHeiligenbrunnerMeindl/dbschemacheck
Dbschemacheck
2020-04-17 18:32:33 +02:00
Lukas-Heiligenbrunner
51f6ca8958
Merge branch 'master' into dbschemacheck 2020-04-17 18:32:23 +02:00
Lukas-Heiligenbrunner
f8fd7d1b5e
Merge pull request #13 from IngProjDutzlerHeiligenbrunnerMeindl/dbReconnect
Db reconnect
2020-04-17 18:29:24 +02:00
EmilMeindl
23df933504 finished statement db reconnect 2020-04-17 18:28:10 +02:00
Lukas Heiligenbrunner
3a51b08de8 added some message outputs, edited libs in register html 2020-04-17 18:11:23 +02:00
Lukas Heiligenbrunner
f4fbce7977 improved autocreate of table structure 2020-04-17 18:00:47 +02:00
EmilMeindl
605a2ca33d finished initial db reconnect 2020-04-17 16:52:19 +02:00
Lukas Heiligenbrunner
a633ba42e9 added auto generation of sql structure on db 2020-04-17 16:20:44 +02:00
EmilMeindl
f0e654399a test reconnect logic 2020-04-17 16:10:18 +02:00
Lukas Heiligenbrunner
a98c3eae71 updated sql structure 2020-04-17 15:12:22 +02:00
lukas-heiligenbrunner
3fba0f9933 version 1.1.0
method name convention
2020-04-15 17:03:45 +02:00
Lukas-Heiligenbrunner
d680046768
Merge pull request #6 from IngProjDutzlerHeiligenbrunnerMeindl/configurationpage
Configurationpage
2020-04-15 16:59:23 +02:00
Lukas-Heiligenbrunner
f2219a33a3
Merge branch 'master' into configurationpage 2020-04-15 16:59:11 +02:00
lukas-heiligenbrunner
14eea02dcf correct error handling of no db and mqtt connection. 2020-04-15 16:53:58 +02:00
lukas-heiligenbrunner
cf9069e489 add configuration error popups 2020-04-15 15:49:04 +02:00
lukas-heiligenbrunner
1a481db4dd reedited sweetalert version changes 2020-04-14 16:55:09 +02:00
lukas-heiligenbrunner
54e2cd7856 updated bootstrap libs
added sandwich symbol
2020-04-14 15:24:53 +02:00
lukas-heiligenbrunner
c7999ed6ec updated adminlte libraries and made dashboard tiles moveable again 2020-04-14 13:24:34 +02:00
lukas-heiligenbrunner
f4a00620a3 code cleanup
deleted deadcode
2020-04-03 13:26:44 +02:00
lukas-heiligenbrunner
b3fcd26964 release version 1.0.1 2020-03-27 19:56:09 +01:00
lukas-heiligenbrunner
86660a8d64 removed sheduled taskpage for now
removed settings index entry
2020-03-27 19:55:42 +01:00
Lukas-Heiligenbrunner
dbc7505cc4
Merge pull request #5 from IngProjDutzlerHeiligenbrunnerMeindl/cleanup
Cleanup
2020-03-27 19:29:56 +01:00
lukas-heiligenbrunner
72b13cb335 readded main datatables lib 2020-03-27 19:27:07 +01:00
lukas-heiligenbrunner
c78e5614d7 removed demo dependencies in pages 2020-03-27 17:56:23 +01:00
lukas-heiligenbrunner
0498e61616 delete unused profile and demo files 2020-03-27 17:53:33 +01:00
lukas-heiligenbrunner
8b43afb2c9 deleted unused profile page
cleanup shedulepickup devices page and user page
2020-03-27 17:49:49 +01:00
lukas-heiligenbrunner
ab348417b4 removed libs at Admin page 2020-03-27 17:41:12 +01:00
lukas-heiligenbrunner
62a43cf695 delete unused libs 2020-03-27 17:36:32 +01:00
lukas-heiligenbrunner
b9058dcdba storage class
added config check in main page
2020-03-27 17:06:48 +01:00
lukas-heiligenbrunner
3818b6d1c7 getter setter
all parameters in storage class
2020-03-27 10:33:14 +01:00
lukas-heiligenbrunner
cded7c7d27 new class representing a storage 2020-03-27 10:06:24 +01:00
lukas-heiligenbrunner
ac3fce2913 new webserver executor to allow multiple instances 2020-03-20 13:36:43 +01:00
05b338ec85 add timezone to mysql init 2020-03-13 15:41:55 +01:00
5605a813d9 Merge branch 'javadoc'
# Conflicts:
#	src/java/com/wasteinformationserver/website/datarequests/NewDateRequest.java
2020-03-13 14:50:47 +01:00
Lukas-Heiligenbrunner
b4d7e2e691
Merge pull request #4 from IngProjDutzlerHeiligenbrunnerMeindl/sheduledtaskpage
added new page to shedule tasks
2020-03-13 13:38:17 +01:00
9f39b4f9c8 added javadoc 2020-03-13 11:04:09 +01:00
5fde74eb15 update gradle version to 1.3.70 2020-03-06 08:39:33 +01:00
4c018d567a fix this calls of dashboard.js class
and autoreload of tables
2020-02-28 16:53:43 +01:00
76f5c36ba1 removed unused initializer
converted Daterequest to kotlin
2020-02-28 16:35:55 +01:00
022ae044ab removed checked calls for JDBC and added connection check in JDBC class itself 2020-02-28 16:06:04 +01:00
aa023aeb95 compile also kotlin plugin into jar 2020-02-28 12:16:29 +01:00
8b1d2bd583 release version 1.0.0 2020-02-28 11:59:16 +01:00
e28cfd4a20 added new page to shedule tasks 2020-02-28 11:55:30 +01:00
c839c8506c sidebar values improvement
load header data on devicepage
2020-02-28 11:48:41 +01:00
root
8e4aad4691 removed useless gradle instance 2020-02-28 09:33:03 +01:00
Lukas-Heiligenbrunner
3a1cff0895
Merge pull request #2 from IngProjDutzlerHeiligenbrunnerMeindl/DutziTest
new Text icons
2020-02-28 09:27:39 +01:00
32633221f1 removed useless idea files 2020-02-28 09:24:33 +01:00
cb5db3dddd ids as Value and not String 2020-02-28 09:13:42 +01:00
gdutzler
2c82d5fb43 deleted useless files
reformatting
2020-02-28 08:53:57 +01:00
gdutzler
c5ff6cd2aa eine Zeile 2020-02-28 08:43:17 +01:00
gdutzler
aaa0600af4 Stand 7.2.2020 ICON 2020-02-07 16:48:05 +01:00
1773 changed files with 16098 additions and 443804 deletions

28
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,28 @@
# .github/workflows/gradle-build-pr.yml
name: Run Gradle on pushs
on:
push:
branches:
- '*'
pull_request:
branches:
- '*'
jobs:
gradle:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v1
- uses: actions/setup-java@v1
with:
java-version: 11
- uses: eskatos/gradle-command-action@v1
with:
gradle-version: rc
arguments: build
- uses: eskatos/gradle-command-action@v1
with:
gradle-version: rc
arguments: jar

35
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,35 @@
# This file is a template, and might need editing before it works on your project.
# This is the Gradle build system for JVM applications
# https://gradle.org/
# https://github.com/gradle/gradle
image: gradle:latest
# Disable the Gradle daemon for Continuous Integration servers as correctness
# is usually a priority over speed in CI environments. Using a fresh
# runtime for each build is more reliable since the runtime is completely
# isolated from any previous builds.
variables:
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
before_script:
- export GRADLE_USER_HOME=`pwd`/.gradle
build:
stage: build
script: gradle --build-cache assemble
cache:
key: "$CI_COMMIT_REF_NAME"
policy: push
paths:
- build
- .gradle
test:
stage: test
script: gradle check
cache:
key: "$CI_COMMIT_REF_NAME"
policy: pull
paths:
- build
- .gradle

View File

@ -1,94 +0,0 @@
//plugins {
// id 'org.jetbrains.kotlin.js' version '1.3.70-eap-184'
//}
//group 'org.example'
version '1.0-SNAPSHOT'
buildscript {
ext.kotlin_version = '1.3.61'
ext.web_dir = '../src/resources/wwwroot/js/'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
apply plugin: 'kotlin2js'
sourceSets {
main.java.srcDirs = ["src/js/"]
test.java.srcDirs = ["src/js/test"]
}
compileKotlin2Js {
kotlinOptions.outputFile = "${projectDir}/build/web/WasteInformationServer.js"
kotlinOptions.moduleKind = "plain"
kotlinOptions.sourceMap = true
}
compileTestKotlin2Js {
kotlinOptions.moduleKind = "plain"
kotlinOptions.sourceMap = true
}
repositories {
mavenCentral()
maven {
url "http://dl.bintray.com/kotlin/kotlin-eap-1.1"
}
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
testCompile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version"
}
clean.doFirst() {
delete("${web_dir}")
}
build.doLast() {
// Copy kotlin.js and kotlin-meta.js from jar into web directory
configurations.compile.each { File file ->
copy {
includeEmptyDirs = false
from zipTree(file.absolutePath)
into "${projectDir}/${web_dir}/lib"
include { fileTreeElement ->
def path = fileTreeElement.path
path.endsWith(".js") && (path.startsWith("META-INF/resources/") || !path.startsWith("META-INF/"))
}
}
}
// Unpack build contents
// TODO Remove this step when a CDN link is available.
copy {
File artifact = new File("build/libs/${project.name}-${project.version}.jar")
includeEmptyDirs = false
from zipTree(artifact)
into "${web_dir}"
include { fileTreeElement ->
def path = fileTreeElement.path
!(path.startsWith("META-INF/") || path.startsWith("${project.name}"))
}
}
// Copy scripts to web directory
copy {
includeEmptyDirs = false
from new File("build/classes/main")
into "${web_dir}/lib"
}
copy {
includeEmptyDirs = false
from new File("build/classes/test")
into "${web_dir}/lib"
}
}

View File

@ -1 +0,0 @@
rootProject.name = 'WebServer'

View File

@ -1,26 +0,0 @@
import org.w3c.fetch.RequestInit
import kotlin.browser.document
import kotlin.browser.window
import kotlin.js.Json
class Dashboard {
init {
window.fetch("/senddata/wastedata", RequestInit(method = "POST", body = "action=getStartHeaderData")).then { it -> it.text().then {
println("response text is: "+it)
val json = JSON.parse<Json>(it)
document.getElementById("total-connection-labels")?.innerHTML = json["collectionnumber"] as String
document.getElementById("planed-collection-label")?.innerHTML = json["futurecollections"] as String
document.getElementById("finished-collection-label")?.innerHTML = json["finshedcollections"] as String
document.getElementById("total-city-number-label")?.innerHTML = json["citynumber"] as String
} }
window.fetch("/senddata/wastedata", RequestInit(method = "POST", body = "action=getversionandbuildtime")).then { it -> it.text().then {
val json = JSON.parse<Json>(it)
document.getElementById("version-footer-label")?.innerHTML = "<b>Version</b> " + json["version"] + " <b>Build</b> " + json["buildtime"] as String
} }
}
}

View File

@ -1,39 +0,0 @@
import org.w3c.dom.HTMLInputElement
import org.w3c.fetch.RequestInit
import kotlin.browser.document
import kotlin.browser.window
import kotlin.js.Json
class Index {
init {
document.getElementById("loginbtn")?.addEventListener("click", {
it.preventDefault()
println("clicked!!!")
val username = document.getElementById("userfield") as HTMLInputElement
val passfield = document.getElementById("passfield") as HTMLInputElement
println(username.value)
console.log("fetch 'data.json' with 'post'")
window.fetch("/senddata/loginget", RequestInit(method = "POST", body = "username=${username.value}&password=${passfield.value}")).then { response ->
response.text().then { text ->
val json = JSON.parse<Json>(text)
if (json["status"] == "nodbconn") {
js("""Swal.fire({
type: "error",
title: 'No connection to Database',
html: 'Setup DB here --> <a href="index.html">click<a/>.'
})""")
}
if (json["accept"] == true) {
println("successfully logged in!")
document.cookie = "username=$username"
window.location.replace("dashboard.html")
}
}
}
})
}
// todo register pwa correctly
}

View File

@ -1,18 +0,0 @@
import kotlin.browser.window
fun main() {
val callurl = window.document.URL
window.onload = {
if (callurl.endsWith("/") || callurl.contains("index.html")) {
println("loaded sucessfully")
Index()
}
else if (callurl.contains("dashboard.html")) {
Dashboard()
}
else {
println("js called from undefined html file")
}
}
}

View File

@ -1,15 +0,0 @@
import org.w3c.xhr.XMLHttpRequest
class Requester {
fun request(){
val test = XMLHttpRequest()
test.open("GET","https://api.ipify.org?format=json")
test.onload = {
println(test.responseText)
}
test.send()
}
}

View File

@ -2,11 +2,11 @@ import java.text.SimpleDateFormat
plugins { plugins {
id 'java' id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.3.61' id 'org.jetbrains.kotlin.jvm' version '1.3.70'
} }
group 'com.wasteinformationserver' group 'com.wasteinformationserver'
version '0.3.1-Beta' version '1.1.1'
sourceCompatibility = 1.8 sourceCompatibility = 1.8
@ -29,7 +29,7 @@ sourceSets {
dependencies { dependencies {
compile group: 'org.eclipse.paho', name: 'org.eclipse.paho.client.mqttv3', version: '1.2.2' compile group: 'org.eclipse.paho', name: 'org.eclipse.paho.client.mqttv3', version: '1.2.2'
compile group: 'mysql',name:'mysql-connector-java',version: '8.0.18' compile group: 'mysql',name:'mysql-connector-java',version: '8.0.18'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
} }
task run (type: JavaExec){ task run (type: JavaExec){
@ -40,7 +40,7 @@ task run (type: JavaExec){
task createProperties(dependsOn: processResources) { task createProperties(dependsOn: processResources) {
doLast { doLast {
new File("$projectDir/src/resources/version.properties").withWriter { w -> new File("$projectDir/src/resources/version.prop").withWriter { w ->
Properties p = new Properties() Properties p = new Properties()
p['version'] = project.version.toString() p['version'] = project.version.toString()
p['buildtime'] = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date()) p['buildtime'] = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date())
@ -49,8 +49,6 @@ task createProperties(dependsOn: processResources) {
} }
} }
tasks.processResources.dependsOn("WebServer:build")
task myJavadocs(type: Javadoc) { task myJavadocs(type: Javadoc) {
title = "JAVADOC WasteInformationServer" title = "JAVADOC WasteInformationServer"
source = sourceSets.main.allJava source = sourceSets.main.allJava

156
db.sql
View File

@ -1,156 +0,0 @@
-- phpMyAdmin SQL Dump
-- version 4.9.0.1
-- https://www.phpmyadmin.net/
--
-- Host: localhost
-- Erstellungszeit: 06. Dez 2019 um 16:11
-- Server-Version: 10.3.11-MariaDB
-- PHP-Version: 5.6.40
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Datenbank: `wasteinformation`
--
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `cities`
--
CREATE TABLE `cities` (
`id` int(11) NOT NULL,
`userid` int(11) NOT NULL,
`name` varchar(256) NOT NULL,
`wastetype` varchar(64) NOT NULL,
`zone` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Daten für Tabelle `cities`
--
INSERT INTO `cities` (`id`, `userid`, `name`, `wastetype`, `zone`) VALUES
(2, 0, 'Steyr', 'Bio', 2),
(3, 0, 'Steyr', 'Bio', 3),
(4, 0, 'Steyr', 'Bio', 4),
(128, 0, 'Steyr', 'Biowaste', 1),
(130, 0, 'abc', 'Biowaste', 1);
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `pickupdates`
--
CREATE TABLE `pickupdates` (
`id` int(11) NOT NULL,
`citywastezoneid` int(11) NOT NULL,
`pickupdate` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Daten für Tabelle `pickupdates`
--
INSERT INTO `pickupdates` (`id`, `citywastezoneid`, `pickupdate`) VALUES
(6, 4, '2019-12-06'),
(7, 3, '2019-12-06'),
(8, 2, '2019-12-06'),
(9, 130, '2019-12-26');
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `user`
--
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`username` varchar(150) NOT NULL,
`firstName` varchar(32) NOT NULL,
`secondName` varchar(32) NOT NULL,
`password` varchar(32) NOT NULL,
`permission` int(11) NOT NULL DEFAULT 0,
`email` varchar(64) NOT NULL,
`logindate` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Daten für Tabelle `user`
--
INSERT INTO `user` (`id`, `username`, `firstName`, `secondName`, `password`, `permission`, `email`, `logindate`) VALUES
(2, 'lheilige', 'lukas', 'heiligenbrunner', 'c6e2ddf577e0dfdc4366f788f1b27102', 0, 'lukas.heiligenbrunner@gmail.com', '2019-09-20 12:19:31'),
(11, 'meindl', 'emil', 'meindl', '81dc9bdb52d04dc20036dbd8313ed055', 0, 'mailmeindl', '2019-09-27 10:23:46'),
(15, 'horni', 'kk', 'kk', 'c4ca4238a0b923820dcc509a6f75849b', 1, 'kk', '2019-09-27 13:19:09');
--
-- Indizes der exportierten Tabellen
--
--
-- Indizes für die Tabelle `cities`
--
ALTER TABLE `cities`
ADD PRIMARY KEY (`id`);
--
-- Indizes für die Tabelle `pickupdates`
--
ALTER TABLE `pickupdates`
ADD PRIMARY KEY (`id`),
ADD KEY `citywastezoneid` (`citywastezoneid`);
--
-- Indizes für die Tabelle `user`
--
ALTER TABLE `user`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT für exportierte Tabellen
--
--
-- AUTO_INCREMENT für Tabelle `cities`
--
ALTER TABLE `cities`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=131;
--
-- AUTO_INCREMENT für Tabelle `pickupdates`
--
ALTER TABLE `pickupdates`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;
--
-- AUTO_INCREMENT für Tabelle `user`
--
ALTER TABLE `user`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16;
--
-- Constraints der exportierten Tabellen
--
--
-- Constraints der Tabelle `pickupdates`
--
ALTER TABLE `pickupdates`
ADD CONSTRAINT `pickupdates_ibfk_1` FOREIGN KEY (`citywastezoneid`) REFERENCES `cities` (`id`);
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

View File

@ -1,3 +1,2 @@
rootProject.name = 'WasteInformationServer' rootProject.name = 'WasteInformationServer'
include 'WebServer'

View File

@ -1,105 +0,0 @@
/**
* dead code...
*/
package com.wasteinformationserver;
import com.wasteinformationserver.basicutils.Log;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Scanner;
public class Dateget {
private int index = 0;
ArrayList<String> list = new ArrayList<>();
ArrayList<String> listnew = new ArrayList<>();
public String nextDate;
public void getdata() {
GregorianCalendar now = new GregorianCalendar();
DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
String datum = df.format(now.getTime());
URL url = null;
try {
url = new URL("https://www.steyr.at/system/web/kalender.aspx?vdatum=" + datum + "&bdatum=19.10.2019&typ=&typid=0&typids=225781950&detailonr=0&menuonr=225781812");
Scanner scanner = new Scanner(new InputStreamReader(url.openStream()));
int n = 0;
while (scanner.hasNext()) {
String temp = scanner.next();
addList(temp);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Filter();
}
private void addList(String temp) {
list.add(index, temp);
}
public void printList() {
for (int n = 0; n < list.size(); n++) {
Log.Log.debug(list.get(n));
}
}
public void printListnew() {
for (int n = 0; n < listnew.size(); n++) {
Log.Log.debug(listnew.get(n));
}
}
private void Filter() {
String temp = "href=\"/system/web/kalender.aspx?detailonr=225781954-6&amp;menuonr=225781812\">Hausabfall";
int counter = 0;
for (int n = 0; n < list.size(); n++) {
if (list.get(n).equals(temp)) {
counter++;
if (counter == 4) {
int zaehler = 0;
for (int v = n; v < list.size(); v++) {
listnew.add(zaehler, list.get(v));
zaehler++;
}
/* String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556*/
splitter();
}
}
}
}
private void splitter() {
String temp = "</ul><h2>";
for (int n = 0; n < listnew.size(); n++) {
if (listnew.get(n).equals(temp)) {
}
}
}
}

View File

@ -1,27 +1,30 @@
@file:JvmName("Main") @file:JvmName("Main")
package com.wasteinformationserver package com.wasteinformationserver
import com.wasteinformationserver.basicutils.Info import com.wasteinformationserver.basicutils.Info
import com.wasteinformationserver.basicutils.Log import com.wasteinformationserver.basicutils.Log
import com.wasteinformationserver.basicutils.Storage
import com.wasteinformationserver.db.JDBC import com.wasteinformationserver.db.JDBC
import com.wasteinformationserver.mqtt.MqttService import com.wasteinformationserver.mqtt.MqttService
import com.wasteinformationserver.website.Webserver import com.wasteinformationserver.website.Webserver
import java.io.IOException
/**
* application entry point
*
* @author Lukas Heiligenbrunner
*/
fun main() { fun main() {
Log.setLevel(Log.DEBUG) Log.setLevel(Log.DEBUG)
Info.init() Info.init()
Storage.getInstance().init()
Log.info("startup of WasteInformationServer") Log.info("startup of WasteInformationServer")
Runtime.getRuntime().addShutdownHook(Thread(Runnable { Runtime.getRuntime().addShutdownHook(Thread(Runnable {
try { // shutdown routine
Thread.sleep(200) Log.warning("Shutting down ...")
Log.warning("Shutting down ...") JDBC.getInstance().disconnect();
//shutdown routine
} catch (e: InterruptedException) {
e.printStackTrace()
}
})) }))
Log.info("Server version: " + Info.getVersion()) Log.info("Server version: " + Info.getVersion())
@ -29,12 +32,8 @@ fun main() {
//initial connect to db //initial connect to db
Log.message("initial login to db") Log.message("initial login to db")
try { val stor = Storage.getInstance();
JDBC.init("ingproject", "Kb9Dxklumt76ieq6", "ingproject", "db.power4future.at", 3306) JDBC.init(stor.dbUser, stor.dbPassword, stor.dbName, stor.dbhost, stor.dbPort)
//JDBC.init("users", "kOpaIJUjkgb9ur6S", "wasteinformation", "192.168.65.15", 3306);
} catch (e: IOException) { //e.printStackTrace();
Log.error("no connection to db")
}
//startup web server //startup web server
@ -45,6 +44,7 @@ fun main() {
//startup mqtt service //startup mqtt service
Log.message("starting mqtt service") Log.message("starting mqtt service")
val m = MqttService("mqtt.heili.eu", "1883") val m = MqttService.getInstance()
m.init(Storage.getInstance().mqttServer, Storage.getInstance().mqttPort.toString())
m.startupService() m.startupService()
} }

View File

@ -51,7 +51,7 @@ public class Info {
starttime = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date()); starttime = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date());
Properties prop = new Properties(); Properties prop = new Properties();
try { try {
URL url = Info.class.getResource("/version.properties"); URL url = Info.class.getResource("/version.prop");
prop.load(url.openStream()); prop.load(url.openStream());
version = (String) prop.get("version"); version = (String) prop.get("version");
@ -75,10 +75,10 @@ public class Info {
long allocatedMemory = runtime.totalMemory(); long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory(); long freeMemory = runtime.freeMemory();
sb.append("free memory: " + format.format(freeMemory / 1024) + "\n"); sb.append("free memory: ").append(format.format(freeMemory / 1024)).append("\n");
sb.append("allocated memory: " + format.format(allocatedMemory / 1024) + "\n"); sb.append("allocated memory: ").append(format.format(allocatedMemory / 1024)).append("\n");
sb.append("max memory: " + format.format(maxMemory / 1024) + "\n"); sb.append("max memory: ").append(format.format(maxMemory / 1024)).append("\n");
sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024) + "\n"); sb.append("total free memory: ").append(format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024)).append("\n");
System.out.println(sb.toString()); System.out.println(sb.toString());
} }

View File

@ -5,22 +5,22 @@ import java.util.*
class Log { class Log {
companion object Log{ companion object Log{
val CRITICAL_ERROR = 6 const val CRITICAL_ERROR = 6
val ERROR = 5 const val ERROR = 5
val WARNING = 4 const val WARNING = 4
val INFO = 3 const val INFO = 3
val MESSAGE = 2 const val MESSAGE = 2
val DEBUG = 1 const val DEBUG = 1
private val ANSI_RESET = "\u001B[0m" private const val ANSI_RESET = "\u001B[0m"
private val ANSI_BLACK = "\u001B[30m" private const val ANSI_BLACK = "\u001B[30m"
private val ANSI_RED = "\u001B[31m" private const val ANSI_RED = "\u001B[31m"
private val ANSI_GREEN = "\u001B[32m" private const val ANSI_GREEN = "\u001B[32m"
private val ANSI_YELLOW = "\u001B[33m" private const val ANSI_YELLOW = "\u001B[33m"
private val ANSI_BLUE = "\u001B[34m" private const val ANSI_BLUE = "\u001B[34m"
private val ANSI_PURPLE = "\u001B[35m" private const val ANSI_PURPLE = "\u001B[35m"
private val ANSI_CYAN = "\u001B[36m" private const val ANSI_CYAN = "\u001B[36m"
private val ANSI_WHITE = "\u001B[37m" private const val ANSI_WHITE = "\u001B[37m"
private var Loglevel = 0 private var Loglevel = 0
@ -126,14 +126,14 @@ class Log {
fun setLevel(level: Int) { fun setLevel(level: Int) {
Loglevel = level Loglevel = level
} }
private val colors = ArrayList(Arrays.asList("", "DEBUG", "MESSAGE", "INFO", "WARNING", "ERROR", "CRITICAL_ERROR"))
private val colors = ArrayList(listOf("", "DEBUG", "MESSAGE", "INFO", "WARNING", "ERROR", "CRITICAL_ERROR"))
private fun calcDate(milliSecs: Long): String? {
private fun calcDate(millisecs: Long): String? { val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val date_format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") val resultDate = Date(milliSecs)
val resultdate = Date(millisecs) return dateFormat.format(resultDate)
return date_format.format(resultdate)
} }
} }
} }

View File

@ -0,0 +1,163 @@
package com.wasteinformationserver.basicutils
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
import java.util.*
/**
* Storage of user information
* * database infos
* * mqtt infos
*
* @author Lukas Heiligenbrunner
*/
class Storage {
companion object {
private val obj = Storage()
fun getInstance(): Storage {
return obj;
}
}
var mqttServer: String = ""
get() = field
set(value) {
field = value
}
var mqttPort: Int = -1
get() = field
set(value) {
field = value
}
var dbName: String = ""
get() = field
set(value) {
field = value
}
var dbhost: String = ""
get() = field
set(value) {
field = value
}
var dbUser: String = ""
get() = field
set(value) {
field = value
}
var dbPassword: String = ""
get() = field
set(value) {
field = value
}
var dbPort: Int = -1
get() = field
set(value) {
field = value
}
private val prop = Properties()
/**
* init config file
*/
fun init() {
try {
// try to load existing config file
val inp = FileInputStream("settings.prop")
prop.load(inp)
mqttServer = prop["mqttserver"] as String
mqttPort = (prop["mqttport"] as String).toInt()
dbhost = prop["dbhost"] as String
dbName = prop["dbname"] as String
dbUser = prop["dbuser"] as String
dbPassword = prop["dbpass"] as String
dbPort = (prop["dbport"] as String).toInt()
} catch (ee: FileNotFoundException) {
// file not generated yet
store()
Log.info("new Settings config file generated")
} catch (e: IOException) {
e.printStackTrace()
}
}
/**
* store data to storage file
*/
fun store() {
prop["mqttserver"] = mqttServer
prop["mqttport"] = mqttPort.toString()
prop["dbhost"] = dbhost
prop["dbname"] = dbName
prop["dbuser"] = dbUser
prop["dbpass"] = dbPassword
prop["dbport"] = dbPort.toString()
prop.store(FileOutputStream("settings.prop"), "main config")
}
/**
* check if all needed properties are set up correctly
* todo real check if connections can be established
*/
fun isEveryThingDefined(): Boolean {
return (isMqttServerDefined() &&
isMqttPortDefined() &&
isDBNameDefined() &&
isDBUsernameDefined() &&
isDBPasswdDefined() &&
isDBPortDefined())
}
/**
* is the mqttservername defined?
*/
fun isMqttServerDefined(): Boolean {
return (mqttServer != "")
}
/**
* is the mqttserver port defined?
*/
fun isMqttPortDefined(): Boolean {
return (mqttPort != -1)
}
/**
* is the dbname defined?
*/
fun isDBNameDefined(): Boolean {
return (dbName != "")
}
/**
* is the dbport defined?
*/
fun isDBPortDefined(): Boolean {
return (dbPort != -1)
}
/**
* is the dbpassword defined?
*/
fun isDBPasswdDefined(): Boolean {
return (dbPassword != "")
}
/**
* is the dbusername defined?
*/
fun isDBUsernameDefined(): Boolean {
return (dbUser != "")
}
}

View File

@ -1,25 +0,0 @@
package com.wasteinformationserver.db;
import java.sql.Connection;
import java.sql.SQLException;
abstract class Database {
protected String user;
protected String password;
protected String host;
protected int port;
protected String dbName;
public Database(String user, String password, String host, int port, String dbName) {
this.user = user;
this.password = password;
this.host = host;
this.port = port;
this.dbName = dbName;
}
public abstract Connection getConnection() throws SQLException;
}

View File

@ -1,14 +1,18 @@
package com.wasteinformationserver.db; package com.wasteinformationserver.db;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.basicutils.Storage;
import com.wasteinformationserver.mqtt.MqttService;
import java.io.IOException; import java.io.IOException;
import java.sql.Connection; import java.sql.*;
import java.sql.PreparedStatement; import java.util.Scanner;
import java.sql.ResultSet;
import java.sql.SQLException;
/** /**
* basic connection class to a Database * basic connection class to a Database
* *
* @author Lukas Heiligenbrunner * @author Lukas Heiligenbrunner
* @author Emil Meindl
*/ */
public class JDBC { public class JDBC {
private static Connection conn; private static Connection conn;
@ -22,6 +26,21 @@ public class JDBC {
private static String ipc; private static String ipc;
private static int portc; private static int portc;
private JDBC(String username, String password, String dbname, String ip, int port) {
logintodb(username, password, dbname, ip, port);
}
/**
* instance of JDBC driver
*/
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
/** /**
* initialize database values * initialize database values
* suggested on startup * suggested on startup
@ -42,10 +61,6 @@ public class JDBC {
JDBC = new JDBC(username, password, dbname, ip, port); JDBC = new JDBC(username, password, dbname, ip, port);
} }
private JDBC(String username, String password, String dbname, String ip, int port) throws IOException {
logintodb(username, password, dbname, ip, port);
}
/** /**
* get instance of db object * get instance of db object
* logindata has to be set before! * logindata has to be set before!
@ -53,31 +68,72 @@ public class JDBC {
* @return JDBC object of this * @return JDBC object of this
* @throws IOException * @throws IOException
*/ */
public static JDBC getInstance() throws IOException { public static JDBC getInstance() {
if (loggedin) { if (!loggedin) {
return JDBC; JDBC = new JDBC(usernamec, passwordc, dbnamec, ipc, portc);
} else {
logintodb(usernamec, passwordc, dbnamec, ipc, portc);
return JDBC;
} }
return JDBC;
} }
private static void logintodb(String username, String password, String dbname, String ip, int port) throws IOException { /**
Database db = new MySQLConnector( * initial login to db -- should be called only one time or for reconnect
username, *
password, * @param username username
ip, * @param password password
port, * @param dbname Database name
dbname); * @param ip Host or ip address
* @param port Server port
* @throws IOException thrown if no connection to db is possible.
*/
private boolean logintodb(String username, String password, String dbname, String ip, int port) {
try { try {
conn = db.getConnection(); DriverManager.setLoginTimeout(1);
conn = DriverManager.getConnection(
"jdbc:mysql://" + ip + ":" + port + "/" + dbname + "?useSSL=false&serverTimezone=CET",
username,
password);
checkDBStructure();
loggedin = true; loggedin = true;
Log.Log.message("Connected to database");
} catch (SQLException e) { } catch (SQLException e) {
throw new IOException("No connection to database"); // reconnect every 10 sec
Log.Log.warning("Database-Connection not possible");
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException interruptedException) {
interruptedException.printStackTrace();
}
Log.Log.debug("Reading config");
Storage st = Storage.Companion.getInstance();
st.init();
usernamec = st.getDbName();
passwordc = st.getDbPassword();
dbnamec = st.getDbName();
ipc = st.getDbhost();
portc = st.getDbPort();
Log.Log.info("Retry connection");
loggedin = logintodb(usernamec, passwordc, dbnamec, ipc, portc);
if (loggedin) {
// startup mqtt service if successfully connected
MqttService srvc = MqttService.Companion.getInstance();
srvc.init(st.getMqttServer(), String.valueOf(st.getMqttPort()));
srvc.startupService();
}
}
}).start();
} }
return loggedin;
}
public void disconnect() {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} }
/** /**
@ -88,12 +144,19 @@ public class JDBC {
*/ */
public ResultSet executeQuery(String sql) { public ResultSet executeQuery(String sql) {
try { try {
conn.isValid(5);
PreparedStatement stmt = conn.prepareStatement(sql); PreparedStatement stmt = conn.prepareStatement(sql);
return stmt.executeQuery(); return stmt.executeQuery();
} catch (SQLNonTransientConnectionException ee) {
if (logintodb(usernamec, passwordc, dbnamec, ipc, portc)) {
return this.executeQuery(sql);
} else {
return null;
}
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); return null;
} }
return null;
} }
/** /**
@ -104,8 +167,63 @@ public class JDBC {
* @throws SQLException * @throws SQLException
*/ */
public int executeUpdate(String sql) throws SQLException { public int executeUpdate(String sql) throws SQLException {
PreparedStatement stmt = conn.prepareStatement(sql); try {
conn.isValid(2);
PreparedStatement stmt = conn.prepareStatement(sql);
return stmt.executeUpdate();
} catch (SQLNonTransientConnectionException ee) {
if (logintodb(usernamec, passwordc, dbnamec, ipc, portc)) {
return this.executeUpdate(sql);
} else {
throw new SQLNonTransientConnectionException();
}
}
}
return stmt.executeUpdate(); /**
* check if connection is still established
*
* @return connection state
*/
public static boolean isConnected() {
return loggedin;
}
/**
* validate the correctness of the current sql db structure
*/
public void checkDBStructure() {
try {
ResultSet seti = executeQuery("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '" + dbnamec + "'");
seti.last();
Log.Log.debug("found " + seti.getInt(1) + " tables in db");
if (seti.getInt(1) != 5) {
// structure not valid
Log.Log.info("recreating Database structure!");
Scanner s = new Scanner(getClass().getResourceAsStream("/db.sql"));
s.useDelimiter("(;(\r)?\n)|(--\n)");
Statement st = null;
try {
st = conn.createStatement();
while (s.hasNext()) {
String line = s.next();
if (line.startsWith("/*!") && line.endsWith("*/")) {
int i = line.indexOf(' ');
line = line.substring(i + 1, line.length() - " */".length());
}
if (line.trim().length() > 0) {
executeUpdate(line);
}
}
} finally {
if (st != null) st.close();
}
} else {
Log.Log.message("found valid database structure!");
}
} catch (SQLException e) {
Log.Log.error("a unhandled SQLexception occured at db structure creation.");
}
} }
} }

View File

@ -1,29 +0,0 @@
package com.wasteinformationserver.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
class MySQLConnector extends Database {
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public MySQLConnector(String user, String password, String host, int port, String dbName) {
super(user, password, host, port, dbName);
}
public Connection getConnection() throws SQLException {
DriverManager.setLoginTimeout(1);
return DriverManager.getConnection(
"jdbc:mysql://" + host + ":" + port + "/" + dbName + "?useSSL=false",
user,
password);
}
}

View File

@ -1,12 +1,13 @@
package com.wasteinformationserver.mqtt package com.wasteinformationserver.mqtt
import com.wasteinformationserver.basicutils.Log
import com.wasteinformationserver.basicutils.Log.Log.debug import com.wasteinformationserver.basicutils.Log.Log.debug
import com.wasteinformationserver.basicutils.Log.Log.error import com.wasteinformationserver.basicutils.Log.Log.error
import com.wasteinformationserver.basicutils.Log.Log.info import com.wasteinformationserver.basicutils.Log.Log.info
import com.wasteinformationserver.basicutils.Log.Log.message import com.wasteinformationserver.basicutils.Log.Log.message
import com.wasteinformationserver.basicutils.Log.Log.warning
import com.wasteinformationserver.db.JDBC import com.wasteinformationserver.db.JDBC
import org.eclipse.paho.client.mqttv3.* import org.eclipse.paho.client.mqttv3.*
import java.io.IOException
import java.sql.SQLException import java.sql.SQLException
import java.text.ParseException import java.text.ParseException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
@ -19,97 +20,118 @@ import java.util.*
* @author Lukas Heiligenbrunner * @author Lukas Heiligenbrunner
* @author Gregor Dutzler * @author Gregor Dutzler
*/ */
class MqttService(serverurl: String, port: String) { class MqttService {
private var client: MqttClient? = null private var serveruri: String = "";
private val serveruri: String private lateinit var client: MqttClient;
private var db: JDBC? = null private var db: JDBC = JDBC.getInstance()
/** companion object {
* init mqtt service private val obj = MqttService()
* JDBC has to be inited before fun getInstance(): MqttService {
* return obj;
* @param serverurl mqtt server ip or hostname }
* @param port mqtt server port }
*/
init { fun init(serverurl: String, port: String){
serveruri = "tcp://$serverurl:$port" serveruri = "tcp://$serverurl:$port"
connect()
} }
/** /**
* startup of the mqtt service * startup of the mqtt service
*/ */
fun startupService() { fun startupService() {
try { if(JDBC.isConnected()) {
client = MqttClient(serveruri, "JavaSample42") try {
val connOpts = MqttConnectOptions() client = MqttClient(serveruri, "WasteInformationServerID")
connOpts.isCleanSession = true val connOpts = MqttConnectOptions()
client!!.connect(connOpts) connOpts.isCleanSession = true
client!!.setCallback(object : MqttCallback { client.connect(connOpts)
override fun connectionLost(throwable: Throwable) { client.setCallback(object : MqttCallback {
error("connection lost") override fun connectionLost(throwable: Throwable) {
connect() error("connection lost")
} Thread.sleep(500)
// restart service
startupService()
}
override fun messageArrived(s: String, mqttMessage: MqttMessage) { override fun messageArrived(s: String, mqttMessage: MqttMessage) {
val deviceid = String(mqttMessage.payload) val deviceid = String(mqttMessage.payload)
message("received Request from PCB") message("received Request from PCB")
val res = db!!.executeQuery("SELECT * from devices WHERE DeviceID=$deviceid") val res = db.executeQuery("SELECT * from devices WHERE DeviceID=$deviceid")
try { try {
res.last() res.last()
if (res.row != 0) { //existing device if (res.row != 0) {
res.first() // existing device
val devicecities = db!!.executeQuery("SELECT * from device_city WHERE DeviceID='$deviceid'") res.first()
devicecities.last() val devicecities = db.executeQuery("SELECT * from device_city WHERE DeviceID='$deviceid'")
if (devicecities.row == 0) { //not configured devicecities.last()
tramsmitMessage("$deviceid,-1") if (devicecities.row == 0) {
} else { // not configured
devicecities.first() tramsmitMessage("$deviceid,-1")
devicecities.previous() }
else {
devicecities.first()
devicecities.previous()
while (devicecities.next()) { while (devicecities.next()) {
val cityid = devicecities.getInt("CityID") val cityid = devicecities.getInt("CityID")
checkDatabase(cityid, deviceid.toInt()) checkDatabase(cityid, deviceid.toInt())
}
} }
} }
} else { //new device else {
db!!.executeUpdate("INSERT INTO devices (DeviceID) VALUES ($deviceid)") // new device
info("new device registered to server") db.executeUpdate("INSERT INTO devices (DeviceID) VALUES ($deviceid)")
tramsmitMessage("$deviceid,-1") info("new device registered to server")
tramsmitMessage("$deviceid,-1")
}
} catch (e: SQLException) {
e.printStackTrace()
} }
} catch (e: SQLException) {
e.printStackTrace()
} }
}
override fun deliveryComplete(iMqttDeliveryToken: IMqttDeliveryToken) {} override fun deliveryComplete(iMqttDeliveryToken: IMqttDeliveryToken) {}
}) })
client!!.subscribe("TopicIn") client.subscribe("TopicIn")
} catch (e: MqttException) { } catch (e: MqttException) {
error("Connection to the Broker failed") error("Connection to the Broker failed")
}
}else{
Log.error("could't start mqtt service because of missing db connection!")
} }
} }
/**
* Check if device is configured and zone infos are stored in db
*
* @param citywastezoneid zone/city id
* @param deviceid device id
*/
private fun checkDatabase(citywastezoneid: Int, deviceid: Int) { private fun checkDatabase(citywastezoneid: Int, deviceid: Int) {
var wastetype = -1 var wastetype = -1
val set2 = db!!.executeQuery("SELECT * FROM cities WHERE `id`='$citywastezoneid'") val set2 = db.executeQuery("SELECT * FROM cities WHERE `id`='$citywastezoneid'")
try { try {
set2.last() set2.last()
if (set2.row != 1) { //error if (set2.row != 1) {
} else { //error
warning("multiple Rows with same city id found - DB Error")
}
else {
val typ = set2.getString("wastetype") val typ = set2.getString("wastetype")
wastetype = getIntTyp(typ) wastetype = getIntTyp(typ)
} }
} catch (e: SQLException) { } catch (e: SQLException) {
e.printStackTrace() e.printStackTrace()
} }
val result = db!!.executeQuery("SELECT pickupdates.pickupdate FROM pickupdates WHERE pickupdates.citywastezoneid=$citywastezoneid") val result = db.executeQuery("SELECT pickupdates.pickupdate FROM pickupdates WHERE pickupdates.citywastezoneid=$citywastezoneid")
try { try {
result.last() result.last()
if (result.row == 0) { //if not found in db --> send zero if (result.row == 0) {
//if not found in db --> send zero
debug("not found in db") debug("not found in db")
tramsmitMessage("$deviceid,$wastetype,0") tramsmitMessage("$deviceid,$wastetype,0")
} else { }
else {
debug(result.getString("pickupdate")) debug(result.getString("pickupdate"))
result.first() result.first()
do { do {
@ -124,7 +146,8 @@ class MqttService(serverurl: String, port: String) {
return return
} }
} while (result.next()) } while (result.next())
tramsmitMessage("$deviceid,$wastetype,0") //transmit zero if not returned before tramsmitMessage("$deviceid,$wastetype,0")
//transmit zero if not returned before
} }
} catch (e: SQLException) { } catch (e: SQLException) {
e.printStackTrace() e.printStackTrace()
@ -133,46 +156,30 @@ class MqttService(serverurl: String, port: String) {
} }
} }
/**
* send a mqtt message to predefined topic
*/
private fun tramsmitMessage(temp: String) { private fun tramsmitMessage(temp: String) {
debug("sending message >>>$temp") message("reply back to PCB: $temp")
val message = MqttMessage(temp.toByteArray()) val message = MqttMessage(temp.toByteArray())
message.qos = 2 message.qos = 2
try { try {
client!!.publish("TopicOut", message) client.publish("TopicOut", message)
} catch (e: MqttException) { } catch (e: MqttException) {
e.printStackTrace() e.printStackTrace()
} }
} }
private fun getTyp(number: Int): String? { /**
if (number == 1) { * parse Type name to representing integer value
return "Plastic" */
} else if (number == 2) {
return "Metal"
} else if (number == 3) {
return "Residual waste"
} else if (number == 4) {
return "Biowaste"
}
return null
}
private fun getIntTyp(temp: String): Int { private fun getIntTyp(temp: String): Int {
var number = 0 return when (temp) {
when (temp) { "Plastic" -> 1
"Plastic" -> number = 1 "Metal" -> 2
"Metal" -> number = 2 "Residual waste" -> 3
"Residual waste" -> number = 3 "Biowaste" -> 4
"Biowaste" -> number = 4 else -> 0
}
return number
}
private fun connect() {
try {
db = JDBC.getInstance()
} catch (e: IOException) {
error("no connetion to db")
} }
} }
} }

View File

@ -17,7 +17,7 @@ class HttpTools {
* @param value input string * @param value input string
* @return md5 hash * @return md5 hash
*/ */
fun StringToMD5(value: String): String { fun stringToMD5(value: String): String {
return try { return try {
val md = MessageDigest.getInstance("MD5") val md = MessageDigest.getInstance("MD5")
val messageDigest = md.digest(value.toByteArray()) val messageDigest = md.digest(value.toByteArray())

View File

@ -4,9 +4,15 @@ import com.sun.net.httpserver.HttpExchange
import com.sun.net.httpserver.HttpHandler import com.sun.net.httpserver.HttpHandler
import com.wasteinformationserver.basicutils.Log.Log.debug import com.wasteinformationserver.basicutils.Log.Log.debug
import com.wasteinformationserver.basicutils.Log.Log.warning import com.wasteinformationserver.basicutils.Log.Log.warning
import com.wasteinformationserver.basicutils.Storage
import com.wasteinformationserver.website.datarequests.login.LoginState import com.wasteinformationserver.website.datarequests.login.LoginState
import java.io.IOException import java.io.IOException
/**
* Http handler to deliver all the main pages (index.html ...)
*
* @author Lukas Heiligenbrunner
*/
class MainPage : HttpHandler { class MainPage : HttpHandler {
@Throws(IOException::class) @Throws(IOException::class)
override fun handle(t: HttpExchange) { override fun handle(t: HttpExchange) {
@ -14,15 +20,20 @@ class MainPage : HttpHandler {
if (path == "/") { if (path == "/") {
path += "index.html" path += "index.html"
} }
debug("looking for: $path") debug("looking for: $path")
if (path.contains(".html")) { if (path.contains(".html")) {
if (LoginState.getObject().isLoggedIn || path == "/register.html" || path == "/index.html") { //pass only register page // if not logged in allow only register and index page!
if (LoginState.getObject().isLoggedIn || path == "/register.html" || path == "/index.html") {
sendPage(path, t) sendPage(path, t)
} else { }
else {
warning("user not logged in --> redirecting to login page") warning("user not logged in --> redirecting to login page")
sendPage("/index.html", t) sendPage("/index.html", t)
} }
} else { //only detect login state on html pages }
else {
//only detect login state on html pages
sendPage(path, t) sendPage(path, t)
} }
} }
@ -33,9 +44,11 @@ class MainPage : HttpHandler {
if (fs == null && path.contains(".html")) { if (fs == null && path.contains(".html")) {
warning("wrong page sending 404") warning("wrong page sending 404")
sendPage("/404Error.html", t) sendPage("/404Error.html", t)
} else if (fs == null) { }
else if (fs == null) {
warning("requested resource doesnt exist --> $path") warning("requested resource doesnt exist --> $path")
} else { // Object exists and is a file: accept with response code 200. }
else { // Object exists and is a file: accept with response code 200.
var mime = "text/html" var mime = "text/html"
val s = path.substring(path.length - 3) val s = path.substring(path.length - 3)
if (s == ".js") mime = "application/javascript" if (s == ".js") mime = "application/javascript"

View File

@ -10,6 +10,11 @@ import java.io.IOException
import java.net.BindException import java.net.BindException
import java.net.InetSocketAddress import java.net.InetSocketAddress
/**
* class to create the website nodes at specific paths
*
* @author Lukas Heiligenbrunner
*/
class Webserver { class Webserver {
fun startserver() { fun startserver() {
info("starting Webserver") info("starting Webserver")
@ -23,7 +28,7 @@ class Webserver {
server.createContext("/senddata/admindata", AdminRequests()) server.createContext("/senddata/admindata", AdminRequests())
server.createContext("/senddata/newdate", NewDateRequest()) server.createContext("/senddata/newdate", NewDateRequest())
server.createContext("/senddata/Devicedata", DeviceRequest()) server.createContext("/senddata/Devicedata", DeviceRequest())
server.executor = null // creates a default executor server.executor = java.util.concurrent.Executors.newCachedThreadPool() // creates a default executor
server.start() server.start()
info("Server available at http://127.0.0.1:8000 now") info("Server available at http://127.0.0.1:8000 now")
} catch (e: BindException) { } catch (e: BindException) {

View File

@ -9,14 +9,25 @@ import java.net.URISyntaxException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
/**
* all requests for Admin page
*
* @author Lukas Heiligenbrunner
*/
public class AdminRequests extends PostRequest { public class AdminRequests extends PostRequest {
@Override @Override
public String request(HashMap<String, String> params) { public String request(HashMap<String, String> params) {
String result = ""; String result = "";
switch (params.get("action")) { switch (params.get("action")) {
/**
* shut down the whole application
*/
case "shutdownserver": case "shutdownserver":
System.exit(0); System.exit(0);
break; break;
/**
* restart the server application
*/
case "restartserver": case "restartserver":
final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java"; final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
File currentJar = null; File currentJar = null;
@ -31,7 +42,7 @@ public class AdminRequests extends PostRequest {
Log.Log.warning("not jar --> cant restart"); Log.Log.warning("not jar --> cant restart");
/* Build command: java -jar application.jar */ /* Build command: java -jar application.jar */
final ArrayList<String> command = new ArrayList<String>(); final ArrayList<String> command = new ArrayList<>();
command.add(javaBin); command.add(javaBin);
command.add("-jar"); command.add("-jar");
command.add(currentJar.getPath()); command.add(currentJar.getPath());

View File

@ -6,25 +6,33 @@ import com.wasteinformationserver.basicutils.Log.Log.error
import com.wasteinformationserver.basicutils.Log.Log.warning import com.wasteinformationserver.basicutils.Log.Log.warning
import com.wasteinformationserver.db.JDBC import com.wasteinformationserver.db.JDBC
import com.wasteinformationserver.website.basicrequest.PostRequest import com.wasteinformationserver.website.basicrequest.PostRequest
import java.io.IOException
import java.sql.ResultSet import java.sql.ResultSet
import java.sql.SQLException import java.sql.SQLException
import java.sql.SQLIntegrityConstraintViolationException import java.sql.SQLIntegrityConstraintViolationException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
/**
* General Datarequests for Dashboard
*
* @author Lukas Heiligenbrunner
*/
class DataRequest : PostRequest() { class DataRequest : PostRequest() {
override fun request(params: HashMap<String, String>): String { override fun request(params: HashMap<String, String>): String {
val sb = StringBuilder() val sb = StringBuilder()
var set: ResultSet? var set: ResultSet?
var status = -1 var status = -1
val jdbc: JDBC = try {
JDBC.getInstance() if (!JDBC.isConnected()) {
} catch (e: IOException) {
error("no connection to db") error("no connection to db")
return "{\"query\" : \"nodbconn\"}" return "{\"query\" : \"nodbconn\"}"
} }
val jdbc: JDBC = JDBC.getInstance()
when (params["action"]) { when (params["action"]) {
/**
* create a new city entry in db
*/
"newCity" -> { "newCity" -> {
sb.append("{") sb.append("{")
debug(params.toString()) debug(params.toString())
@ -63,6 +71,9 @@ class DataRequest : PostRequest() {
sb.append(",\"query\":\"ok\"") sb.append(",\"query\":\"ok\"")
sb.append("}") sb.append("}")
} }
/**
* return all defined cities from db
*/
"getAllCities" -> { "getAllCities" -> {
set = jdbc.executeQuery("select * from cities") set = jdbc.executeQuery("select * from cities")
debug(set.toString()) debug(set.toString())
@ -84,6 +95,9 @@ class DataRequest : PostRequest() {
sb.append(",\"query\":\"ok\"") sb.append(",\"query\":\"ok\"")
sb.append("}") sb.append("}")
} }
/**
* delete a specific city
*/
"deletecity" -> { "deletecity" -> {
//DELETE FROM `cities` WHERE `id`=0 //DELETE FROM `cities` WHERE `id`=0
sb.append("{") sb.append("{")
@ -106,6 +120,9 @@ class DataRequest : PostRequest() {
sb.append(",\"query\":\"ok\"") sb.append(",\"query\":\"ok\"")
sb.append("}") sb.append("}")
} }
/**
* returns all configured dates with its city and zone
*/
"getAllDates" -> { "getAllDates" -> {
set = jdbc.executeQuery("SELECT pickupdates.id,pickupdates.pickupdate,cities.userid,cities.name,cities.wastetype,cities.zone " + set = jdbc.executeQuery("SELECT pickupdates.id,pickupdates.pickupdate,cities.userid,cities.name,cities.wastetype,cities.zone " +
"FROM `pickupdates` INNER JOIN `cities` ON pickupdates.citywastezoneid = cities.id") "FROM `pickupdates` INNER JOIN `cities` ON pickupdates.citywastezoneid = cities.id")
@ -128,6 +145,9 @@ class DataRequest : PostRequest() {
sb.append(",\"query\":\"ok\"") sb.append(",\"query\":\"ok\"")
sb.append("}") sb.append("}")
} }
/**
* delete a specific date
*/
"deletedate" -> { "deletedate" -> {
sb.append("{") sb.append("{")
try { try {
@ -148,6 +168,9 @@ class DataRequest : PostRequest() {
sb.append(",\"query\":\"ok\"") sb.append(",\"query\":\"ok\"")
sb.append("}") sb.append("}")
} }
/**
* return version foot data
*/
"getversionandbuildtime" -> { "getversionandbuildtime" -> {
sb.append("{") sb.append("{")
sb.append("\"version\" : \"" + Info.getVersion() + "\"") sb.append("\"version\" : \"" + Info.getVersion() + "\"")
@ -155,6 +178,9 @@ class DataRequest : PostRequest() {
sb.append(",\"query\":\"ok\"") sb.append(",\"query\":\"ok\"")
sb.append("}") sb.append("}")
} }
/**
* return head data with basic collection infos
*/
"getStartHeaderData" -> { "getStartHeaderData" -> {
sb.append("{") sb.append("{")
try { try {

View File

@ -4,43 +4,50 @@ import com.wasteinformationserver.basicutils.Log.Log.debug
import com.wasteinformationserver.basicutils.Log.Log.error import com.wasteinformationserver.basicutils.Log.Log.error
import com.wasteinformationserver.db.JDBC import com.wasteinformationserver.db.JDBC
import com.wasteinformationserver.website.basicrequest.PostRequest import com.wasteinformationserver.website.basicrequest.PostRequest
import java.io.IOException
import java.sql.ResultSet import java.sql.ResultSet
import java.sql.SQLException import java.sql.SQLException
import java.util.* import java.util.*
/**
* Class for all requests on device Page
*
* @author Lukas Heiligenbrunner
*/
class DeviceRequest : PostRequest() { class DeviceRequest : PostRequest() {
override fun request(params: HashMap<String, String>): String { override fun request(params: HashMap<String, String>): String {
var jdbc: JDBC? = null if (!JDBC.isConnected()) {
try { error("no connection to db")
jdbc = JDBC.getInstance() return "{\"query\" : \"nodbconn\"}"
} catch (e: IOException) {
e.printStackTrace()
} }
val jdbc: JDBC = JDBC.getInstance()
val sb = StringBuilder() val sb = StringBuilder()
var deviceset: ResultSet val deviceset: ResultSet
when (params["action"]) { when (params["action"]) {
/**
* return all available devices
*/
"getdevices" -> { "getdevices" -> {
deviceset = jdbc!!.executeQuery("SELECT * FROM `devices") deviceset = jdbc.executeQuery("SELECT * FROM `devices")
sb.append("{\"data\":[") sb.append("{\"data\":[")
try { try {
while (deviceset.next()) { while (deviceset.next()) {
val deviceid = deviceset.getInt("DeviceID") val deviceid = deviceset.getInt("DeviceID")
val cityid = deviceset.getInt("CityID") val cityid = deviceset.getInt("CityID")
if (cityid == -1) { if (cityid == -1) {
sb.append("{\"deviceid\":\"").append(deviceid).append("\",\"cityid\":\"").append(cityid).append("\"}") sb.append("{\"deviceid\":").append(deviceid).append(",\"cityid\":").append(cityid).append("}")
} }
else { else {
val devicename = deviceset.getString("DeviceName") val devicename = deviceset.getString("DeviceName")
val devicelocation = deviceset.getString("DeviceLocation") val devicelocation = deviceset.getString("DeviceLocation")
sb.append("{\"deviceid\":\"").append(deviceid).append("\",\"devicename\":\"").append(devicename).append("\",\"devicelocation\":\"").append(devicelocation).append("\",\"devices\":[") sb.append("{\"deviceid\":").append(deviceid).append(",\"devicename\":\"").append(devicename).append("\",\"devicelocation\":\"").append(devicelocation).append("\",\"devices\":[")
val devicecities = jdbc.executeQuery("SELECT * FROM `device_city` INNER JOIN `cities` ON device_city.CityID=cities.id WHERE `DeviceID`='$deviceid'") val devicecities = jdbc.executeQuery("SELECT * FROM `device_city` INNER JOIN `cities` ON device_city.CityID=cities.id WHERE `DeviceID`='$deviceid'")
while (devicecities.next()) { while (devicecities.next()) {
val cityidd = devicecities.getInt("id") val cityidd = devicecities.getInt("id")
val cityname = devicecities.getString("name") val cityname = devicecities.getString("name")
val wastetype = devicecities.getString("wastetype") val wastetype = devicecities.getString("wastetype")
val zone = devicecities.getString("zone") val zone = devicecities.getString("zone")
sb.append("{\"cityid\":\"").append(cityidd).append("\",\"cityname\":\"").append(cityname).append("\",\"wastetype\":\"").append(wastetype).append("\",\"zone\":\"").append(zone).append("\"}") sb.append("{\"cityid\":").append(cityidd).append(",\"cityname\":\"").append(cityname).append("\",\"wastetype\":\"").append(wastetype).append("\",\"zone\":\"").append(zone).append("\"}")
if (!devicecities.isLast) { if (!devicecities.isLast) {
sb.append(",") sb.append(",")
} }
@ -56,15 +63,18 @@ class DeviceRequest : PostRequest() {
e.printStackTrace() e.printStackTrace()
} }
} }
/**
* returns all available city names
*/
"getCitynames" -> { "getCitynames" -> {
deviceset = jdbc!!.executeQuery("select * from cities") deviceset = jdbc.executeQuery("select * from cities")
debug(deviceset.toString()) debug(deviceset.toString())
sb.append("{") sb.append("{")
try { try {
var prev = "" var prev = ""
while (deviceset.next()) { while (deviceset.next()) {
if (prev != deviceset.getString("name")) { if (prev != deviceset.getString("name")) {
if (!deviceset.isFirst()) { if (!deviceset.isFirst) {
sb.append(",") sb.append(",")
} }
sb.append("\"").append(deviceset.getString("name")).append("\":\"").append(deviceset.getString("name")).append("\"") sb.append("\"").append(deviceset.getString("name")).append("\":\"").append(deviceset.getString("name")).append("\"")
@ -77,8 +87,11 @@ class DeviceRequest : PostRequest() {
sb.append("}") sb.append("}")
debug(sb.toString()) debug(sb.toString())
} }
/**
* returns all available zones for specified city
*/
"getzones" -> { "getzones" -> {
deviceset = jdbc!!.executeQuery("select * from cities WHERE `name`='" + params["cityname"] + "' ORDER BY zone ASC") deviceset = jdbc.executeQuery("select * from cities WHERE `name`='" + params["cityname"] + "' ORDER BY zone ASC")
debug(deviceset.toString()) debug(deviceset.toString())
sb.append("{") sb.append("{")
try { try {
@ -86,7 +99,7 @@ class DeviceRequest : PostRequest() {
while (deviceset.next()) { while (deviceset.next()) {
if (prev != deviceset.getInt("zone")) { if (prev != deviceset.getInt("zone")) {
sb.append("\"").append(deviceset.getInt("zone")).append("\":\"").append(deviceset.getInt("zone")).append("\"") sb.append("\"").append(deviceset.getInt("zone")).append("\":\"").append(deviceset.getInt("zone")).append("\"")
if (!deviceset.isLast()) { if (!deviceset.isLast) {
sb.append(",") sb.append(",")
} }
} }
@ -97,8 +110,11 @@ class DeviceRequest : PostRequest() {
} }
sb.append("}") sb.append("}")
} }
/**
* returns all available waste types for specified zone and city
*/
"gettypes" -> { "gettypes" -> {
deviceset = jdbc!!.executeQuery("select * from cities WHERE `name`='" + params["cityname"] + "' AND `zone`='" + params["zonename"] + "' ORDER BY zone ASC") deviceset = jdbc.executeQuery("select * from cities WHERE `name`='" + params["cityname"] + "' AND `zone`='" + params["zonename"] + "' ORDER BY zone ASC")
debug(deviceset.toString()) debug(deviceset.toString())
sb.append("{") sb.append("{")
try { try {
@ -106,7 +122,7 @@ class DeviceRequest : PostRequest() {
while (deviceset.next()) { while (deviceset.next()) {
if (prev != deviceset.getString("wastetype")) { if (prev != deviceset.getString("wastetype")) {
sb.append("\"" + deviceset.getString("wastetype") + "\":\"" + deviceset.getString("wastetype") + "\"") sb.append("\"" + deviceset.getString("wastetype") + "\":\"" + deviceset.getString("wastetype") + "\"")
if (!deviceset.isLast()) { if (!deviceset.isLast) {
sb.append(",") sb.append(",")
} }
} }
@ -117,8 +133,11 @@ class DeviceRequest : PostRequest() {
} }
sb.append("}") sb.append("}")
} }
/**
* configure device and save infos to db
*/
"savetodb" -> try { "savetodb" -> try {
val cityset = jdbc!!.executeQuery("SELECT id from cities WHERE `name`='" + params["cityname"] + "' AND `zone`='" + params["zonename"] + "' AND `wastetype`='" + params["wastetype"] + "'") val cityset = jdbc.executeQuery("SELECT id from cities WHERE `name`='" + params["cityname"] + "' AND `zone`='" + params["zonename"] + "' AND `wastetype`='" + params["wastetype"] + "'")
cityset.last() cityset.last()
if (cityset.row != 1) { if (cityset.row != 1) {
error("error saving device to db --> device multiply defined?") error("error saving device to db --> device multiply defined?")
@ -133,35 +152,50 @@ class DeviceRequest : PostRequest() {
} catch (e: SQLException) { } catch (e: SQLException) {
e.printStackTrace() e.printStackTrace()
} }
/**
* delete a configured device from db
*/
"deleteDevice" -> { "deleteDevice" -> {
try { try {
jdbc!!.executeUpdate("DELETE FROM devices WHERE `DeviceID`='" + params["id"] + "'") jdbc.executeUpdate("DELETE FROM devices WHERE `DeviceID`='" + params["id"] + "'")
jdbc.executeUpdate("DELETE FROM device_city WHERE `DeviceID`='" + params["id"] + "'") jdbc.executeUpdate("DELETE FROM device_city WHERE `DeviceID`='" + params["id"] + "'")
} catch (e: SQLException) { } catch (e: SQLException) {
e.printStackTrace() e.printStackTrace()
} }
sb.append("{\"status\":\"success\"}") sb.append("{\"status\":\"success\"}")
} }
"getDeviceNumber" -> try { /**
val numberset = jdbc!!.executeQuery("SELECT * FROM devices") * add new city/zone/type to db to existing one
numberset.last() */
val devicenr = numberset.row
sb.append("{\"devicenr\":\"$devicenr\"}")
} catch (e: SQLException) {
e.printStackTrace()
}
"addtodb" -> { "addtodb" -> {
var cityid = -1
try { try {
val device = jdbc!!.executeQuery("SELECT * FROM cities WHERE name='" + params["cityname"] + "' AND wastetype='" + params["wastetype"] + "' AND zone='" + params["zonename"] + "'") val device = jdbc.executeQuery("SELECT * FROM cities WHERE name='" + params["cityname"] + "' AND wastetype='" + params["wastetype"] + "' AND zone='" + params["zonename"] + "'")
device.first() device.first()
cityid = device.getInt("id") val cityid = device.getInt("id")
jdbc.executeUpdate("INSERT INTO `device_city` (`DeviceID`, `CityID`) VALUES ('" + params["deviceid"] + "', '" + cityid + "');") jdbc.executeUpdate("INSERT INTO `device_city` (`DeviceID`, `CityID`) VALUES ('" + params["deviceid"] + "', '" + cityid + "');")
} catch (e: SQLException) { } catch (e: SQLException) {
e.printStackTrace() e.printStackTrace()
} }
sb.append("{\"success\":true}") sb.append("{\"success\":true}")
} }
/**
* return header information such as devicenumber and number of unconfigured devices
*/
"getheader" -> {
try {
var numberset = jdbc.executeQuery("SELECT * FROM devices")
numberset.last()
val devicenr = numberset.row
numberset = jdbc.executeQuery("SELECT * FROM devices WHERE CityID=-1")
numberset.last()
val unconfigureddevices = numberset.row
sb.append("{\"success\":true,\"devicenumber\":$devicenr, \"unconfigureddevices\":$unconfigureddevices}")
} catch (e: SQLException) {
e.printStackTrace()
}
}
} }
return sb.toString() return sb.toString()
} }

View File

@ -1,127 +0,0 @@
package com.wasteinformationserver.website.datarequests;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.db.JDBC;
import com.wasteinformationserver.website.basicrequest.PostRequest;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
public class NewDateRequest extends PostRequest {
@Override
public String request(HashMap<String, String> params) {
StringBuilder sb = new StringBuilder();
JDBC jdbc;
ResultSet set;
try {
jdbc = JDBC.getInstance();
} catch (IOException e) {
Log.Log.error("no connection to db");
return "{\"query\" : \"nodbconn\"}";
}
switch (params.get("action")) {
case "getCitynames":
set = jdbc.executeQuery("select * from cities");
Log.Log.debug(set.toString());
sb.append("{\"data\":[");
try {
String prev = "";
while (set.next()) {
if (prev.equals(set.getString("name"))) {
} else {
if (!set.isFirst()) {
sb.append(",");
}
sb.append("{\"cityname\":\"" + set.getString("name") + "\"}");
}
prev = set.getString("name");
}
} catch (SQLException e) {
e.printStackTrace();
}
sb.append("]");
sb.append(",\"query\":\"ok\"");
sb.append("}");
Log.Log.debug(sb.toString());
break;
case "getzones":
set = jdbc.executeQuery("select * from cities WHERE `name`='" + params.get("cityname") + "' ORDER BY zone ASC");
Log.Log.debug(set.toString());
sb.append("{\"data\":[");
try {
int prev = 42;
while (set.next()) {
if (prev == set.getInt("zone")) {
} else {
sb.append("{\"zone\":\"" + set.getInt("zone") + "\"}");
if (!set.isLast()) {
sb.append(",");
}
}
prev = set.getInt("zone");
}
} catch (SQLException e) {
e.printStackTrace();
}
sb.append("]");
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "gettypes":
set = jdbc.executeQuery("select * from cities WHERE `name`='" + params.get("cityname") + "' AND `zone`='"+params.get("zonename")+"' ORDER BY zone ASC");
Log.Log.debug(set.toString());
sb.append("{\"data\":[");
try {
String prev = "42";
while (set.next()) {
if (prev == set.getString("wastetype")) {
} else {
sb.append("{\"wastetype\":\"" + set.getString("wastetype") + "\"}");
if (!set.isLast()) {
sb.append(",");
}
}
prev = set.getString("wastetype");
}
} catch (SQLException e) {
e.printStackTrace();
}
sb.append("]");
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "newdate":
sb.append("{");
Log.Log.debug(params);
set = jdbc.executeQuery("select * from cities WHERE `name`='" + params.get("cityname") + "' AND `zone`='" + params.get("zone") + "' AND `wastetype`='" + params.get("wastetype") + "'");
try {
set.last();
if (set.getRow() == 1) {
Log.Log.debug(set.getInt("id"));
int status = jdbc.executeUpdate("INSERT INTO `pickupdates`(`citywastezoneid`, `pickupdate`) VALUES ('" + set.getInt("id") + "','" + params.get("date") + "')");
if (status == 1) {
sb.append("\"status\" : \"success\"");
} else {
sb.append("\"status\" : \"error\"");
}
} else {
Log.Log.warning("city doesnt exist!");
sb.append("\"status\" : \"citydoesntexist\"");
}
} catch (SQLException e) {
e.printStackTrace();
}
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
}
return sb.toString();
}
}

View File

@ -0,0 +1,124 @@
package com.wasteinformationserver.website.datarequests
import com.wasteinformationserver.basicutils.Log.Log.debug
import com.wasteinformationserver.basicutils.Log.Log.error
import com.wasteinformationserver.basicutils.Log.Log.warning
import com.wasteinformationserver.db.JDBC
import com.wasteinformationserver.website.basicrequest.PostRequest
import java.sql.ResultSet
import java.sql.SQLException
/**
* todo
*
* @author Lukas Heiligenbrunner
*/
class NewDateRequest : PostRequest() {
override fun request(params: HashMap<String, String>): String {
val sb = StringBuilder()
val set: ResultSet
if (!JDBC.isConnected()) {
error("no connection to db")
return "{\"query\" : \"nodbconn\"}"
}
val jdbc: JDBC = JDBC.getInstance()
when (params["action"]) {
"getCitynames" -> {
set = jdbc.executeQuery("select * from cities")
debug(set.toString())
sb.append("{\"data\":[")
try {
var prev = ""
while (set.next()) {
if (prev != set.getString("name")) { // not same --> new element
if (!set.isFirst) {
sb.append(",")
}
sb.append("{\"cityname\":\"" + set.getString("name") + "\"}")
}
prev = set.getString("name")
}
} catch (e: SQLException) {
e.printStackTrace()
}
sb.append("]")
sb.append(",\"query\":\"ok\"")
sb.append("}")
debug(sb.toString())
}
"getzones" -> {
set = jdbc.executeQuery("select * from cities WHERE `name`='" + params["cityname"] + "' ORDER BY zone ASC")
debug(set.toString())
sb.append("{\"data\":[")
try {
var prev = 42
while (set.next()) {
if (prev != set.getInt("zone")) { // not same --> append next
sb.append("{\"zone\":\"" + set.getInt("zone") + "\"}")
if (!set.isLast) {
sb.append(",")
}
}
prev = set.getInt("zone")
}
} catch (e: SQLException) {
e.printStackTrace()
}
sb.append("]")
sb.append(",\"query\":\"ok\"")
sb.append("}")
}
"gettypes" -> {
set = jdbc.executeQuery("select * from cities WHERE `name`='" + params["cityname"] + "' AND `zone`='" + params["zonename"] + "' ORDER BY zone ASC")
debug(set.toString())
sb.append("{\"data\":[")
try {
var prev = "42"
while (set.next()) {
if (prev !== set.getString("wastetype")) {
sb.append("{\"wastetype\":\"" + set.getString("wastetype") + "\"}")
if (!set.isLast) {
sb.append(",")
}
}
prev = set.getString("wastetype")
}
} catch (e: SQLException) {
e.printStackTrace()
}
sb.append("]")
sb.append(",\"query\":\"ok\"")
sb.append("}")
}
"newdate" -> {
sb.append("{")
debug(params)
set = jdbc.executeQuery("select * from cities WHERE `name`='" + params["cityname"] + "' AND `zone`='" + params["zone"] + "' AND `wastetype`='" + params["wastetype"] + "'")
try {
set.last()
if (set.row == 1) {
debug(set.getInt("id"))
val status = jdbc.executeUpdate("INSERT INTO `pickupdates`(`citywastezoneid`, `pickupdate`) VALUES ('" + set.getInt("id") + "','" + params["date"] + "')")
if (status == 1) {
sb.append("\"status\" : \"success\"")
}
else {
sb.append("\"status\" : \"error\"")
}
}
else {
warning("city doesnt exist!")
sb.append("\"status\" : \"citydoesntexist\"")
}
} catch (e: SQLException) {
e.printStackTrace()
}
sb.append(",\"query\":\"ok\"")
sb.append("}")
}
}
return sb.toString()
}
}

View File

@ -3,7 +3,7 @@ package com.wasteinformationserver.website.datarequests
import com.wasteinformationserver.basicutils.Log import com.wasteinformationserver.basicutils.Log
import com.wasteinformationserver.basicutils.Log.Log.debug import com.wasteinformationserver.basicutils.Log.Log.debug
import com.wasteinformationserver.db.JDBC import com.wasteinformationserver.db.JDBC
import com.wasteinformationserver.website.HttpTools.Companion.StringToMD5 import com.wasteinformationserver.website.HttpTools.Companion.stringToMD5
import com.wasteinformationserver.website.basicrequest.PostRequest import com.wasteinformationserver.website.basicrequest.PostRequest
import java.io.IOException import java.io.IOException
import java.sql.SQLException import java.sql.SQLException
@ -12,15 +12,16 @@ import java.util.*
class RegisterRequest : PostRequest() { class RegisterRequest : PostRequest() {
override fun request(params: HashMap<String, String>): String { override fun request(params: HashMap<String, String>): String {
debug(params.toString()) debug(params.toString())
val passhash = StringToMD5(params["password"]!!) val passhash = stringToMD5(params["password"]!!)
var reply: StringBuilder = StringBuilder("{") val reply: StringBuilder = StringBuilder("{")
try { try {
var myjd: JDBC = JDBC.getInstance() val myjd: JDBC = JDBC.getInstance()
val status = myjd.executeUpdate("INSERT INTO `user` (`username`, `firstName`, `secondName`, `password`, `email`, `logindate`) VALUES ('" + params["username"] + "', '" + params["firstname"] + "', '" + params["lastname"] + "', '" + passhash + "', '" + params["email"] + "', current_timestamp());") val status = myjd.executeUpdate("INSERT INTO `user` (`username`, `firstName`, `secondName`, `password`, `email`, `logindate`) VALUES ('" + params["username"] + "', '" + params["firstname"] + "', '" + params["lastname"] + "', '" + passhash + "', '" + params["email"] + "', current_timestamp());")
if (status == 1) { if (status == 1) {
reply.append("\"accept\": true") reply.append("\"accept\": true")
} else { }
else {
reply.append("\"accept\": false") reply.append("\"accept\": false")
} }

View File

@ -6,14 +6,14 @@ import java.util.*
class UserInfoRequest : PostRequest() { class UserInfoRequest : PostRequest() {
override fun request(params: HashMap<String, String>): String { override fun request(params: HashMap<String, String>): String {
//TODO("not implemented") //To change body of created functions use File | Settings | File Templates. //TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
when (params.get("action")) { when (params["action"]) {
"getlogins" -> { "getlogins" -> {
println("heyho") println("heyho")
} }
""->{ "" -> {
//todo o //todo o
} }
} }
return "{}"; return "{}"
} }
} }

View File

@ -3,17 +3,19 @@ package com.wasteinformationserver.website.datarequests.login
import com.wasteinformationserver.basicutils.Log.Log.debug import com.wasteinformationserver.basicutils.Log.Log.debug
import com.wasteinformationserver.basicutils.Log.Log.error import com.wasteinformationserver.basicutils.Log.Log.error
import com.wasteinformationserver.basicutils.Log.Log.message import com.wasteinformationserver.basicutils.Log.Log.message
import com.wasteinformationserver.basicutils.Storage
import com.wasteinformationserver.db.JDBC import com.wasteinformationserver.db.JDBC
import com.wasteinformationserver.website.HttpTools.Companion.StringToMD5 import com.wasteinformationserver.website.HttpTools.Companion.stringToMD5
import com.wasteinformationserver.website.basicrequest.PostRequest import com.wasteinformationserver.website.basicrequest.PostRequest
import java.io.IOException
import java.sql.SQLException import java.sql.SQLException
import java.util.* import java.util.*
/** /**
* request handler of new login request of user * request handler of new user login requests
* - checks the truth of username and password * - checks the truth of username and password
* - replies right error messages or the success login * - replies right error messages or the success login
*
* @author Lukas Heiligenbrunner
*/ */
class LoginRequest : PostRequest() { class LoginRequest : PostRequest() {
override fun request(params: HashMap<String, String>): String { override fun request(params: HashMap<String, String>): String {
@ -22,28 +24,40 @@ class LoginRequest : PostRequest() {
val username = params["username"] val username = params["username"]
val jdbc: JDBC = try { val jdbc: JDBC = try {
JDBC.getInstance() JDBC.getInstance()
} catch (e: IOException) { } catch (e: Exception) {
error("no connection to db") error("no connection to db" + e.printStackTrace())
return "{\"status\" : \"nodbconn\"}" return "{\"status\" : \"nodbconn\"}"
} }
if (!Storage.getInstance().isEveryThingDefined()) {
error("config not configured correctly")
return "{\"status\" : \"conferror\"}"
}
val s = jdbc.executeQuery("select * from user where username ='$username'") val s = jdbc.executeQuery("select * from user where username ='$username'")
debug("successfully logged in to db") debug("successfully logged in to db")
var response = "{\"accept\": false}" var response = "{\"accept\": false}"
try { try {
s.last() s.last()
if (s.row == 1) { //success if (s.row == 1) {
if (StringToMD5(password!!) == s.getString("password")) { //success
if (stringToMD5(password!!) == s.getString("password")) {
debug("login success") debug("login success")
LoginState.getObject().logIn() LoginState.getObject().logIn()
LoginState.getObject().setAccountData(username, s.getString("firstName"), s.getString("secondName"), s.getString("email"), s.getInt("permission")) LoginState.getObject().setAccountData(username, s.getString("firstName"), s.getString("secondName"), s.getString("email"), s.getInt("permission"))
response = "{\"accept\": true}" response = "{\"accept\": true}"
} else { }
else {
debug("wrong password") debug("wrong password")
} }
} else if (s.row == 0) { //user not found }
else if (s.row == 0) {
//user not found
debug("user not found") debug("user not found")
} else { //internal error two users with same name...? }
else {
//internal error two users with same name...?
error("there seem to be two users with same name") error("there seem to be two users with same name")
} }
debug("rowcount: " + s.row) debug("rowcount: " + s.row)

View File

@ -1,12 +1,16 @@
package com.wasteinformationserver.website.datarequests.login; package com.wasteinformationserver.website.datarequests.login;
/** /**
* * singleton representing the login state of the user
*/ */
public class LoginState { public class LoginState {
private static LoginState mythis = new LoginState(); private static final LoginState mythis = new LoginState();
/**
* get object
* @return LoginState instance
*/
public static LoginState getObject() { public static LoginState getObject() {
return mythis; return mythis;
} }
@ -17,16 +21,26 @@ public class LoginState {
private String email; private String email;
private int permission; private int permission;
boolean loggedin = true; private boolean loggedin = false;
/**
* login the user
*/
public void logIn() { public void logIn() {
loggedin = true; loggedin = true;
} }
/**
* logout the user
*/
public void logOut() { public void logOut() {
loggedin = false; loggedin = false;
} }
/**
* set the account infos
* username, firstname, lastname, email and permission level
*/
public void setAccountData(String username, String firstname, String lastname, String email, int permission) { public void setAccountData(String username, String firstname, String lastname, String email, int permission) {
this.username = username; this.username = username;
this.firstname = firstname; this.firstname = firstname;
@ -35,26 +49,50 @@ public class LoginState {
this.permission = permission; this.permission = permission;
} }
/**
* check if user is logged in
* @return loginstate
*/
public boolean isLoggedIn() { public boolean isLoggedIn() {
return loggedin; return loggedin;
} }
/**
* get username
* @return username
*/
public String getUsername() { public String getUsername() {
return username; return username;
} }
/**
* get firstname
* @return firstname
*/
public String getFirstname() { public String getFirstname() {
return firstname; return firstname;
} }
/**
* get lastname
* @return lastname
*/
public String getLastname() { public String getLastname() {
return lastname; return lastname;
} }
/**
* get email address
* @return mail address
*/
public String getEmail() { public String getEmail() {
return email; return email;
} }
/**
* get permission level
* @return level as int
*/
public int getPermission() { public int getPermission() {
return permission; return permission;
} }

87
src/resources/db.sql Normal file
View File

@ -0,0 +1,87 @@
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT = @@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS = @@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION = @@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
CREATE TABLE cities
(
id int(11) NOT NULL,
userid int(11) NOT NULL,
name varchar(256) NOT NULL,
wastetype varchar(64) NOT NULL,
zone int(11) NOT NULL
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
CREATE TABLE devices
(
DeviceID int(11) NOT NULL,
CityID int(11) NOT NULL DEFAULT '-1',
DeviceName varchar(15) DEFAULT NULL,
DeviceLocation varchar(15) DEFAULT NULL
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE device_city
(
DeviceID int(11) NOT NULL,
CityID int(11) NOT NULL
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE pickupdates
(
id int(11) NOT NULL,
citywastezoneid int(11) NOT NULL,
pickupdate date NOT NULL
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
CREATE TABLE `user`
(
id int(11) NOT NULL,
username varchar(150) NOT NULL,
firstName varchar(32) NOT NULL,
secondName varchar(32) NOT NULL,
password varchar(32) NOT NULL,
permission int(11) NOT NULL DEFAULT '0',
email varchar(64) NOT NULL,
logindate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
ALTER TABLE cities
ADD PRIMARY KEY (id);
ALTER TABLE devices
ADD PRIMARY KEY (DeviceID);
ALTER TABLE pickupdates
ADD PRIMARY KEY (id),
ADD KEY citywastezoneid (citywastezoneid);
ALTER TABLE `user`
ADD PRIMARY KEY (id);
ALTER TABLE cities
MODIFY id int(11) NOT NULL AUTO_INCREMENT,
AUTO_INCREMENT = 143;
ALTER TABLE pickupdates
MODIFY id int(11) NOT NULL AUTO_INCREMENT,
AUTO_INCREMENT = 67;
ALTER TABLE `user`
MODIFY id int(11) NOT NULL AUTO_INCREMENT,
AUTO_INCREMENT = 17;
ALTER TABLE pickupdates
ADD CONSTRAINT pickupdates_ibfk_1 FOREIGN KEY (citywastezoneid) REFERENCES cities (id);
/*!40101 SET CHARACTER_SET_CLIENT = @OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS = @OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION = @OLD_COLLATION_CONNECTION */;

View File

@ -118,7 +118,5 @@
<script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App --> <!-- AdminLTE App -->
<script src="lib/AdminLTE/dist/js/adminlte.min.js"></script> <script src="lib/AdminLTE/dist/js/adminlte.min.js"></script>
<!-- AdminLTE for demo purposes -->
<script src="lib/AdminLTE/dist/js/demo.js"></script>
</body> </body>
</html> </html>

View File

@ -6,38 +6,27 @@
<title>WasteInformation Server</title> <title>WasteInformation Server</title>
<!-- Tell the browser to be responsive to screen width --> <!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<!-- AdminLTE Libs -->
<!-- Font Awesome --> <!-- Font Awesome -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/fontawesome-free/css/all.min.css"> <link rel="stylesheet" href="lib/AdminLTE/plugins/fontawesome-free/css/all.min.css">
<!-- Ionicons --> <!-- Ionicons -->
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<!-- DataTables --> <!-- DataTables -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/datatables-bs4/css/dataTables.bootstrap4.css"> <link rel="stylesheet" href="lib/AdminLTE/plugins/datatables-bs4/css/dataTables.bootstrap4.css">
<!-- Tempusdominus Bbootstrap 4 -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css"> <!-- !Theme style -->
<!-- iCheck -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- JQVMap -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/jqvmap/jqvmap.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="lib/AdminLTE/dist/css/adminlte.min.css"> <link rel="stylesheet" href="lib/AdminLTE/dist/css/adminlte.min.css">
<!-- overlayScrollbars --> <!-- !overlayScrollbars -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/overlayScrollbars/css/OverlayScrollbars.min.css"> <link rel="stylesheet" href="lib/AdminLTE/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">
<!-- Daterange picker -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/daterangepicker/daterangepicker.css">
<!-- summernote -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/summernote/summernote-bs4.css">
<!-- Google Font: Source Sans Pro --> <!-- Google Font: Source Sans Pro -->
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
<!-- Bootstrap Date-Picker Plugin --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>
<link rel="stylesheet" <!-- custom stylesheets -->
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>
<!-- <link rel="stylesheet" type="text/css" href="css/user.css">-->
<link rel="stylesheet" type="text/css" href="css/general.css"> <link rel="stylesheet" type="text/css" href="css/general.css">
</head> </head>
<body class="hold-transition sidebar-mini layout-fixed"> <body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper"> <div class="wrapper">
@ -53,17 +42,21 @@
<!-- Sidebar --> <!-- Sidebar -->
<div class="sidebar"> <div class="sidebar">
<!-- Sidebar user panel (optional) --> <!-- Sidebar User -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex"> <nav class="user-panel mt-3 pb-3 mb-3">
<div class="image"> <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu"
<!-- <img src="lib/AdminLTE/dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image"> --> data-accordion="false">
<i class="nav-icon fas fa-user img-circle elevation-2" style="color:white"></i>
</div> <li class="nav-item">
<!-- <i class="nav-icon fas fa-tachometer-alt"></i> --> <a href="user.html" class="nav-link">
<div class="info"> <i class="nav-icon fas fa-user"></i>
<a href="user.html" class="d-block" id="userlabel">Username to set!</a> <p id="userlabel">
</div> Username to set!
</div> </p>
</a>
</li>
</ul>
</nav>
<!-- Sidebar Menu --> <!-- Sidebar Menu -->
<nav class="mt-2"> <nav class="mt-2">
@ -71,14 +64,36 @@
data-accordion="false"> data-accordion="false">
<li class="nav-item"> <li class="nav-item">
<a href="#todo" class="nav-link"> <a href="dashboard.html" class="nav-link">
<i class="nav-icon fas fa-cog"></i> <i class="nav-icon fas fa-columns"></i>
<p> <p>
Settings Dashboard
</p> </p>
</a> </a>
</li> </li>
<li id="devicepanel" class="nav-item">
<a href="device.html" class="nav-link">
<i class="nav-icon fas fa-desktop"></i>
<p>
Devices
</p>
</a>
</li>
<li id="adminpanel" class="nav-item hideit">
<a href="adminpanel.html" class="nav-link">
<i class="nav-icon fas fa-plus-circle"></i>
<p>
Admin panel
</p>
</a>
</li>
<li class="nav-item"> <li class="nav-item">
<a href="index.html" class="nav-link" id="logoutbtn"> <a href="index.html" class="nav-link" id="logoutbtn">
<i class="nav-icon fas fa-sign-out-alt"></i> <i class="nav-icon fas fa-sign-out-alt"></i>
@ -88,23 +103,7 @@
</a> </a>
</li> </li>
<li class="nav-item">
<a href="#todo" class="nav-link">
<i class="nav-icon fas fa-plus-circle"></i>
<p>
New Entry
</p>
</a>
</li>
<li id="adminpanel" class="nav-item hideit">
<a href="adminpanel.html" class="nav-link">
<i class="nav-icon fas fa-plus-circle"></i>
<p>
Admin panel
</p>
</a>
</li>
</ul> </ul>
</nav> </nav>
<!-- /.sidebar-menu --> <!-- /.sidebar-menu -->
@ -119,12 +118,12 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row mb-2"> <div class="row mb-2">
<div class="col-sm-6"> <div class="col-sm-6">
<h1 class="m-0 text-dark">Dashboard</h1> <h1 class="m-0 text-dark sandwich"><i class="fas fa-bars"></i> &ensp;Admin Area</h1>
</div><!-- /.col --> </div><!-- /.col -->
<div class="col-sm-6"> <div class="col-sm-6">
<ol class="breadcrumb float-sm-right"> <ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="dashboard.html">Home</a></li> <li class="breadcrumb-item"><a href="dashboard.html">Home</a></li>
<li class="breadcrumb-item active">Users</li> <li class="breadcrumb-item active">Admin</li>
</ol> </ol>
</div><!-- /.col --> </div><!-- /.col -->
</div><!-- /.row --> </div><!-- /.row -->
@ -226,6 +225,7 @@
</div> </div>
<!-- ./wrapper --> <!-- ./wrapper -->
<!-- AdminLTE Libs -->
<!-- jQuery --> <!-- jQuery -->
<script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script> <script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- jQuery UI 1.11.4 --> <!-- jQuery UI 1.11.4 -->
@ -236,42 +236,18 @@
</script> </script>
<!-- Bootstrap 4 --> <!-- Bootstrap 4 -->
<script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- ChartJS -->
<script src="lib/AdminLTE/plugins/chart.js/Chart.min.js"></script>
<!-- Sparkline -->
<script src="lib/AdminLTE/plugins/sparklines/sparkline.js"></script>
<!-- JQVMap -->
<script src="lib/AdminLTE/plugins/jqvmap/jquery.vmap.min.js"></script>
<script src="lib/AdminLTE/plugins/jqvmap/maps/jquery.vmap.usa.js"></script>
<!-- jQuery Knob Chart -->
<script src="lib/AdminLTE/plugins/jquery-knob/jquery.knob.min.js"></script>
<!-- daterangepicker -->
<script src="lib/AdminLTE/plugins/moment/moment.min.js"></script>
<script src="lib/AdminLTE/plugins/daterangepicker/daterangepicker.js"></script>
<!-- Tempusdominus Bootstrap 4 -->
<script src="lib/AdminLTE/plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js"></script>
<!-- Summernote -->
<script src="lib/AdminLTE/plugins/summernote/summernote-bs4.min.js"></script>
<!-- overlayScrollbars -->
<script src="lib/AdminLTE/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script>
<!-- AdminLTE App --> <!-- AdminLTE App -->
<script src="lib/AdminLTE/dist/js/adminlte.js"></script> <script src="lib/AdminLTE/dist/js/adminlte.js"></script>
<!-- AdminLTE dashboard demo (This is only for demo purposes) --> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
<script src="lib/AdminLTE/dist/js/pages/dashboard.js"></script>
<!-- AdminLTE for demo purposes -->
<script src="lib/AdminLTE/dist/js/demo.js"></script>
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
<script type="text/javascript" src="js/adminpanel.js"></script>
<!-- DataTables --> <!-- DataTables -->
<script src="lib/AdminLTE/plugins/datatables/jquery.dataTables.js"></script> <script src="lib/AdminLTE/plugins/datatables/jquery.dataTables.js"></script>
<script src="lib/AdminLTE/plugins/datatables-bs4/js/dataTables.bootstrap4.js"></script> <script src="lib/AdminLTE/plugins/datatables-bs4/js/dataTables.bootstrap4.js"></script>
<script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script> <script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script>
<script src="js/userManager.js"></script> <!-- custom js -->
<script src="js/adminpanel.js"></script>
<script src="js/general.js"></script>
</body> </body>
</html> </html>

View File

@ -1,3 +1,7 @@
.hideit{ .hideit{
display:none; display:none;
} }
.sandwich:hover{
cursor: pointer;
}

View File

@ -1,7 +0,0 @@
html,body{
background-image: url('../rsc/login2.jpg');
background-size: cover;
background-repeat: no-repeat;
height: 100%;
font-family: 'Numans', sans-serif;
}

View File

@ -6,40 +6,29 @@
<title>WasteInformation Server</title> <title>WasteInformation Server</title>
<!-- Tell the browser to be responsive to screen width --> <!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<!-- AdminLTE Libs -->
<!-- Font Awesome --> <!-- Font Awesome -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/fontawesome-free/css/all.min.css"> <link rel="stylesheet" href="lib/AdminLTE/plugins/fontawesome-free/css/all.min.css">
<!-- Ionicons --> <!-- Ionicons -->
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<!-- DataTables --> <!-- DataTables -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/datatables-bs4/css/dataTables.bootstrap4.css"> <link rel="stylesheet" href="lib/AdminLTE/plugins/datatables-bs4/css/dataTables.bootstrap4.css">
<!-- Tempusdominus Bbootstrap 4 -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css"> <!-- !Theme style -->
<!-- iCheck -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- JQVMap -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/jqvmap/jqvmap.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="lib/AdminLTE/dist/css/adminlte.min.css"> <link rel="stylesheet" href="lib/AdminLTE/dist/css/adminlte.min.css">
<!-- overlayScrollbars --> <!-- !overlayScrollbars -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/overlayScrollbars/css/OverlayScrollbars.min.css"> <link rel="stylesheet" href="lib/AdminLTE/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">
<!-- Daterange picker -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/daterangepicker/daterangepicker.css">
<!-- summernote -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/summernote/summernote-bs4.css">
<!-- Google Font: Source Sans Pro --> <!-- Google Font: Source Sans Pro -->
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
<!-- Bootstrap Date-Picker Plugin --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>
<!-- custom stylesheets -->
<link rel="stylesheet" type="text/css" href="css/dashboard.css"> <link rel="stylesheet" type="text/css" href="css/dashboard.css">
<link rel="stylesheet" type="text/css" href="css/general.css"> <link rel="stylesheet" type="text/css" href="css/general.css">
<link rel="icon" type="image/png" href="/favicon.png"> <link rel="icon" type="image/png" href="/favicon.png">
</head> </head>
<body class="hold-transition sidebar-mini layout-fixed"> <body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper"> <div class="wrapper">
@ -55,17 +44,21 @@
<!-- Sidebar --> <!-- Sidebar -->
<div class="sidebar"> <div class="sidebar">
<!-- Sidebar user panel (optional) --> <!-- Sidebar User -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex"> <nav class="user-panel mt-3 pb-3 mb-3">
<div class="image"> <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu"
<!-- <img src="lib/AdminLTE/dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image"> --> data-accordion="false">
<i class="nav-icon fas fa-user img-circle elevation-2" style="color:white"></i>
</div> <li class="nav-item">
<!-- <i class="nav-icon fas fa-tachometer-alt"></i> --> <a href="user.html" class="nav-link">
<div class="info"> <i class="nav-icon fas fa-user"></i>
<a href="user.html" class="d-block" id="userlabel">Username to set!</a> <p id="userlabel">
</div> Username to set!
</div> </p>
</a>
</li>
</ul>
</nav>
<!-- Sidebar Menu --> <!-- Sidebar Menu -->
<nav class="mt-2"> <nav class="mt-2">
@ -73,23 +66,25 @@
data-accordion="false"> data-accordion="false">
<li class="nav-item"> <li class="nav-item">
<a href="#todo" class="nav-link"> <a href="dashboard.html" class="nav-link">
<i class="nav-icon fas fa-cog"></i> <i class="nav-icon fas fa-columns"></i>
<p> <p>
Settings Dashboard
</p> </p>
</a> </a>
</li> </li>
<li class="nav-item">
<a href="index.html" class="nav-link" id="logoutbtn"> <li id="devicepanel" class="nav-item">
<i class="nav-icon fas fa-sign-out-alt"></i> <a href="device.html" class="nav-link">
<i class="nav-icon fas fa-desktop"></i>
<p> <p>
Logout Devices
</p> </p>
</a> </a>
</li> </li>
<li id="adminpanel" class="nav-item hideit"> <li id="adminpanel" class="nav-item hideit">
<a href="adminpanel.html" class="nav-link"> <a href="adminpanel.html" class="nav-link">
<i class="nav-icon fas fa-plus-circle"></i> <i class="nav-icon fas fa-plus-circle"></i>
@ -99,11 +94,12 @@
</a> </a>
</li> </li>
<li id="devicepanel" class="nav-item">
<a href="device.html" class="nav-link"> <li class="nav-item">
<i class="nav-icon fas fa-plus-circle"></i> <a href="index.html" class="nav-link" id="logoutbtn">
<i class="nav-icon fas fa-sign-out-alt"></i>
<p> <p>
Devices Logout
</p> </p>
</a> </a>
</li> </li>
@ -121,7 +117,7 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row mb-2"> <div class="row mb-2">
<div class="col-sm-6"> <div class="col-sm-6">
<h1 class="m-0 text-dark">Dashboard</h1> <h1 class="m-0 text-dark sandwich"><i class="fas fa-bars"></i> &ensp;Dashboard</h1>
</div><!-- /.col --> </div><!-- /.col -->
<div class="col-sm-6"> <div class="col-sm-6">
<ol class="breadcrumb float-sm-right"> <ol class="breadcrumb float-sm-right">
@ -150,7 +146,6 @@
<div class="icon"> <div class="icon">
<i class="ion ion-bag"></i> <i class="ion ion-bag"></i>
</div> </div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div> </div>
</div> </div>
<!-- ./col --> <!-- ./col -->
@ -165,7 +160,6 @@
<div class="icon"> <div class="icon">
<i class="ion ion-android-globe" style="color: lightgrey"></i> <i class="ion ion-android-globe" style="color: lightgrey"></i>
</div> </div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div> </div>
</div> </div>
<!-- ./col --> <!-- ./col -->
@ -180,7 +174,6 @@
<div class="icon"> <div class="icon">
<i class="ion ion-calendar"></i> <i class="ion ion-calendar"></i>
</div> </div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div> </div>
</div> </div>
<!-- ./col --> <!-- ./col -->
@ -195,7 +188,6 @@
<div class="icon"> <div class="icon">
<i class="ion ion-android-checkmark-circle"></i> <i class="ion ion-android-checkmark-circle"></i>
</div> </div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div> </div>
</div> </div>
<!-- ./col --> <!-- ./col -->
@ -217,22 +209,23 @@
<table id="table-pickupdates" class="table table-bordered table-hover"> <table id="table-pickupdates" class="table table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<th>City</th> <th><i class="fas fa-city"></i>City</th>
<th>Zone</th> <th><i class="fas fa-search-location"></i>Zone</th>
<th>Waste Type</th> <th><i class="fas fa-recycle"></i>Waste Type</th>
<th>Date</th> <th><i class="fas fa-calendar-alt"></i>Date</th>
<th>X</th> <th><i class="fas fa-trash-alt"></i></th>
</tr> </tr>
</thead> </thead>
<tbody id="picupdates-tablebody"> <tbody id="picupdates-tablebody">
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>
<th>City</th> <th><i class="fas fa-city"></i>City</th>
<th>Zone</th> <th><i class="fas fa-search-location"></i>Zone</th>
<th>Waste Type</th> <th><i class="fas fa-recycle"></i>Waste Type</th>
<th>Date</th> <th><i class="fas fa-calendar-alt"></i>Date</th>
<th>X</th> <th><i class="fas fa-trash-alt"></i>
</th>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
@ -322,6 +315,7 @@
data-toggle="dropdown"> data-toggle="dropdown">
Select waste type Select waste type
</button> </button>
<div id="dropdown-type-drops" class="dropdown-menu"> <div id="dropdown-type-drops" class="dropdown-menu">
</div> </div>
</div> </div>
@ -353,20 +347,28 @@
<table id="example2" class="table table-bordered table-hover"> <table id="example2" class="table table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<th>City</th> <th>
<th>Zone</th> <i class="fas fa-city"></i>
<th>Waste Type</th> City
<th>X</th> </th>
<th><i class="fas fa-search-location"></i>
Zone
</th>
<th><i class="fas fa-recycle"></i>
Waste Type
</th>
<th><i class="fas fa-trash-alt"></i>
</th>
</tr> </tr>
</thead> </thead>
<tbody id="location-table-data"> <tbody id="location-table-data">
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>
<th>City</th> <th><i class="fas fa-city"></i>City</th>
<th>Zone</th> <th><i class="fas fa-search-location"></i>Zone</th>
<th>Waste Type</th> <th><i class="fas fa-recycle"></i>Waste Type</th>
<th>X</th> <th><i class="fas fa-trash-alt"></i></th>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
@ -402,6 +404,7 @@
</div> </div>
<!-- ./wrapper --> <!-- ./wrapper -->
<!-- AdminLTE Libs -->
<!-- jQuery --> <!-- jQuery -->
<script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script> <script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- jQuery UI 1.11.4 --> <!-- jQuery UI 1.11.4 -->
@ -412,44 +415,18 @@
</script> </script>
<!-- Bootstrap 4 --> <!-- Bootstrap 4 -->
<script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- ChartJS -->
<script src="lib/AdminLTE/plugins/chart.js/Chart.min.js"></script>
<!-- Sparkline -->
<script src="lib/AdminLTE/plugins/sparklines/sparkline.js"></script>
<!-- JQVMap -->
<script src="lib/AdminLTE/plugins/jqvmap/jquery.vmap.min.js"></script>
<script src="lib/AdminLTE/plugins/jqvmap/maps/jquery.vmap.usa.js"></script>
<!-- jQuery Knob Chart -->
<script src="lib/AdminLTE/plugins/jquery-knob/jquery.knob.min.js"></script>
<!-- daterangepicker -->
<script src="lib/AdminLTE/plugins/moment/moment.min.js"></script>
<script src="lib/AdminLTE/plugins/daterangepicker/daterangepicker.js"></script>
<!-- Tempusdominus Bootstrap 4 -->
<script src="lib/AdminLTE/plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js"></script>
<!-- Summernote -->
<script src="lib/AdminLTE/plugins/summernote/summernote-bs4.min.js"></script>
<!-- overlayScrollbars -->
<script src="lib/AdminLTE/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script>
<!-- AdminLTE App --> <!-- AdminLTE App -->
<script src="lib/AdminLTE/dist/js/adminlte.js"></script> <script src="lib/AdminLTE/dist/js/adminlte.js"></script>
<!-- AdminLTE dashboard demo (This is only for demo purposes) --> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
<script src="lib/AdminLTE/dist/js/pages/dashboard.js"></script>
<!-- AdminLTE for demo purposes -->
<script src="lib/AdminLTE/dist/js/demo.js"></script>
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
<!-- DataTables --> <!-- DataTables -->
<script src="lib/AdminLTE/plugins/datatables/jquery.dataTables.js"></script> <script src="lib/AdminLTE/plugins/datatables/jquery.dataTables.js"></script>
<script src="lib/AdminLTE/plugins/datatables-bs4/js/dataTables.bootstrap4.js"></script> <script src="lib/AdminLTE/plugins/datatables-bs4/js/dataTables.bootstrap4.js"></script>
<script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script> <script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script>
<!-- OWN --> <!-- custom js -->
<script type="text/javascript" src="js/dashboard.js"></script>
<script type="text/javascript" src="js/lib/kotlin.js"></script> <script src="js/general.js"></script>
<script type="text/javascript" src="js/WasteInformationServer.js"></script>
</body> </body>
</html> </html>

View File

@ -6,38 +6,27 @@
<title>WasteInformation Server</title> <title>WasteInformation Server</title>
<!-- Tell the browser to be responsive to screen width --> <!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<!-- AdminLTE Libs -->
<!-- Font Awesome --> <!-- Font Awesome -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/fontawesome-free/css/all.min.css"> <link rel="stylesheet" href="lib/AdminLTE/plugins/fontawesome-free/css/all.min.css">
<!-- Ionicons --> <!-- Ionicons -->
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<!-- DataTables --> <!-- DataTables -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/datatables-bs4/css/dataTables.bootstrap4.css"> <link rel="stylesheet" href="lib/AdminLTE/plugins/datatables-bs4/css/dataTables.bootstrap4.css">
<!-- Tempusdominus Bbootstrap 4 -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css"> <!-- !Theme style -->
<!-- iCheck -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- JQVMap -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/jqvmap/jqvmap.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="lib/AdminLTE/dist/css/adminlte.min.css"> <link rel="stylesheet" href="lib/AdminLTE/dist/css/adminlte.min.css">
<!-- overlayScrollbars --> <!-- !overlayScrollbars -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/overlayScrollbars/css/OverlayScrollbars.min.css"> <link rel="stylesheet" href="lib/AdminLTE/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">
<!-- Daterange picker -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/daterangepicker/daterangepicker.css">
<!-- summernote -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/summernote/summernote-bs4.css">
<!-- Google Font: Source Sans Pro --> <!-- Google Font: Source Sans Pro -->
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
<!-- Bootstrap Date-Picker Plugin --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>
<link rel="stylesheet" <!-- custom stylesheets -->
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>
<!-- <link rel="stylesheet" type="text/css" href="css/user.css">-->
<link rel="stylesheet" type="text/css" href="css/general.css"> <link rel="stylesheet" type="text/css" href="css/general.css">
</head> </head>
<body class="hold-transition sidebar-mini layout-fixed"> <body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper"> <div class="wrapper">
@ -51,19 +40,24 @@
<span class="brand-text font-weight-light">Waste Control</span> <span class="brand-text font-weight-light">Waste Control</span>
</a> </a>
<!-- Sidebar --> <!-- Sidebar -->
<div class="sidebar"> <div class="sidebar">
<!-- Sidebar user panel (optional) --> <!-- Sidebar User -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex"> <nav class="user-panel mt-3 pb-3 mb-3">
<div class="image"> <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu"
<!-- <img src="lib/AdminLTE/dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image"> --> data-accordion="false">
<i class="nav-icon fas fa-user img-circle elevation-2" style="color:white"></i>
</div> <li class="nav-item">
<!-- <i class="nav-icon fas fa-tachometer-alt"></i> --> <a href="user.html" class="nav-link">
<div class="info"> <i class="nav-icon fas fa-user"></i>
<a href="user.html" class="d-block" id="userlabel">Username to set!</a> <p id="userlabel">
</div> Username to set!
</div> </p>
</a>
</li>
</ul>
</nav>
<!-- Sidebar Menu --> <!-- Sidebar Menu -->
<nav class="mt-2"> <nav class="mt-2">
@ -71,19 +65,20 @@
data-accordion="false"> data-accordion="false">
<li class="nav-item"> <li class="nav-item">
<a href="#todo" class="nav-link"> <a href="dashboard.html" class="nav-link">
<i class="nav-icon fas fa-cog"></i> <i class="nav-icon fas fa-columns"></i>
<p> <p>
Settings Dashboard
</p> </p>
</a> </a>
</li> </li>
<li class="nav-item">
<a href="index.html" class="nav-link" id="logoutbtn"> <li id="devicepanel" class="nav-item">
<i class="nav-icon fas fa-sign-out-alt"></i> <a href="device.html" class="nav-link">
<i class="nav-icon fas fa-desktop"></i>
<p> <p>
Logout Devices
</p> </p>
</a> </a>
</li> </li>
@ -97,14 +92,16 @@
</a> </a>
</li> </li>
<li id="devicepanel" class="nav-item">
<a href="device.html" class="nav-link"> <li class="nav-item">
<i class="nav-icon fas fa-plus-circle"></i> <a href="index.html" class="nav-link" id="logoutbtn">
<i class="nav-icon fas fa-sign-out-alt"></i>
<p> <p>
Devices Logout
</p> </p>
</a> </a>
</li> </li>
</ul> </ul>
</nav> </nav>
<!-- /.sidebar-menu --> <!-- /.sidebar-menu -->
@ -119,12 +116,12 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row mb-2"> <div class="row mb-2">
<div class="col-sm-6"> <div class="col-sm-6">
<h1 class="m-0 text-dark">Dashboard</h1> <h1 class="m-0 text-dark sandwich"><i class="fas fa-bars"></i> &ensp;Devices</h1>
</div><!-- /.col --> </div><!-- /.col -->
<div class="col-sm-6"> <div class="col-sm-6">
<ol class="breadcrumb float-sm-right"> <ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="dashboard.html">Home</a></li> <li class="breadcrumb-item"><a href="dashboard.html">Home</a></li>
<li class="breadcrumb-item active">Users</li> <li class="breadcrumb-item active">Devices</li>
</ol> </ol>
</div><!-- /.col --> </div><!-- /.col -->
</div><!-- /.row --> </div><!-- /.row -->
@ -141,14 +138,13 @@
<!-- small box --> <!-- small box -->
<div class="small-box bg-info"> <div class="small-box bg-info">
<div class="inner"> <div class="inner">
<h3>TODO</h3> <h3 id="devicenr-label">-1</h3>
<p>Todo</p> <p>Devices</p>
</div> </div>
<div class="icon"> <div class="icon">
<i class="ion ion-bag"></i> <i class="ion ion-bag"></i>
</div> </div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div> </div>
</div> </div>
<!-- ./col --> <!-- ./col -->
@ -156,14 +152,13 @@
<!-- small box --> <!-- small box -->
<div class="small-box bg-success"> <div class="small-box bg-success">
<div class="inner"> <div class="inner">
<h3>TODO</h3> <h3 id="unconfigured-devices-label">-1</h3>
<p>Devices</p> <p>Not Configured Devices</p>
</div> </div>
<div class="icon"> <div class="icon">
<i class="ion ion-stats-bars"></i> <i class="ion ion-stats-bars"></i>
</div> </div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div> </div>
</div> </div>
<!-- ./col --> <!-- ./col -->
@ -186,22 +181,22 @@
<table id="table-devices" class="table table-bordered table-hover"> <table id="table-devices" class="table table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<th>Device ID</th> <th><i class="fas fa-id-card"></i> Device ID</th>
<th>Devicename</th> <th><i class="fas fa-signature"></i> Devicename</th>
<th>Devicelocation</th> <th><i class="fas fa-search-location"></i> Devicelocation</th>
<th>WasteType</th> <th><i class="fas fa-recycle"></i> WasteType</th>
<th>Action</th> <th><i class="fas fa-edit"></i> Action</th>
</tr> </tr>
</thead> </thead>
<tbody id="devices-tablebody"> <tbody id="devices-tablebody">
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>
<th>Device ID</th> <th><i class="fas fa-id-card"></i> Device ID</th>
<th>Devicename</th> <th><i class="fas fa-signature"></i> Devicename</th>
<th>Devicelocation</th> <th><i class="fas fa-search-location"></i> Devicelocation</th>
<th>WasteType</th> <th><i class="fas fa-recycle"></i> WasteType</th>
<th>Action</th> <th><i class="fas fa-edit"></i> Action</th>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
@ -243,6 +238,7 @@
</div> </div>
<!-- ./wrapper --> <!-- ./wrapper -->
<!-- AdminLTE Libs -->
<!-- jQuery --> <!-- jQuery -->
<script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script> <script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- jQuery UI 1.11.4 --> <!-- jQuery UI 1.11.4 -->
@ -253,42 +249,17 @@
</script> </script>
<!-- Bootstrap 4 --> <!-- Bootstrap 4 -->
<script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- ChartJS -->
<script src="lib/AdminLTE/plugins/chart.js/Chart.min.js"></script>
<!-- Sparkline -->
<script src="lib/AdminLTE/plugins/sparklines/sparkline.js"></script>
<!-- JQVMap -->
<script src="lib/AdminLTE/plugins/jqvmap/jquery.vmap.min.js"></script>
<script src="lib/AdminLTE/plugins/jqvmap/maps/jquery.vmap.usa.js"></script>
<!-- jQuery Knob Chart -->
<script src="lib/AdminLTE/plugins/jquery-knob/jquery.knob.min.js"></script>
<!-- daterangepicker -->
<script src="lib/AdminLTE/plugins/moment/moment.min.js"></script>
<script src="lib/AdminLTE/plugins/daterangepicker/daterangepicker.js"></script>
<!-- Tempusdominus Bootstrap 4 -->
<script src="lib/AdminLTE/plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js"></script>
<!-- Summernote -->
<script src="lib/AdminLTE/plugins/summernote/summernote-bs4.min.js"></script>
<!-- overlayScrollbars -->
<script src="lib/AdminLTE/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script>
<!-- AdminLTE App --> <!-- AdminLTE App -->
<script src="lib/AdminLTE/dist/js/adminlte.js"></script> <script src="lib/AdminLTE/dist/js/adminlte.js"></script>
<!-- AdminLTE dashboard demo (This is only for demo purposes) --> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
<script src="lib/AdminLTE/dist/js/pages/dashboard.js"></script>
<!-- AdminLTE for demo purposes -->
<script src="lib/AdminLTE/dist/js/demo.js"></script>
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
<!--<script type="text/javascript" src="js/user.js"></script>-->
<!-- DataTables --> <!-- DataTables -->
<script src="lib/AdminLTE/plugins/datatables/jquery.dataTables.js"></script> <script src="lib/AdminLTE/plugins/datatables/jquery.dataTables.js"></script>
<script src="lib/AdminLTE/plugins/datatables-bs4/js/dataTables.bootstrap4.js"></script> <script src="lib/AdminLTE/plugins/datatables-bs4/js/dataTables.bootstrap4.js"></script>
<script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script> <script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script>
<script src="js/userManager.js"></script> <!-- custom js -->
<script src="js/general.js"></script>
<script src="js/device.js"></script> <script src="js/device.js"></script>
</body> </body>
</html> </html>

View File

@ -3,19 +3,18 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Login Page</title> <title>Login Page</title>
<!--Made with love by Mutiullah Samim -->
<!-- Latest compiled and minified CSS --> <!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="lib/bootstrap.min.css"> <link rel="stylesheet" href="lib/bootstrap.min.css">
<!-- jQuery library --> <!-- jQuery library -->
<script src="lib/jquery.min.js"></script> <script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- Popper JS --> <!-- Popper JS -->
<script src="lib/popper.min.js"></script> <script src="lib/popper.min.js"></script>
<!-- Latest compiled JavaScript --> <!-- Latest compiled JavaScript -->
<script src="lib/bootstrap.min.js"></script> <script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.min.js"></script>
<!--Fontawesome CDN--> <!--Fontawesome CDN-->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css"
@ -24,15 +23,13 @@
<!--Custom styles--> <!--Custom styles-->
<link rel="stylesheet" type="text/css" href="css/index.css"> <link rel="stylesheet" type="text/css" href="css/index.css">
<script type="text/javascript" src="js/index.js"></script>
<script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script> <script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script>
<link rel="manifest" href="/manifest.json"> <link rel="manifest" href="/manifest.json">
<link rel="icon" type="image/png" href="/favicon.png"> <link rel="icon" type="image/png" href="/favicon.png">
<script type="text/javascript" src="js/lib/kotlin.js"></script>
<script type="text/javascript" src="js/WasteInformationServer.js"></script>
</head> </head>
<body> <body>
<div class="container"> <div class="container">

View File

@ -21,6 +21,16 @@ class Dashboard {
//add click listeners to all buttons //add click listeners to all buttons
this.addClickListeners(); this.addClickListeners();
// allow moveable tiles
$('.connectedSortable').sortable({
placeholder : 'sort-highlight',
connectWith : '.connectedSortable',
handle : '.card-header, .nav-tabs',
forcePlaceholderSize: true,
zIndex : 999999
})
$('.connectedSortable .card-header, .connectedSortable .nav-tabs-custom').css('cursor', 'move')
} }
/* Constants */ /* Constants */
@ -30,6 +40,7 @@ class Dashboard {
/* Btn Action Listeners */ /* Btn Action Listeners */
addClickListeners() { addClickListeners() {
const _this = this;
//btn listeners //btn listeners
$('#logoutbtn').click(function () { $('#logoutbtn').click(function () {
$.post('/senddata/checkloginstate', 'action=logout', function (data) { $.post('/senddata/checkloginstate', 'action=logout', function (data) {
@ -52,7 +63,7 @@ class Dashboard {
console.log(data); console.log(data);
if (data.status == "inserted") { if (data.status == "inserted") {
Swal.fire({ Swal.fire({
type: "success", icon: "success",
title: 'Successfully created city!', title: 'Successfully created city!',
html: 'This alert closes automatically.', html: 'This alert closes automatically.',
timer: 1000, timer: 1000,
@ -60,10 +71,10 @@ class Dashboard {
console.log('Popup closed. ') console.log('Popup closed. ')
}); });
this.reloadtable(); _this.reloadtable();
} else if (data.status == "exists") { } else if (data.status == "exists") {
Swal.fire({ Swal.fire({
type: "warning", icon: "warning",
title: 'Name already exists in db', title: 'Name already exists in db',
html: 'Close popup.', html: 'Close popup.',
}).then((result) => { }).then((result) => {
@ -168,7 +179,7 @@ class Dashboard {
$.post('/senddata/newdate', 'action=newdate&cityname=' + cityname.html() + "&zone=" + zone.html() + "&wastetype=" + wastetype.html() + "&date=" + date.val(), function (data) { $.post('/senddata/newdate', 'action=newdate&cityname=' + cityname.html() + "&zone=" + zone.html() + "&wastetype=" + wastetype.html() + "&date=" + date.val(), function (data) {
if (data.status == "success") { if (data.status == "success") {
Swal.fire({ Swal.fire({
type: "success", icon: "success",
title: 'Successfully created Date!', title: 'Successfully created Date!',
html: 'This alert closes automatically.', html: 'This alert closes automatically.',
timer: 1000, timer: 1000,
@ -181,10 +192,10 @@ class Dashboard {
zone.html("Select Zone"); zone.html("Select Zone");
wastetype.html("Select waste type"); wastetype.html("Select waste type");
date.val(""); date.val("");
reloadDateTable(); _this.reloadDateTable();
} else if (data.status == "citydoesntexist") { } else if (data.status == "citydoesntexist") {
Swal.fire({ Swal.fire({
type: "warning", icon: "warning",
title: 'city name doesnt exist', title: 'city name doesnt exist',
html: 'Close popup.', html: 'Close popup.',
}).then((result) => { }).then((result) => {
@ -233,9 +244,10 @@ class Dashboard {
} }
reloadtable() { reloadtable() {
const _this = this;
$.post('/senddata/wastedata', 'action=getAllCities', function (data) { $.post('/senddata/wastedata', 'action=getAllCities', function (data) {
if (this.citytable != null) { if (_this.citytable != null) {
this.citytable.destroy(); //delete table if already created _this.citytable.destroy(); //delete table if already created
} }
console.log(data); console.log(data);
@ -257,13 +269,13 @@ class Dashboard {
} }
$(".delbtn").click(function (event) { $(".delbtn").click(function (event) {
var id = event.target.getAttribute("dataid"); const id = event.target.getAttribute("dataid");
console.log("clicked btn data " + id); console.log("clicked btn data " + id);
$.post('/senddata/wastedata', 'action=deletecity&id=' + id, function (data) { $.post('/senddata/wastedata', 'action=deletecity&id=' + id, function (data) {
console.log(data); console.log(data);
if (data.status === "success") { if (data.status === "success") {
Swal.fire({ Swal.fire({
type: "success", icon: "success",
title: 'Successfully deleted city!', title: 'Successfully deleted city!',
html: 'This alert closes automatically.', html: 'This alert closes automatically.',
timer: 1000, timer: 1000,
@ -271,12 +283,12 @@ class Dashboard {
console.log('Popup closed. ') console.log('Popup closed. ')
}); });
reloadtable(); _this.reloadtable();
} else if (data.status === "dependenciesnotdeleted") { } else if (data.status === "dependenciesnotdeleted") {
Swal.fire({ Swal.fire({
type: "warning", icon: "warning",
title: 'This city is a dependency of a date', title: 'This city is a dependency of a date',
html: 'Do you want do delete it anyway with all dependencies?', html: 'Please delete all dependencies first!',
}).then((result) => { }).then((result) => {
console.log('Popup closed. ') console.log('Popup closed. ')
@ -287,10 +299,10 @@ class Dashboard {
}, "json"); }, "json");
}); });
this.citytable = $("#example2").DataTable(); _this.citytable = $("#example2").DataTable();
} else if (data.query == "nodbconn") { } else if (data.query == "nodbconn") {
Swal.fire({ Swal.fire({
type: "error", icon: "error",
title: 'No connection to Database', title: 'No connection to Database',
html: 'Setup DB here --> <a href="index.html">click<a/>.', html: 'Setup DB here --> <a href="index.html">click<a/>.',
}).then((result) => { }).then((result) => {
@ -305,9 +317,10 @@ class Dashboard {
} }
reloadDateTable() { reloadDateTable() {
const _this = this;
$.post('/senddata/wastedata', 'action=getAllDates', function (data) { $.post('/senddata/wastedata', 'action=getAllDates', function (data) {
if (this.datetable != null) { if (_this.datetable != null) {
this.datetable.destroy(); //delete table if already created _this.datetable.destroy(); //delete table if already created
} }
console.log(data); console.log(data);
@ -332,7 +345,7 @@ class Dashboard {
console.log(data); console.log(data);
if (data.status == "success") { if (data.status == "success") {
Swal.fire({ Swal.fire({
type: "success", icon: "success",
title: 'Successfully deleted city!', title: 'Successfully deleted city!',
html: 'This alert closes automatically.', html: 'This alert closes automatically.',
timer: 1000, timer: 1000,
@ -340,10 +353,10 @@ class Dashboard {
console.log('Popup closed. ') console.log('Popup closed. ')
}); });
reloadDateTable(); _this.reloadDateTable();
} else if (data.status == "dependenciesnotdeleted") { } else if (data.status == "dependenciesnotdeleted") {
Swal.fire({ Swal.fire({
type: "warning", icon: "warning",
title: 'This city is a dependency of a date', title: 'This city is a dependency of a date',
html: 'Do you want do delete it anyway with all dependencies?', html: 'Do you want do delete it anyway with all dependencies?',
}).then((result) => { }).then((result) => {
@ -356,7 +369,7 @@ class Dashboard {
}, "json"); }, "json");
}); });
} }
this.datetable = $("#table-pickupdates").DataTable({ _this.datetable = $("#table-pickupdates").DataTable({
"order": [[3, "asc"]] "order": [[3, "asc"]]
}); });
}, "json"); }, "json");

View File

@ -1,11 +1,12 @@
$(document).ready(function () { $(function () {
new Device(); new Device();
}); });
class Device { class Device {
constructor() { constructor() {
this.reloadDevices() this.reloadDevices();
this.loadHeader();
} }
devicetable = null; devicetable = null;
@ -36,7 +37,6 @@ class Device {
var devicelocation = data.data[i].devicelocation; var devicelocation = data.data[i].devicelocation;
var row = "<tr><td>" + id + "</td><td>" + devicename + "</td><td>" + devicelocation + "</td><td>"; var row = "<tr><td>" + id + "</td><td>" + devicename + "</td><td>" + devicelocation + "</td><td>";
for (var n = 0; n < data.data[i].devices.length; n++) { for (var n = 0; n < data.data[i].devices.length; n++) {
var cityname = data.data[i].devices[n].cityname; var cityname = data.data[i].devices[n].cityname;
var cityzone = data.data[i].devices[n].zone; var cityzone = data.data[i].devices[n].zone;
@ -51,9 +51,9 @@ class Device {
} }
} }
_this.addDeleteButton(); _this._addDeleteButton();
_this.addAddButton(); _this._addAddButton();
_this.addConfigDialog(); _this._addConfigDialog();
_this.devicetable = $('#table-devices').DataTable(); _this.devicetable = $('#table-devices').DataTable();
}, 'json'); }, 'json');
} }
@ -61,7 +61,8 @@ class Device {
/** /**
* add click listener to add button to add new city entries to current device * add click listener to add button to add new city entries to current device
*/ */
addAddButton() { _addAddButton() {
var _this = this;
$('.addbtn').click(function (event) { $('.addbtn').click(function (event) {
var id = event.target.getAttribute("dataid"); var id = event.target.getAttribute("dataid");
var cityname; var cityname;
@ -84,8 +85,6 @@ class Device {
} }
]).then((result) => { ]).then((result) => {
if (result.value) { if (result.value) {
console.log(result.value);
const answers = JSON.stringify(result.value);
cityname = result.value[0]; cityname = result.value[0];
console.log("cityname=" + cityname); console.log("cityname=" + cityname);
@ -104,7 +103,6 @@ class Device {
} }
]).then((result) => { ]).then((result) => {
if (result.value) { if (result.value) {
console.log(result.value);
zone = result.value[0]; zone = result.value[0];
$.post('/senddata/Devicedata', 'action=gettypes&cityname=' + cityname + '&zonename=' + zone, function (data) { $.post('/senddata/Devicedata', 'action=gettypes&cityname=' + cityname + '&zonename=' + zone, function (data) {
Swal.mixin({ Swal.mixin({
@ -121,21 +119,17 @@ class Device {
} }
]).then((result) => { ]).then((result) => {
if (result.value) { if (result.value) {
console.log(result.value);
wastetype = result.value[0]; wastetype = result.value[0];
//todo add to db
$.post('/senddata/Devicedata', 'action=addtodb&deviceid=' + id + '&cityname=' + cityname + '&zonename=' + zone + '&wastetype=' + wastetype, function (data) { $.post('/senddata/Devicedata', 'action=addtodb&deviceid=' + id + '&cityname=' + cityname + '&zonename=' + zone + '&wastetype=' + wastetype, function (data) {
if (data.success) { if (data.success) {
Swal.fire({ Swal.fire({
type: "success", icon: "success",
title: 'Successfully configured!', title: 'Successfully configured!',
html: 'This alert closes added.', html: 'This alert closes added.',
timer: 1000, timer: 1000,
}).then((result) => { }).then((result) => {
console.log('Popup closed. '); _this.reloadDevices();
reloadDevices();
}); });
} }
}); });
@ -154,7 +148,7 @@ class Device {
/** /**
* add click listener to delete button to delete this device entry * add click listener to delete button to delete this device entry
*/ */
addDeleteButton() { _addDeleteButton() {
var _this = this; var _this = this;
$(".delbtn").click(function (event) { $(".delbtn").click(function (event) {
var id = event.target.getAttribute("dataid"); var id = event.target.getAttribute("dataid");
@ -163,7 +157,7 @@ class Device {
console.log(data); console.log(data);
if (data.status === "success") { if (data.status === "success") {
Swal.fire({ Swal.fire({
type: "success", icon: "success",
title: 'Successfully deleted city!', title: 'Successfully deleted city!',
html: 'This alert closes automatically.', html: 'This alert closes automatically.',
timer: 1000, timer: 1000,
@ -174,7 +168,7 @@ class Device {
_this.reloadDevices(); _this.reloadDevices();
} else if (data.status === "dependenciesnotdeleted") { } else if (data.status === "dependenciesnotdeleted") {
Swal.fire({ Swal.fire({
type: "warning", icon: "warning",
title: 'This city is a dependency of a date', title: 'This city is a dependency of a date',
html: 'Do you want do delete it anyway with all dependencies?', html: 'Do you want do delete it anyway with all dependencies?',
}).then((result) => { }).then((result) => {
@ -191,7 +185,8 @@ class Device {
/** /**
* add click listener to unconfigured device to show configure dialog * add click listener to unconfigured device to show configure dialog
*/ */
addConfigDialog() { _addConfigDialog() {
var _this = this;
$(".configuredevicebutton").click(function (event) { $(".configuredevicebutton").click(function (event) {
var id = event.target.getAttribute("deviceid"); var id = event.target.getAttribute("deviceid");
var cityname; var cityname;
@ -266,13 +261,13 @@ class Device {
$.post('/senddata/Devicedata', 'action=savetodb&deviceid=' + id + '&cityname=' + cityname + '&zonename=' + zone + '&wastetype=' + wastetype + '&devicename=' + devicename + '&devicelocation=' + devicelocation, function (data) { $.post('/senddata/Devicedata', 'action=savetodb&deviceid=' + id + '&cityname=' + cityname + '&zonename=' + zone + '&wastetype=' + wastetype + '&devicename=' + devicename + '&devicelocation=' + devicelocation, function (data) {
if (data.success) { if (data.success) {
Swal.fire({ Swal.fire({
type: "success", icon: "success",
title: 'Successfully configured!', title: 'Successfully configured!',
html: 'This alert closes automatically.', html: 'This alert closes automatically.',
timer: 1000, timer: 1000,
}).then((result) => { }).then((result) => {
console.log('Popup closed. '); console.log('Popup closed. ');
reloadDevices(); _this.reloadDevices();
}); });
} }
}); });
@ -285,10 +280,18 @@ class Device {
} }
}); });
}); });
});
}
/**
console.log("click..." + id); * Load header tiles
*/
loadHeader(){
$.post('/senddata/Devicedata', 'action=getheader', function (data) {
if (data.success) {
$("#devicenr-label").html(data.devicenumber);
$("#unconfigured-devices-label").html(data.unconfigureddevices);
}
}); });
} }
} }

View File

@ -1,5 +1,19 @@
$(document).ready(function () { $(document).ready(function () {
console.log("page loaded"); $('.sandwich').click(function () {
const bdy = $('body');
if (bdy.hasClass("sidebar-collapse")) {
bdy.removeClass("sidebar-collapse");
} else {
bdy.addClass("sidebar-collapse");
}
if(bdy.hasClass("sidebar-open")){
bdy.removeClass("sidebar-open");
} else {
bdy.addClass("sidebar-open");
}
});
$.post('/senddata/checkloginstate', 'action=getloginstate', function (data) { $.post('/senddata/checkloginstate', 'action=getloginstate', function (data) {
console.log(data); console.log(data);
if (data.loggedin == true) { if (data.loggedin == true) {

View File

@ -0,0 +1,38 @@
$(document).ready(function () {
$('#loginbtn').click(function (e) {
e.preventDefault();
console.log("clicked login button");
const username = $("#userfield")[0].value;
const password = $("#passfield")[0].value;
$.post('/senddata/loginget', 'username=' + username + '&password=' + password, function (data) {
console.log(data);
if (data.accept == true) {
console.log("successfully logged in!");
window.location = 'dashboard.html';
} else {
if (data.status == "nodbconn") {
Swal.fire({
icon: "error",
title: 'No connection to Database',
html: 'Setup DB in config file!.',
});
} else if (data.status == "conferror") {
Swal.fire({
icon: "error",
title: 'Not configured correctly',
html: 'Please edit settings.prop and restart the server!',
});
} else {
Swal.fire({
icon: "error",
title: 'Wrong login data',
html: 'Maybe a typo in your password?',
});
}
}
}, 'json');
});
});

View File

@ -0,0 +1,38 @@
$(document).ready(function () {
$('#loginbtn').click(function (e) {
e.preventDefault();
console.log("clicked login button");
var username = $("#usernamefield")[0].value;
var firstname = $("#firstnamefield")[0].value;
var lastname = $("#lastnamefield")[0].value;
var email = $("#emailfield")[0].value;
var password = $("#passfield")[0].value;
var replypassword = $("#replpassfield")[0].value;
if (password != replypassword) {
console.log("passwords doesnt match");
} else {
$.post('/senddata/registerpost',
'username=' + username +
'&firstname=' + firstname +
'&lastname=' + lastname +
'&email=' + email +
'&password=' + password, function (data) {
console.log(data);
if (data.accept == true) {
console.log("successfully registered!");
$("#successbar").show();
setTimeout(function () {
window.location = 'index.html';
}, 3000);
} else {
console.log("error!");
$("#errorbar").show();
}
}, 'json');
}
});
});

View File

@ -1,44 +0,0 @@
$(document).ready(function () {
$('#loginbtn').click(function (e) {
e.preventDefault();
console.log("clicked login button");
var username = $("#userfield")[0].value;
var password = $("#passfield")[0].value;
$.post('/senddata/loginget', 'username=' + username + '&password=' + password, function (data) {
console.log(data);
if (data.status == "nodbconn"){
Swal.fire({
type: "error",
title: 'No connection to Database',
html: 'Setup DB here --> <a href="index.html">click<a/>.',
}).then((result) => {
console.log('Popup closed. ')
});
}
if (data.accept == true) {
console.log("successfully logged in!");
document.cookie = "username=" + username;
window.location = 'dashboard.html';
}
}, 'json');
});
//register pwa
async function registerSW() {
console.log("registering service worker!");
if ('serviceWorker' in navigator) {
try {
await navigator.serviceWorker.register('/sw.js');
} catch (e) {
console.log(`SW registration failed`);
}
}
}
registerSW();
});

View File

@ -1,7 +0,0 @@
$(document).ready(function() {
$("#firstname").value("hhh");
$.post('/senddata/checkloginstate', 'action=getfirstname', function (data) {
console.log(data);
}, 'json');
});

View File

@ -1,37 +0,0 @@
$(document).ready(function() {
$('#loginbtn').click(function(e) {
e.preventDefault();
console.log("clicked login button");
var username = $("#usernamefield")[0].value;
var firstname = $("#firstnamefield")[0].value;
var lastname = $("#lastnamefield")[0].value;
var email = $("#emailfield")[0].value;
var password = $("#passfield")[0].value;
var replypassword = $("#replpassfield")[0].value;
if (password != replypassword) {
console.log("passwords doesnt match");
}else {
$.post('/senddata/registerpost','username='+username+
'&firstname='+firstname+
'&lastname='+lastname+
'&email='+email+
'&password='+password,function(data){
console.log(data);
if (data.accept == true) {
console.log("successfully registered!");
$("#successbar").show();
setTimeout(function() {
window.location = 'index.html';
},3000);
}else {
console.log("error!");
$("#errorbar").show();
}
},'json');
}
});
});

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,444 +0,0 @@
/*!
* AdminLTE v3.0.0
* Only Pages
* Author: Colorlib
* Website: AdminLTE.io <http://adminlte.io>
* License: Open source - MIT <http://opensource.org/licenses/MIT>
*/
.close, .mailbox-attachment-close {
float: right;
font-size: 1.5rem;
font-weight: 700;
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #ffffff;
opacity: .5;
}
.close:hover, .mailbox-attachment-close:hover {
color: #000;
text-decoration: none;
}
.close:not(:disabled):not(.disabled):hover, .mailbox-attachment-close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus, .mailbox-attachment-close:not(:disabled):not(.disabled):focus {
opacity: .75;
}
button.close, button.mailbox-attachment-close {
padding: 0;
background-color: transparent;
border: 0;
appearance: none;
}
a.close.disabled, a.disabled.mailbox-attachment-close {
pointer-events: none;
}
.mailbox-messages > .table {
margin: 0;
}
.mailbox-controls {
padding: 5px;
}
.mailbox-controls.with-border {
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
}
.mailbox-read-info {
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
padding: 10px;
}
.mailbox-read-info h3 {
font-size: 20px;
margin: 0;
}
.mailbox-read-info h5 {
margin: 0;
padding: 5px 0 0;
}
.mailbox-read-time {
color: #999;
font-size: 13px;
}
.mailbox-read-message {
padding: 10px;
}
.mailbox-attachments {
padding-left: 0;
list-style: none;
}
.mailbox-attachments li {
border: 1px solid #eee;
float: left;
margin-bottom: 10px;
margin-right: 10px;
width: 200px;
}
.mailbox-attachment-name {
color: #666;
font-weight: bold;
}
.mailbox-attachment-icon,
.mailbox-attachment-info,
.mailbox-attachment-size {
display: block;
}
.mailbox-attachment-info {
background: #f8f9fa;
padding: 10px;
}
.mailbox-attachment-size {
color: #999;
font-size: 12px;
}
.mailbox-attachment-size > span {
display: inline-block;
padding-top: 0.75rem;
}
.mailbox-attachment-icon {
color: #666;
font-size: 65px;
max-height: 132.5px;
padding: 20px 10px;
text-align: center;
}
.mailbox-attachment-icon.has-img {
padding: 0;
}
.mailbox-attachment-icon.has-img > img {
height: auto;
max-width: 100%;
}
.lockscreen {
background: #e9ecef;
}
.lockscreen .lockscreen-name {
font-weight: 600;
text-align: center;
}
.lockscreen-logo {
font-size: 35px;
font-weight: 300;
margin-bottom: 25px;
text-align: center;
}
.lockscreen-logo a {
color: #495057;
}
.lockscreen-wrapper {
margin: 0 auto;
margin-top: 10%;
max-width: 400px;
}
.lockscreen-item {
border-radius: 4px;
background: #ffffff;
margin: 10px auto 30px;
padding: 0;
position: relative;
width: 290px;
}
.lockscreen-image {
border-radius: 50%;
background: #ffffff;
left: -10px;
padding: 5px;
position: absolute;
top: -25px;
z-index: 10;
}
.lockscreen-image > img {
border-radius: 50%;
height: 70px;
width: 70px;
}
.lockscreen-credentials {
margin-left: 70px;
}
.lockscreen-credentials .form-control {
border: 0;
}
.lockscreen-credentials .btn {
background-color: #ffffff;
border: 0;
padding: 0 10px;
}
.lockscreen-footer {
margin-top: 10px;
}
.login-logo,
.register-logo {
font-size: 2.1rem;
font-weight: 300;
margin-bottom: .9rem;
text-align: center;
}
.login-logo a,
.register-logo a {
color: #495057;
}
.login-page,
.register-page {
align-items: center;
background: #e9ecef;
display: flex;
height: 100vh;
justify-content: center;
}
.login-box,
.register-box {
width: 360px;
}
@media (max-width: 576px) {
.login-box,
.register-box {
margin-top: 20px;
width: 90%;
}
}
.login-card-body,
.register-card-body {
background: #ffffff;
border-top: 0;
color: #666;
padding: 20px;
}
.login-card-body .input-group .form-control,
.register-card-body .input-group .form-control {
border-right: 0;
}
.login-card-body .input-group .form-control:focus,
.register-card-body .input-group .form-control:focus {
box-shadow: none;
}
.login-card-body .input-group .form-control:focus ~ .input-group-append .input-group-text,
.register-card-body .input-group .form-control:focus ~ .input-group-append .input-group-text {
border-color: #80bdff;
}
.login-card-body .input-group .form-control.is-valid:focus,
.register-card-body .input-group .form-control.is-valid:focus {
box-shadow: none;
}
.login-card-body .input-group .form-control.is-valid ~ .input-group-append .input-group-text,
.register-card-body .input-group .form-control.is-valid ~ .input-group-append .input-group-text {
border-color: #28a745;
}
.login-card-body .input-group .form-control.is-invalid:focus,
.register-card-body .input-group .form-control.is-invalid:focus {
box-shadow: none;
}
.login-card-body .input-group .form-control.is-invalid ~ .input-group-append .input-group-text,
.register-card-body .input-group .form-control.is-invalid ~ .input-group-append .input-group-text {
border-color: #dc3545;
}
.login-card-body .input-group .input-group-text,
.register-card-body .input-group .input-group-text {
background-color: transparent;
border-bottom-right-radius: 0.25rem;
border-left: 0;
border-top-right-radius: 0.25rem;
color: #777;
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
.login-box-msg,
.register-box-msg {
margin: 0;
padding: 0 20px 20px;
text-align: center;
}
.social-auth-links {
margin: 10px 0;
}
.error-page {
margin: 20px auto 0;
width: 600px;
}
@media (max-width: 767.98px) {
.error-page {
width: 100%;
}
}
.error-page > .headline {
float: left;
font-size: 100px;
font-weight: 300;
}
@media (max-width: 767.98px) {
.error-page > .headline {
float: none;
text-align: center;
}
}
.error-page > .error-content {
display: block;
margin-left: 190px;
}
@media (max-width: 767.98px) {
.error-page > .error-content {
margin-left: 0;
}
}
.error-page > .error-content > h3 {
font-size: 25px;
font-weight: 300;
}
@media (max-width: 767.98px) {
.error-page > .error-content > h3 {
text-align: center;
}
}
.invoice {
background: #ffffff;
border: 1px solid rgba(0, 0, 0, 0.125);
position: relative;
}
.invoice-title {
margin-top: 0;
}
.profile-user-img {
border: 3px solid #adb5bd;
margin: 0 auto;
padding: 3px;
width: 100px;
}
.profile-username {
font-size: 21px;
margin-top: 5px;
}
.post {
border-bottom: 1px solid #adb5bd;
color: #666;
margin-bottom: 15px;
padding-bottom: 15px;
}
.post:last-of-type {
border-bottom: 0;
margin-bottom: 0;
padding-bottom: 0;
}
.post .user-block {
margin-bottom: 15px;
width: 100%;
}
.post .row {
width: 100%;
}
.product-image {
max-width: 100%;
height: auto;
width: 100%;
}
.product-image-thumbs {
align-items: stretch;
display: flex;
margin-top: 2rem;
}
.product-image-thumb {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
border-radius: 0.25rem;
background-color: #ffffff;
border: 1px solid #dee2e6;
display: flex;
margin-right: 1rem;
max-width: 7rem;
padding: 0.5rem;
}
.product-image-thumb img {
max-width: 100%;
height: auto;
align-self: center;
}
.product-image-thumb:hover {
opacity: 0.5;
}
.product-share a {
margin-right: .5rem;
}
.projects td {
vertical-align: middle;
}
.projects .list-inline {
margin-bottom: 0;
}
.projects img.table-avatar,
.projects .table-avatar img {
border-radius: 50%;
display: inline;
width: 2.5rem;
}
.projects .project-state {
text-align: center;
}
/*# sourceMappingURL=adminlte.pages.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@ -1,13 +1,13 @@
/*! /*!
* AdminLTE v3.0.0 (https://adminlte.io) * AdminLTE v3.0.4 (https://adminlte.io)
* Copyright 2014-2019 Colorlib <http://colorlib.com> * Copyright 2014-2020 Colorlib <http://colorlib.com>
* Licensed under MIT (https://github.com/ColorlibHQ/AdminLTE/blob/master/LICENSE) * Licensed under MIT (https://github.com/ColorlibHQ/AdminLTE/blob/master/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) : typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = global || self, factory(global.adminlte = {})); (global = global || self, factory(global.adminlte = {}));
}(this, function (exports) { 'use strict'; }(this, (function (exports) { 'use strict';
/** /**
* -------------------------------------------- * --------------------------------------------
@ -52,14 +52,17 @@
FOOTER_LG_FIXED: 'layout-lg-footer-fixed', FOOTER_LG_FIXED: 'layout-lg-footer-fixed',
FOOTER_XL_FIXED: 'layout-xl-footer-fixed' FOOTER_XL_FIXED: 'layout-xl-footer-fixed'
}; };
var Default = {
controlsidebarSlide: true,
scrollbarTheme: 'os-theme-light',
scrollbarAutoHide: 'l'
};
/** /**
* Class Definition * Class Definition
* ==================================================== * ====================================================
*/ */
var ControlSidebar = var ControlSidebar = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function ControlSidebar(element, config) { function ControlSidebar(element, config) {
this._element = element; this._element = element;
this._config = config; this._config = config;
@ -70,7 +73,7 @@
var _proto = ControlSidebar.prototype; var _proto = ControlSidebar.prototype;
_proto.show = function show() { _proto.collapse = function collapse() {
// Show the control sidebar // Show the control sidebar
if (this._config.controlsidebarSlide) { if (this._config.controlsidebarSlide) {
$('html').addClass(ClassName.CONTROL_SIDEBAR_ANIMATE); $('html').addClass(ClassName.CONTROL_SIDEBAR_ANIMATE);
@ -83,11 +86,11 @@
$('body').removeClass(ClassName.CONTROL_SIDEBAR_OPEN); $('body').removeClass(ClassName.CONTROL_SIDEBAR_OPEN);
} }
var expandedEvent = $.Event(Event.EXPANDED); var collapsedEvent = $.Event(Event.COLLAPSED);
$(this._element).trigger(expandedEvent); $(this._element).trigger(collapsedEvent);
}; };
_proto.collapse = function collapse() { _proto.show = function show() {
// Collapse the control sidebar // Collapse the control sidebar
if (this._config.controlsidebarSlide) { if (this._config.controlsidebarSlide) {
$('html').addClass(ClassName.CONTROL_SIDEBAR_ANIMATE); $('html').addClass(ClassName.CONTROL_SIDEBAR_ANIMATE);
@ -102,19 +105,19 @@
$('body').addClass(ClassName.CONTROL_SIDEBAR_OPEN); $('body').addClass(ClassName.CONTROL_SIDEBAR_OPEN);
} }
var collapsedEvent = $.Event(Event.COLLAPSED); var expandedEvent = $.Event(Event.EXPANDED);
$(this._element).trigger(collapsedEvent); $(this._element).trigger(expandedEvent);
}; };
_proto.toggle = function toggle() { _proto.toggle = function toggle() {
var shouldOpen = $('body').hasClass(ClassName.CONTROL_SIDEBAR_OPEN) || $('body').hasClass(ClassName.CONTROL_SIDEBAR_SLIDE); var shouldClose = $('body').hasClass(ClassName.CONTROL_SIDEBAR_OPEN) || $('body').hasClass(ClassName.CONTROL_SIDEBAR_SLIDE);
if (shouldOpen) { if (shouldClose) {
// Open the control sidebar
this.show();
} else {
// Close the control sidebar // Close the control sidebar
this.collapse(); this.collapse();
} else {
// Open the control sidebar
this.show();
} }
} // Private } // Private
; ;
@ -230,8 +233,10 @@
return this.each(function () { return this.each(function () {
var data = $(this).data(DATA_KEY); var data = $(this).data(DATA_KEY);
var _options = $.extend({}, Default, $(this).data());
if (!data) { if (!data) {
data = new ControlSidebar(this, $(this).data()); data = new ControlSidebar(this, _options);
$(this).data(DATA_KEY, data); $(this).data(DATA_KEY, data);
} }
@ -296,6 +301,8 @@
CONTENT_HEADER: '.content-header', CONTENT_HEADER: '.content-header',
WRAPPER: '.wrapper', WRAPPER: '.wrapper',
CONTROL_SIDEBAR: '.control-sidebar', CONTROL_SIDEBAR: '.control-sidebar',
CONTROL_SIDEBAR_CONTENT: '.control-sidebar-content',
CONTROL_SIDEBAR_BTN: '[data-widget="control-sidebar"]',
LAYOUT_FIXED: '.layout-fixed', LAYOUT_FIXED: '.layout-fixed',
FOOTER: '.main-footer', FOOTER: '.main-footer',
PUSHMENU_BTN: '[data-widget="pushmenu"]', PUSHMENU_BTN: '[data-widget="pushmenu"]',
@ -311,20 +318,22 @@
NAVBAR_FIXED: 'layout-navbar-fixed', NAVBAR_FIXED: 'layout-navbar-fixed',
FOOTER_FIXED: 'layout-footer-fixed', FOOTER_FIXED: 'layout-footer-fixed',
LOGIN_PAGE: 'login-page', LOGIN_PAGE: 'login-page',
REGISTER_PAGE: 'register-page' REGISTER_PAGE: 'register-page',
CONTROL_SIDEBAR_SLIDE_OPEN: 'control-sidebar-slide-open',
CONTROL_SIDEBAR_OPEN: 'control-sidebar-open'
}; };
var Default = { var Default = {
scrollbarTheme: 'os-theme-light', scrollbarTheme: 'os-theme-light',
scrollbarAutoHide: 'l' scrollbarAutoHide: 'l',
panelAutoHeight: true,
loginRegisterAutoHeight: true
}; };
/** /**
* Class Definition * Class Definition
* ==================================================== * ====================================================
*/ */
var Layout = var Layout = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Layout(element, config) { function Layout(element, config) {
this._config = config; this._config = config;
this._element = element; this._element = element;
@ -335,24 +344,47 @@
var _proto = Layout.prototype; var _proto = Layout.prototype;
_proto.fixLayoutHeight = function fixLayoutHeight() { _proto.fixLayoutHeight = function fixLayoutHeight(extra) {
if (extra === void 0) {
extra = null;
}
var 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();
}
var heights = { var heights = {
window: $(window).height(), window: $(window).height(),
header: $(Selector.HEADER).length !== 0 ? $(Selector.HEADER).outerHeight() : 0, header: $(Selector.HEADER).length !== 0 ? $(Selector.HEADER).outerHeight() : 0,
footer: $(Selector.FOOTER).length !== 0 ? $(Selector.FOOTER).outerHeight() : 0, footer: $(Selector.FOOTER).length !== 0 ? $(Selector.FOOTER).outerHeight() : 0,
sidebar: $(Selector.SIDEBAR).length !== 0 ? $(Selector.SIDEBAR).height() : 0 sidebar: $(Selector.SIDEBAR).length !== 0 ? $(Selector.SIDEBAR).height() : 0,
control_sidebar: control_sidebar
}; };
var max = this._max(heights); var max = this._max(heights);
if (max == heights.window) { var offset = this._config.panelAutoHeight;
$(Selector.CONTENT).css('min-height', max - heights.header - heights.footer);
} else { if (offset === true) {
$(Selector.CONTENT).css('min-height', max - heights.header); 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 ($('body').hasClass(ClassName.LAYOUT_FIXED)) { if ($('body').hasClass(ClassName.LAYOUT_FIXED)) {
$(Selector.CONTENT).css('min-height', max - heights.header - heights.footer); if (offset !== false) {
$(Selector.CONTENT).css('min-height', max + offset - heights.header - heights.footer);
}
if (typeof $.fn.overlayScrollbars !== 'undefined') { if (typeof $.fn.overlayScrollbars !== 'undefined') {
$(Selector.SIDEBAR).overlayScrollbars({ $(Selector.SIDEBAR).overlayScrollbars({
@ -365,6 +397,18 @@
}); });
} }
} }
};
_proto.fixLoginRegisterHeight = function 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) {
var box_height = $(Selector.LOGIN_BOX + ', ' + Selector.REGISTER_BOX).height();
if ($('body').css('min-height') !== box_height) {
$('body').css('min-height', box_height);
}
}
} // Private } // Private
; ;
@ -373,23 +417,27 @@
// Activate layout height watcher // Activate layout height watcher
this.fixLayoutHeight(); 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', function () { $(Selector.SIDEBAR).on('collapsed.lte.treeview expanded.lte.treeview', function () {
_this.fixLayoutHeight(); _this.fixLayoutHeight();
}); });
$(Selector.PUSHMENU_BTN).on('collapsed.lte.pushmenu shown.lte.pushmenu', function () { $(Selector.PUSHMENU_BTN).on('collapsed.lte.pushmenu shown.lte.pushmenu', function () {
_this.fixLayoutHeight(); _this.fixLayoutHeight();
}); });
$(Selector.CONTROL_SIDEBAR_BTN).on('collapsed.lte.controlsidebar', function () {
_this.fixLayoutHeight();
}).on('expanded.lte.controlsidebar', function () {
_this.fixLayoutHeight('control_sidebar');
});
$(window).resize(function () { $(window).resize(function () {
_this.fixLayoutHeight(); _this.fixLayoutHeight();
}); });
if (!$('body').hasClass(ClassName.LOGIN_PAGE) && !$('body').hasClass(ClassName.REGISTER_PAGE)) {
$('body, html').css('height', 'auto');
} else if ($('body').hasClass(ClassName.LOGIN_PAGE) || $('body').hasClass(ClassName.REGISTER_PAGE)) {
var box_height = $(Selector.LOGIN_BOX + ', ' + Selector.REGISTER_BOX).height();
$('body').css('min-height', box_height);
}
$('body.hold-transition').removeClass('hold-transition'); $('body.hold-transition').removeClass('hold-transition');
}; };
@ -406,17 +454,23 @@
; ;
Layout._jQueryInterface = function _jQueryInterface(config) { Layout._jQueryInterface = function _jQueryInterface(config) {
if (config === void 0) {
config = '';
}
return this.each(function () { return this.each(function () {
var data = $(this).data(DATA_KEY); var data = $(this).data(DATA_KEY);
var _config = $.extend({}, Default, $(this).data()); var _options = $.extend({}, Default, $(this).data());
if (!data) { if (!data) {
data = new Layout($(this), _config); data = new Layout($(this), _options);
$(this).data(DATA_KEY, data); $(this).data(DATA_KEY, data);
} }
if (config === 'init') { if (config === 'init' || config === '') {
data['_init']();
} else if (config === 'fixLayoutHeight' || config === 'fixLoginRegisterHeight') {
data[config](); data[config]();
} }
}); });
@ -488,18 +542,16 @@
WRAPPER: '.wrapper' WRAPPER: '.wrapper'
}; };
var ClassName = { var ClassName = {
SIDEBAR_OPEN: 'sidebar-open',
COLLAPSED: 'sidebar-collapse', COLLAPSED: 'sidebar-collapse',
OPEN: 'sidebar-open' OPEN: 'sidebar-open',
CLOSED: 'sidebar-closed'
}; };
/** /**
* Class Definition * Class Definition
* ==================================================== * ====================================================
*/ */
var PushMenu = var PushMenu = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function PushMenu(element, options) { function PushMenu(element, options) {
this._element = element; this._element = element;
this._options = $.extend({}, Default, options); this._options = $.extend({}, Default, options);
@ -514,14 +566,14 @@
var _proto = PushMenu.prototype; var _proto = PushMenu.prototype;
_proto.show = function show() { _proto.expand = function expand() {
if (this._options.autoCollapseSize) { if (this._options.autoCollapseSize) {
if ($(window).width() <= this._options.autoCollapseSize) { if ($(window).width() <= this._options.autoCollapseSize) {
$(Selector.BODY).addClass(ClassName.OPEN); $(Selector.BODY).addClass(ClassName.OPEN);
} }
} }
$(Selector.BODY).removeClass(ClassName.COLLAPSED); $(Selector.BODY).removeClass(ClassName.COLLAPSED).removeClass(ClassName.CLOSED);
if (this._options.enableRemember) { if (this._options.enableRemember) {
localStorage.setItem("remember" + EVENT_KEY, ClassName.OPEN); localStorage.setItem("remember" + EVENT_KEY, ClassName.OPEN);
@ -534,7 +586,7 @@
_proto.collapse = function collapse() { _proto.collapse = function collapse() {
if (this._options.autoCollapseSize) { if (this._options.autoCollapseSize) {
if ($(window).width() <= this._options.autoCollapseSize) { if ($(window).width() <= this._options.autoCollapseSize) {
$(Selector.BODY).removeClass(ClassName.OPEN); $(Selector.BODY).removeClass(ClassName.OPEN).addClass(ClassName.CLOSED);
} }
} }
@ -552,7 +604,7 @@
if (!$(Selector.BODY).hasClass(ClassName.COLLAPSED)) { if (!$(Selector.BODY).hasClass(ClassName.COLLAPSED)) {
this.collapse(); this.collapse();
} else { } else {
this.show(); this.expand();
} }
}; };
@ -569,6 +621,8 @@
} else if (resize == true) { } else if (resize == true) {
if ($(Selector.BODY).hasClass(ClassName.OPEN)) { if ($(Selector.BODY).hasClass(ClassName.OPEN)) {
$(Selector.BODY).removeClass(ClassName.OPEN); $(Selector.BODY).removeClass(ClassName.OPEN);
} else if ($(Selector.BODY).hasClass(ClassName.CLOSED)) {
this.expand();
} }
} }
} }
@ -635,7 +689,7 @@
$(this).data(DATA_KEY, data); $(this).data(DATA_KEY, data);
} }
if (operation === 'toggle') { if (typeof operation === 'string' && operation.match(/collapse|expand|toggle/)) {
data[operation](); data[operation]();
} }
}); });
@ -710,21 +764,22 @@
LI: 'nav-item', LI: 'nav-item',
LINK: 'nav-link', LINK: 'nav-link',
TREEVIEW_MENU: 'nav-treeview', TREEVIEW_MENU: 'nav-treeview',
OPEN: 'menu-open' OPEN: 'menu-open',
SIDEBAR_COLLAPSED: 'sidebar-collapse'
}; };
var Default = { var Default = {
trigger: Selector.DATA_WIDGET + " " + Selector.LINK, trigger: Selector.DATA_WIDGET + " " + Selector.LINK,
animationSpeed: 300, animationSpeed: 300,
accordion: true accordion: true,
expandSidebar: false,
sidebarButtonSelector: '[data-widget="pushmenu"]'
}; };
/** /**
* Class Definition * Class Definition
* ==================================================== * ====================================================
*/ */
var Treeview = var Treeview = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Treeview(element, config) { function Treeview(element, config) {
this._config = config; this._config = config;
this._element = element; this._element = element;
@ -752,6 +807,10 @@
parentLi.addClass(ClassName.OPEN); parentLi.addClass(ClassName.OPEN);
$(_this._element).trigger(expandedEvent); $(_this._element).trigger(expandedEvent);
}); });
if (this._config.expandSidebar) {
this._expandSidebar();
}
}; };
_proto.collapse = function collapse(treeviewMenu, parentLi) { _proto.collapse = function collapse(treeviewMenu, parentLi) {
@ -799,6 +858,12 @@
$(document).on('click', this._config.trigger, function (event) { $(document).on('click', this._config.trigger, function (event) {
_this3.toggle(event); _this3.toggle(event);
}); });
};
_proto._expandSidebar = function _expandSidebar() {
if ($('body').hasClass(ClassName.SIDEBAR_COLLAPSED)) {
$(this._config.sidebarButtonSelector).PushMenu('expand');
}
} // Static } // Static
; ;
@ -806,10 +871,10 @@
return this.each(function () { return this.each(function () {
var data = $(this).data(DATA_KEY); var data = $(this).data(DATA_KEY);
var _config = $.extend({}, Default, $(this).data()); var _options = $.extend({}, Default, $(this).data());
if (!data) { if (!data) {
data = new Treeview($(this), _config); data = new Treeview($(this), _options);
$(this).data(DATA_KEY, data); $(this).data(DATA_KEY, data);
} }
@ -877,9 +942,7 @@
* ==================================================== * ====================================================
*/ */
var DirectChat = var DirectChat = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function DirectChat(element, config) { function DirectChat(element, config) {
this._element = element; this._element = element;
} }
@ -969,9 +1032,7 @@
* ==================================================== * ====================================================
*/ */
var TodoList = var TodoList = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function TodoList(element, config) { function TodoList(element, config) {
this._config = config; this._config = config;
this._element = element; this._element = element;
@ -1015,10 +1076,10 @@
return this.each(function () { return this.each(function () {
var data = $(this).data(DATA_KEY); var data = $(this).data(DATA_KEY);
var _config = $.extend({}, Default, $(this).data()); var _options = $.extend({}, Default, $(this).data());
if (!data) { if (!data) {
data = new TodoList($(this), _config); data = new TodoList($(this), _options);
$(this).data(DATA_KEY, data); $(this).data(DATA_KEY, data);
} }
@ -1080,6 +1141,8 @@
var ClassName = { var ClassName = {
CARD: 'card', CARD: 'card',
COLLAPSED: 'collapsed-card', COLLAPSED: 'collapsed-card',
COLLAPSING: 'collapsing-card',
EXPANDING: 'expanding-card',
WAS_COLLAPSED: 'was-collapsed', WAS_COLLAPSED: 'was-collapsed',
MAXIMIZED: 'maximized-card' MAXIMIZED: 'maximized-card'
}; };
@ -1104,9 +1167,7 @@
minimizeIcon: 'fa-compress' minimizeIcon: 'fa-compress'
}; };
var CardWidget = var CardWidget = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function CardWidget(element, settings) { function CardWidget(element, settings) {
this._element = element; this._element = element;
this._parent = element.parents(Selector.CARD).first(); this._parent = element.parents(Selector.CARD).first();
@ -1123,11 +1184,11 @@
_proto.collapse = function collapse() { _proto.collapse = function collapse() {
var _this = this; var _this = this;
this._parent.children(Selector.CARD_BODY + ", " + Selector.CARD_FOOTER).slideUp(this._settings.animationSpeed, function () { this._parent.addClass(ClassName.COLLAPSING).children(Selector.CARD_BODY + ", " + Selector.CARD_FOOTER).slideUp(this._settings.animationSpeed, function () {
_this._parent.addClass(ClassName.COLLAPSED); _this._parent.addClass(ClassName.COLLAPSED).removeClass(ClassName.COLLAPSING);
}); });
this._parent.find(this._settings.collapseTrigger + ' .' + this._settings.collapseIcon).addClass(this._settings.expandIcon).removeClass(this._settings.collapseIcon); this._parent.find('> ' + Selector.CARD_HEADER + ' ' + this._settings.collapseTrigger + ' .' + this._settings.collapseIcon).addClass(this._settings.expandIcon).removeClass(this._settings.collapseIcon);
var collapsed = $.Event(Event.COLLAPSED); var collapsed = $.Event(Event.COLLAPSED);
@ -1137,11 +1198,11 @@
_proto.expand = function expand() { _proto.expand = function expand() {
var _this2 = this; var _this2 = this;
this._parent.children(Selector.CARD_BODY + ", " + Selector.CARD_FOOTER).slideDown(this._settings.animationSpeed, function () { this._parent.addClass(ClassName.EXPANDING).children(Selector.CARD_BODY + ", " + Selector.CARD_FOOTER).slideDown(this._settings.animationSpeed, function () {
_this2._parent.removeClass(ClassName.COLLAPSED); _this2._parent.removeClass(ClassName.COLLAPSED).removeClass(ClassName.EXPANDING);
}); });
this._parent.find(this._settings.collapseTrigger + ' .' + this._settings.expandIcon).addClass(this._settings.collapseIcon).removeClass(this._settings.expandIcon); this._parent.find('> ' + Selector.CARD_HEADER + ' ' + this._settings.collapseTrigger + ' .' + this._settings.expandIcon).addClass(this._settings.collapseIcon).removeClass(this._settings.expandIcon);
var expanded = $.Event(Event.EXPANDED); var expanded = $.Event(Event.EXPANDED);
@ -1240,8 +1301,10 @@
CardWidget._jQueryInterface = function _jQueryInterface(config) { CardWidget._jQueryInterface = function _jQueryInterface(config) {
var data = $(this).data(DATA_KEY); var data = $(this).data(DATA_KEY);
var _options = $.extend({}, Default, $(this).data());
if (!data) { if (!data) {
data = new CardWidget($(this), data); data = new CardWidget($(this), _options);
$(this).data(DATA_KEY, typeof config === 'string' ? data : config); $(this).data(DATA_KEY, typeof config === 'string' ? data : config);
} }
@ -1340,9 +1403,7 @@
} }
}; };
var CardRefresh = var CardRefresh = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function CardRefresh(element, settings) { function CardRefresh(element, settings) {
this._element = element; this._element = element;
this._parent = element.parents(Selector.CARD).first(); this._parent = element.parents(Selector.CARD).first();
@ -1356,12 +1417,6 @@
if (this._settings.source === '') { if (this._settings.source === '') {
throw new Error('Source url was not defined. Please specify a url in your CardRefresh source option.'); throw new Error('Source url was not defined. Please specify a url in your CardRefresh source option.');
} }
this._init();
if (this._settings.loadOnInit) {
this.load();
}
} }
var _proto = CardRefresh.prototype; var _proto = CardRefresh.prototype;
@ -1409,21 +1464,26 @@
$(this).find(this._settings.trigger).on('click', function () { $(this).find(this._settings.trigger).on('click', function () {
_this.load(); _this.load();
}); });
if (this._settings.loadOnInit) {
this.load();
}
} // Static } // Static
; ;
CardRefresh._jQueryInterface = function _jQueryInterface(config) { CardRefresh._jQueryInterface = function _jQueryInterface(config) {
var data = $(this).data(DATA_KEY); var data = $(this).data(DATA_KEY);
var options = $(this).data();
var _options = $.extend({}, Default, $(this).data());
if (!data) { if (!data) {
data = new CardRefresh($(this), options); data = new CardRefresh($(this), _options);
$(this).data(DATA_KEY, typeof config === 'string' ? data : config); $(this).data(DATA_KEY, typeof config === 'string' ? data : config);
} }
if (typeof config === 'string' && config.match(/load/)) { if (typeof config === 'string' && config.match(/load/)) {
data[config](); data[config]();
} else if (typeof config === 'object') { } else {
data._init($(this)); data._init($(this));
} }
}; };
@ -1443,6 +1503,11 @@
CardRefresh._jQueryInterface.call($(this), 'load'); CardRefresh._jQueryInterface.call($(this), 'load');
}); });
$(document).ready(function () {
$(Selector.DATA_REFRESH).each(function () {
CardRefresh._jQueryInterface.call($(this));
});
});
/** /**
* jQuery API * jQuery API
* ==================================================== * ====================================================
@ -1474,18 +1539,22 @@
var DATA_KEY = 'lte.dropdown'; var DATA_KEY = 'lte.dropdown';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var Selector = { var Selector = {
DROPDOWN_MENU: 'ul.dropdown-menu', NAVBAR: '.navbar',
DROPDOWN_MENU: '.dropdown-menu',
DROPDOWN_MENU_ACTIVE: '.dropdown-menu.show',
DROPDOWN_TOGGLE: '[data-toggle="dropdown"]' DROPDOWN_TOGGLE: '[data-toggle="dropdown"]'
}; };
var ClassName = {
DROPDOWN_HOVER: 'dropdown-hover',
DROPDOWN_RIGHT: 'dropdown-menu-right'
};
var Default = {}; var Default = {};
/** /**
* Class Definition * Class Definition
* ==================================================== * ====================================================
*/ */
var Dropdown = var Dropdown = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Dropdown(element, config) { function Dropdown(element, config) {
this._config = config; this._config = config;
this._element = element; this._element = element;
@ -1504,6 +1573,35 @@
this._element.parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function (e) { this._element.parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function (e) {
$('.dropdown-submenu .show').removeClass("show").hide(); $('.dropdown-submenu .show').removeClass("show").hide();
}); });
};
_proto.fixPosition = function fixPosition() {
var 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');
}
var offset = elm.offset();
var width = elm.width();
var windowWidth = $(window).width();
var 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
; ;
@ -1518,7 +1616,7 @@
$(this).data(DATA_KEY, data); $(this).data(DATA_KEY, data);
} }
if (config === 'toggleSubmenu') { if (config === 'toggleSubmenu' || config == 'fixPosition') {
data[config](); data[config]();
} }
}); });
@ -1537,13 +1635,13 @@
event.stopPropagation(); event.stopPropagation();
Dropdown._jQueryInterface.call($(this), 'toggleSubmenu'); Dropdown._jQueryInterface.call($(this), 'toggleSubmenu');
}); // $(Selector.SIDEBAR + ' a').on('focusin', () => { });
// $(Selector.MAIN_SIDEBAR).addClass(ClassName.SIDEBAR_FOCUSED); $(Selector.NAVBAR + ' ' + Selector.DROPDOWN_TOGGLE).on("click", function (event) {
// }) event.preventDefault();
// $(Selector.SIDEBAR + ' a').on('focusout', () => { setTimeout(function () {
// $(Selector.MAIN_SIDEBAR).removeClass(ClassName.SIDEBAR_FOCUSED); Dropdown._jQueryInterface.call($(this), 'fixPosition');
// }) }, 1);
});
/** /**
* jQuery API * jQuery API
* ==================================================== * ====================================================
@ -1622,9 +1720,7 @@
* ==================================================== * ====================================================
*/ */
var Toasts = var Toasts = /*#__PURE__*/function () {
/*#__PURE__*/
function () {
function Toasts(element, config) { function Toasts(element, config) {
this._config = config; this._config = config;
@ -1744,9 +1840,9 @@
Toasts._jQueryInterface = function _jQueryInterface(option, config) { Toasts._jQueryInterface = function _jQueryInterface(option, config) {
return this.each(function () { return this.each(function () {
var _config = $.extend({}, Default, config); var _options = $.extend({}, Default, config);
var toast = new Toasts($(this), _config); var toast = new Toasts($(this), _options);
if (option === 'create') { if (option === 'create') {
toast[option](); toast[option]();
@ -1786,5 +1882,5 @@
Object.defineProperty(exports, '__esModule', { value: true }); Object.defineProperty(exports, '__esModule', { value: true });
})); })));
//# sourceMappingURL=adminlte.js.map //# sourceMappingURL=adminlte.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,413 +0,0 @@
/**
* AdminLTE Demo Menu
* ------------------
* You should not use this file in production.
* This file is for demo purposes only.
*/
(function ($) {
'use strict'
var $sidebar = $('.control-sidebar')
var $container = $('<div />', {
class: 'p-3 control-sidebar-content'
})
$sidebar.append($container)
var navbar_dark_skins = [
'navbar-primary',
'navbar-secondary',
'navbar-info',
'navbar-success',
'navbar-danger',
'navbar-indigo',
'navbar-purple',
'navbar-pink',
'navbar-teal',
'navbar-cyan',
'navbar-dark',
'navbar-gray-dark',
'navbar-gray',
]
var navbar_light_skins = [
'navbar-light',
'navbar-warning',
'navbar-white',
'navbar-orange',
]
$container.append(
'<h5>Customize AdminLTE</h5><hr class="mb-2"/>'
)
var $no_border_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('.main-header').hasClass('border-bottom-0'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('.main-header').addClass('border-bottom-0')
} else {
$('.main-header').removeClass('border-bottom-0')
}
})
var $no_border_container = $('<div />', {'class': 'mb-1'}).append($no_border_checkbox).append('<span>No Navbar border</span>')
$container.append($no_border_container)
var $text_sm_body_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('body').hasClass('text-sm'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('body').addClass('text-sm')
} else {
$('body').removeClass('text-sm')
}
})
var $text_sm_body_container = $('<div />', {'class': 'mb-1'}).append($text_sm_body_checkbox).append('<span>Body small text</span>')
$container.append($text_sm_body_container)
var $text_sm_header_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('.main-header').hasClass('text-sm'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('.main-header').addClass('text-sm')
} else {
$('.main-header').removeClass('text-sm')
}
})
var $text_sm_header_container = $('<div />', {'class': 'mb-1'}).append($text_sm_header_checkbox).append('<span>Navbar small text</span>')
$container.append($text_sm_header_container)
var $text_sm_sidebar_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('.nav-sidebar').hasClass('text-sm'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('.nav-sidebar').addClass('text-sm')
} else {
$('.nav-sidebar').removeClass('text-sm')
}
})
var $text_sm_sidebar_container = $('<div />', {'class': 'mb-1'}).append($text_sm_sidebar_checkbox).append('<span>Sidebar nav small text</span>')
$container.append($text_sm_sidebar_container)
var $text_sm_footer_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('.main-footer').hasClass('text-sm'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('.main-footer').addClass('text-sm')
} else {
$('.main-footer').removeClass('text-sm')
}
})
var $text_sm_footer_container = $('<div />', {'class': 'mb-1'}).append($text_sm_footer_checkbox).append('<span>Footer small text</span>')
$container.append($text_sm_footer_container)
var $flat_sidebar_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('.nav-sidebar').hasClass('nav-flat'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('.nav-sidebar').addClass('nav-flat')
} else {
$('.nav-sidebar').removeClass('nav-flat')
}
})
var $flat_sidebar_container = $('<div />', {'class': 'mb-1'}).append($flat_sidebar_checkbox).append('<span>Sidebar nav flat style</span>')
$container.append($flat_sidebar_container)
var $legacy_sidebar_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('.nav-sidebar').hasClass('nav-legacy'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('.nav-sidebar').addClass('nav-legacy')
} else {
$('.nav-sidebar').removeClass('nav-legacy')
}
})
var $legacy_sidebar_container = $('<div />', {'class': 'mb-1'}).append($legacy_sidebar_checkbox).append('<span>Sidebar nav legacy style</span>')
$container.append($legacy_sidebar_container)
var $compact_sidebar_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('.nav-sidebar').hasClass('nav-compact'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('.nav-sidebar').addClass('nav-compact')
} else {
$('.nav-sidebar').removeClass('nav-compact')
}
})
var $compact_sidebar_container = $('<div />', {'class': 'mb-1'}).append($compact_sidebar_checkbox).append('<span>Sidebar nav compact</span>')
$container.append($compact_sidebar_container)
var $child_indent_sidebar_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('.nav-sidebar').hasClass('nav-child-indent'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('.nav-sidebar').addClass('nav-child-indent')
} else {
$('.nav-sidebar').removeClass('nav-child-indent')
}
})
var $child_indent_sidebar_container = $('<div />', {'class': 'mb-1'}).append($child_indent_sidebar_checkbox).append('<span>Sidebar nav child indent</span>')
$container.append($child_indent_sidebar_container)
var $no_expand_sidebar_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('.main-sidebar').hasClass('sidebar-no-expand'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('.main-sidebar').addClass('sidebar-no-expand')
} else {
$('.main-sidebar').removeClass('sidebar-no-expand')
}
})
var $no_expand_sidebar_container = $('<div />', {'class': 'mb-1'}).append($no_expand_sidebar_checkbox).append('<span>Main Sidebar disable hover/focus auto expand</span>')
$container.append($no_expand_sidebar_container)
var $text_sm_brand_checkbox = $('<input />', {
type : 'checkbox',
value : 1,
checked: $('.brand-link').hasClass('text-sm'),
'class': 'mr-1'
}).on('click', function () {
if ($(this).is(':checked')) {
$('.brand-link').addClass('text-sm')
} else {
$('.brand-link').removeClass('text-sm')
}
})
var $text_sm_brand_container = $('<div />', {'class': 'mb-4'}).append($text_sm_brand_checkbox).append('<span>Brand small text</span>')
$container.append($text_sm_brand_container)
$container.append('<h6>Navbar Variants</h6>')
var $navbar_variants = $('<div />', {
'class': 'd-flex'
})
var navbar_all_colors = navbar_dark_skins.concat(navbar_light_skins)
var $navbar_variants_colors = createSkinBlock(navbar_all_colors, function (e) {
var color = $(this).data('color')
var $main_header = $('.main-header')
$main_header.removeClass('navbar-dark').removeClass('navbar-light')
navbar_all_colors.map(function (color) {
$main_header.removeClass(color)
})
if (navbar_dark_skins.indexOf(color) > -1) {
$main_header.addClass('navbar-dark')
} else {
$main_header.addClass('navbar-light')
}
$main_header.addClass(color)
})
$navbar_variants.append($navbar_variants_colors)
$container.append($navbar_variants)
var sidebar_colors = [
'bg-primary',
'bg-warning',
'bg-info',
'bg-danger',
'bg-success',
'bg-indigo',
'bg-navy',
'bg-purple',
'bg-fuchsia',
'bg-pink',
'bg-maroon',
'bg-orange',
'bg-lime',
'bg-teal',
'bg-olive'
]
var accent_colors = [
'accent-primary',
'accent-warning',
'accent-info',
'accent-danger',
'accent-success',
'accent-indigo',
'accent-navy',
'accent-purple',
'accent-fuchsia',
'accent-pink',
'accent-maroon',
'accent-orange',
'accent-lime',
'accent-teal',
'accent-olive'
]
var sidebar_skins = [
'sidebar-dark-primary',
'sidebar-dark-warning',
'sidebar-dark-info',
'sidebar-dark-danger',
'sidebar-dark-success',
'sidebar-dark-indigo',
'sidebar-dark-navy',
'sidebar-dark-purple',
'sidebar-dark-fuchsia',
'sidebar-dark-pink',
'sidebar-dark-maroon',
'sidebar-dark-orange',
'sidebar-dark-lime',
'sidebar-dark-teal',
'sidebar-dark-olive',
'sidebar-light-primary',
'sidebar-light-warning',
'sidebar-light-info',
'sidebar-light-danger',
'sidebar-light-success',
'sidebar-light-indigo',
'sidebar-light-navy',
'sidebar-light-purple',
'sidebar-light-fuchsia',
'sidebar-light-pink',
'sidebar-light-maroon',
'sidebar-light-orange',
'sidebar-light-lime',
'sidebar-light-teal',
'sidebar-light-olive'
]
$container.append('<h6>Accent Color Variants</h6>')
var $accent_variants = $('<div />', {
'class': 'd-flex'
})
$container.append($accent_variants)
$container.append(createSkinBlock(accent_colors, function () {
var color = $(this).data('color')
var accent_class = color
var $body = $('body')
accent_colors.map(function (skin) {
$body.removeClass(skin)
})
$body.addClass(accent_class)
}))
$container.append('<h6>Dark Sidebar Variants</h6>')
var $sidebar_variants = $('<div />', {
'class': 'd-flex'
})
$container.append($sidebar_variants)
$container.append(createSkinBlock(sidebar_colors, function () {
var color = $(this).data('color')
var sidebar_class = 'sidebar-dark-' + color.replace('bg-', '')
var $sidebar = $('.main-sidebar')
sidebar_skins.map(function (skin) {
$sidebar.removeClass(skin)
})
$sidebar.addClass(sidebar_class)
}))
$container.append('<h6>Light Sidebar Variants</h6>')
var $sidebar_variants = $('<div />', {
'class': 'd-flex'
})
$container.append($sidebar_variants)
$container.append(createSkinBlock(sidebar_colors, function () {
var color = $(this).data('color')
var sidebar_class = 'sidebar-light-' + color.replace('bg-', '')
var $sidebar = $('.main-sidebar')
sidebar_skins.map(function (skin) {
$sidebar.removeClass(skin)
})
$sidebar.addClass(sidebar_class)
}))
var logo_skins = navbar_all_colors
$container.append('<h6>Brand Logo Variants</h6>')
var $logo_variants = $('<div />', {
'class': 'd-flex'
})
$container.append($logo_variants)
var $clear_btn = $('<a />', {
href: 'javascript:void(0)'
}).text('clear').on('click', function () {
var $logo = $('.brand-link')
logo_skins.map(function (skin) {
$logo.removeClass(skin)
})
})
$container.append(createSkinBlock(logo_skins, function () {
var color = $(this).data('color')
var $logo = $('.brand-link')
logo_skins.map(function (skin) {
$logo.removeClass(skin)
})
$logo.addClass(color)
}).append($clear_btn))
function createSkinBlock(colors, callback) {
var $block = $('<div />', {
'class': 'd-flex flex-wrap mb-3'
})
colors.map(function (color) {
var $color = $('<div />', {
'class': (typeof color === 'object' ? color.join(' ') : color).replace('navbar-', 'bg-').replace('accent-', 'bg-') + ' elevation-2'
})
$block.append($color)
$color.data('color', color)
$color.css({
width : '40px',
height : '20px',
borderRadius: '25px',
marginRight : 10,
marginBottom: 10,
opacity : 0.8,
cursor : 'pointer'
})
$color.hover(function () {
$(this).css({ opacity: 1 }).removeClass('elevation-2').addClass('elevation-4')
}, function () {
$(this).css({ opacity: 0.8 }).removeClass('elevation-4').addClass('elevation-2')
})
if (callback) {
$color.on('click', callback)
}
})
return $block
}
})(jQuery)

View File

@ -1,264 +0,0 @@
/*
* Author: Abdullah A Almsaeed
* Date: 4 Jan 2014
* Description:
* This is a demo file used only for the main dashboard (index.html)
**/
$(function () {
'use strict'
// Make the dashboard widgets sortable Using jquery UI
$('.connectedSortable').sortable({
placeholder : 'sort-highlight',
connectWith : '.connectedSortable',
handle : '.card-header, .nav-tabs',
forcePlaceholderSize: true,
zIndex : 999999
})
$('.connectedSortable .card-header, .connectedSortable .nav-tabs-custom').css('cursor', 'move')
// jQuery UI sortable for the todo list
$('.todo-list').sortable({
placeholder : 'sort-highlight',
handle : '.handle',
forcePlaceholderSize: true,
zIndex : 999999
})
// bootstrap WYSIHTML5 - text editor
$('.textarea').summernote()
$('.daterange').daterangepicker({
ranges : {
'Today' : [moment(), moment()],
'Yesterday' : [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
'Last 7 Days' : [moment().subtract(6, 'days'), moment()],
'Last 30 Days': [moment().subtract(29, 'days'), moment()],
'This Month' : [moment().startOf('month'), moment().endOf('month')],
'Last Month' : [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
},
startDate: moment().subtract(29, 'days'),
endDate : moment()
}, function (start, end) {
window.alert('You chose: ' + start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'))
})
/* jQueryKnob */
$('.knob').knob()
// jvectormap data
var visitorsData = {
'US': 398, //USA
'SA': 400, //Saudi Arabia
'CA': 1000, //Canada
'DE': 500, //Germany
'FR': 760, //France
'CN': 300, //China
'AU': 700, //Australia
'BR': 600, //Brazil
'IN': 800, //India
'GB': 320, //Great Britain
'RU': 3000 //Russia
}
// World map by jvectormap
$('#world-map').vectorMap({
map : 'usa_en',
backgroundColor : 'transparent',
regionStyle : {
initial: {
fill : 'rgba(255, 255, 255, 0.7)',
'fill-opacity' : 1,
stroke : 'rgba(0,0,0,.2)',
'stroke-width' : 1,
'stroke-opacity': 1
}
},
series : {
regions: [{
values : visitorsData,
scale : ['#ffffff', '#0154ad'],
normalizeFunction: 'polynomial'
}]
},
onRegionLabelShow: function (e, el, code) {
if (typeof visitorsData[code] != 'undefined')
el.html(el.html() + ': ' + visitorsData[code] + ' new visitors')
}
})
// Sparkline charts
var sparkline1 = new Sparkline($("#sparkline-1")[0], {width: 80, height: 50, lineColor: '#92c1dc', endColor: '#ebf4f9'});
var sparkline2 = new Sparkline($("#sparkline-2")[0], {width: 80, height: 50, lineColor: '#92c1dc', endColor: '#ebf4f9'});
var sparkline3 = new Sparkline($("#sparkline-3")[0], {width: 80, height: 50, lineColor: '#92c1dc', endColor: '#ebf4f9'});
sparkline1.draw([1000, 1200, 920, 927, 931, 1027, 819, 930, 1021]);
sparkline2.draw([515, 519, 520, 522, 652, 810, 370, 627, 319, 630, 921]);
sparkline3.draw([15, 19, 20, 22, 33, 27, 31, 27, 19, 30, 21]);
// The Calender
$('#calendar').datetimepicker({
format: 'L',
inline: true
})
// SLIMSCROLL FOR CHAT WIDGET
$('#chat-box').overlayScrollbars({
height: '250px'
})
/* Chart.js Charts */
// Sales chart
var salesChartCanvas = document.getElementById('revenue-chart-canvas').getContext('2d');
//$('#revenue-chart').get(0).getContext('2d');
var salesChartData = {
labels : ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
datasets: [
{
label : 'Digital Goods',
backgroundColor : 'rgba(60,141,188,0.9)',
borderColor : 'rgba(60,141,188,0.8)',
pointRadius : false,
pointColor : '#3b8bba',
pointStrokeColor : 'rgba(60,141,188,1)',
pointHighlightFill : '#fff',
pointHighlightStroke: 'rgba(60,141,188,1)',
data : [28, 48, 40, 19, 86, 27, 90]
},
{
label : 'Electronics',
backgroundColor : 'rgba(210, 214, 222, 1)',
borderColor : 'rgba(210, 214, 222, 1)',
pointRadius : false,
pointColor : 'rgba(210, 214, 222, 1)',
pointStrokeColor : '#c1c7d1',
pointHighlightFill : '#fff',
pointHighlightStroke: 'rgba(220,220,220,1)',
data : [65, 59, 80, 81, 56, 55, 40]
},
]
}
var salesChartOptions = {
maintainAspectRatio : false,
responsive : true,
legend: {
display: false
},
scales: {
xAxes: [{
gridLines : {
display : false,
}
}],
yAxes: [{
gridLines : {
display : false,
}
}]
}
}
// This will get the first returned node in the jQuery collection.
var salesChart = new Chart(salesChartCanvas, {
type: 'line',
data: salesChartData,
options: salesChartOptions
}
)
// Donut Chart
var pieChartCanvas = $('#sales-chart-canvas').get(0).getContext('2d')
var pieData = {
labels: [
'Instore Sales',
'Download Sales',
'Mail-Order Sales',
],
datasets: [
{
data: [30,12,20],
backgroundColor : ['#f56954', '#00a65a', '#f39c12'],
}
]
}
var pieOptions = {
legend: {
display: false
},
maintainAspectRatio : false,
responsive : true,
}
//Create pie or douhnut chart
// You can switch between pie and douhnut using the method below.
var pieChart = new Chart(pieChartCanvas, {
type: 'doughnut',
data: pieData,
options: pieOptions
});
// Sales graph chart
var salesGraphChartCanvas = $('#line-chart').get(0).getContext('2d');
//$('#revenue-chart').get(0).getContext('2d');
var salesGraphChartData = {
labels : ['2011 Q1', '2011 Q2', '2011 Q3', '2011 Q4', '2012 Q1', '2012 Q2', '2012 Q3', '2012 Q4', '2013 Q1', '2013 Q2'],
datasets: [
{
label : 'Digital Goods',
fill : false,
borderWidth : 2,
lineTension : 0,
spanGaps : true,
borderColor : '#efefef',
pointRadius : 3,
pointHoverRadius : 7,
pointColor : '#efefef',
pointBackgroundColor: '#efefef',
data : [2666, 2778, 4912, 3767, 6810, 5670, 4820, 15073, 10687, 8432]
}
]
}
var salesGraphChartOptions = {
maintainAspectRatio : false,
responsive : true,
legend: {
display: false,
},
scales: {
xAxes: [{
ticks : {
fontColor: '#efefef',
},
gridLines : {
display : false,
color: '#efefef',
drawBorder: false,
}
}],
yAxes: [{
ticks : {
stepSize: 5000,
fontColor: '#efefef',
},
gridLines : {
display : true,
color: '#efefef',
drawBorder: false,
}
}]
}
}
// This will get the first returned node in the jQuery collection.
var salesGraphChart = new Chart(salesGraphChartCanvas, {
type: 'line',
data: salesGraphChartData,
options: salesGraphChartOptions
}
)
})

View File

@ -1,267 +0,0 @@
$(function () {
'use strict'
/* ChartJS
* -------
* Here we will create a few charts using ChartJS
*/
//-----------------------
//- MONTHLY SALES CHART -
//-----------------------
// Get context with jQuery - using jQuery's .get() method.
var salesChartCanvas = $('#salesChart').get(0).getContext('2d')
var salesChartData = {
labels : ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
datasets: [
{
label : 'Digital Goods',
backgroundColor : 'rgba(60,141,188,0.9)',
borderColor : 'rgba(60,141,188,0.8)',
pointRadius : false,
pointColor : '#3b8bba',
pointStrokeColor : 'rgba(60,141,188,1)',
pointHighlightFill : '#fff',
pointHighlightStroke: 'rgba(60,141,188,1)',
data : [28, 48, 40, 19, 86, 27, 90]
},
{
label : 'Electronics',
backgroundColor : 'rgba(210, 214, 222, 1)',
borderColor : 'rgba(210, 214, 222, 1)',
pointRadius : false,
pointColor : 'rgba(210, 214, 222, 1)',
pointStrokeColor : '#c1c7d1',
pointHighlightFill : '#fff',
pointHighlightStroke: 'rgba(220,220,220,1)',
data : [65, 59, 80, 81, 56, 55, 40]
},
]
}
var salesChartOptions = {
maintainAspectRatio : false,
responsive : true,
legend: {
display: false
},
scales: {
xAxes: [{
gridLines : {
display : false,
}
}],
yAxes: [{
gridLines : {
display : false,
}
}]
}
}
// This will get the first returned node in the jQuery collection.
var salesChart = new Chart(salesChartCanvas, {
type: 'line',
data: salesChartData,
options: salesChartOptions
}
)
//---------------------------
//- END MONTHLY SALES CHART -
//---------------------------
//-------------
//- PIE CHART -
//-------------
// Get context with jQuery - using jQuery's .get() method.
var pieChartCanvas = $('#pieChart').get(0).getContext('2d')
var pieData = {
labels: [
'Chrome',
'IE',
'FireFox',
'Safari',
'Opera',
'Navigator',
],
datasets: [
{
data: [700,500,400,600,300,100],
backgroundColor : ['#f56954', '#00a65a', '#f39c12', '#00c0ef', '#3c8dbc', '#d2d6de'],
}
]
}
var pieOptions = {
legend: {
display: false
}
}
//Create pie or douhnut chart
// You can switch between pie and douhnut using the method below.
var pieChart = new Chart(pieChartCanvas, {
type: 'doughnut',
data: pieData,
options: pieOptions
})
//-----------------
//- END PIE CHART -
//-----------------
/* jVector Maps
* ------------
* Create a world map with markers
*/
$('#world-map-markers').mapael({
map: {
name : "usa_states",
zoom: {
enabled: true,
maxLevel: 10
},
},
}
);
// $('#world-map-markers').vectorMap({
// map : 'world_en',
// normalizeFunction: 'polynomial',
// hoverOpacity : 0.7,
// hoverColor : false,
// backgroundColor : 'transparent',
// regionStyle : {
// initial : {
// fill : 'rgba(210, 214, 222, 1)',
// 'fill-opacity' : 1,
// stroke : 'none',
// 'stroke-width' : 0,
// 'stroke-opacity': 1
// },
// hover : {
// 'fill-opacity': 0.7,
// cursor : 'pointer'
// },
// selected : {
// fill: 'yellow'
// },
// selectedHover: {}
// },
// markerStyle : {
// initial: {
// fill : '#00a65a',
// stroke: '#111'
// }
// },
// markers : [
// {
// latLng: [41.90, 12.45],
// name : 'Vatican City'
// },
// {
// latLng: [43.73, 7.41],
// name : 'Monaco'
// },
// {
// latLng: [-0.52, 166.93],
// name : 'Nauru'
// },
// {
// latLng: [-8.51, 179.21],
// name : 'Tuvalu'
// },
// {
// latLng: [43.93, 12.46],
// name : 'San Marino'
// },
// {
// latLng: [47.14, 9.52],
// name : 'Liechtenstein'
// },
// {
// latLng: [7.11, 171.06],
// name : 'Marshall Islands'
// },
// {
// latLng: [17.3, -62.73],
// name : 'Saint Kitts and Nevis'
// },
// {
// latLng: [3.2, 73.22],
// name : 'Maldives'
// },
// {
// latLng: [35.88, 14.5],
// name : 'Malta'
// },
// {
// latLng: [12.05, -61.75],
// name : 'Grenada'
// },
// {
// latLng: [13.16, -61.23],
// name : 'Saint Vincent and the Grenadines'
// },
// {
// latLng: [13.16, -59.55],
// name : 'Barbados'
// },
// {
// latLng: [17.11, -61.85],
// name : 'Antigua and Barbuda'
// },
// {
// latLng: [-4.61, 55.45],
// name : 'Seychelles'
// },
// {
// latLng: [7.35, 134.46],
// name : 'Palau'
// },
// {
// latLng: [42.5, 1.51],
// name : 'Andorra'
// },
// {
// latLng: [14.01, -60.98],
// name : 'Saint Lucia'
// },
// {
// latLng: [6.91, 158.18],
// name : 'Federated States of Micronesia'
// },
// {
// latLng: [1.3, 103.8],
// name : 'Singapore'
// },
// {
// latLng: [1.46, 173.03],
// name : 'Kiribati'
// },
// {
// latLng: [-21.13, -175.2],
// name : 'Tonga'
// },
// {
// latLng: [15.3, -61.38],
// name : 'Dominica'
// },
// {
// latLng: [-20.2, 57.5],
// name : 'Mauritius'
// },
// {
// latLng: [26.02, 50.55],
// name : 'Bahrain'
// },
// {
// latLng: [0.33, 6.73],
// name : 'São Tomé and Príncipe'
// }
// ]
// })
})

View File

@ -1,140 +0,0 @@
$(function () {
'use strict'
var ticksStyle = {
fontColor: '#495057',
fontStyle: 'bold'
}
var mode = 'index'
var intersect = true
var $salesChart = $('#sales-chart')
var salesChart = new Chart($salesChart, {
type : 'bar',
data : {
labels : ['JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'],
datasets: [
{
backgroundColor: '#007bff',
borderColor : '#007bff',
data : [1000, 2000, 3000, 2500, 2700, 2500, 3000]
},
{
backgroundColor: '#ced4da',
borderColor : '#ced4da',
data : [700, 1700, 2700, 2000, 1800, 1500, 2000]
}
]
},
options: {
maintainAspectRatio: false,
tooltips : {
mode : mode,
intersect: intersect
},
hover : {
mode : mode,
intersect: intersect
},
legend : {
display: false
},
scales : {
yAxes: [{
// display: false,
gridLines: {
display : true,
lineWidth : '4px',
color : 'rgba(0, 0, 0, .2)',
zeroLineColor: 'transparent'
},
ticks : $.extend({
beginAtZero: true,
// Include a dollar sign in the ticks
callback: function (value, index, values) {
if (value >= 1000) {
value /= 1000
value += 'k'
}
return '$' + value
}
}, ticksStyle)
}],
xAxes: [{
display : true,
gridLines: {
display: false
},
ticks : ticksStyle
}]
}
}
})
var $visitorsChart = $('#visitors-chart')
var visitorsChart = new Chart($visitorsChart, {
data : {
labels : ['18th', '20th', '22nd', '24th', '26th', '28th', '30th'],
datasets: [{
type : 'line',
data : [100, 120, 170, 167, 180, 177, 160],
backgroundColor : 'transparent',
borderColor : '#007bff',
pointBorderColor : '#007bff',
pointBackgroundColor: '#007bff',
fill : false
// pointHoverBackgroundColor: '#007bff',
// pointHoverBorderColor : '#007bff'
},
{
type : 'line',
data : [60, 80, 70, 67, 80, 77, 100],
backgroundColor : 'tansparent',
borderColor : '#ced4da',
pointBorderColor : '#ced4da',
pointBackgroundColor: '#ced4da',
fill : false
// pointHoverBackgroundColor: '#ced4da',
// pointHoverBorderColor : '#ced4da'
}]
},
options: {
maintainAspectRatio: false,
tooltips : {
mode : mode,
intersect: intersect
},
hover : {
mode : mode,
intersect: intersect
},
legend : {
display: false
},
scales : {
yAxes: [{
// display: false,
gridLines: {
display : true,
lineWidth : '4px',
color : 'rgba(0, 0, 0, .2)',
zeroLineColor: 'transparent'
},
ticks : $.extend({
beginAtZero : true,
suggestedMax: 200
}, ticksStyle)
}],
xAxes: [{
display : true,
gridLines: {
display: false
},
ticks : ticksStyle
}]
}
}
})
})

View File

@ -1,2 +0,0 @@
*
!/plugins/flot-old/

View File

@ -1,399 +0,0 @@
/*!
* Bootstrap Colorpicker - Bootstrap Colorpicker is a modular color picker plugin for Bootstrap 4.
* @package bootstrap-colorpicker
* @version v3.1.2
* @license MIT
* @link https://farbelous.github.io/bootstrap-colorpicker/
* @link https://github.com/farbelous/bootstrap-colorpicker.git
*/
.colorpicker {
position: relative;
display: none;
font-size: inherit;
color: inherit;
text-align: left;
list-style: none;
background-color: #ffffff;
background-clip: padding-box;
border: 1px solid rgba(0, 0, 0, 0.2);
padding: .75rem .75rem;
width: 148px;
border-radius: 4px;
-webkit-box-sizing: content-box;
box-sizing: content-box; }
.colorpicker.colorpicker-disabled,
.colorpicker.colorpicker-disabled * {
cursor: default !important; }
.colorpicker div {
position: relative; }
.colorpicker-popup {
position: absolute;
top: 100%;
left: 0;
float: left;
margin-top: 1px;
z-index: 1060; }
.colorpicker-popup.colorpicker-bs-popover-content {
position: relative;
top: auto;
left: auto;
float: none;
margin: 0;
z-index: initial;
border: none;
padding: 0.25rem 0;
border-radius: 0;
background: none;
-webkit-box-shadow: none;
box-shadow: none; }
.colorpicker:before,
.colorpicker:after {
content: "";
display: table;
clear: both;
line-height: 0; }
.colorpicker-clear {
clear: both;
display: block; }
.colorpicker:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom-color: rgba(0, 0, 0, 0.2);
position: absolute;
top: -7px;
left: auto;
right: 6px; }
.colorpicker:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid #ffffff;
position: absolute;
top: -6px;
left: auto;
right: 7px; }
.colorpicker.colorpicker-with-alpha {
width: 170px; }
.colorpicker.colorpicker-with-alpha .colorpicker-alpha {
display: block; }
.colorpicker-saturation {
position: relative;
width: 126px;
height: 126px;
/* FF3.6+ */
/* Chrome,Safari4+ */
/* Chrome10+,Safari5.1+ */
/* Opera 11.10+ */
/* IE10+ */
background: -webkit-gradient(linear, left top, left bottom, from(transparent), to(black)), -webkit-gradient(linear, left top, right top, from(white), to(rgba(255, 255, 255, 0)));
background: linear-gradient(to bottom, transparent 0%, black 100%), linear-gradient(to right, white 0%, rgba(255, 255, 255, 0) 100%);
/* W3C */
cursor: crosshair;
float: left;
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
margin-bottom: 6px; }
.colorpicker-saturation .colorpicker-guide {
display: block;
height: 6px;
width: 6px;
border-radius: 6px;
border: 1px solid #000;
-webkit-box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8);
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8);
position: absolute;
top: 0;
left: 0;
margin: -3px 0 0 -3px; }
.colorpicker-hue,
.colorpicker-alpha {
position: relative;
width: 16px;
height: 126px;
float: left;
cursor: row-resize;
margin-left: 6px;
margin-bottom: 6px; }
.colorpicker-alpha-color {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%; }
.colorpicker-hue,
.colorpicker-alpha-color {
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); }
.colorpicker-hue .colorpicker-guide,
.colorpicker-alpha .colorpicker-guide {
display: block;
height: 4px;
background: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(0, 0, 0, 0.4);
position: absolute;
top: 0;
left: 0;
margin-left: -2px;
margin-top: -2px;
right: -2px;
z-index: 1; }
.colorpicker-hue {
/* FF3.6+ */
/* Chrome,Safari4+ */
/* Chrome10+,Safari5.1+ */
/* Opera 11.10+ */
/* IE10+ */
background: -webkit-gradient(linear, left bottom, left top, from(red), color-stop(8%, #ff8000), color-stop(17%, yellow), color-stop(25%, #80ff00), color-stop(33%, lime), color-stop(42%, #00ff80), color-stop(50%, cyan), color-stop(58%, #0080ff), color-stop(67%, blue), color-stop(75%, #8000ff), color-stop(83%, magenta), color-stop(92%, #ff0080), to(red));
background: linear-gradient(to top, red 0%, #ff8000 8%, yellow 17%, #80ff00 25%, lime 33%, #00ff80 42%, cyan 50%, #0080ff 58%, blue 67%, #8000ff 75%, magenta 83%, #ff0080 92%, red 100%);
/* W3C */ }
.colorpicker-alpha {
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
background-size: 10px 10px;
background-position: 0 0, 5px 5px;
display: none; }
.colorpicker-bar {
min-height: 16px;
margin: 6px 0 0 0;
clear: both;
text-align: center;
font-size: 10px;
line-height: normal;
max-width: 100%;
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); }
.colorpicker-bar:before {
content: "";
display: table;
clear: both; }
.colorpicker-bar.colorpicker-bar-horizontal {
height: 126px;
width: 16px;
margin: 0 0 6px 0;
float: left; }
.colorpicker-input-addon {
position: relative; }
.colorpicker-input-addon i {
display: inline-block;
cursor: pointer;
vertical-align: text-top;
height: 16px;
width: 16px;
position: relative; }
.colorpicker-input-addon:before {
content: "";
position: absolute;
width: 16px;
height: 16px;
display: inline-block;
vertical-align: text-top;
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
background-size: 10px 10px;
background-position: 0 0, 5px 5px; }
.colorpicker.colorpicker-inline {
position: relative;
display: inline-block;
float: none;
z-index: auto;
vertical-align: text-bottom; }
.colorpicker.colorpicker-horizontal {
width: 126px;
height: auto; }
.colorpicker.colorpicker-horizontal .colorpicker-bar {
width: 126px; }
.colorpicker.colorpicker-horizontal .colorpicker-saturation {
float: none;
margin-bottom: 0; }
.colorpicker.colorpicker-horizontal .colorpicker-hue,
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
float: none;
width: 126px;
height: 16px;
cursor: col-resize;
margin-left: 0;
margin-top: 6px;
margin-bottom: 0; }
.colorpicker.colorpicker-horizontal .colorpicker-hue .colorpicker-guide,
.colorpicker.colorpicker-horizontal .colorpicker-alpha .colorpicker-guide {
position: absolute;
display: block;
bottom: -2px;
left: 0;
right: auto;
height: auto;
width: 4px; }
.colorpicker.colorpicker-horizontal .colorpicker-hue {
/* FF3.6+ */
/* Chrome,Safari4+ */
/* Chrome10+,Safari5.1+ */
/* Opera 11.10+ */
/* IE10+ */
background: -webkit-gradient(linear, right top, left top, from(red), color-stop(8%, #ff8000), color-stop(17%, yellow), color-stop(25%, #80ff00), color-stop(33%, lime), color-stop(42%, #00ff80), color-stop(50%, cyan), color-stop(58%, #0080ff), color-stop(67%, blue), color-stop(75%, #8000ff), color-stop(83%, magenta), color-stop(92%, #ff0080), to(red));
background: linear-gradient(to left, red 0%, #ff8000 8%, yellow 17%, #80ff00 25%, lime 33%, #00ff80 42%, cyan 50%, #0080ff 58%, blue 67%, #8000ff 75%, magenta 83%, #ff0080 92%, red 100%);
/* W3C */ }
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
background-size: 10px 10px;
background-position: 0 0, 5px 5px; }
.colorpicker-inline:before,
.colorpicker-no-arrow:before,
.colorpicker-popup.colorpicker-bs-popover-content:before {
content: none;
display: none; }
.colorpicker-inline:after,
.colorpicker-no-arrow:after,
.colorpicker-popup.colorpicker-bs-popover-content:after {
content: none;
display: none; }
.colorpicker-alpha,
.colorpicker-saturation,
.colorpicker-hue {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
.colorpicker.colorpicker-visible,
.colorpicker-alpha.colorpicker-visible,
.colorpicker-saturation.colorpicker-visible,
.colorpicker-hue.colorpicker-visible,
.colorpicker-bar.colorpicker-visible {
display: block; }
.colorpicker.colorpicker-hidden,
.colorpicker-alpha.colorpicker-hidden,
.colorpicker-saturation.colorpicker-hidden,
.colorpicker-hue.colorpicker-hidden,
.colorpicker-bar.colorpicker-hidden {
display: none; }
.colorpicker-inline.colorpicker-visible {
display: inline-block; }
.colorpicker.colorpicker-disabled:after {
border: none;
content: '';
display: block;
width: 100%;
height: 100%;
background: rgba(233, 236, 239, 0.33);
top: 0;
left: 0;
right: auto;
z-index: 2;
position: absolute; }
.colorpicker.colorpicker-disabled .colorpicker-guide {
display: none; }
/** EXTENSIONS **/
.colorpicker-preview {
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
background-size: 10px 10px;
background-position: 0 0, 5px 5px; }
.colorpicker-preview > div {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%; }
.colorpicker-bar.colorpicker-swatches {
-webkit-box-shadow: none;
box-shadow: none;
height: auto; }
.colorpicker-swatches--inner {
clear: both;
margin-top: -6px; }
.colorpicker-swatch {
position: relative;
cursor: pointer;
float: left;
height: 16px;
width: 16px;
margin-right: 6px;
margin-top: 6px;
margin-left: 0;
display: block;
-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2);
background: linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), linear-gradient(45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%, transparent 75%, rgba(0, 0, 0, 0.1) 75%, rgba(0, 0, 0, 0.1) 0), white;
background-size: 10px 10px;
background-position: 0 0, 5px 5px; }
.colorpicker-swatch--inner {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%; }
.colorpicker-swatch:nth-of-type(7n+0) {
margin-right: 0; }
.colorpicker-with-alpha .colorpicker-swatch:nth-of-type(7n+0) {
margin-right: 6px; }
.colorpicker-with-alpha .colorpicker-swatch:nth-of-type(8n+0) {
margin-right: 0; }
.colorpicker-horizontal .colorpicker-swatch:nth-of-type(6n+0) {
margin-right: 0; }
.colorpicker-horizontal .colorpicker-swatch:nth-of-type(7n+0) {
margin-right: 6px; }
.colorpicker-horizontal .colorpicker-swatch:nth-of-type(8n+0) {
margin-right: 6px; }
.colorpicker-swatch:last-of-type:after {
content: "";
display: table;
clear: both; }
*[dir='rtl'] .colorpicker-element input,
.colorpicker-element[dir='rtl'] input,
.colorpicker-element input[dir='rtl'] {
direction: ltr;
text-align: right; }
/*# sourceMappingURL=bootstrap-colorpicker.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,328 +0,0 @@
/*! =======================================================
VERSION 10.6.2
========================================================= */
/*! =========================================================
* bootstrap-slider.js
*
* Maintainers:
* Kyle Kemp
* - Twitter: @seiyria
* - Github: seiyria
* Rohit Kalkur
* - Twitter: @Rovolutionary
* - Github: rovolution
*
* =========================================================
*
* bootstrap-slider is released under the MIT License
* Copyright (c) 2019 Kyle Kemp, Rohit Kalkur, and contributors
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* ========================================================= */
.slider {
display: inline-block;
vertical-align: middle;
position: relative;
}
.slider.slider-horizontal {
width: 210px;
height: 20px;
}
.slider.slider-horizontal .slider-track {
height: 10px;
width: 100%;
margin-top: -5px;
top: 50%;
left: 0;
}
.slider.slider-horizontal .slider-selection,
.slider.slider-horizontal .slider-track-low,
.slider.slider-horizontal .slider-track-high {
height: 100%;
top: 0;
bottom: 0;
}
.slider.slider-horizontal .slider-tick,
.slider.slider-horizontal .slider-handle {
margin-left: -10px;
}
.slider.slider-horizontal .slider-tick.triangle,
.slider.slider-horizontal .slider-handle.triangle {
position: relative;
top: 50%;
-ms-transform: translateY(-50%);
transform: translateY(-50%);
border-width: 0 10px 10px 10px;
width: 0;
height: 0;
border-bottom-color: #2e6da4;
margin-top: 0;
}
.slider.slider-horizontal .slider-tick-container {
white-space: nowrap;
position: absolute;
top: 0;
left: 0;
width: 100%;
}
.slider.slider-horizontal .slider-tick-label-container {
white-space: nowrap;
margin-top: 20px;
}
.slider.slider-horizontal .slider-tick-label-container .slider-tick-label {
padding-top: 4px;
display: inline-block;
text-align: center;
}
.slider.slider-horizontal .tooltip {
-ms-transform: translateX(-50%);
transform: translateX(-50%);
}
.slider.slider-horizontal.slider-rtl .slider-track {
left: initial;
right: 0;
}
.slider.slider-horizontal.slider-rtl .slider-tick,
.slider.slider-horizontal.slider-rtl .slider-handle {
margin-left: initial;
margin-right: -10px;
}
.slider.slider-horizontal.slider-rtl .slider-tick-container {
left: initial;
right: 0;
}
.slider.slider-horizontal.slider-rtl .tooltip {
-ms-transform: translateX(50%);
transform: translateX(50%);
}
.slider.slider-vertical {
height: 210px;
width: 20px;
}
.slider.slider-vertical .slider-track {
width: 10px;
height: 100%;
left: 25%;
top: 0;
}
.slider.slider-vertical .slider-selection {
width: 100%;
left: 0;
top: 0;
bottom: 0;
}
.slider.slider-vertical .slider-track-low,
.slider.slider-vertical .slider-track-high {
width: 100%;
left: 0;
right: 0;
}
.slider.slider-vertical .slider-tick,
.slider.slider-vertical .slider-handle {
margin-top: -10px;
}
.slider.slider-vertical .slider-tick.triangle,
.slider.slider-vertical .slider-handle.triangle {
border-width: 10px 0 10px 10px;
width: 1px;
height: 1px;
border-left-color: #2e6da4;
border-right-color: #2e6da4;
margin-left: 0;
margin-right: 0;
}
.slider.slider-vertical .slider-tick-label-container {
white-space: nowrap;
}
.slider.slider-vertical .slider-tick-label-container .slider-tick-label {
padding-left: 4px;
}
.slider.slider-vertical .tooltip {
-ms-transform: translateY(-50%);
transform: translateY(-50%);
}
.slider.slider-vertical.slider-rtl .slider-track {
left: initial;
right: 25%;
}
.slider.slider-vertical.slider-rtl .slider-selection {
left: initial;
right: 0;
}
.slider.slider-vertical.slider-rtl .slider-tick.triangle,
.slider.slider-vertical.slider-rtl .slider-handle.triangle {
border-width: 10px 10px 10px 0;
}
.slider.slider-vertical.slider-rtl .slider-tick-label-container .slider-tick-label {
padding-left: initial;
padding-right: 4px;
}
.slider.slider-disabled .slider-handle {
background-image: -webkit-linear-gradient(top, #dfdfdf 0%, #bebebe 100%);
background-image: -o-linear-gradient(top, #dfdfdf 0%, #bebebe 100%);
background-image: linear-gradient(to bottom, #dfdfdf 0%, #bebebe 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdfdfdf', endColorstr='#ffbebebe', GradientType=0);
background-repeat: repeat-x;
}
.slider.slider-disabled .slider-track {
background-image: -webkit-linear-gradient(top, #e5e5e5 0%, #e9e9e9 100%);
background-image: -o-linear-gradient(top, #e5e5e5 0%, #e9e9e9 100%);
background-image: linear-gradient(to bottom, #e5e5e5 0%, #e9e9e9 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe5e5e5', endColorstr='#ffe9e9e9', GradientType=0);
background-repeat: repeat-x;
cursor: not-allowed;
}
.slider input {
display: none;
}
.slider .tooltip {
pointer-events: none;
}
.slider .tooltip.top {
margin-top: -36px;
}
.slider .tooltip-inner {
white-space: nowrap;
max-width: none;
}
.slider .hide {
display: none;
}
.slider-track {
position: absolute;
cursor: pointer;
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #f9f9f9 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #f9f9f9 100%);
background-image: linear-gradient(to bottom, #f5f5f5 0%, #f9f9f9 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
border-radius: 4px;
}
.slider-selection {
position: absolute;
background-image: -webkit-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%);
background-image: linear-gradient(to bottom, #f9f9f9 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
border-radius: 4px;
}
.slider-selection.tick-slider-selection {
background-image: -webkit-linear-gradient(top, #8ac1ef 0%, #82b3de 100%);
background-image: -o-linear-gradient(top, #8ac1ef 0%, #82b3de 100%);
background-image: linear-gradient(to bottom, #8ac1ef 0%, #82b3de 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8ac1ef', endColorstr='#ff82b3de', GradientType=0);
background-repeat: repeat-x;
}
.slider-track-low,
.slider-track-high {
position: absolute;
background: transparent;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
border-radius: 4px;
}
.slider-handle {
position: absolute;
top: 0;
width: 20px;
height: 20px;
background-color: #337ab7;
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
background-repeat: repeat-x;
filter: none;
-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
border: 0px solid transparent;
}
.slider-handle:hover {
cursor: pointer;
}
.slider-handle.round {
border-radius: 50%;
}
.slider-handle.triangle {
background: transparent none;
}
.slider-handle.custom {
background: transparent none;
}
.slider-handle.custom::before {
line-height: 20px;
font-size: 20px;
content: '\2605';
color: #726204;
}
.slider-tick {
position: absolute;
cursor: pointer;
width: 20px;
height: 20px;
background-image: -webkit-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #f9f9f9 0%, #f5f5f5 100%);
background-image: linear-gradient(to bottom, #f9f9f9 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
filter: none;
opacity: 0.8;
border: 0px solid transparent;
}
.slider-tick.round {
border-radius: 50%;
}
.slider-tick.triangle {
background: transparent none;
}
.slider-tick.custom {
background: transparent none;
}
.slider-tick.custom::before {
line-height: 20px;
font-size: 20px;
content: '\2605';
color: #726204;
}
.slider-tick.in-selection {
background-image: -webkit-linear-gradient(top, #8ac1ef 0%, #82b3de 100%);
background-image: -o-linear-gradient(top, #8ac1ef 0%, #82b3de 100%);
background-image: linear-gradient(to bottom, #8ac1ef 0%, #82b3de 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff8ac1ef', endColorstr='#ff82b3de', GradientType=0);
background-repeat: repeat-x;
opacity: 1;
}

File diff suppressed because one or more lines are too long

View File

@ -1,510 +0,0 @@
/**
* bootstrap-switch - Turn checkboxes and radio buttons into toggle switches.
*
* @version v3.4.0
* @homepage https://bttstrp.github.io/bootstrap-switch
* @author Mattia Larentis <mattia@larentis.eu> (http://larentis.eu)
* @license MIT
*/
.clearfix {
*zoom: 1;
}
.clearfix:before,
.clearfix:after {
display: table;
content: "";
line-height: 0;
}
.clearfix:after {
clear: both;
}
.hide-text {
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
.input-block-level {
display: block;
width: 100%;
min-height: 30px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.bootstrap-switch {
display: inline-block;
direction: ltr;
cursor: pointer;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
border: 1px solid;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
position: relative;
text-align: left;
overflow: hidden;
line-height: 8px;
z-index: 0;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
vertical-align: middle;
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-moz-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
.bootstrap-switch .bootstrap-switch-container {
display: inline-block;
top: 0;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.bootstrap-switch .bootstrap-switch-handle-on,
.bootstrap-switch .bootstrap-switch-handle-off,
.bootstrap-switch .bootstrap-switch-label {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
cursor: pointer;
display: inline-block !important;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 8px;
padding-right: 8px;
font-size: 14px;
line-height: 20px;
}
.bootstrap-switch .bootstrap-switch-handle-on,
.bootstrap-switch .bootstrap-switch-handle-off {
text-align: center;
z-index: 1;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary {
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #005fcc;
background-image: -moz-linear-gradient(top, #0044cc, #08c);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0044cc), to(#08c));
background-image: -webkit-linear-gradient(top, #0044cc, #08c);
background-image: -o-linear-gradient(top, #0044cc, #08c);
background-image: linear-gradient(to bottom, #0044cc, #08c);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0044cc', endColorstr='#ff0088cc', GradientType=0);
border-color: #08c #08c #005580;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #08c;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:hover,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:hover,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:focus,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:focus,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary.active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary.disabled,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary.disabled,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary[disabled],
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary[disabled] {
color: #fff;
background-color: #08c;
*background-color: #0077b3;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary.active {
background-color: #006699 \9;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info {
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #41a7c5;
background-image: -moz-linear-gradient(top, #2f96b4, #5bc0de);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#2f96b4), to(#5bc0de));
background-image: -webkit-linear-gradient(top, #2f96b4, #5bc0de);
background-image: -o-linear-gradient(top, #2f96b4, #5bc0de);
background-image: linear-gradient(to bottom, #2f96b4, #5bc0de);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2f96b4', endColorstr='#ff5bc0de', GradientType=0);
border-color: #5bc0de #5bc0de #28a1c5;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #5bc0de;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info:hover,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info:hover,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info:focus,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info:focus,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info.active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info.disabled,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info.disabled,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info[disabled],
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info[disabled] {
color: #fff;
background-color: #5bc0de;
*background-color: #46b8da;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info.active {
background-color: #31b0d5 \9;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success {
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #58b058;
background-image: -moz-linear-gradient(top, #51a351, #62c462);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#51a351), to(#62c462));
background-image: -webkit-linear-gradient(top, #51a351, #62c462);
background-image: -o-linear-gradient(top, #51a351, #62c462);
background-image: linear-gradient(to bottom, #51a351, #62c462);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff51a351', endColorstr='#ff62c462', GradientType=0);
border-color: #62c462 #62c462 #3b9e3b;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #62c462;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success:hover,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success:hover,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success:focus,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success:focus,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success.active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success.disabled,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success.disabled,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success[disabled],
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success[disabled] {
color: #fff;
background-color: #62c462;
*background-color: #4fbd4f;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success.active {
background-color: #42b142 \9;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning {
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #f9a123;
background-image: -moz-linear-gradient(top, #f89406, #fbb450);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f89406), to(#fbb450));
background-image: -webkit-linear-gradient(top, #f89406, #fbb450);
background-image: -o-linear-gradient(top, #f89406, #fbb450);
background-image: linear-gradient(to bottom, #f89406, #fbb450);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff89406', endColorstr='#fffbb450', GradientType=0);
border-color: #fbb450 #fbb450 #f89406;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #fbb450;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning:hover,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning:hover,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning:focus,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning:focus,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning.active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning.disabled,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning.disabled,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning[disabled],
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning[disabled] {
color: #fff;
background-color: #fbb450;
*background-color: #faa937;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning.active {
background-color: #fa9f1e \9;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger {
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #d14641;
background-image: -moz-linear-gradient(top, #bd362f, #ee5f5b);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#bd362f), to(#ee5f5b));
background-image: -webkit-linear-gradient(top, #bd362f, #ee5f5b);
background-image: -o-linear-gradient(top, #bd362f, #ee5f5b);
background-image: linear-gradient(to bottom, #bd362f, #ee5f5b);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffbd362f', endColorstr='#ffee5f5b', GradientType=0);
border-color: #ee5f5b #ee5f5b #e51d18;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #ee5f5b;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger:hover,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger:hover,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger:focus,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger:focus,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger.active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger.disabled,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger.disabled,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger[disabled],
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger[disabled] {
color: #fff;
background-color: #ee5f5b;
*background-color: #ec4844;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger.active {
background-color: #e9322d \9;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default {
color: #333;
text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
background-color: #f0f0f0;
background-image: -moz-linear-gradient(top, #e6e6e6, #fff);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e6e6e6), to(#fff));
background-image: -webkit-linear-gradient(top, #e6e6e6, #fff);
background-image: -o-linear-gradient(top, #e6e6e6, #fff);
background-image: linear-gradient(to bottom, #e6e6e6, #fff);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe6e6e6', endColorstr='#ffffffff', GradientType=0);
border-color: #fff #fff #d9d9d9;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #fff;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default:hover,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default:hover,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default:focus,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default:focus,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default.active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default.disabled,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default.disabled,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default[disabled],
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default[disabled] {
color: #333;
background-color: #fff;
*background-color: #f2f2f2;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default:active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default:active,
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default.active,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default.active {
background-color: #e6e6e6 \9;
}
.bootstrap-switch .bootstrap-switch-label {
text-align: center;
margin-top: -1px;
margin-bottom: -1px;
z-index: 100;
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
color: #333;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background-color: #f5f5f5;
background-image: -moz-linear-gradient(top, #fff, #e6e6e6);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fff), to(#e6e6e6));
background-image: -webkit-linear-gradient(top, #fff, #e6e6e6);
background-image: -o-linear-gradient(top, #fff, #e6e6e6);
background-image: linear-gradient(to bottom, #fff, #e6e6e6);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
border-color: #e6e6e6 #e6e6e6 #bfbfbf;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
*background-color: #e6e6e6;
/* Darken IE7 buttons by default so they stand out more given they won't have borders */
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.bootstrap-switch .bootstrap-switch-label:hover,
.bootstrap-switch .bootstrap-switch-label:focus,
.bootstrap-switch .bootstrap-switch-label:active,
.bootstrap-switch .bootstrap-switch-label.active,
.bootstrap-switch .bootstrap-switch-label.disabled,
.bootstrap-switch .bootstrap-switch-label[disabled] {
color: #333;
background-color: #e6e6e6;
*background-color: #d9d9d9;
}
.bootstrap-switch .bootstrap-switch-label:active,
.bootstrap-switch .bootstrap-switch-label.active {
background-color: #cccccc \9;
}
.bootstrap-switch span::before {
content: "\200b";
}
.bootstrap-switch .bootstrap-switch-handle-on {
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-left-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-left-radius: 4px;
}
.bootstrap-switch .bootstrap-switch-handle-off {
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
border-top-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
border-bottom-right-radius: 4px;
}
.bootstrap-switch input[type='radio'],
.bootstrap-switch input[type='checkbox'] {
position: absolute !important;
top: 0;
left: 0;
opacity: 0;
filter: alpha(opacity=0);
z-index: -1;
visibility: hidden;
}
.bootstrap-switch input[type='radio'].form-control,
.bootstrap-switch input[type='checkbox'].form-control {
height: auto;
}
.bootstrap-switch.bootstrap-switch-mini {
min-width: 71px;
}
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label {
padding: 3px 6px;
font-size: 10px;
line-height: 9px;
}
.bootstrap-switch.bootstrap-switch-small {
min-width: 79px;
}
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label {
padding: 3px 6px;
font-size: 12px;
line-height: 18px;
}
.bootstrap-switch.bootstrap-switch-large {
min-width: 120px;
}
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label {
padding: 9px 12px;
font-size: 16px;
line-height: normal;
}
.bootstrap-switch.bootstrap-switch-disabled,
.bootstrap-switch.bootstrap-switch-readonly,
.bootstrap-switch.bootstrap-switch-indeterminate {
cursor: default !important;
}
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: default !important;
}
.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container {
-webkit-transition: margin-left 0.5s;
-moz-transition: margin-left 0.5s;
-o-transition: margin-left 0.5s;
transition: margin-left 0.5s;
}
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on {
-webkit-border-top-left-radius: 0;
-moz-border-radius-topleft: 0;
border-top-left-radius: 0;
-webkit-border-bottom-left-radius: 0;
-moz-border-radius-bottomleft: 0;
border-bottom-left-radius: 0;
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
border-top-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
border-bottom-right-radius: 4px;
}
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off {
-webkit-border-top-right-radius: 0;
-moz-border-radius-topright: 0;
border-top-right-radius: 0;
-webkit-border-bottom-right-radius: 0;
-moz-border-radius-bottomright: 0;
border-bottom-right-radius: 0;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-left-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-left-radius: 4px;
}
.bootstrap-switch.bootstrap-switch-focused {
border-color: rgba(82, 168, 236, 0.8);
outline: 0;
outline: thin dotted \9;
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82, 168, 236, .6);
-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82, 168, 236, .6);
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82, 168, 236, .6);
}
.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label {
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
border-top-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
border-bottom-right-radius: 4px;
}
.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label {
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-left-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-left-radius: 4px;
}

File diff suppressed because one or more lines are too long

View File

@ -1,187 +0,0 @@
/**
* bootstrap-switch - Turn checkboxes and radio buttons into toggle switches.
*
* @version v3.4.0
* @homepage https://bttstrp.github.io/bootstrap-switch
* @author Mattia Larentis <mattia@larentis.eu> (http://larentis.eu)
* @license MIT
*/
.bootstrap-switch {
display: inline-block;
direction: ltr;
cursor: pointer;
border-radius: 4px;
border: 1px solid;
border-color: #ccc;
position: relative;
text-align: left;
overflow: hidden;
line-height: 8px;
z-index: 0;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
vertical-align: middle;
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
.bootstrap-switch .bootstrap-switch-container {
display: inline-block;
top: 0;
border-radius: 4px;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.bootstrap-switch .bootstrap-switch-handle-on,
.bootstrap-switch .bootstrap-switch-handle-off,
.bootstrap-switch .bootstrap-switch-label {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
cursor: pointer;
display: table-cell;
vertical-align: middle;
padding: 6px 12px;
font-size: 14px;
line-height: 20px;
}
.bootstrap-switch .bootstrap-switch-handle-on,
.bootstrap-switch .bootstrap-switch-handle-off {
text-align: center;
z-index: 1;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary {
color: #fff;
background: #337ab7;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info {
color: #fff;
background: #5bc0de;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success {
color: #fff;
background: #5cb85c;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning {
background: #f0ad4e;
color: #fff;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger {
color: #fff;
background: #d9534f;
}
.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default,
.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default {
color: #000;
background: #eeeeee;
}
.bootstrap-switch .bootstrap-switch-label {
text-align: center;
margin-top: -1px;
margin-bottom: -1px;
z-index: 100;
color: #333;
background: #fff;
}
.bootstrap-switch span::before {
content: "\200b";
}
.bootstrap-switch .bootstrap-switch-handle-on {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
.bootstrap-switch .bootstrap-switch-handle-off {
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
.bootstrap-switch input[type='radio'],
.bootstrap-switch input[type='checkbox'] {
position: absolute !important;
top: 0;
left: 0;
margin: 0;
z-index: -1;
opacity: 0;
filter: alpha(opacity=0);
visibility: hidden;
}
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label {
padding: 1px 5px;
font-size: 12px;
line-height: 1.5;
}
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label {
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
}
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label {
padding: 6px 16px;
font-size: 18px;
line-height: 1.3333333;
}
.bootstrap-switch.bootstrap-switch-disabled,
.bootstrap-switch.bootstrap-switch-readonly,
.bootstrap-switch.bootstrap-switch-indeterminate {
cursor: default !important;
}
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,
.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: default !important;
}
.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container {
-webkit-transition: margin-left 0.5s;
-o-transition: margin-left 0.5s;
transition: margin-left 0.5s;
}
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on {
border-bottom-left-radius: 0;
border-top-left-radius: 0;
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off {
border-bottom-right-radius: 0;
border-top-right-radius: 0;
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
.bootstrap-switch.bootstrap-switch-focused {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
}
.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label {
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label,
.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}

File diff suppressed because one or more lines are too long

View File

@ -1,767 +0,0 @@
/**
* bootstrap-switch - Turn checkboxes and radio buttons into toggle switches.
*
* @version v3.4.0
* @homepage https://bttstrp.github.io/bootstrap-switch
* @author Mattia Larentis <mattia@larentis.eu> (http://larentis.eu)
* @license MIT
*/
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['jquery'], factory);
} else if (typeof exports !== "undefined") {
factory(require('jquery'));
} else {
var mod = {
exports: {}
};
factory(global.jquery);
global.bootstrapSwitch = mod.exports;
}
})(this, function (_jquery) {
'use strict';
var _jquery2 = _interopRequireDefault(_jquery);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
var _extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var _createClass = function () {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function (Constructor, protoProps, staticProps) {
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
}();
var $ = _jquery2.default || window.jQuery || window.$;
function getClasses(options, id) {
var state = options.state,
size = options.size,
disabled = options.disabled,
readonly = options.readonly,
indeterminate = options.indeterminate,
inverse = options.inverse;
return [state ? 'on' : 'off', size, disabled ? 'disabled' : undefined, readonly ? 'readonly' : undefined, indeterminate ? 'indeterminate' : undefined, inverse ? 'inverse' : undefined, id ? 'id-' + id : undefined].filter(function (v) {
return v == null;
});
}
function prvgetElementOptions() {
return {
state: this.$element.is(':checked'),
size: this.$element.data('size'),
animate: this.$element.data('animate'),
disabled: this.$element.is(':disabled'),
readonly: this.$element.is('[readonly]'),
indeterminate: this.$element.data('indeterminate'),
inverse: this.$element.data('inverse'),
radioAllOff: this.$element.data('radio-all-off'),
onColor: this.$element.data('on-color'),
offColor: this.$element.data('off-color'),
onText: this.$element.data('on-text'),
offText: this.$element.data('off-text'),
labelText: this.$element.data('label-text'),
handleWidth: this.$element.data('handle-width'),
labelWidth: this.$element.data('label-width'),
baseClass: this.$element.data('base-class'),
wrapperClass: this.$element.data('wrapper-class')
};
}
function prvwidth() {
var _this = this;
var $handles = this.$on.add(this.$off).add(this.$label).css('width', '');
var handleWidth = this.options.handleWidth === 'auto' ? Math.round(Math.max(this.$on.width(), this.$off.width())) : this.options.handleWidth;
$handles.width(handleWidth);
this.$label.width(function (index, width) {
if (_this.options.labelWidth !== 'auto') {
return _this.options.labelWidth;
}
if (width < handleWidth) {
return handleWidth;
}
return width;
});
this.privateHandleWidth = this.$on.outerWidth();
this.privateLabelWidth = this.$label.outerWidth();
this.$container.width(this.privateHandleWidth * 2 + this.privateLabelWidth);
return this.$wrapper.width(this.privateHandleWidth + this.privateLabelWidth);
}
function prvcontainerPosition() {
var _this2 = this;
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.ope;
this.$container.css('margin-left', function () {
var values = [0, '-' + _this2.privateHandleWidth + 'px'];
if (_this2.options.indeterminate) {
return '-' + _this2.privateHandleWidth / 2 + 'px';
}
if (state) {
if (_this2.options.inverse) {
return values[1];
}
return values[0];
}
if (_this2.options.inverse) {
return values[0];
}
return values[1];
});
}
function prvgetClass(name) {
return this.options.baseClass + '-' + name;
}
function prvinit() {
var _this3 = this;
var init = function init() {
_this3.setPrevOptions();
prvwidth.call(_this3);
prvcontainerPosition.call(_this3);
setTimeout(function () {
return _this3.options.animate && _this3.$wrapper.addClass(prvgetClass.call(_this3, 'animate'));
}, 50);
};
if (this.$wrapper.is(':visible')) {
init();
return;
}
var initInterval = window.setInterval(function () {
return _this3.$wrapper.is(':visible') && (init() || true) && window.clearInterval(initInterval);
}, 50);
}
function prvelementHandlers() {
var _this4 = this;
return this.$element.on({
'setPreviousOptions.bootstrapSwitch': function setPreviousOptionsBootstrapSwitch() {
return _this4.setPrevOptions();
},
'previousState.bootstrapSwitch': function previousStateBootstrapSwitch() {
_this4.options = _this4.prevOptions;
if (_this4.options.indeterminate) {
_this4.$wrapper.addClass(prvgetClass.call(_this4, 'indeterminate'));
}
_this4.$element.prop('checked', _this4.options.state).trigger('change.bootstrapSwitch', true);
},
'change.bootstrapSwitch': function changeBootstrapSwitch(event, skip) {
event.preventDefault();
event.stopImmediatePropagation();
var state = _this4.$element.is(':checked');
prvcontainerPosition.call(_this4, state);
if (state === _this4.options.state) {
return;
}
_this4.options.state = state;
_this4.$wrapper.toggleClass(prvgetClass.call(_this4, 'off')).toggleClass(prvgetClass.call(_this4, 'on'));
if (!skip) {
if (_this4.$element.is(':radio')) {
$('[name="' + _this4.$element.attr('name') + '"]').not(_this4.$element).prop('checked', false).trigger('change.bootstrapSwitch', true);
}
_this4.$element.trigger('switchChange.bootstrapSwitch', [state]);
}
},
'focus.bootstrapSwitch': function focusBootstrapSwitch(event) {
event.preventDefault();
_this4.$wrapper.addClass(prvgetClass.call(_this4, 'focused'));
},
'blur.bootstrapSwitch': function blurBootstrapSwitch(event) {
event.preventDefault();
_this4.$wrapper.removeClass(prvgetClass.call(_this4, 'focused'));
},
'keydown.bootstrapSwitch': function keydownBootstrapSwitch(event) {
if (!event.which || _this4.options.disabled || _this4.options.readonly) {
return;
}
if (event.which === 37 || event.which === 39) {
event.preventDefault();
event.stopImmediatePropagation();
_this4.state(event.which === 39);
}
}
});
}
function prvhandleHandlers() {
var _this5 = this;
this.$on.on('click.bootstrapSwitch', function (event) {
event.preventDefault();
event.stopPropagation();
_this5.state(false);
return _this5.$element.trigger('focus.bootstrapSwitch');
});
return this.$off.on('click.bootstrapSwitch', function (event) {
event.preventDefault();
event.stopPropagation();
_this5.state(true);
return _this5.$element.trigger('focus.bootstrapSwitch');
});
}
function prvlabelHandlers() {
var _this6 = this;
var dragStart = void 0;
var dragEnd = void 0;
var handlers = {
click: function click(event) {
event.stopPropagation();
},
'mousedown.bootstrapSwitch touchstart.bootstrapSwitch': function mousedownBootstrapSwitchTouchstartBootstrapSwitch(event) {
if (dragStart || _this6.options.disabled || _this6.options.readonly) {
return;
}
event.preventDefault();
event.stopPropagation();
dragStart = (event.pageX || event.originalEvent.touches[0].pageX) - parseInt(_this6.$container.css('margin-left'), 10);
if (_this6.options.animate) {
_this6.$wrapper.removeClass(prvgetClass.call(_this6, 'animate'));
}
_this6.$element.trigger('focus.bootstrapSwitch');
},
'mousemove.bootstrapSwitch touchmove.bootstrapSwitch': function mousemoveBootstrapSwitchTouchmoveBootstrapSwitch(event) {
if (dragStart == null) {
return;
}
var difference = (event.pageX || event.originalEvent.touches[0].pageX) - dragStart;
event.preventDefault();
if (difference < -_this6.privateHandleWidth || difference > 0) {
return;
}
dragEnd = difference;
_this6.$container.css('margin-left', dragEnd + 'px');
},
'mouseup.bootstrapSwitch touchend.bootstrapSwitch': function mouseupBootstrapSwitchTouchendBootstrapSwitch(event) {
if (!dragStart) {
return;
}
event.preventDefault();
if (_this6.options.animate) {
_this6.$wrapper.addClass(prvgetClass.call(_this6, 'animate'));
}
if (dragEnd) {
var state = dragEnd > -(_this6.privateHandleWidth / 2);
dragEnd = false;
_this6.state(_this6.options.inverse ? !state : state);
} else {
_this6.state(!_this6.options.state);
}
dragStart = false;
},
'mouseleave.bootstrapSwitch': function mouseleaveBootstrapSwitch() {
_this6.$label.trigger('mouseup.bootstrapSwitch');
}
};
this.$label.on(handlers);
}
function prvexternalLabelHandler() {
var _this7 = this;
var $externalLabel = this.$element.closest('label');
$externalLabel.on('click', function (event) {
event.preventDefault();
event.stopImmediatePropagation();
if (event.target === $externalLabel[0]) {
_this7.toggleState();
}
});
}
function prvformHandler() {
function isBootstrapSwitch() {
return $(this).data('bootstrap-switch');
}
function performReset() {
return $(this).bootstrapSwitch('state', this.checked);
}
var $form = this.$element.closest('form');
if ($form.data('bootstrap-switch')) {
return;
}
$form.on('reset.bootstrapSwitch', function () {
window.setTimeout(function () {
$form.find('input').filter(isBootstrapSwitch).each(performReset);
}, 1);
}).data('bootstrap-switch', true);
}
function prvgetClasses(classes) {
var _this8 = this;
if (!$.isArray(classes)) {
return [prvgetClass.call(this, classes)];
}
return classes.map(function (v) {
return prvgetClass.call(_this8, v);
});
}
var BootstrapSwitch = function () {
function BootstrapSwitch(element) {
var _this9 = this;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
_classCallCheck(this, BootstrapSwitch);
this.$element = $(element);
this.options = $.extend({}, $.fn.bootstrapSwitch.defaults, prvgetElementOptions.call(this), options);
this.prevOptions = {};
this.$wrapper = $('<div>', {
class: function _class() {
return getClasses(_this9.options, _this9.$element.attr('id')).map(function (v) {
return prvgetClass.call(_this9, v);
}).concat([_this9.options.baseClass], prvgetClasses.call(_this9, _this9.options.wrapperClass)).join(' ');
}
});
this.$container = $('<div>', { class: prvgetClass.call(this, 'container') });
this.$on = $('<span>', {
html: this.options.onText,
class: prvgetClass.call(this, 'handle-on') + ' ' + prvgetClass.call(this, this.options.onColor)
});
this.$off = $('<span>', {
html: this.options.offText,
class: prvgetClass.call(this, 'handle-off') + ' ' + prvgetClass.call(this, this.options.offColor)
});
this.$label = $('<span>', {
html: this.options.labelText,
class: prvgetClass.call(this, 'label')
});
this.$element.on('init.bootstrapSwitch', function () {
return _this9.options.onInit(element);
});
this.$element.on('switchChange.bootstrapSwitch', function () {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var changeState = _this9.options.onSwitchChange.apply(element, args);
if (changeState === false) {
if (_this9.$element.is(':radio')) {
$('[name="' + _this9.$element.attr('name') + '"]').trigger('previousState.bootstrapSwitch', true);
} else {
_this9.$element.trigger('previousState.bootstrapSwitch', true);
}
}
});
this.$container = this.$element.wrap(this.$container).parent();
this.$wrapper = this.$container.wrap(this.$wrapper).parent();
this.$element.before(this.options.inverse ? this.$off : this.$on).before(this.$label).before(this.options.inverse ? this.$on : this.$off);
if (this.options.indeterminate) {
this.$element.prop('indeterminate', true);
}
prvinit.call(this);
prvelementHandlers.call(this);
prvhandleHandlers.call(this);
prvlabelHandlers.call(this);
prvformHandler.call(this);
prvexternalLabelHandler.call(this);
this.$element.trigger('init.bootstrapSwitch', this.options.state);
}
_createClass(BootstrapSwitch, [{
key: 'setPrevOptions',
value: function setPrevOptions() {
this.prevOptions = _extends({}, this.options);
}
}, {
key: 'state',
value: function state(value, skip) {
if (typeof value === 'undefined') {
return this.options.state;
}
if (this.options.disabled || this.options.readonly || this.options.state && !this.options.radioAllOff && this.$element.is(':radio')) {
return this.$element;
}
if (this.$element.is(':radio')) {
$('[name="' + this.$element.attr('name') + '"]').trigger('setPreviousOptions.bootstrapSwitch');
} else {
this.$element.trigger('setPreviousOptions.bootstrapSwitch');
}
if (this.options.indeterminate) {
this.indeterminate(false);
}
this.$element.prop('checked', Boolean(value)).trigger('change.bootstrapSwitch', skip);
return this.$element;
}
}, {
key: 'toggleState',
value: function toggleState(skip) {
if (this.options.disabled || this.options.readonly) {
return this.$element;
}
if (this.options.indeterminate) {
this.indeterminate(false);
return this.state(true);
}
return this.$element.prop('checked', !this.options.state).trigger('change.bootstrapSwitch', skip);
}
}, {
key: 'size',
value: function size(value) {
if (typeof value === 'undefined') {
return this.options.size;
}
if (this.options.size != null) {
this.$wrapper.removeClass(prvgetClass.call(this, this.options.size));
}
if (value) {
this.$wrapper.addClass(prvgetClass.call(this, value));
}
prvwidth.call(this);
prvcontainerPosition.call(this);
this.options.size = value;
return this.$element;
}
}, {
key: 'animate',
value: function animate(value) {
if (typeof value === 'undefined') {
return this.options.animate;
}
if (this.options.animate === Boolean(value)) {
return this.$element;
}
return this.toggleAnimate();
}
}, {
key: 'toggleAnimate',
value: function toggleAnimate() {
this.options.animate = !this.options.animate;
this.$wrapper.toggleClass(prvgetClass.call(this, 'animate'));
return this.$element;
}
}, {
key: 'disabled',
value: function disabled(value) {
if (typeof value === 'undefined') {
return this.options.disabled;
}
if (this.options.disabled === Boolean(value)) {
return this.$element;
}
return this.toggleDisabled();
}
}, {
key: 'toggleDisabled',
value: function toggleDisabled() {
this.options.disabled = !this.options.disabled;
this.$element.prop('disabled', this.options.disabled);
this.$wrapper.toggleClass(prvgetClass.call(this, 'disabled'));
return this.$element;
}
}, {
key: 'readonly',
value: function readonly(value) {
if (typeof value === 'undefined') {
return this.options.readonly;
}
if (this.options.readonly === Boolean(value)) {
return this.$element;
}
return this.toggleReadonly();
}
}, {
key: 'toggleReadonly',
value: function toggleReadonly() {
this.options.readonly = !this.options.readonly;
this.$element.prop('readonly', this.options.readonly);
this.$wrapper.toggleClass(prvgetClass.call(this, 'readonly'));
return this.$element;
}
}, {
key: 'indeterminate',
value: function indeterminate(value) {
if (typeof value === 'undefined') {
return this.options.indeterminate;
}
if (this.options.indeterminate === Boolean(value)) {
return this.$element;
}
return this.toggleIndeterminate();
}
}, {
key: 'toggleIndeterminate',
value: function toggleIndeterminate() {
this.options.indeterminate = !this.options.indeterminate;
this.$element.prop('indeterminate', this.options.indeterminate);
this.$wrapper.toggleClass(prvgetClass.call(this, 'indeterminate'));
prvcontainerPosition.call(this);
return this.$element;
}
}, {
key: 'inverse',
value: function inverse(value) {
if (typeof value === 'undefined') {
return this.options.inverse;
}
if (this.options.inverse === Boolean(value)) {
return this.$element;
}
return this.toggleInverse();
}
}, {
key: 'toggleInverse',
value: function toggleInverse() {
this.$wrapper.toggleClass(prvgetClass.call(this, 'inverse'));
var $on = this.$on.clone(true);
var $off = this.$off.clone(true);
this.$on.replaceWith($off);
this.$off.replaceWith($on);
this.$on = $off;
this.$off = $on;
this.options.inverse = !this.options.inverse;
return this.$element;
}
}, {
key: 'onColor',
value: function onColor(value) {
if (typeof value === 'undefined') {
return this.options.onColor;
}
if (this.options.onColor) {
this.$on.removeClass(prvgetClass.call(this, this.options.onColor));
}
this.$on.addClass(prvgetClass.call(this, value));
this.options.onColor = value;
return this.$element;
}
}, {
key: 'offColor',
value: function offColor(value) {
if (typeof value === 'undefined') {
return this.options.offColor;
}
if (this.options.offColor) {
this.$off.removeClass(prvgetClass.call(this, this.options.offColor));
}
this.$off.addClass(prvgetClass.call(this, value));
this.options.offColor = value;
return this.$element;
}
}, {
key: 'onText',
value: function onText(value) {
if (typeof value === 'undefined') {
return this.options.onText;
}
this.$on.html(value);
prvwidth.call(this);
prvcontainerPosition.call(this);
this.options.onText = value;
return this.$element;
}
}, {
key: 'offText',
value: function offText(value) {
if (typeof value === 'undefined') {
return this.options.offText;
}
this.$off.html(value);
prvwidth.call(this);
prvcontainerPosition.call(this);
this.options.offText = value;
return this.$element;
}
}, {
key: 'labelText',
value: function labelText(value) {
if (typeof value === 'undefined') {
return this.options.labelText;
}
this.$label.html(value);
prvwidth.call(this);
this.options.labelText = value;
return this.$element;
}
}, {
key: 'handleWidth',
value: function handleWidth(value) {
if (typeof value === 'undefined') {
return this.options.handleWidth;
}
this.options.handleWidth = value;
prvwidth.call(this);
prvcontainerPosition.call(this);
return this.$element;
}
}, {
key: 'labelWidth',
value: function labelWidth(value) {
if (typeof value === 'undefined') {
return this.options.labelWidth;
}
this.options.labelWidth = value;
prvwidth.call(this);
prvcontainerPosition.call(this);
return this.$element;
}
}, {
key: 'baseClass',
value: function baseClass() {
return this.options.baseClass;
}
}, {
key: 'wrapperClass',
value: function wrapperClass(value) {
if (typeof value === 'undefined') {
return this.options.wrapperClass;
}
var wrapperClass = value || $.fn.bootstrapSwitch.defaults.wrapperClass;
this.$wrapper.removeClass(prvgetClasses.call(this, this.options.wrapperClass).join(' '));
this.$wrapper.addClass(prvgetClasses.call(this, wrapperClass).join(' '));
this.options.wrapperClass = wrapperClass;
return this.$element;
}
}, {
key: 'radioAllOff',
value: function radioAllOff(value) {
if (typeof value === 'undefined') {
return this.options.radioAllOff;
}
var val = Boolean(value);
if (this.options.radioAllOff === val) {
return this.$element;
}
this.options.radioAllOff = val;
return this.$element;
}
}, {
key: 'onInit',
value: function onInit(value) {
if (typeof value === 'undefined') {
return this.options.onInit;
}
this.options.onInit = value || $.fn.bootstrapSwitch.defaults.onInit;
return this.$element;
}
}, {
key: 'onSwitchChange',
value: function onSwitchChange(value) {
if (typeof value === 'undefined') {
return this.options.onSwitchChange;
}
this.options.onSwitchChange = value || $.fn.bootstrapSwitch.defaults.onSwitchChange;
return this.$element;
}
}, {
key: 'destroy',
value: function destroy() {
var $form = this.$element.closest('form');
if ($form.length) {
$form.off('reset.bootstrapSwitch').removeData('bootstrap-switch');
}
this.$container.children().not(this.$element).remove();
this.$element.unwrap().unwrap().off('.bootstrapSwitch').removeData('bootstrap-switch');
return this.$element;
}
}]);
return BootstrapSwitch;
}();
function bootstrapSwitch(option) {
for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
args[_key2 - 1] = arguments[_key2];
}
function reducer(ret, next) {
var $this = $(next);
var existingData = $this.data('bootstrap-switch');
var data = existingData || new BootstrapSwitch(next, option);
if (!existingData) {
$this.data('bootstrap-switch', data);
}
if (typeof option === 'string') {
return data[option].apply(data, args);
}
return ret;
}
return Array.prototype.reduce.call(this, reducer, this);
}
$.fn.bootstrapSwitch = bootstrapSwitch;
$.fn.bootstrapSwitch.Constructor = BootstrapSwitch;
$.fn.bootstrapSwitch.defaults = {
state: true,
size: null,
animate: true,
disabled: false,
readonly: false,
indeterminate: false,
inverse: false,
radioAllOff: false,
onColor: 'primary',
offColor: 'default',
onText: 'ON',
offText: 'OFF',
labelText: '&nbsp',
handleWidth: 'auto',
labelWidth: 'auto',
baseClass: 'bootstrap-switch',
wrapperClass: 'wrapper',
onInit: function onInit() {},
onSwitchChange: function onSwitchChange() {}
};
});

Some files were not shown because too many files have changed in this diff Show More