Added Docker stuff.

This commit is contained in:
msinkec
2020-07-08 13:56:33 +02:00
commit 4e27767ac1
119 changed files with 12738 additions and 0 deletions

45
admin/admin.config.js Normal file
View File

@@ -0,0 +1,45 @@
'use strict';
angular
.module('sloDialectsAdmin')
.config(function($routeProvider) {
$routeProvider
.when("/", {
template: "<admin></admin>" // list items
})
.when("/edit/:id", {
template: "<edit></edit>" // edit item
})
.when("/new/:id", {
template: "<new></new>" // edit item
})
.when('/login', {
template: '<auth></auth>'
})
.when('/users', {
template: '<users></users>'
})
.when('/user', {
template: '<user></user>'
})
.when('/password', {
template: '<password></password>'
})
.otherwise('/login');
})
.run(['$rootScope', '$location', '$cookieStore', '$http',
function ($rootScope, $location, $cookieStore, $http) {
// keep user logged in after page refresh
$rootScope.globals = $cookieStore.get('globals') || {};
if ($rootScope.globals.currentUser) {
$http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
}
$rootScope.$on('$locationChangeStart', function (event, next, current) {
// redirect to login page if not logged in
if ($location.path() !== '/login' && !$rootScope.globals.currentUser) {
$location.path('/login');
}
});
}]);

14
admin/admin.module.js Normal file
View File

@@ -0,0 +1,14 @@
'use strict';
angular
.module('sloDialectsAdmin', [
'ui.bootstrap',
'ngRoute',
'ngCookies'
])
.constant('Config', {
// If app not in server root, add relative path, otherwise leave empty string. Define also in api/config.php and app.module.js!
APP_PATH: ''
});

View File

@@ -0,0 +1,58 @@
/*
* Edited by: Nermin Jukan, 63150367
* Date: 21. 05. 2018
* Modifications: Edited the delete function so that it shows the Name property and no the ID.
*/
'use strict';
angular
.module('sloDialectsAdmin')
.component('admin', {
templateUrl: 'components/admin/admin.template.html',
controller: ['$http', '$location', 'dialectSelect', function AdminController($http, $location, dialectSelect) {
var vm = this;
vm.go = go;
vm.selectItems = dialectSelect;
vm.createNew = createNew;
getDialects();
function getDialects(){
$http.get('../api/dialects').then(function (result) {
vm.dialects = result.data;
}, function (error) {
console.log('Error getting dialects');
});
}
vm.delete = function (id, name) {
if (confirm("Ali ste prepričani, da želite izbrisati vnos " + name + "?")) {
$http.delete('../api/dialects/'+id).then(function(result){
//console.log(result.data);
getDialects();
}, function(error){
console.log('Error deleting entry:', error);
});
}
};
function createNew() {
$http.post('../api/dialects').then(function (response) {
go('/new/' + response.data.id);
}, function (error) {
alert('Prišlo je do napake pri dodajanju novega vnosa:', error);
});
}
function go(path) {
$location.path(path);
}
}]
});

View File

@@ -0,0 +1,51 @@
<!---
* Edited by: Nermin Jukan, 63150367
* Date: 21. 05. 2018
* Modifications: Added a new attribute that is passed on to the delete function 'dialect.location_name' on line 43.
--->
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="toolbar" style="left:0px;">
<button type="button" ng-click="$ctrl.go('/login')" class="btn btn-warning">Odjava</button>
<!--<img src="/resources/icons/logout.png" height="32" style="cursor:pointer;" ng-click="$ctrl.go('/login')" title="Odjava">-->
<img src="../resources/icons/users.png" height="32" style="cursor:pointer;" ng-click="$ctrl.go('/users')" title="Uporabniki">
<img src="../resources/icons/lock.png" height="32" style="cursor:pointer;" ng-click="$ctrl.go('/password')" title="Menjava gesla">
</div>
<h1>Urejevalnik narečnih besedil</h1>
<div class="toolbar">
<button type="button" ng-click="$ctrl.createNew()" class="btn btn-primary save">Dodaj nov vnos</button>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row">
<table class="table table-striped">
<thead>
<tr bgcolor='#CCCCCC'>
<th>#</th>
<th>Kratica</th>
<th>Kraj</th>
<th>Narečje</th>
<th>Urejanje</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="dialect in $ctrl.dialects | orderBy: 'location_name'">
<td>{{ $index + 1 }}</td>
<td>{{dialect.location_label}}</td>
<td>{{dialect.location_name}}</td>
<td ng-repeat="x in $ctrl.selectItems" ng-if="x.key === dialect.dialect_key">
{{x.name}}
</td>
<td>
<a href="#!/edit/{{dialect.id}}">Uredi</a> | <a href="" ng-click="$ctrl.delete(dialect.id, dialect.location_name)">Izbriši</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>

View File

@@ -0,0 +1,25 @@
'use strict';
angular
.module('sloDialectsAdmin')
.component('auth', {
templateUrl: 'components/auth/auth.template.html',
controller: ['$scope', '$rootScope', '$location', 'AuthenticationService',
function ($scope, $rootScope, $location, AuthenticationService) {
// reset login status
AuthenticationService.ClearCredentials();
$scope.login = function () {
$scope.dataLoading = true;
AuthenticationService.Login($scope.username, $scope.password, function(response) {
if(response.success) {
AuthenticationService.SetCredentials($scope.username, $scope.password);
$location.path('/');
} else {
$scope.error = response.message;
$scope.dataLoading = false;
}
});
};
}]
});

View File

