testen
This commit is contained in:
parent
e21773b35f
commit
3b292c02e8
@ -168,7 +168,7 @@ async function displayShoppinglist(sl_id) {
|
|||||||
let members = await query('SELECT row_to_json("User") as obj FROM "User" JOIN "Shoppinglist_member" USING (username) WHERE sl_id = $1', [sl_id]);
|
let members = await query('SELECT row_to_json("User") as obj FROM "User" JOIN "Shoppinglist_member" USING (username) WHERE sl_id = $1', [sl_id]);
|
||||||
let admin = await query('SELECT row_to_json("User") as obj FROM "User" JOIN "Shoppinglist_admin" USING (username) WHERE sl_id = $1', [sl_id]);
|
let admin = await query('SELECT row_to_json("User") as obj FROM "User" JOIN "Shoppinglist_admin" USING (username) WHERE sl_id = $1', [sl_id]);
|
||||||
|
|
||||||
return items_in_groups(groups, items, sl_id, admin[0].username, admin[0].message_id, members, shoppinglist[0].name, shoppinglist[0].description);
|
return items_in_groups(groups, items, sl_id, admin[0].username, admin[0].message_id, members, shoppinglist[0].name, shoppinglist[0].description, shoppinglist[0].invitelink);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
}
|
}
|
||||||
@ -423,6 +423,8 @@ async function manInvite(sl_id, uid) {
|
|||||||
async function removeMember(uid, sl_id) {
|
async function removeMember(uid, sl_id) {
|
||||||
try {
|
try {
|
||||||
await nonQuery('DELETE FROM "Shoppinglist_member" WHERE username = $1 AND sl_id = $2', [uid, sl_id]);
|
await nonQuery('DELETE FROM "Shoppinglist_member" WHERE username = $1 AND sl_id = $2', [uid, sl_id]);
|
||||||
|
|
||||||
|
return getShoppinglistsShared(sl_id);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
}
|
}
|
||||||
@ -469,12 +471,13 @@ function generate_item_id() {
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
function items_in_groups(groups, items, sl_id, admin_uid, admin_mid, members, name, description) {
|
function items_in_groups(groups, items, sl_id, admin_uid, admin_mid, members, name, description, invitelink) {
|
||||||
|
|
||||||
let result = {
|
let result = {
|
||||||
sl_id: sl_id,
|
sl_id: sl_id,
|
||||||
name: name,
|
name: name,
|
||||||
description: description,
|
description: description,
|
||||||
|
invitelink: invitelink,
|
||||||
admin: {
|
admin: {
|
||||||
uid: admin_uid,
|
uid: admin_uid,
|
||||||
mid: admin_mid
|
mid: admin_mid
|
||||||
|
@ -16,7 +16,10 @@ var app = new Vue({
|
|||||||
title: "smartshopper.cf",
|
title: "smartshopper.cf",
|
||||||
myshoppinglists: [],
|
myshoppinglists: [],
|
||||||
sharedshoppinglists: [],
|
sharedshoppinglists: [],
|
||||||
currentlist: {}
|
currentlist: {},
|
||||||
|
currentGroup: String,
|
||||||
|
users: [],
|
||||||
|
done_purchases: []
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@ -67,7 +70,7 @@ var app = new Vue({
|
|||||||
data: {
|
data: {
|
||||||
name: name,
|
name: name,
|
||||||
description: description,
|
description: description,
|
||||||
color: "white",
|
color: "#00a1ff",
|
||||||
idtoken: idtoken
|
idtoken: idtoken
|
||||||
}
|
}
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
@ -79,7 +82,136 @@ var app = new Vue({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteGroup(group_id, sl_id) {
|
||||||
|
axios({
|
||||||
|
method: 'delete',
|
||||||
|
url: "/group",
|
||||||
|
data: {
|
||||||
|
sl_id: sl_id,
|
||||||
|
group_id: group_id
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
console.log(res.data);
|
||||||
|
app.currentlist = res.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
addGroup(sl_id, name) {
|
||||||
|
|
||||||
|
axios({
|
||||||
|
method: 'post',
|
||||||
|
url: "/group",
|
||||||
|
data: {
|
||||||
|
sl_id: sl_id,
|
||||||
|
name: name,
|
||||||
|
color: "#00a1ff",
|
||||||
|
hidden: false
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
console.log(res.data);
|
||||||
|
app.currentlist = res.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
addItem(group_id, sl_id, name, count) {
|
||||||
|
|
||||||
|
console.log("AAA" + group_id + " ddd, " + sl_id)
|
||||||
|
|
||||||
|
axios({
|
||||||
|
method: 'post',
|
||||||
|
url: "/item",
|
||||||
|
data: {
|
||||||
|
sl_id: sl_id,
|
||||||
|
group_id: group_id,
|
||||||
|
name: name,
|
||||||
|
count: count
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
console.log(res.data);
|
||||||
|
app.currentlist = res.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
setCurrentGroup(group_id) {
|
||||||
|
app.currentGroup = group_id;
|
||||||
|
console.log(group_id);
|
||||||
|
},
|
||||||
|
|
||||||
|
delItem(item_id, group_id, sl_id) {
|
||||||
|
|
||||||
|
console.log(item_id + " d " + group_id + " " + sl_id)
|
||||||
|
|
||||||
|
axios({
|
||||||
|
method: 'delete',
|
||||||
|
url: "/item",
|
||||||
|
data: {
|
||||||
|
sl_id: sl_id,
|
||||||
|
group_id: group_id,
|
||||||
|
item_id: item_id
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
console.log(res.data);
|
||||||
|
app.currentlist = res.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
removeMember(sl_id) {
|
||||||
|
firebase.auth().onAuthStateChanged(function (user) {
|
||||||
|
if (user) {
|
||||||
|
firebase.auth().currentUser.getIdToken( /* forceRefresh */ true).then(function (idtoken) {
|
||||||
|
axios({
|
||||||
|
method: 'delete',
|
||||||
|
url: "/exitinvite",
|
||||||
|
data: {
|
||||||
|
sl_id: sl_id,
|
||||||
|
idtoken: idtoken
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
app.sharedshoppinglists = res.data;
|
||||||
|
});
|
||||||
|
}).catch((error) => console.error("Get id token client error: ", error));
|
||||||
|
} else {
|
||||||
|
console.log("Check Auth error", user)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
createInvite(sl_id) {
|
||||||
|
axios({
|
||||||
|
method: 'post',
|
||||||
|
url: "/invite",
|
||||||
|
data: {
|
||||||
|
sl_id: sl_id
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
M.toast({html: 'Invite Link created'});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
searchUsers(search) {
|
||||||
|
axios({
|
||||||
|
method: 'get',
|
||||||
|
url: "/users?search=" + search
|
||||||
|
}).then((res) => {
|
||||||
|
app.users = res.data
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
inviteMan(sl_id, user_id) {
|
||||||
|
axios({
|
||||||
|
method: 'post',
|
||||||
|
url: "/maninvite",
|
||||||
|
data : {
|
||||||
|
uid: user_id,
|
||||||
|
sl_id: sl_id
|
||||||
|
}
|
||||||
|
}).then((res) => {
|
||||||
|
M.toast({html: 'User invited'});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
@ -128,6 +260,28 @@ var app = new Vue({
|
|||||||
} else {
|
} else {
|
||||||
console.log("Check Auth error", user)
|
console.log("Check Auth error", user)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
firebase.auth().onAuthStateChanged(function (user) {
|
||||||
|
if (user) {
|
||||||
|
firebase.auth().currentUser.getIdToken( /* forceRefresh */ true).then(function (idtoken) {
|
||||||
|
axios.get('/donepurchases?idtoken=' + idtoken)
|
||||||
|
.then(function (res) {
|
||||||
|
|
||||||
|
app.done_purchases = res.data;
|
||||||
|
console.log(res.data);
|
||||||
|
})
|
||||||
|
.catch(function (error) {
|
||||||
|
|
||||||
|
console.log(error);
|
||||||
|
})
|
||||||
|
.then(function () {
|
||||||
|
|
||||||
|
});
|
||||||
|
}).catch((error) => console.error("Get id token client error: ", error));
|
||||||
|
} else {
|
||||||
|
console.log("Check Auth error", user)
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -142,6 +296,23 @@ $(document).on("click", ".citemL", function () {
|
|||||||
$(this).addClass("activeL");
|
$(this).addClass("activeL");
|
||||||
});
|
});
|
||||||
|
|
||||||
$(".nav-createlist").click(function() {
|
$(".crtList").click(function() {
|
||||||
$('#modal1').modal("open");
|
$('#modal1').modal("open");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$(document).on("click", ".modlGR", function () {
|
||||||
|
$('#modalGR').modal("open");
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$(document).on("click", ".modlIT", function () {
|
||||||
|
$('#modalIT').modal("open");
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".modlINV").click(function() {
|
||||||
|
$('#modalINV').modal("open");
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".modlINVM").click(function() {
|
||||||
|
$('#modalINVM').modal("open");
|
||||||
|
});
|
@ -18,3 +18,7 @@ body {
|
|||||||
.brand-logo {
|
.brand-logo {
|
||||||
margin-left: 30px !important;
|
margin-left: 30px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icoR {
|
||||||
|
color: #e53935;
|
||||||
|
}
|
@ -327,6 +327,24 @@ router.delete("/member", (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
router.delete("/exitinvite", (req, res) => {
|
||||||
|
|
||||||
|
var token = req.body.idtoken;
|
||||||
|
var uid;
|
||||||
|
firebaseAdmin.auth().verifyIdToken(token)
|
||||||
|
.then(async function (decodedToken) {
|
||||||
|
uid = decodedToken.uid;
|
||||||
|
|
||||||
|
try {
|
||||||
|
res.status(200).send(postgres.removeMember(uid, req.body.sl_id));
|
||||||
|
} catch (err) {
|
||||||
|
res.status(400).send(await err);
|
||||||
|
}
|
||||||
|
}).catch(function (error) {
|
||||||
|
console.log(error)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
router.get("/invite/:invitelink", async (req, res) => {
|
router.get("/invite/:invitelink", async (req, res) => {
|
||||||
res.status(200).render("invite");
|
res.status(200).render("invite");
|
||||||
});
|
});
|
||||||
|
@ -34,16 +34,21 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="myapp">
|
<div class="myapp">
|
||||||
<nav>
|
<div class="navbar-fixed">
|
||||||
<div class="nav-wrapper red darken-1">
|
<nav>
|
||||||
<a class="brand-logo">{{title}}</a>
|
<div class="nav-wrapper red darken-1">
|
||||||
<ul id="nav-mobile" class="right hide-on-med-and-down">
|
<a class="brand-logo">{{title}}</a>
|
||||||
<li><a href="sass.html">Done Purchases</a></li>
|
<ul id="nav-mobile" class="right hide-on-med-and-down">
|
||||||
<li><a href="/scan">Scan bill</a></li>
|
<li><a>Done Purchases</a></li>
|
||||||
<li class="nav-createlist"><a>Create Shoppinglist</a></li>
|
<li><a href="/scan">Scan bill</a></li>
|
||||||
</ul>
|
<li class="nav-createlist crtList"><a>Create Shoppinglist</a></li>
|
||||||
</div>
|
<li class="nav-createlist modlGR"><a>Add Group</a></li>
|
||||||
</nav>
|
<li class="nav-createlist modlINV"><a>Show Invitelink</a></li>
|
||||||
|
<li class="nav-createlist modlINVM"><a>Invite User manually</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="container row">
|
<div class="container row">
|
||||||
@ -55,7 +60,9 @@
|
|||||||
<li class="collection-item citemL" v-for="item in myshoppinglists">
|
<li class="collection-item citemL" v-for="item in myshoppinglists">
|
||||||
<div v-on:click="getShoppinglistDetail(item.sl_id)">{{item.name}}<a href="#!"
|
<div v-on:click="getShoppinglistDetail(item.sl_id)">{{item.name}}<a href="#!"
|
||||||
class="secondary-content"><i v-on:click="deleteShoppinglist(item.sl_id)"
|
class="secondary-content"><i v-on:click="deleteShoppinglist(item.sl_id)"
|
||||||
class="material-icons ico">delete</i> <i class="material-icons ico">edit</i></a>
|
class="material-icons ico">delete</i> <i class="material-icons ico">edit</i>
|
||||||
|
<i class="material-icons ico" v-on:click="createInvite(item.sl_id)">share</i>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@ -67,25 +74,45 @@
|
|||||||
<h4>Shared Shoppinglists</h4>
|
<h4>Shared Shoppinglists</h4>
|
||||||
</li>
|
</li>
|
||||||
<li class="collection-item citemL" v-for="item in sharedshoppinglists">
|
<li class="collection-item citemL" v-for="item in sharedshoppinglists">
|
||||||
<div>{{item.name}}<a href="#!" class="secondary-content"><i
|
<div>{{item.name}}<a class="secondary-content"><i class="material-icons ico"
|
||||||
class="material-icons ico">remove_circle_outline</i></a></div>
|
v-on:click="removeMember(item.sl_id)">remove_circle_outline</i></a></div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
|
<ul class="collection with-header">
|
||||||
|
<li class="collection-header">
|
||||||
|
<h4>Your Done Purchases</h4>
|
||||||
|
</li>
|
||||||
|
<li class="collection-item citemL" v-for="item in done_purchases">
|
||||||
|
<div>{{item.count}}x {{item.name}} ({{item.date}})<a class="secondary-content"></a></div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- etainansicht -->
|
<!-- detainansicht -->
|
||||||
<div class="col s6">
|
<div class="col s6">
|
||||||
|
|
||||||
<ul class="collapsible">
|
<ul class="collapsible">
|
||||||
<li v-for="group in currentlist.groups">
|
<li v-for="group in currentlist.groups">
|
||||||
<div class="collapsible-header"><i class="material-icons">view_list</i>{{group.name}}</div>
|
<div class="collapsible-header" v-on:click="setCurrentGroup(group.group_id)"><i
|
||||||
|
class="material-icons ico"
|
||||||
|
v-on:click="deleteGroup(group.group_id, currentlist.sl_id)">delete</i><i
|
||||||
|
class="material-icons ico">edit</i><i class="large material-icons ico modlIT"
|
||||||
|
v-on:click="setCurrentGroup(group.group_id)">add</i>{{group.name}}</div>
|
||||||
<div class="collapsible-body"><span>
|
<div class="collapsible-body"><span>
|
||||||
|
|
||||||
<div class="collection">
|
<ul class="collection">
|
||||||
<a class="collection-item msl" v-for="item in group.content">{{item.name}}</a>
|
<li class="collection-item msl" v-for="item in group.content">
|
||||||
</div>
|
<div>{{item.name}} {{item.count}}x
|
||||||
|
<a v-on:click="delItem(item.item_id, currentGroup, currentlist.sl_id)"
|
||||||
|
class="secondary-content"><i class="material-icons ico">delete</i></a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
</span></div>
|
</span></div>
|
||||||
</li>
|
</li>
|
||||||
@ -95,6 +122,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Modal Structure ADD SHOPPINGLOST -->
|
||||||
<div id="modal1" class="modal">
|
<div id="modal1" class="modal">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<h4>Create new Shoppinglist</h4>
|
<h4>Create new Shoppinglist</h4>
|
||||||
@ -107,7 +136,83 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<a href="#!" class="modal-close waves-effect waves-green btn-flat" v-on:click="createShoppinglist(name, description)">Create</a>
|
<a href="#!" class="modal-close waves-effect waves-green btn-flat"
|
||||||
|
v-on:click="createShoppinglist(name, description)">Create</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Modal Structure ADD GROUP -->
|
||||||
|
<div id="modalGR" class="modal">
|
||||||
|
<div class="modal-content">
|
||||||
|
<h4>Add Group to {{currentlist.name}}</h4>
|
||||||
|
<input id="gr_name" type="text" class="validate" v-model="grname">
|
||||||
|
<label class="active" for="gr_name">Group Name</label>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<a class="modal-close waves-effect waves-green btn-flat"
|
||||||
|
v-on:click="addGroup(currentlist.sl_id, grname)">Add Group</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Modal Structure ADD Item -->
|
||||||
|
<div id="modalIT" class="modal">
|
||||||
|
<div class="modal-content">
|
||||||
|
<h4>Add Item</h4>
|
||||||
|
<input id="it_name" type="text" class="validate" v-model="it_name">
|
||||||
|
<label class="active" for="it_name">Item Name</label>
|
||||||
|
|
||||||
|
<input id="it_count" type="text" class="validate" v-model="it_count">
|
||||||
|
<label class="active" for="it_count">Count</label>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<a class="modal-close waves-effect waves-green btn-flat"
|
||||||
|
v-on:click="addItem(currentGroup, currentlist.sl_id, it_name, it_count)">Add Item</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Modal Invite link-->
|
||||||
|
<div id="modalINV" class="modal">
|
||||||
|
<div class="modal-content">
|
||||||
|
<h4>Invitelink: </h4>
|
||||||
|
|
||||||
|
<textarea id="textarea1"
|
||||||
|
class="materialize-textarea">www.smartshopper.cf/invite/{{currentlist.invitelink}}</textarea>
|
||||||
|
<label for="textarea1">Invitelink</label>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<a class="modal-close waves-effect waves-green btn-flat"
|
||||||
|
v-on:click="addItem(currentGroup, currentlist.sl_id, it_name, it_count)">Skip</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Modal Invite manually-->
|
||||||
|
<div id="modalINVM" class="modal">
|
||||||
|
<div class="modal-content">
|
||||||
|
<h4>Invite User to Shoppinglist</h4>
|
||||||
|
<div class="row">
|
||||||
|
<div class="input-field col s6">
|
||||||
|
<input value="" id="first_name2" type="text" class="validate" v-model="search" v-on:keyup="searchUsers(search)">
|
||||||
|
<label class="active" for="first_name2">Name</label>
|
||||||
|
</div>
|
||||||
|
<div class="col s6">
|
||||||
|
<ul class="collection">
|
||||||
|
<li class="collection-item avatar" v-for="user in users">
|
||||||
|
<img src="user.picture" alt="" class="circle">
|
||||||
|
<span class="title">{{user.name}}</span>
|
||||||
|
<p>{{user.email}}</p>
|
||||||
|
|
||||||
|
<a class="secondary-content"><i class="material-icons icoR" v-on:click="inviteMan(currentlist.sl_id, user.username)">add_circle</i></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<a class="modal-close waves-effect waves-red btn-flat">Cancel</a>
|
||||||
|
<a class="modal-close waves-effect waves-green btn-flat">Confirm</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user