Compare commits

...
28 Commits
Author SHA1 Message Date
roemmelter63329 6a69bbcaf7 Global refactor 2019-07-24 12:36:43 +02:00
mandutzse68104 577f041928 mong.tags 2019-07-24 12:16:02 +02:00
mandutzse68104 285249254a Merge remote-tracking branch 'origin/developer' into developer
# Conflicts:
#	public/routes/msgCard.js
2019-07-23 21:42:14 +02:00
mandutzse68104 9f9d3c1480 bookmars 2019-07-23 21:41:27 +02:00
gruenzingerxe68435 9a16ed0480 Geht bei der Suche zurück zum Dashboard 2019-07-23 21:25:44 +02:00
gruenzingerxe68435 ce740b61ec Suche nach Links 2019-07-23 18:39:31 +02:00
gruenzingerxe68435 499f0764da fixed subscribe-btn 2019-07-23 17:44:03 +02:00
gruenzingerxe68435 bac8786ab4 Merge remote-tracking branch 'origin/developer' into developer
# Conflicts:
#	public/routes/home.js
#	public/style/style.css
#	public/style/style.less
2019-07-23 17:38:11 +02:00
gruenzingerxe68435 6529b1d937 verschiedenes 2019-07-23 17:34:57 +02:00
roemmelter63329 2d4850520d Vue Rerender function 2019-07-23 17:22:01 +02:00
mandutzse68104 b1d0a0f095 bookmark without color change 2019-07-23 16:07:14 +02:00
roemmelter63329 ae5360386a Session object deletion on logout; 2019-07-23 13:31:39 +02:00
roemmelter63329 85bca37a8c User creation on login (server-seitig) 2019-07-23 10:34:20 +02:00
mandutzse68104 a6dd34cf81 adding/ loading of bookmarks implemented (only for fixed User) 2019-07-22 23:01:01 +02:00
Edwina Barbalan 9eaf71ec3d Desktopansicht Profil und Home angepasst 2019-07-22 18:51:02 +02:00
gruenzingerxe68435 6eb741760f Button und Link für die Suche 2019-07-22 18:40:51 +02:00
roemmelter63329 3550f1558b Merge remote-tracking branch 'origin/developer' into developer 2019-07-22 16:56:33 +02:00
Edwina Barbalan b62927c28d Merge remote-tracking branch 'origin/developer' into developer
# Conflicts:
#	public/routes/createMessage.js
#	public/routes/files.js
2019-07-22 16:51:34 +02:00
Edwina Barbalan 0f06d8fcd7 Kleiner Fehler in buefy.css ausgebessert 2019-07-22 16:36:56 +02:00
Edwina Barbalan 613041d5cb Desktopansicht bei Suche/CreateMsg "verbessert" (Ohne doppelte Komponente" 2019-07-22 16:22:27 +02:00
roemmelter63329 783938821c Outsource global variables into 'initGlobals.js' 2019-07-22 14:15:20 +02:00
mandutzse68104 1f6261dba0 Merge remote-tracking branch 'origin/developer' into developer
# Conflicts:
#	public/routes/files.js
2019-07-21 15:27:04 +02:00
mandutzse68104 4aa5856fbc fixed createMessage/ files Tag autocomplete 2019-07-21 15:24:40 +02:00
Edwina Barbalan 57901853a9 Merge remote-tracking branch 'origin/developer' into developer 2019-07-21 15:20:42 +02:00
Edwina Barbalan 3eb0a99813 Desktopansicht auf allen Seiten angepasst 2019-07-21 15:20:32 +02:00
mandutzse68104 d003166e33 merge conflict 2019-07-21 14:22:37 +02:00
mandutzse68104 0097de5122 Merge remote-tracking branch 'origin/developer' into developer
# Conflicts:
#	public/index.html
#	public/routes/createMessage.js
2019-07-21 14:22:16 +02:00
mandutzse68104 5a4faca86f extended search 2019-07-21 14:12:16 +02:00
24 changed files with 875 additions and 581 deletions

No files matched your search

+6 -3
View File
@@ -1,13 +1,16 @@
var db = db.getSiblingDB('omdb');
// Delete all collections + all records
db.messages.deleteMany({});
db.tags.deleteMany({});
db.users.deleteMany({});
db.sessions.deleteMany({});
// Insert data in collections
load('mong_msg.js');
load('mong_tag.js');
load('mong_usr.js');
// Delete all collections + all records
//db.messages.drop(); db.tags.drop(); db.user.drop(); db.sessions.drop()
// Print all collections + records count
var collections = db.getCollectionNames();
print('Collections inside the db:');
+1 -1
View File
@@ -1,3 +1,3 @@
db.tags.insert([
{"name":"Lorem"},{"name":"fugiat"},{"name":"aliqua"},{"name":"consequat"},{"name":"mollit"},{"name":"aet"},{"name":"consectetur"},{"name":"dolore"},{"name":"nulla"},{"name":"tempor"},{"name":"veniam"},{"name":"ipsum"},{"name":"adipisicing"},{"name":"qui"},{"name":"sint"},{"name":"ullamco"},{"name":"incididunt"},{"name":"nisi"},{"name":"sit"},{"name":"minim"},{"name":"labore"},{"name":"sunt"},{"name":"in"}
{"name":"efi"},{"name":"wichtig"},{"name":"Wintersemester19/20"},{"name":"Rückmeldung"},{"name":"bme6"},{"name":"Mkz"},{"name":"Freizeit"},{"name":"Prüfungsanmeldung"},{"name":"THNürnberg"},{"name":"Prüfung"},{"name":"Stundenplan"}
])
+5 -5
View File
@@ -1,8 +1,8 @@
db.user.insert([
// author,OHMNEWS2019
{"_id":"author","name":"Test Author","type":"author","roles":["user","author"],"hash":"sha256","salt":"cy5CkPrplcEze6o4psURhw==","pwd":"Gc8ozlxjEGITkS+fW9tz2xLROzws44s04EOCWuP04qE=","tags":["wichtig","th"],"bookmarks":["th"],},
// admin,oZuse1
{"_id":"admin","name":"Test Admin","type":"admin","roles":["user","author","admin"],"hash":"sha256","salt":"PoIUHbDp7tP34ji31iQ0zw==","pwd":"mJpIfIksYs6LJJwYRBemFKqR6TacsSl2E0ZtpO1GMuk=","tags":["wichtig","th"],"bookmarks":["wichtig"],},
db.users.insert([
// User: author, Pwd: author
{"_id":"author","name":"Author","type":"MA@EFI;","roles":'{"user":true,"author":true}',"hash":"sha256","salt":"SIzKNsNKsCRVr8a9U90q6A==","pwd":"HZly68TSAKHioz6Kz0QCbXVTHpT6hMmabUbFYVlCMeE=","abos":["nulla","tempor","veniam","ipsum"],"bookmarks":[],},
// User: admin, Pwd: SwenMho
{"_id":"admin","name":"Test Admin","type":"MA@AMP;","roles":'{"user":true,"author":true,"admin":true}',"hash":"sha256","salt":"z3PNXGmQaWvaT7m2ZlT+0w==","pwd":"nfUfNv032J745xj3Hzya3Mkk43Dz/H0BmNTZhtx8UM0=","abos":["veniam","ipsum"],"bookmarks":[],},
])
//var c = require('./server/crypto.js'),
+6 -16
View File
@@ -69,6 +69,7 @@
<script src="lib/jquery-3.3.1.min.js"></script>
<!-- NOTE: Include .js Routes -->
<script src="routes/initGlobals.js"></script>
<script src="routes/auth.js"></script><!-- Must load before profile.js -->
<script src="routes/home.js"></script>
<script src="routes/files.js"></script>
@@ -76,9 +77,6 @@
<script src="routes/bookmark.js"></script>
<script src="routes/profil.js"></script>
<script src="routes/msgCard.js"></script>
<script src="routes/messageData.js"></script>
<script src="routes/tagData.js"></script>
<script src="routes/majorData.js"></script>
<script src="routes/profilCard.js"></script>
<script src="routes/navRoutes.js"></script>
<script src="search.js"></script>
@@ -89,14 +87,14 @@
<div class="om-header">
<a class="logo-img is-hidden-desktop" href="index.html"><img src="img/app_icon.png" width=45px height=45px></a>
<a class="logo-img is-hidden-touch" href="index.html"><img src="img/app_icon_desk.png" width=100px height=100px></a>
<search></search>
<search :key="vueRender.search"></search>
</div>
</div>
<div class="om-content">
<div id=xxx></div>
<nav-router></nav-router>
<router-view :key="auth.user"></router-view>
<nav-router :key="auth.user"></nav-router>
<router-view :key="vueRender.key"></router-view>
</div>
</div>
@@ -104,22 +102,14 @@
new Vue({
router,
el: '#api',
components: {
// Locally registered components
},
data: {
// Locally registered variables
vueRender : vueRender,
auth: auth,
},
computed:{
// Methods to change data appearance, does cache results
},
methods: {
// Methods to change data content, run always again
},
});
</script>
<!-- NOTE: Call SW registration -->
<script src="registerSW.js"></script>
+15 -5
View File
@@ -442,6 +442,15 @@ body {
line-height: 1.5; }
a {
color: #0046a0;
cursor: pointer;
text-decoration: none; }
a strong {
color: currentColor; }
a:hover {
color: #0046a0; }
a.menu-list {
color: white;
cursor: pointer;
text-decoration: none; }
@@ -4139,7 +4148,7 @@ a.list-item {
font-size: 1.5rem; }
.menu-list {
line-height: 1.25;
line-height: 1.5;
float: left;
width: 230px;
height: 100%;
@@ -4152,9 +4161,11 @@ a.list-item {
color: white; }
.menu-list a {
border-radius: 2px;
padding-bottom: 5px;
display: block;
padding: 0.5em 0.75em;
background-color: #0046a0; }
background-color: #0046a0;
color: white !important;}
.menu-list a:hover {
background-color: #01295d;
color: white; }
@@ -4166,9 +4177,8 @@ a.list-item {
margin: 0.75em;
padding-left: 0.75em;
background-color: #0046a0; }
.menu-item li a {
display: block;
padding: 8px 16px;
.menu-item li {
line-height: 1.5;
text-decoration: none;
color: white;
}
+41 -16
View File
@@ -1,12 +1,12 @@
var auth = {};
function clearAuthState() {
auth.user = ''; // Login name
auth.name = ''; // Full name
auth.type = ''; // type of login (domain specific)
auth.mail = ''; // Full mail address
auth.type = ''; // type of login (domain specific)
auth.roles = {}; // Role authorizations e.g. {user: true}
auth.gender = ''; // Gender (e.g. Frau)
auth.abos = []; // Followed tags
auth.bookmarks = []; // Ids of bookmarks
}
clearAuthState();
@@ -20,6 +20,33 @@ function fillAuthState(state) {
}
}
function updateUserInDB() {
$.ajax({
url: "api/usr",
data: {
_id: auth.user,
name: auth.name,
mail: auth.mail,
type: auth.type,
gender: auth.gender,
roles: JSON.stringify(auth.roles),
abos: JSON.stringify(auth.abos),
bookmarks: JSON.stringify(auth.bookmarks),
},
method: "PUT"
}).done(successful_save).fail(failed_save);
function successful_save(res) {
console.info("User-save: Successful.");
console.info(res);
}
function failed_save(err) {
console.info("User-save: Failed.");
console.error(err);
}
}
// Login component: Login panel (if not logged in) or Logout element (if logged in)
Vue.component('login-panel', {
template: `
@@ -48,7 +75,7 @@ Vue.component('login-panel', {
</b-input>
</b-field>
<b-checkbox>Eingeloggt bleiben</b-checkbox>
<div v-if="error" style="color:red;"> Versuche es nochmal.</div>
<div v-if="error" :key="error" style="color:red;"> Versuche es nochmal.</div>
</section>
<footer class="modal-card-foot">
<button class="button" type="button" @click.prevent="$parent.close()">Close</button>
@@ -57,16 +84,16 @@ Vue.component('login-panel', {
</div>`,
data: function () {
return {
auth: auth,
user: '',
pwd: '',
error: false,
};
},
// TODO: Check if enough for session cookie re-login; checkbox
// mounted: function() {
// this.checkData();
// },
// Doesn't work
beforeMount: function() {
this.checkData();
},
methods: {
closeLoginPanel: function() {
this.$emit('close-login-panel');
@@ -94,6 +121,9 @@ Vue.component('login-panel', {
function successful_login(resData) {
fillAuthState(resData);
// updateUserInDB();
auth.abos = [];
auth.bookmarks = [];
console.info("Correct credentials");
this.closeLoginPanel;
@@ -103,7 +133,7 @@ Vue.component('login-panel', {
function failed_login(err) {
console.info("Wrong credentials");
this.showError=true;
this.error=true;
this.showLoginPanel;
console.log("error: " + err.responseText);
@@ -122,6 +152,7 @@ Vue.component('login-panel', {
function successful_login(res) {
console.info("Re-Auth: Correct credentials");
this.closeLoginPanel;
vueForceRender('key');
//console.log(res);
router.push('/home')
@@ -129,17 +160,11 @@ Vue.component('login-panel', {
function failed_login(err) {
console.info("Re-Auth: Wrong credentials");
this.showError=true;
this.error=true;
this.showLoginPanel;
console.log("error: " + err.responseText);
console.log(err);
}
},
logout: function() {
clearAuthState();
$.ajax({ url: "api/logout", method: "POST" });
this.closeLoginPanel;
}
},
});
+69 -104
View File
@@ -1,120 +1,85 @@
const BookmarkRouter = {
template: `
<div class="content">
<div class="is-hidden-desktop">
<div class="bookmark-headline"><h4>Gepeicherte Beiträge</h4></div>
<div class="om-card card">
<h6 class="msg-head">
<b>Betreff</b>
<img src="favicon.ico" width=20px height=20px>
</h6>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. <br><br>
<a href="#">#beispiel #tag</a>
<div class="om-card-footer">
<div class="om-user-line">
<i class="material-icons">account_circle</i>
Erstellt von User 1
</div>
<i class="material-icons" @click="myFilter" v-if="!isActive">bookmark_border</i>
<i class="material-icons" @click="myFilter" v-else="isActive">bookmark</i>
</div>
</div>
<div class="om-card card">
<h6 class="msg-head">
<b>Betreff</b>
<img src="favicon.ico" width=20px height=20px>
</h6>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <br><br>
<a href="#">#beispiel #tag</a>
<div class="om-card-footer">
<div class="om-user-line">
<i class="material-icons">account_circle</i>
Erstellt von User 2
</div>
<i class="material-icons" @click="myFilter" v-if="!isActive">bookmark_border</i>
<i class="material-icons" @click="myFilter" v-else="isActive">bookmark</i>
</div>
</div>
<div class="om-card card">
<h6 class="msg-head">
<b>Betreff</b>
<img src="favicon.ico" width=20px height=20px>
</h6>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. <br><br>
<a href="#">#beispiel #tag</a>
<div class="om-card-footer">
<div class="om-user-line">
<i class="material-icons">account_circle</i>
Erstellt von User 3
</div>
<i class="material-icons" @click="myFilter" v-if="!isActive">bookmark_border</i>
<i class="material-icons" @click="myFilter" v-else="isActive">bookmark</i>
</div>
</div>
</div>
<div class="column is-three-quarters is-pulled-right is-hidden-touch content-desktop">
<div class="bookmark-headline"><h4>Gepeicherte Beiträge</h4></div>
<div class="om-card card">
<h6 class="msg-head">
<b>Betreff</b>
<img src="favicon.ico" width=20px height=20px>
</h6>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. <br><br>
<a href="#">#beispiel #tag</a>
<div class="om-card-footer">
<div class="om-user-line">
<i class="material-icons">account_circle</i>
Erstellt von User 1
</div>
<i class="material-icons" @click="myFilter" v-if="!isActive">bookmark_border</i>
<i class="material-icons" @click="myFilter" v-else="isActive">bookmark</i>
</div>
</div>
<div class="om-card card">
<h6 class="msg-head">
<b>Betreff</b>
<img src="favicon.ico" width=20px height=20px>
</h6>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. <br><br>
<a href="#">#beispiel #tag</a>
<div class="om-card-footer">
<div class="om-user-line">
<i class="material-icons">account_circle</i>
Erstellt von User 2
</div>
<i class="material-icons" @click="myFilter" v-if="!isActive">bookmark_border</i>
<i class="material-icons" @click="myFilter" v-else="isActive">bookmark</i>
</div>
</div>
<div class="om-card card">
<h6 class="msg-head">
<b>Betreff</b>
<img src="favicon.ico" width=20px height=20px>
</h6>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. <br><br>
<a href="#">#beispiel #tag</a>
<div class="om-card-footer">
<div class="om-user-line">
<i class="material-icons">account_circle</i>
Erstellt von User 3
</div>
<i class="material-icons" @click="myFilter" v-if="!isActive">bookmark_border</i>
<i class="material-icons" @click="myFilter" v-else="isActive">bookmark</i>
</div>
</div>
<div id="om-msg-cards" class="column pull-right-sm is-four-fifths-desktop">
<h3>Gespeicherte Nachrichten </h3>
<MsgCard
v-for="id in msgDisplay"
:key="id"
:msg="messages[id] || {}"
:isBookmark="bookmarkArray[id]"
></MsgCard>
</div>
</div>`,
data: function () {
return {
messagelist: _messagelist,
messages: _messages,
isActive: false,
isActive: true,
messageId: '',
bookmarkArray: auth.bookmarks,
}
},
computed:{
msgDisplay: function(){
return (this.messagelist.slice().reverse());
}
},
methods: {
myFilter () {
myFilter: function() {
this.isActive = !this.isActive;
},
getMessageId: function(){
},
getMessages: function(){
var arr = auth.bookmarks;
console.log("arr: "+arr+" auth.bookmarks: "+auth.bookmarks);
_messagelist.splice(0, _messagelist.length);
_messagelist.push.apply(_messagelist, arr);
for (var e in arr) {
if (!_messages[arr[e]]) {
//arr[e] =arr[e].replace(/\[/g, '').replace(/\"/g, '').replace(/\]/g, '')
console.log("getinsertmessage: "+ arr[e]);
get_insert_message(arr[e]);
}
}
/*var _usrid = auth.user;
$.ajax({
url: "api/usr/id/" + _usrid,
method: "GET"
})
.done(have_result).fail(have_error);
function have_result(res) {
var str = JSON.stringify(res[0].bookmarks).split(",");
_messagelist.splice(0, _messagelist.length);
for (var e in str) {
if (!_messages[str[e]]) {
str[e] =str[e].replace(/\[/g, '').replace(/\"/g, '').replace(/\]/g, '')
get_insert_message(str[e]);
}
}
_messagelist.push.apply(_messagelist, str);
//console.log("bookmark str: "+str);
}
function have_error(err) {
console.log("error: " + err.responseText);
console.log(err);
}*/
}
},
beforeMount: function(){
},
mounted: function (){
this.getMessages();
},
};
+47 -78
View File
@@ -1,19 +1,14 @@
var tagArray = [];
const data=[
'th',
'efi',
'wichtig',
];
const CreateMsgRouter = {
template: `
<div class="content">
<div class="is-hidden-desktop">
<div id="mobile" class="content card om-card">
<div class="column pull-right-sm is-four-fifths-desktop">
<div id="mobile" class="om-card card">
<h4>Neue Nachricht erstellen</h4>
<b-field>
<b-input placeholder="User" id="user"></b-input>
</b-field>
<!--<b-field>
<b-input placeholder="User" id="user"></b-input>
</b-field>-->
<label class="label">{{ userName }}</label>
<b-field>
<b-input placeholder="Betreff" id="subject"></b-input>
</b-field>
@@ -22,12 +17,12 @@ const CreateMsgRouter = {
<b-taginput
id="tag"
v-model="selected"
:data=taglist
:data="filteredDataArray"
autocomplete
allow-new:false
icon="label"
placeholder="#"
@typing="getFilteredTags"
@input="saveTagsToArray">
</b-taginput>
</b-field>
@@ -40,40 +35,6 @@ const CreateMsgRouter = {
<b-button type="is-primary" @click="createMsg">SENDEN</b-button>
</div>
</div>
<div class="column is-three-quarters is-pulled-right is-hidden-touch content-desktop">
<div id="desktop" class="content card om-card">
<h4>Neue Nachricht erstellen</h4>
<b-field>
<b-input placeholder="User" id="user"></b-input>
</b-field>
<b-field>
<b-input placeholder="Betreff" id="subject"></b-input>
</b-field>
<b-field label="Tags">
<b-taginput
id="tag"
v-model="selected"
:data=taglist
autocomplete
allow-new:false
icon="label"
placeholder="#"
@typing="getFilteredTags"
@input="saveTagsToArray">
</b-taginput>
</b-field>
<b-field>
<b-input placeholder="Nachricht" id="message" type="textarea"></b-input>
</b-field>
<b-button @click="$router.go(-1)">ABBRECHEN</b-button>
<b-button type="is-primary" @click="createMsg">SENDEN</b-button>
</div>
</div>
</div>`,
data: function () {
@@ -81,19 +42,44 @@ const CreateMsgRouter = {
auth: auth,
isDisabled: false,
selected: [],
searchtext : "",
taglist: data,
};
},
computed:{
filteredDataArray: function() {
return this.taglist.filter((option) => {
return option
.toString()
.toLowerCase()
.indexOf(this.searchtext.toLowerCase()) >= 0
})
},
userName: function() {
return 'User: '+auth.name;
}
},
methods: {
saveTagsToArray: function() {
tagArray = this.selected;
tagArray = this.selected;
console.info(tagArray);
},
createMsg: function () {
var _subject = $("#subject").val();
var _message = $("#message").val();
var _tag = tagArray;
var _user = auth.name ? auth.name : $("#user").val();
var tmpArr = [];
tagArray.forEach(function(tag) {
console.info(tag);
tmpArr.push(tag.replace(/#/g, ''));
});
tagArray = tmpArr;
var _tag = tagArray;
var _user = auth.name.split(' ');
if (_user.length < 2) {
_user = _user[0];
} else {
_user = _user[1] + ', ' + _user[0];
}
//console.log("Message Created: " + _tag + " " + _message + " " + _user);
$.ajax({
url: "api/msg",
@@ -125,9 +111,11 @@ const CreateMsgRouter = {
})
},
list_tags: function () {
$.ajax({url: "api/tag/ids",method: "GET"})
.done(jd => {
// NICHT SO wg. Vue: _messagelist = jd;
$.ajax({url: "api/tag/ids",method: "GET"})
.done(jd => {
// NICHT SO wg. Vue: _messagelist = jd;
console.log("DATA: "+data);
if(data == ""){
_taglist.splice(0, _taglist.length);
_taglist.push.apply(_taglist, jd);
console.log("tag: jd: " + jd);
@@ -136,35 +124,16 @@ const CreateMsgRouter = {
get_insert_tag(jd[e]);
}
}
}).fail(function (e, f, g) {
console.log("err: " + e + f + g);
});
}
}
}).fail(function (e, f, g) {
console.log("err: " + e + f + g);
});
},
},
mounted: function () {
var userField = $('#user');
if (auth != null && auth.mail != '') {
// userField.prop('placeholder',auth.name);
var authorName = auth.name.split(' ');
authorName = authorName[1] + ', ' + authorName[0];
userField.val(authorName);
userField.prop('disabled',true);
} else {
userField.prop('placeholder','User');
userField.prop('disabled',false);
}
this.list_tags();
//this.list_tags();
if ($(this).bootstrapMaterialDesign)
$(this).bootstrapMaterialDesign();
},
};
function get_insert_tag(id){
$.ajax({ url: "api/tag/id/"+id, method: "GET" }).done(function (tag) {
data.push("#" + tag.name);
console.log("Array:"+this.data);
}).fail(function (e, f, g) {
console.log("cannot load " + id + ".json: " + e + f + g);
})
}
+10 -11
View File
@@ -1,8 +1,7 @@
var tagArray = [];
const FileRouter = {
template: `
<div class="content">
<div class="column is-four-fifths-desktop pull-right-sm">
<h4>Erweiterte Suche</h4>
<b-field label="Suche nach">
<b-select
@@ -21,16 +20,16 @@ const FileRouter = {
</b-field>
<b-field v-if="selectedOptions=='tags'">
<b-autocomplete rounded v-model="searchtext"
<b-autocomplete v-model="searchtext"
:data="filteredDataArray"
placeholder="suche..." icon="magnify"
placeholder="#" icon="label"
@select="option => selected = option">
</b-autocomplete>
</b-field>
<b-button type="is-primary" @click="search">SUCHE</b-button>
<div id="om-msg-cards">
<div id="om-msg-cards" v-if="isExtendedSearch==true">
<MsgCard
v-for="id in messagelist.slice().reverse()"
:key="id"
@@ -38,6 +37,7 @@ const FileRouter = {
></MsgCard>
</div>
</div>
</div>
`,
data: function () {
return {
@@ -47,6 +47,7 @@ const FileRouter = {
taglist: data,
messagelist: _messagelist,
messages: _messages,
isExtendedSearch: false,
}
},
computed: {
@@ -63,10 +64,6 @@ const FileRouter = {
list_messages: function () {
messages();
},
saveTagsToArray: function () {
tagArray = this.selected;
console.info(tagArray);
},
getFilteredTags(text) {
this.taglist = data.filter((option) => {
return option
@@ -74,7 +71,6 @@ const FileRouter = {
.toLowerCase()
.indexOf(text.toLowerCase()) >= 0
})
this.search();
},
list_tags: function () {
$.ajax({
@@ -83,6 +79,7 @@ const FileRouter = {
})
.done(jd => {
// NICHT SO wg. Vue: _messagelist = jd;
if(data == ""){
_taglist.splice(0, _taglist.length);
_taglist.push.apply(_taglist, jd);
console.log("tag: jd: " + jd);
@@ -91,6 +88,7 @@ const FileRouter = {
get_insert_tag(jd[e]);
}
}
}
}).fail(function (e, f, g) {
console.log("err: " + e + f + g);
});
@@ -101,6 +99,7 @@ const FileRouter = {
},
search: function () {
searching(this.searchtext);
this.isExtendedSearch=true;
},
list_messages: function () {
messages();
@@ -108,7 +107,7 @@ const FileRouter = {
},
mounted: function () {
//this.search();
this.list_tags();
//this.list_tags();
//this.list_messages();
},
};
+65 -71
View File
@@ -1,62 +1,81 @@
const HomeRouter = {
template: `
<div id="om-msg-cards">
<MsgCard
v-for="id in messagelist.slice().reverse()"
:key="id"
:msg="messages[id] || {}"
></MsgCard>
<div>
<div id="om-msg-cards" class="column pull-right-sm is-four-fifths-desktop">
<b-button id="escape-search-link"
v-if="_isSearchActiv"
@click="goBackToDashboard"
icon-left="arrow-left"
type="is-primary"
@toggle-escape-search-link="toggleEscapeSearchLink"
outlined>
zurück zu allen Einträgen
</b-button>
<!--<b-button id="subscribe-btn" type="is-primary" v-if="_isSubscripeButtonActiv" @update-home-abo-button="updateHomeAboButton" @click="changeSubscribtion">
{{ subscripeTagName }}
</b-button>--><br><br>
<MsgCard
v-for="id in messagelist.slice().reverse()"
:key="id"
:msg="messages[id] || {}"
:isBookmark="bookmarkArray[id]">
</MsgCard>
</div>
</div>`,
data: function () {
return {
messagelist: _messagelist,
messages: _messages,
isSearchActiv: _isSearchActiv,
isSubscripeButtonActiv: _isSubscripeButtonActiv,
isSubscriped: false,
subscripeTagName: '',
bookmarkArray: auth.bookmarks,
vueRender: vueRender,
};
},
methods: {
/*refresh_messages: function () {
_messages.push({ //////// alt
id: 42,
subject: "xxx",
message: "warum habt ihr auch so viel",
user: "nobody",
tags: "foo"
});
},*/
updateHomeAboButton: function(content) {
this.subscripeTagName = content;
console.info( this.subscripeTagName);
vueForceRender('key');
},
toggleEscapeSearchLink: function() {
console.info('got called');
this.isSearchActive = !this.isSearchActive;
vueForceRender('key');
console.info( this.isSearchActive);
},
list_messages: function() {
messages();
}
/*list_messages: function () {
$.ajax({url: "api/msg/ids", method: "GET"})
.done(jd => {
// NICHT SO wg. Vue: _messagelist = jd;
_messagelist.splice(0, _messagelist.length);
_messagelist.push.apply(_messagelist, jd);
//console.log("jd: "+jd);
for (var e in jd) {
if (!_messages[jd[e]]) {
get_insert_message(jd[e]);
}
}
if(!($".om-searchbar" = "")){
for (var e in jd) {
if (!_messages[jd[e]]) {
get_insert_message(jd[e]);
}
}
}else{
for (var e in jd) {
if (!_messages[jd[e]]) {
get_search_message(jd[e]);
}
}
}
}).fail(function (e, f, g) {
console.log("list_msg: err: " + e + f + g);
});
}*/
},
},
goBackToDashboard: function() {
_isSearchActiv = false;
this.$emit('reset-searchtext','');
// $("#escape-search-link").css("visibility", "hidden");
// $("#subscribe-btn").css("visibility", "hidden");
_isSubscripeButtonActiv = false;
vueForceRender('key');
vueForceRender('search');
},
changeSubscribtion: function(){
var btnString = $("#btn-text").text();
console.log(btnString);
if(this.isSubscriped){
this.subscripeTagName.replace(/deabonnieren/g, '') + "abonnieren";
//console.log(btnString);
// $("#btn-text").text(newBtnString);
}else{
this.subscripeTagName.replace(/abonnieren/g, '') + "deabonnieren";
//console.log(newBtnString);
// $("#btn-text").text(newBtnString);
}
this.isSubscriped = !this.isSubscriped;
vueForceRender('key');
}
},
mounted: function () {
this.list_messages();
//this.refresh_messages();
@@ -70,28 +89,3 @@ function get_insert_message(id) {
console.log("cannot load " + id + ".json: " + e + f + g);
})
}
/*function get_search_message(phrase) {
$.ajax({ url: "api/msg/search/"+phrase, method: "GET" }).done(function (msg) {
Vue.set(_messages, id, msg);
}).fail(function (e, f, g) {
console.log("cannot load " + id + ".json: " + e + f + g);
})
}
$(document).ready(function () {
console.log("egal");
$.get('list.json').done(function (jd) {
// _messagelist = jd;
_messagelist.splice(0, _messagelist.length);
_messagelist.push.apply(_messagelist, jd);
console.log("egal2");
//$('#xxx').text(jd[0]);
for (var e in jd) {
if (!_messages[jd[e]]) {
get_insert_message(jd[e]);
}
}
}).fail(function (e, f, g) {
console.log("egal3: " + e + f + g);
});
});*/
+94
View File
@@ -0,0 +1,94 @@
// Global Variables
// User
var auth = {},
// Message
_messagelist = [],
_messages = {},
// Tag
_taglist = [],
_tags = [],
tagArray = [],
// Search
_isSearchActiv = false,
_isSubscripeButtonActiv = false,
data = [],
search_data = [],
// Vue Rerender Key
vueRender = {
key: 0,
search: 0,
};
const authorRole = 'author',
majorList = [
{id:'B-AC',name:'Bachelor Angewandte Chemie'},
{id:'B-AMP',name:'Bachelor Angewandte Mathematik und Physik'},
{id:'B-TJ',name:'Bachelor Technikjournalismus/Technik-PR'},
{id:'B-AR',name:'Bachelor Architektur'},
{id:'B-BI',name:'Bachelor Bauingenieurwesen'},
{id:'B-BW',name:'Bachelor Betriebswirtschaft'},
{id:'B-BIO',name:'Bachelor Management in der Biobranche'},
{id:'B-IB',name:'Bachelor International Business'},
{id:'B-IBT',name:'Bachelor International Business and Technology'},
{id:'B-DE',name:'Bachelor Design'},
{id:'B-EI',name:'Bachelor Elektrotechnik und Informationstechnik'},
{id:'B-MED',name:'Bachelor Medizintechnik'},
{id:'B-MF',name:'Bachelor Mechatronik/Feinwerktechnik'},
{id:'B-ME',name:'Bachelor Media Engineering'},
{id:'B-IN',name:'Bachelor Informatik'},
{id:'B-MIN',name:'Bachelor Medieninformatik'},
{id:'B-WIN',name:'Bachelor Wirtschaftsinformatik'},
{id:'B-MB',name:'Bachelor Maschinenbau'},
{id:'B-EGT',name:'Bachelor Energie- und Gebäudetechnik'},
{id:'B-EBL',name:'Bachelor Soziale Arbeit: Erziehung und Bildung im Lebenslauf'},
{id:'B-SA',name:'Bachelor Soziale Arbeit'},
{id:'B-EPT',name:'Bachelor Energieprozesstechnik'},
{id:'B-VT',name:'Bachelor Verfahrenstechnik'},
{id:'B-WT',name:'Bachelor Werkstofftechnik'},
{id:'M-AMP',name:'Master Angewandte Mathematik und Physik'},
{id:'M-AR',name:'Master Architektur'},
{id:'M-BI',name:'Master Internationales Bauwesen'},
{id:'M-URB',name:'Master Urbane Mobilität (Verkehrsingenieurwesen)'},
{id:'M-BW',name:'Master Betriebswirtschaft'},
{id:'M-TAX',name:'Master Steuerberatung'},
{id:'M-WR',name:'Master Wirtschaftsrecht'},
{id:'M-IFE',name:'Master International Finance and Economics'},
{id:'M-IMA',name:'Master International Marketing'},
{id:'M-APR',name:'Master Applied Research in Engineering Sciences'},
{id:'M-SY',name:'Master Elektronische und Mechatronische Systeme'},
{id:'M-IN',name:'Master Informatik'},
{id:'M-MIN',name:'Master Medieninformatik'},
{id:'M-WIN',name:'Master Wirtschaftsinformatik'},
{id:'M-MB',name:'Master Maschinenbau'},
{id:'M-EE',name:'Master Energiemanagement und Energietechnik'},
{id:'M-GT',name:'Master Gebäudetechnik'},
{id:'M-SA',name:'Master Soziale Arbeit'},
{id:'M-VT',name:'Master Chemieingenieurwesen und Verfahrenstechnik'},
{id:'M-WT',name:'Master Werkstofftechnik'},
],
facultyList = [
{id:'AC',name:'Angewandte Chemie'},
{id:'AMP',name:'Angewandte Mathematik, Physik und Allgemeinwissenschaften'},
{id:'AR',name:'Architektur'},
{id:'BI',name:'Bauingeneurwesen'},
{id:'BW',name:'Betriebswirtschaft'},
{id:'D',name:'Design'},
{id:'EFI',name:'Elektrotechnik Feinwerktechnik Informationstechnik'},
{id:'IN',name:'Informatik'},
{id:'MB-VS',name:'Maschinenbau und Versorgungstechnik'},
{id:'SW',name:'Sozialwissenschaften'},
{id:'VT',name:'Verfahrenstechnik'},
{id:'WT',name:'Werkstofftechnik'},
];
// Global Functions
function vueForceRender(keyName) {
if (vueRender[keyName] >= 10) {
vueRender[keyName] = 0;
}
vueRender[keyName]++;
}
-46
View File
@@ -1,46 +0,0 @@
var majorList = [
{id:'B-AC',name:'Bachelor Angewandte Chemie'},
{id:'B-AMP',name:'Bachelor Angewandte Mathematik und Physik'},
{id:'B-TJ',name:'Bachelor Technikjournalismus/Technik-PR'},
{id:'B-AR',name:'Bachelor Architektur'},
{id:'B-BI',name:'Bachelor Bauingenieurwesen'},
{id:'B-BW',name:'Bachelor Betriebswirtschaft'},
{id:'B-BIO',name:'Bachelor Management in der Biobranche'},
{id:'B-IB',name:'Bachelor International Business'},
{id:'B-IBT',name:'Bachelor International Business and Technology'},
{id:'B-DE',name:'Bachelor Design'},
{id:'B-EI',name:'Bachelor Elektrotechnik und Informationstechnik'},
{id:'B-MED',name:'Bachelor Medizintechnik'},
{id:'B-MF',name:'Bachelor Mechatronik/Feinwerktechnik'},
{id:'B-ME',name:'Bachelor Media Engineering'},
{id:'B-IN',name:'Bachelor Informatik'},
{id:'B-MIN',name:'Bachelor Medieninformatik'},
{id:'B-WIN',name:'Bachelor Wirtschaftsinformatik'},
{id:'B-MB',name:'Bachelor Maschinenbau'},
{id:'B-EGT',name:'Bachelor Energie- und Gebäudetechnik'},
{id:'B-EBL',name:'Bachelor Soziale Arbeit: Erziehung und Bildung im Lebenslauf'},
{id:'B-SA',name:'Bachelor Soziale Arbeit'},
{id:'B-EPT',name:'Bachelor Energieprozesstechnik'},
{id:'B-VT',name:'Bachelor Verfahrenstechnik'},
{id:'B-WT',name:'Bachelor Werkstofftechnik'},
{id:'M-AMP',name:'Master Angewandte Mathematik und Physik'},
{id:'M-AR',name:'Master Architektur'},
{id:'M-BI',name:'Master Internationales Bauwesen'},
{id:'M-URB',name:'Master Urbane Mobilität (Verkehrsingenieurwesen)'},
{id:'M-BW',name:'Master Betriebswirtschaft'},
{id:'M-TAX',name:'Master Steuerberatung'},
{id:'M-WR',name:'Master Wirtschaftsrecht'},
{id:'M-IFE',name:'Master International Finance and Economics'},
{id:'M-IMA',name:'Master International Marketing'},
{id:'M-APR',name:'Master Applied Research in Engineering Sciences'},
{id:'M-SY',name:'Master Elektronische und Mechatronische Systeme'},
{id:'M-IN',name:'Master Informatik'},
{id:'M-MIN',name:'Master Medieninformatik'},
{id:'M-WIN',name:'Master Wirtschaftsinformatik'},
{id:'M-MB',name:'Master Maschinenbau'},
{id:'M-EE',name:'Master Energiemanagement und Energietechnik'},
{id:'M-GT',name:'Master Gebäudetechnik'},
{id:'M-SA',name:'Master Soziale Arbeit'},
{id:'M-VT',name:'Master Chemieingenieurwesen und Verfahrenstechnik'},
{id:'M-WT',name:'Master Werkstofftechnik'},
];
-2
View File
@@ -1,2 +0,0 @@
_messagelist = [];
_messages = {};
+78 -18
View File
@@ -1,34 +1,94 @@
Vue.component('MsgCard', {
template: `<div class="om-card card">
<h6 class="msg-head">
template: `
<div class="om-card card">
<h6 class="msg-head">
<b>{{ msg.subject }}</b>
<img src="favicon.ico" width=20px height=20px>
</h6>
{{ msg.message }}<br>
<a v-for="tag in msg.tag" @click="filterForTag(tag)">#{{ tag }} </a>
<br>
</p>
<div class="om-card-footer"> <div class="om-user-line">
<i class="material-icons">account_circle</i>
Erstellt von {{ msg.user }}</div>
<i class="material-icons" @click="myFilter()" v-if="!isActive">bookmark_border</i>
<i class="material-icons" @click="myFilter()" v-else="isActive">bookmark</i>
</div></div>`,
props: ['msg'],
</h6>
{{ msg.message }}<br>
<a v-for="tag in msg.tag" @click="filterForTag(tag)">#{{ tag }} </a>
<br>
<div class="om-card-footer">
<div class="om-user-line">
<i class="material-icons">account_circle</i>
Erstellt von {{ msg.user }}
</div>
<i id="bockmark-not-active" class="material-icons" :key="vueRender.key" @click="myFilter(msg._id)" v-if="!isActive">bookmark_border</i>
<i id="bockmark-active" class="material-icons" :key="vueRender.key" @click="myFilter(msg._id)" v-else>bookmark</i>
</div>
</div>`,
props: ['msg', 'isBookmark'],
data: function () {
return {
isActive: false,
isActive: this.isBookmark,
msgid: this.msg._id,
bookmarkArray: auth.bookmarks,
vueRender: vueRender,
};
},
methods: {
myFilter: function() {
myFilter: function (_messageid) {
//var _messageid = $("#msgid").text();
if (this.isActive == true) {
var index = this.bookmarkArray.indexOf(_messageid);
if (index > -1) {
this.bookmarkArray.splice(index, 1);
}
this.isActive = false;
} else {
console.log("_messsageid: "+_messageid+" bookmarks: "+this.bookmarkArray);
this.bookmarkArray.push(_messageid);
this.isActive =true;
}
/*console.log("msgid"+_bookmark);
var _userid = auth.user;
this.isActive = !this.isActive;
if(this.isActive){
$.ajax({
url: "api/usr",
data: {
userid: _userid,
bookmark: _bookmark
},
method: "PUT"
}).done(have_result).fail(have_error);
function have_result(res) {
console.log(res);
}
function have_error(err) {
console.log("error: " + err.responseText);
console.log(err);
}
}*/
},
filterForTag: function(tag) {
console.log("link: " +tag);
filterForTag: function (tag) {
var btnString = "#" + tag + " abonnieren";
$("#btn-text").text(btnString);
$("#subscribe-btn").css("visibility", "visible");
//console.log("link: " + tag);
searching(tag);
var btnString = "#" + tag + " abonnieren";
$("#btn-text").text(btnString);
$("#subscribe-btn").css("visibility", "visible");
},
isBookmarkActive: function (msgid) {
//console.log("isBookmarkActive(): " + msgid);
if (this.bookmarkArray.indexOf(msgid) > -1) {
// $("#bockmark-not-active").css("visibility","hidden");
// $("#bockmark-active").css("visibility","visible");
this.isActive = true;
//console.log("isBookmarkActive(): " + this.isActive);
this.isActive_ = 1;
}
}
},
beforeMount: function () {
//this.isBookmarkActive();
}
});
+12 -7
View File
@@ -11,7 +11,7 @@ Vue.component('nav-router', {
<i class="material-icons">search</i>
</router-link>
<router-link to="/createMessage" class="navbar-item is-primary is-expanded is-hidden-desktop">
<router-link v-if="auth.roles.author" to="/createMessage" class="navbar-item is-primary is-expanded is-hidden-desktop">
<i class="material-icons">add_circle</i>
</router-link>
@@ -29,23 +29,23 @@ Vue.component('nav-router', {
<div class="column is-sidebar-menu is-hidden-touch">
<aside class="menu is-medium">
<ul class="menu-list">
<li><router-link to="/home" class="is-hidden-touch">
<li><router-link to="/home">
<i class="material-icons">home</i> Home
</router-link></li>
<li><router-link to="/files" class="is-hidden-touch">
<i class="material-icons">language</i> Language
<li><router-link to="/files">
<i class="material-icons">search</i> Search
</router-link></li>
<li><router-link to="/createMessage" class="is-hidden-touch">
<li><router-link v-if="auth.roles.author" to="/createMessage">
<i class="material-icons">add_circle</i> Create Message
</router-link></li>
<li><router-link to="/bookmark" class="is-hidden-touch">
<li><router-link to="/bookmark">
<i class="material-icons">bookmark</i> Bookmark
</router-link></li>
<li><router-link to="/profil" class="is-hidden-touch">
<li><router-link to="/profil">
<i class="material-icons">person</i> Profil
</router-link></li>
</ul>
@@ -53,6 +53,11 @@ Vue.component('nav-router', {
</div>
</div>
</div>`,
data: function() {
return {
auth: auth,
};
},
});
const routes = [
+16 -14
View File
@@ -1,21 +1,23 @@
const ProfilRouter = {
template: `
<div>
<div v-if="isAuth">
<profil-card></profil-card>
</div>
<div v-else>
<button class="button is-primary is-medium"
@click="isLPVisible = true">
Login
</button>
<div class="column pull-right-sm is-four-fifths-desktop">
<div v-if="isAuth">
<profil-card></profil-card>
</div>
<div v-else>
<button class="button is-primary is-medium"
@click="isLPVisible = true">
Login
</button>
<b-modal :active.sync="isLPVisible"
@close-login-panel="closeLoginPanel"
@show-login-panel="showLoginPanel"
has-modal-card>
<login-panel></login-panel>
</b-modal>
<b-modal :active.sync="isLPVisible"
@close-login-panel="closeLoginPanel"
@show-login-panel="showLoginPanel"
has-modal-card>
<login-panel></login-panel>
</b-modal>
</div>
</div>
</div>`,
data: function () {
+40 -17
View File
@@ -11,22 +11,24 @@ Vue.component('profil-card', {
<div class="profil-text">
<span style="font-size:120%; display:inline-block; margin: 0.8rem 0 0 0;"><b>{{ auth.name }}</b></span><br><br>
<span style="font-size:90%; display:inline-block; margin: 0 0 0.8rem 0;"><b>{{ major }}</b></span>
<span style="font-size:100%; display:inline-block; margin: 0 0 0.8rem 0;"><b>{{ labelMajorOrFaculty }}</b></span>
<br>
<span style="font-size:90%; display:inline-block; margin: 0 0 0.8rem 0;"><b>{{ majorOrFaculty }}</b></span>
<br><br>
</div>
<hr class="first">
<div class="btnprofil">
<button @click="isCardModalActive = true"><b>Abonniert: <br/>{{ abo }}</b> <br/></button>
<button @click="$router.push('/bookmark')"><b>Gespeichert:<br/> {{ saved }}</b><br/></button>
<button @click="isCardModalActive = true"><b>Abonniert: <br/>{{ abos }}</b> <br/></button>
<button @click="$router.push('/bookmark')"><b>Gespeichert:<br/> {{ bookmarks }}</b><br/></button>
</div>
<section>
<b-modal :active.sync="isCardModalActive" :width="600" scroll="keep">
<div class="card">
<header class="modal-card-head">
<p class="modal-card-title">Abonnierte Kanäle</p>
<p class="modal-card-title">Abonnierte Tags</p>
</header>
<div class="card-content">
<div class="content">
@@ -51,30 +53,51 @@ Vue.component('profil-card', {
data: function () {
return {
auth: auth,
abo: 7,
saved: 3,
abos: auth.abos ? auth.abos.length : '-',
bookmarks: auth.bookmarks ? auth.bookmarks.length : '-',
isCardModalActive: false,
};
},
computed: {
major: function() {
majorOrFaculty: function() {
// e.g. ST@B-ME;ST@EFI;
var majorID = auth.type.split(';')[0].split('@')[1];
//console.info(majorID);
//console.info(majorList);
var majorName = 'Studiengang Unbekannt';
majorList.forEach(function(major) {
if (major.id == majorID) {
majorName = major.name;
}
});
return majorName;
if (auth.roles.author) {
var facultyID = auth.type.split(';');
console.info(facultyID[facultyID.length-2]);
facultyID = facultyID[facultyID.length-2].split('@')[1];
var facultyName = '';
facultyList.forEach(function(faculty) {
if (faculty.id == facultyID) {
facultyName = faculty.name;
}
});
return facultyName;
} else {
var majorID = auth.type.split(';')[0].split('@')[1];
//console.info(majorID);
//console.info(majorList);
var majorName = 'Studiengang Unbekannt';
majorList.forEach(function(major) {
if (major.id == majorID) {
majorName = major.name;
}
});
return majorName;
}
},
labelMajorOrFaculty: function() {
if (auth.roles.author) {
return 'Fakultät:'
} else {
return 'Studiengang:'
}
}
},
methods: {
logout: function() {
clearAuthState();
$.ajax({ url: "api/logout", method: "POST" });
vueForceRender('key');
router.push('/profil');
},
}
-2
View File
@@ -1,2 +0,0 @@
_taglist = [];
_tags = [];
+63 -41
View File
@@ -1,13 +1,3 @@
var isSearchActive = false,
tagArray = ["lorem"];
const dat=[
'th',
'efi',
'wichtig',
],
search_data = [];
Vue.component('search',{
template: `
<form class="om-searchbar" @submit.prevent="search()">
@@ -18,31 +8,35 @@ Vue.component('search',{
:data="filteredDataArray"
placeholder="suche..."
icon="magnify"
@reset-searchtext="resetSearchtext($event)"
@select="option => selected = option">
</b-autocomplete>
<button class="clearButton" @click="clear">x</button>
</b-field>
</form>`,
data: function() {
return{
return {
searchtext: "",
selected: [],
taglist: dat,
taglist: data,
};
},
computed:{
filteredDataArray() {
filteredDataArray: function() {
return this.taglist.filter((option) => {
return option
.toString()
.toLowerCase()
.indexOf(this.searchtext.toLowerCase()) >= 0
})
}
});
},
},
methods: {
getFilteredTags(text) {
this.taglist = dat.filter((option) => {
resetSearchtext: function(param) {
this.searchtext = param;
},
getFilteredTags: function(text) {
this.taglist = data.filter((option) => {
return option
.toString()
.toLowerCase()
@@ -51,7 +45,12 @@ Vue.component('search',{
this.search();
},
search: function() {
searching(this.searchtext);
var btnString = '';
btnString = searching(this.searchtext, btnString);
console.info(btnString);
this.$emit('update-home-abo-button', btnString);
vueForceRender('key');
},
saveTagsToArray: function() {
tagArray = this.selected;
@@ -64,6 +63,7 @@ Vue.component('search',{
$.ajax({url: "api/tag/ids", method: "GET"})
.done(jd => {
// NICHT SO wg. Vue: _messagelist = jd;
if(data == ""){
_taglist.splice(0, _taglist.length);
_taglist.push.apply(_taglist, jd);
// console.log("tag: jd: " + jd);
@@ -72,16 +72,23 @@ Vue.component('search',{
get_insert_tag(jd[e]);
}
}
}
}).fail(function (e, f, g) {
console.log("err: " + e + f + g);
});
},
clear: function() {
console.log("clear");
isSearchActiv = false;
this.searchtext = "";
this.searchtext = "";
this.list_messages();
//router.push('/files')
//router.push('/home')
_isSearchActiv = false;
_isSubscripeButtonActiv = false;
this.$emit('toggle-escape-search-link');
vueForceRender('key');
console.info('done');
// $("#escape-search-link").css("visibility", "hidden");
// $("#subscribe-btn").css("visibility", "hidden");
},
},
mounted: function() {
@@ -96,31 +103,46 @@ function get_insert_tag(id) {
url: "api/tag/id/" + id,
method: "GET"
}).done(function(tag) {
dat.push("#" + tag.name);
data.push('#'+tag.name);
}).fail(function(e, f, g) {
console.log("cannot load " + id + ".json: " + e + f + g);
})
}
function searching(searchtext) {
isSearchActiv = true;
console.log("Searchtext: " + searchtext.replace(/#/g, ''));
$.ajax({
url: "api/msg/search/" + searchtext.replace(/#/g, ''),
method: "GET"
}).done(jd => {
// NICHT SO wg. Vue: _messagelist = jd;
_messagelist.splice(0, _messagelist.length);
_messagelist.push.apply(_messagelist, jd);
//console.log("jd: "+jd);
for (var e in jd) {
if (!_messages[jd[e]]) {
get_insert_message(jd[e]);
function searching(searchtext,btnString) {
_isSearchActiv = true;
// $("#escape-search-link").css("visibility", "visible");
//console.log(_tags);
// console.log(data);
if(data.indexOf(searchtext) > -1){
btnString = searchtext + " abonnieren";
// $("#btn-text").text(btnString);
// $("#subscribe-btn").css("visibility", "visible");
_isSubscripeButtonActiv = true;
}else{
// $("#subscribe-btn").css("visibility", "hidden");
_isSubscripeButtonActiv = false;
}
if (searchtext !== '') {
$.ajax({
url: "api/msg/search/" + searchtext.replace(/#/g, ''),
method: "GET"
}).done(jd => {
// NICHT SO wg. Vue: _messagelist = jd;
_messagelist.splice(0, _messagelist.length);
_messagelist.push.apply(_messagelist, jd);
//console.log("jd: "+jd);
for (var e in jd) {
if (!_messages[jd[e]]) {
get_insert_message(jd[e]);
}
}
}
}).fail(function(e, f, g) {
console.log("searching: err: " + e + f + g);
})
}).fail(function(e, f, g) {
console.log("searching: err: " + e + f + g);
})
}
return btnString;
}
function messages() {
+17 -2
View File
@@ -31,10 +31,10 @@
overflow: hidden;
}
.om-content a {
color: white;
color: #0046a0;
}
.om-content a:hover {
color: white;
color: #0046a0;
}
.content-desktop {
margin-right: 30px;
@@ -236,3 +236,18 @@ button.clearButton {
.taglink {
color: #0046a0;
}
@media (min-width: 1088px) {
.pull-right-sm {
float: right;
}
}
#subscribe-btn {
float: right;
-visibility: hidden;
}
#escape-search-link {
-visibility: hidden;
}
#bockmark-not-active {
visibility: visible;
}
+21 -2
View File
@@ -37,8 +37,8 @@
width: auto;
overflow: hidden;
a{
color: white;
&:hover{color:white;}
color: #0046a0;
&:hover{color: #0046a0;}
}
}
@@ -279,3 +279,22 @@ button.clearButton{
color: @color;
}
@media (min-width: 1088px) {
.pull-right-sm {
float: right;
}
}
#subscribe-btn{
float: right;
-visibility: hidden;
}
#escape-search-link{
-visibility: hidden;
}
#bockmark-not-active{
visibility: visible;
}
#bockmark-active{
//visibility: hidden;
}
+2 -2
View File
@@ -53,8 +53,8 @@ app.disable('x-powered-by');
app.set('trust proxy', 1) // trust first proxy, neccessary for cookie secure: true flag
app.use(session({
secret: 'ahhgylhuvh', // caesar(3) 2 letter surname
resave: false,
saveUninitialized: false,
saveUninitialized: false, // don't create session until something stored
resave: false, //don't save session if unmodified
cookie: {
maxAge: 30 * 24 * 3600 * 1000, // TODO: ttl for session as well (Store)
secure: true, // true for https only (since our app works only with https)
+76 -10
View File
@@ -12,20 +12,75 @@ const ldap = require ('./ldap_ohm'),
const serverVisibleSession = { user: true, name: true, type: true, mail: true, roles: true, gender: true, deactivated: true, host: true };
const clientVisibleSession = { user: true, name: true, type: true, mail: true, roles: true, gender: true };
// Return user role, query from found.mail
function getUserRole(found) {
var roles = "user";
var mail = found.mail;
if (!/\d/.test(mail)) {
// Mail contains no number
roles += ',"author"';
}
return JSON.stringify('{'+roles+'}');
}
// Fill in session object
function fillSession (req, user, roles, cb) {
if (req.session === undefined)
next (common.genError (500, "Error"));
req.session.regenerate (function (err) {
if (user !== undefined && ! err) {
common.shallowCopy (user, serverVisibleSession, {roles: true}, req.session);
if (user._id) {
req.session.user = user._id;
// regenerate a new session-id with clean instance
if (user !== undefined && roles !== undefined) {
req.session.regenerate (function (err) {
if (user !== undefined && ! err) {
common.shallowCopy (user, serverVisibleSession, {roles: true}, req.session);
// console.info(req.session);
if (user._id) {
req.session.user = user._id;
}
req.session.roles = roles;
console.info(req.session);
}
req.session.roles = roles;
return cb (err);
});
} else {
return cb ();
}
}
// Save found user into DB, if not already exists
function saveFoundToDB(found, cb) {
// console.info(found);
Users.findById(found.user)
.exec(function(err, result){
if (err) {
console.error("Error: Users collection.");
console.error(err);
}
// User doesn't exist
if (found !== undefined && !result) {
Users.create({
_id: found.user,
name: found.name,
mail: found.mail,
type: found.type,
gender: found.gender,
abos: '',
bookmarks: '',
roles: getUserRole(found),
}, function(err, done) {
if (err) {
console.error("User creation: Failed");
console.error(err);
} else {
console.info("User created: "+ found.user);
}
if (done == null) {
console.error("Can not create user.");
}
return cb(err);
});
} else {
return cb(err);
}
return cb (err);
});
}
@@ -62,7 +117,7 @@ const authorization = {
// Check whether to just validate current session ID
if (user === '' && pwd === '') {
console.log ("auth revalidate: " + req.session.user);
console.log ("auth revalidate: " + req.session._id);
if (req.session.user === undefined)
return returnError();
return returnSession ();
@@ -73,7 +128,8 @@ const authorization = {
// If there is a local user AND it has a password associated, test against this, and only this
if (entry != null && entry.pwd) {
if (crypto.checkLocalAuth (entry, req.body.pwd)) {
return fillSession (req, entry, common.arrayToHash(entry.roles), returnSession);
console.info(entry.roles);
return fillSession (req, entry, JSON.parse(entry.roles), returnSession);
}
return returnError ();
}
@@ -97,13 +153,23 @@ const authorization = {
entry.orclgender = found.orclgender;
return fillSession (req, entry, entry.roles.length > 0 ? common.arrayToHash(entry.roles) : {user:true}, returnSession);
}
// Otherwise create standard user entry
return fillSession (req, found, {user:true}, returnSession);
saveFoundToDB(found, function() {
return fillSession (req, found, {user:true}, returnSession);
});
});
});
},
logout: function (req, res, next) {
fillSession (req, undefined, undefined, function (err) {
// Session delete, exists further in db
req.session.destroy(function(err) {
if (err) {
console.error(err);
}
});
// console.info(req.session);
return res.json ({});
});
},
+191 -108
View File
@@ -16,20 +16,22 @@ const dbs = {
* -> Array of message schema object ids
* Get ALL known message ids
*/
get: function(req, res) {
model.Messages.find({},{_id: true}).exec()
get: function (req, res) {
model.Messages.find({}, {
_id: true
}).exec()
.then(results => {
//selects id from message:
var parsed = [];
for (var i in results) {
parsed.push (results[i]._id);
}
res.send(parsed);
} )
.catch(err => {
console.log (err);
res.status(500).json(err);
});
//selects id from message:
var parsed = [];
for (var i in results) {
parsed.push(results[i]._id);
}
res.send(parsed);
})
.catch(err => {
console.log(err);
res.status(500).json(err);
});
},
},
"msg/id": {
@@ -38,10 +40,10 @@ const dbs = {
* -> Message schema
* Get a particular message
*/
get: function(req, res) {
model.Messages.findById(req.params.id) .exec(function(err, result) {
get: function (req, res) {
model.Messages.findById(req.params.id).exec(function (err, result) {
if (err) {
console.log (err);
console.log(err);
res.status(404).json(err);
} else {
//console.log(JSON.stringify(result));
@@ -56,22 +58,27 @@ const dbs = {
* -> Message schema
* Get a particular message
*/
get: function(req, res) {
model.Messages.find(
{$text: {$search: req.params.phrase}})
.sort({tag:1, user:1, message:1, subject:1})
.exec().then(results => {
//selects id from message:
var parsed = [];
for (var i in results) {
parsed.push (results[i]._id);
}
res.send(parsed);
} )
.catch(err => {
console.log (err);
res.status(500).json(err);
});
get: function (req, res) {
model.Messages.find({
$text: {
$search: req.params.phrase
}
})
.sort({
tag: -1
})
.exec().then(results => {
//selects id from message:
var parsed = [];
for (var i in results) {
parsed.push(results[i]._id);
}
res.send(parsed);
})
.catch(err => {
console.log(err);
res.status(500).json(err);
});
},
},
"msg": {
@@ -80,7 +87,7 @@ const dbs = {
* -> Message schema
* Create a new message
*/
post: function(req, res) {
post: function (req, res) {
/*
if ( !(req.body.tags instanceof Array) ) {
return res.status(400).json({ error: "bad request" });
@@ -92,11 +99,13 @@ const dbs = {
message: req.body.message,
user: req.body.user,
tag: req.body.tag
}, function(err, result) {
}, function (err, result) {
if (err) {
return res.status(401).json(err.message);
} else {
res.json({message: "Message created!!"});
res.json({
message: "Message created!!"
});
}
if (result == null) {
return res.status(500).json("Can not create message.")
@@ -115,20 +124,22 @@ const dbs = {
* -> Array of tag schema object ids
* Get ALL known tag ids
*/
get: function(req, res) {
model.Tags.find({},{_id: true}).exec()
get: function (req, res) {
model.Tags.find({}, {
_id: true
}).exec()
.then(results => {
//selects id from tag:
var parsed = [];
for (var i in results) {
parsed.push (results[i]._id);
}
res.send(parsed);
} )
.catch(err => {
console.log (err);
res.status(500).json(err);
});
//selects id from tag:
var parsed = [];
for (var i in results) {
parsed.push(results[i]._id);
}
res.send(parsed);
})
.catch(err => {
console.log(err);
res.status(500).json(err);
});
},
},
"tag/id": {
@@ -137,17 +148,43 @@ const dbs = {
* -> Tag schema
* Get a particular tag
*/
get: function(req, res) {
get: function (req, res) {
model.Tags.findById(req.params.id)
.exec(function(err, result) {
if (err) {
console.log (err);
res.status(404).json(err);
} else {
//console.log(JSON.stringify(result));
res.json(result);
}
});
.exec(function (err, result) {
if (err) {
console.log(err);
res.status(404).json(err);
} else {
//console.log(req.params.id);
res.json(result);
}
});
},
},
"usr/bookmark/ids": {
/* GET /api/usr/bookmark/ids [no args]
* -> Array of message schema object ids
* Get bookmark message ids
*/
get: function (req, res) {
model.Users.find({
},
function (err, result) {
if (err) {
return res.status(401).json(err.message);
} else {
var parsed = [];
for (var i in result) {
parsed.push(result[i].bookmarks);
}
console.log("bookmarks:" + JSON.stringify(parsed));
res.send(parsed);
}
if (result == null) {
return res.status(500).json("Can save bookmark.")
}
});
},
},
"usr/id": {
@@ -156,17 +193,19 @@ const dbs = {
* -> User Schema
* Get a particular user
*/
get: function(req, res) {
model.Users.findById(req.params.id)
.exec(function(err, result) {
if (err) {
console.log(err);
res.status(404).json(err);
} else {
//console.log(JSON.stringify(result));
res.json(result);
}
});
get: function (req, res) {
model.Users.find({
_id: req.params.id
})
.exec(function (err, result) {
if (err) {
console.log(err);
res.status(404).json(err);
} else {
console.log(result);
res.json(result);
}
});
},
},
"usr": {
@@ -176,22 +215,22 @@ const dbs = {
* Create a new user
*/
post: function(req, res) {
model.User.create({
_id: req.body.id,
// console.info(req.body);
model.Users.create({
_id: req.body._id,
name: req.body.name,
mail: req.body.mail,
type: req.body.type,
roles: req.body.roles,
hash: req.body.hash,
salt: req.body.salt,
pwd: req.body.pwd,
gender: req.body.gender,
abos: req.body.abos,
bookmarks: req.body.bookmarks,
roles: req.body.roles,
}, function(err, result) {
if (err) {
console.log (err);
console.log(err);
return res.status(401).json(err.message);
} else {
res.json({message: "User created!!"});
res.json({message: "User created!", user: req.body});
}
if (result == null) {
return res.status(500).json("Can not create user.")
@@ -203,15 +242,41 @@ const dbs = {
* -> User schema
* Change a user
*/
put: function(req, res) {
model.Users.findById(reg.body._id)
.exec(function(err, entry) {
if (err)
console.log (err);
if (entry == null)
return res.status(404).json(err.message);
// TODO Catch edge cases
entry.save(function(err, data) {
put: function (req, res) {
model.Users.find({
_id: req.body.userid
})
.exec(function (err, entry) {
if (err) {
console.log(err);
} else {
model.Users.update({
_id: req.body.userid
}, {
bookmarks: req.body.bookmark
}, function (err, data) {
if (err) {
console.log(err);
} else {
res.json({
id: "Bookmark saved"
});
}
if (data == null) {
return res.status(404).json(err.message);
}
});
}
if (entry == null)
return res.status(404).json(err.message);
// TODO Catch edge cases
// TODO Save/Update user
/*
_id: req.body.id,
@@ -224,9 +289,8 @@ const dbs = {
abos: req.body.abos,
bookmarks: req.body.bookmarks,
*/
res.json(data);
// res.json(data);
});
});
},
},
},
@@ -241,7 +305,7 @@ const dbs = {
* Local db: common.config.dbLocalConn
* TH db: common.config.dbConn
*/
common.mongoose.connect (common.config.dbLocalConn, {
common.mongoose.connect(common.config.dbLocalConn, {
useNewUrlParser: true
}).then(() => {
console.log("Database connected successfully.");
@@ -258,47 +322,66 @@ const dbs = {
* - per entry: _comment: Comment for Admin UI - TODO: not working yet
*/
var messageSchema = common.mongoose.Schema({
subject: { type: String, required: true,
_comment: "" },
message: { type: String, required: true,
_comment: "" },
user: { type: String, required: true,
_comment: "" },
tag: { type: [String],
_comment: "" },
subject: {
type: String,
required: true,
_comment: ""
},
message: {
type: String,
required: true,
_comment: ""
},
user: {
type: String,
required: true,
_comment: ""
},
tag: {
type: [String],
_comment: ""
},
//createtime: { type: Date, default: Date.now },
});
messageSchema.index({ "$**":'text' });
messageSchema.index({
"$**": 'text'
});
model.Messages = common.mongoose.model('messages', messageSchema);
model.Messages._list = [ "" ];
model.Messages._list = [""];
var tagSchema = common.mongoose.Schema({
name: { type: String, required: true,
_comment: "" }, //unique
name: {
type: String,
required: true,
_comment: ""
}, //unique
});
model.Tags = common.mongoose.model('tags', messageSchema);
model.Tags._list = [ "" ];
model.Tags._list = [""];
var userSchema = common.mongoose.Schema({
_id: { type: String },
name: { type: String, required: true,
_id: { type: String, required: true },
name: { type: String,
_comment: "" },
mail: { type: String },
type: { type: String },
gender: { type: String },
pwd: { type: String,
_comment: "" },
hash: { type: String },
salt: { type: String },
type: { type: String },
roles: { type: [String], required: true,
_comment: "" },
abos: { type: [String],
_comment: "" },
//deactivated: { type: Boolean },
//host: { type: Boolean },
bookmarks: { type: [String],
_comment: "" },
sessionid: { type: String },
roles: { type: String, required: true,
_comment: "" },
});
model.Users = common.mongoose.model('users', userSchema);
model.Users._list = [ "" ];
model.Users._list = [""];
},
models: model,
};