@@ -0,0 +1,130 @@
'use strict';
angular.module('sloDialectsAdmin')
.factory('AuthenticationService',
['Base64', '$http', '$cookieStore', '$rootScope', '$timeout',
function (Base64, $http, $cookieStore, $rootScope, $timeout) {
var service = {};
service.Login = function (username, password, callback) {
$http.post('../api/authenticate', { username: username, password: password }).then(function (response) {
callback(response.data);
});
};
service.GetCredentials = function () {
return $rootScope.globals.currentUser;
};
service.SetCredentials = function (username, password) {
var authdata = Base64.encode(username + ':' + password);
$rootScope.globals = {
currentUser: {
username: username,
authdata: authdata,
admin: null
}
};
$http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; // jshint ignore:line
$cookieStore.put('globals', $rootScope.globals);
};
service.ClearCredentials = function () {
$rootScope.globals = {};
$cookieStore.remove('globals');
$http.defaults.headers.common.Authorization = 'Basic ';
};
return service;
}])
.factory('Base64', function () {
/* jshint ignore:start */
var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
return {
encode: function (input) {
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
do {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
keyStr.charAt(enc1) +
keyStr.charAt(enc2) +
keyStr.charAt(enc3) +
keyStr.charAt(enc4);
chr1 = chr2 = chr3 = "";
enc1 = enc2 = enc3 = enc4 = "";
} while (i < input.length);
return output;
},
decode: function (input) {
var output = "";
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
var base64test = /[^A-Za-z0-9\+\/\=]/g;
if (base64test.exec(input)) {
window.alert("There were invalid base64 characters in the input text.\n" +
"Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" +
"Expect errors in decoding.");
}
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
do {
enc1 = keyStr.indexOf(input.charAt(i++));
enc2 = keyStr.indexOf(input.charAt(i++));
enc3 = keyStr.indexOf(input.charAt(i++));
enc4 = keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
chr1 = chr2 = chr3 = "";
enc1 = enc2 = enc3 = enc4 = "";
} while (i < input.length);
return output;
}
};
/* jshint ignore:end */
});

View File

@@ -0,0 +1,23 @@
<div class="auth_container">
<h1>Urejevalnik narečnih besedil</h1>
<h2>Prijava</h2>
<div ng-show="error" class="alert alert-danger">{{error}}</div>
<form name="form" ng-submit="login()" role="form">
<div class="form-group">
<label for="username">Uporabniško ime</label>
<i class="fa fa-key"></i>
<input type="text" name="username" id="username" class="form-control" ng-model="username" required />
<span ng-show="form.username.$dirty && form.username.$error.required" class="help-block">Uporabniško ime je obvezno.</span>
</div>
<div class="form-group">
<label for="password">Geslo</label>
<i class="fa fa-lock"></i>
<input type="password" name="password" id="password" class="form-control" ng-model="password" required />
<span ng-show="form.password.$dirty && form.password.$error.required" class="help-block">Geslo je obvezno.</span>
</div>
<div class="form-actions">
<button type="submit" ng-disabled="form.$invalid || dataLoading" class="btn btn-danger">Prijava</button>
<img ng-if="dataLoading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA=="/>
</div>
</form>
</div>

View File

@@ -0,0 +1,207 @@
'use strict';
angular
.module('sloDialectsAdmin')
.component('edit', {
templateUrl: 'components/edit/edit.template.html',
controller: ['$http', '$routeParams', 'dialectSelect', '$location', '$scope', '$timeout', 'Config', function EditController($http, $routeParams, dialectSelect, $location, $scope, $timeout, Config) {
var vm = this;
vm.id = parseInt($routeParams.id);
vm.selectItems = dialectSelect;
vm.uploadFile = uploadFile;
vm.createNewAnalysisItem = createNewAnalysisItem;
vm.deleteAnalysisItem = deleteAnalysisItem;
vm.save = save;
vm.go = go;
vm.deleteAudio = deleteAudio;
var audioPath;
vm.analysisPlaceholders = [
'Naglas', 'Dolgi samoglasniki', 'Kratki naglašeni samoglasniki', 'Nenaglašeni samoglasniki', 'Soglasniki', 'Oblikoslovni pojavi', 'Leksika'
];
if(vm.id && vm.id > 0){
getAllDialectData(vm.id);
}
function uploadFile(event){
//document.getElementById('audio').classList.remove('hidden');
//console.log(document.getElementById('selected'));
document.getElementById('selected').classList.remove('hidden');
document.getElementById('selected').innerText = document.getElementById('audio').value;
var file = event.target.files[0];
vm.fileFormData = new FormData();
vm.fileFormData.append('file',file);
file = null;
/*
vm.dialectData.audioFile = file;
vm.dialectData.audio = file.name;
var files = document.getElementById('audio').files[0];
*/
};
function getAllDialectData(id){
getDialectData(id);
getAnalysisData(id);
}
function getDialectData(id){
$http.get('../api/dialects/'+id).then(function (result) {
vm.dialectData = result.data;
audioPath = Config.APP_PATH + vm.dialectData.audio;
if(vm.dialectData.audio){
var audio = document.createElement('AUDIO')
audio.id = 'audioID';
audio.controls = true;
audio.currentTime = 0;
document.getElementById('putAudio').appendChild(audio);
document.getElementById('audioID').src = audioPath;
}
}, function (error) {
console.log('Error getting dialects');
});
}
function getAnalysisData(id){
$http.get('../api/dialects/'+id+'/analysis/').then(function (result) {
vm.analysisData = prepareAnalysisData(result.data);
}, function (error) {
console.log('Error getting analysis');
});
}
function prepareAnalysisData(analysis) {
var _analysisData = [];
analysis.forEach(function (a) {
_analysisData[a.section] = _analysisData[a.section] || [];
_analysisData[a.section].push({
id: a.id,
section: a.section,
maintext: a.maintext,
examples: a.examples
});
});
return _analysisData;
}
function createNewAnalysisItem(dialect_id, section_id){
return $http.post('../api/dialects/'+dialect_id+'/analysis', {"section_id": section_id}).then(function(result){
// add also to view model
vm.analysisData = vm.analysisData || [];
vm.analysisData[section_id] = vm.analysisData[section_id] || [];
vm.analysisData[section_id].push({
id: result.data.id,
section: section_id,
maintext: '',
examples: ''
});
console.log('Successfuly created new analysis item.', result);
}, function(error){
console.log('Error creating new analysis item.', error);
});
}
function deleteAnalysisItem(dialect_id, analysis_id){
if(confirm('Ali ste prepričani, da želite izbrisati ta vnos? ' + dialect_id + ' ' + analysis_id)){
$http.delete('../api/dialects/'+dialect_id+'/analysis/'+analysis_id).then(function(response){
// remove from view model
for(var i in vm.analysisData){
vm.analysisData[i] = _.filter(vm.analysisData[i], function(e){
return e.id != analysis_id;
});
}
console.log('Deleted analysis item with id', analysis_id + '. Response: ', response);
}, function(err){
console.log('Error deleting item ', analysis_id+':', err);
});
}
}
function deleteAudio(delete_id, audio) {
if(confirm('Ali ste prepričani, da želite izbrisati ta posnetek? ' + audio)){
if(delete_id && delete_id > 0){
document.getElementById('putAudio').removeChild(document.getElementById('putAudio').firstChild);
//console.log(delete_id);
var promise1 = $http.delete('../api/dialects/' + delete_id + '/audio', {
}).then(function(response){
getAllDialectData(delete_id);
//location.reload();
console.log('Datoteka je izbrisana.');
}, function(error){
alert('Prišlo je do napake pri brisanju.');
console.log('Error', error);
});
}
}
}
function save(dialect_id, goBack){
if(dialect_id && dialect_id > 0){
var promise1 = $http.put('../api/dialects/'+dialect_id, {
analysisData: vm.analysisData,
dialectData: vm.dialectData
}).then(function(response){
//alert('Narečje je bilo uspešno shranjeno.');
}, function(error){
alert('Prišlo je do napake pri shranjevanju.');
console.log('Error', error);
});
if(vm.fileFormData){
if(document.getElementById('putAudio').firstChild){
document.getElementById('putAudio').removeChild(document.getElementById('putAudio').firstChild);
}
var promise2 = $http({
method: 'POST',
url: '../api/dialects/'+vm.id+'/files',
data: vm.fileFormData,
headers: {'Content-Type': undefined, 'Process-Data': false},
}).then(function(response){
//console.log(response);
if(!goBack){
location.reload();
//console.log(response);
}
console.log('File uploaded.');
}, function(error){
console.log('Error uploading file:', error);
});
if(goBack){
Promise.all([promise1, promise2]).then(function() {
go('/');
});
} else {
alert('Spremembe so bile shranjene.')
}
} else {
if(goBack){
Promise.all([promise1]).then(function() {
go('/');
});
} else {
alert('Spremembe so bile shranjene.')
}
}
} else {
console.log('Dialect missing, cannot save.');
}
}
function go(path){
$location.path(path);
$timeout(function() {
$scope.$apply();
}, 0);
}
}]
});

