Improvements and Move to new-cloud
- Now sheets have id (random floID) as identifier instead of title - Fixes for the same
This commit is contained in:
parent
6d185fc973
commit
3624cb04c2
9496
index.html
9496
index.html
File diff suppressed because it is too large
Load Diff
281
scripts/logsheet.js
Normal file
281
scripts/logsheet.js
Normal file
@ -0,0 +1,281 @@
|
||||
(function() {
|
||||
'use strict';
|
||||
const logSheet = window.logSheet = {};
|
||||
const TYPE_SHEET_ENTRY = "sheet_entry";
|
||||
|
||||
logSheet.init = function() {
|
||||
return new Promise((resolve, reject) => {
|
||||
floCloudAPI.requestObjectData("logSheet").then(result => {
|
||||
if (!floGlobals.appObjects.logSheet || typeof floGlobals.appObjects.logSheet !== "object")
|
||||
floGlobals.appObjects.logSheet = {};
|
||||
if (!floGlobals.appObjects.logSheet.personDetails || typeof floGlobals.appObjects.logSheet.personDetails !== "object")
|
||||
floGlobals.appObjects.logSheet.personDetails = {};
|
||||
if (!floGlobals.appObjects.logSheet.sheetList || typeof floGlobals.appObjects.logSheet.sheetList !== "object")
|
||||
floGlobals.appObjects.logSheet.sheetList = {};
|
||||
resolve(result)
|
||||
}).catch(error => reject(error))
|
||||
})
|
||||
}
|
||||
logSheet.addPerson = function(floID, name, otherDetails = {}) {
|
||||
if (floGlobals.appObjects.logSheet.personDetails[floID])
|
||||
throw ("floID already exist")
|
||||
floGlobals.appObjects.logSheet.personDetails[floID] = {};
|
||||
floGlobals.appObjects.logSheet.personDetails[floID].name = name;
|
||||
for (d in otherDetails) {
|
||||
if (d === "name" || d === "floID" || !d || !otherDetails[d])
|
||||
continue;
|
||||
else
|
||||
floGlobals.appObjects.logSheet.personDetails[floID][d] = otherDetails[d]
|
||||
}
|
||||
}
|
||||
|
||||
logSheet.rmPerson = function(floID) {
|
||||
if (!floGlobals.appObjects.logSheet.personDetails[floID])
|
||||
throw ("floID not found")
|
||||
delete floGlobals.appObjects.logSheet.personDetails[floID]
|
||||
}
|
||||
|
||||
logSheet.editPerson = function(floID, details) {
|
||||
if (!floGlobals.appObjects.logSheet.personDetails[floID])
|
||||
throw ("floID not found")
|
||||
for (d in details) {
|
||||
if (details[d] === undefined || details[d] === null)
|
||||
delete floGlobals.appObjects.logSheet.personDetails[floID][d];
|
||||
else if (d === "floID")
|
||||
continue;
|
||||
else
|
||||
floGlobals.appObjects.logSheet.personDetails[floID][d] = details[d];
|
||||
}
|
||||
}
|
||||
|
||||
logSheet.listPersons = function() {
|
||||
return floGlobals.appObjects.logSheet.personDetails
|
||||
}
|
||||
|
||||
logSheet.viewPerson = function(floID) {
|
||||
if (!floGlobals.appObjects.logSheet.personDetails[floID])
|
||||
throw ("floID not found")
|
||||
return floGlobals.appObjects.logSheet.personDetails[floID]
|
||||
}
|
||||
|
||||
logSheet.createNewSheet = function(title, description, attributes, editors = floGlobals.subAdmins) {
|
||||
let sheet_id = floCrypto.tmpID;
|
||||
floGlobals.appObjects.logSheet.sheetList[sheet_id] = {
|
||||
title: title,
|
||||
description: description,
|
||||
editors: editors,
|
||||
attributes: attributes
|
||||
}
|
||||
return sheet_id;
|
||||
}
|
||||
|
||||
logSheet.manageSheetControl = function(sheet_id, addList, rmList) {
|
||||
if (addList === null && rmList === null) {
|
||||
floGlobals.appObjects.logSheet.sheetList[sheet_id].editors = null
|
||||
return
|
||||
}
|
||||
let editorList = floGlobals.appObjects.logSheet.sheetList[sheet_id].editors || [];
|
||||
if (Array.isArray(addList))
|
||||
addList.forEach(e => editorList.includes(e) ? null : editorList.push(e))
|
||||
if (Array.isArray(rmList))
|
||||
editorList = editorList.filter(e => !rmList.includes(e));
|
||||
floGlobals.appObjects.logSheet.sheetList[sheet_id].editors = editorList
|
||||
}
|
||||
|
||||
logSheet.editSheetDescription = function(sheet_id, description) {
|
||||
floGlobals.appObjects.logSheet.sheetList[sheet_id].description = description
|
||||
}
|
||||
|
||||
logSheet.listSheets = function() {
|
||||
return floGlobals.appObjects.logSheet.sheetList
|
||||
}
|
||||
|
||||
logSheet.commitUpdates = function() {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!floGlobals.subAdmins.includes(floDapps.user.id))
|
||||
reject("Access Denied! only subAdmins can commit")
|
||||
floCloudAPI.updateObjectData("logSheet")
|
||||
.then(result => resolve(result))
|
||||
.catch(error => reject(error))
|
||||
})
|
||||
}
|
||||
|
||||
logSheet.enterLog = function(sheet_id, floID, log) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (floGlobals.appObjects.logSheet.sheetList[sheet_id].editors) {
|
||||
if (!floGlobals.appObjects.logSheet.sheetList[sheet_id].editors.includes(floDapps.user.id))
|
||||
return reject("Only editors can update logs");
|
||||
else if (!(floID in floGlobals.appObjects.logSheet.personDetails))
|
||||
return reject("floID not found");
|
||||
} else if (!floGlobals.subAdmins.includes(floDapps.user.id) && floID != floDapps.user.id)
|
||||
return reject("Public authorized to log their own floID only");
|
||||
floCloudAPI.sendGeneralData({
|
||||
floID,
|
||||
log
|
||||
}, TYPE_SHEET_ENTRY, {
|
||||
receiverID: sheet_id
|
||||
}).then(result => resolve(result))
|
||||
.catch(error => reject(error))
|
||||
})
|
||||
}
|
||||
|
||||
logSheet.gradeLog = function(sheet_id, vc, grade) {
|
||||
return new Promise((resolve, reject) => {
|
||||
//reject if user is not subAdmin or editor
|
||||
if (!floGlobals.subAdmins.includes(floDapps.user.id) ||
|
||||
(floGlobals.appObjects.logSheet.sheetList[sheet_id].editors &&
|
||||
!floGlobals.appObjects.logSheet.sheetList[sheet_id].editors.includes(floDapps.user.id)))
|
||||
return reject("Only subAdmins in editor list can grade logs")
|
||||
|
||||
let log = floGlobals.generalDataset(TYPE_SHEET_ENTRY, {
|
||||
receiverID: sheet_id
|
||||
})[vc];
|
||||
if (!log)
|
||||
return reject("Log not found");
|
||||
else if (log.senderID === floDapps.user.id)
|
||||
return reject("Cannot grade own log")
|
||||
|
||||
floCloudAPI.tagApplicationData(vc, grade, {
|
||||
receiverID: sheet_id
|
||||
}).then(result => resolve(result))
|
||||
.catch(error => reject(error))
|
||||
})
|
||||
}
|
||||
|
||||
logSheet.refreshLogs = function(sheet_id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!(sheet_id in floGlobals.appObjects.logSheet.sheetList))
|
||||
reject("Sheet not found")
|
||||
else {
|
||||
floCloudAPI.requestGeneralData(TYPE_SHEET_ENTRY, {
|
||||
senderIDs: floGlobals.appObjects.logSheet.sheetList[sheet_id].editors,
|
||||
receiverID: sheet_id
|
||||
}).then(result => resolve(result))
|
||||
.catch(error => reject(error))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
logSheet.viewLogs = function(sheet_id) {
|
||||
if (!(sheet_id in floGlobals.appObjects.logSheet.sheetList))
|
||||
throw ("Sheet not found")
|
||||
let sheet = [],
|
||||
vcIndex = {},
|
||||
entries = floGlobals.generalDataset(TYPE_SHEET_ENTRY, {
|
||||
receiverID: sheet_id
|
||||
}),
|
||||
editors = floGlobals.appObjects.logSheet.sheetList[sheet_id].editors;
|
||||
for (let vc in entries) {
|
||||
let l = entries[vc];
|
||||
if ((!editors && (floGlobals.subAdmins.includes(l.senderID) || l.senderID === l.message.floID)) || editors.includes(l.senderID)) {
|
||||
if (floCrypto.validateAddr(l.message.floID)) {
|
||||
let vc = l.vectorClock
|
||||
sheet.push({
|
||||
vc: vc,
|
||||
floID: l.message.floID,
|
||||
log: l.message.log,
|
||||
grade: l.tag
|
||||
})
|
||||
vcIndex[vc] = sheet.length - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
id: sheet_id,
|
||||
title: floGlobals.appObjects.logSheet.sheetList[sheet_id].title,
|
||||
description: floGlobals.appObjects.logSheet.sheetList[sheet_id].description,
|
||||
editors: floGlobals.appObjects.logSheet.sheetList[sheet_id].editors,
|
||||
attributes: floGlobals.appObjects.logSheet.sheetList[sheet_id].attributes,
|
||||
sheet: sheet
|
||||
}
|
||||
}
|
||||
|
||||
const groupBy = logSheet.groupBy = {};
|
||||
groupBy.count = function(sheet_id, sheet) {
|
||||
if (!(sheet_id in floGlobals.appObjects.logSheet.sheetList))
|
||||
throw ("Sheet not found")
|
||||
let group = {};
|
||||
sheet.forEach(l => {
|
||||
if (!(l.floID in group))
|
||||
group[l.floID] = 1
|
||||
else
|
||||
group[l.floID] += 1
|
||||
})
|
||||
return group;
|
||||
}
|
||||
|
||||
groupBy.total = function(sheet_id, sheet, attribute) {
|
||||
if (!(sheet_id in floGlobals.appObjects.logSheet.sheetList))
|
||||
throw ("Sheet not found")
|
||||
let group = {};
|
||||
let attrubuteIndex = floGlobals.appObjects.logSheet.sheetList[sheet_id].attributes.indexOf(attribute)
|
||||
sheet.forEach(l => {
|
||||
let value = parseFloat(l.log[attrubuteIndex])
|
||||
if (!isNaN(value)) {
|
||||
if (!(l.floID in group))
|
||||
group[l.floID] = value
|
||||
else
|
||||
group[l.floID] += value
|
||||
}
|
||||
})
|
||||
return group;
|
||||
}
|
||||
|
||||
groupBy.avg = function(sheet_id, sheet, attribute) {
|
||||
if (!(sheet_id in floGlobals.appObjects.logSheet.sheetList))
|
||||
throw ("Sheet not found")
|
||||
let group = {};
|
||||
let attrubuteIndex = floGlobals.appObjects.logSheet.sheetList[sheet_id].attributes.indexOf(attribute)
|
||||
sheet.forEach(l => {
|
||||
let value = parseFloat(l.log[attrubuteIndex])
|
||||
if (!isNaN(value)) {
|
||||
if (!(l.floID in group))
|
||||
group[l.floID] = {
|
||||
total: value,
|
||||
count: 1
|
||||
}
|
||||
else {
|
||||
group[l.floID].total += value
|
||||
group[l.floID].count += 1
|
||||
}
|
||||
}
|
||||
})
|
||||
for (floID in group)
|
||||
group[floID] = group[floID].total / group[floID].count
|
||||
return group;
|
||||
}
|
||||
|
||||
groupBy.min = function(sheet_id, sheet, attribute) {
|
||||
if (!(sheet_id in floGlobals.appObjects.logSheet.sheetList))
|
||||
throw ("Sheet not found")
|
||||
let group = {};
|
||||
let attrubuteIndex = floGlobals.appObjects.logSheet.sheetList[sheet_id].attributes.indexOf(attribute)
|
||||
sheet.forEach(l => {
|
||||
let value = parseFloat(l.log[attrubuteIndex])
|
||||
if (!isNaN(value)) {
|
||||
if (!(l.floID in group))
|
||||
group[l.floID] = value
|
||||
else if (value < group[l.floID])
|
||||
group[l.floID] = value
|
||||
}
|
||||
})
|
||||
return group;
|
||||
}
|
||||
|
||||
groupBy.max = function(sheet_id, sheet, attribute) {
|
||||
if (!(sheet_id in floGlobals.appObjects.logSheet.sheetList))
|
||||
throw ("Sheet not found")
|
||||
let group = {};
|
||||
let attrubuteIndex = floGlobals.appObjects.logSheet.sheetList[sheet_id].attributes.indexOf(attribute)
|
||||
sheet.forEach(l => {
|
||||
let value = parseFloat(l.log[attrubuteIndex])
|
||||
if (!isNaN(value)) {
|
||||
if (!(l.floID in group))
|
||||
group[l.floID] = value
|
||||
else if (value > group[l.floID])
|
||||
group[l.floID] = value
|
||||
}
|
||||
})
|
||||
return group;
|
||||
}
|
||||
})();
|
||||
Loading…
Reference in New Issue
Block a user