31 Commits

Author SHA1 Message Date
Leon Noe Jovan
b19cfa6d48 added check if empty 2022-02-14 17:37:41 +01:00
msinkec
f898ee8d31 Finished manage institution site. Redone how cooperation history works. 2022-02-14 15:01:03 +01:00
Leon Noe Jovan
87f067b077 new menu, manage instutution reorganized 2022-02-13 15:47:19 +01:00
Leon Noe Jovan
e1b1d194fd new menu, manage instutution reorganized 2022-02-13 15:20:20 +01:00
Leon Noe Jovan
ab842809c7 Merge branch 'leon-redesign' of https://gitea.cjvt.si/webapps/portal-oddajanje-solar into leon-redesign 2022-02-12 16:38:37 +01:00
Leon Noe Jovan
e909ee8405 changes in history 2022-02-12 16:38:34 +01:00
msinkec
9ce19a34a7 Merge branch 'leon-redesign' of https://gitea.cjvt.si/mihasinkec/portal-oddajanje-solar into leon-redesign 2022-02-10 10:25:39 +01:00
msinkec
710abf74df endpoint permission updates for institutions, threw out add user from manage institution menu 2022-02-10 10:25:27 +01:00
Leon Noe Jovan
2de5727ea2 api for top upload graph 2022-01-23 22:53:11 +01:00
Leon Noe Jovan
30f96d4fdc nicer admin menu 2022-01-23 22:28:21 +01:00
Leon Noe Jovan
313f95fac8 Merge branch 'leon-redesign' of https://gitea.cjvt.si/webapps/portal-oddajanje-solar into leon-redesign 2022-01-23 22:16:24 +01:00
Leon Noe Jovan
20b2273623 added region to uploads history 2022-01-23 22:15:56 +01:00
msinkec
6cd69c5d4b server name config, top uploads for instituion, institution upload stats endpoint 2022-01-15 10:37:40 +01:00
Leon Noe Jovan
2bbeaacb76 manjsi popravki 2022-01-08 16:25:25 +01:00
msinkec
9f352da395 File codes missing letter fix. 2022-01-06 12:27:10 +01:00
msinkec
fe1285d455 Merge branch leon-redesign 2022-01-06 12:19:41 +01:00
msinkec
31c2d294fe Ekipa tab restructuring, downloaded file names are now codes. 2022-01-06 12:14:58 +01:00
Leon Noe Jovan
48230b623a success messages, graph 2022-01-05 19:33:43 +01:00
Leon Noe Jovan
6c1fdc06fc Merge branch 'leon-redesign' of https://gitea.cjvt.si/webapps/portal-oddajanje-solar into leon-redesign 2022-01-04 18:36:51 +01:00
Leon Noe Jovan
956c307b6c small fixes, added graph 2022-01-04 18:36:42 +01:00
msinkec
743ebba052 Pass len check fix. 2021-12-26 17:55:12 +01:00
msinkec
13a5fdd6f7 Pass len check fix, relative href and src. 2021-12-23 08:51:37 +01:00
msinkec
7c79891983 Added top uploads by user API endpoint. 2021-12-20 11:47:06 +01:00
msinkec
9e93d41bc3 Upload file codes, upload region. 2021-12-20 11:15:01 +01:00
Leon Noe Jovan
a72c5f03cf popravki 2021-12-15 21:23:26 +01:00
msinkec
eb00a806fc Merge push. 2021-12-14 15:36:54 +01:00
msinkec
f543beee1b Download uploaded files. 2021-12-14 15:36:36 +01:00
Leon Noe Jovan
adf8501263 review fixes 2021-12-13 21:01:28 +01:00
Leon Noe Jovan
8fae602660 added back to login button 2021-12-06 19:31:48 +01:00
Leon Noe Jovan
5242985df1 design updates 2021-12-04 18:49:20 +01:00
Leon Noe Jovan
b927a032f8 pogodbe, updates 2021-11-26 13:50:32 +01:00
45 changed files with 1962 additions and 810 deletions

201
app.py
View File

