Compare commits

..

No commits in common. "master" and "0.1-Beta" have entirely different histories.

1791 changed files with 444308 additions and 17357 deletions

View File

@ -1,28 +0,0 @@
# .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

View File

@ -1,35 +0,0 @@
# 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

2
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,2 @@
# Default ignored files
/workspace.xml

View File

@ -0,0 +1,11 @@
<component name="ArtifactManager">
<artifact type="jar" name="WasteInformationServer.main:jar">
<output-path>$PROJECT_DIR$/out/artifacts/WasteInformationServer_main_jar</output-path>
<root id="archive" name="WasteInformationServer.main.jar">
<element id="module-output" name="WasteInformationServer.main" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.eclipse.paho/org.eclipse.paho.client.mqttv3/1.0.2/e1c9a81aadf25b884c779298a90750d0ab8013a5/org.eclipse.paho.client.mqttv3-1.0.2.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/mysql/mysql-connector-java/8.0.18/e088efaa4b568bc7d9f7274b9c5ea1a00da1a45c/mysql-connector-java-8.0.18.jar" path-in-jar="/" />
<element id="extracted-dir" path="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java/3.6.1/d06d46ecfd92ec6d0f3b423b4cd81cb38d8b924/protobuf-java-3.6.1.jar" path-in-jar="/" />
</root>
</artifact>
</component>

22
.idea/gradle.xml generated Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="delegatedBuild" value="true" />
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="11" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
<option name="useAutoImport" value="true" />
<option name="useQualifiedModuleNames" value="true" />
</GradleProjectSettings>
</option>
</component>
</project>

View File

@ -0,0 +1,10 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<Languages>
<language minSize="47" name="Java" />
</Languages>
</inspection_tool>
</profile>
</component>

20
.idea/jarRepositories.xml generated Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
</component>
</project>

10
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_13" default="true" project-jdk-name="13" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

124
.idea/uiDesigner.xml generated Normal file
View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -1,28 +0,0 @@
language: java
jdk: oraclejdk8
dist: trusty
# Make the gradle wrapper executable
# before_install: chmod +x gradlew
before_install:
- wget https://services.gradle.org/distributions/gradle-6.1.1-all.zip
- unzip -qq gradle-6.1.1-all.zip
- export GRADLE_HOME=$PWD/gradle-6.1.1
- export PATH=$GRADLE_HOME/bin:$PATH
- gradle -v
script:
#- gradle check jacocoTestReport
# Also upload test coverage to codecov
#- bash <(curl -s https://codecov.io/bash)
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
- rm -f $HOME/.gradle/caches/*/fileHashes/fileHashes.bin
- rm -f $HOME/.gradle/caches/*/fileHashes/fileHashes.lock
cache:
directories:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/

View File