View File

@@ -0,0 +1,176 @@
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="toolbar" style="left:16px;">
<button type="button" ng-click="$ctrl.go('/login')" class="btn btn-warning">Odjava</button>
</div>
<h1>Urejevalnik narečnih besedil</h1>
<div class="toolbar">
<button type="button" ng-click="$ctrl.save($ctrl.id, false)" class="btn btn-success save">Shrani</button>
<button type="button" ng-click="$ctrl.save($ctrl.id, true)" class="btn btn-default save">Shrani in zapri</button>
<button type="button" ng-click="$ctrl.go('/')" class="btn btn-danger">Prekliči</button>
</div>
</div>
</div>
</div>
<div class="container">
<form class="form-material" ng-submit="$ctrl.save();">
<div class="row">
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">Osnovni podatki</div>
<div class="panel-body">
<div class="form-group">
<label class="col-md-12">Oznaka</label>
<div class="col-md-12">
<input type="text" name="location_label" ng-model="$ctrl.dialectData.location_label" placeholder="F" class="form-control form-control-line">
</div>
</div>
<div class="form-group">
<label for="example-email" class="col-md-12">Lokacija</label>
<div class="col-md-12">
<input type="text" name="location_name" ng-model="$ctrl.dialectData.location_name" placeholder="Filovci" class="form-control form-control-line">
</div>
</div>
<div class="form-group">
<label class="col-sm-12">Narečje oz. podnarečje</label>
<div class="col-sm-12">
<select name="dialect_key" ng-model="$ctrl.dialectData.dialect_key" class="form-control form-control-line">
<option value="">--- Izberite ---</option>
<option ng-repeat="i in $ctrl.selectItems" value="{{i.key}}">{{ i.name }}</option>
</select>
</div>
</div>
<div class="form-group">
<label for="example-email" class="col-md-12">Zemljepisna širina in dolžina</label>
<div class="form-row align-items-center">
<div class="col-md-6">
<input type="text" name="location_latitude" ng-model="$ctrl.dialectData.location_latitude" placeholder="46.662270" class="form-control form-control-line">
</div>
<div class="col-md-6">
<input type="text" name="location_longitude" ng-model="$ctrl.dialectData.location_longitude" placeholder="16.299627" class="form-control form-control-line">
</div>
</div>
</div>
<div class="form-group">
<label for="example-metainfo" class="col-md-12">Metapodatki</label>
<div class="col-md-12">
<pre><textarea name="metadata" ng-model="$ctrl.dialectData.metadata" placeholder="Posnel Janez Novak dne 1.1.2018, ..." class="form-control form-control-line" rows="2"></textarea></pre>
</div>
</div>
<div class="form-group">
<label for="example-email" class="col-md-12">Zvočni zapis (priporočeno: mp3)</label>
<div class="col-md-12">
<p ng-if="$ctrl.dialectData.audio">Naložena datoteka: {{$ctrl.dialectData.audio}}</p>
<button class="btn btn-warning" ng-if="$ctrl.dialectData.audio" type="button" ng-click="$ctrl.deleteAudio($ctrl.id, $ctrl.dialectData.audio)">Izbriši naloženo datoteko</button><br>
<p ng-if="!$ctrl.dialectData.audio">Ni naložene datoteke.</p>
<br><div id="putAudio"></div><br>
<input type="file" id="audio" style="visibility:hidden" custom-on-change="$ctrl.uploadFile">
<input ng-if="!$ctrl.dialectData.audio" type="button" value="Izberite datoteko" onclick="document.getElementById('audio').click();" class="btn btn-info"><br>
<p class="hidden" id="selected"></p>
</div>
</div>
</div><!-- panel-body -->
</div><!-- panel -->
</div>
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">Besedilo</div>
<div class="panel-body">
<div class="form-group">
<label class="col-md-12">Transkripcija</label>
<div class="col-md-12">
<textarea name="transcription" ng-model="$ctrl.dialectData.transcription" placeholder="Fˈčȧːs sọ biˈlẹː ˈiže pˈrec iˈnåčiše..." class="form-control form-control-line" rows="6"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-md-12">Poknjižitev</label>
<div class="col-md-12">
<textarea name="literal_slovene" ng-model="$ctrl.dialectData.standard_slovene" placeholder="Včasih so bile hiše precej inačiše drugačne..." class="form-control form-control-line" rows="6"></textarea>
</div>
</div>
</div><!-- panel-body -->
</div><!-- panel -->
</div><!-- col -->
</div><!-- row -->
<div class="row">
<div class="col-xs-12">
<div class="panel panel-default" id="analiza">
<div class="panel-heading">Analiza</div>
<div class="panel-body">
<table class="table table-bordered">
<thead>
<tr>
<th>Sekcija</th>
<th>Opis</th>
<th>Primeri</th>
</tr>
</thead>
<tbody ng-repeat="i in [1,2,3,4,5,6,7]">
<tr class="tr-head">
<td>{{ i }}</td>
<td colspan="2">
<div class="form-group">
<div class="col-md-12">
<input type="text" name="section{{i}}" placeholder="{{$ctrl.analysisPlaceholders[i-1]}}" ng-model="$ctrl.dialectData['analysis'+i]" class="form-control form-control-line">
</div>
</div>
</td>
</tr>
<tr ng-repeat="a in $ctrl.analysisData[i]" class="analysis-items">
<td>{{i}}.{{$index+1}} <!--<a style="background:red; color:white;" href="" ng-click="$ctrl.deleteAnalysisItem(i, $index+1)">DELETE</a>-->
<button type="button" class="close" ng-click="$ctrl.deleteAnalysisItem($ctrl.id, a.id)" aria-label="Close"><span style="color:red;" title="Izbriši">×</span></button>
</td>
<td>
<div class="form-group">
<div class="col-md-12">
<textarea name="maintext[i][$index]" ng-model="$ctrl.analysisData[i][$index].maintext" class="form-control form-control-line" rows="5"></textarea>
</div>
</div>
</td>
<td>
<div class="form-group">
<div class="col-md-12">
<textarea name="example[i][$index]" ng-model="$ctrl.analysisData[i][$index].examples" class="form-control form-control-line" rows="5"></textarea>
</div>
</div>
</td>
</tr>
<tr class="analysis-items">
<td></td>
<td colspan="2">
<div class="form-group">
<div class="col-md-12">
<button type="button" class="btn btn-default" ng-click="$ctrl.createNewAnalysisItem($ctrl.id, i)">+ dodaj vnos</button>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div><!-- panel-body -->
</div><!-- panel -->
</div><!-- col -->
</div><!-- row -->
</form>
</div><!-- container -->
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="toolbar-bottom">
<button type="button" ng-click="$ctrl.save($ctrl.id, false)" class="btn btn-success save">Shrani</button>
<button type="button" ng-click="$ctrl.save($ctrl.id, true)" class="btn btn-default save">Shrani in zapri</button>
<button type="button" ng-click="$ctrl.go('/')" class="btn btn-danger">Prekliči</button>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,220 @@
'use strict';
angular
.module('sloDialectsAdmin')
.component('new', {
templateUrl: 'components/new/new.template.html',
controller: ['$http', '$routeParams', 'dialectSelect', '$location', '$scope', '$timeout', 'Config', function NewController($http, $routeParams, dialectSelect, $location, $scope, $timeout, Config) {
var vm = this;
vm.id = parseInt($routeParams.id);
vm.selectItems = dialectSelect;
vm.uploadFile = uploadFile;
vm.createNewAnalysisItem = createNewAnalysisItem;
vm.deleteAnalysisItem = deleteAnalysisItem;
vm.save = save;
vm.go = go;
vm.cancel = cancel;
vm.deleteAudio = deleteAudio;
var audioPath;
vm.analysisPlaceholders = [
'Naglas', 'Dolgi samoglasniki', 'Kratki naglašeni samoglasniki', 'Nenaglašeni samoglasniki', 'Soglasniki', 'Oblikoslovni pojavi', 'Leksika'
];
if(vm.id && vm.id > 0){
getAllDialectData(vm.id);
}
function uploadFile(event){
//document.getElementById('audio').classList.remove('hidden');
//console.log(document.getElementById('selected'));
document.getElementById('selected').classList.remove('hidden');
document.getElementById('selected').innerText = document.getElementById('audio').value;
var file = event.target.files[0];
vm.fileFormData = new FormData();
vm.fileFormData.append('file',file);
file = null;
/*
vm.dialectData.audioFile = file;
vm.dialectData.audio = file.name;
var files = document.getElementById('audio').files[0];
*/
};
function getAllDialectData(id){
getDialectData(id);
getAnalysisData(id);
}
function getDialectData(id){
$http.get('../api/dialects/'+id).then(function (result) {
vm.dialectData = result.data;
audioPath = Config.APP_PATH + vm.dialectData.audio;
if(vm.dialectData.audio){
var audio = document.createElement('AUDIO')
audio.id = 'audioID';
audio.controls = true;
audio.currentTime = 0;
document.getElementById('putAudio').appendChild(audio);
document.getElementById('audioID').src = audioPath;
}
}, function (error) {
console.log('Error getting dialects');
});
}
function getAnalysisData(id){
$http.get('../api/dialects/'+id+'/analysis/').then(function (result) {
vm.analysisData = prepareAnalysisData(result.data);
}, function (error) {
console.log('Error getting analysis');
});
}
function prepareAnalysisData(analysis) {
var _analysisData = [];
analysis.forEach(function (a) {
_analysisData[a.section] = _analysisData[a.section] || [];
_analysisData[a.section].push({
id: a.id,
section: a.section,
maintext: a.maintext,
examples: a.examples
});
});
return _analysisData;
}
function createNewAnalysisItem(dialect_id, section_id){
return $http.post('../api/dialects/'+dialect_id+'/analysis', {"section_id": section_id}).then(function(result){
// add also to view model
vm.analysisData = vm.analysisData || [];
vm.analysisData[section_id] = vm.analysisData[section_id] || [];
vm.analysisData[section_id].push({
id: result.data.id,
section: section_id,
maintext: '',
examples: ''
});
console.log('Successfuly created new analysis item.', result);
}, function(error){
console.log('Error creating new analysis item.', error);
});
}
function deleteAnalysisItem(dialect_id, analysis_id){
if(confirm('Ali ste prepričani, da želite izbrisati ta vnos? ' + dialect_id + ' ' + analysis_id)){
$http.delete('../api/dialects/'+dialect_id+'/analysis/'+analysis_id).then(function(response){
// remove from view model
for(var i in vm.analysisData){
vm.analysisData[i] = _.filter(vm.analysisData[i], function(e){
return e.id != analysis_id;
});
}
console.log('Deleted analysis item with id', analysis_id + '. Response: ', response);
}, function(err){
console.log('Error deleting item ', analysis_id+':', err);
});
}
}
function deleteAudio(delete_id, audio) {
if(confirm('Ali ste prepričani, da želite izbrisati ta posnetek? ' + audio)){
if(delete_id && delete_id > 0){
document.getElementById('putAudio').removeChild(document.getElementById('putAudio').firstChild);
//console.log(delete_id);
var promise1 = $http.delete('../api/dialects/' + delete_id + '/audio', {
}).then(function(response){
getAllDialectData(delete_id);
//location.reload();
console.log('Datoteka je izbrisana.');
}, function(error){
alert('Prišlo je do napake pri brisanju.');
console.log('Error', error);
});
}
}
}
function save(dialect_id, goBack){
if(dialect_id && dialect_id > 0){
var promise1 = $http.put('../api/dialects/'+dialect_id, {
analysisData: vm.analysisData,
dialectData: vm.dialectData
}).then(function(response){
//alert('Narečje je bilo uspešno shranjeno.');
}, function(error){
alert('Prišlo je do napake pri shranjevanju.');
console.log('Error', error);
});
if(vm.fileFormData){
if(document.getElementById('putAudio').firstChild){
document.getElementById('putAudio').removeChild(document.getElementById('putAudio').firstChild);
}
var promise2 = $http({
method: 'POST',
url: '../api/dialects/'+vm.id+'/files',
data: vm.fileFormData,
headers: {'Content-Type': undefined, 'Process-Data': false},
}).then(function(response){
//console.log(response);
if(!goBack){
location.reload();
//console.log(response);
}
console.log('File uploaded.');
}, function(error){
console.log('Error uploading file:', error);
});
if(goBack){
Promise.all([promise1, promise2]).then(function() {
go('/');
});
} else {
Promise.all([promise1, promise2]).then(function() {
go('edit/'+vm.id);
});
}
} else {
if(goBack){
Promise.all([promise1]).then(function() {
go('/');
});
} else {
go('edit/'+vm.id);
}
}
} else {
console.log('Dialect missing, cannot save.');
}
}
function go(path){
$location.path(path);
$timeout(function() {
$scope.$apply();
}, 0);
}
function cancel(path){
if(confirm("Nov vnos se ne bo shranil, ali želite nadaljevati?")) {
$http.delete('../api/dialects/'+vm.id).then(function(result){
go(path);
}, function(error){
console.log('Error deleting entry:', error);
});
}
}
}]
});