@@ -26,6 +26,7 @@ config = configparser.ConfigParser()
config.read('config.ini') config.read('config.ini')
config = config['DEFAULT'] config = config['DEFAULT']
SERVER_NAME = config['SERVER_NAME']
MAIL_HOST = config['MAIL_HOST'] MAIL_HOST = config['MAIL_HOST']
MAIL_LOGIN = config['MAIL_LOGIN'] MAIL_LOGIN = config['MAIL_LOGIN']
MAIL_PASS = config['MAIL_PASS'] MAIL_PASS = config['MAIL_PASS']
@@ -47,6 +48,8 @@ if not UPLOADS_DIR.exists:
UPLOADS_DIR.mkdir(parents=True) UPLOADS_DIR.mkdir(parents=True)
# Override configs with environment variables, if set # Override configs with environment variables, if set
if 'PORTALDS4DS1_SERVER_NAME' in os.environ:
SERVER_NAME = os.environ['PORTALDS4DS1_SERVER_NAME']
if 'PORTALDS4DS1_MAIL_HOST' in os.environ: if 'PORTALDS4DS1_MAIL_HOST' in os.environ:
MAIL_HOST = os.environ['PORTALDS4DS1_MAIL_HOST'] MAIL_HOST = os.environ['PORTALDS4DS1_MAIL_HOST']
if 'PORTALDS4DS1_MAIL_LOGIN' in os.environ: if 'PORTALDS4DS1_MAIL_LOGIN' in os.environ:
@@ -80,6 +83,7 @@ if 'PORTALDS4DS1_SQL_CONN_STR' in os.environ:
app = Flask(__name__) app = Flask(__name__)
app.config.update( app.config.update(
SERVER_NAME = SERVER_NAME,
SECRET_KEY = APP_SECRET_KEY, SECRET_KEY = APP_SECRET_KEY,
UPLOADED_PATH = UPLOADS_DIR, UPLOADED_PATH = UPLOADS_DIR,
MAX_CONTENT_LENGTH = MAX_UPLOAD_SIZE, MAX_CONTENT_LENGTH = MAX_UPLOAD_SIZE,
@@ -99,6 +103,7 @@ manager.add_command('db', MigrateCommand)
dropzone = Dropzone(app) dropzone = Dropzone(app)
upload_handler_solar = portal.solar.UploadHandlerSolar( upload_handler_solar = portal.solar.UploadHandlerSolar(
SERVER_NAME = SERVER_NAME,
UPLOADS_DIR=UPLOADS_DIR, UPLOADS_DIR=UPLOADS_DIR,
MAIL_HOST=MAIL_HOST, MAIL_HOST=MAIL_HOST,
MAIL_LOGIN=MAIL_LOGIN, MAIL_LOGIN=MAIL_LOGIN,
@@ -204,7 +209,7 @@ def solar_register_post():
if not password: if not password:
flash('Prazno polje za geslo.') flash('Prazno polje za geslo.')
return redirect('/register') return redirect('/register')
if len(password) > 8: if len(password) < 8:
flash('Geslo mora biti vsaj 8 znakov dolgo.') flash('Geslo mora biti vsaj 8 znakov dolgo.')
return redirect('/register') return redirect('/register')
if len(password) > 100: if len(password) > 100:
@@ -224,9 +229,11 @@ def solar_register_post():
user_id = portal.solar.register_new_user(name, email, password, active=False) user_id = portal.solar.register_new_user(name, email, password, active=False)
portal.solar.add_user_to_institution(user_id, institution_id, institution_role) portal.solar.add_user_to_institution(user_id, institution_id, institution_role)
portal.solar.add_cooperation_history_item(user_id, institution_id, institution_role)
portal.solar.send_admins_new_user_notification_mail(user_id, upload_handler_solar.config) portal.solar.send_admins_new_user_notification_mail(user_id, upload_handler_solar.config)
flash('Podatki so bili poslani v potrditev. Ko bo registracija potrjena, boste o tem obveščeni po e-mailu, ki ste ga posredovali zgoraj.') flash('Podatki so bili poslani v potrditev. Ko bo registracija potrjena, boste o tem obveščeni po e-mailu.')
return redirect('/login') return redirect('/login')
@@ -272,7 +279,7 @@ def solar(text):
return render_template('solar-zgodovina.html', upload_history=upload_items, uploader_names=uploader_names, return render_template('solar-zgodovina.html', upload_history=upload_items, uploader_names=uploader_names,
institution_names=institution_names, is_admin=is_admin, is_institution_coordinator=current_user_institution_coordinator) institution_names=institution_names, is_admin=is_admin, is_institution_coordinator=current_user_institution_coordinator)
elif text.startswith('pogodbe-institucije/') or text.startswith('pogodbe-ucencistarsi/'): elif text.startswith('pogodbe-institucije/') or text.startswith('pogodbe-ucencistarsi/'):
# Check for ownload contract request. # Check for download contract request.
match = re.match('^pogodbe-(institucije|ucencistarsi)/([a-z0-9_]+\.pdf)$', text) match = re.match('^pogodbe-(institucije|ucencistarsi)/([a-z0-9_]+\.pdf)$', text)
if match: if match:
contract_type = match.group(1) contract_type = match.group(1)
@@ -299,12 +306,15 @@ def solar(text):
enable_upload_school_contract = False enable_upload_school_contract = False
show_upload_form = False show_upload_form = False
collaborators = [] collaborators = []
institution_id = ""
cooperation_history = dict() cooperation_history = dict()
if current_user_institution: if current_user_institution:
collaborators = portal.solar.get_all_active_institution_users(current_user_institution.id) collaborators = portal.solar.get_all_active_institution_users(current_user_institution.id)
show_upload_form = True show_upload_form = True
contract_school = portal.solar.get_institution_contract(current_user_institution.id) contract_school = portal.solar.get_institution_contract(current_user_institution.id)
cooperation_history = portal.solar.get_institution_cooperation_history(current_user_institution.id) cooperation_history = portal.solar.get_institution_cooperation_history(current_user_institution.id)
institution_id = current_user_institution.id
if portal.solar.is_institution_coordinator(current_user_obj.id, current_user_institution.id): if portal.solar.is_institution_coordinator(current_user_obj.id, current_user_institution.id):
contracts_students = portal.solar.get_institution_student_contracts(current_user_institution.id) contracts_students = portal.solar.get_institution_student_contracts(current_user_institution.id)
enable_upload_school_contract = True enable_upload_school_contract = True
@@ -318,22 +328,30 @@ def solar(text):
collaborators=collaborators, collaborators=collaborators,
cooperation_history=cooperation_history, cooperation_history=cooperation_history,
user_id=current_user.id, user_id=current_user.id,
institution_id=institution_id,
is_admin=is_admin, is_institution_coordinator=current_user_institution_coordinator) is_admin=is_admin, is_institution_coordinator=current_user_institution_coordinator)
elif text.startswith('admin/') or text == 'admin': elif text.startswith('admin/') or text == 'admin':
users = portal.solar.get_all_users_join_institutions() users = portal.solar.get_all_users_join_institutions()
inactive_users = portal.solar.get_all_users_join_institutions(active=False) inactive_users = portal.solar.get_all_users_join_institutions(active=False)
solar_institutions = portal.solar.get_all_institutions() solar_institutions = portal.solar.get_all_institutions()
cooperation_history = portal.solar.get_cooperation_history()
uploads = portal.solar.get_all_upload_history(-1) uploads = portal.solar.get_all_upload_history(-1)
if is_admin: if is_admin:
return render_template('solar-admin.html', users=users, user_cooperation_history=cooperation_history, return render_template('solar-admin.html', users=users,
institutions=solar_institutions, inactive_users=inactive_users, uploads=uploads) institutions=solar_institutions, inactive_users=inactive_users, uploads=uploads)
elif text.startswith('manage-institution/') or text == 'manage-institution': elif text.startswith('manage-institution/') or text == 'manage-institution':
if portal.solar.is_institution_coordinator(current_user.id, current_user_institution.id): if portal.solar.is_institution_coordinator(current_user.id, current_user_institution.id):
solar_users = portal.solar.get_all_active_users() solar_users = portal.solar.get_all_active_users()
institution_users = portal.solar.get_all_active_institution_users(current_user_institution.id) institution_users = portal.solar.get_all_active_institution_users(current_user_institution.id)
return render_template('solar-manage-institution.html', users=solar_users,
institution_users=institution_users) role_map = dict()
for institution_user in institution_users:
role_map[institution_user.id] = portal.solar.get_user_institution_role_str(institution_user.id, current_user_institution.id)
return render_template('solar-manage-institution.html',
institution=current_user_institution,
users=solar_users,
institution_users=institution_users,
role_map=role_map)
return '', 404 return '', 404
@app.route('/pogodbe', methods=['POST']) @app.route('/pogodbe', methods=['POST'])
@@ -423,7 +441,7 @@ def solar_sendresetpass():
portal.solar.send_resetpass_mail(email, upload_handler_solar.config) portal.solar.send_resetpass_mail(email, upload_handler_solar.config)
flash('Povezava za ponastavitev gesla je bila poslana na vpisan email naslov.') flash('Povezava za ponastavitev gesla je bila poslana na vpisani e-naslov.')
return redirect(redirect_url()) return redirect(redirect_url())
@@ -455,10 +473,22 @@ def solar_resetpass_post(token):
@app.route('/topuploads') @app.route('/topuploads')
@login_required @login_required
def solar_topuploads_srednje(): def solar_topuploads():
return jsonify(portal.solar.get_top_uploading_institutions()) return jsonify(portal.solar.get_top_uploading_institutions())
@app.route('/topuploads-institution/<institution_id>')
@login_required
def solar_topuploads_institution(institution_id):
return jsonify(portal.solar.get_top_uploading_users(institution_id))
@app.route('/uploadstats-institution/<institution_id>')
@login_required
def solar_uploadstats_institution(institution_id):
return jsonify(portal.solar.get_institution_upload_stats(institution_id))
@app.route('/deluser', methods=['POST']) @app.route('/deluser', methods=['POST'])
@login_required @login_required
def solar_del_user(): def solar_del_user():
@@ -527,41 +557,41 @@ def merge_institutions():
flash('Instituciji uspešno združeni') flash('Instituciji uspešno združeni')
return redirect(redirect_url()) return redirect(redirect_url())
@app.route('/addcooperationhistoryitem', methods=['POST']) #@app.route('/addcooperationhistoryitem', methods=['POST'])
@login_required #@login_required
def add_cooperation_history_item(): #def add_cooperation_history_item():
if not portal.solar.is_admin(current_user.id): # if not portal.solar.is_admin(current_user.id):
return '', 404 # return '', 404
#
user_id = request.form.get('user') # user_id = request.form.get('user')
institution_id = request.form.get('institution') # institution_id = request.form.get('institution')
role = request.form.get('role') # role = request.form.get('role')
school_year = request.form.get('school-year') # school_year = request.form.get('school-year')
badge_text = request.form.get('badge-text') # badge_text = request.form.get('badge-text')
#
user = portal.solar.get_user_obj(user_id) # user = portal.solar.get_user_obj(user_id)
institution = portal.solar.get_institution_obj(institution_id) # institution = portal.solar.get_institution_obj(institution_id)
#
if not user: # if not user:
flash('Uporabnik s tem ID-jem ne obstaja.') # flash('Uporabnik s tem ID-jem ne obstaja.')
return redirect(redirect_url()) # return redirect(redirect_url())
#
if not institution: # if not institution:
flash('Institucija s tem ID-jem ne obstaja.') # flash('Institucija s tem ID-jem ne obstaja.')
return redirect(redirect_url()) # return redirect(redirect_url())
#
if not role in ['coordinator', 'mentor', 'other']: # if not role in ['coordinator', 'mentor', 'other']:
flash('Neveljavna vloga "{}".'.format(role)) # flash('Neveljavna vloga "{}".'.format(role))
return redirect(redirect_url()) # return redirect(redirect_url())
#
if not school_year or not re.match('[0-9]{4}/[0-9]{2}', school_year): # if not school_year or not re.match('[0-9]{4}/[0-9]{2}', school_year):
flash('Šolsko leto mora biti formata "2021/22".') # flash('Šolsko leto mora biti formata "2021/22".')
return redirect(redirect_url()) # return redirect(redirect_url())
#
portal.solar.add_cooperation_history_item(user_id, institution_id, role, school_year, badge_text) # portal.solar.add_cooperation_history_item(user_id, institution_id, role, school_year, badge_text)
#
flash('Vnos dodan.') # flash('Vnos dodan.')
return redirect(redirect_url()) # return redirect(redirect_url())
@app.route('/updateuploaditem', methods=['POST']) @app.route('/updateuploaditem', methods=['POST'])
@login_required @login_required
@@ -602,17 +632,17 @@ def update_upload_item():
return redirect(redirect_url()) return redirect(redirect_url())
@app.route('/delcooperationhistoryitem', methods=['POST']) #@app.route('/delcooperationhistoryitem', methods=['POST'])
@login_required #@login_required
def del_cooperation_history_item(): #def del_cooperation_history_item():
if not portal.solar.is_admin(current_user.id): # if not portal.solar.is_admin(current_user.id):
return '', 404 # return '', 404
#
entry_id = request.form.get('entry-id') # entry_id = request.form.get('entry-id')
portal.solar.del_cooperation_history_item(entry_id) # portal.solar.del_cooperation_history_item(entry_id)
#
flash('Vnos odstranjen.') # flash('Vnos odstranjen.')
return redirect(redirect_url()) # return redirect(redirect_url())
@app.route('/changeinstitutiondata', methods=['POST']) @app.route('/changeinstitutiondata', methods=['POST'])
@login_required @login_required
@@ -658,10 +688,36 @@ def change_user_email():
flash('Email spremenjen.') flash('Email spremenjen.')
return redirect(redirect_url()) return redirect(redirect_url())
@app.route('/changeuserrole-institution', methods=['POST'])
@login_required
def change_user_role_institution():
institution = portal.solar.get_user_institution(current_user.id)
if not portal.solar.is_admin(current_user.id):
# Institution coordinators can only assign roles of users in their own
# institution.
if institution and portal.solar.is_institution_coordinator(current_user.id, institution.id):
pass
else:
return '', 404
user_id = request.form.get('user-id')
role = request.form.get('role')
if role not in ['coordinator', 'mentor', 'other']:
flash('Neveljavna vloga.')
return redirect(redirect_url())
portal.solar.update_user_institution_role(user_id, institution.id, role)
portal.solar.add_cooperation_history_item(user_id, institution.id, role)
flash('Vloga v instituciji spremenjena.')
return redirect(redirect_url())
@app.route('/changeuserrole', methods=['POST']) @app.route('/changeuserrole', methods=['POST'])
@login_required @login_required
def change_user_role(): def change_user_role():
institution = portal.solar.get_user_institution(current_user.id)
if not portal.solar.is_admin(current_user.id): if not portal.solar.is_admin(current_user.id):
return '', 404 return '', 404
@@ -700,7 +756,7 @@ def add_user_institution_mapping():
if institution: if institution:
institution_id = institution.id institution_id = institution.id
if not (portal.solar.is_admin(current_user.id) or portal.solar.is_institution_coordinator(current_user.id, institution_id)): if not portal.solar.is_admin(current_user.id):
return '', 404 return '', 404
user_id = request.form['user_id'] user_id = request.form['user_id']
@@ -713,6 +769,7 @@ def add_user_institution_mapping():
return redirect(redirect_url()) return redirect(redirect_url())
portal.solar.add_user_to_institution(user_id, institution_id, role) portal.solar.add_user_to_institution(user_id, institution_id, role)
portal.solar.add_cooperation_history_item(user_id, institution_id, role)
flash('Uporabnik je bil dodeljen instituciji.') flash('Uporabnik je bil dodeljen instituciji.')
return redirect(redirect_url()) return redirect(redirect_url())
@@ -741,5 +798,37 @@ def handle_upload():
return upload_handler_solar.handle_upload(request, current_user.get_id()) return upload_handler_solar.handle_upload(request, current_user.get_id())
@app.route('/getuploadfile/<upload_id>/<file_hash>', methods=['GET'])
@login_required
def get_upload_file(upload_id, file_hash):
is_admin = current_user.role == 'admin'
current_user_institution = portal.solar.get_user_institution(current_user.id)
upload_obj = portal.solar.get_upload_object(upload_id)
if current_user_institution.id != upload_obj.institution:
return '', 404
file_hashes = upload_obj.upload_file_hashes
if file_hash not in upload_obj.upload_file_hashes:
return '', 404
prefix = file_hash[:2]
suffix = file_hash[2:]
safe_path = safe_join(str(upload_handler_solar.get_uploads_subdir('files')), prefix, suffix)
f_name = os.listdir(safe_path)[0]
safe_path = safe_join(safe_path, f_name)
f_suffix = f_name.split('.')[-1]
f_dlname = upload_obj.upload_file_codes[file_hashes.index(file_hash)]
if f_suffix in portal.solar.UploadHandlerSolar.ENABLED_FILETYPES:
f_dlname += '.' + f_suffix
try:
return send_file(safe_path, attachment_filename=f_dlname, as_attachment=True)
except FileNotFoundError:
return '', 404
if __name__ == '__main__': if __name__ == '__main__':
app.run(debug=True) app.run(debug=True)

View File

@@ -1,4 +1,5 @@
[DEFAULT] [DEFAULT]
SERVER_NAME=localhost:5000
SQL_CONN_STR=postgresql://portal:randompass123@localhost/portal SQL_CONN_STR=postgresql://portal:randompass123@localhost/portal
MAIL_HOST=posta.cjvt.si MAIL_HOST=posta.cjvt.si
MAIL_LOGIN=oddaja-besedil@cjvt.si MAIL_LOGIN=oddaja-besedil@cjvt.si
@@ -10,8 +11,6 @@ MAX_UPLOAD_SIZE=1000000000
MAX_FILES_PER_UPLOAD=30 MAX_FILES_PER_UPLOAD=30
UPLOADS_DIR=./uploads UPLOADS_DIR=./uploads
CONTRACT_CLIENT_CONTACT=Testko Tester CONTRACT_CLIENT_CONTACT=Testko Tester
DESC_PREVODI=<h2 id="subtitle">Prevodi</h2><p>Strojno prevajanje je ena od uporabnih jezikovnih tehnologij, saj omogoča hitro sporazumevanje med ljudmi iz različnih kultur in jezikovnih okolij. Več o razvoju slovenskega strojnega prevajalnika lahko preberete na tej <a href="https://slovenscina.eu/strojno-prevajanje">povezavi</a>. Za kakovosten strojni prevajalnik so ključnega pomena prevodi, iz kateri se algoritmi umetne inteligence naučijo prevajati. S prispevanjem besedil v korpus prevodov boste pomembno prispevali k razvoju slovenskega strojnega prevajalnika med angleščino in slovenščino. Več informacij o prispevanju besedil najdete <a href="https://slovenscina.eu/zbiranje-besedil">tukaj</a>.</p>
DESC_GIGAFIDA=<h2 id="subtitle">Gigafida</h2><p><a href="https://viri.cjvt.si/gigafida/">Gigafida</a> je referenčni korpus pisne slovenščine. Besedila so izbrana in strojno obdelana z namenom, da bi korpus kot vzorec sodobne standardne slovenščine lahko služil za jezikoslovne in druge humanistične raziskave, izdelavo sodobnih slovarjev, slovnic, učnih gradiv in razvoj jezikovnih tehnologij za slovenščino. S prispevanjem besedil v korpus Gigafida pomembno prispevate k razvoju sodobnih jezikovnih tehnologij za slovenski jezik.</p>
MAIL_SUBJECT=RSDO: pogodba za oddana besedila ({upload_id}) MAIL_SUBJECT=RSDO: pogodba za oddana besedila ({upload_id})
MAIL_BODY=Hvala, ker ste prispevali besedila in na ta način pomagali pri razvoju slovenskega jezika v digitalnem okolju. V prilogi vam pošiljamo pogodbo s seznamom naloženih datotek. MAIL_BODY=Hvala, ker ste prispevali besedila in na ta način pomagali pri razvoju slovenskega jezika v digitalnem okolju. V prilogi vam pošiljamo pogodbo s seznamom naloženih datotek.

View File

@@ -4,6 +4,7 @@ services:
build: . build: .
restart: always restart: always
environment: environment:
- PORTALDS4DS1_SERVER_NAME=localhost:5000
- PORTALDS4DS1_SQL_CONN_STR=postgresql://portal:randompass123@db/portal - PORTALDS4DS1_SQL_CONN_STR=postgresql://portal:randompass123@db/portal
- PORTALDS4DS1_MAIL_HOST=posta.cjvt.si - PORTALDS4DS1_MAIL_HOST=posta.cjvt.si
- PORTALDS4DS1_MAIL_LOGIN=oddaja-besedil@cjvt.si - PORTALDS4DS1_MAIL_LOGIN=oddaja-besedil@cjvt.si

View File

@@ -0,0 +1,36 @@
"""Altered cooperation history structure.
Revision ID: 0cf2d8f74766
Revises: c7bb822adf9f
Create Date: 2022-02-14 13:04:01.143637
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '0cf2d8f74766'
down_revision = 'c7bb822adf9f'
branch_labels = None
depends_on = None
def upgrade():
# Delete all rows
query = 'DELETE FROM user_cooperation;'
op.execute(query)
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('user_cooperation', sa.Column('timestamp', sa.DateTime(), nullable=False))
op.drop_column('user_cooperation', 'badge_text')
op.drop_column('user_cooperation', 'school_year')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('user_cooperation', sa.Column('school_year', sa.VARCHAR(), autoincrement=False, nullable=False))
op.add_column('user_cooperation', sa.Column('badge_text', sa.VARCHAR(), autoincrement=False, nullable=True))
op.drop_column('user_cooperation', 'timestamp')
# ### end Alembic commands ###

View File

@@ -0,0 +1,28 @@
"""Added upload file names column.
Revision ID: 0d9dd68fd94b
Revises: 44dae32b13af
Create Date: 2021-12-14 10:52:34.326600
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '0d9dd68fd94b'
down_revision = '44dae32b13af'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('upload_solar', sa.Column('upload_file_names', sa.ARRAY(sa.String()), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('upload_solar', 'upload_file_names')
# ### end Alembic commands ###

View File

@@ -0,0 +1,30 @@
"""Added upload file codes column.
Revision ID: c7bb822adf9f
Revises: 0d9dd68fd94b
Create Date: 2021-12-20 09:00:57.208921
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'c7bb822adf9f'
down_revision = '0d9dd68fd94b'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('upload_solar', sa.Column('region', sa.String(), nullable=True))
op.add_column('upload_solar', sa.Column('upload_file_codes', sa.ARRAY(sa.String()), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('upload_solar', 'upload_file_codes')
op.drop_column('upload_solar', 'region')
# ### end Alembic commands ###

View File

@@ -19,6 +19,7 @@ class UploadSolar(db.Model):
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=True) institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=True)
upload_hash = db.Column(db.String, nullable=False) upload_hash = db.Column(db.String, nullable=False)
timestamp = db.Column(db.DateTime, default=datetime.utcnow, nullable=False) timestamp = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
region = db.Column(db.String, nullable=True)
program = db.Column(db.String, nullable=True) program = db.Column(db.String, nullable=True)
subject = db.Column(db.String, nullable=True) subject = db.Column(db.String, nullable=True)
subject_custom = db.Column(db.String, nullable=True) subject_custom = db.Column(db.String, nullable=True)
@@ -28,6 +29,8 @@ class UploadSolar(db.Model):
school_year = db.Column(db.String, nullable=True) school_year = db.Column(db.String, nullable=True)
grammar_corrections = db.Column(db.String, nullable=True) grammar_corrections = db.Column(db.String, nullable=True)
upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True) upload_file_hashes = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True)
upload_file_names = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True)
upload_file_codes = db.Column(sqlalchemy.types.ARRAY(db.String), nullable=True)
class ContractsSolar(db.Model): class ContractsSolar(db.Model):
@@ -68,8 +71,7 @@ class UserCooperationHistory(db.Model):
user = db.Column(db.Integer, sqlalchemy.ForeignKey('registered_user.id'), nullable=False) user = db.Column(db.Integer, sqlalchemy.ForeignKey('registered_user.id'), nullable=False)
institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=False) institution = db.Column(db.Integer, sqlalchemy.ForeignKey('institution.id'), nullable=False)
role = db.Column(db.String, nullable=False) role = db.Column(db.String, nullable=False)
school_year = db.Column(db.String, nullable=False) timestamp = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
badge_text = db.Column(db.String, nullable=True)
class Institution(db.Model): class Institution(db.Model):

View File

@@ -6,15 +6,10 @@ import traceback
import ssl import ssl
from datetime import datetime from datetime import datetime
from sqlalchemy import desc from sqlalchemy import desc
from collections import Counter
from pathlib import Path from pathlib import Path
import imaplib
from smtplib import SMTP_SSL from smtplib import SMTP_SSL
import email
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.mime.application import MIMEApplication from email.mime.application import MIMEApplication
@@ -30,9 +25,9 @@ from . model import *
VALID_PROGRAMS = {'OS', 'SSG', 'MGP', 'ZG', 'NPI', 'SPI', 'SSI', 'PTI'} VALID_PROGRAMS = {'OS', 'SSG', 'MGP', 'ZG', 'NPI', 'SPI', 'SSI', 'PTI'}
VALID_SUBJECTS = {'slo', 'drug-jez', 'drug-druz', 'drug-narav', 'drug-strok', 'drug-izb'} VALID_SUBJECTS = {'SLO', 'DJP', 'DDP', 'DNP', 'DSP', 'DIP'}
VALID_TEXT_TYPES = {'esej-spis', 'prakticno', 'solski-test', 'delo-v-razredu'} VALID_TEXT_TYPES = {'E', 'PB', 'T', 'R'}
VALID_GRAMMAR_CORRECTIONS = {'popr-ne', 'brez-popr', 'popr-da'} VALID_GRAMMAR_CORRECTIONS = {'DD', 'N', 'DN'}
VALID_REGIONS = {'CE', 'GO', 'KK', 'KP', 'KR', 'LJ', 'MB', 'MS', 'NM', 'PO', 'SG'} VALID_REGIONS = {'CE', 'GO', 'KK', 'KP', 'KR', 'LJ', 'MB', 'MS', 'NM', 'PO', 'SG'}
#REGEX_EMAIL = re.compile('^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$') #REGEX_EMAIL = re.compile('^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$')
@@ -153,25 +148,49 @@ class UploadHandlerSolar():
timestamp = datetime.fromtimestamp(upload_metadata['timestamp']) timestamp = datetime.fromtimestamp(upload_metadata['timestamp'])
form_data = upload_metadata['form_data'] form_data = upload_metadata['form_data']
file_hashes = upload_metadata['file_hashes_dict'] file_hashes = upload_metadata['file_hashes_dict']
sorted_f_hashes = list(file_hashes.values()) sorted_file_items = sorted(file_hashes.items(), key=lambda item: item[1])
sorted_f_hashes.sort()
institution_id = get_user_institution(user_id).id institution_id = get_user_institution(user_id).id
region = form_data['regija']
program = form_data['program']
subject = form_data['predmet'],
subject_custom = form_data['predmet-custom'],
grade = form_data['letnik'],
text_type = form_data['vrsta'],
text_type_custom = form_data['vrsta-custom'],
school_year = form_data['solsko-leto'],
grammar_corrections = form_data['jezikovni-popravki'],
upload_file_codes = []
for i in range(len(sorted_file_items)):
file_code = '{}_{}_{}_{}_{}_{}_{}_{}'.format(
region,
program,
subject[0],
grade[0],
text_type[0],
school_year[0],
grammar_corrections[0],
i)
upload_file_codes.append(file_code)
model_obj = UploadSolar( model_obj = UploadSolar(
upload_user = user_id, upload_user = user_id,
institution = institution_id, institution = institution_id,
upload_hash=upload_metadata['upload_id'], upload_hash=upload_metadata['upload_id'],
timestamp=timestamp, timestamp=timestamp,
program=form_data['program'], region=region,
subject=form_data['predmet'], program=program,
subject_custom=form_data['predmet-custom'], subject=subject,
grade=form_data['letnik'], subject_custom=subject_custom,
text_type=form_data['vrsta'], grade=grade,
text_type_custom=form_data['vrsta-custom'], text_type=text_type,
school_year=form_data['solsko-leto'], text_type_custom=text_type_custom,
grammar_corrections=form_data['jezikovni-popravki'], school_year=school_year,
upload_file_hashes=sorted_f_hashes grammar_corrections=grammar_corrections,
upload_file_hashes=[x[1] for x in sorted_file_items],
upload_file_names=[x[0] for x in sorted_file_items],
upload_file_codes=upload_file_codes,
) )
UploadHandlerSolar.store_model(model_obj) UploadHandlerSolar.store_model(model_obj)
@@ -217,7 +236,7 @@ class UploadHandlerSolar():
# Store to database. # Store to database.
self.store_metadata(upload_metadata, user_id) self.store_metadata(upload_metadata, user_id)
return 'Uspešno ste oddali datotek(e). Št. datotek: {}'.format(len(request.files)) return 'Število uspešno oddanih datotek: {}. Podatki o oddaji so na voljo v zavihku Zgodovina sodelovanja.'.format(len(request.files))
def handle_contract_upload(self, request, user_id): def handle_contract_upload(self, request, user_id):
contract_type = request.form['tip-pogodbe'] contract_type = request.form['tip-pogodbe']
@@ -281,6 +300,7 @@ class UploadHandlerSolar():
@staticmethod @staticmethod
def check_form(form): def check_form(form):
region = form['regija']
program = form['program'] program = form['program']
predmet = form['predmet'] predmet = form['predmet']
letnik = int(form['letnik']) letnik = int(form['letnik'])
@@ -288,6 +308,8 @@ class UploadHandlerSolar():
solsko_leto = form['solsko-leto'] solsko_leto = form['solsko-leto']
jezikovni_popravki = form['jezikovni-popravki'] jezikovni_popravki = form['jezikovni-popravki']
if region not in VALID_REGIONS:
return 'Invalid region "{}"'.format(region)
if program not in VALID_PROGRAMS: if program not in VALID_PROGRAMS:
return 'Invalid program "{}"'.format(program) return 'Invalid program "{}"'.format(program)
if predmet not in VALID_SUBJECTS: if predmet not in VALID_SUBJECTS:
@@ -392,6 +414,9 @@ def get_upload_history(user_id, n=20):
def get_institution_upload_history(institution_id, n=20): def get_institution_upload_history(institution_id, n=20):
return UploadSolar.query.filter_by(institution=institution_id).order_by(desc(UploadSolar.timestamp)).limit(n).all() return UploadSolar.query.filter_by(institution=institution_id).order_by(desc(UploadSolar.timestamp)).limit(n).all()
def get_upload_object(upload_id):
return UploadSolar.query.filter_by(id=upload_id).first()
def get_all_upload_history(n=20): def get_all_upload_history(n=20):
if n == -1: if n == -1:
return UploadSolar.query.order_by(desc(UploadSolar.timestamp)).all() return UploadSolar.query.order_by(desc(UploadSolar.timestamp)).all()
@@ -432,6 +457,41 @@ def get_top_uploading_institutions():
return dict(sorted(res.items(), key=lambda x:x[1], reverse=True)) return dict(sorted(res.items(), key=lambda x:x[1], reverse=True))
def get_top_uploading_users(institution_id):
res = dict()
users = get_all_active_institution_users(institution_id)
for user in users:
uploads = UploadSolar.query.filter_by(upload_user=user.id).all()
for upload in uploads:
if user.name not in res:
res[user.name] = 0
res[user.name] += len(upload.upload_file_hashes)
if len(res) >= 5:
return dict(sorted(res.items(), key=lambda x:x[1], reverse=True)[:5])
return dict(sorted(res.items(), key=lambda x:x[1], reverse=True))
def get_institution_upload_stats(institution_id):
res = {
'region': [],
'program': [],
}
# Region
for region in VALID_REGIONS:
count = UploadSolar.query.filter_by(institution=institution_id, region=region).count()
res['region'].append((region, count))
res['region'] = sorted(res['region'], key=lambda x:x[1], reverse=True)
# Program
for program in VALID_PROGRAMS:
count = UploadSolar.query.filter_by(institution=institution_id, program=program).count()
res['program'].append((program, count))
res['program'] = sorted(res['program'], key=lambda x:x[1], reverse=True)
return res
def get_all_active_users(): def get_all_active_users():
# TODO: do filtering purely within an SQL query # TODO: do filtering purely within an SQL query
res = [] res = []
@@ -441,8 +501,9 @@ def get_all_active_users():
res.append(user) res.append(user)
return res return res
def update_upload_item(item_id, program, subject, subject_custom, grade, text_type, text_type_custom, school_year, grammar_corrections): def update_upload_item(item_id, region, program, subject, subject_custom, grade, text_type, text_type_custom, school_year, grammar_corrections):
rowcount = db.session.query(UploadSolar).filter_by(id=item_id).update({ rowcount = db.session.query(UploadSolar).filter_by(id=item_id).update({
'region': region,
'program': program, 'program': program,
'subject': subject, 'subject': subject,
'subject_custom': subject_custom, 'subject_custom': subject_custom,
@@ -467,20 +528,48 @@ def get_institution_contract(institution_id):
def get_institution_cooperation_history(institution_id): def get_institution_cooperation_history(institution_id):
#return CooperationToken.query.join(UserCooperationTokenMapping, items = db.session.query(UserCooperationHistory.role,
# UserCooperationTokenMapping.cooperation_token == CooperationToken.id).filter(UserCooperationTokenMapping.user == user_id).all() UserCooperationHistory.timestamp,
# RegisteredUser.id,
res = dict() RegisteredUser.name
).select_from(
UserCooperationHistory,
).join(
RegisteredUser,
UserCooperationHistory.user == RegisteredUser.id,
).filter(
UserCooperationHistory.institution == institution_id,
).order_by(UserCooperationHistory.timestamp.desc()).all()
uch_rows = UserCooperationHistory.query.filter_by(institution=institution_id).order_by(UserCooperationHistory.school_year.desc()).all()
for row in uch_rows: res = []
if row.user not in res:
res[row.user] = { prev_schoolyear = None
'coordinator': [], item_buff = []
'mentor': [], users_seen = set()
'other': [] for item in items:
} timestamp = item.timestamp
res[row.user][row.role].append((row.school_year, row.badge_text)) year = timestamp.year
month = timestamp.month
if month >= 9 :
school_year = '{}/{}'.format(year, str(year+1)[-2:])
else:
school_year = '{}/{}'.format(year-1, str(year)[-2:])
if school_year != prev_schoolyear:
if len(item_buff) > 0:
res.append((prev_schoolyear, item_buff))
prev_schoolyear = school_year
item_buff = []
users_seen = set()
if not item.id in users_seen:
users_seen.add(item.id)
item_buff.append(item)
if len(item_buff) > 0:
res.append((prev_schoolyear, item_buff))
return res return res
@@ -489,21 +578,20 @@ def get_cooperation_history():
return UserCooperationHistory.query.all() return UserCooperationHistory.query.all()
def add_cooperation_history_item(user_id, institution_id, role, school_year, badge_text): def add_cooperation_history_item(user_id, institution_id, role):
model_obj = UserCooperationHistory( model_obj = UserCooperationHistory(
user=user_id, user=user_id,
institution=institution_id, institution=institution_id,
role=role, role=role,
school_year=school_year, timestamp=datetime.now()
badge_text=badge_text
) )
db.session.add(model_obj) db.session.add(model_obj)
db.session.commit() db.session.commit()
return model_obj.id return model_obj.id
def del_cooperation_history_item(entry_id): #def del_cooperation_history_item(entry_id):
db.session.query(UserCooperationHistory).filter_by(id=entry_id).delete() # db.session.query(UserCooperationHistory).filter_by(id=entry_id).delete()
db.session.commit() # db.session.commit()
def has_user_corpus_access(user_id, corpus_name): def has_user_corpus_access(user_id, corpus_name):
user = RegisteredUser.query.filter_by(id=user_id).first() user = RegisteredUser.query.filter_by(id=user_id).first()
@@ -539,7 +627,6 @@ def get_user_obj_by_email(email):
def get_institution_obj(institution_id): def get_institution_obj(institution_id):
return Institution.query.filter_by(id=institution_id).first() return Institution.query.filter_by(id=institution_id).first()
def get_institution_obj_by_name(institution_name): def get_institution_obj_by_name(institution_name):
return Institution.query.filter_by(name=institution_name).first() return Institution.query.filter_by(name=institution_name).first()
@@ -608,6 +695,12 @@ def update_user_role(user_id, role):
return rowcount return rowcount
def update_user_institution_role(user_id, institution_id, role):
rowcount = db.session.query(UserInstitutionMapping).filter_by(user=user_id, institution=institution_id).update({'role': role})
db.session.commit()
return rowcount
def update_user_email(user_id, new_email): def update_user_email(user_id, new_email):
rowcount = db.session.query(RegisteredUser).filter_by(id=user_id).update({'email': new_email}) rowcount = db.session.query(RegisteredUser).filter_by(id=user_id).update({'email': new_email})
db.session.commit() db.session.commit()
@@ -650,6 +743,22 @@ def del_user_from_institution(user_id, institution_id):
db.session.commit() db.session.commit()
def get_user_institution_role_str(user_id, institution_id):
res = UserInstitutionMapping.query.filter_by(
user=user_id
).filter_by(
institution=institution_id
).first()
if not res:
return ''
role_str_map = {
'coordinator': 'Koordinator/-ka',
'mentor': 'Mentor/-ica',
'other': 'Druga vloga'
}
return role_str_map[res.role]
def get_all_active_users(): def get_all_active_users():
return RegisteredUser.query.filter_by(active=True).order_by(RegisteredUser.id).all() return RegisteredUser.query.filter_by(active=True).order_by(RegisteredUser.id).all()
@@ -664,7 +773,6 @@ def get_all_users_join_institutions(active=True):
RegisteredUser.id == UserInstitutionMapping.user).filter(RegisteredUser.active == active).order_by(RegisteredUser.id).all() RegisteredUser.id == UserInstitutionMapping.user).filter(RegisteredUser.active == active).order_by(RegisteredUser.id).all()
def get_all_active_institution_users(institution_id): def get_all_active_institution_users(institution_id):
return RegisteredUser.query.filter_by(active=True).join(UserInstitutionMapping, return RegisteredUser.query.filter_by(active=True).join(UserInstitutionMapping,
RegisteredUser.id == UserInstitutionMapping.user).filter(UserInstitutionMapping.institution == institution_id).all() RegisteredUser.id == UserInstitutionMapping.user).filter(UserInstitutionMapping.institution == institution_id).all()
@@ -748,8 +856,7 @@ def send_resetpass_mail(email, config):
body = ''' body = '''
Zahtevali ste ponastavitev gesla vašega uporabniškega računa. Zahtevali ste ponastavitev gesla vašega uporabniškega računa.
Geslo lahko ponastavite na naslednji povezavi: https://zbiranje.slovenscina.eu/solar/resetpass/{}'''.format(jwt_token) Geslo lahko ponastavite na naslednji povezavi: https://{}/resetpass/{}'''.format(config['SERVER_NAME'], jwt_token)
message = MIMEMultipart() message = MIMEMultipart()
message['From'] = config['MAIL_LOGIN'] message['From'] = config['MAIL_LOGIN']
message['To'] = email message['To'] = email
@@ -816,3 +923,4 @@ def send_user_activation_mail(user_id, config):
except Exception: except Exception:
traceback.print_exc() traceback.print_exc()

158
static/css/contracts.css Normal file
View File

@@ -0,0 +1,158 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
.contract-item {
position: relative;
margin-left: 3rem;
border-bottom: 1px solid #C4C4C4;
padding-bottom: 1.25rem; }
.contract-item .contract-item-icon {
position: absolute;
left: -3rem;
top: 0;
width: 2rem;
height: 2rem; }
.contract-item .contract-item-title {
font-weight: 500;
font-size: 0.875rem;
line-height: 1rem; }
.contract-item .contract-item-date {
font-weight: normal;
font-size: 0.625rem;
line-height: 0.75rem;
text-transform: uppercase; }
.contract-item .contract-item-download {
position: absolute;
right: 0;
top: 1rem;
font-size: 0.75rem;
line-height: 0.825rem;
text-transform: uppercase;
color: #006CB7;
text-decoration: none; }
.team-item {
background: white;
width: 100%;
padding-left: 1rem;
position: relative; }
.team-item .team-item-name {
line-height: 3.25rem; }
.team-item .team-item-name .team-item-role {
color: #848C90;
margin-left: 1rem; }
/*# sourceMappingURL=contracts.css.map */

View File

@@ -0,0 +1,7 @@
{
"version": 3,
"mappings": "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",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","contracts.scss"],
"names": [],
"file": "contracts.css"
}

51
static/css/contracts.scss Normal file
View File

@@ -0,0 +1,51 @@
@import "slovenscina-elements.scss";
.contract-item {
position:relative;
margin-left:3rem;
border-bottom: 1px solid $grey;
padding-bottom:1.25rem;
.contract-item-icon {
position:absolute;
left:-3rem;
top:0;
width:2rem;
height:2rem;
}
.contract-item-title {
font-weight: 500;
font-size: 0.875rem;
line-height: 1rem;
}
.contract-item-date {
font-weight: normal;
font-size: 0.625rem;
line-height: 0.75rem;
text-transform: uppercase;
}
.contract-item-download {
position:absolute;
right:0;
top:1rem;
font-size: 0.75rem;
line-height: 0.825rem;
text-transform: uppercase;
color:$blue;
text-decoration: none;
}
}
.team-item {
background:white;
width:100%;
padding-left:1rem;
position:relative;
.team-item-name {
line-height:3.25rem;
.team-item-role {
color:$grey-dark;
margin-left:1rem;
}
}
}

View File

@@ -46,11 +46,15 @@ em {
transition: opacity 0.3s ease-out; } transition: opacity 0.3s ease-out; }
.btn:hover { .btn:hover {
opacity: 0.8; } opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel { .panel {
background: #F5F5F5; background: #F5F5F5;
padding: 40px 60px; padding: 40px 60px;
border-radius: 20px; } border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo { .panel .panel-logo {
position: absolute; position: absolute;
top: -60px; top: -60px;
@@ -80,13 +84,21 @@ em {
.alert { .alert {
position: relative; position: relative;
color: #8D3D3D; } color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img { .alert img {
position: relative; position: relative;
top: 0.25rem; top: 0.25rem;
width: 1.8rem; } width: 1.8rem; }
.alert p { .alert p {
position: absolute; position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem; left: 3rem;
top: 0; top: 0;
margin: 0; margin: 0;
@@ -123,6 +135,10 @@ em {
border: 1px solid #B6BEC3; border: 1px solid #B6BEC3;
padding: 0.75rem 1rem; padding: 0.75rem 1rem;
width: 100%; } width: 100%; }
.form-wrapper input[type="radio"] {
float: left;
margin: 0;
margin-right: 0.5rem; }
.form-wrapper .dropzone { .form-wrapper .dropzone {
box-sizing: border-box; box-sizing: border-box;
padding: 0.5rem; padding: 0.5rem;
@@ -151,7 +167,7 @@ em {
position: absolute; position: absolute;
left: 1rem; left: 1rem;
top: 1rem; top: 1rem;
background: url("/static/image/file.svg"); background: url(/static/image/file.svg);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
width: 2rem; width: 2rem;
@@ -161,11 +177,15 @@ em {
.form-wrapper .dz-preview.dz-file-preview .dz-details .dz-filename { .form-wrapper .dz-preview.dz-file-preview .dz-details .dz-filename {
position: absolute; position: absolute;
top: 1.5rem; top: 1.5rem;
left: 1.5rem; } left: 4rem;
width: 50%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis; }
.form-wrapper .dz-preview.dz-file-preview .dz-details .dz-size { .form-wrapper .dz-preview.dz-file-preview .dz-details .dz-size {
position: absolute; position: absolute;
top: 1rem; top: 1.5rem;
right: 1rem; } right: 2.5rem; }
.form-wrapper .dz-preview.dz-file-preview .dz-success-mark, .form-wrapper .dz-preview.dz-file-preview .dz-error-mark { .form-wrapper .dz-preview.dz-file-preview .dz-success-mark, .form-wrapper .dz-preview.dz-file-preview .dz-error-mark {
display: none; } display: none; }
.form-wrapper .dz-preview.dz-file-preview .dz-progress { .form-wrapper .dz-preview.dz-file-preview .dz-progress {
@@ -179,5 +199,14 @@ em {
height: 20px; height: 20px;
display: inline-block; display: inline-block;
background: #006CB7; } background: #006CB7; }
.form-wrapper .dz-preview.dz-file-preview .dz-remove {
position: absolute;
top: 1.5rem;
right: 1rem;
width: 1rem;
height: 1rem;
background: url(/static/image/trash.svg);
background-repeat: no-repeat;
background-position: center; }
/*# sourceMappingURL=form.css.map */ /*# sourceMappingURL=form.css.map */

View File

@@ -1,6 +1,6 @@
{ {
"version": 3, "version": 3,
"mappings": "AAAQ,+IAAuI;AAa/I,IAAK;EACH,WAAW,EAAE,oBAAoB;EACjC,SAAS,EAAC,IAAI;EACd,KAAK,EAZC,OAAO;;AAef,IAAK;EACH,SAAS,EAAC,IAAI;EACd,OAAO,EAAC,CAAC;EACT,MAAM,EAAC,CAAC;;ACpBV,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,KAAK,EDLA,OAAO;;ACOd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,KAAK,EDbA,OAAO;;ACgBd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;;AAGnB,EAAG;EACD,WAAW,EAAE,GAAG;;AAGlB,IAAK;EACH,MAAM,EAAC,IAAI;EACX,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,QAAQ;EACjB,KAAK,EAAC,KAAK;EACX,UAAU,EDhCL,OAAO;ECiCZ,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,QAAQ;EACnB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,qBAAqB;EACjC,UAAQ;IACN,OAAO,EAAE,GAAG;;AAMhB,MAAO;EACL,UAAU,EDxCJ,OAAO;ECyCb,OAAO,EAAE,SAAS;EAClB,aAAa,EAAE,IAAI;EACnB,kBAAY;IACV,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAE,KAAK;IACV,IAAI,EAAC,CAAC;IACN,KAAK,EAAC,CAAC;IACP,OAAO,EAAC,KAAK;IACb,MAAM,EAAC,IAAI;IACX,UAAU,EDlDN,OAAO;ICmDX,OAAO,EAAC,SAAS;IACjB,KAAK,EAAE,KAAK;IACZ,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,MAAM;;AAKtB,KAAM;EACJ,UAAU,ED/DL,OAAO;ECgEZ,MAAM,EAAC,GAAG;EACV,KAAK,EAAC,KAAK;EACX,MAAM,EAAE,IAAI;;AAGd,QAAS;EACP,OAAO,EAAC,KAAK;EACb,UAAU,EAAE,KAAK;EACjB,SAAS,EAAC,IAAI;EACd,eAAe,EAAE,IAAI;EACrB,KAAK,ED7EA,OAAO;EC8EZ,cAAc,EAAE,SAAS;;AAG3B,MAAO;EACL,QAAQ,EAAC,QAAQ;EACjB,KAAK,EDlFD,OAAO;ECmFX,UAAI;IACF,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAC,OAAO;IACX,KAAK,EAAC,MAAM;EAEd,QAAE;IACA,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAC,IAAI;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAC,CAAC;IACR,cAAc,EAAE,SAAS;;AAI7B,aAAc;EACZ,UAAU,EAAC,KAAK;EAChB,MAAM,EAAE,iBAAsB;EAC9B,UAAU,EAAE,UAAU;EACtB,aAAa,EAAE,GAAG;EAClB,kBAAK;IACH,UAAU,EAAC,MAAM;IACjB,UAAU,EDjGN,OAAO;ICkGX,aAAa,EAAE,GAAG;;AC1GtB,aAAc;EACZ,aAAa,EAAC,IAAI;EAClB,mBAAM;IACJ,OAAO,EAAC,KAAK;IACb,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,OAAO;IAClB,WAAW,EAAE,QAAQ;IACrB,cAAc,EAAE,SAAS;EAE3B,oBAAO;IACL,OAAO,EAAC,KAAK;IACb,UAAU,EAAE,OAAO;IACnB,MAAM,EAAE,iBAAsB;IAC9B,OAAO,EAAE,YAAY;IACrB,KAAK,EAAC,IAAI;EAEZ,gCAAmB;IACjB,UAAU,EAAE,UAAU;IACtB,OAAO,EAAC,KAAK;IACb,UAAU,EAAE,OAAO;IACnB,MAAM,EAAE,iBAAsB;IAC9B,OAAO,EAAE,YAAY;IACrB,KAAK,EAAC,IAAI;EAEZ,uBAAU;IACR,UAAU,EAAE,UAAU;IACtB,OAAO,EAAC,MAAM;IACd,MAAM,EAAC,MAAM;IACb,UAAU,EAAC,OAAO;IAClB,8CAAuB;MACrB,UAAU,EAAE,UAAU;MACtB,OAAO,EAAE,KAAK;MACd,MAAM,EAAC,MAAM;MACb,UAAU,EAAE,MAAM;MAClB,MAAM,EAAC,gBAAgB;MACvB,mDAAK;QACH,OAAO,EAAE,YAAY;QACrB,UAAU,EFrCX,OAAO;QEsCN,aAAa,EAAE,GAAG;QAClB,KAAK,EAAC,KAAK;QACX,OAAO,EAAE,cAAc;QACvB,UAAU,EAAC,MAAM;QACjB,MAAM,EAAE,OAAO;EAIrB,yCAA4B;IAC1B,QAAQ,EAAC,QAAQ;IACjB,UAAU,EAAC,KAAK;IAChB,MAAM,EAAC,MAAM;IACb,UAAU,EAAC,IAAI;IACf,mDAAU;MACR,QAAQ,EAAC,QAAQ;MACjB,IAAI,EAAC,IAAI;MACT,GAAG,EAAC,IAAI;MACR,UAAU,EAAE,6BAA6B;MACzC,iBAAiB,EAAE,SAAS;MAC5B,mBAAmB,EAAE,MAAM;MAC3B,KAAK,EAAC,IAAI;MACV,MAAM,EAAC,IAAI;MACX,uDAAI;QACF,OAAO,EAAE,IAAI;IAIf,kEAAa;MACX,QAAQ,EAAC,QAAQ;MACjB,GAAG,EAAC,MAAM;MACV,IAAI,EAAC,MAAM;IAEb,8DAAS;MACP,QAAQ,EAAC,QAAQ;MACjB,GAAG,EAAC,IAAI;MACR,KAAK,EAAC,IAAI;IAId,oHAAgC;MAAC,OAAO,EAAC,IAAI;IAC7C,sDAAa;MACX,QAAQ,EAAC,QAAQ;MACjB,IAAI,EAAC,GAAG;MACR,GAAG,EAAE,MAAM;MACX,KAAK,EAAC,GAAG;MACT,aAAa,EAAE,IAAI;MACnB,QAAQ,EAAE,MAAM;MAChB,iEAAW;QACT,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,YAAY;QACrB,UAAU,EFxFX,OAAO", "mappings": "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",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","form.scss"], "sources": ["slovenscina-theme.scss","slovenscina-elements.scss","form.scss"],
"names": [], "names": [],
"file": "form.css" "file": "form.css"

View File

@@ -24,6 +24,11 @@
padding: 0.75rem 1rem; padding: 0.75rem 1rem;
width:100%; width:100%;
} }
input[type="radio"] {
float:left;
margin:0;
margin-right:0.5rem;
}
.dropzone { .dropzone {
box-sizing: border-box; box-sizing: border-box;
padding:0.5rem; padding:0.5rem;
@@ -55,7 +60,7 @@
position:absolute; position:absolute;
left:1rem; left:1rem;
top:1rem; top:1rem;
background: url("/static/image/file.svg"); background: url(/static/image/file.svg);
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
width:2rem; width:2rem;
@@ -68,12 +73,16 @@
.dz-filename { .dz-filename {
position:absolute; position:absolute;
top:1.5rem; top:1.5rem;
left:1.5rem; left:4rem;
width:50%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
} }
.dz-size { .dz-size {
position:absolute; position:absolute;
top:1rem; top:1.5rem;
right:1rem; right:2.5rem;
} }
} }
@@ -91,5 +100,15 @@
background:$blue; background:$blue;
} }
} }
.dz-remove {
position:absolute;
top:1.5rem;
right:1rem;
width:1rem;
height:1rem;
background: url(/static/image/trash.svg);
background-repeat: no-repeat;
background-position: center;
}
} }
} }

View File

@@ -46,11 +46,15 @@ em {
transition: opacity 0.3s ease-out; } transition: opacity 0.3s ease-out; }
.btn:hover { .btn:hover {
opacity: 0.8; } opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel { .panel {
background: #F5F5F5; background: #F5F5F5;
padding: 40px 60px; padding: 40px 60px;
border-radius: 20px; } border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo { .panel .panel-logo {
position: absolute; position: absolute;
top: -60px; top: -60px;
@@ -80,13 +84,21 @@ em {
.alert { .alert {
position: relative; position: relative;
color: #8D3D3D; } color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img { .alert img {
position: relative; position: relative;
top: 0.25rem; top: 0.25rem;
width: 1.8rem; } width: 1.8rem; }
.alert p { .alert p {
position: absolute; position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem; left: 3rem;
top: 0; top: 0;
margin: 0; margin: 0;
@@ -159,4 +171,55 @@ p.subtitle {
line-height: 150%; line-height: 150%;
margin-top: 0.5rem; } margin-top: 0.5rem; }
/* Style The Dropdown Button */
.dropbtn {
color: white;
line-height: 4rem;
border: none;
cursor: pointer;
background: none;
padding: 0 1rem; }
.dropbtn img {
position: relative;
top: 0.75rem; }
/* The container <div> - needed to position the dropdown content */
.dropdown {
margin-right: 1rem;
float: right;
display: inline-block;
position: relative; }
/* Dropdown Content (Hidden by Default) */
.dropdown-content {
display: none;
position: absolute;
right: 0;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 1; }
/* Links inside the dropdown */
.dropdown-content a {
color: #848C90;
padding: 0.5rem 1rem;
text-decoration: none;
display: block; }
.dropdown-content a:hover {
background-color: #f1f1f1;
cursor: pointer; }
.dropdown-content hr {
margin-top: 0;
margin-bottom: 0;
border-top: 1px solid #B6BEC3; }
/* Show the dropdown menu on hover */
.dropdown:hover .dropdown-content {
display: block; }
/* Change the background color of the dropdown button when the dropdown content is shown */
.dropdown:hover .dropbtn {
background: rgba(0, 0, 0, 0.2); }
/*# sourceMappingURL=header.css.map */ /*# sourceMappingURL=header.css.map */

View File

@@ -1,6 +1,6 @@
{ {
"version": 3, "version": 3,
"mappings": "AAAQ,+IAAuI;AAa/I,IAAK;EACH,WAAW,EAAE,oBAAoB;EACjC,SAAS,EAAC,IAAI;EACd,KAAK,EAZC,OAAO;;AAef,IAAK;EACH,SAAS,EAAC,IAAI;EACd,OAAO,EAAC,CAAC;EACT,MAAM,EAAC,CAAC;;ACpBV,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,KAAK,EDLA,OAAO;;ACOd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,KAAK,EDbA,OAAO;;ACgBd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;;AAGnB,EAAG;EACD,WAAW,EAAE,GAAG;;AAGlB,IAAK;EACH,MAAM,EAAC,IAAI;EACX,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,QAAQ;EACjB,KAAK,EAAC,KAAK;EACX,UAAU,EDhCL,OAAO;ECiCZ,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,QAAQ;EACnB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,qBAAqB;EACjC,UAAQ;IACN,OAAO,EAAE,GAAG;;AAMhB,MAAO;EACL,UAAU,EDxCJ,OAAO;ECyCb,OAAO,EAAE,SAAS;EAClB,aAAa,EAAE,IAAI;EACnB,kBAAY;IACV,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAE,KAAK;IACV,IAAI,EAAC,CAAC;IACN,KAAK,EAAC,CAAC;IACP,OAAO,EAAC,KAAK;IACb,MAAM,EAAC,IAAI;IACX,UAAU,EDlDN,OAAO;ICmDX,OAAO,EAAC,SAAS;IACjB,KAAK,EAAE,KAAK;IACZ,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,MAAM;;AAKtB,KAAM;EACJ,UAAU,ED/DL,OAAO;ECgEZ,MAAM,EAAC,GAAG;EACV,KAAK,EAAC,KAAK;EACX,MAAM,EAAE,IAAI;;AAGd,QAAS;EACP,OAAO,EAAC,KAAK;EACb,UAAU,EAAE,KAAK;EACjB,SAAS,EAAC,IAAI;EACd,eAAe,EAAE,IAAI;EACrB,KAAK,ED7EA,OAAO;EC8EZ,cAAc,EAAE,SAAS;;AAG3B,MAAO;EACL,QAAQ,EAAC,QAAQ;EACjB,KAAK,EDlFD,OAAO;ECmFX,UAAI;IACF,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAC,OAAO;IACX,KAAK,EAAC,MAAM;EAEd,QAAE;IACA,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAC,IAAI;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAC,CAAC;IACR,cAAc,EAAE,SAAS;;AAI7B,aAAc;EACZ,UAAU,EAAC,KAAK;EAChB,MAAM,EAAE,iBAAsB;EAC9B,UAAU,EAAE,UAAU;EACtB,aAAa,EAAE,GAAG;EAClB,kBAAK;IACH,UAAU,EAAC,MAAM;IACjB,UAAU,EDjGN,OAAO;ICkGX,aAAa,EAAE,GAAG;;AC1GtB,IAAK;EACH,UAAU,EFKJ,OAAO;;AEFf,MAAO;EACL,QAAQ,EAAC,KAAK;EACd,GAAG,EAAC,CAAC;EACL,KAAK,EAAC,IAAI;EACV,MAAM,EAAC,IAAI;EACX,UAAU,EFTL,OAAO;EEUZ,OAAO,EAAE,OAAO;EAChB,UAAU,EAAE,+BAA+B;;AAI3C,YAAM;EACJ,OAAO,EAAE,YAAY;EACrB,OAAO,EAAC,aAAa;EACrB,gBAAI;IACF,MAAM,EAAC,IAAI;AAGf,kBAAY;EACV,KAAK,EAAC,KAAK;EACX,OAAO,EAAE,aAAa;EACtB,OAAO,EAAE,YAAY;EACrB,oBAAE;IACA,WAAW,EAAC,IAAI;IAChB,OAAO,EAAE,YAAY;IACrB,KAAK,EAAC,KAAK;IACX,eAAe,EAAE,IAAI;;AAK3B,QAAS;EACP,UAAU,EAAC,IAAI;EACf,aAAa,EAAC,iBAAoB;EAClC,UAAE;IACA,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAC,GAAG;IACP,OAAO,EAAE,YAAY;IACrB,WAAW,EAAE,GAAG;IAChB,cAAc,EAAE,SAAS;IACzB,SAAS,EAAE,QAAQ;IACnB,OAAO,EAAE,YAAY;IACrB,eAAe,EAAE,IAAI;IACrB,KAAK,EF3CG,OAAO;IE4Cf,UAAU,EAAE,mBAAmB;IAC/B,mCAAiB;MACf,KAAK,EFlDJ,OAAO;MEmDR,aAAa,EAAE,iBAAe;;AAKpC,QAAS;EACP,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,MAAM;EACjB,WAAW,EAAE,OAAO;EACpB,MAAM,EAAC,CAAC;EACR,KAAK,EF7DA,OAAO;;AE+Dd,UAAW;EACT,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,IAAI;EACjB,UAAU,EAAC,MAAM", "mappings": "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",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","header.scss"], "sources": ["slovenscina-theme.scss","slovenscina-elements.scss","header.scss"],
"names": [], "names": [],
"file": "header.css" "file": "header.css"

View File

@@ -67,4 +67,68 @@ p.subtitle {
font-size: 14px; font-size: 14px;
line-height: 150%; line-height: 150%;
margin-top:0.5rem; margin-top:0.5rem;
}
/* Style The Dropdown Button */
.dropbtn {
color: white;
line-height:4rem;
border: none;
cursor: pointer;
background:none;
padding:0 1rem;
img {
position:relative;
top:0.75rem;
}
}
/* The container <div> - needed to position the dropdown content */
.dropdown {
margin-right:1rem;
float:right;
display: inline-block;
position:relative;
}
/* Dropdown Content (Hidden by Default) */
.dropdown-content {
display: none;
position: absolute;
right:0;
background-color: #f9f9f9;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
z-index: 1;
}
/* Links inside the dropdown */
.dropdown-content {
a {
color: $grey-dark;
padding: 0.5rem 1rem;
text-decoration: none;
display: block;
&:hover {
background-color: #f1f1f1;
cursor:pointer;
}
}
hr {
margin-top:0;
margin-bottom:0;
border-top: 1px solid $grey-border;
}
}
/* Show the dropdown menu on hover */
.dropdown:hover .dropdown-content {
display: block;
}
/* Change the background color of the dropdown button when the dropdown content is shown */
.dropdown:hover .dropbtn {
background:rgba(0,0,0,0.2);
} }

View File

@@ -46,11 +46,15 @@ em {
transition: opacity 0.3s ease-out; } transition: opacity 0.3s ease-out; }
.btn:hover { .btn:hover {
opacity: 0.8; } opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel { .panel {
background: #F5F5F5; background: #F5F5F5;
padding: 40px 60px; padding: 40px 60px;
border-radius: 20px; } border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo { .panel .panel-logo {
position: absolute; position: absolute;
top: -60px; top: -60px;
@@ -80,13 +84,21 @@ em {
.alert { .alert {
position: relative; position: relative;
color: #8D3D3D; } color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img { .alert img {
position: relative; position: relative;
top: 0.25rem; top: 0.25rem;
width: 1.8rem; } width: 1.8rem; }
.alert p { .alert p {
position: absolute; position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem; left: 3rem;
top: 0; top: 0;
margin: 0; margin: 0;
@@ -104,9 +116,17 @@ em {
.history-item { .history-item {
background: white; background: white;
height: 2.875rem; min-height: 2.875rem;
max-height: 2.875rem;
padding: 1rem 1.5rem; padding: 1rem 1.5rem;
position: relative; } position: relative;
transition: max-height 1s ease-out;
cursor: pointer;
overflow: hidden; }
.history-item .history-item-chevron {
position: absolute;
bottom: 1rem;
right: 1rem; }
.history-item .history-item-date { .history-item .history-item-date {
text-transform: uppercase; text-transform: uppercase;
display: inline-block; display: inline-block;
@@ -124,7 +144,9 @@ em {
font-weight: 400; font-weight: 400;
font-size: 0.875rem; } font-size: 0.875rem; }
.history-item .history-item-filecount { .history-item .history-item-filecount {
float: right; position: absolute;
top: 1rem;
right: 1rem;
color: #006CB7; color: #006CB7;
line-height: 1rem; line-height: 1rem;
font-weight: 400; font-weight: 400;
@@ -137,5 +159,48 @@ em {
font-size: 1rem; font-size: 1rem;
line-height: 1.25rem; line-height: 1.25rem;
color: #46535B; } color: #46535B; }
.history-item .history-item-desc-full {
display: none;
margin-top: 1rem; }
.history-item .history-item-files-full {
display: none; }
.history-item .history-item-files-full .file-item {
position: relative;
height: 3.125rem;
border-bottom: 1px solid #848C90; }
.history-item .history-item-files-full .file-item:last-child {
border-bottom: none; }
.history-item .history-item-files-full .file-item .file-icon {
position: absolute;
width: 1.5rem;
height: 1.5rem;
left: 0;
top: 1rem; }
.history-item .history-item-files-full .file-item .file-name {
position: absolute;
left: 3rem;
top: 1rem;
color: #46535B;
text-decoration: none;
cursor: pointer; }
.history-item .history-item-files-full .file-item .file-name:hover {
text-decoration: underline; }
.history-item.open {
max-height: 20rem; }
.history-item.open .history-item-date {
display: block; }
.history-item.open .history-item-uploader {
display: block;
padding-left: 0;
margin-left: 0;
border-left: none; }
.history-item.open .history-item-desc {
display: none; }
.history-item.open .history-item-desc-full {
display: block; }
.history-item.open .history-item-files-full {
display: block; }
.history-item.open .history-item-chevron {
transform: rotate(180deg); }
/*# sourceMappingURL=history.css.map */ /*# sourceMappingURL=history.css.map */

View File

@@ -1,6 +1,6 @@
{ {
"version": 3, "version": 3,
"mappings": "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", "mappings": "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",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","history.scss"], "sources": ["slovenscina-theme.scss","slovenscina-elements.scss","history.scss"],
"names": [], "names": [],
"file": "history.css" "file": "history.css"

View File

@@ -2,9 +2,18 @@
.history-item { .history-item {
background:white; background:white;
height:2.875rem; min-height:2.875rem;
max-height:2.875rem;
padding:1rem 1.5rem; padding:1rem 1.5rem;
position:relative; position:relative;
transition: max-height 1s ease-out;
cursor:pointer;
overflow:hidden;
.history-item-chevron {
position:absolute;
bottom:1rem;
right:1rem;
}
.history-item-date { .history-item-date {
text-transform: uppercase; text-transform: uppercase;
display: inline-block; display: inline-block;
@@ -24,7 +33,9 @@
font-size:0.875rem; font-size:0.875rem;
} }
.history-item-filecount { .history-item-filecount {
float:right; position:absolute;
top:1rem;
right:1rem;
color:$blue; color:$blue;
line-height: 1rem; line-height: 1rem;
font-weight: 400; font-weight: 400;
@@ -39,4 +50,59 @@
line-height: 1.25rem; line-height: 1.25rem;
color:$black; color:$black;
} }
.history-item-desc-full {
display: none;
margin-top:1rem;
}
.history-item-files-full {
display: none;
.file-item {
position:relative;
height:3.125rem;
border-bottom: 1px solid $grey-dark;
&:last-child {
border-bottom:none;
}
.file-icon {
position:absolute;
width:1.5rem;
height:1.5rem;
left:0;
top:1rem;
}
.file-name {
position:absolute;
left:3rem;
top:1rem;
color:$black;
text-decoration: none;
cursor:pointer;
&:hover {
text-decoration: underline;
}
}
}
}
&.open {
max-height: 20rem;
.history-item-date {display:block;}
.history-item-uploader {
display:block;
padding-left:0;
margin-left:0;
border-left: none;
}
.history-item-desc {
display: none;
}
.history-item-desc-full {
display: block;
}
.history-item-files-full {
display: block;
}
.history-item-chevron {
transform:rotate(180deg);
}
}
} }

View File

@@ -46,11 +46,15 @@ em {
transition: opacity 0.3s ease-out; } transition: opacity 0.3s ease-out; }
.btn:hover { .btn:hover {
opacity: 0.8; } opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel { .panel {
background: #F5F5F5; background: #F5F5F5;
padding: 40px 60px; padding: 40px 60px;
border-radius: 20px; } border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo { .panel .panel-logo {
position: absolute; position: absolute;
top: -60px; top: -60px;
@@ -80,13 +84,21 @@ em {
.alert { .alert {
position: relative; position: relative;
color: #8D3D3D; } color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img { .alert img {
position: relative; position: relative;
top: 0.25rem; top: 0.25rem;
width: 1.8rem; } width: 1.8rem; }
.alert p { .alert p {
position: absolute; position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem; left: 3rem;
top: 0; top: 0;
margin: 0; margin: 0;
@@ -103,7 +115,7 @@ em {
border-radius: 4px; } border-radius: 4px; }
.background { .background {
background: url(../image/bg.jpeg) no-repeat center center fixed; background: #848C90;
-webkit-background-size: cover; -webkit-background-size: cover;
-moz-background-size: cover; -moz-background-size: cover;
-o-background-size: cover; -o-background-size: cover;
@@ -116,7 +128,8 @@ em {
position: absolute; position: absolute;
width: 50%; width: 50%;
left: 25%; left: 25%;
top: 100px; } top: 100px;
box-shadow: 0 0 2.5rem 0 rgba(0, 0, 0, 0.25); }
.register-button { .register-button {
position: relative; position: relative;
@@ -165,5 +178,21 @@ em {
.input-wrapper .input-floating-label label { .input-wrapper .input-floating-label label {
font-size: 10px; font-size: 10px;
color: #46535B; } color: #46535B; }
.input-wrapper .input-floating-label label.input-hint {
color: #848C90; }
.back-to-login {
position: relative;
height: 2rem; }
.back-to-login img {
position: absolute;
top: 0.25rem;
left: 0.5rem; }
.back-to-login a {
position: relative;
top: 0;
left: 3rem;
text-decoration: none;
color: #46535B; }
/*# sourceMappingURL=login-styles.css.map */ /*# sourceMappingURL=login-styles.css.map */

View File

@@ -1,6 +1,6 @@
{ {
"version": 3, "version": 3,
"mappings": "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", "mappings": "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",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","login-styles.scss"], "sources": ["slovenscina-theme.scss","slovenscina-elements.scss","login-styles.scss"],
"names": [], "names": [],
"file": "login-styles.css" "file": "login-styles.css"

View File

@@ -3,7 +3,7 @@
.background { .background {
background: url(../image/bg.jpeg) no-repeat center center fixed; background: $grey-dark;
-webkit-background-size: cover; -webkit-background-size: cover;
-moz-background-size: cover; -moz-background-size: cover;
-o-background-size: cover; -o-background-size: cover;
@@ -18,6 +18,7 @@
width:50%; width:50%;
left:25%; left:25%;
top: 100px; top: 100px;
box-shadow: 0 0 2.5rem 0 rgba(0,0,0,0.25);
} }
.register-button { .register-button {
@@ -76,6 +77,26 @@
font-size: 10px; font-size: 10px;
color: $black; color: $black;
} }
label.input-hint {
color:$grey-dark;
}
} }
} }
.back-to-login {
position:relative;
height:2rem;
img {
position:absolute;
top:0.25rem;
left:0.5rem;
}
a {
position: relative;
top:0;
left:3rem;
text-decoration: none;
color:$black;
}
}

View File

@@ -0,0 +1,117 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
/*# sourceMappingURL=manage-institution.css.map */

View File

@@ -0,0 +1,7 @@
{
"version": 3,
"mappings": "AAAQ,+IAAuI;AAa/I,IAAK;EACH,WAAW,EAAE,oBAAoB;EACjC,SAAS,EAAC,IAAI;EACd,KAAK,EAZC,OAAO;;AAef,IAAK;EACH,SAAS,EAAC,IAAI;EACd,OAAO,EAAC,CAAC;EACT,MAAM,EAAC,CAAC;;ACpBV,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,KAAK,EDLA,OAAO;;ACOd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,KAAK,EDbA,OAAO;;ACgBd,EAAG;EACD,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,IAAI;;AAGnB,EAAG;EACD,WAAW,EAAE,GAAG;;AAGlB,IAAK;EACH,MAAM,EAAC,IAAI;EACX,WAAW,EAAE,MAAM;EACnB,OAAO,EAAE,QAAQ;EACjB,KAAK,EAAC,KAAK;EACX,UAAU,EDhCL,OAAO;ECiCZ,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,QAAQ;EACnB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,qBAAqB;EACjC,UAAQ;IACN,OAAO,EAAE,GAAG;EAEd,aAAW;IACT,MAAM,EAAC,OAAO;IACd,OAAO,EAAC,GAAG;;AAMf,MAAO;EACL,UAAU,ED5CJ,OAAO;EC6Cb,OAAO,EAAE,SAAS;EAClB,aAAa,EAAE,IAAI;EACnB,SAAS,EAAC,KAAK;EACf,kBAAY;IACV,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAE,KAAK;IACV,IAAI,EAAC,CAAC;IACN,KAAK,EAAC,CAAC;IACP,OAAO,EAAC,KAAK;IACb,MAAM,EAAC,IAAI;IACX,UAAU,EDvDN,OAAO;ICwDX,OAAO,EAAC,SAAS;IACjB,KAAK,EAAE,KAAK;IACZ,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,MAAM;;AAKtB,KAAM;EACJ,UAAU,EDpEL,OAAO;ECqEZ,MAAM,EAAC,GAAG;EACV,KAAK,EAAC,KAAK;EACX,MAAM,EAAE,IAAI;;AAGd,QAAS;EACP,OAAO,EAAC,KAAK;EACb,UAAU,EAAE,KAAK;EACjB,SAAS,EAAC,IAAI;EACd,eAAe,EAAE,IAAI;EACrB,KAAK,EDlFA,OAAO;ECmFZ,cAAc,EAAE,SAAS;;AAG3B,MAAO;EACL,QAAQ,EAAC,QAAQ;EACjB,KAAK,EDvFD,OAAO;ECwFX,aAAa,EAAC,IAAI;EAClB,oBAAgB;IACd,KAAK,EDnFD,OAAO;ECqFb,UAAI;IACF,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAC,OAAO;IACX,KAAK,EAAC,MAAM;EAEd,QAAE;IACA,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,MAAM;IACtB,eAAe,EAAE,MAAM;IACvB,WAAW,EAAE,MAAM;IACnB,MAAM,EAAC,IAAI;IACX,IAAI,EAAC,IAAI;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAC,CAAC;IACR,cAAc,EAAE,SAAS;;AAI7B,aAAc;EACZ,UAAU,EAAC,KAAK;EAChB,MAAM,EAAE,iBAAsB;EAC9B,UAAU,EAAE,UAAU;EACtB,aAAa,EAAE,GAAG;EAClB,kBAAK;IACH,UAAU,EAAC,MAAM;IACjB,UAAU,ED/GN,OAAO;ICgHX,aAAa,EAAE,GAAG",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss"],
"names": [],
"file": "manage-institution.css"
}

View File

@@ -0,0 +1 @@
@import "slovenscina-elements.scss";

View File

@@ -0,0 +1,144 @@
@import url(https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,900,900italic,300italic,300,100italic,100);
html {
font-family: 'Roboto', sans-serif;
font-size: 16px;
color: #46535B; }
body {
font-size: 16px;
padding: 0;
margin: 0; }
h1 {
font-size: 30px;
font-style: normal;
font-weight: 300;
line-height: 35px;
color: #006CB7; }
h2 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px;
text-transform: uppercase;
color: #006CB7; }
h3 {
font-size: 18px;
font-style: normal;
font-weight: 300;
line-height: 21px; }
em {
font-weight: 300; }
.btn {
border: none;
line-height: 2.5rem;
padding: 0 2.5rem;
color: white;
background: #006CB7;
border-radius: 20px;
font-size: 1.125rem;
font-weight: 400;
cursor: pointer;
transition: opacity 0.3s ease-out; }
.btn:hover {
opacity: 0.8; }
.btn:disabled {
cursor: default;
opacity: 0.5; }
.panel {
background: #F5F5F5;
padding: 40px 60px;
border-radius: 20px;
max-width: 30rem; }
.panel .panel-logo {
position: absolute;
top: -60px;
left: 0;
right: 0;
display: block;
margin: auto;
background: #F5F5F5;
padding: 20px 30px;
width: 100px;
border-radius: 100%;
text-align: center; }
.line {
background: #C4C4C4;
height: 2px;
width: 200px;
margin: auto; }
.a-right {
display: block;
text-align: right;
font-size: 10px;
text-decoration: none;
color: #006CB7;
text-transform: uppercase; }
.alert {
position: relative;
color: #8D3D3D;
margin-bottom: 2rem; }
.alert.alert-success {
color: #88B52F; }
.alert img {
position: relative;
top: 0.25rem;
width: 1.8rem; }
.alert p {
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 2rem;
left: 3rem;
top: 0;
margin: 0;
text-transform: uppercase; }
.submit-alert {
background: white;
border: 2px solid #B7DB70;
box-sizing: border-box;
border-radius: 8px; }
.submit-alert .btn {
margin-top: 0.5rem;
background: #88B52F;
border-radius: 4px; }
.tableFixHead {
overflow-y: scroll;
max-height: 306px; }
.tableFixHead thead th {
position: sticky;
top: 0; }
table {
border-collapse: collapse;
width: 100%; }
table th, table td {
padding: 8px 16px;
border: 1px solid #ccc; }
table th {
background: #eee; }
table input[type=submit], table a {
font-size: 0.8rem;
background: none;
outline: none;
border: none;
cursor: pointer;
text-decoration: none;
color: #006CB7; }
table input[type=submit]:hover, table a:hover {
text-decoration: underline; }
/*# sourceMappingURL=slovenscina-admin.css.map */

View File

@@ -0,0 +1,7 @@
{
"version": 3,
"mappings": "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",
"sources": ["slovenscina-theme.scss","slovenscina-elements.scss","slovenscina-admin.scss"],
"names": [],
"file": "slovenscina-admin.css"
}

View File

@@ -0,0 +1,33 @@
@import "slovenscina-elements.scss";
.tableFixHead {
overflow-y: scroll;
max-height: 306px;
}
.tableFixHead thead th {
position: sticky;
top: 0;
}
table {
border-collapse: collapse;
width: 100%;
th,td {
padding: 8px 16px;
border: 1px solid #ccc;
}
th {
background: #eee;
}
input[type=submit],a {
font-size: 0.8rem;
background:none;
outline:none;
border:none;
cursor:pointer;
text-decoration: none;
color:$blue;
&:hover {
text-decoration: underline;
}
}
}

View File

@@ -41,6 +41,10 @@ em {
&:hover { &:hover {
opacity: 0.8; opacity: 0.8;
} }
&:disabled {
cursor:default;
opacity:0.5;
}
} }
@@ -49,6 +53,7 @@ em {
background: $white; background: $white;
padding: 40px 60px; padding: 40px 60px;
border-radius: 20px; border-radius: 20px;
max-width:30rem;
.panel-logo { .panel-logo {
position:absolute; position:absolute;
top: -60px; top: -60px;
@@ -84,6 +89,10 @@ em {
.alert { .alert {
position:relative; position:relative;
color:$red; color:$red;
margin-bottom:2rem;
&.alert-success {
color:$green;
}
img { img {
position:relative; position:relative;
top:0.25rem; top:0.25rem;
@@ -91,6 +100,11 @@ em {
} }
p { p {
position: absolute; position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height:2rem;
left:3rem; left:3rem;
top: 0; top: 0;
margin:0; margin:0;

View File

@@ -0,0 +1,3 @@
<svg width="14" height="8" viewBox="0 0 14 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.7071 0.292893C14.0976 0.683418 14.0976 1.31658 13.7071 1.70711L7.70711 7.70711C7.31658 8.09763 6.68342 8.09763 6.29289 7.70711L0.292893 1.70711C-0.0976315 1.31658 -0.0976315 0.683417 0.292893 0.292893C0.683417 -0.0976317 1.31658 -0.0976317 1.70711 0.292893L7 5.58579L12.2929 0.292893C12.6834 -0.0976312 13.3166 -0.0976311 13.7071 0.292893Z" fill="#848C91"/>
</svg>

After

Width:  |  Height:  |  Size: 516 B

View File

@@ -0,0 +1,3 @@
<svg width="8" height="14" viewBox="0 0 8 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.70711 0.292893C8.09763 0.683417 8.09763 1.31658 7.70711 1.70711L2.41421 7L7.70711 12.2929C8.09763 12.6834 8.09763 13.3166 7.70711 13.7071C7.31658 14.0976 6.68342 14.0976 6.29289 13.7071L0.292893 7.70711C-0.0976311 7.31658 -0.0976311 6.68342 0.292893 6.29289L6.29289 0.292893C6.68342 -0.0976311 7.31658 -0.0976311 7.70711 0.292893Z" fill="#46535B"/>
</svg>

After

Width:  |  Height:  |  Size: 506 B

View File

@@ -0,0 +1,5 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="32" height="32" rx="4" fill="#B6BEC4"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.6667 11.3333C10.4899 11.3333 10.3204 11.4036 10.1953 11.5286C10.0703 11.6536 10.0001 11.8232 10.0001 12V21.3333C10.0001 21.5101 10.0703 21.6797 10.1953 21.8047C10.3204 21.9298 10.4899 22 10.6667 22H20.0001C20.1769 22 20.3465 21.9298 20.4715 21.8047C20.5965 21.6797 20.6667 21.5101 20.6667 21.3333V17.7733C20.6667 17.4051 20.9652 17.1067 21.3334 17.1067C21.7016 17.1067 22.0001 17.4051 22.0001 17.7733V21.3333C22.0001 21.8638 21.7894 22.3725 21.4143 22.7475C21.0392 23.1226 20.5305 23.3333 20.0001 23.3333H10.6667C10.1363 23.3333 9.62761 23.1226 9.25253 22.7475C8.87746 22.3725 8.66675 21.8638 8.66675 21.3333V12C8.66675 11.4696 8.87746 10.9609 9.25253 10.5858C9.62761 10.2107 10.1363 10 10.6667 10H14.2267C14.5949 10 14.8934 10.2985 14.8934 10.6667C14.8934 11.0349 14.5949 11.3333 14.2267 11.3333H10.6667Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.5287 8.86225C19.789 8.6019 20.2111 8.6019 20.4715 8.86225L23.1382 11.5289C23.3985 11.7893 23.3985 12.2114 23.1382 12.4717L16.4715 19.1384C16.3465 19.2634 16.1769 19.3337 16.0001 19.3337H13.3334C12.9652 19.3337 12.6667 19.0352 12.6667 18.667V16.0003C12.6667 15.8235 12.737 15.6539 12.862 15.5289L19.5287 8.86225ZM14.0001 16.2765V18.0003H15.7239L21.7239 12.0003L20.0001 10.2765L14.0001 16.2765Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

5
static/image/menu.svg Normal file
View File

@@ -0,0 +1,5 @@
<svg width="7" height="27" viewBox="0 0 7 27" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="3.5" cy="3.5" r="2.5" stroke="#F5F5F5" stroke-width="2"/>
<circle cx="3.5" cy="13.5" r="2.5" stroke="#F5F5F5" stroke-width="2"/>
<circle cx="3.5" cy="23.5" r="2.5" stroke="#F5F5F5" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 325 B

5
static/image/success.svg Normal file
View File

@@ -0,0 +1,5 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 29.6668C6.86671 29.6668 0.333374 23.1335 0.333374 15.0002C0.333374 6.86683 6.86671 0.333496 15 0.333496C23.1334 0.333496 29.6667 6.86683 29.6667 15.0002C29.6667 23.1335 23.1334 29.6668 15 29.6668ZM15 3.00016C8.33337 3.00016 3.00004 8.3335 3.00004 15.0002C3.00004 21.6668 8.33337 27.0002 15 27.0002C21.6667 27.0002 27 21.6668 27 15.0002C27 8.3335 21.6667 3.00016 15 3.00016Z" fill="#88B52F"/>
<path d="M15 16.3335C14.2 16.3335 13.6667 15.8002 13.6667 15.0002V9.66683C13.6667 8.86683 14.2 8.3335 15 8.3335C15.8 8.3335 16.3334 8.86683 16.3334 9.66683V15.0002C16.3334 15.8002 15.8 16.3335 15 16.3335Z" fill="#88B52F"/>
<path d="M15 21.6668C14.6 21.6668 14.3334 21.5335 14.0667 21.2668C13.8 21.0002 13.6667 20.7335 13.6667 20.3335C13.6667 20.2002 13.6667 19.9335 13.8 19.8002C13.9334 19.6668 13.9334 19.5335 14.0667 19.4002C14.4667 19.0002 15 18.8668 15.5334 19.1335C15.6667 19.1335 15.6667 19.1335 15.8 19.2668C15.8 19.2668 15.9334 19.4002 16.0667 19.4002C16.2 19.5335 16.3334 19.6668 16.3334 19.8002C16.3334 19.9335 16.3334 20.2002 16.3334 20.3335C16.3334 20.4668 16.3334 20.7335 16.2 20.8668C16.0667 21.0002 16.0667 21.1335 15.9334 21.2668C15.6667 21.5335 15.4 21.6668 15 21.6668Z" fill="#88B52F"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

6
static/image/trash.svg Normal file
View File

@@ -0,0 +1,6 @@
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.333252 3.49984C0.333252 3.13165 0.631729 2.83317 0.999919 2.83317H12.9999C13.3681 2.83317 13.6666 3.13165 13.6666 3.49984C13.6666 3.86803 13.3681 4.1665 12.9999 4.1665H0.999919C0.631729 4.1665 0.333252 3.86803 0.333252 3.49984Z" fill="#848C91"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.66659 1.49984C5.48977 1.49984 5.32021 1.57007 5.19518 1.6951C5.07016 1.82012 4.99992 1.98969 4.99992 2.1665V2.83317H8.99992V2.1665C8.99992 1.98969 8.92968 1.82012 8.80466 1.6951C8.67963 1.57007 8.51006 1.49984 8.33325 1.49984H5.66659ZM10.3333 2.83317V2.1665C10.3333 1.63607 10.1225 1.12736 9.74747 0.75229C9.37239 0.377218 8.86369 0.166504 8.33325 0.166504H5.66659C5.13615 0.166504 4.62744 0.377218 4.25237 0.75229C3.8773 1.12736 3.66659 1.63607 3.66659 2.1665V2.83317H2.33325C1.96506 2.83317 1.66659 3.13165 1.66659 3.49984V12.8332C1.66659 13.3636 1.8773 13.8723 2.25237 14.2474C2.62744 14.6225 3.13615 14.8332 3.66659 14.8332H10.3333C10.8637 14.8332 11.3724 14.6225 11.7475 14.2474C12.1225 13.8723 12.3333 13.3636 12.3333 12.8332V3.49984C12.3333 3.13165 12.0348 2.83317 11.6666 2.83317H10.3333ZM2.99992 4.1665V12.8332C2.99992 13.01 3.07016 13.1795 3.19518 13.3046C3.32021 13.4296 3.48977 13.4998 3.66659 13.4998H10.3333C10.5101 13.4998 10.6796 13.4296 10.8047 13.3046C10.9297 13.1795 10.9999 13.01 10.9999 12.8332V4.1665H2.99992Z" fill="#848C91"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.66659 6.1665C6.03478 6.1665 6.33325 6.46498 6.33325 6.83317V10.8332C6.33325 11.2014 6.03478 11.4998 5.66659 11.4998C5.2984 11.4998 4.99992 11.2014 4.99992 10.8332V6.83317C4.99992 6.46498 5.2984 6.1665 5.66659 6.1665Z" fill="#848C91"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.33325 6.1665C8.70144 6.1665 8.99992 6.46498 8.99992 6.83317V10.8332C8.99992 11.2014 8.70144 11.4998 8.33325 11.4998C7.96506 11.4998 7.66659 11.2014 7.66659 10.8332V6.83317C7.66659 6.46498 7.96506 6.1665 8.33325 6.1665Z" fill="#848C91"/>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -3,6 +3,10 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Admin panel - Šolar</title> <title>Admin panel - Šolar</title>
<link rel="stylesheet" href="../static/css/header.css" type="text/css">
<link rel="stylesheet" href="../static/css/form.css" type="text/css">
<link rel="stylesheet" href="../static/css/simple-grid.css" type="text/css">
<link rel="stylesheet" href="../static/css/manage-institution.css" type="text/css">
<style> <style>
.tableFixHead { .tableFixHead {
overflow-y: scroll; overflow-y: scroll;
@@ -30,7 +34,30 @@
</style> </style>
</head> </head>
<body> <body>
<a href="../oddaja">Nazaj na oddajo</a> <header>
<div class="logo"><a href="../"><img src="../static/image/logo-white.svg"/></a></div>
<div class="dropdown">
<button class="dropbtn"><img src="/static/image/menu.svg"/></button>
<div class="dropdown-content">
<a href="../oddaja">Oddaja</a>
<a href="../zgodovina">Zgodovina</a>
<a href="../pogodbe">Ekipa</a>
{% if is_institution_coordinator %}
<hr/>
<a href="../manage-institution">Upravljaj z institucijo</a>
{% endif %}
{% if is_admin %}
<hr/>
<a href="../admin">Administracijski meni</a>
{% endif %}
<hr/>
<a href="https://slovenscina.eu/" target="_blank">Več informacij</a>
<hr/>
<a href="../logout">Odjava</a>
</div>
</div>
</header>
<div class="container" style="margin-top:8rem;">
{% with messages = get_flashed_messages() %} {% with messages = get_flashed_messages() %}
{% if messages %} {% if messages %}
<div style="background: blue;"> <div style="background: blue;">
@@ -137,6 +164,7 @@
<th>Email</th> <th>Email</th>
<th>Institucija</th> <th>Institucija</th>
<th>Vloga v instituciji</th> <th>Vloga v instituciji</th>
<th>Akcije</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -147,16 +175,17 @@
<td>{{item[0].email}}</td> <td>{{item[0].email}}</td>
<td>{{item[1].institution}}</td> <td>{{item[1].institution}}</td>
<td>{{item[1].role}}</td> <td>{{item[1].role}}</td>
<td>
<form action="../activateuser" method="post">
<input type="hidden" id="id" name="id" value="{{item[0].id}}">
<input type="submit" value="Aktiviraj">
</form>
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
</div> </div>
<h3>Aktiviraj uporabnika</h3>
<form action="../activateuser" method="post">
<label for="id">ID uporabnika:</label>
<input type="text" id="id" name="id"><br>
<input type="submit" value="Aktiviraj">
</form>
<div> </div> <div> </div>
<h2>Institucije</h2> <h2>Institucije</h2>
<h3>Dodaj institucijo</h3> <h3>Dodaj institucijo</h3>
@@ -229,50 +258,6 @@
</select> </select>
<input type="submit" value="Spremeni"> <input type="submit" value="Spremeni">
</form> </form>
<h2>Zgodovina sodelovanja</h2>
<div class="tableFixHead">
<table>
<thead>
<tr>
<th>ID</th>
<th>ID uporabnika</th>
<th>ID institucije</th>
<th>Vloga</th>
<th>Šolsko leto</th>
<th>Besedilo značke</th>
</tr>
</thead>
<tbody>
{% for item in user_cooperation_history %}
<tr>
<td>{{item.id}}</td>
<td>{{item.user}}</td>
<td>{{item.institution}}</td>
<td>{{item.role}}</td>
<td>{{item.school_year}}</td>
<td>{{item.badge_text}}</td>
</tr>
{% endfor %}
</table>
</div>
<h3>Dodaj vnos</h3>
<form action="../addcooperationhistoryitem" method="post">
<label for="user">ID uporabnika</label>
<input type="text" id="user" name="user"><br>
<label for="institution">ID institucije</label>
<input type="text" id="institution" name="institution"><br>
<label for="role">Vloga</label>
<select name="role" id="role">
<option value="coordinator">Koordinator/-ka</option>
<option value="mentor">Mentor/-ica</option>
<option value="other">Druga vloga</option>
</select><br>
<label for="school-year">Šolsko leto (npr. "2021/22")</label>
<input type="text" id="school-year" name="school-year"><br>
<label for="badge-text">Besedilo značke</label>
<input type="text" id="badge-text" name="badge-text"><br>
<input type="submit" value="Dodaj">
</form>
<h3>Odstrani vnos</h3> <h3>Odstrani vnos</h3>
<form action="../delcooperationhistoryitem" method="post"> <form action="../delcooperationhistoryitem" method="post">
<label for="entry-id">ID vnosa</label> <label for="entry-id">ID vnosa</label>
@@ -389,6 +374,7 @@
<button id="button-submit" type="submit">Posodobi</button> <button id="button-submit" type="submit">Posodobi</button>
</form> </form>
</div>
<script> <script>
var selectPredmet = document.getElementById("predmet"); var selectPredmet = document.getElementById("predmet");
var selectVrsta = document.getElementById("vrsta"); var selectVrsta = document.getElementById("vrsta");

View File

@@ -3,14 +3,14 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Portal ŠOLAR</title> <title>Portal ŠOLAR</title>
<link rel="stylesheet" href="/static/css/login-styles.css" type="text/css"> <link rel="stylesheet" href="../static/css/login-styles.css" type="text/css">
<link rel="stylesheet" href="/static/css/utils.css" type="text/css"> <link rel="stylesheet" href="../static/css/utils.css" type="text/css">
</head> </head>
<body> <body>
<div class="background"> <div class="background">
<div class="panel login-panel"> <div class="panel login-panel">
<div class="panel-logo"> <div class="panel-logo">
<img src="/static/image/logo.svg" alt="logo"/> <img src="../static/image/logo.svg" alt="logo"/>
</div> </div>
<h1 class="m-b-3">Pozabljeno geslo - ŠOLAR</h1> <h1 class="m-b-3">Pozabljeno geslo - ŠOLAR</h1>
<div> <div>
@@ -27,12 +27,17 @@
</form> </form>
{% with messages = get_flashed_messages() %} {% with messages = get_flashed_messages() %}
{% if messages %} {% if messages %}
<div class="alert"> <div class="alert alert-success">
<img src="../static/image/alert.svg" alt="alert"/> <img src="../static/image/success.svg" alt="alert"/>
<p>{{ messages[0] }}</p> <p>{{ messages[0] }}</p>
</div> </div>
{% endif %} {% endif %}
{% endwith %} {% endwith %}
<div class="back-to-login">
<img src="../static/image/chevron-left.svg"/>
<a href="../login">Nazaj na prijavo</a>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -3,28 +3,35 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Portal ŠOLAR</title> <title>Portal ŠOLAR</title>
<link rel="stylesheet" href="/static/css/login-styles.css" type="text/css"> <link rel="stylesheet" href="../static/css/login-styles.css" type="text/css">
<link rel="stylesheet" href="/static/css/utils.css" type="text/css"> <link rel="stylesheet" href="../static/css/utils.css" type="text/css">
</head> </head>
<body> <body>
<div class="background"> <div class="background">
<div class="panel login-panel"> <div class="panel login-panel">
<div class="panel-logo"> <div class="panel-logo">
<img src="/static/image/logo.svg" alt="logo"/> <img src="../static/image/logo.svg" alt="logo"/>
</div> </div>
<h2 class="text-center">Portal za oddajanje besedil</h2> <h2 class="text-center">Portal za oddajanje besedil</h2>
<div class="line"></div> <div class="line"></div>
<h1 class="text-center">Korpus ŠOLAR</h1> <h1 class="text-center">Korpus ŠOLAR</h1>
<div class="text-center m-b-3"><em>Zbiranje besedil za korpus Šolar poteka po naslednjem postopku, ki prinaša tudi točke za napredovanje.</em></div> <div class="text-center m-b-3"><em>Zbiranje besedil za korpus Šolar poteka po naslednjem postopku, ki prinaša tudi točke za napredovanje v pedagoški naziv.</em></div>
<h1 class="m-b-3">Prijava</h1> <h1 class="m-b-3">Prijava</h1>
{% with messages = get_flashed_messages() %} {% with messages = get_flashed_messages() %}
{% if messages %} {% if messages %}
<div class="alert"> {% if "potrditev" in messages[0] or "uspešna" in messages[0] %}
<img src="/static/image/alert.svg" alt="alert"/> <div class="alert alert-success">
<p>{{ messages[0] }}</p> <img src="../static/image/success.svg" alt="alert"/>
</div> <p>{{ messages[0] }}</p>
</div>
{% else %}
<div class="alert">
<img src="../static/image/alert.svg" alt="alert"/>
<p>{{ messages[0] }}</p>
</div>
{% endif %}
{% endif %} {% endif %}
{% endwith %} {% endwith %}
<div> <div>

View File

@@ -3,100 +3,100 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Upravljanje institucije - Šolar</title> <title>Upravljanje institucije - Šolar</title>
<style> <link rel="stylesheet" href="../static/css/header.css" type="text/css">
.tableFixHead { <link rel="stylesheet" href="../static/css/form.css" type="text/css">
overflow-y: scroll; <link rel="stylesheet" href="../static/css/simple-grid.css" type="text/css">
max-height: 306px; <link rel="stylesheet" href="../static/css/slovenscina-admin.css" type="text/css">
} <link rel="stylesheet" href="../static/css/manage-institution.css" type="text/css">
.tableFixHead thead th {
position: sticky;
top: 0;
}
table {
border-collapse: collapse;
width: 100%;
}
th,
td {
padding: 8px 16px;
border: 1px solid #ccc;
}
th {
background: #eee;
}
h2 {
color: blue;
}
</style>
</head> </head>
<body> <body>
<a href="../oddaja">Nazaj na oddajo</a> <header>
<div class="logo"><a href="../"><img src="../static/image/logo-white.svg"/></a></div>
<div class="dropdown">
<button class="dropbtn"><img src="/static/image/menu.svg"/></button>
<div class="dropdown-content">
<a href="../oddaja">Oddaja</a>
<a href="../zgodovina">Zgodovina</a>
<a href="../pogodbe">Ekipa</a>
{% if is_institution_coordinator %}
<hr/>
<a href="../manage-institution">Upravljaj z institucijo</a>
{% endif %}
{% if is_admin %}
<hr/>
<a href="../admin">Administracijski meni</a>
{% endif %}
<hr/>
<a href="https://slovenscina.eu/" target="_blank">Več informacij</a>
<hr/>
<a href="../logout">Odjava</a>
</div>
</div>
</header>
<div class="container" style="margin-top:8rem;">
{% with messages = get_flashed_messages() %} {% with messages = get_flashed_messages() %}
{% if messages %} {% if messages %}
<div style="background: blue;"> <div>
{{ messages[0] }} {{ messages[0] }}
</div> </div>
{% endif %} {% endif %}
{% endwith %} {% endwith %}
<h3>Seznam vseh aktivnih uporabnikov</h3>
<div class="tableFixHead">
<table>
<thead>
<tr>
<th>ID</th>
<th>Ime in priimek</th>
<th>Email</th>
</tr>
</thead>
<tbody>
{% for item in users %}
<tr>
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.email}}</td>
</tr>
{% endfor %}
</table>
</div>
<h1>{{institution.name}}</h1>
<h3>Seznam uporabnikov v vaši instituciji</h3> <h3>Seznam uporabnikov v vaši instituciji</h3>
<div class="tableFixHead"> <table class="tableFixHead">
<table>
<thead> <thead>
<tr> <tr>
<th>ID</th>
<th>Ime in priimek</th> <th>Ime in priimek</th>
<th>Email</th> <th>Email</th>
<th>Vloga</th>
<th>Akcije</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for item in institution_users %} {% for item in institution_users %}
<tr> <tr>
<td>{{item.id}}</td>
<td>{{item.name}}</td> <td>{{item.name}}</td>
<td>{{item.email}}</td> <td>{{item.email}}</td>
<td>
<div>
<a href="javascript:void(0);" onclick="toggleEditForm(this)" class="toggle-edit-role">Spremeni</a>
{{role_map[item.id]}}
</div>
<form action="../changeuserrole-institution" method="post" style="display:none;">
<input type="hidden" id="user-id" name="user-id" value="{{item.id}}"/>
<select class="role" name="role">
<option value="coordinator">Koordinator/-ka</option>
<option value="mentor">Mentor/-ica</option>
<option value="other">Druga vloga</option>
</select>
<input type="submit" value="Shrani"/>
</form>
</td>
<td>
<form action="../deluserfrominstitution" method="post">
<input type="hidden" id="user_id" name="user_id" value="{{item.id}}">
<input type="submit" value="Odstrani uporabnika">
</form>
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
</div> </div>
<br> <br>
<h3>Dodaj uporabnika instituciji</h3>
<form action="../addusertoinstitution" method="post"> </div>
<label for="user_id">ID uporabnika:</label>
<input type="text" id="user_id" name="user_id"><br>
<label for="role">Vloga v instituciji:</label>
<select name="role" id="role">
<option value="coordinator">Koordinator/-ka</option>
<option value="mentor">Mentor/-ica</option>
<option value="other">Druga vloga</option>
</select>
<input type="submit" value="Dodeli">
</form>
<h3>Odstrani uporabnika iz institucije</h3>
<form action="../deluserfrominstitution" method="post">
<label for="user_id">ID uporabnika:</label>
<input type="text" id="user_id" name="user_id"><br>
<input type="submit" value="Odstrani">
</form>
<div> </div>
</body> </body>
<script>
var toggleEditForm = function(el) {
var td = el.closest("td");
el.closest("div").style.display = "none";
td.querySelector("form").style.display = "block";
};
</script>
</html>

View File

@@ -3,37 +3,46 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Portal za oddajanje besedil</title> <title>Portal za oddajanje besedil</title>
<link rel="stylesheet" href="/static/css/header.css" type="text/css"> <link rel="stylesheet" href="../static/css/header.css" type="text/css">
<link rel="stylesheet" href="/static/css/form.css" type="text/css"> <link rel="stylesheet" href="../static/css/form.css" type="text/css">
<link rel="stylesheet" href="/static/css/simple-grid.css" type="text/css"> <link rel="stylesheet" href="../static/css/simple-grid.css" type="text/css">
<link rel="stylesheet" href="/static/css/utils.css" type="text/css"> <link rel="stylesheet" href="../static/css/utils.css" type="text/css">
</head> </head>
<body> <body>
<header> <header>
<div class="logo"><a href="/"><img src="/static/image/logo-white.svg"/></a></div> <div class="logo"><a href="../"><img src="../static/image/logo-white.svg"/></a></div>
<div class="menu-items"> <div class="dropdown">
<a href="../logout">Odjava</a> <button class="dropbtn"><img src="/static/image/menu.svg"/></button>
{% if is_institution_coordinator %} <div class="dropdown-content">
<a href="../manage-institution">Upravljaj z institucijo</a> <a href="../oddaja">Oddaja</a>
{% endif %} <a href="../zgodovina">Zgodovina</a>
{% if is_admin %} <a href="../pogodbe">Ekipa</a>
<a href="../admin">Administracijski meni</a> {% if is_institution_coordinator %}
{% endif %} <hr/>
<a href="mailto:email@example.com">Pomoč</a> <a href="../manage-institution">Upravljaj z institucijo</a>
{% endif %}
{% if is_admin %}
<hr/>
<a href="../admin">Administracijski meni</a>
{% endif %}
<hr/>
<a href="https://slovenscina.eu/" target="_blank">Več informacij</a>
<hr/>
<a href="../logout">Odjava</a>
</div>
</div> </div>
</header> </header>
<div class="container" style="margin-top:8rem;"> <div class="container" style="margin-top:8rem;">
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<h1 class="title">Koprus SOLAR</h1> <h1 class="title">Korpus Šolar</h1>
<p class="subtitle">Zbiranje besedil za korpus Šolar poteka po naslednjem postopku, ki prinaša tudi točke za napredovanje.</p> <p class="subtitle" style="width:60%">Prosimo, določite podatke o besedilih, ki jih želite oddati, in nato naložite besedila. Če oddajate besedila, ki so nastala v različnih razredih, se razlikujejo glede učiteljskih popravkov in podobno, jih oddajte v ločenih paketih.</p>
<div class="tab-nav"> <div class="tab-nav">
<a href="/oddaja" class="active">Oddaja</a> <a href="../oddaja" class="active">Oddaja besedil</a>
<a href="/zgodovina">Zgodovina</a> <a href="../zgodovina">Zgodovina sodelovanja</a>
<a href="/pogodbe">Pogodbe</a> <a href="../pogodbe">Ekipa</a>
</div> </div>
</div> </div>
</div> </div>
@@ -44,17 +53,21 @@
<div class="col-6"> <div class="col-6">
{% if not institution %} {% if not institution %}
<div class="alert"> <div class="alert">
<img src="/static/image/alert.svg" alt="alert"/> <img src="../static/image/alert.svg" alt="alert"/>
<p>Niste član nobene institucije!</p> <p>Niste član nobene institucije!</p>
</div> </div>
{% elif not institution_contract %} {% elif not institution_contract %}
<div class="alert"> <!--<div class="alert">
<img src="/static/image/alert.svg" alt="alert"/> <img src="../static/image/alert.svg" alt="alert"/>
<p>Pogodba s šolo še ni naložena!</p> <p>Pogodba s šolo še ni naložena!</p>
</div> </div>-->
{% endif %} {% endif %}
<div class="alert" id="error-message"> <div class="alert" id="error-message">
<img src="/static/image/alert.svg" alt="alert"/> <img src="../static/image/alert.svg" alt="alert"/>
<p></p>
</div>
<div class="alert alert-success" id="success-message">
<img src="../static/image/success.svg" alt="alert"/>
<p></p> <p></p>
</div> </div>
</div> </div>
@@ -65,7 +78,30 @@
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<div class="form-wrapper"> <div class="form-wrapper">
<label>Program</label> <label for="regija">Regija</label>
<select id="regija" name="regija">
<option value="CE" selected="selected">Celje (CE)</option>
<option value="GO">Nova Gorica (GO)</option>
<option value="KK">Krško (KK)</option>
<option value="KP">Koper (KP)</option>
<option value="KR">Kranj (KR)</option>
<option value="LJ">Ljubljana (LJ)</option>
<option value="MB">Maribor (MB)</option>
<option value="MS">Murska Sobota (MS)</option>
<option value="NM">Novo Mesto (NM)</option>
<option value="PO">Postojna (PO)</option>
<option value="SG">Slovenj Gradec (SG)</option>
</select>
</div>
</div>
<div class="col-6">
<p></p>
</div>
</div>
<div class="row">
<div class="col-6">
<div class="form-wrapper">
<label for="program">Program</label>
<select id="program" name="program"> <select id="program" name="program">
<option value="OS" selected="selected">Osnovnošolski (OŠ)</option> <option value="OS" selected="selected">Osnovnošolski (OŠ)</option>
<option value="SSG">Splošna in strokovna gimnazija (SGG)</option> <option value="SSG">Splošna in strokovna gimnazija (SGG)</option>
@@ -74,12 +110,12 @@
<option value="NPI">Nižje poklicno izobraževanje (NPI)</option> <option value="NPI">Nižje poklicno izobraževanje (NPI)</option>
<option value="SPI">Srednje poklicno izobraževanje (SPI)</option> <option value="SPI">Srednje poklicno izobraževanje (SPI)</option>
<option value="SSI">Srednje strokovno izobraževanje (SSI)</option> <option value="SSI">Srednje strokovno izobraževanje (SSI)</option>
<option value="PTI">Poklicno-tehnično izobraževanje (PTI)</option> <option value="PTI">Poklicno-tehniško izobraževanje (PTI)</option>
</select> </select>
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
<p>lalala</p> <p></p>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
@@ -87,17 +123,17 @@
<div class="form-wrapper"> <div class="form-wrapper">
<label for="predmet">Predmet</label> <label for="predmet">Predmet</label>
<select id="predmet" name="predmet"> <select id="predmet" name="predmet">
<option value="slo" selected="selected">Slovenščina</option> <option value="SLO" selected="selected">Slovenščina (SLO)</option>
<option value="drug-jez">Drugi jezikoslovni predmeti</option> <option value="DJP">Drugi jezikoslovni predmeti (vtipkajte ime predmeta) (DJP)</option>
<option value="drug-druz">Drugi družboslovni predmeti</option> <option value="DDP">Drugi družboslovni predmeti (vtipkajte ime predmeta) (DDP)</option>
<option value="drug-narav">Drugi naravoslovni predmeti</option> <option value="DNP">Drugi naravoslovni predmeti (vtipkajte ime predmeta) (DNP)</option>
<option value="drug-strok">Drugi strokovni predmeti</option> <option value="DSP">Drugi strokovni predmeti (vtipkajte ime predmeta) (DSP)</option>
<option value="drug-izb">Drugi izbirni ali dodatni predmeti</option> <option value="DIP">Drugi izbirni ali dodatni predmeti (vtipkajte ime predmeta) (DIP)</option>
</select> </select>
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
<p>lalala</p> <p></p>
</div> </div>
</div> </div>
@@ -109,7 +145,7 @@
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
<p>lalala</p> <p></p>
</div> </div>
</div> </div>
@@ -131,7 +167,7 @@
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
<p>lalala</p> <p></p>
</div> </div>
</div> </div>
@@ -140,15 +176,15 @@
<div class="form-wrapper" > <div class="form-wrapper" >
<label for="vrsta">Vrsta besedila</label> <label for="vrsta">Vrsta besedila</label>
<select id="vrsta" name="vrsta"> <select id="vrsta" name="vrsta">
<option value="esej-spis" selected="selected">Esej ali spis</option> <option value="E" selected="selected">Esej ali spis (E)</option>
<option value="prakticno">Praktično besedilo (npr. vabila, prošnje ipd. pri pouku slovenščine), napisano za oceno</option> <option value="PB">Praktično besedilo (npr. vabila, prošnje ipd. pri pouku slovenščine), napisano za oceno (PB)</option>
<option value="solski-test">Šolski test</option> <option value="T">Šolski test (T)</option>
<option value="delo-v-razredu">Delo v razredu, ne za oceno</option> <option value="R">Delo v razredu, ne za oceno (vtipkajte besedilo vrsto) (R)</option>
</select> </select>
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
<p>lalala</p> <p></p>
</div> </div>
</div> </div>
@@ -160,7 +196,7 @@
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
<p>lalala</p> <p></p>
</div> </div>
</div> </div>
@@ -175,7 +211,7 @@
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
<p>lalala</p> <p></p>
</div> </div>
</div> </div>
@@ -184,14 +220,14 @@
<div class="form-wrapper"> <div class="form-wrapper">
<label for="jezikovni-popravki">Jezikovni popravki</label> <label for="jezikovni-popravki">Jezikovni popravki</label>
<select id="jezikovni-popravki" name="jezikovni-popravki"> <select id="jezikovni-popravki" name="jezikovni-popravki">
<option value="popr-ne" selected="selected">Besedilo vsebuje učiteljske popravke in strinjam se z njihovo vključitvijo v korpus</option> <option value="DD" selected="selected">Besedilo vsebuje učiteljske popravke in strinjam se z njihovo vključitvijo v korpus. (DD)</option>
<option value="brez-popr">Besedilo ne vsebuje učiteljskih popravkov</option> <option value="N">Besedilo ne vsebuje učiteljskih popravkov. (N)</option>
<option value="popr-da">Besedilo vsebuje učiteljske popravke in ne strinjam se z njihovo vključitvijo v korpus</option> <option value="DN">Besedilo vsebuje učiteljske popravke in ne strinjam se z njihovo vključitvijo v korpus. (DN)</option>
</select> </select>
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
<p>lalala</p> <p></p>
</div> </div>
</div> </div>
@@ -211,7 +247,7 @@
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
<p>lalala</p> <p>Oddate lahko eno ali (hkrati) več besedil, ki ustrezajo izbranim podatkom. Sprejemljivi formati so: txt, csv, pdf, doc, docx, xls, xlsx, ppt, pptx, jpg, jpeg, png.</p>
</div> </div>
</div> </div>
@@ -220,7 +256,7 @@
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<div class="form-wrapper"> <div class="form-wrapper">
<button id="button-submit" type="submit" class="btn">Oddaj</button> <button id="button-submit" type="button" class="btn">Oddaj</button>
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
@@ -230,10 +266,10 @@
<div class="row submit-alert" id="data-confirm-notification"> <div class="row submit-alert" id="data-confirm-notification">
<div class="col-6"> <div class="col-6">
<button id="button-submit-final" type="submit" class="btn">Potrdi in oddaj</button> <button id="button-submit-final" type="button" class="btn">Potrdi in oddaj</button>
</div> </div>
<div class="col-6"> <div class="col-6">
<p>Prosimo, preverite in potrdite vnešene podatke.</p> <p>Prosimo, preverite, če so vneseni podatki ustrezni in besedila prava. Naknadno spreminjanje ne bo več mogoče.</p>
</div> </div>
</div> </div>
@@ -241,107 +277,11 @@
</div> </div>
<!-- <br/><br/><br/><br/><br/><br/><br/>
<div id="main-window" style="margin-top:100px;">
<div id="rect1">
<div id="logo-container">
<img src="/static/image/logo.svg" alt="logo"/>
</div>
<form id="my-dropzone" class="dropzone">
<div style="position: relative; right: 390px;">
<h1 id="title" style="font-size: 25px;">Korpus ŠOLAR</h1>
<div class="selection-tabs">
<button id="button-oddaja" class="selection-tab-button selected">ODDAJA</button>
<button id="button-zgodovina" class="selection-tab-button">ZGODOVINA</button>
<button id="button-pogodbe" class="selection-tab-button">POGODBE</button>
</div>
{% if not institution %}
<div class="warning">Niste član nobene institucije!</div>
{% elif not institution_contract %}
<div class="warning">Pogodba s šolo še ni naložena!</div>
{% endif %}
<div id="data-confirm-notification" class="message-notification" style="display: none;">Prosimo, preverite in potrdite vnešene podatke.</div>
<label for="program">PROGRAM</label>
<select id="program" name="program">
<option value="OS" selected="selected">Osnovnošolski (OŠ)</option>
<option value="SSG">Splošna in strokovna gimnazija (SGG)</option>
<option value="MGP">Mednarodni gimnazijski programi (MGP)</option>
<option value="ZG">Zasebne gimnazije (ZG)</option>
<option value="NPI">Nižje poklicno izobraževanje (NPI)</option>
<option value="SPI">Srednje poklicno izobraževanje (SPI)</option>
<option value="SSI">Srednje strokovno izobraževanje (SSI)</option>
<option value="PTI">Poklicno-tehnično izobraževanje (PTI)</option>
</select>
<label for="predmet">PREDMET</label>
<select id="predmet" name="predmet">
<option value="slo" selected="selected">Slovenščina</option>
<option value="drug-jez">Drugi jezikoslovni predmeti</option>
<option value="drug-druz">Drugi družboslovni predmeti</option>
<option value="drug-narav">Drugi naravoslovni predmeti</option>
<option value="drug-strok">Drugi strokovni predmeti</option>
<option value="drug-izb">Drugi izbirni ali dodatni predmeti</option>
</select>
<div id="predmet-custom-box" style="display: none;">
<label for="predmet-custom">Ime predmeta:</label>
<input type="text" id="predmet-custom" name="predmet-custom"/>
</div>
<label for="letnik">LETNIK</label>
<select id="letnik" name="letnik">
<option value="1" selected="selected">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select>
<label for="vrsta">VRSTA BESEDILA</label>
<select id="vrsta" name="vrsta">
<option value="esej-spis" selected="selected">Esej ali spis</option>
<option value="prakticno">Praktično besedilo (npr. vabila, prošnje ipd. pri pouku slovenščine), napisano za oceno</option>
<option value="solski-test">Šolski test</option>
<option value="delo-v-razredu">Delo v razredu, ne za oceno</option>
</select>
<div id="vrsta-custom-box" style="display: none;">
<label for="vrsta-custom">Vtipkajte besedilno vrsto:</label>
<input type="text" id="vrsta-custom" name="vrsta-custom"/>
</div>
<label for="solsko-leto">ŠOLSKO LETO</label>
<select id="solsko-leto" name="solsko-leto">
<option value="20-21" selected="selected">2020/21</option>
<option value="21-22">2021/22</option>
</select>
<label for="jezikovni-popravki">JEZIKOVNI POPRAVKI</label>
<select id="jezikovni-popravki" name="jezikovni-popravki">
<option value="popr-ne" selected="selected">Besedilo vsebuje učiteljske popravke in strinjam se z njihovo vključitvijo v korpus</option>
<option value="brez-popr">Besedilo ne vsebuje učiteljskih popravkov</option>
<option value="popr-da">Besedilo vsebuje učiteljske popravke in ne strinjam se z njihovo vključitvijo v korpus</option>
</select>
<button id="button-submit" type="submit">Oddaj</button>
</div>
<div class="dropzone-previews">
</div>
</form>
</div>
</div>-->
<!--{{ dropzone.load_js() }}--> <!--{{ dropzone.load_js() }}-->
<script src="/static/dropzone.js"></script> <script src="../static/dropzone.js"></script>
<script> <script>
///////////////////////// /////////////////////////
// Dropzone // // Dropzone //
@@ -355,10 +295,11 @@
var termsScrollbox = document.getElementById("popup-terms-text"); var termsScrollbox = document.getElementById("popup-terms-text");
var dataConfirmNotification = document.getElementById("data-confirm-notification"); var dataConfirmNotification = document.getElementById("data-confirm-notification");
var errorMessage = document.getElementById("error-message"); var errorMessage = document.getElementById("error-message");
var successMessage = document.getElementById("success-message");
var form = document.forms["form-oddaja"]; var form = document.forms["form-oddaja"];
{% if not institution %} {% if not institution %}
btnSubmit.disabled = true; btnSubmit.disabled = true;
{% endif %} {% endif %}
function isEmptyOrSpaces(str){ function isEmptyOrSpaces(str){
@@ -374,13 +315,20 @@
}); });
} }
const reEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; function showSuccess(str) {
successMessage.querySelector("p").textContent = str;
successMessage.style.display = "block";
window.scroll({
top: 0,
behavior: 'smooth'
});
}
//onready //onready
selectPredmet.addEventListener("change", function(e) { selectPredmet.addEventListener("change", function(e) {
var predmetCustomBox = document.getElementById("predmet-custom-box").closest('.row'); var predmetCustomBox = document.getElementById("predmet-custom-box").closest('.row');
if (selectPredmet.value.startsWith("drug")) { if (selectPredmet.value.startsWith("D")) {
predmetCustomBox.style.maxHeight = "150px"; predmetCustomBox.style.maxHeight = "150px";
} else { } else {
predmetCustomBox.style.maxHeight = "0px"; predmetCustomBox.style.maxHeight = "0px";
@@ -389,7 +337,7 @@
selectVrsta.addEventListener("change", function(e) { selectVrsta.addEventListener("change", function(e) {
var vrstaCustomBox = document.getElementById("vrsta-custom-box").closest('.row'); var vrstaCustomBox = document.getElementById("vrsta-custom-box").closest('.row');
if (selectVrsta.value == "delo-v-razredu") { if (selectVrsta.value == "R") {
vrstaCustomBox.style.maxHeight = "150px"; vrstaCustomBox.style.maxHeight = "150px";
} else { } else {
vrstaCustomBox.style.maxHeight = "0px"; vrstaCustomBox.style.maxHeight = "0px";
@@ -409,25 +357,26 @@
paramName: "file", // The name that will be used to transfer the file paramName: "file", // The name that will be used to transfer the file
maxFilesize: 1000, // MB maxFilesize: 1000, // MB
timeout: 5000000, // milliseconds timeout: 5000000, // milliseconds
acceptedFiles: ".txt, .csv, .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .jpg, .jpeg, .png, .mkv", acceptedFiles: ".txt, .csv, .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .jpg, .jpeg, .png",
maxFiles: 20, maxFiles: 20,
previewsContainer: "#dropzone-previews", previewsContainer: "#dropzone-previews",
dictDefaultMessage: `Kliknite ali odložite datoteke sem.`, dictDefaultMessage: "Kliknite to polje ali povlecite datoteke vanj.",
dictFallbackMessage: "Vaš brskalnik ne podpira izbiranje datotek z odlaganjem (\"drag & drop\").", dictFallbackMessage: "Vaš brskalnik ne podpira izbiranje datotek z odlaganjem (\"drag & drop\").",
dictInvalidFileType: "Datoteka je napačnega formata.", dictInvalidFileType: "Datoteka je napačnega formata.",
dictFileTooBig: "Datoteke je prevelika {{filesize}}. Največja dovoljena velikost: {{maxFilesize}}MiB.", dictFileTooBig: "Datoteke je prevelika {{filesize}}. Največja dovoljena velikost: {{maxFilesize}}MiB.",
dictResponseError: "Napaka strežnika: {{statusCode}}", dictResponseError: "Napaka strežnika: {{statusCode}}",
dictMaxFilesExceeded: "Ne morete naložiti več datotek.", dictMaxFilesExceeded: "Ne morete naložiti več datotek.",
dictCancelUpload: "Prekini prenos", dictCancelUpload: "",
dictRemoveFile: "Odstrani datoteko", dictRemoveFile: "",
dictCancelUploadConfirmation: "Ali res želite odstraniti to datoteko?", dictCancelUploadConfirmation: "Ali res želite odstraniti to datoteko?",
dictUploadCanceled: "Prenos prekinjen", dictUploadCanceled: "Prenos prekinjen",
addRemoveLinks: true,
// The setting up of the dropzone // The setting up of the dropzone
init: function() { init: function() {
var dz = this; var dz = this;
dataConfirmNotification.style.display = "none"; dataConfirmNotification.style.display = "none";
errorMessage.style.display = "none"; errorMessage.style.display = "none";
successMessage.style.display = "none";
btnSubmit.addEventListener("click", function(e) { btnSubmit.addEventListener("click", function(e) {
// Make sure that the form isn't actually being sent. // Make sure that the form isn't actually being sent.
@@ -435,6 +384,7 @@
e.stopPropagation(); e.stopPropagation();
// Check form validity. // Check form validity.
var regija = form["regija"].value;
var program = form["program"].value; var program = form["program"].value;
var predmet = form["predmet"].value; var predmet = form["predmet"].value;
var predmetCustom = form["predmet-custom"].value; var predmetCustom = form["predmet-custom"].value;
@@ -444,9 +394,9 @@
var solskoLeto = form["solsko-leto"].value; var solskoLeto = form["solsko-leto"].value;
var jezikovniPopravki = form["jezikovni-popravki"].value; var jezikovniPopravki = form["jezikovni-popravki"].value;
if (predmet.startsWith("drug") && isEmptyOrSpaces(predmetCustom)) { if (predmet.startsWith("D") && isEmptyOrSpaces(predmetCustom)) {
showError("Polje za predmet ne more biti prazno!"); showError("Polje za predmet ne more biti prazno!");
} else if (vrsta === "delo-v-razredu" && isEmptyOrSpaces(vrstaCustom)) { } else if (vrsta === "R" && isEmptyOrSpaces(vrstaCustom)) {
showError("Polje za vrsto besedila ne more biti prazno!"); showError("Polje za vrsto besedila ne more biti prazno!");
} else if (dataConfirmNotification.style.display == "none") { } else if (dataConfirmNotification.style.display == "none") {
dataConfirmNotification.style.display = "inherit"; dataConfirmNotification.style.display = "inherit";
@@ -454,12 +404,12 @@
} else { } else {
// Hand off data to dropzone // Hand off data to dropzone
dz.processQueue(); //dz.processQueue();
// Clear fields and hide popup agian // Clear fields and hide popup agian
dataConfirmNotification.style.display = "none"; dataConfirmNotification.style.display = "none";
btnSubmit.textContent = "Oddaj"; btnSubmit.textContent = "Oddaj";
form.reset(); //form.reset();
} }
}); });
@@ -468,60 +418,32 @@
btnSubmitFinal.addEventListener("click", function(e) { btnSubmitFinal.addEventListener("click", function(e) {
// Hand off data to dropzone // Hand off data to dropzone
dz.processQueue(); dz.processQueue();
// Clear fields and hide popup agian
/*btnSubmit.disabled = false;
dataConfirmNotification.style.display = "none";
btnSubmit.textContent = "Oddaj";
form.reset();
scrollboxTriggered = false;*/
}); });
/*btnSubmitCancel.addEventListener("click", function(e) { // Listen to the sendingmultiple event. In this case, it's the sendingmultiple event instead
btnSubmit.disabled = false;
scrollboxTriggered = false;
elemTermsPopup.style.display = "none";
});*/
/*
// Enable final submit button only if user scrolls to the end of the terms.
function checkScrollboxTrigger(event) {
var element = event.target;
if (!scrollboxTriggered
&& element.scrollHeight - element.scrollTop <= element.clientHeight + 50
) {
scrollboxTriggered = true;
btnSubmitFinal.disabled = false;
}
}
termsScrollbox.addEventListener('scroll', function(event) {
checkScrollboxTrigger(event);
});
termsScrollbox.addEventListener("mouseenter", function(event) {
checkScrollboxTrigger(event);
});*/
// Listen to the sendingmultiple event. In this case, it's the sendingmultiple event instead
// of the sending event because uploadMultiple is set to true. // of the sending event because uploadMultiple is set to true.
/*this.on("sendingmultiple", function() { this.on("sendingmultiple", function() {
// Gets triggered when the form is actually being sent. // Gets triggered when the form is actually being sent.
// Hide the success button or the complete form. // Hide the success button or the complete form.
}); });
this.on("successmultiple", function(files, response) { this.on("successmultiple", function(files, response) {
showSuccess(response);
dz.removeAllFiles();
dataConfirmNotification.style.display = "none";
btnSubmit.style.display = "";
return;
// Gets triggered when the files have successfully been sent. // Gets triggered when the files have successfully been sent.
// Redirect user or notify of success. // Redirect user or notify of success.
alert("Odgovor strežnika: " + response);
location.reload();
}); });
this.on("errormultiple", function(files, response) { this.on("errormultiple", function(files, response) {
// Gets triggered when there was an error sending the files. // Gets triggered when there was an error sending the files.
// Maybe show form again, and notify user of error // Maybe show form again, and notify user of error
});*/ });
this.on("sending", function(file, xhr, formData) { this.on("sending", function(file, xhr, formData) {
formData.append("regija",form["regija"].value);
formData.append("program",form["program"].value); formData.append("program",form["program"].value);
formData.append("predmet",form["predmet"].value); formData.append("predmet",form["predmet"].value);
formData.append("predmet-custom",form["predmet-custom"].value); formData.append("predmet-custom",form["predmet-custom"].value);
@@ -530,14 +452,13 @@
formData.append("vrsta-custom",form["vrsta-custom"].value); formData.append("vrsta-custom",form["vrsta-custom"].value);
formData.append("solsko-leto",form["solsko-leto"].value); formData.append("solsko-leto",form["solsko-leto"].value);
formData.append("jezikovni-popravki",form["jezikovni-popravki"].value); formData.append("jezikovni-popravki",form["jezikovni-popravki"].value);
}); });
}, },
uploadprogress: function(file, progress, bytesSent) { uploadprogress: function(file, progress, bytesSent) {
if (file.previewElement) { if (file.previewElement) {
console.log(progress); //console.log(progress);
var progressElement = file.previewElement.querySelector("[data-dz-uploadprogress]"); var progressElement = file.previewElement.querySelector("[data-dz-uploadprogress]");
progressElement.style.width = progress + "%"; progressElement.style.width = progress + "%";
//progressElement.querySelector(".progress-text").textContent = progress + "%"; //progressElement.querySelector(".progress-text").textContent = progress + "%";

View File

@@ -3,170 +3,176 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Portal za oddajanje besedil</title> <title>Portal za oddajanje besedil</title>
<link rel="stylesheet" href="/static/style.css" type="text/css"> <link rel="stylesheet" href="../static/css/header.css" type="text/css">
<link rel="stylesheet" href="../static/css/form.css" type="text/css">
<link rel="stylesheet" href="../static/css/simple-grid.css" type="text/css">
<link rel="stylesheet" href="../static/css/contracts.css" type="text/css">
</head> </head>
<body> <body>
<a href="../logout">Odjavi se</a> <header>
{% if is_institution_coordinator %} <div class="logo"><a href="../"><img src="../static/image/logo-white.svg"/></a></div>
<br><a href="../manage-institution">Upravljaj z institucijo</a> <div class="dropdown">
{% endif %} <button class="dropbtn"><img src="/static/image/menu.svg"/></button>
{% if is_admin %} <div class="dropdown-content">
<br><a href="../admin">Administracijski meni</a> <a href="../oddaja">Oddaja</a>
{% endif %} <a href="../zgodovina">Zgodovina</a>
<br><a href="mailto:email@example.com">Pomoč</a> <a href="../pogodbe">Ekipa</a>
<div class="bg"></div> {% if is_institution_coordinator %}
<div id="main-window"> <hr/>
<div id="rect1"> <a href="../manage-institution">Upravljaj z institucijo</a>
<div style="padding: 20px;">
<div id="logo-container">
<img src="/static/image/logo.svg" alt="logo"/>
</div>
<h1 id="title" style="font-size: 25px; position: relative;">Korpus ŠOLAR</h1>
<div class="selection-tabs">
<button onclick="window.location.replace('../oddaja');" class="selection-tab-button">ODDAJA</button>
<button onclick="window.location.replace('../zgodovina');" class="selection-tab-button">ZGODOVINA</button>
<button onclick="window.location.replace('../pogodbe');" class="selection-tab-button selected">POGODBE</button>
</div>
</div>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div class="message-notification">
{{ messages[0] }}
</div>
<div id="contract-container" style="height: 250px;">
{% else %}
<div id="contract-container">
{% endif %}
{% endwith %}
{% if contract_school %}
<div class="contract-item">
<img src="/static/image/contract.png" alt="contract" class="contract-item-icon"/>
<div class="contract-item-title">Pogodba s šolo</div>
<div class="contract-item-data">{{contract_school.original_filename}}</div>
<div class="contract-item-data">DODANO: {{contract_school.timestamp}}</div>
<a href="../pogodbe-institucije/{{ contract_school.file_contract }}.pdf" class="contract-item-button">Prenesi</a>
</div>
</br>
{% endif %} {% endif %}
{% for item in contracts_students %} {% if is_admin %}
<div class="contract-item"> <hr/>
<img src="/static/image/contract.png" alt="contract" class="contract-item-icon"/> <a href="../admin">Administracijski meni</a>
<div class="contract-item-title" style="font-size: 12px;">{{item.original_filename}}</div> {% endif %}
<div class="contract-item-data">Pogodba o prenosu lastništva</div> <hr/>
<div class="contract-item-data">DODANO: {{item.timestamp}}</div> <a href="https://slovenscina.eu/" target="_blank">Več informacij</a>
<a href="../pogodbe-ucencistarsi/{{ item.file_contract }}.pdf" class="contract-item-button">Prenesi</a> <hr/>
</div> <a href="../logout">Odjava</a>
</br>
{% endfor %}
</div> </div>
</br> </div>
</br> </header>
{% if show_upload_form %} <div class="container" style="margin-top:8rem;">
<div style="padding: 20px; position: absolute; top: 500px; width: 89%;"> <div class="row">
<div class="section-desc">Oddaj pogodbo</div> <div class="col-12">
<form action="../pogodbe" method="post" enctype="multipart/form-data"> <h1 class="title">Korpus Šolar</h1>
{% if enable_upload_school_contract %} <p class="subtitle"></p>
<div style="display:flex; flex-direction: row; justify-content: left; align-items: center">
<label style="width: 80%; text-align: right;" for="sola">Pogodba s šolo</label> <div class="tab-nav">
<input style="width: 20%;" type="radio" id="sola" name="tip-pogodbe" value="sola"> <a href="../oddaja">Oddaja besedil</a>
</div> <a href="../zgodovina">Zgodovina sodelovanja</a>
{% else %} <a href="../pogodbe" class="active">Ekipa</a>
<div style="display:flex; flex-direction: row; justify-content: left; align-items: center"> </div>
<label style="width: 80%; text-align: right;" for="sola">Pogodba s šolo</label>
<input style="width: 20%;"type="radio" id="sola" name="tip-pogodbe" value="sola" disabled>
</div>
{% endif %}
<div style="display:flex; flex-direction: row; justify-content: left; align-items: center">
<label style="width: 80%; text-align: right;" for="ucenci-starsi">Pogodba z učenci / starši</label>
<input style="width: 20%;" type="radio" id="ucenci-starsi" name="tip-pogodbe" value="ucenci-starsi" checked>
</div>
<input style="font-size: 10px;" type="file" id="file-contract" name="file[]" multiple="">
<button style="float: right;" type="submit">Oddaj pogodbo</button>
</form>
</div> </div>
</div>
<!--<div class="row">
<div class="col-12">
<h2>Sodelujoči</h2>
</div>
</div>-->
<div class="row" id="my_dataviz_title">
<div class="col-12">
<h2>Število oddaj na uporabnika</h2>
</div>
</div>
<div class="row">
<div class="col-6">
<div id="my_dataviz">
</div>
</div>
</div>
{% set vars = {'prev_schoolyear': ''} %}
{% for item in cooperation_history %}
{% if item[0] != vars.prev_schoolyear %}
<div class="row">
<div class="col-12">
<h2>Šolsko leto {{item[0]}}</h2>
</div>
</div>
{% if vars.update({'prev_schoolyear': item[0]}) %} {% endif %}
{% endif %} {% endif %}
</div> {% for entry in item[1] %}
<div id="rect2" class="mock-side"> <div class="row">
<div id="collaborators-container"> <div class="col-6">
<div class="container-title">Sodelujoči</div> <div class="team-item">
<div style="overflow-y: auto;"> <div class="team-item-name">{{entry.name}} <span class="team-item-role">{%if entry.role == "mentor" %}Mentor{%elif entry.role == "coordinator" %}Koordinator{%elif entry.role == "other" %}Druga vloga{%endif%}</span></div>
{% for collaborator in collaborators %} </div>
<div class="collaborators-item">
<div class="collaborators-item-name">{{collaborator.name}}</div>
{% if collaborator.id in cooperation_history %}
{% if cooperation_history[collaborator.id]["coordinator"]|length > 0 %}
<div class="collaborators-item-years"><b>Vodenje:</b> {% for item in cooperation_history[collaborator.id]["coordinator"] %}
{% if loop.index != 1 %}, {% endif %}
{{item[0]}}
{% endfor %}</div>
{% endif %}
{% if cooperation_history[collaborator.id]["mentor"]|length > 0 %}
<div class="collaborators-item-years"><b>Mentorstvo:</b> {% for item in cooperation_history[collaborator.id]["mentor"] %}
{% if loop.index != 1 %}, {% endif %}
{{item[0]}}
{% endfor %}</div>
{% endif %}
{% if cooperation_history[collaborator.id]["other"]|length > 0 %}
<div class="collaborators-item-years"><b>Drugo:</b> {% for item in cooperation_history[collaborator.id]["other"] %}
{% if loop.index != 1 %}, {% endif %}
{{item[0]}}
{% endfor %}</div>
{% endif %}
{% endif %}
</div>
{% endfor %}
</div> </div>
</div> </div>
<div id="awards-container"> {% endfor %}
<div class="container-title">Sodelovanje v letih</div> {% endfor %}
<div style="overflow-y: auto; margin: auto; width: 100%; height: 200px;">
{% if cooperation_history.keys()|length > 0 %}
{% if user_id in cooperation_history %}
{% for item in cooperation_history[user_id]['coordinator'] %}
<div style="border-bottom: 2px solid #c4c4c4; min-height: 50px; margin-bottom: 10px;">
<img src="/static/image/star.png" alt="star" style="float: left; width: 40px;"/>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;text-overflow: ellipsis; overflow: hidden; white-space: nowrap;">
{{item[1]}}
</div>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;">
{{item[0]}}
</div>
</div>
{% endfor %}
{% for item in cooperation_history[user_id]['mentor'] %}
<div style="border-bottom: 2px solid #c4c4c4; min-height: 50px; margin-bottom: 10px;">
<img src="/static/image/star.png" alt="star" style="float: left; width: 40px;"/>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;text-overflow: ellipsis; overflow: hidden; white-space: nowrap;">
{{item[1]}}
</div>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;">
{{item[0]}}
</div>
</div>
{% endfor %}
{% for item in cooperation_history[user_id]['other'] %}
<div style="border-bottom: 2px solid #c4c4c4; min-height: 50px; margin-bottom: 10px;">
<img src="/static/image/star.png" alt="star" style="float: left; width: 40px;"/>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;text-overflow: ellipsis; overflow: hidden; white-space: nowrap;">
{{item[1]}}
</div>
<div class="collaborators-item-name"
style="float: right; width: 250px; text-align: left; margin-left: 20px;">
{{item[0]}}
</div>
</div>
{% endfor %}
{% endif %}
{% endif %}
</div>
</div>
</div>
</div> </div>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
</body> </body>
<script src="https://d3js.org/d3.v6.js"></script>
<style>
#my_dataviz .tick line{
visibility:hidden;
}
#my_dataviz path.domain{
visibility:hidden;
}
</style>
<script>
var data;
// Parse the Data
d3.json("/topuploads-institution/{{institution_id}}").then(function(jsondata) {
if(Object.keys(jsondata).length < 1) {
document.getElementById("my_dataviz_title").remove();
return;
}
data = [];
console.log(Object.keys(jsondata).length);
var margin = {top: 20, right: 0, bottom: 40, left: 0};
var width = document.getElementById("my_dataviz").clientWidth - margin.left - margin.right;
var height = Object.keys(jsondata).length * 56;
var svg = d3.select("#my_dataviz")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.style("overflow","visible")
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
for(var key in jsondata) {
data.push({'name': key, 'value':jsondata[key]});
}
console.log(data);
// Add X axis
var x = d3.scaleLinear()
.domain([0,d3.max(data, function (d) { return d.value})])
.range([ 0, width]);
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x))
.selectAll("text")
.style("text-anchor", "center");
// Y axis
var y = d3.scaleBand()
.range([ 0, data.length*56 ])
.domain(data.map(function(d) { return d.name; }))
.padding(0);
svg.append("g")
.call(d3.axisLeft(y))
.selectAll("text")
.style("text-anchor", "start")
.style("font-size", "14px")
.attr("transform", "translate(8,-36)");
//Bars
svg.selectAll("myRect")
.data(data)
.enter()
.append("rect")
.attr("x", x(0) )
.attr("y", function(d) { return y(d.name); })
.attr("width", function(d) { return x(d.value); })
.attr("height", 32 )
.attr("fill", "#006CB7");
})
</script>
</html> </html>

View File

@@ -3,23 +3,31 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Portal ŠOLAR</title> <title>Portal ŠOLAR</title>
<link rel="stylesheet" href="/static/css/login-styles.css" type="text/css"> <link rel="stylesheet" href="../static/css/login-styles.css" type="text/css">
<link rel="stylesheet" href="/static/css/utils.css" type="text/css"> <link rel="stylesheet" href="../static/css/utils.css" type="text/css">
</head> </head>
<body> <body>
<div class="background"> <div class="background">
<div class="panel login-panel"> <div class="panel login-panel">
<div class="panel-logo"> <div class="panel-logo">
<img src="/static/image/logo.svg" alt="logo"/> <img src="../static/image/logo.svg" alt="logo"/>
</div> </div>
<h2 class="text-center">Portal za oddajanje besedil</h2> <h2 class="text-center">Portal za oddajanje besedil</h2>
<div class="line"></div> <div class="line"></div>
<h1 class="text-center">Korpus ŠOLAR</h1> <h1 class="text-center">Korpus ŠOLAR</h1>
<div class="text-center m-b-3"><em>Zbiranje besedil za korpus Šolar poteka po naslednjem postopku, ki prinaša tudi točke za napredovanje.</em></div> <div class="text-center m-b-3"><em>Zbiranje besedil za korpus Šolar poteka po naslednjem postopku, ki prinaša tudi točke za napredovanje v pedagoški naziv.</em></div>
<h1 class="m-b-3">Registracija</h1> <h1 class="m-b-3">Registracija</h1>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div class="alert">
<img src="../static/image/alert.svg" alt="alert"/>
<p>{{ messages[0] }}</p>
</div>
{% endif %}
{% endwith %}
<div> <div>
<form method="POST" action="../register" class="m-b-2"> <form method="POST" action="../register" class="m-b-2">
<div class="input-wrapper"> <div class="input-wrapper">
@@ -40,7 +48,8 @@
<img src="../static/image/password.svg" alt="user" class="input-icon"/> <img src="../static/image/password.svg" alt="user" class="input-icon"/>
<div class="input-floating-label"> <div class="input-floating-label">
<label>Geslo</label> <label>Geslo</label>
<input type="password" name="password"> <input type="password" name="password">
<label class="input-hint">Geslo naj bo dolgo vsaj 8 znakov.</label>
</div> </div>
</div> </div>
<div class="input-wrapper"> <div class="input-wrapper">
@@ -64,14 +73,11 @@
<button class="btn" style="margin-left: 46px;">REGISTRACIJA</button> <button class="btn" style="margin-left: 46px;">REGISTRACIJA</button>
</form> </form>
</div> </div>
{% with messages = get_flashed_messages() %}
{% if messages %} <div class="back-to-login">
<div class="alert"> <img src="../static/image/chevron-left.svg"/>
<img src="/static/image/alert.svg" alt="alert"/> <a href="../login">Nazaj na prijavo</a>
<p>{{ messages[0] }}</p>
</div> </div>
{% endif %}
{% endwith %}
</div> </div>

View File

@@ -3,14 +3,14 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Portal ŠOLAR</title> <title>Portal ŠOLAR</title>
<link rel="stylesheet" href="/static/css/login-styles.css" type="text/css"> <link rel="stylesheet" href="../static/css/login-styles.css" type="text/css">
<link rel="stylesheet" href="/static/css/utils.css" type="text/css"> <link rel="stylesheet" href="../static/css/utils.css" type="text/css">
</head> </head>
<body> <body>
<div class="background"> <div class="background">
<div class="panel login-panel"> <div class="panel login-panel">
<div class="panel-logo"> <div class="panel-logo">
<img src="/static/image/logo.svg" alt="logo"/> <img src="../static/image/logo.svg" alt="logo"/>
</div> </div>
<h1 class="m-b-3">Ponastavitev gesla - ŠOLAR</h1> <h1 class="m-b-3">Ponastavitev gesla - ŠOLAR</h1>
<div> <div>
@@ -20,6 +20,7 @@
<div class="input-floating-label"> <div class="input-floating-label">
<label>Novo geslo</label> <label>Novo geslo</label>
<input type="password" name="new_password"> <input type="password" name="new_password">
<label class="input-hint">Geslo naj bo dolgo vsaj 8 znakov.</label>
</div> </div>
</div> </div>

View File

@@ -3,98 +3,197 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Portal za oddajanje besedil</title> <title>Portal za oddajanje besedil</title>
<!--<link rel="stylesheet" href="/static/style.css" type="text/css">--> <!--<link rel="stylesheet" href="../static/style.css" type="text/css">-->
<script src="/static/chart.js"></script> <script src="../static/chart.js"></script>
<link rel="stylesheet" href="/static/css/header.css" type="text/css"> <link rel="stylesheet" href="../static/css/header.css" type="text/css">
<link rel="stylesheet" href="/static/css/form.css" type="text/css"> <link rel="stylesheet" href="../static/css/form.css" type="text/css">
<link rel="stylesheet" href="/static/css/simple-grid.css" type="text/css"> <link rel="stylesheet" href="../static/css/simple-grid.css" type="text/css">
<link rel="stylesheet" href="/static/css/history.css" type="text/css"> <link rel="stylesheet" href="../static/css/history.css" type="text/css">
</head> </head>
<body> <body>
<header> <header>
<div class="logo"><a href="/"><img src="/static/image/logo-white.svg"/></a></div> <div class="logo"><a href="../"><img src="../static/image/logo-white.svg"/></a></div>
<div class="dropdown">
<button class="dropbtn"><img src="/static/image/menu.svg"/></button>
<div class="dropdown-content">
<a href="../oddaja">Oddaja</a>
<a href="../zgodovina">Zgodovina</a>
<a href="../pogodbe">Ekipa</a>
{% if is_institution_coordinator %}
<hr/>
<a href="../manage-institution">Upravljaj z institucijo</a>
{% endif %}
{% if is_admin %}
<hr/>
<a href="../admin">Administracijski meni</a>
{% endif %}
<hr/>
<a href="https://slovenscina.eu/" target="_blank">Več informacij</a>
<hr/>
<a href="../logout">Odjava</a>
</div>
</div>
</header> </header>
<div class="container" style="margin-top:8rem;"> <div class="container" style="margin-top:8rem;">
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<h1 class="title">Koprus SOLAR</h1> <h1 class="title">Korpus Šolar</h1>
<p class="subtitle">Zbiranje besedil za korpus Šolar poteka po naslednjem postopku, ki prinaša tudi točke za napredovanje.</p> <p class="subtitle"></p>
<div class="tab-nav"> <div class="tab-nav">
<a href="/oddaja">Oddaja</a> <a href="../oddaja">Oddaja besedil</a>
<a href="/zgodovina" class="active">Zgodovina</a> <a href="../zgodovina" class="active">Zgodovina sodelovanja</a>
<a href="/pogodbe">Pogodbe</a> <a href="../pogodbe">Ekipa</a>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <!--<div class="row">
<div class="col-12"> <div class="col-12">
<h2>Zgodovina naloženih datotek</h2> <h2>Zgodovina naloženih datotek</h2>
</div> </div>
</div>-->
{% set map_program = {
"OS" : "Osnovna šola",
"SSG" : "Splošna in strokovna gimnazija",
"MGP" : "Mednarodni gimnazijski programi",
"ZG" : "Zasebne gimnazije",
"NPI" : "Nižje poklicno izobraževanje",
"SPI" : "Srednje poklicno izobraževanje",
"SSI" : "Srednje strokovno izobraževanje",
"PTI" : "Poklicno-tehnično izobraževanje"
}%}
{% set map_subject = {
"SLO" : "Slovenščina",
"DJP" : "Drugi jezikoslovni predmeti",
"DDP" : "Drugi družboslovni predmeti",
"DNP" : "Drugi naravoslovni predmeti",
"DSP" : "Drugi strokovni predmeti",
"DIP" : "Drugi izbirni ali dodatni predmeti",
}%}
{% set map_text_type = {
"E" : "Esej ali spis",
"PB" : "Praktično besedilo, napisano za oceno",
"T" : "Šolski test",
"R" : "Delo v razredu, ne za oceno",
}%}
{% set map_grammar_corrections = {
"DD" : "Besedilo vsebuje učiteljske popravke",
"N" : "Besedilo ne vsebuje učiteljskih popravkov",
"DN" : "Besedilo vsebuje učiteljske popravke in ne strinjam se z njihovo vključitvijo v korpus",
}%}
{% set map_regions = {
"CE" : "Celje",
"GO" : "Nova Gorica",
"KK" : "Krško",
"KP" : "Koper",
"KR" : "Kranj",
"LJ" : "Ljubljana",
"MB" : "Maribor",
"MS" : "Murska Sobota",
"NM" : "Novo Mesto",
"PO" : "Postojna",
"SG" : "Slovenj Gradec",
}%}
{% if upload_history|length == 0 %}
<div class="row">
<div class="col-6">
<p>Zgodovina sodelovanja je trenutno še prazna.</p>
</div>
</div> </div>
{% endif %}
{% for item in upload_history %} {% for item in upload_history %}
{% set item_values = [] %}
{% if institution_names[loop.index - 1] %}
{% set item_values = item_values + [institution_names[loop.index - 1]] %}
{% endif %}
{% if item.region %}
{% set item_values = item_values + [map_regions[item.region]] %}
{% endif %}
{% if item.program %}
{% set item_values = item_values + [map_program[item.program]] %}
{% endif %}
{% if item.subject %}
{% set item_values = item_values + [map_subject[item.subject]] %}
{% endif %}
{% if item.subject_custom %}
{% set item_values = item_values + [item.subject_custom] %}
{% endif %}
{% if item.grade %}
{% set item_values = item_values + [item.grade ~ ". razred"] %}
{% endif %}
{% if item.text_type %}
{% set item_values = item_values + [map_text_type[item.text_type]] %}
{% endif %}
{% if item.text_type_custom %}
{% set item_values = item_values + [item.text_type_custom] %}
{% endif %}
{% if item.school_year %}
{% set item_values = item_values + ['20' ~ item.school_year | replace("-", "/")] %}
{% endif %}
{% if item.grammar_corrections %}
{% set item_values = item_values + [map_grammar_corrections[item.grammar_corrections]] %}
{% endif %}
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<div class="history-item"> <div class="history-item">
<div class="history-item-date">Dodano {{ item.timestamp.strftime('%d. %m. %Y') }}</div> <div class="history-item-date">Dodano {{ item.timestamp.strftime('%d. %m. %Y') }}</div>
<div class="history-item-uploader">{{ uploader_names[loop.index - 1] }}</div> <div class="history-item-uploader">{{ uploader_names[loop.index - 1] }}</div>
<div class="history-item-filecount">Št. datotek: {{ item.upload_file_hashes|length }}</div> <div class="history-item-filecount">Št. datotek: {{ item.upload_file_hashes|length }}</div>
<div class="history-item-chevron"><img src="../static/image/chevron-down.svg"/></div>
<div class="history-item-desc"> <div class="history-item-desc">
{{ item_values | join(" | ") |truncate(120) }}
{% set began = False %}
{% if institution_names[loop.index - 1] %}
{% if began %}, {% endif %} {{ institution_names[loop.index - 1] }}
{% set began = True %}
{% endif %}
{% if item.program %}
{% if began %}, {% endif %} {{ item.program }}
{% set began = True %}
{% endif %}
{% if item.subject %}
{% if began %}, {% endif %} {{ item.subject }}
{% set began = True %}
{% endif %}
{% if item.subject_custom %}
{% if began %}, {% endif %} {{ item.subject_custom }}
{% set began = True %}
{% endif %}
{% if item.grade %}
{% if began %}, {% endif %} {{ item.grade }}
{% set began = True %}
{% endif %}
{% if item.text_type %}
{% if began %}, {% endif %} {{ item.text_type }}
{% set began = True %}
{% endif %}
{% if item.text_type_custom %}
{% if began %}, {% endif %} {{ item.text_type_custom }}
{% set began = True %}
{% endif %}
{% if item.school_year %}
{% if began %}, {% endif %} {{ item.school_year }}
{% set began = True %}
{% endif %}
{% if item.grammar_corrections %}
{% if began %}, {% endif %} {{ item.grammar_corrections }}
{% set began = True %}
{% endif %}
</div> </div>
<div class="row">
<div class="col-6" style="margin:0">
<div class="history-item-desc-full">
{% for v in item_values %}
{{v}}<br>
{% endfor %}
</div>
</div>
<div class="col-6" style="margin:0">
<div class="history-item-files-full">
{% if item.upload_file_names != None %}
{% for f_name in item.upload_file_names %}
<div class="file-item">
<div class="file-icon"><img src="../static/image/file.svg"/></div>
<a href="getuploadfile/{{item.id}}/{{item.upload_file_hashes[loop.index - 1]}}" class="file-name" {% if item.upload_file_codes != None %}download="{{item.upload_file_codes[loop.index - 1]}}.{{f_name.split('.')[1]}}"{%endif%}>
{% if item.upload_file_codes != None %}
{{item.upload_file_codes[loop.index - 1]}}.{{f_name.split('.')[1]}}
{%else%}
{{f_name}}
{% endif %}
</a>
</br>
{% if item.upload_file_codes != None %}
<!--<div>{{item.upload_file_codes[loop.index - 1]}}</div>-->
{% endif %}
</div>
{% endfor %}
{% else %}
{% for f_hash in item.upload_file_hashes %}
<div class="file-item">
<div class="file-icon"><img src="../static/image/file.svg"/></div>
<a href="getuploadfile/{{item.id}}/{{f_hash}}" class="file-name">{{f_hash}}</a>
</div>
{% endfor %}
{% endif %}
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<br/><br/><br/><br/><br/><br/><br/>
@@ -102,117 +201,23 @@
<script>
<a href="../logout">Odjavi se</a> var toggleOpen = function() {
{% if is_institution_coordinator %} this.classList.toggle("open");
<br><a href="../manage-institution">Upravljaj z institucijo</a> };
{% endif %} var elements = document.getElementsByClassName("history-item");
{% if is_admin %} for (var i = 0; i < elements.length; i++) {
<br><a href="../admin">Administracijski meni</a> elements[i].addEventListener('click', toggleOpen, false);
{% endif %} }
<br><a href="mailto:email@example.com">Pomoč</a>
<div class="bg"></div>
<div id="main-window">
<div id="rect1">
<div style="padding: 20px;">
<div id="logo-container">
<img src="/static/image/logo.svg" alt="logo"/>
</div>
<h1 id="title" style="font-size: 25px; position: relative;">Korpus ŠOLAR</h1>
<div class="selection-tabs">
<button onclick="window.location.replace('../oddaja');" class="selection-tab-button">ODDAJA</button>
<button onclick="window.location.replace('../zgodovina');" class="selection-tab-button selected">ZGODOVINA</button>
<button onclick="window.location.replace('../pogodbe');" class="selection-tab-button">POGODBE</button>
</div>
</div>
<div id="history-container" style="padding: 20px;">
{% for item in upload_history %}
<div class="history-item">
<div class="history-item-date">{{ item.timestamp }}</div>
<div class="history-item-uploader">{{ uploader_names[loop.index - 1] }}</div>
<div class="history-item-filecount">Št. datotek: {{ item.upload_file_hashes|length }}</div>
<div class="history-item-desc">
[
{% set began = False %}
{% if institution_names[loop.index - 1] %}
{% if began %}, {% endif %} {{ institution_names[loop.index - 1] }}
{% set began = True %}
{% endif %}
{% if item.program %}
{% if began %}, {% endif %} {{ item.program }}
{% set began = True %}
{% endif %}
{% if item.subject %}
{% if began %}, {% endif %} {{ item.subject }}
{% set began = True %}
{% endif %}
{% if item.subject_custom %}
{% if began %}, {% endif %} {{ item.subject_custom }}
{% set began = True %}
{% endif %}
{% if item.grade %}
{% if began %}, {% endif %} {{ item.grade }}
{% set began = True %}
{% endif %}
{% if item.text_type %}
{% if began %}, {% endif %} {{ item.text_type }}
{% set began = True %}
{% endif %}
{% if item.text_type_custom %}
{% if began %}, {% endif %} {{ item.text_type_custom }}
{% set began = True %}
{% endif %}
{% if item.school_year %}
{% if began %}, {% endif %} {{ item.school_year }}
{% set began = True %}
{% endif %}
{% if item.grammar_corrections %}
{% if began %}, {% endif %} {{ item.grammar_corrections }}
{% set began = True %}
{% endif %}
]
</div>
</div>
</br>
{% endfor %}
</div>
</div>
<div id="rect2" class="mock-side">
<canvas id="myChart" width="400" height="400"></canvas>
<script>
function drawChart(data) {
var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'bar',
data: {
labels: Object.keys(data),
datasets: [{
label: 'št. naloženih datotek',
data: Object.values(data),
backgroundColor: 'rgba(54, 162, 235, 1.0)',
borderWidth: 1
}]
},
options: {
plugins: {
title: {
display: true,
text: ''
}
},
scales: {
y: {
beginAtZero: true
}
},
indexAxis: 'y'
}
});
}
fetch('../topuploads').then(r => r.json()).then(j => drawChart(j));
</script> var files = document.getElementsByClassName("file-item");
</div> for (var i = 0; i < files.length; i++) {
</div> files[i].addEventListener('click', function(e) {
e.stopPropagation();
}, false);
}
</script>
</body> </body>
</html> </html>