@ -1,12 +1,9 @@
import java.text.SimpleDateFormat
plugins {
id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.3.70'
}
group 'com.wasteinformationserver'
version '1.1.1'
version '0.1-Beta'
sourceCompatibility = 1.8
@ -16,7 +13,7 @@ repositories {
jar {
manifest {
attributes 'Main-Class': 'com.wasteinformationserver.Main'
attributes 'Main-Class': 'com.wasteinformationserver.main'
}
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
@ -29,39 +26,24 @@ sourceSets {
dependencies {
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 "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}
task run (type: JavaExec){
description = "Secure algorythm testing"
main = 'com.wasteinformationserver.Main'
main = 'com.wasteinformationserver.main'
classpath = sourceSets.main.runtimeClasspath
}
task createProperties(dependsOn: processResources) {
doLast {
new File("$projectDir/src/resources/version.prop").withWriter { w ->
new File("$projectDir/src/resources/version.properties").withWriter { w ->
Properties p = new Properties()
p['version'] = project.version.toString()
p['buildtime'] = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date())
p.store w, null
}
}
}
task myJavadocs(type: Javadoc) {
title = "JAVADOC WasteInformationServer"
source = sourceSets.main.allJava
classpath = sourceSets.main.runtimeClasspath
}
classes {
dependsOn createProperties
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}

156
db.sql Normal file
View File

@ -0,0 +1,156 @@
-- 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

@ -0,0 +1,102 @@
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.debug(list.get(n));
}
}
public void printListnew() {
for (int n = 0; n < listnew.size(); n++) {
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,50 +0,0 @@
@file:JvmName("Main")
package com.wasteinformationserver
import com.wasteinformationserver.basicutils.Info
import com.wasteinformationserver.basicutils.Log
import com.wasteinformationserver.basicutils.Storage
import com.wasteinformationserver.db.JDBC
import com.wasteinformationserver.mqtt.MqttService
import com.wasteinformationserver.website.Webserver
/**
* application entry point
*
* @author Lukas Heiligenbrunner
*/
fun main() {
Log.setLevel(Log.DEBUG)
Info.init()
Storage.getInstance().init()
Log.info("startup of WasteInformationServer")
Runtime.getRuntime().addShutdownHook(Thread(Runnable {
// shutdown routine
Log.warning("Shutting down ...")
JDBC.getInstance().disconnect();
}))
Log.info("Server version: " + Info.getVersion())
Log.debug("Build date: " + Info.getBuilddate())
//initial connect to db
Log.message("initial login to db")
val stor = Storage.getInstance();
JDBC.init(stor.dbUser, stor.dbPassword, stor.dbName, stor.dbhost, stor.dbPort)
//startup web server
val mythread = Thread(Runnable { Webserver().startserver() })
mythread.start()
//startup mqtt service
Log.message("starting mqtt service")
val m = MqttService.getInstance()
m.init(Storage.getInstance().mqttServer, Storage.getInstance().mqttPort.toString())
m.startupService()
}

View File

@ -1,85 +1,35 @@
package com.wasteinformationserver.basicutils;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
/**
* get basic infos about Software
*
* @author Lukas Heiligenbrunner
*/
public class Info {
private static String version = "not init";
private static String builddate = "not init";
private static String starttime = "not init";
public static String version="0.0";
public static String builddate;
/**
* get Software Version (defined in gradle build file)
*
* @return Version as string
*/
public static String getVersion() {
return version;
}
/**
* get Software build date
*
* @return Date as string
*/
public static String getBuilddate() {
return builddate;
}
/**
* get Server start time
*
* @return start time
*/
public static String getStarttime() {
return starttime;
}
/**
* initialize the version and builddate variables
*/
public static void init() {
starttime = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new Date());
public static void init(){
Properties prop = new Properties();
try {
URL url = Info.class.getResource("/version.prop");
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
URL url = Info.class.getResource("/version.properties");
String builddatee = format.format(new Date(new File(url.toURI()).lastModified()));
builddate=builddatee;
prop.load(url.openStream());
version = (String) prop.get("version");
builddate = (String) prop.get("buildtime");
version=(String)prop.get("version");
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
/**
* print memory utilization
* todo parse into website somehow
*/
public static void getMemoryUsage() {
Runtime runtime = Runtime.getRuntime();
NumberFormat format = NumberFormat.getInstance();
StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
sb.append("free memory: ").append(format.format(freeMemory / 1024)).append("\n");
sb.append("allocated memory: ").append(format.format(allocatedMemory / 1024)).append("\n");
sb.append("max memory: ").append(format.format(maxMemory / 1024)).append("\n");
sb.append("total free memory: ").append(format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024)).append("\n");
System.out.println(sb.toString());
}
}

View File

@ -0,0 +1,123 @@
package com.wasteinformationserver.basicutils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
public class Log {
private static final String ANSI_RESET = "\u001B[0m";
private static final String ANSI_BLACK = "\u001B[30m";
private static final String ANSI_RED = "\u001B[31m";
private static final String ANSI_GREEN = "\u001B[32m";
private static final String ANSI_YELLOW = "\u001B[33m";
private static final String ANSI_BLUE = "\u001B[34m";
private static final String ANSI_PURPLE = "\u001B[35m";
private static final String ANSI_CYAN = "\u001B[36m";
private static final String ANSI_WHITE = "\u001B[37m";
public static final int CRITICAL_ERROR = 6;
public static final int ERROR = 5;
public static final int WARNING = 4;
public static final int INFO = 3;
public static final int MESSAGE = 2;
public static final int DEBUG = 1;
private static int Loglevel = 0;
private static ArrayList<String> colors = new ArrayList<String>(Arrays.asList("", "DEBUG", "MESSAGE", "INFO", "WARNING", "ERROR", "CRITICAL_ERROR"));
public static void criticalerror(Object msg) {
if (Loglevel <= CRITICAL_ERROR)
log(msg, CRITICAL_ERROR);
}
public static void error(Object msg) {
if (Loglevel <= ERROR)
log(msg, ERROR);
}
public static void warning(Object msg) {
if (Loglevel <= WARNING)
log(msg, WARNING);
}
public static void info(Object msg) {
if (Loglevel <= INFO)
log(msg, INFO);
}
public static void message(Object msg) {
if (Loglevel <= MESSAGE)
log(msg, MESSAGE);
}
public static void debug(Object msg) {
if (Loglevel <= DEBUG)
log(msg, DEBUG);
}
public static void log(Object msg, int level) {
boolean iswindows = System.getProperty("os.name").contains("Windows");
StringBuilder builder = new StringBuilder();
if (!iswindows) {
switch (level) {
case INFO:
builder.append(ANSI_CYAN);
break;
case WARNING:
builder.append(ANSI_YELLOW);
break;
case ERROR:
builder.append(ANSI_RED);
break;
case CRITICAL_ERROR:
builder.append(ANSI_RED);
break;
case MESSAGE:
builder.append(ANSI_WHITE);
break;
case DEBUG:
builder.append(ANSI_BLUE);
break;
}
}
builder.append("[");
builder.append(calcDate(System.currentTimeMillis()));
builder.append("]");
builder.append(" [");
builder.append(new Exception().getStackTrace()[2].getClassName());
builder.append("]");
builder.append(" [");
builder.append(colors.get(level));
builder.append("]");
if (!iswindows) {
builder.append(ANSI_WHITE);
}
builder.append(" - ");
builder.append(msg.toString());
if (!iswindows) {
builder.append(ANSI_RESET);
}
System.out.println(builder.toString());
}
private static String calcDate(long millisecs) {
SimpleDateFormat date_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date resultdate = new Date(millisecs);
return date_format.format(resultdate);
}
public static void setLevel(int level) {
Loglevel = level;
}
}

View File

@ -1,139 +0,0 @@
package com.wasteinformationserver.basicutils
import java.text.SimpleDateFormat
import java.util.*
class Log {
companion object Log{
const val CRITICAL_ERROR = 6
const val ERROR = 5
const val WARNING = 4
const val INFO = 3
const val MESSAGE = 2
const val DEBUG = 1
private const val ANSI_RESET = "\u001B[0m"
private const val ANSI_BLACK = "\u001B[30m"
private const val ANSI_RED = "\u001B[31m"
private const val ANSI_GREEN = "\u001B[32m"
private const val ANSI_YELLOW = "\u001B[33m"
private const val ANSI_BLUE = "\u001B[34m"
private const val ANSI_PURPLE = "\u001B[35m"
private const val ANSI_CYAN = "\u001B[36m"
private const val ANSI_WHITE = "\u001B[37m"
private var Loglevel = 0
/**
* Log critical Error
*
* @param msg message
*/
fun criticalerror(msg: Any) {
if (Loglevel <= CRITICAL_ERROR) log(msg, CRITICAL_ERROR)
}
/**
* Log basic Error
*
* @param msg message
*/
fun error(msg: Any) {
if (Loglevel <= ERROR) log(msg, ERROR)
}
/**
* Log warning
*
* @param msg message
*/
fun warning(msg: Any) {
if (Loglevel <= WARNING) log(msg, WARNING)
}
/**
* Log info
*
* @param msg message
*/
fun info(msg: Any) {
if (Loglevel <= INFO) log(msg, INFO)
}
/**
* Log basic message
*
* @param msg message
*/
fun message(msg: Any) {
if (Loglevel <= MESSAGE) log(msg, MESSAGE)
}
/**
* Log debug Message
*
* @param msg message
*/
fun debug(msg: Any) {
if (Loglevel <= DEBUG) log(msg, DEBUG)
}
/**
* Log as defined
*
* @param msg message
* @param level Loglevel --> static vals defined
*/
fun log(msg: Any, level: Int) {
val iswindows = System.getProperty("os.name").contains("Windows")
val builder = StringBuilder()
if (!iswindows) {
when (level) {
INFO -> builder.append(ANSI_CYAN)
WARNING -> builder.append(ANSI_YELLOW)
ERROR -> builder.append(ANSI_RED)
CRITICAL_ERROR -> builder.append(ANSI_RED)
MESSAGE -> builder.append(ANSI_WHITE)
DEBUG -> builder.append(ANSI_BLUE)
}
}
builder.append("[")
builder.append(calcDate(System.currentTimeMillis()))
builder.append("]")
builder.append(" [")
builder.append(Exception().stackTrace[2].className)
builder.append("]")
builder.append(" [")
builder.append(colors[level])
builder.append("]")
if (!iswindows) {
builder.append(ANSI_WHITE)
}
builder.append(" - ")
builder.append(msg.toString())
if (!iswindows) {
builder.append(ANSI_RESET)
}
println(builder.toString())
}
/**
* define Loglevel call on startup or at runtime
* default: 0[DEBUG] --> Max logging
*
* @param level Loglevel --> static vals defined
*/
fun setLevel(level: Int) {
Loglevel = level
}
private val colors = ArrayList(listOf("", "DEBUG", "MESSAGE", "INFO", "WARNING", "ERROR", "CRITICAL_ERROR"))
private fun calcDate(milliSecs: Long): String? {
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val resultDate = Date(milliSecs)
return dateFormat.format(resultDate)
}
}
}

View File

@ -1,163 +0,0 @@
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

@ -0,0 +1,90 @@
package com.wasteinformationserver.db;
import com.wasteinformationserver.basicutils.Log;
import javax.swing.table.DefaultTableModel;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Vector;
public 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;
public static void logToConsole(ResultSet res) {
try {
ResultSetMetaData rsmd = res.getMetaData();
while (res.next()) {
String row = "";
for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
if (row.length() > 0) {
row += ", ";
}
if (res.getObject(i) != null) {
row +=
rsmd.getColumnName(i) +
": " +
res.getObject(i).toString();
}
}
Log.debug(row);
}
} catch (SQLException e) {
}
}
public static DefaultTableModel logToTable(ResultSet res) {
try {
ResultSetMetaData rsmd = res.getMetaData();
Vector<String> columnNames = new Vector<>();
int columnCount = rsmd.getColumnCount();
for (int i = 1; i <= columnCount; ++i) {
columnNames.add(rsmd.getColumnName(i));
}
Vector<Vector<Object>> data = new Vector<>();
while (res.next()) {
Vector<Object> row = new Vector();
for (int i = 1; i <= columnCount; ++i) {
row.add(res.getObject(i));
}
data.add(row);
}
return new DefaultTableModel(data, columnNames);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -1,229 +0,0 @@
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.sql.*;
import java.util.Scanner;
/**
* basic connection class to a Database
*
* @author Lukas Heiligenbrunner
* @author Emil Meindl
*/
public class JDBC {
private static Connection conn;
private static JDBC JDBC;
private static boolean loggedin = false;
private static String usernamec;
private static String passwordc;
private static String dbnamec;
private static String ipc;
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
* suggested on startup
*
* @param username db username
* @param password db password
* @param dbname Database name
* @param ip Server ip or hostname
* @param port Server port
* @throws IOException
*/
public static void init(String username, String password, String dbname, String ip, int port) throws IOException {
usernamec = username;
passwordc = password;
dbnamec = dbname;
ipc = ip;
portc = port;
JDBC = new JDBC(username, password, dbname, ip, port);
}
/**
* get instance of db object
* logindata has to be set before!
*
* @return JDBC object of this
* @throws IOException
*/
public static JDBC getInstance() {
if (!loggedin) {
JDBC = new JDBC(usernamec, passwordc, dbnamec, ipc, portc);
}
return JDBC;
}
/**
* initial login to db -- should be called only one time or for reconnect
*
* @param username username
* @param password password
* @param dbname Database name
* @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 {
DriverManager.setLoginTimeout(1);
conn = DriverManager.getConnection(
"jdbc:mysql://" + ip + ":" + port + "/" + dbname + "?useSSL=false&serverTimezone=CET",
username,
password);
checkDBStructure();
loggedin = true;
Log.Log.message("Connected to database");
} catch (SQLException e) {
// 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();
}
}
/**
* execute basic query --> requests only
*
* @param sql query sql statement
* @return ResultSet representating the table
*/
public ResultSet executeQuery(String sql) {
try {
conn.isValid(5);
PreparedStatement stmt = conn.prepareStatement(sql);
return stmt.executeQuery();
} catch (SQLNonTransientConnectionException ee) {
if (logintodb(usernamec, passwordc, dbnamec, ipc, portc)) {
return this.executeQuery(sql);
} else {
return null;
}
} catch (SQLException e) {
return null;
}
}
/**
* update db in some way
*
* @param sql sql insert/update/delete statement
* @return status
* @throws SQLException
*/
public int executeUpdate(String sql) throws SQLException {
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();
}
}
}
/**
* 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

@ -0,0 +1,74 @@
package com.wasteinformationserver.db;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDCB {
static Connection conn;
static JDCB jdcb;
static boolean loggedin = false;
static String usernamec;
static String passwordc;
static String dbnamec;
static String ipc;
static int portc;
public static void init(String username, String password, String dbname, String ip, int port) throws IOException {
usernamec = username;
passwordc = password;
dbnamec = dbname;
jdcb = new JDCB(username, password, dbname, ip, port);
}
private JDCB(String username, String password, String dbname, String ip, int port) throws IOException {
logintodb(username, password, dbname, ip, port);
}
public static JDCB getInstance() throws IOException {
if (loggedin) {
return jdcb;
} else {
logintodb(usernamec, passwordc, dbnamec, ipc, portc);
return jdcb;
}
}
public static void logintodb(String username, String password, String dbname, String ip, int port) throws IOException {
Database db = new MySQLConnector(
username,
password,
ip,
port,
dbname);
try {
conn = db.getConnection();
loggedin = true;
} catch (SQLException e) {
throw new IOException("No connection to database");
}
}
public ResultSet executeQuery(String sql) {
try {
PreparedStatement stmt = conn.prepareStatement(sql);
return stmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public int executeUpdate(String sql) throws SQLException {
PreparedStatement stmt = conn.prepareStatement(sql);
return stmt.executeUpdate();
}
}

View File

@ -0,0 +1,29 @@
package com.wasteinformationserver.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public 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); // TODO: 30.11.19 set higher maybe
return DriverManager.getConnection(
"jdbc:mysql://" + host + ":" + port + "/" + dbName + "?useSSL=false",
user,
password);
}
}

View File

@ -0,0 +1,37 @@
package com.wasteinformationserver.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class PostgreSQLConnector extends Database {
static {
try {
Class.forName("org.postgresql.Driver").newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public PostgreSQLConnector(String user, String password, String host, int port, String dbName) {
super(user, password, host, port, dbName);
}
@Override
public Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection(
"jdbc:postgresql://" + host + ":" + port + "/" + dbName,
user,
password);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
}

View File

@ -0,0 +1,59 @@
package com.wasteinformationserver;
import com.wasteinformationserver.basicutils.Info;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.db.JDCB;
import com.wasteinformationserver.mqtt.mqtt;
import com.wasteinformationserver.website.Webserver;
import java.io.IOException;
public class main {
public static void main(String[] args) {
Log.setLevel(Log.DEBUG);
Log.info("startup of WasteInformationServer");
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
Thread.sleep(200);
Log.warning("Shutting down ...");
//shutdown routine
} catch (InterruptedException e) {
e.printStackTrace();
}
}));
Info.init();
Log.info("Server version: "+Info.version);
Log.debug("Build date: "+Info.builddate);
//initial connect to db
Log.message("initial login to db");
new Thread(() -> {
try {
JDCB.init("ingproject", "Kb9Dxklumt76ieq6", "ingproject", "db.power4future.at", 3306);
//JDCB.init("users", "kOpaIJUjkgb9ur6S", "wasteinformation", "192.168.65.15", 3306);
} catch (IOException e) {
//e.printStackTrace();
Log.error("no connection to db");
}
}).start();
//startup web server
Thread mythread = new Thread(() -> new Webserver().startserver());
mythread.start();
//startup mqtt service
Log.message("starting mqtt service");
try {
mqtt m = new mqtt();
m.notifymessage();
} catch (Exception e) {
Log.debug("An error was happened in the class mqtt");
}
}
}

View File

@ -0,0 +1,4 @@
package com.wasteinformationserver.mqtt;
public class Database {
}

View File

@ -1,185 +0,0 @@
package com.wasteinformationserver.mqtt
import com.wasteinformationserver.basicutils.Log
import com.wasteinformationserver.basicutils.Log.Log.debug
import com.wasteinformationserver.basicutils.Log.Log.error
import com.wasteinformationserver.basicutils.Log.Log.info
import com.wasteinformationserver.basicutils.Log.Log.message
import com.wasteinformationserver.basicutils.Log.Log.warning
import com.wasteinformationserver.db.JDBC
import org.eclipse.paho.client.mqttv3.*
import java.sql.SQLException
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*
/**
* Mqtt Service to receive and send back messages to the Hardware
* check values from db send right feedback to hardware.
*
* @author Lukas Heiligenbrunner
* @author Gregor Dutzler
*/
class MqttService {
private var serveruri: String = "";
private lateinit var client: MqttClient;
private var db: JDBC = JDBC.getInstance()
companion object {
private val obj = MqttService()
fun getInstance(): MqttService {
return obj;
}
}
fun init(serverurl: String, port: String){
serveruri = "tcp://$serverurl:$port"
}
/**
* startup of the mqtt service
*/
fun startupService() {
if(JDBC.isConnected()) {
try {
client = MqttClient(serveruri, "WasteInformationServerID")
val connOpts = MqttConnectOptions()
connOpts.isCleanSession = true
client.connect(connOpts)
client.setCallback(object : MqttCallback {
override fun connectionLost(throwable: Throwable) {
error("connection lost")
Thread.sleep(500)
// restart service
startupService()
}
override fun messageArrived(s: String, mqttMessage: MqttMessage) {
val deviceid = String(mqttMessage.payload)
message("received Request from PCB")
val res = db.executeQuery("SELECT * from devices WHERE DeviceID=$deviceid")
try {
res.last()
if (res.row != 0) {
// existing device
res.first()
val devicecities = db.executeQuery("SELECT * from device_city WHERE DeviceID='$deviceid'")
devicecities.last()
if (devicecities.row == 0) {
// not configured
tramsmitMessage("$deviceid,-1")
}
else {
devicecities.first()
devicecities.previous()
while (devicecities.next()) {
val cityid = devicecities.getInt("CityID")
checkDatabase(cityid, deviceid.toInt())
}
}
}
else {
// new device
db.executeUpdate("INSERT INTO devices (DeviceID) VALUES ($deviceid)")
info("new device registered to server")
tramsmitMessage("$deviceid,-1")
}
} catch (e: SQLException) {
e.printStackTrace()
}
}
override fun deliveryComplete(iMqttDeliveryToken: IMqttDeliveryToken) {}
})
client.subscribe("TopicIn")
} catch (e: MqttException) {
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) {
var wastetype = -1
val set2 = db.executeQuery("SELECT * FROM cities WHERE `id`='$citywastezoneid'")
try {
set2.last()
if (set2.row != 1) {
//error
warning("multiple Rows with same city id found - DB Error")
}
else {
val typ = set2.getString("wastetype")
wastetype = getIntTyp(typ)
}
} catch (e: SQLException) {
e.printStackTrace()
}
val result = db.executeQuery("SELECT pickupdates.pickupdate FROM pickupdates WHERE pickupdates.citywastezoneid=$citywastezoneid")
try {
result.last()
if (result.row == 0) {
//if not found in db --> send zero
debug("not found in db")
tramsmitMessage("$deviceid,$wastetype,0")
}
else {
debug(result.getString("pickupdate"))
result.first()
do {
val formatter = SimpleDateFormat("yyyy-MM-dd")
val timestamp = formatter.parse(result.getString("pickupdate")).time
val timestampnow = formatter.parse(formatter.format(Date())).time
debug("timestamp is :$timestamp")
if (timestamp == timestampnow || timestamp == timestampnow + 86400000) { // 86400000 == one day
// valid time
tramsmitMessage("$deviceid,$wastetype,1")
debug("valid time")
return
}
} while (result.next())
tramsmitMessage("$deviceid,$wastetype,0")
//transmit zero if not returned before
}
} catch (e: SQLException) {
e.printStackTrace()
} catch (e: ParseException) {
e.printStackTrace()
}
}
/**
* send a mqtt message to predefined topic
*/
private fun tramsmitMessage(temp: String) {
message("reply back to PCB: $temp")
val message = MqttMessage(temp.toByteArray())
message.qos = 2
try {
client.publish("TopicOut", message)
} catch (e: MqttException) {
e.printStackTrace()
}
}
/**
* parse Type name to representing integer value
*/
private fun getIntTyp(temp: String): Int {
return when (temp) {
"Plastic" -> 1
"Metal" -> 2
"Residual waste" -> 3
"Biowaste" -> 4
else -> 0
}
}
}

View File

@ -0,0 +1,123 @@
package com.wasteinformationserver.mqtt;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.db.JDCB;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class mqtt {
MqttClient client = null;
public mqtt() {
}
public void notifymessage() {
try {
client = new MqttClient("tcp://192.168.65.15:1883", "JavaSample");
MqttConnectOptions connOpts = new MqttConnectOptions();
connOpts.setCleanSession(true);
client.connect(connOpts);
} catch (MqttException e) {
Log.error("Connection to the ESB was failed");
}
mqttreceiver mr = new mqttreceiver(client);
mr.addMessageReceivedListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = e.getActionCommand();
String[] split = temp.split(",");
getDatabasedata("SELECT pickupdates.pickupdate FROM pickupdates WHERE pickupdates.citywastezoneid=(SELECT cities.zone FROM cities WHERE cities.name='" + split[1] + "' AND cities.wastetype='" + split[2] + "' AND cities.zone=" + split[3] + ")", split[2], Integer.parseInt(split[0]));
}
});
mr.getmessage();
}
public void getDatabasedata(String message, String wastetyp, int clientidentify) {
Log.debug(message);
JDCB Database = null;
try {
Database = JDCB.getInstance();
} catch (IOException e) {
Log.error("No Connection to the databank");
}
//new JDCB("placeuser", "eaL956R6yFItQVBl", "wasteinformation");
ResultSet result = Database.executeQuery(message);
try {
if (!result.isBeforeFirst()) {
int abholtag = 0;
transmitmessageAbfallart(clientidentify + "," + wastetyp + "," + abholtag);
} else {
while (result.next()) {
String temptime = String.valueOf(result.getString("pickupdate"));
GregorianCalendar now = new GregorianCalendar();
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG);
String date = df.format(now.getTime());
String[] parts = temptime.split("-");
String tempyear = parts[0];
String[] yearsplit = tempyear.split("0");
String tempyearnew = yearsplit[1];
String newDate = parts[2] + "." + parts[1] + ".20" + tempyearnew;
String[] partstwo = date.split(" ");
String Datetomorrow = nexDayDate();
int abholtag;
if (partstwo[0].contains(newDate) || partstwo[0].contains(Datetomorrow)) {
abholtag = 1;
transmitmessageAbfallart(clientidentify + "," + wastetyp + "," + abholtag);
} else {
abholtag = 0;
transmitmessageAbfallart(clientidentify + "," + wastetyp + "," + abholtag);
}
}
}
} catch (SQLException e) {
Log.error("No data from database");
}
}
private void transmitmessageAbfallart(String temp) {
mqtttransmitter mt = new mqtttransmitter(client);
Log.debug(temp);
mt.sendmessage(temp);
}
private String nexDayDate() {
final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
Date currentDate = new Date();
Calendar c = Calendar.getInstance();
c.setTime(currentDate);
c.add(Calendar.DATE, 1);
Date currentDatePlusOne = c.getTime();
String temp = dateFormat.format(currentDatePlusOne);
String split[] = temp.split("/");
String newDate = split[2] + "." + split[1] + "." + split[0];
return newDate;
}
}

View File

@ -0,0 +1,61 @@
package com.wasteinformationserver.mqtt;
import com.wasteinformationserver.basicutils.Log;
import org.eclipse.paho.client.mqttv3.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class mqttreceiver {
private MqttClient client;
public ArrayList<ActionListener> mylisteners = new ArrayList<>();
public String message;
public mqttreceiver(MqttClient mqtt) {
this.client = mqtt;
}
public String getmessage() {
try {
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable throwable) {
Log.error("connection lost");
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
message = new String(mqttMessage.getPayload());
notifylisteners(message);
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
client.subscribe("TopicIn");
Log.debug("subscribed topic");
} catch (MqttException e) {
Log.error("Connection to the ESB was failed");
}
return message;
}
private void notifylisteners(String message) {
for (ActionListener ac : mylisteners) {
ac.actionPerformed(new ActionEvent(this, 0, message));
}
}
public void addMessageReceivedListener(ActionListener l) {
mylisteners.add(l);
}
}

View File

@ -0,0 +1,40 @@
package com.wasteinformationserver.mqtt;
import com.wasteinformationserver.basicutils.Log;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class mqtttransmitter {
MqttClient client;
public mqtttransmitter(MqttClient client) {
this.client = client;
}
public void sendmessage(String temp) {
String topic = "TopicOut";
String content = temp;
int qos = 2;
MemoryPersistence persistence = new MemoryPersistence();
try {
Log.debug("Connected");
Log.debug("Publishing message: " + content);
MqttMessage message = new MqttMessage(content.getBytes());
message.setQos(qos);
client.publish(topic, message);
Log.debug("Message published");
} catch (MqttException me) {
Log.debug("reason " + me.getReasonCode());
Log.debug("msg " + me.getMessage());
Log.debug("loc " + me.getLocalizedMessage());
Log.debug("cause " + me.getCause());
Log.debug("excep " + me);
}
}
}

View File

@ -0,0 +1,19 @@
package com.wasteinformationserver.website;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class HttpTools {
public static String StringToMD5(String value) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(value.getBytes());
BigInteger no = new BigInteger(1, messageDigest);
return no.toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
}
}
}

View File

@ -1,32 +0,0 @@
package com.wasteinformationserver.website
import java.math.BigInteger
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
/**
* basic http tools
*
* @author Lukas Heiligenbrunner
*/
class HttpTools {
companion object{
/**
* create md5 hash of string
*
* @param value input string
* @return md5 hash
*/
fun stringToMD5(value: String): String {
return try {
val md = MessageDigest.getInstance("MD5")
val messageDigest = md.digest(value.toByteArray())
val no = BigInteger(1, messageDigest)
no.toString(16)
} catch (e: NoSuchAlgorithmException) {
e.printStackTrace()
""
}
}
}
}

View File

@ -0,0 +1,78 @@
// Dear programmer:
// When I wrote this code, only god and
// I knew how it worked.
// Now, only god knows it!
//
// Therefore, if you are trying to optimize
// this routine and it fails (most surely),
// please increase this counter as a
// warning for the next person:
//
// total hours wasted here = 254
//
package com.wasteinformationserver.website;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.website.datarequests.login.LoginState;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class MainPage implements HttpHandler {
@Override
public void handle(HttpExchange t) throws IOException {
String path = t.getRequestURI().getPath();
if (path.equals("/")) {
path += "index.html";
}
Log.debug("looking for: " + path);
if (path.contains(".html")) {
if (LoginState.getObject().isLoggedIn() || path.equals("/register.html") || path.equals("/index.html")) { //pass only register page
sendPage(path, t);
} else {
Log.warning("user not logged in --> redirecting to login page");
sendPage("/index.html", t);
}
} else { //only detect login state on html pages
sendPage(path, t);
}
}
private void sendPage(String path, HttpExchange t) throws IOException {
InputStream fs = getClass().getResourceAsStream("/wwwroot" + path);
if (fs == null && path.contains(".html")) {
Log.warning("wrong page sending 404");
sendPage("/404Error.html", t);
} else if (fs == null) {
Log.warning("requested resource doesnt exist");
} else {
// Object exists and is a file: accept with response code 200.
String mime = "text/html";
if (path.substring(path.length() - 3).equals(".js")) mime = "application/javascript";
if (path.substring(path.length() - 3).equals("css")) mime = "text/css";
Headers h = t.getResponseHeaders();
h.set("Content-Type", mime);
t.sendResponseHeaders(200, 0);
OutputStream os = t.getResponseBody();
final byte[] buffer = new byte[0x10000];
int count;
while ((count = fs.read(buffer)) >= 0) {
os.write(buffer, 0, count);
}
fs.close();
os.close();
}
}
}

View File

@ -1,69 +0,0 @@
package com.wasteinformationserver.website
import com.sun.net.httpserver.HttpExchange
import com.sun.net.httpserver.HttpHandler
import com.wasteinformationserver.basicutils.Log.Log.debug
import com.wasteinformationserver.basicutils.Log.Log.warning
import com.wasteinformationserver.basicutils.Storage
import com.wasteinformationserver.website.datarequests.login.LoginState
import java.io.IOException
/**
* Http handler to deliver all the main pages (index.html ...)
*
* @author Lukas Heiligenbrunner
*/
class MainPage : HttpHandler {
@Throws(IOException::class)
override fun handle(t: HttpExchange) {
var path = t.requestURI.path
if (path == "/") {
path += "index.html"
}
debug("looking for: $path")
if (path.contains(".html")) {
// if not logged in allow only register and index page!
if (LoginState.getObject().isLoggedIn || path == "/register.html" || path == "/index.html") {
sendPage(path, t)
}
else {
warning("user not logged in --> redirecting to login page")
sendPage("/index.html", t)
}
}
else {
//only detect login state on html pages
sendPage(path, t)
}
}
@Throws(IOException::class)
private fun sendPage(path: String, t: HttpExchange) {
val fs = javaClass.getResourceAsStream("/wwwroot$path")
if (fs == null && path.contains(".html")) {
warning("wrong page sending 404")
sendPage("/404Error.html", t)
}
else if (fs == null) {
warning("requested resource doesnt exist --> $path")
}
else { // Object exists and is a file: accept with response code 200.
var mime = "text/html"
val s = path.substring(path.length - 3)
if (s == ".js") mime = "application/javascript"
if (s == "css") mime = "text/css"
val h = t.responseHeaders
h["Content-Type"] = mime
t.sendResponseHeaders(200, 0)
val os = t.responseBody
val buffer = ByteArray(0x10000)
var count: Int
while (fs.read(buffer).also { count = it } >= 0) {
os.write(buffer, 0, count)
}
fs.close()
os.close()
}
}
}

View File

@ -0,0 +1,99 @@
package com.wasteinformationserver.website;
import com.sun.net.httpserver.HttpServer;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.website.datarequests.AdminRequests;
import com.wasteinformationserver.website.datarequests.DataRequest;
import com.wasteinformationserver.website.datarequests.NewDateRequest;
import com.wasteinformationserver.website.datarequests.RegisterRequest;
import com.wasteinformationserver.website.datarequests.login.CheckLoginState;
import com.wasteinformationserver.website.datarequests.login.LoginRequest;
import java.io.IOException;
import java.net.InetSocketAddress;
public class Webserver {
public void startserver() {
Log.info("starting Webserver");
HttpServer server = null;
try {
server = HttpServer.create(new InetSocketAddress(8000), 0);
} catch (IOException e) {
e.printStackTrace();
}
server.createContext("/", new MainPage());
server.createContext("/senddata/loginget", new LoginRequest());
server.createContext("/senddata/registerpost", new RegisterRequest());
server.createContext("/senddata/checkloginstate", new CheckLoginState());
server.createContext("/senddata/wastedata", new DataRequest());
server.createContext("/senddata/admindata", new AdminRequests());
server.createContext("/senddata/newdate", new NewDateRequest());
server.setExecutor(null); // creates a default executor
server.start();
Log.info("Server available at http://127.0.0.1:8000 now");
/*
try {
server = HttpsServer.create(new InetSocketAddress(8000), 0);
// initialise the HTTPS server
SSLContext sslContext = SSLContext.getInstance("TLS");
// initialise the keystore
char[] password = "password".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("testkey.jks");
ks.load(fis, password);
// setup the key manager factory
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
// setup the trust manager factory
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
// setup the HTTPS context and parameters
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
server.setHttpsConfigurator(new HttpsConfigurator(sslContext) {
public void configure(HttpsParameters params) {
try {
// initialise the SSL context
SSLContext context = getSSLContext();
SSLEngine engine = context.createSSLEngine();
params.setNeedClientAuth(false);
params.setCipherSuites(engine.getEnabledCipherSuites());
params.setProtocols(engine.getEnabledProtocols());
// Set the SSL parameters
SSLParameters sslParameters = context.getSupportedSSLParameters();
params.setSSLParameters(sslParameters);
} catch (Exception ex) {
System.out.println("Failed to create HTTPS port");
}
}
});
} catch (IOException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
*/
}
}

View File

@ -1,40 +0,0 @@
package com.wasteinformationserver.website
import com.sun.net.httpserver.HttpServer
import com.wasteinformationserver.basicutils.Log.Log.criticalerror
import com.wasteinformationserver.basicutils.Log.Log.info
import com.wasteinformationserver.website.datarequests.*
import com.wasteinformationserver.website.datarequests.login.CheckLoginState
import com.wasteinformationserver.website.datarequests.login.LoginRequest
import java.io.IOException
import java.net.BindException
import java.net.InetSocketAddress
/**
* class to create the website nodes at specific paths
*
* @author Lukas Heiligenbrunner
*/
class Webserver {
fun startserver() {
info("starting Webserver")
try {
val server = HttpServer.create(InetSocketAddress(8000), 0)
server.createContext("/", MainPage())
server.createContext("/senddata/loginget", LoginRequest())
server.createContext("/senddata/registerpost", RegisterRequest())
server.createContext("/senddata/checkloginstate", CheckLoginState())
server.createContext("/senddata/wastedata", DataRequest())
server.createContext("/senddata/admindata", AdminRequests())
server.createContext("/senddata/newdate", NewDateRequest())
server.createContext("/senddata/Devicedata", DeviceRequest())
server.executor = java.util.concurrent.Executors.newCachedThreadPool() // creates a default executor
server.start()
info("Server available at http://127.0.0.1:8000 now")
} catch (e: BindException) {
criticalerror("The Port 8000 is already in use!")
} catch (e: IOException) {
e.printStackTrace()
}
}
}

View File

@ -0,0 +1,45 @@
package com.wasteinformationserver.website.basicrequest;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
public abstract class GetRequest implements HttpHandler {
@Override
public void handle(HttpExchange httpExchange) throws IOException {
if (httpExchange.getRequestMethod().equals("GET")) {
String query = httpExchange.getRequestURI().getQuery();
HashMap<String, String> params = new HashMap<>();
String[] res = query.split("&");
for (String str : res) {
String[] values = str.split("=");
params.put(values[0], values[1]);
}
String response = myrequest(params);
Headers h = httpExchange.getResponseHeaders();
h.set("Content-Type", "application/json");
httpExchange.sendResponseHeaders(200, 0);
OutputStream os = httpExchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
/**
* @param params received get params from com.wasteinformationserver.website
* @return json reply to com.wasteinformationserver.website
*/
public abstract String myrequest(HashMap<String, String> params);
}

View File

@ -1,38 +0,0 @@
package com.wasteinformationserver.website.basicrequest
import com.sun.net.httpserver.HttpExchange
import com.sun.net.httpserver.HttpHandler
import java.io.IOException
import java.util.*
/**
* basic GET request handler
* reply function has to be implemented!
*/
abstract class GetRequest : HttpHandler {
@Throws(IOException::class)
override fun handle(httpExchange: HttpExchange) {
if (httpExchange.requestMethod == "GET") {
val query = httpExchange.requestURI.query
val params = HashMap<String, String>()
val res = query.split("&".toRegex()).toTypedArray()
for (str in res) {
val values = str.split("=".toRegex()).toTypedArray()
params[values[0]] = values[1]
}
val response = myrequest(params)
val h = httpExchange.responseHeaders
h["Content-Type"] = "application/json"
httpExchange.sendResponseHeaders(200, 0)
val os = httpExchange.responseBody
os.write(response.toByteArray())
os.close()
}
}
/**
* @param params received get params from com.wasteinformationserver.website
* @return json reply to com.wasteinformationserver.website
*/
abstract fun myrequest(params: HashMap<String, String>): String
}

View File

@ -0,0 +1,52 @@
package com.wasteinformationserver.website.basicrequest;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
public abstract class PostRequest implements HttpHandler {
@Override
public void handle(HttpExchange httpExchange) throws IOException {
if (httpExchange.getRequestMethod().equals("POST")) {
StringBuilder sb = new StringBuilder();
InputStream ios = httpExchange.getRequestBody();
int i;
while ((i = ios.read()) != -1) {
sb.append((char) i);
}
String query = sb.toString();
HashMap<String, String> params = new HashMap<>();
String[] res = query.split("&");
for (String str : res) {
String[] values = str.split("=");
params.put(values[0], values[1]);
}
String response = request(params);
Headers h = httpExchange.getResponseHeaders();
h.set("Content-Type", "application/json");
httpExchange.sendResponseHeaders(200, 0);
OutputStream os = httpExchange.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
/**
* @param params received get params from com.wasteinformationserver.website
* @return json reply to com.wasteinformationserver.website
*/
public abstract String request(HashMap<String, String> params);
}

View File

@ -1,44 +0,0 @@
package com.wasteinformationserver.website.basicrequest
import com.sun.net.httpserver.HttpExchange
import com.sun.net.httpserver.HttpHandler
import java.io.IOException
import java.util.*
/**
* basic POST request handler
* reply function has to be implemented!
*/
abstract class PostRequest : HttpHandler {
@Throws(IOException::class)
override fun handle(httpExchange: HttpExchange) {
if (httpExchange.requestMethod == "POST") {
val sb = StringBuilder()
val ios = httpExchange.requestBody
var i: Int
while (ios.read().also { i = it } != -1) {
sb.append(i.toChar())
}
val query = sb.toString()
val params = HashMap<String, String>()
val res = query.split("&".toRegex()).toTypedArray()
for (str in res) {
val values = str.split("=".toRegex()).toTypedArray()
params[values[0]] = values[1]
}
val response = request(params)
val h = httpExchange.responseHeaders
h["Content-Type"] = "application/json"
httpExchange.sendResponseHeaders(200, 0)
val os = httpExchange.responseBody
os.write(response.toByteArray())
os.close()
}
}
/**
* @param params received get params from com.wasteinformationserver.website
* @return json reply to com.wasteinformationserver.website
*/
abstract fun request(params: HashMap<String, String>): String
}

View File

@ -1,6 +1,5 @@
package com.wasteinformationserver.website.datarequests;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.website.basicrequest.PostRequest;
import java.io.File;
@ -9,25 +8,14 @@ import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
/**
* all requests for Admin page
*
* @author Lukas Heiligenbrunner
*/
public class AdminRequests extends PostRequest {
@Override
public String request(HashMap<String, String> params) {
String result = "";
switch (params.get("action")) {
/**
* shut down the whole application
*/
case "shutdownserver":
System.exit(0);
break;
/**
* restart the server application
*/
case "restartserver":
final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
File currentJar = null;
@ -39,10 +27,10 @@ public class AdminRequests extends PostRequest {
/* is it a jar file? */
if (!currentJar.getName().endsWith(".jar"))
Log.Log.warning("not jar --> cant restart");
System.out.println("not jar");
/* Build command: java -jar application.jar */
final ArrayList<String> command = new ArrayList<>();
final ArrayList<String> command = new ArrayList<String>();
command.add(javaBin);
command.add("-jar");
command.add(currentJar.getPath());

View File

@ -0,0 +1,188 @@
package com.wasteinformationserver.website.datarequests;
import com.wasteinformationserver.basicutils.Info;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.db.JDCB;
import com.wasteinformationserver.website.basicrequest.PostRequest;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
public class DataRequest extends PostRequest {
@Override
public String request(HashMap<String, String> params) {
StringBuilder sb = new StringBuilder();
JDCB jdcb;
try {
jdcb = JDCB.getInstance();
} catch (IOException e) {
Log.error("no connection to db");
return "{\"query\" : \"nodbconn\"}";
}
switch (params.get("action")) {
case "newCity":
sb.append("{");
Log.debug(params.toString());
// check if wastezone and wasteregion already exists
Log.debug(params.get("cityname") + params.get("wastetype") + params.get("wastezone"));
ResultSet set = jdcb.executeQuery("select * from `cities` where `name`='" + params.get("cityname") + "' AND `wastetype`='" + params.get("wastetype") + "' AND `zone`='" + params.get("wastezone") + "'");
int size = 0;
try {
if (set != null) {
set.last(); // moves cursor to the last row
size = set.getRow(); // get row id
}
} catch (SQLException e) {
e.printStackTrace();
}
if (size == 0) {
//doesnt exist
System.out.println("doesnt exist");
int status = 0;
try {
status = jdcb.executeUpdate("INSERT INTO `cities`(`userid`, `name`, `wastetype`, `zone`) VALUES ('0','" + params.get("cityname") + "','" + params.get("wastetype") + "','" + params.get("wastezone") + "');");
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(status);
if (status == 1) {
sb.append("\"status\" : \"inserted\"");
} else {
sb.append("\"status\" : \"inserterror\"");
}
} else if (size > 1) {
Log.warning("more than one entry in db!!!");
sb.append("\"status\" : \"exists\"");
} else {
//already exists
System.out.println("already exists");
sb.append("\"status\" : \"exists\"");
}
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "getAllCities":
ResultSet sett = jdcb.executeQuery("select * from cities");
Log.debug(sett.toString());
sb.append("{\"data\":[");
try {
while (sett.next()) {
sb.append("{\"cityname\":\"" + sett.getString("name") + "\"");
sb.append(",\"wastetype\":\"" + sett.getString("wastetype") + "\"");
sb.append(",\"id\":\"" + sett.getString("id") + "\"");
sb.append(",\"zone\":\"" + sett.getString("zone") + "\"}");
if (!sett.isLast()) {
sb.append(",");
}
// System.out.println(sett.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
sb.append("]");
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "deletecity":
//DELETE FROM `cities` WHERE `id`=0
sb.append("{");
Log.debug(params.get("id"));
int status = 0;
try {
status = jdcb.executeUpdate("DELETE FROM `cities` WHERE `id`='" + params.get("id") + "'");
if (status == 1) {
//success
sb.append("\"status\" : \"success\"");
} else {
sb.append("\"status\" : \"error\"");
}
} catch (SQLIntegrityConstraintViolationException e) {
Log.warning("dependencies of deletion exist");
sb.append("\"status\" : \"dependenciesnotdeleted\"");
} catch (SQLException e) {
Log.error("sql exception: " + e.getMessage());
sb.append("\"status\" : \"error\"");
}
Log.debug(status);
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "getcollectionnumber": //todo maybe combine all three to one
sb.append("{");
try {
ResultSet settt = jdcb.executeQuery("select * from pickupdates");
settt.last();
sb.append("\"collectionnumber\":\"" + settt.getRow() + "\"");
} catch (SQLException e) {
Log.error("sql exception: " + e.getMessage());
sb.append("\"status\" : \"error\"");
}
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "getcollectioninfuture":
sb.append("{");
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
String time = sdf.format(date);
ResultSet settt = jdcb.executeQuery("SELECT * FROM `pickupdates` WHERE `pickupdate` BETWEEN '"+time+"' AND '2222-12-27'");
settt.last();
sb.append("\"collectionnumber\":\"" + settt.getRow() + "\"");
} catch (SQLException e) {
Log.error("sql exception: " + e.getMessage());
sb.append("\"status\" : \"error\"");
}
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "getfinishedcollections":
sb.append("{");
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
String time = sdf.format(date);
ResultSet settt = jdcb.executeQuery("SELECT * FROM `pickupdates` WHERE `pickupdate` BETWEEN '0000-12-27' AND '"+time+"'");
settt.last();
sb.append("\"collectionnumber\":\"" + settt.getRow() + "\"");
} catch (SQLException e) {
Log.error("sql exception: " + e.getMessage());
sb.append("\"status\" : \"error\"");
}
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
case "getversionandbuildtime":
sb.append("{");
sb.append("\"version\" : \""+ Info.version+"\"");
sb.append(",\"buildtime\" : \""+ Info.builddate+"\"");
sb.append(",\"query\":\"ok\"");
sb.append("}");
break;
}
return sb.toString();
}
}

View File

@ -1,216 +0,0 @@
package com.wasteinformationserver.website.datarequests
import com.wasteinformationserver.basicutils.Info
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
import java.sql.SQLIntegrityConstraintViolationException
import java.text.SimpleDateFormat
import java.util.*
/**
* General Datarequests for Dashboard
*
* @author Lukas Heiligenbrunner
*/
class DataRequest : PostRequest() {
override fun request(params: HashMap<String, String>): String {
val sb = StringBuilder()
var set: ResultSet?
var status = -1
if (!JDBC.isConnected()) {
error("no connection to db")
return "{\"query\" : \"nodbconn\"}"
}
val jdbc: JDBC = JDBC.getInstance()
when (params["action"]) {
/**
* create a new city entry in db
*/
"newCity" -> {
sb.append("{")
debug(params.toString())
// check if wastezone and wasteregion already exists
debug(params["cityname"] + params["wastetype"] + params["wastezone"])
set = jdbc.executeQuery("select * from `cities` where `name`='" + params["cityname"] + "' AND `wastetype`='" + params["wastetype"] + "' AND `zone`='" + params["wastezone"] + "'")
var size = 0
try {
if (set != null) {
set.last() // moves cursor to the last row
size = set.row // get row id
}
} catch (e: SQLException) {
e.printStackTrace()
}
if (size == 0) { //doesnt exist
try {
status = jdbc.executeUpdate("INSERT INTO `cities`(`userid`, `name`, `wastetype`, `zone`) VALUES ('0','" + params["cityname"] + "','" + params["wastetype"] + "','" + params["wastezone"] + "');")
} catch (e: SQLException) {
e.printStackTrace()
}
if (status == 1) {
sb.append("\"status\" : \"inserted\"")
}
else {
sb.append("\"status\" : \"inserterror\"")
}
}
else if (size > 1) {
warning("more than one entry in db!!!")
sb.append("\"status\" : \"exists\"")
}
else { //already exists
sb.append("\"status\" : \"exists\"")
}
sb.append(",\"query\":\"ok\"")
sb.append("}")
}
/**
* return all defined cities from db
*/
"getAllCities" -> {
set = jdbc.executeQuery("select * from cities")
debug(set.toString())
sb.append("{\"data\":[")
try {
while (set.next()) {
sb.append("{\"cityname\":\"" + set.getString("name") + "\"")
sb.append(",\"wastetype\":\"" + set.getString("wastetype") + "\"")
sb.append(",\"id\":\"" + set.getString("id") + "\"")
sb.append(",\"zone\":\"" + set.getString("zone") + "\"}")
if (!set.isLast) {
sb.append(",")
}
}
} catch (e: SQLException) {
e.printStackTrace()
}
sb.append("]")
sb.append(",\"query\":\"ok\"")
sb.append("}")
}
/**
* delete a specific city
*/
"deletecity" -> {
//DELETE FROM `cities` WHERE `id`=0
sb.append("{")
try {
status = jdbc.executeUpdate("DELETE FROM `cities` WHERE `id`='" + params["id"] + "'")
if (status == 1) { //success
sb.append("\"status\" : \"success\"")
}
else {
sb.append("\"status\" : \"error\"")
}
} catch (e: SQLIntegrityConstraintViolationException) {
warning("dependencies of deletion exist")
sb.append("\"status\" : \"dependenciesnotdeleted\"")
} catch (e: SQLException) {
error("sql exception: " + e.message)
sb.append("\"status\" : \"error\"")
}
debug(status)
sb.append(",\"query\":\"ok\"")
sb.append("}")
}
/**
* returns all configured dates with its city and zone
*/
"getAllDates" -> {
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")
sb.append("{\"data\":[")
try {
while (set.next()) {
sb.append("{\"date\":\"" + set.getString("pickupdate") + "\"")
sb.append(",\"cityname\":\"" + set.getString("name") + "\"")
sb.append(",\"wastetype\":\"" + set.getString("wastetype") + "\"")
sb.append(",\"id\":\"" + set.getString("id") + "\"")
sb.append(",\"zone\":\"" + set.getString("zone") + "\"}")
if (!set.isLast) {
sb.append(",")
}
}
} catch (e: SQLException) {
e.printStackTrace()
}
sb.append("]")
sb.append(",\"query\":\"ok\"")
sb.append("}")
}
/**
* delete a specific date
*/
"deletedate" -> {
sb.append("{")
try {
status = jdbc.executeUpdate("DELETE FROM `pickupdates` WHERE `id`='" + params["id"] + "'")
if (status == 1) { //success
sb.append("\"status\" : \"success\"")
}
else {
sb.append("\"status\" : \"error\"")
}
} catch (e: SQLIntegrityConstraintViolationException) {
warning("dependencies of deletion exist")
sb.append("\"status\" : \"dependenciesnotdeleted\"")
} catch (e: SQLException) {
error("sql exception: " + e.message)
sb.append("\"status\" : \"error\"")
}
sb.append(",\"query\":\"ok\"")
sb.append("}")
}
/**
* return version foot data
*/
"getversionandbuildtime" -> {
sb.append("{")
sb.append("\"version\" : \"" + Info.getVersion() + "\"")
sb.append(",\"buildtime\" : \"" + Info.getBuilddate() + "\"")
sb.append(",\"query\":\"ok\"")
sb.append("}")
}
/**
* return head data with basic collection infos
*/
"getStartHeaderData" -> {
sb.append("{")
try {
var sdf = SimpleDateFormat("yyyy-MM-dd")
var date = Date()
var time = sdf.format(date)
set = jdbc.executeQuery("SELECT * FROM `pickupdates` WHERE `pickupdate` BETWEEN '0000-12-27' AND '$time'")
set.last()
sb.append("\"finshedcollections\":\"" + set.row + "\"")
sdf = SimpleDateFormat("yyyy-MM-dd")
date = Date()
date = Date(date.time + 1 * 24 * 60 * 60 * 1000)
time = sdf.format(date)
set = jdbc.executeQuery("SELECT * FROM `pickupdates` WHERE `pickupdate` BETWEEN '$time' AND '2222-12-27'")
set.last()
sb.append(",\"futurecollections\":\"" + set.row + "\"")
set = jdbc.executeQuery("select * from pickupdates")
set.last()
sb.append(",\"collectionnumber\":\"" + set.row + "\"")
set = jdbc.executeQuery("select * from `cities`")
set.last()
sb.append(",\"citynumber\":\"" + set.row + "\"")
} catch (e: SQLException) {
error("sql exception: " + e.message)
sb.append("\"status\" : \"error\"")
}
sb.append(",\"query\":\"ok\"")
sb.append("}")
}
}
return sb.toString()
}
}

View File

@ -1,202 +0,0 @@
package com.wasteinformationserver.website.datarequests
import com.wasteinformationserver.basicutils.Log.Log.debug
import com.wasteinformationserver.basicutils.Log.Log.error
import com.wasteinformationserver.db.JDBC
import com.wasteinformationserver.website.basicrequest.PostRequest
import java.sql.ResultSet
import java.sql.SQLException
import java.util.*
/**
* Class for all requests on device Page
*
* @author Lukas Heiligenbrunner
*/
class DeviceRequest : PostRequest() {
override fun request(params: HashMap<String, String>): String {
if (!JDBC.isConnected()) {
error("no connection to db")
return "{\"query\" : \"nodbconn\"}"
}
val jdbc: JDBC = JDBC.getInstance()
val sb = StringBuilder()
val deviceset: ResultSet
when (params["action"]) {
/**
* return all available devices
*/
"getdevices" -> {
deviceset = jdbc.executeQuery("SELECT * FROM `devices")
sb.append("{\"data\":[")
try {
while (deviceset.next()) {
val deviceid = deviceset.getInt("DeviceID")
val cityid = deviceset.getInt("CityID")
if (cityid == -1) {
sb.append("{\"deviceid\":").append(deviceid).append(",\"cityid\":").append(cityid).append("}")
}
else {
val devicename = deviceset.getString("DeviceName")
val devicelocation = deviceset.getString("DeviceLocation")
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'")
while (devicecities.next()) {
val cityidd = devicecities.getInt("id")
val cityname = devicecities.getString("name")
val wastetype = devicecities.getString("wastetype")
val zone = devicecities.getString("zone")
sb.append("{\"cityid\":").append(cityidd).append(",\"cityname\":\"").append(cityname).append("\",\"wastetype\":\"").append(wastetype).append("\",\"zone\":\"").append(zone).append("\"}")
if (!devicecities.isLast) {
sb.append(",")
}
}
sb.append("]}")
}
if (!deviceset.isLast) {
sb.append(",")
}
}
sb.append("]}")
} catch (e: SQLException) {
e.printStackTrace()
}
}
/**
* returns all available city names
*/
"getCitynames" -> {
deviceset = jdbc.executeQuery("select * from cities")
debug(deviceset.toString())
sb.append("{")
try {
var prev = ""
while (deviceset.next()) {
if (prev != deviceset.getString("name")) {
if (!deviceset.isFirst) {
sb.append(",")
}
sb.append("\"").append(deviceset.getString("name")).append("\":\"").append(deviceset.getString("name")).append("\"")
}
prev = deviceset.getString("name")
}
} catch (e: SQLException) {
e.printStackTrace()
}
sb.append("}")
debug(sb.toString())
}
/**
* returns all available zones for specified city
*/
"getzones" -> {
deviceset = jdbc.executeQuery("select * from cities WHERE `name`='" + params["cityname"] + "' ORDER BY zone ASC")
debug(deviceset.toString())
sb.append("{")
try {
var prev = 42
while (deviceset.next()) {
if (prev != deviceset.getInt("zone")) {
sb.append("\"").append(deviceset.getInt("zone")).append("\":\"").append(deviceset.getInt("zone")).append("\"")
if (!deviceset.isLast) {
sb.append(",")
}
}
prev = deviceset.getInt("zone")
}
} catch (e: SQLException) {
e.printStackTrace()
}
sb.append("}")
}
/**
* returns all available waste types for specified zone and city
*/
"gettypes" -> {
deviceset = jdbc.executeQuery("select * from cities WHERE `name`='" + params["cityname"] + "' AND `zone`='" + params["zonename"] + "' ORDER BY zone ASC")
debug(deviceset.toString())
sb.append("{")
try {
var prev = "42"
while (deviceset.next()) {
if (prev != deviceset.getString("wastetype")) {
sb.append("\"" + deviceset.getString("wastetype") + "\":\"" + deviceset.getString("wastetype") + "\"")
if (!deviceset.isLast) {
sb.append(",")
}
}
prev = deviceset.getString("wastetype")
}
} catch (e: SQLException) {
e.printStackTrace()
}
sb.append("}")
}
/**
* configure device and save infos to db
*/
"savetodb" -> try {
val cityset = jdbc.executeQuery("SELECT id from cities WHERE `name`='" + params["cityname"] + "' AND `zone`='" + params["zonename"] + "' AND `wastetype`='" + params["wastetype"] + "'")
cityset.last()
if (cityset.row != 1) {
error("error saving device to db --> device multiply defined?")
sb.append("{\"success\":\"false\"}")
}
else {
val cityid = cityset.getInt("id")
jdbc.executeUpdate("INSERT INTO `device_city` (`DeviceID`, `CityID`) VALUES ('" + params["deviceid"] + "', '" + cityid + "');")
jdbc.executeUpdate("UPDATE devices SET `CityID`='0',`DeviceName`='" + params["devicename"] + "',`DeviceLocation`='" + params["devicelocation"] + "' WHERE `DeviceID`='" + params["deviceid"] + "'")
sb.append("{\"success\":\"true\"}")
}
} catch (e: SQLException) {
e.printStackTrace()
}
/**
* delete a configured device from db
*/
"deleteDevice" -> {
try {
jdbc.executeUpdate("DELETE FROM devices WHERE `DeviceID`='" + params["id"] + "'")
jdbc.executeUpdate("DELETE FROM device_city WHERE `DeviceID`='" + params["id"] + "'")
} catch (e: SQLException) {
e.printStackTrace()
}
sb.append("{\"status\":\"success\"}")
}
/**
* add new city/zone/type to db to existing one
*/
"addtodb" -> {
try {
val device = jdbc.executeQuery("SELECT * FROM cities WHERE name='" + params["cityname"] + "' AND wastetype='" + params["wastetype"] + "' AND zone='" + params["zonename"] + "'")
device.first()
val cityid = device.getInt("id")
jdbc.executeUpdate("INSERT INTO `device_city` (`DeviceID`, `CityID`) VALUES ('" + params["deviceid"] + "', '" + cityid + "');")
} catch (e: SQLException) {
e.printStackTrace()
}
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()
}
}

View File

@ -0,0 +1,102 @@
package com.wasteinformationserver.website.datarequests;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.db.JDCB;
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();
JDCB jdcb;
try {
jdcb = JDCB.getInstance();
} catch (IOException e) {
Log.error("no connection to db");
return "{\"query\" : \"nodbconn\"}";
}
switch (params.get("action")) {
case "getCitynames":
ResultSet sett = jdcb.executeQuery("select * from cities");
Log.debug(sett.toString());
sb.append("{\"data\":[");
try {
String prev = "";
while (sett.next()) {
if (prev.equals(sett.getString("name"))) {
} else {
if (!sett.isFirst()) {
sb.append(",");
}
sb.append("{\"cityname\":\"" + sett.getString("name") + "\"}");
}
prev = sett.getString("name");
}
} catch (SQLException e) {
e.printStackTrace();
}
sb.append("]");
sb.append(",\"query\":\"ok\"");
sb.append("}");
Log.debug(sb.toString());
break;
case "getzones":
ResultSet set = jdcb.executeQuery("select * from cities WHERE `name`='" + params.get("cityname") + "' ORDER BY zone ASC");
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 "newdate":
sb.append("{");
Log.debug(params);
ResultSet seti = jdcb.executeQuery("select * from cities WHERE `name`='" + params.get("cityname") + "' AND `zone`='" + params.get("zone") + "' AND `wastetype`='" + params.get("wastetype") + "'");
try {
seti.last();
if (seti.getRow() == 1) {
Log.debug(seti.getInt("id"));
int status = jdcb.executeUpdate("INSERT INTO `pickupdates`(`citywastezoneid`, `pickupdate`) VALUES ('" + seti.getInt("id") + "','" + params.get("date") + "')");
if (status == 1) {
sb.append("\"status\" : \"success\"");
} else {
sb.append("\"status\" : \"error\"");
}
} else {
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

@ -1,124 +0,0 @@
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

@ -0,0 +1,35 @@
package com.wasteinformationserver.website.datarequests;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.db.JDCB;
import com.wasteinformationserver.website.HttpTools;
import com.wasteinformationserver.website.basicrequest.PostRequest;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
public class RegisterRequest extends PostRequest {
@Override
public String request(HashMap<String, String> params) {
Log.debug(params.toString());
String passhash = HttpTools.StringToMD5(params.get("password"));
JDCB myjd = null;
try {
myjd = JDCB.getInstance();
} catch (IOException e) {
e.printStackTrace();
}
//new JDCB("users", "kOpaIJUjkgb9ur6S", "wasteinformation");
try {
int s = myjd.executeUpdate("INSERT INTO `user` (`username`, `firstName`, `secondName`, `password`, `email`, `logindate`) VALUES ('" + params.get("username") + "', '" + params.get("firstname") + "', '" + params.get("lastname") + "', '" + passhash + "', '" + params.get("email") + "', current_timestamp());");
} catch (SQLException e) {
e.printStackTrace();
}
// TODO: 27.09.19 detect if register process was successful and reply right json
return "{\"accept\": true}";
}
}

View File

@ -1,39 +0,0 @@
package com.wasteinformationserver.website.datarequests
import com.wasteinformationserver.basicutils.Log
import com.wasteinformationserver.basicutils.Log.Log.debug
import com.wasteinformationserver.db.JDBC
import com.wasteinformationserver.website.HttpTools.Companion.stringToMD5
import com.wasteinformationserver.website.basicrequest.PostRequest
import java.io.IOException
import java.sql.SQLException
import java.util.*
class RegisterRequest : PostRequest() {
override fun request(params: HashMap<String, String>): String {
debug(params.toString())
val passhash = stringToMD5(params["password"]!!)
val reply: StringBuilder = StringBuilder("{")
try {
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());")
if (status == 1) {
reply.append("\"accept\": true")
}
else {
reply.append("\"accept\": false")
}
} catch (e: IOException) {
Log.error("no connection to db")
reply.append("\"accept\": false")
} catch (e: SQLException) {
e.printStackTrace()
reply.append("\"accept\": false")
}
reply.append("}")
return reply.toString()
}
}

View File

@ -1,19 +0,0 @@
package com.wasteinformationserver.website.datarequests
import com.wasteinformationserver.website.basicrequest.PostRequest
import java.util.*
class UserInfoRequest : PostRequest() {
override fun request(params: HashMap<String, String>): String {
//TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
when (params["action"]) {
"getlogins" -> {
println("heyho")
}
"" -> {
//todo o
}
}
return "{}"
}
}

View File

@ -5,13 +5,10 @@ import com.wasteinformationserver.website.basicrequest.PostRequest;
import java.util.HashMap;
/**
* request handler for checking the login state of a user
*/
public class CheckLoginState extends PostRequest {
@Override
public String request(HashMap<String, String> params) {
Log.Log.message("checking login state");
Log.message("checking login state");
if ((params.get("action")).equals("getloginstate")) {
if (LoginState.getObject().isLoggedIn()) {
return "{\"loggedin\":true, \"username\":\"" + LoginState.getObject().getUsername() + "\", \"permission\":\"" + LoginState.getObject().getPermission() + "\"}";
@ -19,7 +16,7 @@ public class CheckLoginState extends PostRequest {
return "{\"loggedin\":false}";
}
} else if ((params.get("action")).equals("logout")) {
Log.Log.debug("logging out");
Log.debug("logging out");
LoginState.getObject().logOut();
return "{\"loggedin\":false}";
}

View File

@ -0,0 +1,59 @@
package com.wasteinformationserver.website.datarequests.login;
import com.wasteinformationserver.basicutils.Log;
import com.wasteinformationserver.db.JDCB;
import com.wasteinformationserver.website.HttpTools;
import com.wasteinformationserver.website.basicrequest.PostRequest;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
public class LoginRequest extends PostRequest {
@Override
public String request(HashMap<String, String> params) {
Log.message("new login request");
String password = params.get("password");
String username = params.get("username");
JDCB jdcb;
try {
jdcb = JDCB.getInstance();
} catch (IOException e) {
Log.error("no connection to db");
return "{\"status\" : \"nodbconn\"}";
}
ResultSet s = jdcb.executeQuery("select * from user where username ='" + username + "'");
;
//new JDCB("users", "kOpaIJUjkgb9ur6S", "wasteinformation").executeQuery("select * from user where username ='" + username + "'");
Log.debug("successfully logged in to db");
String response = "{\"accept\": false}";
try {
s.last();
if (s.getRow() == 1) {
//success
if (HttpTools.StringToMD5(password).equals(s.getString("password"))) {
Log.debug("login success");
LoginState.getObject().logIn();
LoginState.getObject().setAccountData(username, "", "", "", s.getInt("permission")); // TODO: 06.12.19
response = "{\"accept\": true}";
} else {
Log.debug("wrong password");
}
} else if (s.getRow() == 0) {
//user not found
Log.debug("user not found");
} else {
//internal error two users with same name...?
}
Log.debug("rowcount: " + s.getRow());
} catch (SQLException e) {
e.printStackTrace();
}
return response;
}
}

View File

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

View File

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

View File

@ -1,87 +0,0 @@
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

@ -23,7 +23,7 @@
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Brand Logo -->
<a href="dashboard.html" class="brand-link">
<img src="/favicon.png"
<img src="lib/AdminLTE/dist/img/AdminLTELogo.png"
alt="AdminLTE Logo"
class="brand-image img-circle elevation-3"
style="opacity: .8">
@ -118,5 +118,7 @@
<script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="lib/AdminLTE/dist/js/adminlte.min.js"></script>
<!-- AdminLTE for demo purposes -->
<script src="lib/AdminLTE/dist/js/demo.js"></script>
</body>
</html>

View File

@ -6,27 +6,38 @@
<title>WasteInformation Server</title>
<!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- AdminLTE Libs -->
<!-- Font Awesome -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/fontawesome-free/css/all.min.css">
<!-- Ionicons -->
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<!-- DataTables -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/datatables-bs4/css/dataTables.bootstrap4.css">
<!-- !Theme style -->
<!-- Tempusdominus Bbootstrap 4 -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css">
<!-- 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">
<!-- !overlayScrollbars -->
<!-- overlayScrollbars -->
<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 -->
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>
<!-- Bootstrap Date-Picker Plugin -->
<!-- custom stylesheets -->
<link rel="stylesheet"
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">
</head>
<body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper">
@ -34,7 +45,7 @@
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Brand Logo -->
<a href="dashboard.html" class="brand-link">
<img src="/favicon.png" alt="AdminLTE Logo"
<img src="lib/AdminLTE/dist/img/AdminLTELogo.png" alt="AdminLTE Logo"
class="brand-image img-circle elevation-3"
style="opacity: .8">
<span class="brand-text font-weight-light">Waste Control</span>
@ -42,21 +53,17 @@
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar User -->
<nav class="user-panel mt-3 pb-3 mb-3">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu"
data-accordion="false">
<li class="nav-item">
<a href="user.html" class="nav-link">
<i class="nav-icon fas fa-user"></i>
<p id="userlabel">
Username to set!
</p>
</a>
</li>
</ul>
</nav>
<!-- Sidebar user panel (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<!-- <img src="lib/AdminLTE/dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image"> -->
<i class="nav-icon fas fa-user img-circle elevation-2" style="color:white"></i>
</div>
<!-- <i class="nav-icon fas fa-tachometer-alt"></i> -->
<div class="info">
<a href="user.html" class="d-block" id="userlabel">Username to set!</a>
</div>
</div>
<!-- Sidebar Menu -->
<nav class="mt-2">
@ -64,36 +71,14 @@
data-accordion="false">
<li class="nav-item">
<a href="dashboard.html" class="nav-link">
<i class="nav-icon fas fa-columns"></i>
<a href="#todo" class="nav-link">
<i class="nav-icon fas fa-cog"></i>
<p>
Dashboard
Settings
</p>
</a>
</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">
<a href="index.html" class="nav-link" id="logoutbtn">
<i class="nav-icon fas fa-sign-out-alt"></i>
@ -103,7 +88,23 @@
</a>
</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>
</nav>
<!-- /.sidebar-menu -->
@ -118,12 +119,12 @@
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0 text-dark sandwich"><i class="fas fa-bars"></i> &ensp;Admin Area</h1>
<h1 class="m-0 text-dark">Dashboard</h1>
</div><!-- /.col -->
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="dashboard.html">Home</a></li>
<li class="breadcrumb-item active">Admin</li>
<li class="breadcrumb-item active">Users</li>
</ol>
</div><!-- /.col -->
</div><!-- /.row -->
@ -225,7 +226,6 @@
</div>
<!-- ./wrapper -->
<!-- AdminLTE Libs -->
<!-- jQuery -->
<script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- jQuery UI 1.11.4 -->
@ -236,18 +236,40 @@
</script>
<!-- Bootstrap 4 -->
<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 -->
<script src="lib/AdminLTE/dist/js/adminlte.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
<!-- AdminLTE dashboard demo (This is only for demo purposes) -->
<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 -->
<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/sweetalert2/sweetalert2.all.js"></script>
<!-- custom js -->
<script src="js/adminpanel.js"></script>
<script src="js/general.js"></script>
<script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script>
</body>
</html>

View File

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

View File

@ -0,0 +1,7 @@
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,29 +6,38 @@
<title>WasteInformation Server</title>
<!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- AdminLTE Libs -->
<!-- Font Awesome -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/fontawesome-free/css/all.min.css">
<!-- Ionicons -->
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<!-- DataTables -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/datatables-bs4/css/dataTables.bootstrap4.css">
<!-- !Theme style -->
<!-- Tempusdominus Bbootstrap 4 -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css">
<!-- 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">
<!-- !overlayScrollbars -->
<!-- overlayScrollbars -->
<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 -->
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>
<!-- Bootstrap Date-Picker Plugin -->
<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/general.css">
<link rel="icon" type="image/png" href="/favicon.png">
</head>
<body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper">
@ -36,7 +45,7 @@
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Brand Logo -->
<a href="dashboard.html" class="brand-link">
<img src="/favicon.png" alt="AdminLTE Logo"
<img src="lib/AdminLTE/dist/img/AdminLTELogo.png" alt="AdminLTE Logo"
class="brand-image img-circle elevation-3"
style="opacity: .8">
<span class="brand-text font-weight-light">Waste Control</span>
@ -44,21 +53,17 @@
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar User -->
<nav class="user-panel mt-3 pb-3 mb-3">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu"
data-accordion="false">
<li class="nav-item">
<a href="user.html" class="nav-link">
<i class="nav-icon fas fa-user"></i>
<p id="userlabel">
Username to set!
</p>
</a>
</li>
</ul>
</nav>
<!-- Sidebar user panel (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<!-- <img src="lib/AdminLTE/dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image"> -->
<i class="nav-icon fas fa-user img-circle elevation-2" style="color:white"></i>
</div>
<!-- <i class="nav-icon fas fa-tachometer-alt"></i> -->
<div class="info">
<a href="user.html" class="d-block" id="userlabel">Username to set!</a>
</div>
</div>
<!-- Sidebar Menu -->
<nav class="mt-2">
@ -66,35 +71,14 @@
data-accordion="false">
<li class="nav-item">
<a href="dashboard.html" class="nav-link">
<i class="nav-icon fas fa-columns"></i>
<a href="#todo" class="nav-link">
<i class="nav-icon fas fa-cog"></i>
<p>
Dashboard
Settings
</p>
</a>
</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">
<a href="index.html" class="nav-link" id="logoutbtn">
<i class="nav-icon fas fa-sign-out-alt"></i>
@ -103,6 +87,15 @@
</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>
</nav>
<!-- /.sidebar-menu -->
@ -117,7 +110,7 @@
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0 text-dark sandwich"><i class="fas fa-bars"></i> &ensp;Dashboard</h1>
<h1 class="m-0 text-dark">Dashboard</h1>
</div><!-- /.col -->
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
@ -146,20 +139,22 @@
<div class="icon">
<i class="ion ion-bag"></i>
</div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-gray">
<div class="small-box bg-success">
<div class="inner">
<h3 id="total-city-number-label">42</h3>
<h3>53<sup style="font-size: 20px">%</sup></h3>
<p>total collect zones</p>
<p>Verbundene Clients</p>
</div>
<div class="icon">
<i class="ion ion-android-globe" style="color: lightgrey"></i>
<i class="ion ion-stats-bars"></i>
</div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
@ -172,22 +167,24 @@
<p>Planned Collections</p>
</div>
<div class="icon">
<i class="ion ion-calendar"></i>
<i class="ion ion-person-add"></i>
</div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-success">
<div class="small-box bg-danger">
<div class="inner">
<h3 id="finished-collection-label">65</h3>
<p>Finished Collections</p>
</div>
<div class="icon">
<i class="ion ion-android-checkmark-circle"></i>
<i class="ion ion-pie-graph"></i>
</div>
<a href="#" class="small-box-footer">More info <i class="fas fa-arrow-circle-right"></i></a>
</div>
</div>
<!-- ./col -->
@ -202,30 +199,29 @@
<div class="card-header">
<h3 class="card-title">
<i class="fas fa-chart-pie mr-1"></i>
All pickupdats
Alle abholdaten
</h3>
</div><!-- /.card-header -->
<div class="card-body">
<table id="table-pickupdates" class="table table-bordered table-hover">
<thead>
<tr>
<th><i class="fas fa-city"></i>City</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-calendar-alt"></i>Date</th>
<th><i class="fas fa-trash-alt"></i></th>
<th>City</th>
<th>Zone</th>
<th>Waste Type</th>
<th>Date</th>
<th>X</th>
</tr>
</thead>
<tbody id="picupdates-tablebody">
</tbody>
<tfoot>
<tr>
<th><i class="fas fa-city"></i>City</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-calendar-alt"></i>Date</th>
<th><i class="fas fa-trash-alt"></i>
</th>
<th>City</th>
<th>Zone</th>
<th>Waste Type</th>
<th>Date</th>
<th>X</th>
</tr>
</tfoot>
</table>
@ -315,8 +311,11 @@
data-toggle="dropdown">
Select waste type
</button>
<div id="dropdown-type-drops" class="dropdown-menu">
<div class="dropdown-menu">
<a class="dropdown-item-wastetype dropdown-item" href="#">Plastic</a>
<a class="dropdown-item-wastetype dropdown-item" href="#">Metal</a>
<a class="dropdown-item-wastetype dropdown-item" href="#">Residual waste</a>
<a class="dropdown-item-wastetype dropdown-item" href="#">Biowaste</a>
</div>
</div>
<input id="input-wastetime" style="width: 50px;" class="form-control" id="date"
@ -347,28 +346,20 @@
<table id="example2" class="table table-bordered table-hover">
<thead>
<tr>
<th>
<i class="fas fa-city"></i>
City
</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>
<th>City</th>
<th>Zone</th>
<th>Waste Type</th>
<th>X</th>
</tr>
</thead>
<tbody id="location-table-data">
</tbody>
<tfoot>
<tr>
<th><i class="fas fa-city"></i>City</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>
<th>City</th>
<th>Zone</th>
<th>Waste Type</th>
<th>X</th>
</tr>
</tfoot>
</table>
@ -404,7 +395,6 @@
</div>
<!-- ./wrapper -->
<!-- AdminLTE Libs -->
<!-- jQuery -->
<script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- jQuery UI 1.11.4 -->
@ -415,18 +405,40 @@
</script>
<!-- Bootstrap 4 -->
<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 -->
<script src="lib/AdminLTE/dist/js/adminlte.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
<!-- AdminLTE dashboard demo (This is only for demo purposes) -->
<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/dashboard.js"></script>
<!-- DataTables -->
<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/sweetalert2/sweetalert2.all.js"></script>
<!-- custom js -->
<script type="text/javascript" src="js/dashboard.js"></script>
<script src="js/general.js"></script>
<script src="lib/AdminLTE/plugins/sweetalert2/sweetalert2.all.js"></script>
</body>
</html>

View File

@ -1,265 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>WasteInformation Server</title>
<!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- AdminLTE Libs -->
<!-- Font Awesome -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/fontawesome-free/css/all.min.css">
<!-- Ionicons -->
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<!-- DataTables -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/datatables-bs4/css/dataTables.bootstrap4.css">
<!-- !Theme style -->
<link rel="stylesheet" href="lib/AdminLTE/dist/css/adminlte.min.css">
<!-- !overlayScrollbars -->
<link rel="stylesheet" href="lib/AdminLTE/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">
<!-- Google Font: Source Sans Pro -->
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
<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/general.css">
</head>
<body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper">
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Brand Logo -->
<a href="dashboard.html" class="brand-link">
<img src="/favicon.png" alt="AdminLTE Logo"
class="brand-image img-circle elevation-3"
style="opacity: .8">
<span class="brand-text font-weight-light">Waste Control</span>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar User -->
<nav class="user-panel mt-3 pb-3 mb-3">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu"
data-accordion="false">
<li class="nav-item">
<a href="user.html" class="nav-link">
<i class="nav-icon fas fa-user"></i>
<p id="userlabel">
Username to set!
</p>
</a>
</li>
</ul>
</nav>
<!-- Sidebar Menu -->
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu"
data-accordion="false">
<li class="nav-item">
<a href="dashboard.html" class="nav-link">
<i class="nav-icon fas fa-columns"></i>
<p>
Dashboard
</p>
</a>
</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">
<a href="index.html" class="nav-link" id="logoutbtn">
<i class="nav-icon fas fa-sign-out-alt"></i>
<p>
Logout
</p>
</a>
</li>
</ul>
</nav>
<!-- /.sidebar-menu -->
</div>
<!-- /.sidebar -->
</aside>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<div class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1 class="m-0 text-dark sandwich"><i class="fas fa-bars"></i> &ensp;Devices</h1>
</div><!-- /.col -->
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="dashboard.html">Home</a></li>
<li class="breadcrumb-item active">Devices</li>
</ol>
</div><!-- /.col -->
</div><!-- /.row -->
</div><!-- /.container-fluid -->
</div>
<!-- /.content-header -->
<!-- Main content -->
<section class="content">
<div class="container-fluid">
<!-- Small boxes (Stat box) -->
<div class="row">
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-info">
<div class="inner">
<h3 id="devicenr-label">-1</h3>
<p>Devices</p>
</div>
<div class="icon">
<i class="ion ion-bag"></i>
</div>
</div>
</div>
<!-- ./col -->
<div class="col-lg-3 col-6">
<!-- small box -->
<div class="small-box bg-success">
<div class="inner">
<h3 id="unconfigured-devices-label">-1</h3>
<p>Not Configured Devices</p>
</div>
<div class="icon">
<i class="ion ion-stats-bars"></i>
</div>
</div>
</div>
<!-- ./col -->
</div>
<!-- /.row -->
<!-- Main row -->
<div class="row">
<!-- Left col -->
<section class="col-lg-7 connectedSortable">
<!-- Custom tabs (Charts with tabs)-->
<div class="card">
<div class="card-header">
<h3 class="card-title">
<i class="fas fa-chart-pie mr-1"></i>
All Devices
</h3>
</div><!-- /.card-header -->
<div class="card-body">
<table id="table-devices" class="table table-bordered table-hover">
<thead>
<tr>
<th><i class="fas fa-id-card"></i> Device ID</th>
<th><i class="fas fa-signature"></i> Devicename</th>
<th><i class="fas fa-search-location"></i> Devicelocation</th>
<th><i class="fas fa-recycle"></i> WasteType</th>
<th><i class="fas fa-edit"></i> Action</th>
</tr>
</thead>
<tbody id="devices-tablebody">
</tbody>
<tfoot>
<tr>
<th><i class="fas fa-id-card"></i> Device ID</th>
<th><i class="fas fa-signature"></i> Devicename</th>
<th><i class="fas fa-search-location"></i> Devicelocation</th>
<th><i class="fas fa-recycle"></i> WasteType</th>
<th><i class="fas fa-edit"></i> Action</th>
</tr>
</tfoot>
</table>
</div><!-- /.card-body -->
</div>
</section>
<!-- /.Left col -->
<!-- right col (We are only adding the ID to make the widgets sortable)-->
<section class="col-lg-5 connectedSortable">
<!-- /.card -->
</section>
<!-- right col -->
</div>
<!-- /.row (main row) -->
</div><!-- /.container-fluid -->
</section>
<!-- /.content -->
</div>
<!-- /.content-wrapper -->
<footer class="main-footer">
<strong>By Gregor Dutzler & Lukas Heiligenbrunner & Emil Meindl</strong>
<div class="float-right d-none d-sm-inline-block">
<b>Version</b> 3.0.0
<b>Build</b> 2019-8-8 9:30
</div>
</footer>
<!-- Control Sidebar -->
<aside class="control-sidebar control-sidebar-dark">
<!-- Control sidebar content goes here -->
</aside>
<!-- /.control-sidebar -->
</div>
<!-- ./wrapper -->
<!-- AdminLTE Libs -->
<!-- jQuery -->
<script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- jQuery UI 1.11.4 -->
<script src="lib/AdminLTE/plugins/jquery-ui/jquery-ui.min.js"></script>
<!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip -->
<script>
$.widget.bridge('uibutton', $.ui.button)
</script>
<!-- Bootstrap 4 -->
<script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="lib/AdminLTE/dist/js/adminlte.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 -->
<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/sweetalert2/sweetalert2.all.js"></script>
<!-- custom js -->
<script src="js/general.js"></script>
<script src="js/device.js"></script>
</body>
</html>

View File

@ -1,76 +1,74 @@
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<head>
<meta charset="utf-8">
<title>Login Page</title>
<title>Login Page</title>
<!--Made with love by Mutiullah Samim -->
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="lib/bootstrap.min.css">
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="lib/bootstrap.min.css">
<!-- jQuery library -->
<script src="lib/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- jQuery library -->
<script src="lib/jquery.min.js"></script>
<!-- Popper JS -->
<script src="lib/popper.min.js"></script>
<!-- Popper JS -->
<script src="lib/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script src="lib/AdminLTE/plugins/bootstrap/js/bootstrap.min.js"></script>
<!-- Latest compiled JavaScript -->
<script src="lib/bootstrap.min.js"></script>
<!--Fontawesome CDN-->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css"
integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">
<!--Fontawesome CDN-->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU" crossorigin="anonymous">
<!--Custom styles-->
<link rel="stylesheet" type="text/css" href="css/index.css">
<!--Custom styles-->
<link rel="stylesheet" type="text/css" href="css/index.css">
<script type="text/javascript" src="js/index.js"></script>
<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="icon" type="image/png" href="/favicon.png">
<link rel="manifest" href="/manifest.json">
</head>
<body>
<div class="container">
<div class="d-flex justify-content-center h-100">
<div class="card">
<div class="card-header">
<h3>Sign In</h3>
</div>
<div class="card-body">
<form>
<div class="input-group form-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-user"></i></span>
</div>
<input type="text" class="form-control" placeholder="username" id="userfield">
<div class="d-flex justify-content-center h-100">
<div class="card">
<div class="card-header">
<h3>Sign In</h3>
</div>
<div class="card-body">
<form>
<div class="input-group form-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-user"></i></span>
</div>
<input type="text" class="form-control" placeholder="username" id="userfield">
</div>
<div class="input-group form-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-key"></i></span>
</div>
<input type="password" class="form-control" placeholder="password" id="passfield">
</div>
<div class="row align-items-center remember">
<input type="checkbox">Remember Me
</div>
<div class="form-group">
<input type="submit" value="Login" class="btn float-right login_btn" id="loginbtn">
</div>
</form>
</div>
<div class="card-footer">
<div class="d-flex justify-content-center links">
Don't have an account?<a href="register.html">Sign Up</a>
</div>
<div class="d-flex justify-content-center">
<a href="#">Forgot your password?</a>
</div>
</div>
</div>
</div>
</div>
<div class="input-group form-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-key"></i></span>
</div>
<input type="password" class="form-control" placeholder="password" id="passfield">
</div>
<div class="row align-items-center remember">
<input type="checkbox">Remember Me
</div>
<div class="form-group">
<input type="submit" value="Login" class="btn float-right login_btn" id="loginbtn">
</div>
</form>
</div>
<div class="card-footer">
<div class="d-flex justify-content-center links">
Don't have an account?<a href="register.html">Sign Up</a>
</div>
<div class="d-flex justify-content-center">
<a href="#">Forgot your password?</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -1,45 +1,34 @@
$(document).ready(function () {
new AdminPanel();
});
class AdminPanel {
constructor() {
this.checkLoginState();
this.addClickListeners();
}
checkLoginState(){
$.post('/senddata/checkloginstate', 'action=getloginstate', function (data) {
console.log(data);
if (data.loggedin == true) {
$("#userlabel").html(" " + data.username);
if (data.permission > 0) {
$("#adminpanel").show();
}
} else {
$("#userlabel").html(" not logged in!!");
console.log("page loaded");
$.post('/senddata/checkloginstate', 'action=getloginstate', function (data) {
console.log(data);
if (data.loggedin == true) {
$("#userlabel").html(" " + data.username);
if (data.permission > 0) {
$("#adminpanel").show();
}
} else {
$("#userlabel").html(" not logged in!!");
}
}, 'json');
$("#btn-shutdown").click(function (event) {
console.log("shutting down server");
$.post('/senddata/admindata', 'action=shutdownserver', function (data) {
console.log(data);
}, 'json');
}
addClickListeners(){
$("#btn-shutdown").click(function (event) {
console.log("shutting down server");
});
$.post('/senddata/admindata', 'action=shutdownserver', function (data) {
console.log(data);
$("#btn-restart").click(function (event) {
console.log("restarting server");
}, 'json');
$.post('/senddata/admindata', 'action=restartserver', function (data) {
console.log(data);
});
$("#btn-restart").click(function (event) {
console.log("restarting server");
$.post('/senddata/admindata', 'action=restartserver', function (data) {
console.log(data);
}, 'json');
});
}
}
}, 'json');
});
});

View File

@ -1,266 +1,57 @@
$(document).ready(function () {
new Dashboard();
});
console.log("page loaded");
$.post('/senddata/checkloginstate', 'action=getloginstate', function (data) {
console.log(data);
if (data.loggedin == true) {
$("#userlabel").html(" " + data.username);
if (data.permission > 0) {
$("#adminpanel").show();
}
} else {
$("#userlabel").html(" not logged in!!");
}
}, 'json');
class Dashboard {
constructor() {
//load header data
this.loadHeaderData();
//load total collections
$.post('/senddata/wastedata', 'action=getcollectionnumber', function (data) {
console.log(data);
$("#total-connection-labels").html(data.collectionnumber);
}, 'json');
//load footer
this.loadVersionFooter();
//load future collections
$.post('/senddata/wastedata', 'action=getcollectioninfuture', function (data) {
console.log(data);
$("#planed-collection-label").html(data.collectionnumber);
}, 'json');
//reload city table
this.reloadtable();
//load future collections
$.post('/senddata/wastedata', 'action=getfinishedcollections', function (data) {
console.log(data);
$("#finished-collection-label").html(data.collectionnumber);
}, 'json');
//reload Date table
this.reloadDateTable();
//init time picker
this.initDatePicker();
//add click listeners to all buttons
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 */
citytable;
datetable;
/* Btn Action Listeners */
addClickListeners() {
const _this = this;
//btn listeners
$('#logoutbtn').click(function () {
$.post('/senddata/checkloginstate', 'action=logout', function (data) {
console.log(data);
}, 'json');
});
$('.wastetype-citynew-item').click(function (event) {
event.preventDefault();
$('#dropdown-wastetype').html($(this).html());
});
$('#btn-savecity').click(function () {
var cityname = $("#new_city_cityname").val();
var zonename = $("#new_city_zonename").val();
var wastetype = $("#dropdown-wastetype").html();
console.log("storing: " + cityname + "--" + wastetype + "in db");
$.post('/senddata/wastedata', 'action=newCity&wastetype=' + wastetype + "&cityname=" + cityname + "&wastezone=" + zonename, function (data) {
console.log(data);
if (data.status == "inserted") {
Swal.fire({
icon: "success",
title: 'Successfully created city!',
html: 'This alert closes automatically.',
timer: 1000,
}).then((result) => {
console.log('Popup closed. ')
});
_this.reloadtable();
} else if (data.status == "exists") {
Swal.fire({
icon: "warning",
title: 'Name already exists in db',
html: 'Close popup.',
}).then((result) => {
console.log('Popup closed. ')
});
}
}, 'json');
//clear form data
$("#new_city_cityname").val("");
$("#new_city_zonename").val("");
$("#dropdown-wastetype").html("select waste type");
});
//load version footer
//
$.post('/senddata/wastedata', 'action=getversionandbuildtime', function (data) {
$("#version-footer-label").html("<b>Version</b> "+data.version+" <b>Build</b> "+data.buildtime);
}, 'json');
/* new Date create: */
$("#dropdown-city").click(function (event) {
event.preventDefault();
var dropdata = $("#dropdown-city-data");
dropdata.html("");
console.log("loading city names")
var citytable;
$.post('/senddata/newdate', 'action=getCitynames', function (data) {
console.log(data);
if (data.query == "ok") {
var prev = "";
for (var i = 0; i < data.data.length; i++) {
var name = data.data[i].cityname;
dropdata.append("<a class=\"dropdown-data-cityname dropdown-item\" href=\"#\">" + name + "</a>");
}
$(".dropdown-data-cityname").off();
$(".dropdown-data-cityname").click(function (evnt) {
evnt.preventDefault();
console.log($(this).html());
$("#dropdown-city").html($(this).html());
});
}
}, "json");
});
$("#dropdown-zone").click(function (event) {
event.preventDefault();
var dropdata = $("#dropdown-zone-data");
dropdata.html("");
$.post('/senddata/newdate', 'action=getzones&cityname=' + $("#dropdown-city").html(), function (data) {
console.log(data);
if (data.query == "ok") {
var prev = "";
for (var i = 0; i < data.data.length; i++) {
var zone = data.data[i].zone;
dropdata.append("<a class=\"dropdown-data-zonename dropdown-item\" href=\"#\">" + zone + "</a>");
}
$(".dropdown-data-zonename").off();
$(".dropdown-data-zonename").click(function (evnt) {
evnt.preventDefault();
console.log($(this).html());
$("#dropdown-zone").html($(this).html());
});
}
});
});
$("#dropdown-type-data").click(function (event) {
event.preventDefault();
var dropdata = $("#dropdown-type-drops");
dropdata.html("");
console.log("clickeeeed");
$.post('/senddata/newdate', 'action=gettypes&cityname=' + $("#dropdown-city").html() + '&zonename=' + $("#dropdown-zone").html(), function (data) {
console.log(data);
if (data.query == "ok") {
for (var i = 0; i < data.data.length; i++) {
var type = data.data[i].wastetype;
dropdata.append("<a class=\"dropdown-data-typename dropdown-item\" href=\"#\">" + type + "</a>");
}
$(".dropdown-data-typename").off();
$(".dropdown-data-typename").click(function (evnt) {
evnt.preventDefault();
$("#dropdown-type-data").html($(this).html());
});
}
});
});
$('.btn-savelist').click(function () {
console.log("saving date");
var cityname = $("#dropdown-city");
var zone = $("#dropdown-zone");
var wastetype = $("#dropdown-type-data");
var date = $("#input-wastetime");
$.post('/senddata/newdate', 'action=newdate&cityname=' + cityname.html() + "&zone=" + zone.html() + "&wastetype=" + wastetype.html() + "&date=" + date.val(), function (data) {
if (data.status == "success") {
Swal.fire({
icon: "success",
title: 'Successfully created Date!',
html: 'This alert closes automatically.',
timer: 1000,
}).then((result) => {
console.log('Popup closed. ')
});
cityname.html("Select City");
zone.html("Select Zone");
wastetype.html("Select waste type");
date.val("");
_this.reloadDateTable();
} else if (data.status == "citydoesntexist") {
Swal.fire({
icon: "warning",
title: 'city name doesnt exist',
html: 'Close popup.',
}).then((result) => {
console.log('Popup closed. ')
});
}
console.log(data)
}, "json");
});
}
/* Functions */
initDatePicker() {
//Date picker pop up actions...
var date_input = $('input[name="date"]'); //our date input has the name "date"
var container = $('.bootstrap-iso form').length > 0 ? $('.bootstrap-iso form').parent() : "body";
var options = {
format: 'yyyy-mm-dd',
container: container,
todayHighlight: true,
autoclose: true,
};
date_input.datepicker(options);
}
loadHeaderData() {
$.post('/senddata/wastedata', 'action=getStartHeaderData', function (data) {
console.log(data);
$("#total-connection-labels").html(data.collectionnumber);
$("#planed-collection-label").html(data.futurecollections);
$("#finished-collection-label").html(data.finshedcollections);
$("#total-city-number-label").html(data.citynumber);
}, 'json');
}
loadVersionFooter() {
$.post('/senddata/wastedata', 'action=getversionandbuildtime', function (data) {
$("#version-footer-label").html("<b>Version</b> " + data.version + " <b>Build</b> " + data.buildtime);
}, 'json');
}
reloadtable() {
const _this = this;
function reloadtable() {
$.post('/senddata/wastedata', 'action=getAllCities', function (data) {
if (_this.citytable != null) {
_this.citytable.destroy(); //delete table if already created
if (citytable != null) {
citytable.destroy(); //delete table if already created
}
console.log(data);
if (data.query == "ok") {
var tabledata = $('#location-table-data');
tabledata.html("");
//todo in variable
$('#location-table-data').html("");
$(".delbtn").off();
for (var i = 0; i < data.data.length; i++) {
tabledata.append("<tr>" +
$('#location-table-data').append("<tr>" +
"<td>" + data.data[i].cityname + "</td>" +
"<td>" + data.data[i].zone + "</td>" +
"<td>" + data.data[i].wastetype + "</td>" +
@ -269,13 +60,13 @@ class Dashboard {
}
$(".delbtn").click(function (event) {
const id = event.target.getAttribute("dataid");
var id = event.target.getAttribute("dataid");
console.log("clicked btn data " + id);
$.post('/senddata/wastedata', 'action=deletecity&id=' + id, function (data) {
console.log(data);
if (data.status === "success") {
if (data.status == "success") {
Swal.fire({
icon: "success",
type: "success",
title: 'Successfully deleted city!',
html: 'This alert closes automatically.',
timer: 1000,
@ -283,12 +74,12 @@ class Dashboard {
console.log('Popup closed. ')
});
_this.reloadtable();
} else if (data.status === "dependenciesnotdeleted") {
reloadtable();
} else if (data.status == "dependenciesnotdeleted") {
Swal.fire({
icon: "warning",
type: "warning",
title: 'This city is a dependency of a date',
html: 'Please delete all dependencies first!',
html: 'Do you want do delete it anyway with all dependencies?',
}).then((result) => {
console.log('Popup closed. ')
@ -299,10 +90,10 @@ class Dashboard {
}, "json");
});
_this.citytable = $("#example2").DataTable();
citytable = $("#example2").DataTable();
} else if (data.query == "nodbconn") {
Swal.fire({
icon: "error",
type: "error",
title: 'No connection to Database',
html: 'Setup DB here --> <a href="index.html">click<a/>.',
}).then((result) => {
@ -316,64 +107,176 @@ class Dashboard {
}, 'json');
}
reloadDateTable() {
const _this = this;
var DataTable;
function reloadDateTable() {
$.post('/senddata/wastedata', 'action=getAllDates', function (data) {
if (_this.datetable != null) {
_this.datetable.destroy(); //delete table if already created
if (DataTable != null) {
DataTable.destroy(); //delete table if already created
}
//todo
},"json");
}
reloadtable();
reloadDateTable();
//btn listeners
$('#logoutbtn').click(function () {
$.post('/senddata/checkloginstate', 'action=logout', function (data) {
console.log(data);
}, 'json');
});
if (data.query == "ok") {
$('#picupdates-tablebody').html("");
$(".delbtndate").off();
$('.wastetype-citynew-item').click(function (event) {
event.preventDefault();
$('#dropdown-wastetype').html($(this).html());
});
for (var i = 0; i < data.data.length; i++) {
$('#picupdates-tablebody').append("<tr>" +
"<td>" + data.data[i].cityname + "</td>" +
"<td>" + data.data[i].zone + "</td>" +
"<td>" + data.data[i].wastetype + "</td>" +
"<td>" + data.data[i].date + "</td>" +
"<td>" + "<button dataid='" + data.data[i].id + "' type='button' class='delbtndate btn btn-danger'>X</button>" + "</td>" +
"</tr>");
}
$('#btn-savecity').click(function () {
var cityname = $("#new_city_cityname").val();
var zonename = $("#new_city_zonename").val();
var wastetype = $("#dropdown-wastetype").html();
console.log("storing: " + cityname + "--" + wastetype + "in db");
$(".delbtndate").click(function (event) {
var id = event.target.getAttribute("dataid");
console.log("clicked btn data " + id);
$.post('/senddata/wastedata', 'action=deletedate&id=' + id, function (data) {
console.log(data);
if (data.status == "success") {
Swal.fire({
icon: "success",
title: 'Successfully deleted city!',
html: 'This alert closes automatically.',
timer: 1000,
}).then((result) => {
console.log('Popup closed. ')
$.post('/senddata/wastedata', 'action=newCity&wastetype=' + wastetype + "&cityname=" + cityname + "&wastezone=" + zonename, function (data) {
console.log(data);
if (data.status == "inserted") {
Swal.fire({
type: "success",
title: 'Successfully created city!',
html: 'This alert closes automatically.',
timer: 1000,
}).then((result) => {
console.log('Popup closed. ')
});
_this.reloadDateTable();
} else if (data.status == "dependenciesnotdeleted") {
Swal.fire({
icon: "warning",
title: 'This city is a dependency of a date',
html: 'Do you want do delete it anyway with all dependencies?',
}).then((result) => {
console.log('Popup closed. ')
});
reloadtable();
} else if (data.status == "exists") {
Swal.fire({
type: "warning",
title: 'Name already exists in db',
html: 'Close popup.',
}).then((result) => {
console.log('Popup closed. ')
});
//todo set yes no button here
}
}, "json");
});
}
_this.datetable = $("#table-pickupdates").DataTable({
"order": [[3, "asc"]]
});
}, 'json');
//clear form data
$("#new_city_cityname").val("");
$("#new_city_zonename").val("");
$("#dropdown-wastetype").html("select waste type");
});
/* new Date create: */
$("#dropdown-city").click(function (event) {
event.preventDefault();
var dropdata = $("#dropdown-city-data");
dropdata.html("");
console.log("loading city names")
$.post('/senddata/newdate', 'action=getCitynames', function (data) {
console.log(data);
if (data.query == "ok") {
var prev = "";
for (var i = 0; i < data.data.length; i++) {
var name = data.data[i].cityname;
dropdata.append("<a class=\"dropdown-data-cityname dropdown-item\" href=\"#\">" + name + "</a>");
}
$(".dropdown-data-cityname").off();
$(".dropdown-data-cityname").click(function (evnt) {
evnt.preventDefault();
console.log($(this).html());
$("#dropdown-city").html($(this).html());
});
}
}, "json");
}
}
});
$("#dropdown-zone").click(function (event) {
event.preventDefault();
var dropdata = $("#dropdown-zone-data");
dropdata.html("");
$.post('/senddata/newdate', 'action=getzones&cityname=' + $("#dropdown-city").html(), function (data) {
console.log(data);
if (data.query == "ok") {
var prev = "";
for (var i = 0; i < data.data.length; i++) {
var zone = data.data[i].zone;
dropdata.append("<a class=\"dropdown-data-zonename dropdown-item\" href=\"#\">" + zone + "</a>");
}
$(".dropdown-data-zonename").off();
$(".dropdown-data-zonename").click(function (evnt) {
evnt.preventDefault();
console.log($(this).html());
$("#dropdown-zone").html($(this).html());
});
}
});
});
$(".dropdown-item-wastetype").click(function (event) {
event.preventDefault();
$("#dropdown-type-data").html($(this).html());
});
$('.btn-savelist').click(function () {
console.log("saving date");
var cityname = $("#dropdown-city");
var zone = $("#dropdown-zone");
var wastetype = $("#dropdown-type-data");
var date = $("#input-wastetime");
$.post('/senddata/newdate', 'action=newdate&cityname=' + cityname.html() + "&zone=" + zone.html() + "&wastetype=" + wastetype.html() + "&date=" + date.val(), function (data) {
if (data.status == "success") {
Swal.fire({
type: "success",
title: 'Successfully created Date!',
html: 'This alert closes automatically.',
timer: 1000,
}).then((result) => {
console.log('Popup closed. ')
});
cityname.html("Select City");
zone.html("Select Zone");
wastetype.html("Select waste type");
date.val("");
} else if (data.status == "citydoesntexist") {
Swal.fire({
type: "warning",
title: 'city name doesnt exist',
html: 'Close popup.',
}).then((result) => {
console.log('Popup closed. ')
});
}
console.log(data)
}, "json");
});
//Date picker pop up actions...
var date_input = $('input[name="date"]'); //our date input has the name "date"
var container = $('.bootstrap-iso form').length > 0 ? $('.bootstrap-iso form').parent() : "body";
var options = {
format: 'yyyy-mm-dd',
container: container,
todayHighlight: true,
autoclose: true,
};
date_input.datepicker(options);
});

View File

@ -1,297 +0,0 @@
$(function () {
new Device();
});
class Device {
constructor() {
this.reloadDevices();
this.loadHeader();
}
devicetable = null;
/**
* reload devices list on page
*/
reloadDevices() {
var _this = this;
$.post('/senddata/Devicedata', 'action=getdevices', function (data) {
if (_this.devicetable != null) {
_this.devicetable.destroy();
}
console.log(data);
$('#devices-tablebody').html("");
$(".delbtn").off();
for (var i = 0; i < data.data.length; i++) {
var id = data.data[i].deviceid;
var cityid = data.data[i].cityid;
if (cityid === -1) {
$("#devices-tablebody").append("<tr><td>" + id + "</td><td>new Device</td><td><button deviceid=\"" + id + "\"type=\"button\" class=\"btn btn-primary configuredevicebutton\">Configure</button></td><td></td><td><button dataid='" + id + "' type='button' class='delbtn btn btn-danger'>X</button></td></tr>");
} else {
var devicename = data.data[i].devicename;
var devicelocation = data.data[i].devicelocation;
var row = "<tr><td>" + id + "</td><td>" + devicename + "</td><td>" + devicelocation + "</td><td>";
for (var n = 0; n < data.data[i].devices.length; n++) {
var cityname = data.data[i].devices[n].cityname;
var cityzone = data.data[i].devices[n].zone;
var wastetype = data.data[i].devices[n].wastetype;
row += cityname + "/" + wastetype + "/" + cityzone + " </br>";
}
row += "</td><td><button dataid='" + id + "' type='button' class='delbtn btn btn-danger'>X</button><button dataid='" + id + "' type='button' class='addbtn btn btn-success'>ADD</button></td></tr>";
$("#devices-tablebody").append(row);
}
}
_this._addDeleteButton();
_this._addAddButton();
_this._addConfigDialog();
_this.devicetable = $('#table-devices').DataTable();
}, 'json');
}
/**
* add click listener to add button to add new city entries to current device
*/
_addAddButton() {
var _this = this;
$('.addbtn').click(function (event) {
var id = event.target.getAttribute("dataid");
var cityname;
var zone;
var wastetype;
var devicename;
var devicelocation;
$.post('/senddata/Devicedata', 'action=getCitynames', function (data) {
Swal.mixin({
input: 'text',
confirmButtonText: 'Next &rarr;',
showCancelButton: true,
progressSteps: ['1']
}).queue([{
title: 'City',
text: 'Select your City',
input: 'select',
inputOptions: data
}
]).then((result) => {
if (result.value) {
cityname = result.value[0];
console.log("cityname=" + cityname);
$.post('/senddata/Devicedata', 'action=getzones&cityname=' + cityname, function (data) {
Swal.mixin({
input: 'text',
confirmButtonText: 'Next &rarr;',
showCancelButton: true,
progressSteps: ['1']
}).queue([
{
title: 'City',
text: 'Select your City',
input: 'select',
inputOptions: data
}
]).then((result) => {
if (result.value) {
zone = result.value[0];
$.post('/senddata/Devicedata', 'action=gettypes&cityname=' + cityname + '&zonename=' + zone, function (data) {
Swal.mixin({
input: 'text',
confirmButtonText: 'Next &rarr;',
showCancelButton: true,
progressSteps: ['1']
}).queue([
{
title: 'City',
text: 'Select your City',
input: 'select',
inputOptions: data
}
]).then((result) => {
if (result.value) {
wastetype = result.value[0];
$.post('/senddata/Devicedata', 'action=addtodb&deviceid=' + id + '&cityname=' + cityname + '&zonename=' + zone + '&wastetype=' + wastetype, function (data) {
if (data.success) {
Swal.fire({
icon: "success",
title: 'Successfully configured!',
html: 'This alert closes added.',
timer: 1000,
}).then((result) => {
_this.reloadDevices();
});
}
});
}
});
});
}
});
});
}
});
});
});
}
/**
* add click listener to delete button to delete this device entry
*/
_addDeleteButton() {
var _this = this;
$(".delbtn").click(function (event) {
var id = event.target.getAttribute("dataid");
console.log("clicked btn data " + id);
$.post('/senddata/Devicedata', 'action=deleteDevice&id=' + id, function (data) {
console.log(data);
if (data.status === "success") {
Swal.fire({
icon: "success",
title: 'Successfully deleted city!',
html: 'This alert closes automatically.',
timer: 1000,
}).then((result) => {
console.log('Popup closed. ')
});
_this.reloadDevices();
} else if (data.status === "dependenciesnotdeleted") {
Swal.fire({
icon: "warning",
title: 'This city is a dependency of a date',
html: 'Do you want do delete it anyway with all dependencies?',
}).then((result) => {
console.log('Popup closed. ')
});
//todo set yes no button here
}
}, "json");
});
}
/**
* add click listener to unconfigured device to show configure dialog
*/
_addConfigDialog() {
var _this = this;
$(".configuredevicebutton").click(function (event) {
var id = event.target.getAttribute("deviceid");
var cityname;
var zone;
var wastetype;
var devicename;
var devicelocation;
$.post('/senddata/Devicedata', 'action=getCitynames', function (data) {
Swal.mixin({
input: 'text',
confirmButtonText: 'Next &rarr;',
showCancelButton: true,
progressSteps: ['1', '2', '3']
}).queue([
{
title: 'Name of device',
text: 'Please define a device name'
}, {
title: 'Location of device',
text: 'Please define a device location'
}, {
title: 'City',
text: 'Select your City',
input: 'select',
inputOptions: data
}
]).then((result) => {
if (result.value) {
console.log(result.value);
const answers = JSON.stringify(result.value);
cityname = result.value[2];
devicename = result.value[0];
devicelocation = result.value[1];
console.log("cityname=" + cityname);
$.post('/senddata/Devicedata', 'action=getzones&cityname=' + cityname, function (data) {
Swal.mixin({
input: 'text',
confirmButtonText: 'Next &rarr;',
showCancelButton: true,
progressSteps: ['1']
}).queue([
{
title: 'City',
text: 'Select your City',
input: 'select',
inputOptions: data
}
]).then((result) => {
if (result.value) {
console.log(result.value);
zone = result.value[0];
$.post('/senddata/Devicedata', 'action=gettypes&cityname=' + cityname + '&zonename=' + zone, function (data) {
Swal.mixin({
input: 'text',
confirmButtonText: 'Next &rarr;',
showCancelButton: true,
progressSteps: ['1']
}).queue([
{
title: 'City',
text: 'Select your City',
input: 'select',
inputOptions: data
}
]).then((result) => {
if (result.value) {
console.log(result.value);
wastetype = result.value[0];
$.post('/senddata/Devicedata', 'action=savetodb&deviceid=' + id + '&cityname=' + cityname + '&zonename=' + zone + '&wastetype=' + wastetype + '&devicename=' + devicename + '&devicelocation=' + devicelocation, function (data) {
if (data.success) {
Swal.fire({
icon: "success",
title: 'Successfully configured!',
html: 'This alert closes automatically.',
timer: 1000,
}).then((result) => {
console.log('Popup closed. ');
_this.reloadDevices();
});
}
});
}
});
});
}
});
});
}
});
});
});
}
/**
* 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,28 +0,0 @@
$(document).ready(function () {
$('.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) {
console.log(data);
if (data.loggedin == true) {
$("#userlabel").html(" " + data.username);
if (data.permission > 0) {
$("#adminpanel").show();
}
} else {
$("#userlabel").html(" not logged in!!");
}
}, 'json');
});

View File

@ -2,37 +2,43 @@ $(document).ready(function () {
$('#loginbtn').click(function (e) {
e.preventDefault();
console.log("clicked login button");
const username = $("#userfield")[0].value;
const password = $("#passfield")[0].value;
var username = $("#userfield")[0].value;
var password = $("#passfield")[0].value;
$.post('/senddata/loginget', 'username=' + username + '&password=' + password, function (data) {
console.log(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';
} 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');
});
//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

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

View File

@ -1,38 +1,37 @@
$(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;
$(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) {
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);
console.log(data);
if (data.accept == true) {
console.log("successfully registered!");
$("#successbar").show();
if (data.accept == true) {
console.log("successfully registered!");
$("#successbar").show();
setTimeout(function () {
window.location = 'index.html';
}, 3000);
} else {
console.log("error!");
$("#errorbar").show();
}
}, 'json');
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 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

View File

@ -0,0 +1,444 @@
/*!
* 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.

After

Width:  |  Height:  |  Size: 10 KiB

View File

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

@ -0,0 +1,413 @@
/**
* 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

@ -0,0 +1,264 @@
/*
* 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

@ -0,0 +1,267 @@
$(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'
// }
// ]
// })
})

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