View File

@@ -0,0 +1,176 @@
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="toolbar" style="left:16px;">
<button type="button" ng-click="$ctrl.go('/login')" class="btn btn-warning">Odjava</button>
</div>
<h1>Urejevalnik narečnih besedil</h1>
<div class="toolbar">
<button type="button" ng-click="$ctrl.save($ctrl.id, false)" class="btn btn-success save">Shrani</button>
<button type="button" ng-click="$ctrl.save($ctrl.id, true)" class="btn btn-default save">Shrani in zapri</button>
<button type="button" ng-click="$ctrl.cancel('/')" class="btn btn-danger">Prekliči</button>
</div>
</div>
</div>
</div>
<div class="container">
<form class="form-material" ng-submit="$ctrl.save();">
<div class="row">
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">Osnovni podatki</div>
<div class="panel-body">
<div class="form-group">
<label class="col-md-12">Oznaka</label>
<div class="col-md-12">
<input type="text" id="oznaka" name="location_label" ng-model="$ctrl.dialectData.location_label" placeholder="F" class="form-control form-control-line">
</div>
</div>
<div class="form-group">
<label for="example-email" class="col-md-12">Lokacija</label>
<div class="col-md-12">
<input type="text" id="lokacija" name="location_name" ng-model="$ctrl.dialectData.location_name" placeholder="Filovci" class="form-control form-control-line">
</div>
</div>
<div class="form-group">
<label class="col-sm-12">Narečje oz. podnarečje</label>
<div class="col-sm-12">
<select id="narecje" name="dialect_key" ng-model="$ctrl.dialectData.dialect_key" class="form-control form-control-line">
<option value="">--- Izberite ---</option>
<option ng-repeat="i in $ctrl.selectItems" value="{{i.key}}">{{ i.name }}</option>
</select>
</div>
</div>
<div class="form-group">
<label for="example-email" class="col-md-12">Zemljepisna širina in dolžina</label>
<div class="form-row align-items-center">
<div class="col-md-6">
<input type="text" name="location_latitude" ng-model="$ctrl.dialectData.location_latitude" placeholder="46.662270" class="form-control form-control-line">
</div>
<div class="col-md-6">
<input type="text" name="location_longitude" ng-model="$ctrl.dialectData.location_longitude" placeholder="16.299627" class="form-control form-control-line">
</div>
</div>
</div>
<div class="form-group">
<label for="example-metainfo" class="col-md-12">Metapodatki</label>
<div class="col-md-12">
<pre><textarea name="metadata" ng-model="$ctrl.dialectData.metadata" placeholder="Posnel Janez Novak dne 1.1.2018, ..." class="form-control form-control-line" rows="2"></textarea></pre>
</div>
</div>
<div class="form-group">
<label for="example-email" class="col-md-12">Zvočni zapis (priporočeno: mp3)</label>
<div class="col-md-12">
<p ng-if="$ctrl.dialectData.audio">Naložena datoteka: {{$ctrl.dialectData.audio}}</p>
<button class="btn btn-warning" ng-if="$ctrl.dialectData.audio" type="button" ng-click="$ctrl.deleteAudio($ctrl.id, $ctrl.dialectData.audio)">Izbriši naloženo datoteko</button><br>
<p ng-if="!$ctrl.dialectData.audio">Ni naložene datoteke.</p>
<br><div id="putAudio"></div><br>
<input type="file" id="audio" style="visibility:hidden" custom-on-change="$ctrl.uploadFile">
<input ng-if="!$ctrl.dialectData.audio" type="button" value="Izberite datoteko" onclick="document.getElementById('audio').click();" class="btn btn-info"><br>
<p class="hidden" id="selected"></p>
</div>
</div>
</div><!-- panel-body -->
</div><!-- panel -->
</div>
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">Besedilo</div>
<div class="panel-body">
<div class="form-group">
<label class="col-md-12">Transkripcija</label>
<div class="col-md-12">
<textarea name="transcription" ng-model="$ctrl.dialectData.transcription" placeholder="Fˈčȧːs sọ biˈlẹː ˈiže pˈrec iˈnåčiše..." class="form-control form-control-line" rows="6"></textarea>
</div>
</div>
<div class="form-group">
<label class="col-md-12">Poknjižitev</label>
<div class="col-md-12">
<textarea name="literal_slovene" ng-model="$ctrl.dialectData.standard_slovene" placeholder="Včasih so bile hiše precej inačiše drugačne..." class="form-control form-control-line" rows="6"></textarea>
</div>
</div>
</div><!-- panel-body -->
</div><!-- panel -->
</div><!-- col -->
</div><!-- row -->
<div class="row">
<div class="col-xs-12">
<div class="panel panel-default" id="analiza">
<div class="panel-heading">Analiza</div>
<div class="panel-body">
<table class="table table-bordered">
<thead>
<tr>
<th>Sekcija</th>
<th>Opis</th>
<th>Primeri</th>
</tr>
</thead>
<tbody ng-repeat="i in [1,2,3,4,5,6,7]">
<tr class="tr-head">
<td>{{ i }}</td>
<td colspan="2">
<div class="form-group">
<div class="col-md-12">
<input type="text" name="section{{i}}" placeholder="{{$ctrl.analysisPlaceholders[i-1]}}" ng-model="$ctrl.dialectData['analysis'+i]" class="form-control form-control-line">
</div>
</div>
</td>
</tr>
<tr ng-repeat="a in $ctrl.analysisData[i]" class="analysis-items">
<td>{{i}}.{{$index+1}} <!--<a style="background:red; color:white;" href="" ng-click="$ctrl.deleteAnalysisItem(i, $index+1)">DELETE</a>-->
<button type="button" class="close" ng-click="$ctrl.deleteAnalysisItem($ctrl.id, a.id)" aria-label="Close"><span style="color:red;" title="Izbriši">×</span></button>
</td>
<td>
<div class="form-group">
<div class="col-md-12">
<textarea name="maintext[i][$index]" ng-model="$ctrl.analysisData[i][$index].maintext" class="form-control form-control-line" rows="5"></textarea>
</div>
</div>
</td>
<td>
<div class="form-group">
<div class="col-md-12">
<textarea name="example[i][$index]" ng-model="$ctrl.analysisData[i][$index].examples" class="form-control form-control-line" rows="5"></textarea>
</div>
</div>
</td>
</tr>
<tr class="analysis-items">
<td></td>
<td colspan="2">
<div class="form-group">
<div class="col-md-12">
<button type="button" class="btn btn-default" ng-click="$ctrl.createNewAnalysisItem($ctrl.id, i)">+ dodaj vnos</button>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div><!-- panel-body -->
</div><!-- panel -->
</div><!-- col -->
</div><!-- row -->
</form>
</div><!-- container -->
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="toolbar-bottom">
<button type="button" ng-click="$ctrl.save($ctrl.id, false)" class="btn btn-success save">Shrani</button>
<button type="button" ng-click="$ctrl.save($ctrl.id, true)" class="btn btn-default save">Shrani in zapri</button>
<button type="button" ng-click="$ctrl.go('/')" class="btn btn-danger">Prekliči</button>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,39 @@
'use strict';
angular
.module('sloDialectsAdmin')
.component('password', {
templateUrl: 'components/password/password.template.html',
controller: ['$http', '$location', '$timeout', function PasswordController($http, $location, $timeout) {
var vm = this;
vm.go = go;
vm.username = "";
vm.changePassword = function(){
vm.error = "";
// TODO
$http.put('../api/changePassword', {old_password: vm.old_password, new_password: vm.new_password, new_password_repeat: vm.new_password_repeat}).then(function (result) {
if(result.data.success){
vm.success = result.data.message;
$timeout(function(){
go('/login');
}, 3000);
} else {
vm.error = result.data.message;
}
}, function (error, x) {
vm.error = "Prišlo je do napake pri zahtevi za menjavo gesla.";
});
}
function go(path) {
$location.path(path);
}
}]
});

