Commit bc008f51 by Dragan Miljkovic

Initial commit

parents
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
/*
* Copyright 2007-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if(!outputFile.getParentFile().exists()) {
if(!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`which java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
fi
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
exit /B %ERROR_CODE%
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Praktikum OOP</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>de.svenkubiak</groupId>
<artifactId>jBCrypt</artifactId>
<version>0.4.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.example.demo;
import java.io.File;
import java.sql.*;
import java.util.ArrayList;
import java.util.Objects;
public class DataBase {
Connection conn = null;
Statement stmt = null;
String sql;
DataBase(){
System.out.println("Connecting...");
try {
conn = DriverManager.getConnection(
"jdbc:mariadb://localhost:3307/poop", "root", ""
);
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("Connected.");
try {
stmt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void kreirajPocetnuBazu(){
System.out.println("Creating tables...");
String lokacija ="CREATE TABLE Lokacija" +
"(" +
"lokacijaID INT NOT NULL AUTO_INCREMENT PRIMARY KEY," +
"drzava VARCHAR(255)," +
"grad VARCHAR(255)" +
")";
String vestine = "CREATE TABLE Vestine" +
"(" +
"vestinaID INT NOT NULL AUTO_INCREMENT PRIMARY KEY," +
"naziv VARCHAR(255)" +
")";
String diplome ="CREATE TABLE Diplome" +
"(" +
"diplomaID INT NOT NULL AUTO_INCREMENT PRIMARY KEY," +
"zvanje VARCHAR(255)," +
"nazivSkole VARCHAR(255)," +
"tipDiplome VARCHAR(255)" +
")";
String kategorija_oglasa = "CREATE TABLE Kategorija_Oglasa" +
"(" +
"kategorijaID INT NOT NULL AUTO_INCREMENT PRIMARY KEY," +
"naziv VARCHAR(255)" +
")";
String korisnik = "CREATE TABLE Korisnik" +
"(" +
"korisnikID INT NOT NULL AUTO_INCREMENT PRIMARY KEY," +
"ime VARCHAR(255)," +
"prezime VARCHAR(255)," +
"datumRodjenja VARCHAR(255)," +
"email VARCHAR(255)," +
"pol BIT," +
"mobilni VARCHAR(255)," +
"profilnaSlikaURL VARCHAR(255)," +
"bio VARCHAR(2000)," +
"lokacijaID INT," +
"tipKorisnika INT," +
"CONSTRAINT FK_lokacijaID_1 FOREIGN KEY (lokacijaID) REFERENCES Lokacija(lokacijaID)," +
"CONSTRAINT FK_tipKorisnika FOREIGN KEY (tipKorisnika) REFERENCES Tip_Korisnika(tipID)" +
")";
String prijava = "CREATE TABLE Prijava " +
"(" +
"korisnikID INT PRIMARY KEY," +
"sifraKorisnika VARCHAR(255)," +
"imeKorisnika VARCHAR(255)," +
"CONSTRAINT FK_korisnikID_1 FOREIGN KEY (korisnikID) REFERENCES Korisnik(korisnikID)" +
")";
String korisnik_vestine = "CREATE TABLE Korisnik_Vestine " +
"(" +
"korisnikID INT," +
"vestinaID INT," +
"PRIMARY KEY(korisnikID,vestinaID),"+
"CONSTRAINT FK_korisnikID_2 FOREIGN KEY (korisnikID) REFERENCES Korisnik(korisnikID)," +
"CONSTRAINT FK_vestinaID_1 FOREIGN KEY(vestinaID) REFERENCES Vestine(vestinaID)" +
")";
String korisnik_edukacija = "CREATE TABLE Korisnik_Edukacija " +
"(" +
"korisnikID INT," +
"diplomaID INT," +
"PRIMARY KEY(korisnikID, diplomaID)," +
"CONSTRAINT FK_korisnikID_3 FOREIGN KEY (korisnikID) REFERENCES Korisnik(korisnikID)," +
"CONSTRAINT FK_diplomaID_1 FOREIGN KEY (diplomaID) REFERENCES Diplome(diplomaID)" +
")";
String oglasi = "CREATE TABLE Oglasi " +
"(" +
"oglasID INT NOT NULL AUTO_INCREMENT PRIMARY KEY," +
"vlasnikID INT," +
"lokacijaID INT," +
"kategorijaID INT," +
"datumKreiranja DATE," +
"nazivOglasa VARCHAR(2000)," +
"opisOglasa VARCHAR(5000)," +
"iskustvo BIT,"+
"radOdKuce BIT," +
"CONSTRAINT FK_lokacijaID_2 FOREIGN KEY (lokacijaID) REFERENCES Lokacija(lokacijaID)," +
"CONSTRAINT FK_kategorijaID FOREIGN KEY (kategorijaID) REFERENCES Kategorija_Oglasa(kategorijaID)," +
"CONSTRAINT FK_vlasnikID FOREIGN KEY (vlasnikID) REFERENCES Korisnik(korisnikID)" +
")";
String oglas_vestine = "CREATE TABLE Oglas_Vestine" +
"(" +
"oglasID INT," +
"vestinaID INT," +
"PRIMARY KEY(oglasID, vestinaID)," +
"CONSTRAINT FK_oglasID_1 FOREIGN KEY(oglasID) REFERENCES Oglasi(oglasID)," +
"CONSTRAINT FK_vestinaID_2 FOREIGN KEY(vestinaID) REFERENCES Vestine(vestinaID)" +
")";
String oglas_edukacija = "CREATE TABLE Oglas_Edukacija " +
"(" +
"oglasID INT," +
"diplomaID INT," +
"PRIMARY KEY(oglasID, diplomaID)," +
"CONSTRAINT FK_oglasID_2 FOREIGN KEY (oglasID) REFERENCES Oglasi(oglasID)," +
"CONSTRAINT FK_diplomaID_2 FOREIGN KEY (diplomaID) REFERENCES Diplome(diplomaID)" +
")";
String aplikacija = "CREATE TABLE Aplikacija " +
"(" +
"aplikacijaID INT NOT NULL AUTO_INCREMENT PRIMARY KEY," +
"korisnikID INT," +
"oglasID INT," +
"porukaPoslodavca VARCHAR(2000)," +
"primljen BIT," +
"sakrijVlasnik BIT," +
"sakrijUser BIT," +
"CONSTRAINT FK_korisnikID_5 FOREIGN KEY (korisnikID) REFERENCES Korisnik(korisnikID)," +
"CONSTRAINT FK_oglasID_4 FOREIGN KEY (oglasID) REFERENCES Oglasi(oglasID)" +
")";
String pregled_oglasa="CREATE TABLE Pregled_Oglasa" +
"(" +
"korisnikID INT," +
"oglasID INT," +
"lajk BIT," +
"PRIMARY KEY(korisnikID, oglasID)," +
"CONSTRAINT FK_korisnikID_6 FOREIGN KEY (korisnikID) REFERENCES Korisnik(korisnikID)," +
"CONSTRAINT FK_oglasID_4 FOREIGN KEY (oglasID) REFERENCES Oglasi(oglasID)" +
")";
try {
stmt.executeUpdate(diplome);
stmt.executeUpdate(kategorija_oglasa);
stmt.executeUpdate(prijava);
stmt.executeUpdate(lokacija);
stmt.executeUpdate(korisnik);
stmt.executeUpdate(vestine);
stmt.executeUpdate(korisnik_vestine);
stmt.executeUpdate(korisnik_edukacija);
stmt.executeUpdate(oglas_vestine);
stmt.executeUpdate(oglasi);
stmt.executeUpdate(oglas_edukacija);
stmt.executeUpdate(aplikacija);
stmt.executeUpdate(pregled_oglasa);
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("Tables created.");
popuniPocetneBaze();
}
public void popuniPocetneBaze()
{
String[] vestine ={"INSERT INTO Vestine(naziv) values ('Java')",
"INSERT INTO Vestine(naziv) values ('C')" ,
"INSERT INTO Vestine(naziv) values ('Python')\n" ,
"INSERT INTO Vestine(naziv) values ('Html')\n" ,
"INSERT INTO Vestine(naziv) values ('Css')\n" ,
"INSERT INTO Vestine(naziv) values ('MySQL')\n" ,
"INSERT INTO Vestine(naziv) values ('Digital Arts')\n" ,
"INSERT INTO Vestine(naziv) values ('Photoshop')\n" ,
"INSERT INTO Vestine(naziv) values ('Illustrator')\n" ,
"INSERT INTO Vestine(naziv) values ('R')\n" ,
"INSERT INTO Vestine(naziv) values ('Excel')\n" ,
"INSERT INTO Vestine(naziv) values ('Word')\n" ,
"INSERT INTO Vestine(naziv) values ('PowerPoint')\n" ,
"INSERT INTO Vestine(naziv) values ('Kuvanje')\n" ,
"INSERT INTO Vestine(naziv) values ('Poznavanje osnova elektrotehnike')\n" ,
"INSERT INTO Vestine(naziv) values ('Napredno poznavanje elektrotehnickih principa')\n" ,
"INSERT INTO Vestine(naziv) values ('Maser')\n",
"INSERT INTO Vestine(naziv) values ('Poznavanje osnova ekonomije')\n" ,
"INSERT INTO Vestine(naziv) values ('Napredno poznavanje ekonomskih principa')\n" ,
"INSERT INTO Vestine(naziv) values ('Poznavanje racunovodstvenih praksi')\n" ,
"INSERT INTO Vestine(naziv) values ('Poznavanje medicinskih praksi')\n" ,
"INSERT INTO Vestine(naziv) values ('Napredno znanje iz oblasti farmakologije')\n" ,
"INSERT INTO Vestine(naziv) values ('Napredno upravljanje pesticidima')\n" ,
"INSERT INTO Vestine(naziv) values ('Marketing')\n" ,
"INSERT INTO Vestine(naziv) values ('Poznavanje finansijskih principa')\n" ,
"INSERT INTO Vestine(naziv) values ('Eksperimentalni rad')"};
String[] lokacije={"INSERT INTO Lokacija(drzava,grad) values ('Srbija','Azanja')",
"INSERT INTO Lokacija(drzava,grad) values ('Srbija','Beograd')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Novi Sad')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Kragujevac')",
"INSERT INTO Lokacija (drzava,grad)values ('Srbija','Topola')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Jagodina')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Nis')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Raca')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Smederevska Palanka')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Kraljevo')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Krusevac')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Cacak')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Novi Pazar')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Subotica')",
"INSERT INTO Lokacija (drzava,grad) values ('Srbija','Zrenjanin')",
"INSERT INTO Lokacija (drzava,grad) values ('Bosna i Hercegovina','Sarajevo')",
"INSERT INTO Lokacija (drzava,grad) values ('Bosna i Hercegovina','Banja Luka')",
"INSERT INTO Lokacija (drzava,grad) values ('Bosna i Hercegovina','Mostar')",
"INSERT INTO Lokacija (drzava,grad) values ('Bosna i Hercegovina','Trebinje')",
"INSERT INTO Lokacija (drzava,grad) values ('Bosna i Hercegovina','Tuzla')",
"INSERT INTO Lokacija (drzava,grad) values ('Crna Gora','Podgorica')",
"INSERT INTO Lokacija (drzava,grad) values ('Crna Gora','Cetinje')",
"INSERT INTO Lokacija (drzava,grad) values ('Crna Gora','Ulcinj')",
"INSERT INTO Lokacija (drzava,grad) values ('Crna Gora','Bar')",
"INSERT INTO Lokacija (drzava,grad) values ('Crna Gora','Kotor')",
"INSERT INTO Lokacija (drzava,grad) values ('Makedonija','Skoplje')",
"INSERT INTO Lokacija (drzava,grad) values ('Makedonija','Ohrid')",
"INSERT INTO Lokacija (drzava,grad) values ('Makedonija','Stip')",
"INSERT INTO Lokacija (drzava,grad) values ('Hrvatska','Zagreb')",
"INSERT INTO Lokacija (drzava,grad) values ('Hrvatska','Zadar')",
"INSERT INTO Lokacija (drzava,grad) values ('Hrvatska','Osijek')",
"INSERT INTO Lokacija (drzava,grad) values ('Hrvatska','Hvar')",
"INSERT INTO Lokacija (drzava,grad) values ('SAD','Dallas')",
"INSERT INTO Lokacija (drzava,grad) values ('SAD','Denver')",
"INSERT INTO Lokacija (drzava,grad) values ('SAD','Los Angeles')",
"INSERT INTO Lokacija (drzava,grad) values ('SAD','San Diego')",
"INSERT INTO Lokacija (drzava,grad) values ('SAD','New York')",
"INSERT INTO Lokacija (drzava,grad) values ('SAD','Boston')",
"INSERT INTO Lokacija (drzava,grad) values ('Rusija','Moskva')",
"INSERT INTO Lokacija (drzava,grad) values ('Rusija','Soci')",
"INSERT INTO Lokacija (drzava,grad) values ('Rusija','Vladivostok')",
"INSERT INTO Lokacija (drzava,grad) values ('Rusija','Kazanj')",
"INSERT INTO Lokacija (drzava,grad) values ('Rusija','Murmansk')",
"INSERT INTO Lokacija (drzava,grad) values ('Nemacka','Berlin')",
"INSERT INTO Lokacija (drzava,grad) values ('Nemacka','Frankfurt')",
"INSERT INTO Lokacija (drzava,grad) values ('Nemacka','Dortmund')",
"INSERT INTO Lokacija (drzava,grad) values ('Nemacka','Stutgart')",
"INSERT INTO Lokacija (drzava,grad) values ('Nemacka','Minhen')",
"INSERT INTO Lokacija (drzava,grad) values ('Nemacka','Keln')"};
String[] diplome={"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Programer','PMF','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Matematicar','PMF','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Farmaceut','Medicinski Fakultet','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Fizioterapeut','Visa Medicinska Skola','Visa Skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Ekonomista','EKOF','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Turizmolog','GEF','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Hotelijerski menadzer','Univerzitet Singidunum','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Biolog','PMF','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Hemicar','PMF','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Ekolog','VISAR','Visa skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Fizicar','PMF','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Masinski inzenjer','FIN','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Geograf','GEF','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Prehrambeni tehnolog','Poljoprivredni Fakultet','Fakultet')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Ekonomista','Visa Poslovna Skola','Visa Skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Komercijalista','EUS Slobodan Minic','Srednja Skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Kuvar','EUS Slobodan Minic','Srednja Skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Maser','Medicinska skola Zvezdara','Srednja Skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Vaspitac','Medicinska skola Sestre Ninkovic','Srednja Skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Veterinar','Srednja skola Kralj Petar I','Srednja Skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Elektricar','ES Rade Koncar','Srednja Skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Laborant','Medicinska skola Sestre Ninkovic','Srednja Skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Autoelektricar','Srednja skola Kralj Petar I','Srednja Skola')\n",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Zubni-tehnicar','Medicinska skola Sestre Ninkovic','Srednja Skola')",
"INSERT INTO Diplome (zvanje, nazivSkole,tipDiplome) VALUES ('Diplomirani Poljprivredni tehnicar','Srednja skola Svilajnac','Srednja Skola')"};
String[] kategorije={"INSERT INTO kategorija_oglasa(naziv) VALUES('Accounting & Consulting')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('Admin Support')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('Customer Service')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('Data Science & Analytics')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('Design & Creative')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('Engineering & Architecture')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('IT & Networking')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('Legal')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('Sales & Marketing')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('Translation')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('Web, Mobile & Software Dev')",
"INSERT INTO kategorija_oglasa(naziv) VALUES('Writing')"};
try {
for (String upit:vestine) {
stmt.executeQuery(upit);
}
for (String upit:lokacije) {
stmt.executeQuery(upit);
}
for (String upit:diplome) {
stmt.executeQuery(upit);
}
for (String upit:kategorije) {
stmt.executeQuery(upit);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public ResultSet executeCustom(String sql)
{
ResultSet rs=null;
try {
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
try {
assert rs != null;
if(rs.next())
return rs;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public ResultSet popuniListuOglasa(String search,int[] skills,int[] lokacija,int[] kategorija) throws SQLException {
sql="SELECT * FROM oglasi o WHERE nazivOglasa LIKE '%"+search+"%'";
if(lokacija[0]!=-1)
{
sql+=" AND ";
for (int i=0;i<lokacija.length-1;i++) {
sql+="lokacijaID="+lokacija[i]+" OR ";
}
sql+="lokacijaID="+lokacija[lokacija.length-1];
}
if(kategorija[0]!=-1)
{
sql+=" AND ";
for (int i=0;i<kategorija.length-1;i++) {
sql+="kategorijaID="+kategorija[i]+" OR ";
}
sql+="kategorijaID="+kategorija[kategorija.length-1];
}
String vestine="";
if (skills[0]!=-1) {
for (int i=0;i<skills.length-1;i++) {
vestine+="vestinaID="+skills[i]+" OR ";
}
vestine+="vestinaID="+skills[skills.length-1];
sql+=" AND EXISTS (SELECT oglasID FROM oglas_vestine WHERE "+vestine+" AND o.oglasID=oglasID)";
}
sql+=" ORDER BY oglasID DESC";
ResultSet rs = null;
try {
rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public String vratiUsername(String username)
{
String userReturn=null;
String sql="SELECT * FROM prijava WHERE imeKorisnika='" + username + "'";
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first())
{
userReturn=rs.getString("imeKorisnika");
}
} catch (SQLException e)
{
e.printStackTrace();
}
return userReturn;
}
public String vratiUsernameID(int id)
{
String userReturn=null;
String sql="SELECT * FROM prijava WHERE korisnikID=" + id + "";
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first())
{
userReturn=rs.getString("imeKorisnika");
}
} catch (SQLException e)
{
e.printStackTrace();
}
return userReturn;
}
public String vratiPassword(String username) {
String passwordReturn=null;
String sql="SELECT * FROM prijava WHERE imeKorisnika='" + username + "'";
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first())
{
passwordReturn=rs.getString("sifraKorisnika");
}
} catch (SQLException e)
{
e.printStackTrace();
}
return passwordReturn;
}
public int vratiUserID(String username)
{
int korisnikID=0;
String sql="SELECT * FROM prijava WHERE imeKorisnika='" + username + "'";
try{
ResultSet rs = stmt.executeQuery(sql);
if(rs.first())
{
korisnikID=rs.getInt("korisnikID");
}
} catch (SQLException e)
{
e.printStackTrace();
}
return korisnikID;
}
public int roleKorisnika(int korisnikID){
int role=-1;
String sql="SELECT * FROM korisnik WHERE korisnikID=" + korisnikID;
try{
ResultSet rs = stmt.executeQuery(sql);
if(rs.first())
{
role=rs.getInt("tipKorisnika");
}
} catch (SQLException e)
{
e.printStackTrace();
}
return role;
}
public int registrujKorisnika(String ime, String prezime, String datumRodjenja, int pol, String username, String password, String email, String mobilni, int lokacijaID, String bio, int role, String avatar){
String sql="INSERT INTO korisnik(ime,prezime,datumRodjenja,email,pol,mobilni,profilnaSlikaURL,bio,lokacijaID,tipKorisnika)\n" +
"VALUES('"+ime+"','"+prezime+"','"+datumRodjenja+"','"+email+"',"+pol+",'"+mobilni+"','"+avatar+"','"+bio+"',"+lokacijaID+","+role+")" +
" RETURNING korisnikID AS id";
int id=0;
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first()) {
id = rs.getInt("id");
String sql1="INSERT INTO prijava VALUES("+id+",'"+password+"','"+username+"')";
stmt.executeQuery(sql1);
}
} catch (SQLException e) {
e.printStackTrace();
}
return id;
}
public void updateKorisnika(int id, String ime, String prezime, String datumRodjenja, int pol, String username, String password, String email, String mobilni, int lokacijaID, String bio, String avatar, int[] skills, int[] edukacija){
String sql="UPDATE korisnik " +
"SET ime='"+ime+"',prezime='"+prezime+"',datumRodjenja='"+datumRodjenja+"',email='"+email+"',pol="+pol+",mobilni='"+mobilni+"',profilnaSlikaURL='"+avatar+"',bio='"+bio+"',lokacijaID="+lokacijaID+" "+
"WHERE korisnikID="+id;
String sql1="UPDATE prijava SET imeKorisnika='"+username+"',sifraKorisnika='"+Security.generatePassword(password)+"' WHERE korisnikID="+id;
String izbrisiIzVestina = "DELETE FROM korisnik_vestine WHERE korisnikID="+id;
String izbrisiIzEdukacija = "DELETE FROM korisnik_edukacija WHERE korisnikID="+id;
try {
stmt.executeQuery(sql);
stmt.executeQuery(sql1);
stmt.executeQuery(izbrisiIzVestina);
stmt.executeQuery(izbrisiIzEdukacija);
if(edukacija[0]!=-1) {
dodajEdukacijuKorisnik(id, edukacija);
}
if(skills[0]!=-1) {
dodajSkillKorisnik(id, skills);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public int dodajOglas(int vlasnikID, int lokacijaID, int kategorijaID, String datumKreiranja, String naziv, String opis,boolean radOdKuce, boolean iskustvo){
String sql="INSERT INTO oglasi(vlasnikID,lokacijaID,kategorijaID,datumKreiranja,nazivOglasa,opisOglasa,iskustvo,radOdKuce)\n" +
"VALUES('"+vlasnikID+"',"+lokacijaID+","+kategorijaID+",'"+datumKreiranja+"','"+naziv+"','"+opis+"',"+iskustvo+","+radOdKuce+")" +
"RETURNING oglasID AS id";
int id=0;
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first()) {
id = rs.getInt("id");
}
} catch (SQLException e) {
e.printStackTrace();
}
return id;
}
public void updateOglas(int id, int lokacijaID, int kategorijaID, String naziv, String opis,boolean radOdKuce, boolean iskustvo,int[] skills, int[] edukacija){
String sql="UPDATE oglasi " +
"SET lokacijaID="+lokacijaID+",kategorijaID="+kategorijaID+",nazivOglasa='"+naziv+"',opisOglasa='"+opis+"',iskustvo="+iskustvo+",radOdKuce="+radOdKuce+" " +
"WHERE oglasID="+id;
String izbrisiIzVestina = "DELETE FROM oglas_vestine WHERE oglasID="+id;
String izbrisiIzEdukacija = "DELETE FROM oglas_edukacija WHERE oglasID="+id;
try {
stmt.executeQuery(sql);
stmt.executeQuery(izbrisiIzVestina);
stmt.executeQuery(izbrisiIzEdukacija);
if(edukacija[0]!=-1) {
dodajEdukacijuOglas(id, edukacija);
}
if(skills[0]!=-1) {
dodajSkillOglas(id, skills);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public ArrayList<String> vratiSkillsOglas(int oglasID)
{
ArrayList<String> skills=new ArrayList<String>();
String upit="SELECT v.naziv FROM oglas_vestine ov JOIN vestine v ON ov.vestinaID=v.vestinaID WHERE ov.oglasID="+oglasID;
try {
ResultSet rs = stmt.executeQuery(upit);
while (rs.next()) {
skills.add(rs.getString("naziv"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return skills;
}
public ArrayList<String> vratiEduOglas(int oglasID)
{
ArrayList<String> edukacija=new ArrayList<String>();
String upit="SELECT * FROM oglas_edukacija oe JOIN diplome d ON oe.diplomaID=d.diplomaID WHERE oe.oglasID="+oglasID;
try {
ResultSet rs = stmt.executeQuery(upit);
while (rs.next()) {
edukacija.add(rs.getString("zvanje") + ", " + rs.getString("nazivSkole"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return edukacija;
}
public ArrayList<String> vratiSkillsKorisnik(int korisnikID) {
ArrayList<String> skills = new ArrayList<String>();
String upit = "SELECT v.naziv FROM korisnik_vestine kv JOIN vestine v ON kv.vestinaID=v.vestinaID WHERE kv.korisnikID=" + korisnikID;
try {
ResultSet rs = stmt.executeQuery(upit);
while (rs.next()) {
skills.add(rs.getString("naziv"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return skills;
}
public ArrayList<String> vratiEduKorisnik(int korisnikID) {
ArrayList<String> edukacija = new ArrayList<String>();
String upit = "SELECT * FROM korisnik_edukacija ke JOIN diplome d ON ke.diplomaID=d.diplomaID WHERE ke.korisnikID=" + korisnikID;
try {
ResultSet rs = stmt.executeQuery(upit);
while (rs.next()) {
edukacija.add(rs.getString("zvanje") + ", " + rs.getString("nazivSkole"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return edukacija;
}
public String lokacija(int ID)
{
String lokacija="";
String sql="SELECT * FROM lokacija WHERE lokacijaID="+ID;
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first())
{
lokacija=rs.getString("grad")+", "+rs.getString("drzava");
}
} catch (SQLException e){
e.printStackTrace();
}
return lokacija;
}
public void izbrisiOglas(int oglasID)
{
String izbrisiIzOglasa = "DELETE FROM Oglasi WHERE oglasID="+oglasID;
String izbrisiIzVestina = "DELETE FROM oglas_vestine WHERE oglasID="+oglasID;
String izbrisiIzEdukacija = "DELETE FROM oglas_edukacija WHERE oglasID="+oglasID;
String izbrisiIzPregleda = "DELETE FROM pregled_oglasa WHERE oglasID="+oglasID;
String izbrisiIzAplikacija = "DELETE FROM aplikacija WHERE oglasID="+oglasID;
try {
stmt.executeQuery(izbrisiIzOglasa);
stmt.executeQuery(izbrisiIzVestina);
stmt.executeQuery(izbrisiIzEdukacija);
stmt.executeQuery(izbrisiIzPregleda);
stmt.executeQuery(izbrisiIzAplikacija);
} catch (SQLException e)
{
e.printStackTrace();
}
}
public void izbrisiKorisnika(int korisnikID)
{
String izbrisiIzOglasa = "DELETE FROM Korisnik WHERE korisnikID="+korisnikID;
String izbrisiIzVestina = "DELETE FROM korisnik_vestine WHERE korisnikID="+korisnikID;
String izbrisiIzEdukacija = "DELETE FROM korisnik_edukacija WHERE korisnikID="+korisnikID;
String izbrisiIzPregleda = "DELETE FROM pregled_oglasa WHERE korisnikID="+korisnikID;
String izbrisiIzPrijave = "DELETE FROM prijava WHERE korisnikID="+korisnikID;
String izbrisiIzAplikacija = "DELETE FROM aplikacija WHERE korisnikID="+korisnikID;
try {
stmt.executeQuery(izbrisiIzOglasa);
stmt.executeQuery(izbrisiIzVestina);
stmt.executeQuery(izbrisiIzEdukacija);
stmt.executeQuery(izbrisiIzPregleda);
stmt.executeQuery(izbrisiIzPrijave);
stmt.executeQuery(izbrisiIzAplikacija);
String sql = "SELECT * FROM oglasi WHERE vlasnikID="+korisnikID;
ResultSet rs = stmt.executeQuery(sql);
while (rs.next())
{
izbrisiOglas(rs.getInt("oglasID"));
}
} catch (SQLException e)
{
e.printStackTrace();
}
}
public void posaljiAplikaciju(int cookieId, int idOglasa, String message)
{
String sql="INSERT INTO Aplikacija(korisnikID,oglasID,porukaPoslodavca,sakrijVlasnik,sakrijUser) VALUES ("+cookieId+","+idOglasa+",\""+message+"\",0,0)";
try{
stmt.executeQuery(sql);
} catch (SQLException e){
e.printStackTrace();
}
}
public boolean prijavioAplikaciju(int cookieId, int oglasID)
{
String sql = "SELECT korisnikID,oglasID FROM Aplikacija WHERE korisnikID="+cookieId+" AND oglasID="+oglasID;
boolean prijavio=false;
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first()) {
prijavio = true;
}
} catch (SQLException e) {
e.printStackTrace();
}
return prijavio;
}
public int brojPregleda(int oglasID)
{
String sql = "SELECT COUNT(*) AS broj FROM pregled_oglasa WHERE oglasID="+oglasID;
int broj=0;
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first())
{
broj=rs.getInt("broj");
}
} catch (SQLException e) {
e.printStackTrace();
}
return broj;
}
public int brojLajkova(int oglasID)
{
String sql = "SELECT COUNT(lajk) AS broj FROM pregled_oglasa WHERE oglasID="+oglasID+" AND lajk=1";
int broj=0;
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first())
{
broj=rs.getInt("broj");
}
} catch (SQLException e) {
e.printStackTrace();
}
return broj;
}
public void dodajLajk(int oglasID,int userID)
{
String sql = "UPDATE pregled_oglasa SET lajk=1 WHERE oglasID="+oglasID+" AND korisnikID="+userID;
try {
stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
public boolean lajkovao(int oglasID,int userID)
{
String sql = "SELECT COUNT(*) as broj FROM pregled_oglasa WHERE lajk=1 AND oglasID="+oglasID+" AND korisnikID="+userID;
int broj=0;
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first())
{
broj=rs.getInt("broj");
}
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(broj);
if(broj==1)
{
return true;
}
else {
return false;
}
}
public void skiniLajk(int oglasID,int userID)
{
String sql = "UPDATE pregled_oglasa SET lajk=0 WHERE oglasID="+oglasID+" AND korisnikID="+userID;
int broj=0;
try {
stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
public String kategorija(int kategorijaID)
{
String sql = "SELECT * FROM kategorija_oglasa WHERE kategorijaID="+kategorijaID;
String kategorija="";
try {
ResultSet rs = stmt.executeQuery(sql);
if(rs.first())
{
kategorija=rs.getString("naziv");
}
} catch (SQLException e)
{
e.printStackTrace();
}
return kategorija;
}
public String vratiListuSkillsKorisnik(int idKorinsika) {
ArrayList<String> selected=vratiSkillsKorisnik(idKorinsika);
String sql = "SELECT * FROM vestine";
String skills="";
boolean ind;
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
ind=true;
for (String skill:selected) {
if(Objects.equals(rs.getString("naziv"), skill))
{
skills+="<option selected value=\""+rs.getInt("vestinaID")+"\"> "+rs.getString("naziv")+"</option>";
ind=false;
}
}
if(ind) {
skills += "<option value=\"" + rs.getInt("vestinaID") + "\"> " + rs.getString("naziv") + "</option>";
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
return skills;
}
public String vratiListuSkillsOglas(int idOglasa) {
ArrayList<String> selected=vratiSkillsOglas(idOglasa);
String sql = "SELECT * FROM vestine";
String skills="";
boolean ind;
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
ind=true;
for (String skill:selected) {
if(Objects.equals(rs.getString("naziv"), skill))
{
skills+="<option selected value=\""+rs.getInt("vestinaID")+"\"> "+rs.getString("naziv")+"</option>";
ind=false;
}
}
if(ind) {
skills += "<option value=\"" + rs.getInt("vestinaID") + "\"> " + rs.getString("naziv") + "</option>";
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
return skills;
}
public String vratiListuSkills() {
String sql = "SELECT * FROM vestine";
String skills="";
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
skills += "<option value=\"" + rs.getInt("vestinaID") + "\"> " + rs.getString("naziv") + "</option>";
}
} catch (SQLException e)
{
e.printStackTrace();
}
return skills;
}
public String vratiListuSkillsFilter(int[] skillovi) {
String sql = "SELECT * FROM vestine";
String skills="";
boolean ind;
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
ind=true;
for (int skill:skillovi) {
if(rs.getInt("vestinaID")==skill)
{
skills+="<option selected value=\""+rs.getInt("vestinaID")+"\"> "+rs.getString("naziv")+"</option>";
ind=false;
}
}
if(ind) {
skills += "<option value=\"" + rs.getInt("vestinaID") + "\"> " + rs.getString("naziv") + "</option>";
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
return skills;
}
public String vratiListuKategorija() {
String sql = "SELECT * FROM kategorija_oglasa";
String kategorije="";
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
kategorije+="<option value=\""+rs.getInt("kategorijaID")+"\"> "+rs.getString("naziv")+"</option>";
}
} catch (SQLException e)
{
e.printStackTrace();
}
return kategorije;
}
public String vratiListuKategorijaOglas(int idKategorija) {
String sql = "SELECT * FROM kategorija_oglasa";
String kategorije="";
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
if (rs.getInt("kategorijaID") == idKategorija) {
kategorije += "<option selected value=\"" + rs.getInt("kategorijaID") + "\"> " + rs.getString("naziv") + "</option>";
}
else {
kategorije += "<option value=\"" + rs.getInt("kategorijaID") + "\"> " + rs.getString("naziv") + "</option>";
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
return kategorije;
}
public String vratiListuKategorijaFilter(int[] kategorija) {
String sql = "SELECT * FROM kategorija_oglasa";
String kategorije="";
boolean ind;
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
ind=true;
for (int kat:kategorija) {
if (rs.getInt("kategorijaID") == kat) {
kategorije += "<option selected value=\"" + rs.getInt("kategorijaID") + "\"> " + rs.getString("naziv") + "</option>";
ind=false;
}
}
if(ind) {
kategorije += "<option value=\"" + rs.getInt("kategorijaID") + "\"> " + rs.getString("naziv") + "</option>";
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
return kategorije;
}
public ArrayList<String> vratiListuDrzava() {
String sql = "SELECT DISTINCT drzava FROM lokacija";
ArrayList<String> drzave=new ArrayList<String>();
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
drzave.add(rs.getString("drzava"));
}
} catch (SQLException e)
{
e.printStackTrace();
}
return drzave;
}
public String vratiListuGradova(String drzava) {
String sql = "SELECT * FROM lokacija WHERE drzava='"+drzava+"'";
String gradovi="";
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
gradovi+="<option value=\""+rs.getInt("lokacijaID")+"\"> "+rs.getString("grad")+"</option>";
}
} catch (SQLException e)
{
e.printStackTrace();
}
return gradovi;
}
public String vratiListuGradovaKorisnik(String drzava,String lokacija) {
String sql = "SELECT * FROM lokacija WHERE drzava='"+drzava+"'";
String gradovi="";
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
if(Objects.equals(rs.getString("grad")+", "+rs.getString("drzava"), lokacija)) {
gradovi += "<option selected value=\""+rs.getInt("lokacijaID")+"\"> "+rs.getString("grad")+"</option>";
}
else {
gradovi+="<option value=\""+rs.getInt("lokacijaID")+"\"> "+rs.getString("grad")+"</option>";
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
return gradovi;
}
public String vratiListuGradovaOglas(String drzava,String lokacija) {
String sql = "SELECT * FROM lokacija WHERE drzava='"+drzava+"'";
String gradovi="";
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
if(Objects.equals(rs.getString("grad")+", "+rs.getString("drzava"), lokacija)) {
gradovi += "<option selected value=\""+rs.getInt("lokacijaID")+"\"> "+rs.getString("grad")+"</option>";
}
else {
gradovi+="<option value=\""+rs.getInt("lokacijaID")+"\"> "+rs.getString("grad")+"</option>";
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
return gradovi;
}
public String vratiListuGradovaFilter(String drzava,int[] lokacija) {
String sql = "SELECT * FROM lokacija WHERE drzava='"+drzava+"'";
String gradovi="";
boolean ind;
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
ind=true;
for (int lok:lokacija) {
if(lok==rs.getInt("lokacijaID"))
{
gradovi+="<option selected value=\""+rs.getInt("lokacijaID")+"\"> "+rs.getString("grad")+"</option>";
ind=false;
}
}
if(ind) {
gradovi+="<option value=\""+rs.getInt("lokacijaID")+"\"> "+rs.getString("grad")+"</option>";
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
return gradovi;
}
public ArrayList<String> vratiTipoveSkola() {
String sql = "SELECT DISTINCT tipDiplome FROM diplome";
ArrayList<String> skole=new ArrayList<String>();
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
skole.add(rs.getString("tipDiplome"));
}
} catch (SQLException e)
{
e.printStackTrace();
}
return skole;
}
public ArrayList<String> vratiListuSkola(String skola) {
String sql = "SELECT DISTINCT nazivSkole FROM diplome WHERE tipDiplome='"+skola+"'";
ArrayList<String> skole=new ArrayList<String>();
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
skole.add(rs.getString("nazivSkole"));
}
} catch (SQLException e)
{
e.printStackTrace();
}
return skole;
}
public String vratiListuZvanja(String nazivSkole) {
String sql = "SELECT * FROM diplome WHERE nazivSkole='"+nazivSkole+"'";
String zvanja="";
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
zvanja+="<option value=\""+rs.getInt("diplomaID")+"\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "+rs.getString("zvanje")+"</option>";
}
} catch (SQLException e)
{
e.printStackTrace();
}
return zvanja;
}
public String vratiListuZvanjaKorisnik(String nazivSkole,int id) {
ArrayList<String> selected=vratiEduKorisnik(id);
String sql = "SELECT * FROM diplome WHERE nazivSkole='"+nazivSkole+"'";
String zvanja="";
boolean ind;
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
ind=true;
for (String edu:selected) {
if(Objects.equals(rs.getString("zvanje")+", "+rs.getString("nazivSkole"), edu))
{
zvanja+="<option selected value=\""+rs.getInt("diplomaID")+"\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "+rs.getString("zvanje")+"</option>";
ind=false;
}
}
if(ind) {
zvanja += "<option value=\""+rs.getInt("diplomaID")+"\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "+rs.getString("zvanje")+"</option>";
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
return zvanja;
}
public String vratiListuZvanjaOglas(String nazivSkole,int id) {
ArrayList<String> selected=vratiEduOglas(id);
String sql = "SELECT * FROM diplome WHERE nazivSkole='"+nazivSkole+"'";
String zvanja="";
boolean ind;
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
ind=true;
for (String edu:selected) {
if(Objects.equals(rs.getString("zvanje")+", "+rs.getString("nazivSkole"), edu))
{
zvanja+="<option selected value=\""+rs.getInt("diplomaID")+"\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "+rs.getString("zvanje")+"</option>";
ind=false;
}
}
if(ind) {
zvanja += "<option value=\""+rs.getInt("diplomaID")+"\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "+rs.getString("zvanje")+"</option>";
}
}
} catch (SQLException e)
{
e.printStackTrace();
}
return zvanja;
}
public void dodajSkillOglas(int idOglasa,int[] skills)
{
for (int idSkill:skills) {
String sql = "INSERT INTO oglas_vestine(oglasID,vestinaID) VALUES("+idOglasa+","+idSkill+")";
try {
ResultSet rs = stmt.executeQuery(sql);
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
public void dodajEdukacijuOglas(int idOglasa,int[] edukacija)
{
for (int idEdu:edukacija) {
String sql = "INSERT INTO oglas_edukacija(oglasID,diplomaID) VALUES("+idOglasa+","+idEdu+")";
try {
ResultSet rs = stmt.executeQuery(sql);
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
public void dodajSkillKorisnik(int idKorisnika,int[] skills)
{
for (int idSkill:skills) {
String sql = "INSERT INTO korisnik_vestine(korisnikID,vestinaID) VALUES("+idKorisnika+","+idSkill+")";
try {
ResultSet rs = stmt.executeQuery(sql);
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
public void dodajEdukacijuKorisnik(int idKorisnika,int[] edukacija)
{
for (int idEdu:edukacija) {
String sql = "INSERT INTO korisnik_edukacija(korisnikID,diplomaID) VALUES("+idKorisnika+","+idEdu+")";
try {
ResultSet rs = stmt.executeQuery(sql);
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
public ArrayList<Integer> vratiIDPoslove(int korisnikID) {
ArrayList<Integer> poslovi = new ArrayList<Integer>();
String upit = "SELECT * FROM oglasi WHERE vlasnikID=" + korisnikID;
try {
ResultSet rs = stmt.executeQuery(upit);
while (rs.next()) {
poslovi.add(rs.getInt("oglasID"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return poslovi;
}
public String popuniInfoInboxKorisnik(int id)
{
String sql = "SELECT * FROM aplikacija WHERE korisnikID=" + id+" AND sakrijUser=0 AND primljen is not NULL";
String infoInbox="";
try {
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
Oglas oglas=new Oglas(rs.getInt("oglasID"));
String prihvacen="";
if(rs.getBoolean("primljen"))
{
prihvacen="Prihvacen";
}
else {
prihvacen="Nije prihvacen";
}
infoInbox+="<div class=\"card\">\n" +
" <h5 class=\"card-header\"><a href=\"/proposal?idOglasa="+oglas.getOglasID()+"+\">"+oglas.getNazivOglasa()+"</a></h5>\n" +
" <div class=\"card-body\">\n" +
" <div class=\"row align-items-center\">\n" +
" <div class=\"col\">\n" +
" <h5 class=\"card-title\">"+prihvacen+"</h5>\n" +
" </div>\n" +
" <div class=\"col-2\">\n" +
" <a href=\"/dismissUser?id="+oglas.getOglasID()+"\" class=\"btn btn-danger\">\n" +
" <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\" fill=\"white\"\n" +
" class=\"bi bi-x\" viewBox=\"0 0 16 16\">\n" +
" <path\n" +
" d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\n" +
" </svg>\n" +
" Obrisi Poruku &nbsp; &nbsp;\n" +
" </a>\n" +
" </div>\n" +
" </div>\n" +
" </div>\n" +
" </div><br><br>";
}
} catch (SQLException e)
{
e.printStackTrace();
}
return infoInbox;
}
public String popuniInfoInboxPoslodavac(int id)
{
String infoInbox = "";
for (int oglasID:vratiIDPoslove(id)) {
String sql = "SELECT * FROM aplikacija WHERE oglasID=" + oglasID + " AND sakrijVlasnik=0";
try {
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
Oglas oglas = new Oglas(rs.getInt("oglasID"));
User user=new User(rs.getInt("korisnikID"));
String prihvacen = "";
if(rs.getString("primljen")==null)
{
infoInbox+="<div class=\"card\">\n" +
" <h5 class=\"card-header\"><a href=\"proposal?idOglasa="+oglas.getOglasID()+"\">"+oglas.getNazivOglasa()+"</a></h5>\n" +
" <div class=\"card-body\">\n" +
" <div class=\"row align-items-center\">\n" +
" <div class=\"col\">\n" +
" <h5 class=\"card-title\"><a href=\"user?id="+rs.getInt("korisnikID")+"\">"+user.getIme()+" "+user.getPrezime()+"</a></h5>\n" +
" <p class=\"card-text\">"+rs.getString("porukaPoslodavca")+"</p>\n" +
" </div>\n" +
" <div class=\"col-2\">\n" +
" <a href=\"accept?id="+rs.getInt("aplikacijaID")+"\" class=\"btn btn-success\">\n" +
" <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\" fill=\"white\"\n" +
" class=\"bi bi-check\" viewBox=\"0 0 16 16\">\n" +
" <path\n" +
" d=\"M10.97 4.97a.75.75 0 0 1 1.07 1.05l-3.99 4.99a.75.75 0 0 1-1.08.02L4.324 8.384a.75.75 0 1 1 1.06-1.06l2.094 2.093 3.473-4.425a.267.267 0 0 1 .02-.022z\" />\n" +
" </svg>\n" +
" </a>\n" +
" &nbsp;\n" +
" <a href=\"decline?id="+rs.getInt("aplikacijaID")+"\" class=\"btn btn-danger\">\n" +
" <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\" fill=\"white\"\n" +
" class=\"bi bi-x\" viewBox=\"0 0 16 16\">\n" +
" <path\n" +
" d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\n" +
" </svg>\n" +
" </a>\n" +
" </div>\n" +
" </div>\n" +
" </div>\n" +
" </div><br><br>";
}
else {
if (rs.getBoolean("primljen")) {
prihvacen = "<p class=\"fw-bold\" style=\"color:green;\">Prihvacen</p>";
} else {
prihvacen = "<p class=\"fw-bold\" style=\"color:red;\">Nije prihvacen</p>";
}
infoInbox+="<div class=\"card\">\n" +
" <h5 class=\"card-header\"><a href=\"proposal?idOglasa="+oglas.getOglasID()+"\">"+oglas.getNazivOglasa()+"</a></h5>\n" +
" <div class=\"card-body\">\n" +
" <div class=\"row align-items-center\">\n" +
" <div class=\"col\">\n" +
" <h5 class=\"card-title\"><a href=\"user?id="+rs.getInt("korisnikID")+"\">"+user.getIme()+" "+user.getPrezime()+"</a></h5>\n" +
" <p class=\"card-text\">"+rs.getString("porukaPoslodavca")+"</p>\n" +
" </div>\n" +
" <div class=\"col-2\">\n" +
prihvacen+
" <a href=\"dismissPoslodavac?id="+rs.getInt("aplikacijaID")+"\" class=\"btn btn-danger\">\n" +
" <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"30\" fill=\"white\"\n" +
" class=\"bi bi-x\" viewBox=\"0 0 16 16\">\n" +
" <path\n" +
" d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\n" +
" </svg>\n" +
" Obrisi &nbsp; &nbsp;\n" +
" </a>\n" +
" </div>" +
" </div>\n" +
" </div>\n" +
" </div><br><br>";
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return infoInbox;
}
public void dismissUser(int id)
{
String sql = "UPDATE aplikacija SET sakrijUser=1 WHERE oglasID=" + id;
try {
ResultSet rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void dismissPoslodavac(int id)
{
String sql = "UPDATE aplikacija SET sakrijVlasnik=1 WHERE aplikacijaID=" + id;
try {
ResultSet rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void accept(int id)
{
String sql = "UPDATE aplikacija SET primljen=1 WHERE aplikacijaID=" + id;
try {
ResultSet rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void decline(int id)
{
String sql = "UPDATE aplikacija SET primljen=0 WHERE aplikacijaID=" + id;
try {
ResultSet rs = stmt.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.sql.ResultSet;
import java.sql.SQLException;
@Controller
public class HomeController {
DataBase DB = new DataBase();
String inbox = "<a class=\"nav-link\" href=\"inbox\">Inbox</a>";
String userLogged = "<a class=\"nav-link\" href=\"user\">Moj profil</a>";
String userSign = "<a class=\"nav-link\" href=\"login\">Uloguj se</a>";
String dodajOglas = "<a class=\"nav-link\" href=\"dodajOglas\">Dodaj oglas</a>";
@GetMapping("/")
public String pocetna(@RequestParam(value = "search", defaultValue = "") String search,
@RequestParam(value = "kategorija",defaultValue = "-1") int[] kategorija,
@RequestParam(value = "lokacija",defaultValue = "-1") int[] lokacija,
@RequestParam(value = "skills",defaultValue = "-1") int[] skills,
@CookieValue(value = "id", defaultValue = "AIXP") String cookieId,
@CookieValue(value = "role", defaultValue = "AIXP") String cookieRole,
Model model,
HttpServletResponse response) {
int id=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
model.addAttribute("search",search);
String lista = popuniOglase(search,skills,lokacija,kategorija);
if (role == 0) {
model.addAttribute("user", userSign);
}
if (role > 0 && role<4) {
model.addAttribute("inbox", inbox);
model.addAttribute("user", userLogged);
}
if (role == 2 || role == 3) {
model.addAttribute("dodajOglas", dodajOglas);
}
String lokacije="";
if(lokacija[0]==-1) {
for (String drzava : DB.vratiListuDrzava()) {
lokacije += "<optgroup label=\"" + drzava + "\">";
lokacije += DB.vratiListuGradova(drzava);
lokacije += "</optgroup>";
}
}
else {
for (String drzava : DB.vratiListuDrzava()) {
lokacije += "<optgroup label=\"" + drzava + "\">";
lokacije += DB.vratiListuGradovaFilter(drzava,lokacija);
lokacije += "</optgroup>";
}
}
if(kategorija[0]!=-1) {
model.addAttribute("kategorija",DB.vratiListuKategorijaFilter(kategorija));
}
else {
model.addAttribute("kategorija",DB.vratiListuKategorija());
}
if(skills[0]!=-1) {
model.addAttribute("skills",DB.vratiListuSkillsFilter(skills));
}
else {
model.addAttribute("skills",DB.vratiListuSkills());
}
model.addAttribute("lokacija", lokacije);
model.addAttribute("poslovi", lista);
return "index";
}
private String popuniOglase(String search,int[] skills,int[] lokacija,int[] kategorija) {
StringBuilder lista = new StringBuilder();
try {
ResultSet rs = DB.popuniListuOglasa(search,skills,lokacija,kategorija);
while (rs.next()) {
Oglas oglas = new Oglas(rs.getInt("oglasID"));
lista.append("<div class=\"posao\">" + "<a href=\"proposal?idOglasa=").append(oglas.getOglasID()).append("\">").append(oglas.getNazivOglasa()).append("</a>").append("<p>").append(oglas.getOpisOglasa()).append("</p>");
for (String skill : oglas.getSkills()) {
lista.append("<div class=\"tag\">").append(skill).append("</div>");
}
lista.append("<div class=\"lokacija\">" + "<img src=\"img/loc.png\" alt=\"lokacija\"> " + "<span>").append(oglas.getLokacija()).append("</span>").append("</div></div>");
}
} catch (SQLException e) {
e.printStackTrace();
}
return lista.toString();
}
@GetMapping("/error")
public String error(@CookieValue(value = "id", defaultValue = "AIXP") String cookieId,
@CookieValue(value = "role", defaultValue = "AIXP") String cookieRole,
Model model,
HttpServletResponse response)
{
int id=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if (role == 0) {
model.addAttribute("user", userSign);
}
if (role > 0 && role<4) {
model.addAttribute("inbox", inbox);
model.addAttribute("user", userLogged);
}
if (role == 2 || role == 3) {
model.addAttribute("dodajOglas", dodajOglas);
}
return "error";
}
}
package com.example.demo;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class Oglas {
DataBase DB = new DataBase();
private int oglasID;
private int vlasnikID;
private int lokacijaID;
private String lokacija;
private int kategorijaID;
private String kategorija;
private Date datumKreiranja;
private String nazivOglasa;
private String opisOglasa;
private boolean potrebnoIskustvo;
private boolean radOdKuce;
private int brojPregleda;
private int brojLajkova;
private ArrayList<String> skills = new ArrayList<String>();
private ArrayList<String> edukacija = new ArrayList<String>();
Oglas(int oglasID)
{
this.oglasID=oglasID;
String sql="SELECT * FROM oglasi WHERE oglasID="+oglasID;
try {
ResultSet rs = DB.executeCustom(sql);
if(rs.first()) {
vlasnikID = rs.getInt("vlasnikID");
kategorijaID = rs.getInt("kategorijaID");
datumKreiranja = rs.getDate("datumKreiranja");
nazivOglasa = rs.getString("nazivOglasa");
opisOglasa = rs.getString("opisOglasa");
potrebnoIskustvo = rs.getBoolean("iskustvo");
lokacijaID = rs.getInt("lokacijaID");
radOdKuce=rs.getBoolean("radOdKuce");
lokacija = DB.lokacija(lokacijaID);
brojPregleda=DB.brojPregleda(oglasID);
brojLajkova=DB.brojLajkova(oglasID);
skills = DB.vratiSkillsOglas(oglasID);
edukacija = DB.vratiEduOglas(oglasID);
kategorija=DB.kategorija(kategorijaID);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public int getBrojLajkova() {
return brojLajkova;
}
public boolean isRadOdKuce() {
return radOdKuce;
}
public int getBrojPregleda() {
return brojPregleda;
}
public ArrayList<String> getEdukacija() {
return edukacija;
}
public ArrayList<String> getSkills() {
return skills;
}
public int getOglasID() {
return oglasID;
}
public int getVlasnikID() {
return vlasnikID;
}
public int getLokacijaID() {
return lokacijaID;
}
public String getLokacija() {
return lokacija;
}
public int getKategorijaID() {
return kategorijaID;
}
public String getKategorija() {
return kategorija;
}
public Date getDatumKreiranja() {
return datumKreiranja;
}
public String getNazivOglasa() {
return nazivOglasa;
}
public String getOpisOglasa() {
return opisOglasa;
}
public boolean isPotrebnoIskustvo() {
return potrebnoIskustvo;
}
}
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class PraktikumOopApplication {
public static void main(String[] args)
{
SpringApplication.run(PraktikumOopApplication.class, args);
DataBase DB = new DataBase();
//DB.kreirajPocetnuBazu();
}
}
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
import java.sql.Date;
import java.sql.ResultSet;
import java.util.Calendar;
@Controller
public class ProposalController {
DataBase DB = new DataBase();
String inbox = "<a class=\"nav-link\" href=\"inbox\">Inbox</a>";
String userLogged = "<a class=\"nav-link\" href=\"user\">Moj profil</a>";
String userSign = "<a class=\"nav-link\" href=\"login\">Uloguj se</a>";
String dodajOglas = "<a class=\"nav-link\" href=\"dodajOglas\">Dodaj oglas</a>";
@GetMapping("/proposal")
public String proposalSwitch(@CookieValue(value = "id", defaultValue = "-1") String cookieId, @CookieValue(value="role",defaultValue = "0") String cookieRole, @RequestParam(name="idOglasa") int idOglasa, HttpServletResponse response, Model model)
{
int id=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if (role == 0) {
model.addAttribute("user", userSign);
}
if (role > 0 && role<4) {
model.addAttribute("inbox", inbox);
model.addAttribute("user", userLogged);
}
if (role == 2 || role == 3) {
model.addAttribute("dodajOglas", dodajOglas);
}
if(id>0) {
ResultSet pregledRS = DB.executeCustom("SELECT * FROM pregled_oglasa WHERE korisnikID=" + id + " AND oglasID=" + idOglasa);
if (pregledRS == null) {
DB.executeCustom("INSERT INTO pregled_oglasa VALUES(" + id + "," + idOglasa + ",0)");
}
}
Oglas oglas = new Oglas(idOglasa);
User user = new User(oglas.getVlasnikID());
String vlasnik="<a style=\"color: gray\" href=\"/user?id="+oglas.getVlasnikID()+"\">"+user.getIme()+" "+user.getPrezime()+"</a>";
String vestine="";
String edukacija="";
for(String skill: oglas.getSkills())
{
vestine+="<div class=\"tag\">"+skill+"</div>";
}
for(String diploma: oglas.getEdukacija())
{
edukacija+="<div>"+diploma+"</div>";
}
String potrebnoIskustvo="";
String radOdKuce="";
if(oglas.isPotrebnoIskustvo()){
potrebnoIskustvo="Potrebno je iskustvo";
}
else {
potrebnoIskustvo="Nije potrebno iskustvo";
}
if(oglas.isRadOdKuce()){
radOdKuce="Moguc je rad od kuce";
}
else {
radOdKuce="Nije moguc rad od kuce";
}
//TODO: dopuni html i th sa novim zahtevima
model.addAttribute("brojPregleda",oglas.getBrojPregleda());
model.addAttribute("potrebnoIskustvo",potrebnoIskustvo);
model.addAttribute("radOdKuce",radOdKuce);
model.addAttribute("obrazovanje",edukacija);
model.addAttribute("skills",vestine);
model.addAttribute("nazivOglasa",oglas.getNazivOglasa());
model.addAttribute("nazivVlasnika",vlasnik);
model.addAttribute("datumKreiranja",oglas.getDatumKreiranja());
model.addAttribute("opisOglasa",oglas.getOpisOglasa());
model.addAttribute("lokacija",oglas.getLokacija());
model.addAttribute("kategorijaID",oglas.getKategorija());
model.addAttribute("id",idOglasa);
String dugmeLajkY="<a href=\"skiniLajk?idOglasa="+idOglasa+"&userID="+id+"\" class=\"btn btn-dark\">\n" +
" Lajk " + oglas.getBrojLajkova()+
" </a>";
String dugmeLajkN="<a href=\"dodajLajk?idOglasa="+idOglasa+"&userID="+id+"\" class=\"btn btn-secondary\">\n" +
" Lajk " + oglas.getBrojLajkova()+
" </a>";
if(role>0) {
if (DB.lajkovao(idOglasa, id)) {
model.addAttribute("lajk", dugmeLajkY);
} else {
model.addAttribute("lajk", dugmeLajkN);
}
}
else
{
model.addAttribute("lajk","Broj lajkova: "+oglas.getBrojLajkova());
}
String prijaviAplikaciju = "<div id=\"prijava\" class=\"container justify-content-center\" >" +
"<div class=\"row\">" +
"<h3 class=\"h3\">Posalji prijavu</h3>" +
"<hr>" +
"<div id=\"poruka\">" +
"<label for=\"exampleFormControlTextarea1\" class=\"form-label\">Poruka poslodavcu</label>\n" +
"<form method=\"POST\" action=\"posalji?idOglasa="+idOglasa+"\"> <textarea class=\"form-control\" id=\"exampleFormControlTextarea1\" name=\"message\" rows=\"5\"></textarea>" +
"<br><input type=\"submit\" class=\"btn btn-dark\" value=\"Posalji\"/>" +
"</form>" +
"</div></div></div>";
String dugme="<form method=\"POST\" action=\"obrisi?idOglasa="+idOglasa+"\"><input type=\"submit\" value=\"Izbrisi oglas\" class=\"btn btn-dark\"/></form>";
String dugmeChange="<a href=\"izmeniOglas?idOglasa="+idOglasa+"\" class=\"btn btn-dark\">\n" +
" Izmeni oglas\n" +
" </a>";
if(role==3 || oglas.getVlasnikID()==id)
{
model.addAttribute("dugmeChange",dugmeChange);
model.addAttribute("dugme",dugme);
}
boolean prijavio = DB.prijavioAplikaciju(id, idOglasa);
if((role==1 || role==3) && !prijavio)
{
model.addAttribute("prijava", prijaviAplikaciju);
}
return "proposal";
}
@GetMapping("dodajLajk")
public String dodajLajkk(@RequestParam("idOglasa") int idOglasa,@RequestParam("userID") int userID)
{
DB.dodajLajk(idOglasa,userID);
return "redirect:proposal?idOglasa="+idOglasa;
}
@GetMapping("skiniLajk")
public String skiniLajkk(@RequestParam("idOglasa") int idOglasa,@RequestParam("userID") int userID)
{
DB.skiniLajk(idOglasa,userID);
return "redirect:proposal?idOglasa="+idOglasa;
}
@PostMapping("obrisi")
public String izbrisiOglas(@RequestParam("idOglasa") int idOglasa)
{
DB.izbrisiOglas(idOglasa);
return "redirect:/";
}
@PostMapping("posalji")
public String posaljiAplikaciju(@RequestParam("idOglasa") int idOglasa,@RequestParam("message") String message, @CookieValue(value = "id") String cookieId)
{
int id=Integer.parseInt(Security.decryptCookie(cookieId));
DB.posaljiAplikaciju(id,idOglasa,message);
return "redirect:proposal?idOglasa="+idOglasa;
}
@GetMapping("/dodajOglas")
public String dodajOglasPrikaz(@CookieValue(value = "id", defaultValue = "AIXP") String cookieId,
@CookieValue(value = "role", defaultValue = "AIXP") String cookieRole,
HttpServletResponse response,
Model model)
{
int id=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if (role == 0 || role==1) {
return "redirect:error";
}
String diplome="";
for (String tipSkole:DB.vratiTipoveSkola()) {
diplome+="<optgroup label=\" "+tipSkole+"\">";
for (String nazivSkole:DB.vratiListuSkola(tipSkole)) {
diplome+="<optgroup label=\"&nbsp;&nbsp;&nbsp;&nbsp;"+nazivSkole+"\">";
diplome+=DB.vratiListuZvanja(nazivSkole);
diplome+="</optgroup>";
}
diplome+="</optgroup>";
}
String lokacije="";
for (String drzava:DB.vratiListuDrzava()) {
lokacije+="<optgroup label=\""+drzava+"\">";
lokacije+=DB.vratiListuGradova(drzava);
lokacije+="</optgroup>";
}
model.addAttribute("edukacija",diplome);
model.addAttribute("kategorija",DB.vratiListuKategorija());
model.addAttribute("skills",DB.vratiListuSkills());
model.addAttribute("lokacija",lokacije);
model.addAttribute("dugme","Napravi");
model.addAttribute("akcija","dodajOglas");
return "uploadJob";
}
@PostMapping("/dodajOglas")
public String dodajOglas(@CookieValue(value = "id", defaultValue = "AIXP") String cookieId,
@CookieValue(value = "role", defaultValue = "AIXP") String cookieRole,
@RequestParam("kategorija") int kategorija,
@RequestParam("skills") int[] skills,
@RequestParam("edukacija") int[] edukacija,
@RequestParam("lokacija") int lokacija,
@RequestParam("nazivOglasa") String naziv,
@RequestParam("opisOglasa") String opis,
@RequestParam("iskustvo") boolean iskustvo,
@RequestParam("radOdKuce") boolean radOdKuce)
{
System.out.println(naziv);
int id = Integer.parseInt(Security.decryptCookie(cookieId));
Calendar datum=Calendar.getInstance();
String datumKreiranja=datum.get(Calendar.YEAR)+"-"+datum.get(Calendar.MONTH)+1+"-"+datum.get(Calendar.DATE);
int idOglasa=DB.dodajOglas(id,lokacija,kategorija,datumKreiranja,naziv,opis,radOdKuce,iskustvo);
DB.dodajSkillOglas(idOglasa,skills);
DB.dodajEdukacijuOglas(idOglasa,edukacija);
return "redirect:/proposal?idOglasa="+idOglasa;
}
@GetMapping("/izmeniOglas")
public String izmeniOglas(@CookieValue(value = "id", defaultValue = "AIXP") String cookieId,
@CookieValue(value = "role", defaultValue = "AIXP") String cookieRole,
@RequestParam("idOglasa") int idOglasa,
HttpServletResponse response,
Model model)
{
int id=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if (role == 0 || role==1) {
return "redirect:error";
}
Oglas oglas=new Oglas(idOglasa);
if(oglas.getVlasnikID()!=id && role!=3)
{
return "redirect:error";
}
String lokacije="";
for (String drzava:DB.vratiListuDrzava()) {
lokacije+="<optgroup label=\""+drzava+"\">";
lokacije+=DB.vratiListuGradovaOglas(drzava, oglas.getLokacija());
lokacije+="</optgroup>";
}
System.out.println(oglas.getNazivOglasa());
String diplome="";
for (String tipSkole:DB.vratiTipoveSkola()) {
diplome+="<optgroup label=\" "+tipSkole+"\">";
for (String nazivSkole:DB.vratiListuSkola(tipSkole)) {
diplome+="<optgroup label=\"&nbsp;&nbsp;&nbsp;&nbsp;"+nazivSkole+"\">";
diplome+=DB.vratiListuZvanjaOglas(nazivSkole,idOglasa);
diplome+="</optgroup>";
}
diplome+="</optgroup>";
}
if(oglas.isPotrebnoIskustvo())
{
model.addAttribute("iskustvoDa","");
}
else {
model.addAttribute("iskustvoNe","");
}
if(oglas.isRadOdKuce())
{
model.addAttribute("radOdKuceDa","");
}
else {
model.addAttribute("radOdKuceNe","");
}
model.addAttribute("kategorija",DB.vratiListuKategorijaOglas(oglas.getKategorijaID()));
model.addAttribute("edukacija",diplome);
model.addAttribute("naziv","Izmeni oglas");
model.addAttribute("skills",DB.vratiListuSkillsOglas(idOglasa));
model.addAttribute("lokacija",lokacije);
model.addAttribute("nazivOglasa",oglas.getNazivOglasa());
model.addAttribute("opisOglasa",oglas.getOpisOglasa());
model.addAttribute("dugme","Izmeni");
String odustani="<a href=\"proposal?idOglasa="+idOglasa+"\" class=\"btn btn-dark\">\n" +
" Odustani\n" +
" </a>";
model.addAttribute("odustani",odustani);
model.addAttribute("akcija","izmeniOglas?idOglasa="+idOglasa);
return "uploadJob";
}
@PostMapping("/izmeniOglas")
public String izmeniOglasPost(@RequestParam("idOglasa") int idOglasa,
@RequestParam("kategorija") int kategorija,
@RequestParam(value = "skills",defaultValue = "-1") int[] skills,
@RequestParam(value = "edukacija",defaultValue = "") int[] edukacija,
@RequestParam("lokacija") int lokacija,
@RequestParam("nazivOglasa") String naziv,
@RequestParam("opisOglasa") String opis,
@RequestParam("iskustvo") boolean iskustvo,
@RequestParam("radOdKuce") boolean radOdKuce)
{
DB.updateOglas(idOglasa,lokacija,kategorija,naziv,opis,radOdKuce,iskustvo,skills,edukacija);
return "redirect:proposal?idOglasa="+idOglasa;
}
}
package com.example.demo;
import org.mindrot.jbcrypt.BCrypt;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.Base64;
public class Security {
public static String encryptCookie(String plain) {
String b64encoded = Base64.getEncoder().encodeToString(plain.getBytes());
String reverse = new StringBuffer(b64encoded).reverse().toString();
StringBuilder tmp = new StringBuilder();
final int OFFSET = 4;
for (int i = 0; i < reverse.length(); i++) {
tmp.append((char)(reverse.charAt(i) + OFFSET));
}
return tmp.toString();
}
public static String decryptCookie(String secret) {
StringBuilder tmp = new StringBuilder();
final int OFFSET = 4;
for (int i = 0; i < secret.length(); i++) {
tmp.append((char)(secret.charAt(i) - OFFSET));
}
String reversed = new StringBuffer(tmp.toString()).reverse().toString();
return new String(Base64.getDecoder().decode(reversed));
}
public static String generatePassword(String password) {
return BCrypt.hashpw(password, BCrypt.gensalt(12));
}
public static boolean matchPassword(String password, String hashedPassword) {
return BCrypt.checkpw(password, hashedPassword);
}
public static boolean proveriCookies(int role, int id, HttpServletResponse response) {
if (role == -1 || id == -1) {
// create a cookie
Cookie cookieid = new Cookie("id", encryptCookie("0"));
Cookie cookierole = new Cookie("role", encryptCookie("0"));
cookieid.setPath("/");
cookierole.setPath("/");
// add cookie to response
response.addCookie(cookieid);
response.addCookie(cookierole);
return true;
}
return false;
}
}
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
@Controller
public class TablaController {
DataBase DB=new DataBase();
String inbox = "<a class=\"nav-link\" href=\"inbox\">Inbox</a>";
String userLogged = "<a class=\"nav-link\" href=\"user\">Moj profil</a>";
String dodajOglas = "<a class=\"nav-link\" href=\"dodajOglas\">Dodaj oglas</a>";
@GetMapping("/inbox")
public String oglasnaTabla(@CookieValue("id") String cookieId, @CookieValue("role") String cookieRole, HttpServletResponse response, Model model)
{
int id=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if (role == 0) {
return "redirect:error";
}
if (role > 0 && role<4) {
model.addAttribute("inbox", inbox);
model.addAttribute("user", userLogged);
}
if (role == 2 || role == 3) {
model.addAttribute("dodajOglas", dodajOglas);
}
if(role==1) {
model.addAttribute("popuni",DB.popuniInfoInboxKorisnik(id));
}
if(role==2) {
model.addAttribute("popuni",DB.popuniInfoInboxPoslodavac(id));
}
if(role==3)
{
model.addAttribute("popuni",DB.popuniInfoInboxKorisnik(id)+DB.popuniInfoInboxPoslodavac(id));
}
return "oglasnaTabla";
}
@GetMapping("/dismissUser")
public String dismissKorisnik(@RequestParam("id") int id)
{
DB.dismissUser(id);
return "redirect:inbox";
}
@GetMapping("/dismissPoslodavac")
public String dismissPoslodavac(@RequestParam("id") int id)
{
DB.dismissPoslodavac(id);
return "redirect:inbox";
}
@GetMapping("/accept")
public String accept(@RequestParam("id") int id)
{
DB.accept(id);
return "redirect:inbox";
}
@GetMapping("/decline")
public String decline(@RequestParam("id") int id)
{
DB.decline(id);
return "redirect:inbox";
}
}
package com.example.demo;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class User {
DataBase DB = new DataBase();
private int korisnikID;
private String ime;
private String prezime;
private String datumRodjenja;
private String email;
private boolean pol;
private String mobilni;
private String slikaUrl;
private String bio;
private int lokacijaID;
private String lokacija;
private int tipKorisnika;
private ArrayList<String> skills = new ArrayList<String>();
private ArrayList<String> edukacija = new ArrayList<String>();
public User(int korisnikID) {
this.korisnikID=korisnikID;
try {
ResultSet rs = DB.executeCustom("SELECT * FROM korisnik WHERE korisnikID=" + korisnikID);
if(rs.first())
{
ime=rs.getString("ime");
prezime=rs.getString("prezime");
datumRodjenja=rs.getString("datumRodjenja");
email=rs.getString("email");
pol=rs.getBoolean("pol");
lokacijaID=rs.getInt("lokacijaID");
tipKorisnika=rs.getInt("tipKorisnika");
mobilni=rs.getString("mobilni");
slikaUrl=rs.getString("profilnaSlikaURL");
bio=rs.getString("bio");
lokacija=DB.lokacija(lokacijaID);
skills = DB.vratiSkillsKorisnik(korisnikID);
edukacija = DB.vratiEduKorisnik(korisnikID);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public ArrayList<String> getSkills() {
return skills;
}
public int getKorisnikID() {
return korisnikID;
}
public String getIme() {
return ime;
}
public String getPrezime() {
return prezime;
}
public String getDatumRodjenja() {
return datumRodjenja;
}
public String getEmail() {
return email;
}
public boolean isPol() {
return pol;
}
public String getMobilni() {
return mobilni;
}
public String getSlikaUrl() {
return slikaUrl;
}
public String getBio() {
return bio;
}
public int getLokacijaID() {
return lokacijaID;
}
public ArrayList<String> getEdukacija() {
return edukacija;
}
public String getLokacija() {
return lokacija;
}
public int getTipKorisnika() {
return tipKorisnika;
}
}
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
@Controller
public class UserController {
DataBase DB = new DataBase();
String inbox = "<a class=\"nav-link\" href=\"inbox\">Inbox</a>";
String userLogged = "<a class=\"nav-link\" href=\"user\">Moj profil</a>";
String userSign = "<a class=\"nav-link\" href=\"login\">Uloguj se</a>";
String dodajOglas = "<a class=\"nav-link\" href=\"dodajOglas\">Dodaj oglas</a>";
@GetMapping("/user")
public String user(@CookieValue(value = "id", defaultValue = "2") String cookieId, @CookieValue(value="role",defaultValue = "0") String cookieRole,@RequestParam (value = "id",defaultValue = "0") int id, Model model, HttpServletResponse response) {
int idKolaca=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if (role == 0) {
model.addAttribute("user", userSign);
}
if (role > 0 && role<4) {
model.addAttribute("inbox", inbox);
model.addAttribute("user", userLogged);
}
if (role == 2 || role == 3) {
model.addAttribute("dodajOglas", dodajOglas);
}
User korisnik;
if(id>0 && id!=idKolaca) {
korisnik = new User(id);
if(role==3) {
String dugme = "<form method=\"POST\" action=\"izbrisi?idKorisnika="+id+"\"><input type=\"submit\" value=\"Izbrisi profil\" class=\"btn btn-dark\"/></form>";
model.addAttribute("dugme", dugme);
}
}
else {
korisnik = new User(idKolaca);
String dugme="<form method=\"GET\" action=\"signout\"><button type=\"submit\" class=\"btn btn-dark\"/>Odjavi se</button></form>";
model.addAttribute("dugme", dugme);
String dugmeChange="<a href=\"changeInfo\" class=\"btn btn-dark\">\n" +
" Izmeni informacije\n" +
" </a>";
model.addAttribute("dugmeChange",dugmeChange);
}
//TODO: dopuniti html sa novim informacijama
String vestine="";
String edukacija="";
for(String skill: korisnik.getSkills())
{
vestine+="<div class=\"tag\">"+skill+"</div>";
}
for(String diploma: korisnik.getEdukacija())
{
edukacija+="<div class=\"edu\">"+diploma+"</div>";
}
model.addAttribute("edukacija",edukacija);
model.addAttribute("skills",vestine);
model.addAttribute("ime",korisnik.getIme()+" "+korisnik.getPrezime());
model.addAttribute("opis",korisnik.getBio());
model.addAttribute("lokacija",korisnik.getLokacija());
model.addAttribute("email",korisnik.getEmail());
model.addAttribute("broj",korisnik.getMobilni());
model.addAttribute("avatar",korisnik.getSlikaUrl());
return "user";
}
@GetMapping("/signout")
public String signout(HttpServletResponse response)
{
// create a cookie
Cookie cookieId = new Cookie("id", null);
Cookie cookieRole = new Cookie("role",null);
cookieId.setMaxAge(0);
cookieRole.setMaxAge(0);
cookieId.setPath("/");
cookieRole.setPath("/");
//add cookie to response
response.addCookie(cookieId);
response.addCookie(cookieRole);
return "redirect:/";
}
@PostMapping("/izbrisi")
public String deleteUser(@RequestParam("idKorisnika") int idKorisnika)
{
DB.izbrisiKorisnika(idKorisnika);
return "redirect:/";
}
@GetMapping("/login")
public String test(@CookieValue(value = "id", defaultValue = "AIXP") String cookieId,
@CookieValue(value = "role", defaultValue = "AIXP") String cookieRole,
@RequestParam(value = "username", defaultValue = "") String username,
Model model,
HttpServletResponse response) {
//TODO: dodati obavestenje za promasen i ispravan user
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
int id=Integer.parseInt(Security.decryptCookie(cookieId));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if(role!=0 && id!=0)
{
return "redirect:error";
}
model.addAttribute("username", username);
return "login";
}
@PostMapping("/login")
public String test(@RequestParam("username") String username,
@RequestParam("password") String password,
HttpServletResponse response) {
String usernameExists=DB.vratiUsername(username);
if(usernameExists==null) {
return "redirect:login";
}
String passwordHash=DB.vratiPassword(username);
boolean matched=Security.matchPassword(password,passwordHash);
if (!matched) {
return "redirect:login?username=" + usernameExists;
}
int userID=DB.vratiUserID(username);
String role = DB.roleKorisnika(userID)+"";
Cookie cookieId = new Cookie("id", Security.encryptCookie(userID+""));
cookieId.setPath("/");
Cookie cookieRole = new Cookie("role", Security.encryptCookie(role));
cookieRole.setPath("/");
cookieId.setSecure(true);
cookieRole.setSecure(true);
cookieId.setHttpOnly(true);
cookieRole.setHttpOnly(true);
response.addCookie(cookieId);
response.addCookie(cookieRole);
return "redirect:user";
}
@GetMapping("/register")
public String register(
@CookieValue(value = "id", defaultValue = "AIXP") String cookieId,
@CookieValue(value = "role", defaultValue = "AIXP") String cookieRole,
Model model,
HttpServletResponse response) {
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
int id=Integer.parseInt(Security.decryptCookie(cookieId));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if(role!=0 && id!=0)
{
return "redirect:error";
}
if (role == 0) {
model.addAttribute("user", userSign);
}
if (role > 0 && role<4) {
model.addAttribute("inbox", inbox);
model.addAttribute("user", userLogged);
}
if (role == 2 || role == 3) {
model.addAttribute("dodajOglas", dodajOglas);
}
String lokacije="";
for (String drzava:DB.vratiListuDrzava()) {
lokacije+="<optgroup label=\""+drzava+"\">";
lokacije+=DB.vratiListuGradova(drzava);
lokacije+="</optgroup>";
}
String diplome="";
for (String tipSkole:DB.vratiTipoveSkola()) {
diplome+="<optgroup label=\""+tipSkole+"\">";
for (String nazivSkole:DB.vratiListuSkola(tipSkole)) {
diplome+="<optgroup label=\"&nbsp;&nbsp;&nbsp;&nbsp;"+nazivSkole+"\">";
diplome+=DB.vratiListuZvanja(nazivSkole);
diplome+="</optgroup>";
}
diplome+="</optgroup>";
}
String izaberiTip="<div class=\"form-group col-md-4\">" +
"<label for=\"korisnikUloga\">*Tip Profila</label>" +
"<select class=\"form-control\" id=\"korisnikUloga\" name=\"korisnikUloga\">" +
"<option value=\"2\">Poslodavac</option>" +
"<option value=\"1\">Korisnik</option>\n" +
"</select>" +
"</div>";
model.addAttribute("naziv","Registruj se");
model.addAttribute("musko","");
model.addAttribute("edukacija",diplome);
model.addAttribute("skills",DB.vratiListuSkills());
model.addAttribute("lokacija",lokacije);
model.addAttribute("tipKorisnika", izaberiTip);
model.addAttribute("dugme","Registruj Se");
model.addAttribute("akcija","/register");
return "register";
}
@PostMapping("/register")
String registruj(@RequestParam(value = "korisnikIme") String korisnikIme,
@RequestParam(value = "korisnikPrezime") String korisnikPrezime,
@RequestParam(value = "korisnikRodjen") String korisnikRodjen,
@RequestParam(value = "pol") int pol,
@RequestParam(value = "username") String username,
@RequestParam(value = "password") String password,
@RequestParam(value = "email") String email,
@RequestParam(value = "korisnikMob") String korisnikMob,
@RequestParam("skills") int[] skills,
@RequestParam("edukacija") int[] edukacija,
@RequestParam("lokacija") int lokacija,
@RequestParam(value = "korisnikBio") String korisnikBio,
@RequestParam(value = "korisnikUloga") int korisnikUloga,
@RequestParam(value = "korisnikSlika") String korisnikSlika,
HttpServletResponse response) {
password=Security.generatePassword(password);
int korisnikID = DB.registrujKorisnika(
korisnikIme,
korisnikPrezime,
korisnikRodjen,
pol,
username,
password,
email,
korisnikMob,
lokacija,
korisnikBio,
korisnikUloga,
korisnikSlika);
String usernameExists=DB.vratiUsername(username);
if(usernameExists==null) {
return "redirect:register";
}
DB.dodajSkillKorisnik(korisnikID,skills);
DB.dodajEdukacijuKorisnik(korisnikID,edukacija);
Cookie cookieId = new Cookie("id", Security.encryptCookie(korisnikID + ""));
Cookie cookieRole = new Cookie("role", Security.encryptCookie(korisnikUloga + ""));
cookieId.setPath("/");
cookieRole.setPath("/");
cookieId.setSecure(true);
cookieRole.setSecure(true);
cookieId.setHttpOnly(true);
cookieRole.setHttpOnly(true);
response.addCookie(cookieId);
response.addCookie(cookieRole);
return "redirect:/";
}
@GetMapping("/changeInfo")
String izmeniInfo(@CookieValue("id") String cookieId,
@CookieValue("role") String cookieRole,
HttpServletResponse response,
Model model) {
int id=Integer.parseInt(Security.decryptCookie(cookieId));
int role=Integer.parseInt(Security.decryptCookie(cookieRole));
boolean provera=Security.proveriCookies(role,id,response);
if(provera)
{
id=0;
role=0;
}
if (role == 0) {
return "redirect:error";
}
if (role > 0 && role<4) {
model.addAttribute("inbox", inbox);
model.addAttribute("user", userLogged);
}
if (role == 2 || role == 3) {
model.addAttribute("dodajOglas", dodajOglas);
}
User korisnik=new User(id);
String lokacije="";
for (String drzava:DB.vratiListuDrzava()) {
lokacije+="<optgroup label=\""+drzava+"\">";
lokacije+=DB.vratiListuGradovaKorisnik(drzava, korisnik.getLokacija());
lokacije+="</optgroup>";
}
String diplome="";
for (String tipSkole:DB.vratiTipoveSkola()) {
diplome+="<optgroup label=\" "+tipSkole+"\">";
for (String nazivSkole:DB.vratiListuSkola(tipSkole)) {
diplome+="<optgroup label=\"&nbsp;&nbsp;&nbsp;&nbsp;"+nazivSkole+"\">";
diplome+=DB.vratiListuZvanjaKorisnik(nazivSkole,id);
diplome+="</optgroup>";
}
diplome+="</optgroup>";
}
if(korisnik.isPol())
{
model.addAttribute("musko","");
}
else
{
model.addAttribute("zensko","");
}
model.addAttribute("edukacija",diplome);
model.addAttribute("naziv","Izmeni informacije");
model.addAttribute("skills",DB.vratiListuSkillsKorisnik(id));
model.addAttribute("lokacija",lokacije);
model.addAttribute("korisnikIme",korisnik.getIme());
model.addAttribute("korisnikPrezime",korisnik.getPrezime());
model.addAttribute("korisnikRodjen",korisnik.getDatumRodjenja());
model.addAttribute("username",DB.vratiUsernameID(id));
model.addAttribute("akcija","/changeInfo");
model.addAttribute("email",korisnik.getEmail());
model.addAttribute("korisnikMob",korisnik.getMobilni());
model.addAttribute("korisnikBio",korisnik.getBio());
model.addAttribute("uloga",korisnik.getTipKorisnika());
model.addAttribute("dugme","Izmeni Informacije");
String odustani="<a href=\"user\" class=\"btn btn-dark\">\n" +
" Odustani\n" +
" </a>";
model.addAttribute("odustani", odustani);
return "register";
}
@PostMapping("/changeInfo")
public String promeniInfo(@CookieValue("id") String cookieId,
@RequestParam(value = "korisnikIme") String korisnikIme,
@RequestParam(value = "korisnikPrezime") String korisnikPrezime,
@RequestParam(value = "korisnikRodjen") String korisnikRodjen,
@RequestParam(value = "pol") int pol,
@RequestParam(value = "username") String username,
@RequestParam(value = "password") String password,
@RequestParam(value = "email") String email,
@RequestParam(value = "korisnikMob") String korisnikMob,
@RequestParam(value = "skills",defaultValue = "-1") int[] skills,
@RequestParam(value = "edukacija",defaultValue = "-1") int[] edukacija,
@RequestParam("lokacija") int lokacija,
@RequestParam(value = "korisnikBio") String korisnikBio,
@RequestParam(value = "korisnikSlika") String korisnikSlika)
{
int id=Integer.parseInt(Security.decryptCookie(cookieId));
DB.updateKorisnika(id,korisnikIme,korisnikPrezime,korisnikRodjen,pol,username,password,email,korisnikMob,lokacija,korisnikBio,korisnikSlika,skills,edukacija);
return "redirect:user";
}
}
.input-hidden {
position: absolute;
left: -9999px;
}
input[type=radio]:checked + label>img {
border: 1px solid #fff;
box-shadow: 0 0 3px 3px #090;
}
/* Stuff after this is only to make things more pretty */
input[type=radio] + label>img {
border: 1px dashed #444;
width: 80px;
height: 80px;
transition: 500ms all;
}
input[type=radio]:checked + label>img {
transform:
rotateZ(-10deg)
rotateX(10deg);
}
/*
| //lea.verou.me/css3patterns
| Because white bgs are boring.
*/
html {
background-color: #fff;
background-size: 100% 1.2em;
background-image:
linear-gradient(
90deg,
transparent 79px,
#abced4 79px,
#abced4 81px,
transparent 81px
),
linear-gradient(
#eee .1em,
transparent .1em
);
}
\ No newline at end of file
.icon-select{
width:0px;
}
.icon-select .selected-box {
position: relative;
margin: 0px;
padding: 0px;
width: 70px;
height: 60px;
border: 1px solid #999999;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.icon-select .selected-box:hover {
position: relative;
margin: 0px;
padding: 0px;
width: 70px;
height: 60px;
border: 1px solid #000000;
background-color: #FFFFFF;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.icon-select .selected-icon {
position: absolute;
margin: 0px;
padding: 0px;
top:5px;
left:5px;
width: 48px;
height: 48px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.icon-select .component-icon{
position: absolute;
bottom:5px;
right:4px;
}
.icon-select .box {
position: absolute;
top:0px;
left:71px;
margin: 0px;
padding: 0px;
width: 170px;
height: 170px;
border: 1px solid #EEEEEE;
background-color: #EEEEEE;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
overflow:auto;
}
.icon-select .icon {
position: relative;
margin: 5px 0px 0px 5px;
padding: 0px;
width: 48px;
height: 48px;
border: 1px solid #CCCCCC;
background-color: #FFFFFF;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
overflow:hidden;
float: left;
}
.icon-select .icon:hover {
border: 1px solid #000000;
}
.icon-select .icon.selected {
position: relative;
margin: 5px 0px 0px 5px;
padding: 0px;
width: 48px;
height: 48px;
border: 1px solid #EEEEEE;
background-color: #EEEEEE;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
overflow:hidden;
float: left;
}
\ No newline at end of file
body{
background-color: lightgrey;
}
#poslovi{
margin: 10px 0px;
background-color: whitesmoke;
border-radius: 15px;
border: graytext 1px solid;
}
.posao{
border-top: graytext 1px solid;
padding: 5px;
}
.posao a{
font-size: 20px;
color: darkslategrey;
text-decoration: none;
font-weight: bold;
}
.posao a:hover{
color: darkgray;
}
.posao p{
color: gray;
}
.tag{
float: left;
padding: 2px;
background-color: lightgrey;
border-radius: 5px;
margin: 3px;
padding: 3px;
}
.rejting,.lokacija{
clear: both;
padding: 5px;
}
.lokacija img{
width: 20px;
}
#search{
padding: 10px;
}
#main{
margin-top: 10px;
}
.accordion, .accordion-body, .accordion-button, .accordion-collapse, .accordion-header, .accordion-item{
background-color: lightgray;
border: none;
}
.accordion-button{
border-top: gray 1px solid;
}
.accordion-collapse:active{
background-color: lightgray;
}
\ No newline at end of file
.ms-parent {
display: inline-block;
position: relative;
vertical-align: middle;
}
.ms-choice {
display: block;
width: 100%;
height: 26px;
padding: 0;
overflow: hidden;
cursor: pointer;
border: 0px solid #aaa;
text-align: left;
white-space: nowrap;
line-height: 26px;
color: #444;
text-decoration: none;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
background-color: #fff;
}
.ms-choice.disabled {
background-color: #f4f4f4;
background-image: none;
border: 1px solid #ddd;
cursor: default;
}
.ms-choice > span {
position: absolute;
top: 0;
left: 0;
right: 20px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: block;
padding-left: 8px;
}
.ms-choice > span.placeholder {
color: #999;
}
.ms-choice > div {
position: absolute;
top: 0;
right: 0;
width: 20px;
height: 25px;
background: url('img/multiple-select.png') left top no-repeat;
}
.ms-choice > div.open {
background: url('img/multiple-select.png') right top no-repeat;
}
.ms-drop {
width: 100%;
overflow: hidden;
display: none;
margin-top: -1px;
padding: 0;
position: absolute;
z-index: 1000;
background: #fff;
color: #000;
border: 1px solid #aaa;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.ms-drop.bottom {
top: 100%;
-webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
-moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
}
.ms-drop.top {
bottom: 100%;
-webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
-moz-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
}
.ms-search {
display: inline-block;
margin: 0;
min-height: 26px;
padding: 4px;
position: relative;
white-space: nowrap;
width: 100%;
z-index: 10000;
}
.ms-search input {
width: 100%;
height: auto !important;
min-height: 24px;
padding: 0 20px 0 5px;
margin: 0;
outline: 0;
font-family: sans-serif;
font-size: 1em;
border: 1px solid #aaa;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
background: #fff url('img/multiple-select.png') no-repeat 100% -22px;
background: url('img/multiple-select.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
background: url('img/multiple-select.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
background: url('img/multiple-select.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
background: url('img/multiple-select.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
background: url('img/multiple-select.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%);
background: url('img/multiple-select.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%);
}
.ms-search, .ms-search input {
-webkit-box-sizing: border-box;
-khtml-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
.ms-drop ul {
overflow: auto;
margin: 0;
padding: 5px 8px;
}
.ms-drop ul > li {
list-style: none;
display: list-item;
background-image: none;
position: static;
}
.ms-drop ul > li .disabled {
opacity: .35;
filter: Alpha(Opacity=35);
}
.ms-drop ul > li.multiple {
display: block;
float: left;
}
.ms-drop ul > li.group {
clear: both;
}
.ms-drop ul > li.multiple label {
width: 100%;
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ms-drop ul > li label {
font-weight: normal;
display: block;
white-space: nowrap;
}
.ms-drop ul > li label.optgroup {
font-weight: bold;
}
.ms-drop input[type="checkbox"] {
vertical-align: middle;
}
.ms-drop .ms-no-results {
display: none;
}
body{
background-color: lightgrey;
}
.tag{
float: left;
padding: 2px;
background-color: lightgrey;
border-radius: 5px;
margin: 3px;
padding: 3px;
}
.rejting,.lokacija{
clear: both;
padding: 5px;
}
#proposalBorderLine{
border-left: gray 1px solid;
margin-bottom: 10px;
}
#userBorderLine{
border-right: gray 1px solid;
margin-bottom: 10px;
}
h3 {
padding: 10px;
}
#main{
margin-top: 10px;
background-color: whitesmoke;
border-radius: 15px;
border: graytext 1px solid;
}
#tagovi{
padding-bottom: 10px;
}
#postavljeno, #postavio{
clear: both;
font-size: 15px;
color: graytext;
}
#info{
margin-top: 15px;
}
#prijava{
margin-top: 10px;
background-color: whitesmoke;
border-radius: 15px;
border: graytext 1px solid;
}
#poruka{
border-right: gray 1px solid;
margin-bottom: 10px;
}
.userHeader {
display: flex;
padding-top: 2%;
padding-bottom: 2%;
justify-content: space-between;
}
.userHeader > button {
align-self: center;
padding: 1% 3% 1% 3%;
margin-right: 5%;
}
.userHeaderInfo {
display: flex;
margin-left: 3%;
align-items: center;
}
.userImg {
border-radius: 100%;
height: 100px;
width: auto;
}
.userName {
margin-left: 10%;
}
.userName > img {
width: 30px;
}
document.querySelector('#username').addEventListener('blur', validateUsername);
document.querySelector('#password').addEventListener('blur', validatePassword);
document.querySelector('#email').addEventListener('blur', validateEmail);
document.querySelector('#korisnikMob').addEventListener('blur', validateMob);
document.querySelector('#korisnikRodjen').addEventListener('blur', validateRodjen);
document.querySelector('#korisnikIme').addEventListener('blur', validateIme);
document.querySelector('#korisnikPrezime').addEventListener('blur', validatePrezime);
document.querySelector('#korisnikBio').addEventListener('blur', validateBio);
const notEmpty = /.{1,255}/;
const removeSpaces = /^\S*$/;
// - can not have spaces
function validateUsername(e) {
const idContainer = document.querySelector('#username');
const re = /^([A-Za-z0-9]){4,20}$/;
// - Value must be from 4 to 20 characters in length,
// - only allow letters and numbers, no special characters,
// - full line is evaluated.
if (re.test(idContainer.value) && removeSpaces.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validatePassword(e) {
const re = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$/;
// - at least 8 characters
// - must contain at least 1 uppercase letter, 1 lowercase letter, and 1 number
// - Can contain special characters
const idContainer = document.querySelector('#password');
if (re.test(idContainer.value) && removeSpaces.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validateEmail(e) {
const re = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
// - Email Validation as per RFC2822 standards.
// - Straight from .net helpfiles :)
const idContainer = document.querySelector('#email');
if (re.test(idContainer.value) && removeSpaces.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validateMob(e) {
const re = /^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/;
// - Positive: +42 555.123.4567 +1-(800)-123-4567 +7 555 1234567 +7(926)1234567
// - (926) 1234567 +79261234567 926 1234567 9261234567 1234567 123-4567 123-89-01 495 123
const idContainer = document.querySelector('#korisnikMob');
if (re.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validateRodjen(e) {
const re = /([\d]+)([\-\./])([\d]+)([\-\./])([\d]+)|((Jan(|uary)|Feb(|ruary)|Mar(|ch)|Apr(|il)|May|Jun(|e)|Jul(|y)|Aug(|ust)|Sept(|ember)|Oct(|ober)|(Nov|Dec)(|ember))([\s\-])(|([\d]+){1,2}([\s\-]|\, ))([\d]+){4})/;
// - Date formatting in these formats:
// - 01-01-2011
// - 01/01/2011
// - Jan 1, 2011
// - Jan 01, 2011
const idContainer = document.querySelector('#korisnikRodjen');
if (re.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validateIme(e) {
const idContainer = document.querySelector('#korisnikIme');
if (notEmpty.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validatePrezime(e) {
const idContainer = document.querySelector('#korisnikPrezime');
if (notEmpty.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
function validateBio(e) {
const idContainer = document.querySelector('#korisnikBio');
const re = /.{1,2000}/;
if (re.test(idContainer.value)) {
idContainer.classList.remove('is-invalid');
idContainer.classList.add('is-valid');
return true;
}
else {
idContainer.classList.remove('is-valid');
idContainer.classList.add('is-invalid');
return false;
}
}
(function () {
const forms = document.querySelectorAll('.needs-validation');
for (let form of forms) {
form.addEventListener(
'submit',
function (event) {
if (
!validateUsername() ||
!validatePassword() ||
!validateEmail() ||
!validateMob() ||
!validateRodjen() ||
!validateIme() ||
!validatePrezime() ||
!validateBio()
) {
event.preventDefault();
event.stopPropagation();
} else {
// form.classList.add('was-validated');
}
},
false
);
}
})();
\ No newline at end of file
/**
* @author zhixin wen <wenzhixin2010@gmail.com>
* @version 1.2.1
*
* http://wenzhixin.net.cn/p/multiple-select/
*/
(function ($) {
'use strict';
// it only does '%s', and return '' when arguments are undefined
var sprintf = function (str) {
var args = arguments,
flag = true,
i = 1;
str = str.replace(/%s/g, function () {
var arg = args[i++];
if (typeof arg === 'undefined') {
flag = false;
return '';
}
return arg;
});
return flag ? str : '';
};
var removeDiacritics = function (str) {
var defaultDiacriticsRemovalMap = [
{ 'base': 'A', 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g },
{ 'base': 'AA', 'letters': /[\uA732]/g },
{ 'base': 'AE', 'letters': /[\u00C6\u01FC\u01E2]/g },
{ 'base': 'AO', 'letters': /[\uA734]/g },
{ 'base': 'AU', 'letters': /[\uA736]/g },
{ 'base': 'AV', 'letters': /[\uA738\uA73A]/g },
{ 'base': 'AY', 'letters': /[\uA73C]/g },
{ 'base': 'B', 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g },
{ 'base': 'C', 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g },
{ 'base': 'D', 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g },
{ 'base': 'DZ', 'letters': /[\u01F1\u01C4]/g },
{ 'base': 'Dz', 'letters': /[\u01F2\u01C5]/g },
{ 'base': 'E', 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g },
{ 'base': 'F', 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g },
{ 'base': 'G', 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g },
{ 'base': 'H', 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g },
{ 'base': 'I', 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g },
{ 'base': 'J', 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g },
{ 'base': 'K', 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g },
{ 'base': 'L', 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g },
{ 'base': 'LJ', 'letters': /[\u01C7]/g },
{ 'base': 'Lj', 'letters': /[\u01C8]/g },
{ 'base': 'M', 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g },
{ 'base': 'N', 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g },
{ 'base': 'NJ', 'letters': /[\u01CA]/g },
{ 'base': 'Nj', 'letters': /[\u01CB]/g },
{ 'base': 'O', 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g },
{ 'base': 'OI', 'letters': /[\u01A2]/g },
{ 'base': 'OO', 'letters': /[\uA74E]/g },
{ 'base': 'OU', 'letters': /[\u0222]/g },
{ 'base': 'P', 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g },
{ 'base': 'Q', 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g },
{ 'base': 'R', 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g },
{ 'base': 'S', 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g },
{ 'base': 'T', 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g },
{ 'base': 'TZ', 'letters': /[\uA728]/g },
{ 'base': 'U', 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g },
{ 'base': 'V', 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g },
{ 'base': 'VY', 'letters': /[\uA760]/g },
{ 'base': 'W', 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g },
{ 'base': 'X', 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g },
{ 'base': 'Y', 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g },
{ 'base': 'Z', 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g },
{ 'base': 'a', 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g },
{ 'base': 'aa', 'letters': /[\uA733]/g },
{ 'base': 'ae', 'letters': /[\u00E6\u01FD\u01E3]/g },
{ 'base': 'ao', 'letters': /[\uA735]/g },
{ 'base': 'au', 'letters': /[\uA737]/g },
{ 'base': 'av', 'letters': /[\uA739\uA73B]/g },
{ 'base': 'ay', 'letters': /[\uA73D]/g },
{ 'base': 'b', 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g },
{ 'base': 'c', 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g },
{ 'base': 'd', 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g },
{ 'base': 'dz', 'letters': /[\u01F3\u01C6]/g },
{ 'base': 'e', 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g },
{ 'base': 'f', 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g },
{ 'base': 'g', 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g },
{ 'base': 'h', 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g },
{ 'base': 'hv', 'letters': /[\u0195]/g },
{ 'base': 'i', 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g },
{ 'base': 'j', 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g },
{ 'base': 'k', 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g },
{ 'base': 'l', 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g },
{ 'base': 'lj', 'letters': /[\u01C9]/g },
{ 'base': 'm', 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g },
{ 'base': 'n', 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g },
{ 'base': 'nj', 'letters': /[\u01CC]/g },
{ 'base': 'o', 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g },
{ 'base': 'oi', 'letters': /[\u01A3]/g },
{ 'base': 'ou', 'letters': /[\u0223]/g },
{ 'base': 'oo', 'letters': /[\uA74F]/g },
{ 'base': 'p', 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g },
{ 'base': 'q', 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g },
{ 'base': 'r', 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g },
{ 'base': 's', 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g },
{ 'base': 't', 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g },
{ 'base': 'tz', 'letters': /[\uA729]/g },
{ 'base': 'u', 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g },
{ 'base': 'v', 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g },
{ 'base': 'vy', 'letters': /[\uA761]/g },
{ 'base': 'w', 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g },
{ 'base': 'x', 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g },
{ 'base': 'y', 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g },
{ 'base': 'z', 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g }
];
for (var i = 0; i < defaultDiacriticsRemovalMap.length; i++) {
str = str.replace(defaultDiacriticsRemovalMap[i].letters, defaultDiacriticsRemovalMap[i].base);
}
return str;
};
function MultipleSelect($el, options) {
var that = this,
name = $el.attr('name') || options.name || '';
this.options = options;
// hide select element
this.$el = $el.hide();
// label element
this.$label = this.$el.closest('label');
if (this.$label.length === 0 && this.$el.attr('id')) {
this.$label = $(sprintf('label[for="%s"]', this.$el.attr('id').replace(/:/g, '\\:')));
}
// restore class and title from select element
this.$parent = $(sprintf(
'<div class="ms-parent %s" %s/>',
$el.attr('class') || '',
sprintf('title="%s"', $el.attr('title'))));
// add placeholder to choice button
this.$choice = $(sprintf([
'<button type="button" class="ms-choice">',
'<span class="placeholder">%s</span>',
'<div></div>',
'</button>'
].join(''),
this.options.placeholder));
// default position is bottom
this.$drop = $(sprintf('<div class="ms-drop %s"%s></div>',
this.options.position,
sprintf(' style="width: %s"', this.options.dropWidth)));
this.$el.after(this.$parent);
this.$parent.append(this.$choice);
this.$parent.append(this.$drop);
if (this.$el.prop('disabled')) {
this.$choice.addClass('disabled');
}
this.$parent.css('width',
this.options.width ||
this.$el.css('width') ||
this.$el.outerWidth() + 20);
this.selectAllName = 'data-name="selectAll' + name + '"';
this.selectGroupName = 'data-name="selectGroup' + name + '"';
this.selectItemName = 'data-name="selectItem' + name + '"';
if (!this.options.keepOpen) {
$(document).click(function (e) {
if ($(e.target)[0] === that.$choice[0] ||
$(e.target).parents('.ms-choice')[0] === that.$choice[0]) {
return;
}
if (($(e.target)[0] === that.$drop[0] ||
$(e.target).parents('.ms-drop')[0] !== that.$drop[0] && e.target !== $el[0]) &&
that.options.isOpen) {
that.close();
}
});
}
}
MultipleSelect.prototype = {
constructor: MultipleSelect,
init: function () {
var that = this,
$ul = $('<ul></ul>');
this.$drop.html('');
if (this.options.filter) {
this.$drop.append([
'<div class="ms-search">',
'<input type="text" autocomplete="off" autocorrect="off" autocapitilize="off" spellcheck="false">',
'</div>'].join('')
);
}
if (this.options.selectAll && !this.options.single) {
$ul.append([
'<li class="ms-select-all">',
'<label>',
sprintf('<input type="checkbox" %s /> ', this.selectAllName),
this.options.selectAllDelimiter[0],
this.options.selectAllText,
this.options.selectAllDelimiter[1],
'</label>',
'</li>'
].join(''));
}
$.each(this.$el.children(), function (i, elm) {
$ul.append(that.optionToHtml(i, elm));
});
$ul.append(sprintf('<li class="ms-no-results">%s</li>', this.options.noMatchesFound));
this.$drop.append($ul);
this.$drop.find('ul').css('max-height', this.options.maxHeight + 'px');
this.$drop.find('.multiple').css('width', this.options.multipleWidth + 'px');
this.$searchInput = this.$drop.find('.ms-search input');
this.$selectAll = this.$drop.find('input[' + this.selectAllName + ']');
this.$selectGroups = this.$drop.find('input[' + this.selectGroupName + ']');
this.$selectItems = this.$drop.find('input[' + this.selectItemName + ']:enabled');
this.$disableItems = this.$drop.find('input[' + this.selectItemName + ']:disabled');
this.$noResults = this.$drop.find('.ms-no-results');
this.events();
this.updateSelectAll(true);
this.update(true);
if (this.options.isOpen) {
this.open();
}
},
optionToHtml: function (i, elm, group, groupDisabled) {
var that = this,
$elm = $(elm),
classes = $elm.attr('class') || '',
title = sprintf('title="%s"', $elm.attr('title')),
multiple = this.options.multiple ? 'multiple' : '',
disabled,
type = this.options.single ? 'radio' : 'checkbox';
if ($elm.is('option')) {
var value = $elm.val(),
text = that.options.textTemplate($elm),
selected = $elm.prop('selected'),
style = sprintf('style="%s"', this.options.styler(value)),
$el;
disabled = groupDisabled || $elm.prop('disabled');
$el = $([
sprintf('<li class="%s %s" %s %s>', multiple, classes, title, style),
sprintf('<label class="%s">', disabled ? 'disabled' : ''),
sprintf('<input type="%s" %s%s%s%s>',
type, this.selectItemName,
selected ? ' checked="checked"' : '',
disabled ? ' disabled="disabled"' : '',
sprintf(' data-group="%s"', group)),
sprintf('<span>%s</span>', text),
'</label>',
'</li>'
].join(''));
$el.find('input').val(value);
return $el;
}
if ($elm.is('optgroup')) {
var label = that.options.labelTemplate($elm),
$group = $('<div/>');
group = 'group_' + i;
disabled = $elm.prop('disabled');
$group.append([
'<li class="group">',
sprintf('<label class="optgroup %s" data-group="%s">', disabled ? 'disabled' : '', group),
this.options.hideOptgroupCheckboxes || this.options.single ? '' :
sprintf('<input type="checkbox" %s %s>',
this.selectGroupName, disabled ? 'disabled="disabled"' : ''),
label,
'</label>',
'</li>'
].join(''));
$.each($elm.children(), function (i, elm) {
$group.append(that.optionToHtml(i, elm, group, disabled));
});
return $group.html();
}
},
events: function () {
var that = this,
toggleOpen = function (e) {
e.preventDefault();
that[that.options.isOpen ? 'close' : 'open']();
};
if (this.$label) {
this.$label.off('click').on('click', function (e) {
if (e.target.nodeName.toLowerCase() !== 'label' || e.target !== this) {
return;
}
toggleOpen(e);
if (!that.options.filter || !that.options.isOpen) {
that.focus();
}
e.stopPropagation(); // Causes lost focus otherwise
});
}
this.$choice.off('click').on('click', toggleOpen)
.off('focus').on('focus', this.options.onFocus)
.off('blur').on('blur', this.options.onBlur);
this.$parent.off('keydown').on('keydown', function (e) {
switch (e.which) {
case 27: // esc key
that.close();
that.$choice.focus();
break;
}
});
this.$searchInput.off('keydown').on('keydown', function (e) {
// Ensure shift-tab causes lost focus from filter as with clicking away
if (e.keyCode === 9 && e.shiftKey) {
that.close();
}
}).off('keyup').on('keyup', function (e) {
// enter or space
// Avoid selecting/deselecting if no choices made
if (that.options.filterAcceptOnEnter && (e.which === 13 || e.which == 32) && that.$searchInput.val()) {
that.$selectAll.click();
that.close();
that.focus();
return;
}
that.filter();
});
this.$selectAll.off('click').on('click', function () {
var checked = $(this).prop('checked'),
$items = that.$selectItems.filter(':visible');
if ($items.length === that.$selectItems.length) {
that[checked ? 'checkAll' : 'uncheckAll']();
} else { // when the filter option is true
that.$selectGroups.prop('checked', checked);
$items.prop('checked', checked);
that.options[checked ? 'onCheckAll' : 'onUncheckAll']();
that.update();
}
});
this.$selectGroups.off('click').on('click', function () {
var group = $(this).parent().attr('data-group'),
$items = that.$selectItems.filter(':visible'),
$children = $items.filter(sprintf('[data-group="%s"]', group)),
checked = $children.length !== $children.filter(':checked').length;
$children.prop('checked', checked);
that.updateSelectAll();
that.update();
that.options.onOptgroupClick({
label: $(this).parent().text(),
checked: checked,
children: $children.get(),
instance: that
});
});
this.$selectItems.off('click').on('click', function () {
that.updateSelectAll();
that.update();
that.updateOptGroupSelect();
that.options.onClick({
label: $(this).parent().text(),
value: $(this).val(),
checked: $(this).prop('checked'),
instance: that
});
if (that.options.single && that.options.isOpen && !that.options.keepOpen) {
that.close();
}
if (that.options.single) {
var clickedVal = $(this).val();
that.$selectItems.filter(function () {
return $(this).val() !== clickedVal;
}).each(function () {
$(this).prop('checked', false);
});
that.update();
}
});
},
open: function () {
if (this.$choice.hasClass('disabled')) {
return;
}
this.options.isOpen = true;
this.$choice.find('>div').addClass('open');
this.$drop[this.animateMethod('show')]();
// fix filter bug: no results show
this.$selectAll.parent().show();
this.$noResults.hide();
// Fix #77: 'All selected' when no options
if (!this.$el.children().length) {
this.$selectAll.parent().hide();
this.$noResults.show();
}
if (this.options.container) {
var offset = this.$drop.offset();
this.$drop.appendTo($(this.options.container));
this.$drop.offset({
top: offset.top,
left: offset.left
});
}
if (this.options.filter) {
this.$searchInput.val('');
this.$searchInput.focus();
this.filter();
}
this.options.onOpen();
},
close: function () {
this.options.isOpen = false;
this.$choice.find('>div').removeClass('open');
this.$drop[this.animateMethod('hide')]();
if (this.options.container) {
this.$parent.append(this.$drop);
this.$drop.css({
'top': 'auto',
'left': 'auto'
});
}
this.options.onClose();
},
animateMethod: function (method) {
var methods = {
show: {
fade: 'fadeIn',
slide: 'slideDown'
},
hide: {
fade: 'fadeOut',
slide: 'slideUp'
}
};
return methods[method][this.options.animate] || method;
},
update: function (isInit) {
var selects = this.options.displayValues ? this.getSelects() : this.getSelects('text'),
$span = this.$choice.find('>span'),
sl = selects.length;
if (sl === 0) {
$span.addClass('placeholder').html(this.options.placeholder);
} else if (this.options.allSelected && sl === this.$selectItems.length + this.$disableItems.length) {
$span.removeClass('placeholder').html(this.options.allSelected);
} else if (this.options.ellipsis && sl > this.options.minimumCountSelected) {
$span.removeClass('placeholder').text(selects.slice(0, this.options.minimumCountSelected)
.join(this.options.delimiter) + '...');
} else if (this.options.countSelected && sl > this.options.minimumCountSelected) {
$span.removeClass('placeholder').html(this.options.countSelected
.replace('#', selects.length)
.replace('%', this.$selectItems.length + this.$disableItems.length));
} else {
$span.removeClass('placeholder').text(selects.join(this.options.delimiter));
}
if (this.options.addTitle) {
$span.prop('title', this.getSelects('text'));
}
// set selects to select
this.$el.val(this.getSelects()).trigger('change');
// add selected class to selected li
this.$drop.find('li').removeClass('selected');
this.$drop.find('input:checked').each(function () {
$(this).parents('li').first().addClass('selected');
});
// trigger <select> change event
if (!isInit) {
this.$el.trigger('change');
}
},
updateSelectAll: function (isInit) {
var $items = this.$selectItems;
if (!isInit) {
$items = $items.filter(':visible');
}
this.$selectAll.prop('checked', $items.length &&
$items.length === $items.filter(':checked').length);
if (!isInit && this.$selectAll.prop('checked')) {
this.options.onCheckAll();
}
},
updateOptGroupSelect: function () {
var $items = this.$selectItems.filter(':visible');
$.each(this.$selectGroups, function (i, val) {
var group = $(val).parent().attr('data-group'),
$children = $items.filter(sprintf('[data-group="%s"]', group));
$(val).prop('checked', $children.length &&
$children.length === $children.filter(':checked').length);
});
},
//value or text, default: 'value'
getSelects: function (type) {
var that = this,
texts = [],
values = [];
this.$drop.find(sprintf('input[%s]:checked', this.selectItemName)).each(function () {
texts.push($(this).parents('li').first().text());
values.push($(this).val());
});
if (type === 'text' && this.$selectGroups.length) {
texts = [];
this.$selectGroups.each(function () {
var html = [],
text = $.trim($(this).parent().text()),
group = $(this).parent().data('group'),
$children = that.$drop.find(sprintf('[%s][data-group="%s"]', that.selectItemName, group)),
$selected = $children.filter(':checked');
if (!$selected.length) {
return;
}
html.push('[');
html.push(text);
if ($children.length > $selected.length) {
var list = [];
$selected.each(function () {
list.push($(this).parent().text());
});
html.push(': ' + list.join(', '));
}
html.push(']');
texts.push(html.join(''));
});
}
return type === 'text' ? texts : values;
},
setSelects: function (values) {
var that = this;
this.$selectItems.prop('checked', false);
this.$disableItems.prop('checked', false);
$.each(values, function (i, value) {
that.$selectItems.filter(sprintf('[value="%s"]', value)).prop('checked', true);
that.$disableItems.filter(sprintf('[value="%s"]', value)).prop('checked', true);
});
this.$selectAll.prop('checked', this.$selectItems.length ===
this.$selectItems.filter(':checked').length + this.$disableItems.filter(':checked').length);
$.each(that.$selectGroups, function (i, val) {
var group = $(val).parent().attr('data-group'),
$children = that.$selectItems.filter('[data-group="' + group + '"]');
$(val).prop('checked', $children.length &&
$children.length === $children.filter(':checked').length);
});
this.update();
},
enable: function () {
this.$choice.removeClass('disabled');
},
disable: function () {
this.$choice.addClass('disabled');
},
checkAll: function () {
this.$selectItems.prop('checked', true);
this.$selectGroups.prop('checked', true);
this.$selectAll.prop('checked', true);
this.update();
this.options.onCheckAll();
},
uncheckAll: function () {
this.$selectItems.prop('checked', false);
this.$selectGroups.prop('checked', false);
this.$selectAll.prop('checked', false);
this.update();
this.options.onUncheckAll();
},
focus: function () {
this.$choice.focus();
this.options.onFocus();
},
blur: function () {
this.$choice.blur();
this.options.onBlur();
},
refresh: function () {
this.init();
},
destroy: function () {
this.$el.show();
this.$parent.remove();
this.$el.data('multipleSelect', null);
},
filter: function () {
var that = this,
text = $.trim(this.$searchInput.val()).toLowerCase();
if (text.length === 0) {
this.$selectAll.parent().show();
this.$selectItems.parent().show();
this.$disableItems.parent().show();
this.$selectGroups.parent().show();
this.$noResults.hide();
} else {
this.$selectItems.each(function () {
var $parent = $(this).parent();
$parent[removeDiacritics($parent.text().toLowerCase()).indexOf(removeDiacritics(text)) < 0 ? 'hide' : 'show']();
});
this.$disableItems.parent().hide();
this.$selectGroups.each(function () {
var $parent = $(this).parent();
var group = $parent.attr('data-group'),
$items = that.$selectItems.filter(':visible');
$parent[$items.filter(sprintf('[data-group="%s"]', group)).length ? 'show' : 'hide']();
});
//Check if no matches found
if (this.$selectItems.parent().filter(':visible').length) {
this.$selectAll.parent().show();
this.$noResults.hide();
} else {
this.$selectAll.parent().hide();
this.$noResults.show();
}
}
this.updateOptGroupSelect();
this.updateSelectAll();
this.options.onFilter(text);
}
};
$.fn.multipleSelect = function () {
var option = arguments[0],
args = arguments,
value,
allowedMethods = [
'getSelects', 'setSelects',
'enable', 'disable',
'open', 'close',
'checkAll', 'uncheckAll',
'focus', 'blur',
'refresh', 'destroy'
];
this.each(function () {
var $this = $(this),
data = $this.data('multipleSelect'),
options = $.extend({}, $.fn.multipleSelect.defaults,
$this.data(), typeof option === 'object' && option);
if (!data) {
data = new MultipleSelect($this, options);
$this.data('multipleSelect', data);
}
if (typeof option === 'string') {
if ($.inArray(option, allowedMethods) < 0) {
throw 'Unknown method: ' + option;
}
value = data[option](args[1]);
} else {
data.init();
if (args[1]) {
value = data[args[1]].apply(data, [].slice.call(args, 2));
}
}
});
return typeof value !== 'undefined' ? value : this;
};
$.fn.multipleSelect.defaults = {
name: '',
isOpen: false,
placeholder: '',
selectAll: true,
selectAllDelimiter: ['[', ']'],
minimumCountSelected: 3,
ellipsis: false,
multiple: false,
multipleWidth: 80,
single: false,
filter: false,
width: undefined,
dropWidth: undefined,
maxHeight: 250,
container: null,
position: 'bottom',
keepOpen: false,
animate: 'none', // 'none', 'fade', 'slide'
displayValues: false,
delimiter: ', ',
addTitle: false,
filterAcceptOnEnter: false,
hideOptgroupCheckboxes: false,
selectAllText: 'Select all',
allSelected: 'All selected',
countSelected: '# of % selected',
noMatchesFound: 'No matches found',
styler: function () {
return false;
},
textTemplate: function ($elm) {
return $elm.html();
},
labelTemplate: function ($elm) {
return $elm.attr('label');
},
onOpen: function () {
return false;
},
onClose: function () {
return false;
},
onCheckAll: function () {
return false;
},
onUncheckAll: function () {
return false;
},
onFocus: function () {
return false;
},
onBlur: function () {
return false;
},
onOptgroupClick: function () {
return false;
},
onClick: function () {
return false;
},
onFilter: function () {
return false;
}
};
})(jQuery);
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
</head>
<body>
<!-- main container -->
<div id="main" class="container justify-content-center ">
<br>
<br>
<div class="text-center">
<img src="img/error404.png" class="rounded" alt="...">
</div>
<h1 class="display-1 text-center">Oops!!</h1>
<blockquote class="blockquote text-center">
<p class="mb-0">Ne možemo da pronađemo stranicu koju tražite.</p>
<br>
<footer class="blockquote-footer">Error code: <cite title="Source Title">404</cite></footer>
</blockquote>
<br>
<br>
<h2 class="lead text-center">Vrati se na početnu stranicu:</h2>
<div class="text-center">
<a type="button" class="btn btn-primary" href="/">Početna</a>
</div>
<br><br>
</div>
<br>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
<script src="jss/app.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/index.css">
<link rel="stylesheet" href="css/multiple-select.css" />
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item" th:utext="${dodajOglas}"/>
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item" th:utext="${inbox}"/>
<li class="nav-item" th:utext="${user}"/>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center">
<div class="row">
<div id="filteri" class="col-sm-12 col-lg-4">
<!-- filteri -->
<form method="GET" action="/">
<h4 class="h4">Filtriraj po</h4>
<div class="accordion" id="accordionPanelsStayOpenExample">
<div class="accordion-item">
<h2 class="accordion-header" id="panelsStayOpen-headingOne">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#panelsStayOpen-collapseOne" aria-expanded="true"
aria-controls="panelsStayOpen-collapseOne">
Kategorija
</button>
</h2>
<div id="panelsStayOpen-collapseOne" class="accordion-collapse collapse show"
aria-labelledby="panelsStayOpen-headingOne">
<div class="accordion-body">
<select class="form-control ms" multiple="multiple" id="korisnikUloga" name="kategorija" th:utext="${kategorija}"/>
<button class="btn btn-outline-success" type="submit">Search</button>
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header" id="panelsStayOpen-headingTwo">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#panelsStayOpen-collapseTwo" aria-expanded="false"
aria-controls="panelsStayOpen-collapseTwo">
Lokacija
</button>
</h2>
<div id="panelsStayOpen-collapseTwo" class="accordion-collapse collapse show"
aria-labelledby="panelsStayOpen-headingTwo">
<div class="accordion-body">
<select class="form-control ms" multiple="multiple" id="lokacija" name="lokacija" th:utext="${lokacija}"/>
<button class="btn btn-outline-success" type="submit">Search</button>
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header" id="panelsStayOpen-headingThree">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#panelsStayOpen-collapseThree" aria-expanded="false"
aria-controls="panelsStayOpen-collapseThree">
Vestine
</button>
</h2>
<div id="panelsStayOpen-collapseThree" class="accordion-collapse collapse show"
aria-labelledby="panelsStayOpen-headingThree">
<div class="accordion-body">
<select name="skills" multiple="multiple" class="form-control ms" th:utext="${skills}"/>
<button class="btn btn-outline-success" type="submit">Search</button>
</div>
</div>
</div>
</div>
</div><!-- kraj filtera -->
<div id="poslovi" class="col-sm-12 col-lg-8">
<!-- poslovi -->
<div id="search">
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search" name="search" th:value="${search}">
<button class="btn btn-outline-success" type="submit">Search</button>
</form>
</div>
<div th:utext="${poslovi}"/>
</div><!-- kraj poslova -->
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
<!-- Multiple Select -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"
integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"
integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm"
crossorigin="anonymous"></script>
<script src="jss/multiple-select.js"></script>
<script>
$(function () {
$('.ms').change(function () {
console.log($(this).val());
}).multipleSelect({
width: '100%'
});
});
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item">
<a class="nav-link" href="login">Uloguj se</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center ">
<h1 class="display-2">Prijava</h1>
<form id="forms" method="POST" class="needs-validation" novalidate action="login">
<br>
<div class="form-group col-md-6">
<label for="username">Username</label>
<input type="txt" class="form-control" id="username" name="username" placeholder="Username"
required th:value="${username}">
<div class="invalid-feedback">Molimo Vas, unesite validno korisničko ime.<br>Username može imati od 4 do
20 karaktera,
dozvoljena su slova i brojevi, nisu dozvoljeni specijalni karakteri kao i razmak.</div>
<div class="valid-feedback">Odlično!</div>
<!-- <small id="passowrdHelp" class="form-text text-muted">Username može imati od 4 do 20 karaktera,
dozvoljena su slova i brojevi, nisu dozvoljeni specijalni karakteri kao i razmak. </small> -->
</div>
<br>
<div class="form-group col-md-6">
<label for="password">Password</label>
<input type="password" class="form-control" id="password" name="password" placeholder="Password"
required>
<div class="invalid-feedback">Molimo Vas, unesite validnu lozinku.<br>Lozinka mora imati najmanje 8
karaktera, 1
veliko slovo, 1 malo slovo
i 1 broj, može da sadrži specijalne karaktere. Nije dozvoljen razmak.</div>
<div class="valid-feedback">Odlično!</div>
<!-- <small id="passowrdHelp" class="form-text text-muted">Lozinka mora imati najmanje 8 karaktera, 1
veliko slovo, 1 malo slovo
i 1 broj, može da sadrži specijalne karaktere. Nije dozvoljen razmak.</small> -->
</div>
<br>
<button type="submit" class="btn btn-success col-md-2">Prijavi Se</button>
</form>
<br>
<a class="a" href="register">Nemate nalog? Napravite novi!</a>
<br>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
<script src="jss/app.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item" th:utext="${dodajOglas}" />
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item" th:utext="${inbox}" />
<li class="nav-item" th:utext="${user}" />
</ul>
</div>
</div>
</nav>
<div id="main" class="container justify-content-center">
<br>
<div id="poslovi" class="col-sm col-lg" th:utext="${popuni}"/>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item" th:utext="${dodajOglas}"/>
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item" th:utext="${inbox}"/>
<li class="nav-item" th:utext="${user}"/>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center">
<div class="row">
<div class="userHeader">
<h3 class="h3">Detalji o poslu</h3>
<div th:utext="${dugmeChange}"/>
<div th:utext="${dugme}"/>
<div th:utext="${lajk}"/>
</div><hr>
<div class="col-lg-8">
<h4 id="naslov" class="h4" th:text="${nazivOglasa}"/>
<div class="tag" id="kategorija" th:text="${kategorijaID}"/>
<div>
Broj pregleda: <span th:text="${brojPregleda}"/>
</div>
<div id="postavljeno">
Postavljeno: <span th:text="${datumKreiranja}"/>
</div>
<div id="postavio">
Postavio: <span th:utext="${nazivVlasnika}"/>
</div>
<p id="info" th:text="${opisOglasa}"/>
</div>
<div id="proposalBorderLine" class="col-lg-4">
<h6 class="h6" th:text="${potrebnoIskustvo}"/>
<h6 class="h6" th:text="${radOdKuce}"/>
<div class="lokacija">
<img src="img/loc.png" style="width: 20px;" alt="lokacija"> <span th:text="${lokacija}"/>
</div>
Potrebno obrazovanje:
<div class="lokacija" th:utext="${obrazovanje}"/>
</div>
<hr>
<h4 id="skills" class="h4">Skills</h4>
<div id="tagovi" th:utext="${skills}"/>
</div>
</div>
<!-- prijava container -->
<div th:utext="${prijava}">
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>Praktikum OOP</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
<link rel="stylesheet" type="text/css" href="css/avatar.css">
<!-- Multiple Select Plugin -->
<link rel="stylesheet" href="css/multiple-select.css" />
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">Praktikum OOP</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item" th:utext="${dodajOglas}"/>
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item" th:utext="${inbox}"/>
<li class="nav-item" th:utext="${user}"/>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center ">
<h1 class="display-2" th:text="${naziv}"/>
<form id="forms" method="POST" class="needs-validation" novalidate th:action="${akcija}" >
<div class="row">
<div class="form-group col-md-4">
<label for="korisnikIme">*Ime</label>
<input type="txt" class="form-control" id="korisnikIme" name="korisnikIme" placeholder="Ime"
required th:value="${korisnikIme}">
<div class="invalid-feedback">Molimo Vas, unesite ime. Polje ne može biti prazno.</div>
<div class="valid-feedback">Odlično!</div>
</div>
<div class="form-group col-md-4">
<label for="korisnikPrezime">*Prezime</label>
<input type="txt" class="form-control" id="korisnikPrezime" name="korisnikPrezime"
placeholder="Prezime" required th:value="${korisnikPrezime}">
<div class="invalid-feedback">Molimo Vas, unesite prezime. Polje ne može biti prazno.</div>
<div class="valid-feedback">Odlično!</div>
</div>
<div class="form-group col-md-4">
<label for="korisnikRodjen">*Datum rođenja</label>
<input type="txt" class="form-control" id="korisnikRodjen" name="korisnikRodjen"
placeholder="Datum rođenja" required th:value="${korisnikRodjen}">
<div class="invalid-feedback">Molimo Vas, unesite validan datum u validnom formatu!</div>
<div class="valid-feedback">Odlično!</div>
</div>
</div>
<br>
<div class="form-check form-check-inline col-md-1">
<input class="form-check-input" type="radio" name="pol" id="polM" value="1" th:checked="${musko}">
<label class="form-check-label" for="polM">Muško</label>
</div>
<div class="form-check form-check-inline col-md-1">
<input class="form-check-input" type="radio" name="pol" id="polZ" value="0" th:checked="${zensko}">
<label class="form-check-label" for="polZ">Žensko</label>
</div>
<br>
<div class="row">
<div class="form-group col-md-6">
<label for="username">*Username</label>
<input type="txt" class="form-control" id="username" name="username" placeholder="Username" required
th:value="${username}">
<div class="invalid-feedback">Molimo Vas, unesite validno korisničko ime.</div>
<div class="valid-feedback">Odlično!</div>
<small id="passowrdHelpp" class="form-text text-muted">Username može imati od 4 do 20 karaktera,
dozvoljena su slova i brojevi, nisu dozvoljeni specijalni karakteri kao i razmak. </small>
</div>
<div class="form-group col-md-6">
<label for="password">*Password</label>
<input type="password" class="form-control" id="password" name="password" placeholder="Password"
required>
<div class="invalid-feedback">Molimo Vas, unesite validnu lozinku.</div>
<div class="valid-feedback">Odlično!</div>
<small id="passowrdHelp" class="form-text text-muted">Lozinka mora imati najmanje 8 karaktera, 1
veliko slovo, 1 malo slovo
i 1 broj, može da sadrži specijalne karaktere. Nije dozvoljen razmak.</small>
</div>
</div>
<br>
<div class="row">
<div class="form-group col-md-6">
<label for="email">*Email</label>
<input type="email" class="form-control" id="email" name="email" placeholder="no-face@example.com"
required th:value="${email}">
<div class="invalid-feedback">Molimo Vas, unesite validnu email adresu.</div>
<div class="valid-feedback">Odlično!</div>
</div>
<div class="form-group col-md-6">
<label for="korisnikMob">*Mobilni</label>
<input type="txt" class="form-control" id="korisnikMob" name="korisnikMob"
placeholder="(381) 66281781" required th:value="${korisnikMob}">
<div class="invalid-feedback">Molimo Vas, unesite validan mobilni broj u formatu, (381) 66281781.
</div>
<div class="valid-feedback">Odlično!</div>
</div>
</div>
<br>
<div class="row">
<div class="form-group col-md-6">
<label for="lokacija">*Lokacija</label>
<select class="form-control" id="lokacija" name="lokacija" th:utext="${lokacija}"/>
</div>
<div class="form-group col-md-6">
<label for="ms">Edukacija</label>
<select name="edukacija" multiple="multiple" class="form-control ms" th:utext="${edukacija}"/>
</div>
</div>
<br>
<div class="form-group">
<label for="korisnikBio">*Bio</label>
<textarea class="form-control" id="korisnikBio" name="korisnikBio"
placeholder="Biografija, do 2000 karaktera" rows=4 required th:text="${korisnikBio}"></textarea>
<div class="invalid-feedback">>Molimo Vas, unesite Vašu biografiju. Polje ne može biti prazno.</div>
<div class="valid-feedback">Odlično!</div>
</div>
<br>
<div class="row">
<div class="form-group col-md-6">
<label for="ms">Vestine</label>
<select name="skills" multiple="multiple" class="form-control ms" th:utext="${skills}"/>
</div>
</div>
<br>
<div class="row">
<div th:utext="${tipKorisnika}"/>
<div class="form-group">
<label for="korisnikSlika">Profil Slika</label>
<div class="form-group col-md-3">
<input type="radio" name="korisnikSlika" value="avatars/1.png" id="avatar1" class="input-hidden" />
<label for="avatar1">
<img src="avatars/1.png" alt="avatar1" />
</label>
<input type="radio" name="korisnikSlika" value="avatars/2.png" id="avatar2" class="input-hidden" />
<label for="avatar2">
<img src="avatars/2.png" alt="avatar2" />
</label>
<input type="radio" name="korisnikSlika" value="avatars/3.png" id="avatar3" class="input-hidden" />
<label for="avatar3">
<img src="avatars/3.png" alt="avatar3" />
</label>
<input type="radio" name="korisnikSlika" value="avatars/4.png" id="avatar4" class="input-hidden" />
<label for="avatar4">
<img src="avatars/4.png" alt="avatar4" />
</label>
<input type="radio" name="korisnikSlika" value="avatars/5.png" id="avatar5" class="input-hidden" />
<label for="avatar5">
<img src="avatars/5.png" alt="avatar5" />
</label>
<input type="radio" name="korisnikSlika" value="avatars/6.png" id="avatar6" class="input-hidden" />
<label for="avatar6">
<img src="avatars/6.png" alt="avatar6" />
</label>
</div>
</div>
</div>
<br>
<button type="submit" class="btn btn-success col-md-3" th:text="${dugme}"/>
<div th:utext="${odustani}"/>
</form>
<br>
<br>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
<script src="jss/app.js"></script>
<!-- Multiple Select -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"
integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"
integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm"
crossorigin="anonymous"></script>
<script src="jss/multiple-select.js"></script>
<script>
$(function () {
$('.ms').change(function () {
console.log($(this).val());
}).multipleSelect({
width: '100%'
});
});
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
<!-- Multiple Select Plugin -->
<link rel="stylesheet" href="css/multiple-select.css" />
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="dodajOglas">Dodaj oglas</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item">
<a class="nav-link" href="inbox">Inbox</a>
</li>
<li class="nav-item">
<a class="nav-link" href="user">Moj profil</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center ">
<h1 class="display-2" th:text="${naziv}"/>
<form id="forms" method="POST" class="needs-validation" novalidate th:action="${akcija}">
<!-- action = "naziv-action-php-fajla.php" -->
<br>
<div class="form-group col-md-5">
<label for="korisnikUloga">Kategorija</label>
<select class="form-control" id="korisnikUloga" name="kategorija" th:utext="${kategorija}"/>
</div>
<br>
<div class="form-group col-md-5">
<label for="nazivOglasa">Naziv</label>
<input type="txt" class="form-control" id="nazivOglasa" name="nazivOglasa" placeholder="Naziv Oglasa"
required th:value="${nazivOglasa}">
<div class="invalid-feedback">Molimo Vas, unesite naziv oglasa. Polje ne može biti prazno.</div>
<div class="valid-feedback">Odlično!</div>
</div>
<br>
<div class="form-group col-md-5">
<label for="opisOglasa">Detalji</label>
<textarea class="form-control" id="opisOglasa" name="opisOglasa"
placeholder="Detalji posla, do 2000 karaktera" rows=6 required th:text="${opisOglasa}"></textarea>
<div class="invalid-feedback">>Molimo Vas, unesite detalje posla. Polje ne može biti prazno.</div>
<div class="valid-feedback">Odlično!</div>
</div>
<br>
<div class="form-group col-md-5">
<label for="ms">Vestine</label>
<select name="skills" multiple="multiple" class="form-control ms" th:utext="${skills}">
</select>
</div>
<br>
<div class="form-group col-md-5">
<label for="ms">Edukacija</label>
<select name="edukacija" multiple="multiple" class="form-control ms" th:utext="${edukacija}"/>
</div>
<br>
<div class="form-group col-md-5">
<label for="lokacija">Lokacija</label>
<select class="form-control" id="lokacija" name="lokacija" th:utext="${lokacija}"/>
</div>
<br>
<legend class="col-form-label ">Da li je potrebno iskustvo?</legend>
<div class="form-check form-check-inline col-md-1">
<input class="form-check-input" type="radio" name="iskustvo" id="iskustvoDa" value="1" th:checked="${iskustvoDa}">
<label class="form-check-label" for="iskustvoDa">Da</label>
</div>
<div class="form-check form-check-inline col-md-1">
<input class="form-check-input" type="radio" name="iskustvo" id="iskustvoNe" value="0" th:checked="${iskustvoNe}">
<label class="form-check-label" for="iskustvoNe">Ne</label>
</div>
<br>
<legend class="col-form-label ">Da li je moguć rad od kuće?</legend>
<div class="form-check form-check-inline col-md-1">
<input class="form-check-input" type="radio" name="radOdKuce" id="radOdKuceDa" value="1" th:checked="${radOdKuceDa}">
<label class="form-check-label" for="radOdKuceDa">Da</label>
</div>
<div class="form-check form-check-inline col-md-1">
<input class="form-check-input" type="radio" name="radOdKuce" id="radOdKuceNe" value="0" th:checked="${radOdKuceNe}">
<label class="form-check-label" for="radOdKuceNe">Ne</label>
</div>
<br>
<br>
<button type="submit" class="btn btn-success col-md-2" th:text="${dugme}"/>
<div th:utext="${odustani}"/>
<br>
<br>
<br>
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
<script src="jss/app.js"></script>
<!-- Multiple Select -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"
integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"
integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm"
crossorigin="anonymous"></script>
<script src="jss/multiple-select.js"></script>
<script>
$(function () {
$('.ms').change(function () {
console.log($(this).val());
}).multipleSelect({
width: '100%'
});
});
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>OglasIMI</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="css/proposal.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="/">OglasIMI</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item" th:utext="${dodajOglas}"/>
<li class="nav-item">
<a class="nav-link" href="/">Nadji posao</a>
</li>
<li class="nav-item" th:utext="${inbox}"/>
<li class="nav-item" th:utext="${user}"/>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center">
<div class="row">
<div class="userHeader">
<div class="userHeaderInfo">
<img class="userImg" th:src="${avatar}" alt="avatar">
<div class="userName">
<h3 class="h3"th:text="${ime}"/>
<img src="img/loc.png" alt="lokacija"> <span th:text="${lokacija}"/>
</div>
</div>
<div th:utext="${dugmeChange}"/>
<div th:utext="${dugme}"/>
</div>
</div>
<hr>
<div class="row">
<div id="userBorderLine" class="col-lg-2">
<h5 class="h5">Edukacija</h5>
<div th:utext="${edukacija}"/>
</div>
<!-- dodati atribut o korisniku -->
<div class="col-lg-10">
<h4 id="naslov" class="h4">O korisniku:</h4>
<p id="info" th:utext="${opis}"/>
</div>
<hr>
</div>
<div class="row">
<h4 id="skills" class="h4">Skills</h4>
<div id="tagovi" th:utext="${skills}"/>
</div>
<div><h6 class="h6">Email: </h6><p th:text="${email}"/></div>
<div><h6 class="h6">Broj tel: </h6><p th:text="${broj}"/></div>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<title>Praktikum OOP</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="Projekat/css/proposal.css">
</head>
<body>
<nav class="navbar sticky-top navbar-expand-lg navbar-dark bg-dark" aria-label="Eighth navbar example">
<div class="container">
<a class="navbar-brand" href="index.html">Praktikum OOP</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample07"
aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="index.html">Nadji posao</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Inbox</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Moj profil</a>
</li>
</ul>
</div>
</div>
</nav>
<!-- main container -->
<div id="main" class="container justify-content-center">
<div class="row">
<h3 class="h3">Uredi profil</h3>
<hr>
<div class="mb-3 row">
<label for="inputPassword" class="col-sm-2 col-form-label">Password</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="inputPassword">
</div>
<label for="exampleFormControlTextarea1" class="form-label">Example textarea</label>
<textarea class="form-control" id="exampleFormControlTextarea1" rows="3"></textarea>
<h4 id="skills" class="h4">Skills</h4>
<div id="tagovi">
<div class="tag">
Java
</div>
<div class="tag">
C#
</div>
<div class="tag">
Photoshop
</div>
<div class="tag">
Game Dev
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
integrity="sha384-cVKIPhGWiC2Al4u+LWgxfKTRIcfu0JTxR+EQDz/bgldoEyl4H0zUF0QKbrJ0EcQF"
crossorigin="anonymous"></script>
</body>
</html>
\ No newline at end of file
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class PraktikumOopApplicationTests {
@Test
void contextLoads() {
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment