diff --git a/imports/api/admin.js b/imports/api/admin.js index cdfcff1..0bbcfb0 100644 --- a/imports/api/admin.js +++ b/imports/api/admin.js @@ -2,6 +2,8 @@ import {Meteor} from "meteor/meteor"; import { _ } from 'underscore'; import { Roles } from 'meteor/alanning:roles'; +// console.log("Setting Up Admin...") + if (Meteor.isServer) { Meteor.methods({ 'admin.fixRecords'(input) { @@ -54,3 +56,5 @@ if (Meteor.isServer) { }, }); } + +// console.log("Admin setup.") \ No newline at end of file diff --git a/imports/api/asset-assignment-history.js b/imports/api/asset-assignment-history.js new file mode 100644 index 0000000..36df18f --- /dev/null +++ b/imports/api/asset-assignment-history.js @@ -0,0 +1,14 @@ +import {Mongo} from "meteor/mongo"; + +export const AssetAssignmentHistory = new Mongo.Collection('assetAssignmentHistory'); + +/* +Maintains a historical record of asset assignments. +assetId: The asset's assigned ID (not a MongoID). +assigneeType: One of 'Student' or 'Staff'. +assigneeId: The MongoID of the student or staff the asset was assigned to. +startDate: The date/time of the assignment. +endDate: The date/time of the unassignment. +startCondition: TODO +endCondition: TODO + */ \ No newline at end of file diff --git a/imports/api/asset-assignments.js b/imports/api/asset-assignments.js index 42fb15b..73739bf 100644 --- a/imports/api/asset-assignments.js +++ b/imports/api/asset-assignments.js @@ -5,6 +5,8 @@ import { Roles } from 'meteor/alanning:roles'; //import SimpleSchema from "simpl-schema"; import {AssetTypes} from "./asset-types"; +// console.log("Setting Up Asset Assignments...") + export const AssetAssignments = new Mongo.Collection('assetAssignments'); /* const TYPE_STUDENT = 1; @@ -42,8 +44,8 @@ if (Meteor.isServer) { //try {AssetAssignments._dropIndex("name")} catch(e) {} //AssetAssignments.createIndex({name: "text"}, {name: "name", unique: false}); - try {AssetTypes._dropIndex("AssetID")} catch(e) {} //Typo put this as an index in AssetTypes instead of AssetAssignments. - AssetAssignments.createIndex({assetId: 1}, {name: "AssetID", unique: false}); + //try {AssetTypes._dropIndex("AssetID")} catch(e) {} //Typo put this as an index in AssetTypes instead of AssetAssignments. + //AssetAssignments.createIndex({assetId: 1}, {name: "AssetID", unique: false}); // This code only runs on the server Meteor.publish('assetAssignments', function(assetId) { @@ -58,11 +60,6 @@ if (Meteor.isServer) { }); } Meteor.methods({ - 'AssetAssignments.getOne'(assetId) { - check(assetId, String); - - return AssetAssignments.findOne(assetId); - }, /** * Assigns the asset to the assignee. The assignee should either be a Student or Staff member. * @param assetId The Mongo ID of the asset (asset._id). @@ -92,3 +89,4 @@ Meteor.methods({ }, }); +// console.log("Asset assignments setup.") \ No newline at end of file diff --git a/imports/api/asset-types.js b/imports/api/asset-types.js index 0f185c8..2865146 100644 --- a/imports/api/asset-types.js +++ b/imports/api/asset-types.js @@ -4,6 +4,8 @@ import { check } from 'meteor/check'; import { Roles } from 'meteor/alanning:roles'; //import SimpleSchema from "simpl-schema"; +// console.log("Setting Up Asset Types...") + // // An asset type is a specific type of equipment. Example: Lenovo 100e Chromebook. // @@ -74,3 +76,4 @@ Meteor.methods({ }, }); +// console.log("Asset types setup.") diff --git a/imports/api/assets.js b/imports/api/assets.js index 65de35f..49b6293 100644 --- a/imports/api/assets.js +++ b/imports/api/assets.js @@ -5,6 +5,9 @@ import { Roles } from 'meteor/alanning:roles'; //import SimpleSchema from "simpl-schema"; import {AssetTypes} from "./asset-types"; import {AssetAssignments} from "/imports/api/asset-assignments"; +import {AssetAssignmentHistory} from "/imports/api/asset-assignment-history"; + +// console.log("Setting Up Assets...") export const Assets = new Mongo.Collection('assets'); @@ -89,6 +92,7 @@ Meteor.methods({ Assets.insert({assetTypeId, assetId}); } } + else throw new Meteor.Error("User Permission Error"); }, 'assets.update'(_id, assetId, serial) { check(_id, String); @@ -99,6 +103,7 @@ Meteor.methods({ //TODO: Need to first verify there are no checked out assets to the staff member. Assets.update({_id}, {$set: {assetId, serial}}); } + else throw new Meteor.Error("User Permission Error"); }, 'assets.remove'(_id) { check(_id, String); @@ -107,6 +112,7 @@ Meteor.methods({ //TODO: Ensure we have not assigned this asset??? Not sure if we should require unassigning first. Assets.remove({_id}); } + else throw new Meteor.Error("User Permission Error"); }, /** * Assigns the asset to the assignee. The assignee should either be a Student or Staff member. @@ -127,8 +133,9 @@ Meteor.methods({ // Should never happen. console.error("Error: Received incorrect assignee type in adding an assignment."); console.error(assigneeType); + throw new Meteor.Error("Error: Received incorrect assignee type in adding an assignment."); } - else if(Roles.userIsInRole(Meteor.userId(), "admin", {anyScope:true})) { + else if(Roles.userIsInRole(Meteor.userId(), "laptop-management", {anyScope:true})) { let asset = Assets.findOne({assetId}); if(asset) { @@ -145,6 +152,7 @@ Meteor.methods({ console.error("Could not find the asset: " + assetId) } } + else throw new Meteor.Error("User Permission Error"); }, /** * Removes an assignment for the asset. @@ -158,37 +166,54 @@ Meteor.methods({ if(!date) date = new Date(); - if(Roles.userIsInRole(Meteor.userId(), "admin", {anyScope:true})) { - Assets.update({assetId}, {$unset: {assigneeType, assigneeId, assignmentDate}}); + if(Roles.userIsInRole(Meteor.userId(), "laptop-management", {anyScope:true})) { + let asset = Assets.findOne({assetId}); + + if(asset) { + try { + AssetAssignmentHistory.insert({assetId, assigneeType: asset.assigneeType, assigneeId: asset.assigneeId, startDate: asset.assignmentDate, endDate: date}); + } catch (e) { + console.error(e); + } + Assets.update({assetId}, {$unset: {assigneeType, assigneeId, assignmentDate}}); + } + else { + console.error("Could not find the asset: " + assetId); + throw new Meteor.Error("Could not find the asset: " + assetId); + } } + else throw new Meteor.Error("User Permission Error"); }, /** * A fix to remove the AssetAssignment collection and merge it with the Asset collection. */ 'assets.fixAssetAssignments'() { - let assignmentDate = new Date(); - //This function just removes the need for the asset-assignments collection and merges it with assets. - if(Roles.userIsInRole(Meteor.userId(), "admin", {anyScope:true})) { - let assets = Assets.find({}).fetch(); - let assetAssignments = AssetAssignments.find({}).fetch(); - - let assetMap = assets.reduce((map, obj) => { - map[obj.assetId] = obj; - return map; - }, {}); - - console.log(assetMap); - console.log(""); - - for(let next of assetAssignments) { - console.log(next); - let asset = assetMap[next.assetId]; - console.log("Updating " + asset.assetId + " to be assigned to " + next.assigneeType + ": " + next.assigneeId); - let c = Assets.update({assetId: asset.assetId}, {$set: {assigneeType: next.assigneeType, assigneeId: next.assigneeId, assignmentDate}}); - console.log("Updated " + c + " Assets"); - console.log(Assets.findOne({assetId: asset.assetId})); - } - } + // Removed this since it should no longer be relevant. + + // let assignmentDate = new Date(); + // //This function just removes the need for the asset-assignments collection and merges it with assets. + // if(Roles.userIsInRole(Meteor.userId(), "admin", {anyScope:true})) { + // let assets = Assets.find({}).fetch(); + // let assetAssignments = AssetAssignments.find({}).fetch(); + // + // let assetMap = assets.reduce((map, obj) => { + // map[obj.assetId] = obj; + // return map; + // }, {}); + // + // console.log(assetMap); + // console.log(""); + // + // for(let next of assetAssignments) { + // console.log(next); + // let asset = assetMap[next.assetId]; + // console.log("Updating " + asset.assetId + " to be assigned to " + next.assigneeType + ": " + next.assigneeId); + // let c = Assets.update({assetId: asset.assetId}, {$set: {assigneeType: next.assigneeType, assigneeId: next.assigneeId, assignmentDate}}); + // console.log("Updated " + c + " Assets"); + // console.log(Assets.findOne({assetId: asset.assetId})); + // } + // } } }); +// console.log("Assets setup.") \ No newline at end of file diff --git a/imports/api/data-collection.js b/imports/api/data-collection.js index 587b025..7d4f058 100644 --- a/imports/api/data-collection.js +++ b/imports/api/data-collection.js @@ -5,6 +5,8 @@ import { MongoClient } from 'mongodb'; import {Assets} from "/imports/api/assets"; //import {Roles} from 'alanning/roles'; +// console.log("Setting Up Data Collection...") + //export const Records = new Mongo.Collection('records'); let client; let database; @@ -104,3 +106,5 @@ if (Meteor.isServer) { // }, }); } + +// console.log("Data Collection setup.") \ No newline at end of file diff --git a/imports/api/index.js b/imports/api/index.js index 1d8d2d1..1066491 100644 --- a/imports/api/index.js +++ b/imports/api/index.js @@ -7,3 +7,6 @@ import "./sites.js"; import "./asset-types.js"; import "./assets.js"; import "./asset-assignments.js"; +import "./asset-assignment-history.js"; + +// console.log("Finished setting up server side models."); \ No newline at end of file diff --git a/imports/api/sites.js b/imports/api/sites.js index efe2f49..728a720 100644 --- a/imports/api/sites.js +++ b/imports/api/sites.js @@ -4,6 +4,8 @@ import {Students} from "./students"; import {Staff} from "./staff"; import { Roles } from 'meteor/alanning:roles'; +// console.log("Setting Up Sites...") + export const Sites = new Mongo.Collection('sites'); if (Meteor.isServer) { @@ -36,3 +38,5 @@ Meteor.methods({ } }, }); + +// console.log("Sites setup.") \ No newline at end of file diff --git a/imports/api/staff.js b/imports/api/staff.js index 83749ed..759c58b 100644 --- a/imports/api/staff.js +++ b/imports/api/staff.js @@ -5,6 +5,8 @@ import {check} from "meteor/check"; import {Sites} from "/imports/api/sites"; import {parse} from "csv-parse"; +// console.log("Setting Up Staff...") + export const Staff = new Mongo.Collection('staff'); if (Meteor.isServer) { @@ -150,3 +152,4 @@ Meteor.methods({ } }); +// console.log("Staff setup.") \ No newline at end of file diff --git a/imports/api/students.js b/imports/api/students.js index b5944ec..5b659b9 100644 --- a/imports/api/students.js +++ b/imports/api/students.js @@ -5,6 +5,8 @@ import {Sites} from "./sites"; import { Roles } from 'meteor/alanning:roles'; import {parse} from 'csv-parse'; +// console.log("Setting Up Students...") + export const Students = new Mongo.Collection('students'); if (Meteor.isServer) { @@ -160,4 +162,6 @@ if (Meteor.isServer) { } }); -} \ No newline at end of file +} + +// console.log("Students setup.") \ No newline at end of file diff --git a/imports/api/users.js b/imports/api/users.js index a00bcbe..3a5262a 100644 --- a/imports/api/users.js +++ b/imports/api/users.js @@ -2,6 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { Roles } from 'meteor/alanning:roles'; import { check } from 'meteor/check'; +// console.log("Setting Up Users...") + if (Meteor.isServer) { Meteor.publish(null, function() { if(this.userId) { @@ -66,3 +68,5 @@ if (Meteor.isServer) { // }, }); } + +// console.log("Users setup.") \ No newline at end of file diff --git a/imports/startup/accounts-config.js b/imports/startup/accounts-config.js index 8d1a8d0..2e1d414 100644 --- a/imports/startup/accounts-config.js +++ b/imports/startup/accounts-config.js @@ -2,6 +2,8 @@ import { Accounts } from 'meteor/accounts-base' import { Roles } from 'meteor/alanning:roles' import {Meteor} from "meteor/meteor"; +console.log("Setting up accounts-config...") + if(Meteor.isClient) { Accounts.ui.config({ passwordSignupFields: 'USERNAME_ONLY' @@ -68,3 +70,5 @@ if(Meteor.isServer) { }); } } + +console.log("Finished setting up accounts-config.") \ No newline at end of file diff --git a/imports/ui/Assets/AssignmentByAsset.svelte b/imports/ui/Assets/AssignmentByAsset.svelte index 081a485..72a8013 100644 --- a/imports/ui/Assets/AssignmentByAsset.svelte +++ b/imports/ui/Assets/AssignmentByAsset.svelte @@ -9,6 +9,8 @@ import {Assets} from "/imports/api/assets"; import {Students} from "/imports/api/students"; import {AssetTypes} from "/imports/api/asset-types"; + import Button, { Label } from '@smui/button'; + import Dialog, { Title, Content, Actions } from '@smui/dialog'; onMount(async () => { Meteor.subscribe('assets'); @@ -53,6 +55,11 @@ const formatDate = (date) => { return date.toLocaleDateString('en-us', {weekday: 'long', year: 'numeric', month: 'short', day: 'numeric'}); } + const unassign = () => { + if(confirm("Unassign Asset?")) { + Meteor.call("assets.unassign", foundAsset.assetId); + } + }
@@ -75,8 +82,26 @@
Assigned on: {formatDate(foundAsset.assignmentDate)}
Assigned to: {foundAssignee.firstName} {foundAssignee.lastName} {#if foundAssignee.grade} ~ {foundAssignee.grade} {/if}({foundAssignee.email})
+ + {/if} {/if} + + + + + + + + + + + + + +