View File

@@ -0,0 +1,44 @@
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="toolbar" style="left:0px;">
<button type="button" ng-click="$ctrl.go('/')" class="btn btn-default">Nazaj</button>
<button type="button" ng-click="$ctrl.go('/login')" class="btn btn-warning">Odjava</button>
</div>
<h1>Sprememba gesla</h1>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="auth_container">
<div ng-show="$ctrl.error" class="alert alert-danger">{{$ctrl.error}}</div>
<div ng-show="$ctrl.success" class="alert alert-success" role="alert">{{$ctrl.success}}</div>
<form ng-hide="$ctrl.success" name="form" ng-submit="$ctrl.changePassword()" role="form">
<div class="form-group">
<label for="old_password">Staro geslo</label>
<i class="fa fa-key"></i>
<input type="password" name="old_password" id="old_password" class="form-control" ng-model="$ctrl.old_password" required />
<span ng-show="form.old_password.$dirty && form.old_password.$error.required" class="help-block">Staro geslo je zahtevano</span>
</div>
<div class="form-group">
<label for="new_password">Novo geslo</label>
<i class="fa fa-lock"></i>
<input type="password" name="new_password" id="new_password" class="form-control" ng-model="$ctrl.new_password" required />
<span ng-show="form.new_password.$dirty && form.new_password.$error.required" class="help-block">Novo geslo je zahtevano</span>
</div>
<div class="form-group">
<label for="new_password_repeat">Ponovite novo geslo</label>
<i class="fa fa-lock"></i>
<input type="password" name="new_password_repeat" id="new_password_repeat" class="form-control" ng-model="$ctrl.new_password_repeat" required />
<span ng-show="form.new_password_repeat.$dirty && form.new_password_repeat.$error.required" class="help-block">Novo geslo je zahtevano</span>
</div>
<div class="form-actions">
<button type="submit" ng-disabled="form.$invalid || dataLoading" class="btn btn-danger">Shrani</button>
<img ng-if="dataLoading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA=="/>
</div>
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,42 @@
'use strict';
angular
.module('sloDialectsAdmin')
.component('user', {
templateUrl: 'components/user/user.template.html',
controller: ['$http', '$location', '$timeout', function UsersController($http, $location, $timeout) {
var vm = this;
vm.go = go;
vm.addUser = function(){
vm.success = "";
vm.error = "";
var is_admin = vm.is_admin ? 1 : 0;
$http.post('../api/users', {name: vm.name, username: vm.username, password: vm.password, password_repeat: vm.password_repeat, is_admin: is_admin}).then(function (result) {
var data = result.data;
if(data.success){
vm.success = data.message;
$timeout(function(){
go('/users');
}, 3000);
} else {
vm.error = data.message;
}
}, function (error) {
console.log('Error creating user', error);
vm.error = error;
});
}
function go(path) {
$location.path(path);
}
}]
});

View File

@@ -0,0 +1,51 @@
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="toolbar" style="left:0px;">
<button type="button" ng-click="$ctrl.go('/users')" class="btn btn-default">Nazaj</button>
<button type="button" ng-click="$ctrl.go('/login')" class="btn btn-warning">Odjava</button>
</div>
<h1>Nov uporabnik</h1>
<div class="toolbar">
<button type="button" ng-click="$ctrl.addUser()" class="btn btn-success save">Dodaj uporabnika</button>
<img ng-if="dataLoading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA=="/>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="auth_container">
<div ng-show="$ctrl.error" class="alert alert-danger">{{$ctrl.error}}</div>
<div ng-show="$ctrl.success" class="alert alert-success" role="alert">{{$ctrl.success}}</div>
<form ng-hide="$ctrl.success" name="form" ng-submit="$ctrl.createNewUser()" role="form">
<div class="form-group">
<label for="username">Ime in priimek</label>
<input type="text" name="name" id="name" class="form-control" ng-model="$ctrl.name" required />
<span ng-show="form.name.$dirty && form.name.$error.required" class="help-block">Polno ime je zahtevano</span>
</div>
<div class="form-group">
<label for="username">Uporabniško ime</label>
<input type="text" name="username" id="username" class="form-control" ng-model="$ctrl.username" required />
<span ng-show="form.username.$dirty && form.username.$error.required" class="help-block">Uporabniško ime je zahtevano</span>
</div>
<div class="form-group">
<label for="password">Geslo</label>
<input type="password" name="password" id="password" class="form-control" ng-model="$ctrl.password" required />
<span ng-show="form.password.$dirty && form.password.$error.required" class="help-block">Geslo je zahtevano</span>
</div>
<div class="form-group">
<label for="password_repeat">Ponovite geslo</label>
<input type="password" name="password_repeat" id="password_repeat" class="form-control" ng-model="$ctrl.password_repeat" required />
<span ng-show="form.password_repeat.$dirty && form.password_repeat.$error.required" class="help-block">Geslo je zahtevano</span>
</div>
<div class="form-group">
<label for="is_admin" style="display:inline-block;">Skrbnik</label>
<input type="checkbox" name="is_admin" id="is_admin" class="form-control" style="display: inline-block; width: 34px; margin-left: 10px; bottom: -10px; position: relative;" ng-model="$ctrl.is_admin" required />
</div>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1,65 @@
/*
* Edited by: Nermin Jukan, 63150367
* Date: 21. 05. 2018
* Modifications: Added a delete users function on lines 31-40.
*/
'use strict';
angular
.module('sloDialectsAdmin')
.component('users', {
templateUrl: 'components/users/users.template.html',
controller: ['$http', '$location', 'AuthenticationService',
function UsersController($http, $location, AuthenticationService) {
var vm = this;
vm.go = go;
vm.user = AuthenticationService.GetCredentials();
vm.user.admin = isAdmin(vm.user.username);
//vm.users = [];
getUsers();
function isAdmin(username) {
//console.log(username);
$http.post('../api/admin/', {username: username}).then(function (result) {
//console.log(result.data);
vm.user.admin = result.data.is_admin;
//console.log(vm.user.admin);
}, function (error) {
console.log('Error retrieving admin rights', error);
});
}
// TODO
function getUsers() {
$http.get('../api/users').then(function (result) {
vm.users = result.data;
}, function (error) {
console.log('Error getting users', error);
});
}
vm.delete = function (id, name) {
if (confirm("Ali ste prepričani, da želite izbrisati uporabnika " + name + "?")) {
$http.delete('../api/users/'+id).then(function(result){
console.log(result.data);
getUsers();
}, function(error){
console.log('Error deleting entry:', error);
});
}
};
function go(path) {
$location.path(path);
}
}]
});

View File

@@ -0,0 +1,45 @@
<!---
* Edited by: Nermin Jukan, 63150367
* Date: 16. 05. 2018
* Modifications: Added a new table header in line 33, inserted a delete-'izbrisi' link, that deletes a user.
--->
<div class="container">
<div class="row">
<div class="col-xs-12">
<div class="toolbar" style="left:0px;">
<button type="button" ng-click="$ctrl.go('/')" class="btn btn-default">Nazaj</button>
<button type="button" ng-click="$ctrl.go('/login')" class="btn btn-warning">Odjava</button>
</div>
<h1>Uporabniški računi</h1>
<div class="toolbar">
<button type="button" ng-if="$ctrl.user.admin == 1" ng-click="$ctrl.go('/user')" class="btn btn-primary save">Dodaj uporabnika</button>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row">
<table class="table table-striped">
<thead>
<tr bgcolor='#CCCCCC'>
<th>#</th>
<th>Ime in priimek</th>
<th>Uporabniško ime</th>
<th title="Lahko dodaja in briše uporabnike">Skrbnik</th>
<th ng-if="$ctrl.user.admin == 1">Upravljanje</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="user in $ctrl.users">
<td>{{ $index + 1 }}</td>
<td>{{user.name}}</td>
<td>{{user.username}}</td>
<td>{{(user.is_admin == 1) ? 'da' : 'ne'}}</td>
<td ng-if="$ctrl.user.admin == 1"><a href="" ng-if="user.username !== $ctrl.user.username && $ctrl.user.admin == 1" ng-click="$ctrl.delete(user.id, user.name)">Izbriši</a></td>
</tr>
</tbody>
</table>
</div>
</div>

View File

@@ -0,0 +1,16 @@
'use strict';
angular
.module('sloDialectsAdmin')
.directive('customOnChange', function () {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var onChangeHandler = scope.$eval(attrs.customOnChange);
element.on('change', onChangeHandler);
element.on('$destroy', function () {
element.off();
});
}
};
});

50
admin/index.html Normal file
View File

@@ -0,0 +1,50 @@
<?php require_once('authenticate.php'); ?>
<!DOCTYPE html>
<html ng-app="sloDialectsAdmin">
<head>
<title>Urejanje - Interaktivna karta slovenskih narečnih besedil</title>
<meta name="viewport" content="initial-scale=1.0">
<meta charset="utf-8">
<meta name="author" content="Ivan Lovrić - ivan@lovric.si">
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<!-- styles -->
<link rel="stylesheet" type="text/css" href="../style/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="../style/admin.css">
<!-- vendor -->
<script src="../vendor/lodash.min.js"></script>
<script src="../vendor/angular.min.js"></script>
<script src="../vendor/angular-route.min.js"></script>
<script src="../vendor/angular-cookies.min.js"></script>
<script src="../vendor/ui-bootstrap-2.5.0.min.js"></script>
<script src="../vendor/ui-bootstrap-tpls-2.5.0.min.js"></script>
<!-- main -->
<script src="admin.module.js"></script>
<script src="admin.config.js"></script>
<!-- components -->
<script src="components/admin/admin.component.js"></script>
<script src="components/edit/edit.component.js"></script>
<script src="components/new/new.component.js"></script>
<script src="components/users/users.component.js"></script>
<script src="components/user/user.component.js"></script>
<script src="components/password/password.component.js"></script>
<script src="components/auth/auth.component.js"></script>
<script src="components/auth/auth.services.js"></script>
<!-- services -->
<script src="services/dialectselect.service.js"></script>
<!-- directives -->
<script src="directives/customOnChange.directive.js"></script>
</head>
<body>
<ng-view></ng-view>
</body>
</html>

View File

@@ -0,0 +1,58 @@
'use strict';
angular
.module('sloDialectsAdmin')
.factory('dialectSelect', [function() {
return [
{key: "_banjsko_podnarecje", name: "Banjško podnarečje"},
{key: "_basko_podnarecje", name: "Baško podnarečje"},
{key: "brisko_narecje", name: "Briško narečje"},
{key: "cerkljansko_narecje", name: "Cerkljansko narečje"},
{key: "cisko_narecje", name: "Čiško narečje"},
{key: "crnovrsko_narecje", name: "Črnovrško narečje"},
{key: "dolenjsko_narecje", name: "Dolenjsko narečje"},
{key: "gorenjsko_narecje", name: "Gorenjsko narečje"},
{key: "halosko_narecje", name: "Haloško narečje"},
{key: "horjulsko_narecje", name: "Horjulsko narečje"},
{key: "istrsko_narecje", name: "Istrsko narečje"},
{key: "juznobelokranjsko_narecje", name: "Južnobelokranjsko narečje"},
{key: "juznopohorsko_narecje", name: "Južnopohorsko narečje"},
{key: "kostelsko_narecje", name: "Kostelsko narečje"},
{key: "_kozjasko_podnarecje", name: "Kozjansko podnarečje"},
{key: "kozjansko-bizeljsko_narecje", name: "Kozjansko-bizeljsko narečje"},
{key: "_kranjskogorsko_podnarecje", name: "Kranjskogorsko podnarečje"},
{key: "krasko_narecje", name: "Kraško narečje"},
{key: "_lasko_podnarecje", name: "Laško podnarečje"},
{key: "mesani_kocevski_govori", name: "Mešani kočevski govori"},
{key: "mezisko_narecje", name: "Mežiško narečje"},
{key: "nadisko_narecje", name: "Nadiško narečje"},
{key: "notranjsko_narecje", name: "Notranjsko narečje"},
{key: "obirsko_narecje", name: "Obirsko narečje"},
{key: "obsosko_narecje", name: "Obsoško narečje"},
{key: "podjunsko_narecje", name: "Podjunsko narečje"},
{key: "poljansko_narecje", name: "Poljansko narečje"},
{key: "posavsko_narecje", name: "Posavsko narečje"},
{key: "prekmursko_narecje", name: "Prekmursko narečje"},
{key: "prlesko_narecje", name: "Prleško narečje"},
{key: "rezijansko_narecje", name: "Rezijansko narečje"},
{key: "_rizansko_podnarecje", name: "Rižansko podnarečje"},
{key: "rozansko_narecje", name: "Rožansko narečje"},
{key: "selsko_narecje", name: "Selško narečje"},
{key: "severnobelokranjsko_narecje", name: "Severnobelokranjsko narečje"},
{key: "severnopohorsko-remsnisko_narecje", name: "Severnopohorsko-remšniško narečje"},
{key: "_sevnisko-krsko_podnarecje", name: "Sevniško-krško podnarečje"},
{key: "slovenskogorisko_narecje", name: "Slovenskogoriško narečje"},
{key: "_solcavsko_podnarecje", name: "Solčavsko podnarečje"},
{key: "srednjesavinjsko_narecje", name: "Srednjesavinjsko narečje"},
{key: "srednjestajersko_narecje", name: "Srednještajersko narečje"},
{key: "_savrinsko_podnarecje", name: "Šavrinsko podnarečje"},
{key: "skofjelosko_narecje", name: "Škofjeloško narečje"},
{key: "tersko_narecje", name: "Tersko narečje"},
{key: "tolminsko_narecje", name: "Tolminsko narečje"},
{key: "_vzhodnodolenjsko_podnarecje", name: "Vzhodnodolenjsko podnarečje"},
{key: "_vzhodnogorenjsko_podnarecje", name: "Vzhodnogorenjsko podnarečje"},
{key: "_zagorsko_trboveljsko_podnarecje", name: "Zagorsko trboveljsko podnarečje"},
{key: "zgornjesavinjsko_narecje", name: "Zgornjesavinjsko narečje"},
{key: "ziljsko_narecje", name: "Ziljsko narečje"}
];
}]);