diff --git a/imports/api/data-collection.js b/imports/api/data-collection.js index cf4e672..be6fbfe 100644 --- a/imports/api/data-collection.js +++ b/imports/api/data-collection.js @@ -3,6 +3,9 @@ import { Mongo } from 'meteor/mongo'; import { check } from 'meteor/check'; import { MongoClient } from 'mongodb'; import {Assets} from "/imports/api/assets"; +import {Students} from "/imports/api/students"; +import {Staff} from "/imports/api/staff"; +import {AssetTypes} from "/imports/api/asset-types"; //import {Roles} from 'alanning/roles'; // console.log("Setting Up Data Collection...") @@ -81,13 +84,34 @@ if (Meteor.isServer) { } if(query) { - console.log("Collecting Chromebook Data: "); - console.log(query); + // console.log("Collecting Chromebook Data: "); + // console.log(query); //Sort by the last time the record was updated from most to least recent. let result = Meteor.Records.find(query, {sort: {endTime: -1}}).fetch(); // console.log("Found: "); // console.log(result); + + //Add some additional data to the records. + for (let next of result) { + if (next.serial) { + next.asset = Assets.findOne({serial: next.serial}); + } + + if (next.email) { + next.person = Students.findOne({email: next.email}); + + if (!next.person) next.person = Staff.findOne({email: next.email}); + } + + if (next.asset) { + next.assetType = AssetTypes.findOne({_id: next.asset.assetType}) + + if (next.asset.assigneeId) { + next.assignedTo = next.asset.assigneeType === "Student" ? Students.findOne({_id: next.asset.assigneeId}) : Staff.findOne({_id: next.asset.assigneeId}) + } + } + } return result; } else return null; diff --git a/imports/api/staff.js b/imports/api/staff.js index 759c58b..a17ee8e 100644 --- a/imports/api/staff.js +++ b/imports/api/staff.js @@ -12,7 +12,8 @@ export const Staff = new Mongo.Collection('staff'); if (Meteor.isServer) { // This code only runs on the server Meteor.publish('staff', function(siteId) { - return Staff.find({siteId}); + if(siteId) check(siteId, String); + return siteId ? Staff.find({siteId}) : Staff.find({}); }); } Meteor.methods({ diff --git a/imports/api/students.js b/imports/api/students.js index 5b659b9..6bdfa5c 100644 --- a/imports/api/students.js +++ b/imports/api/students.js @@ -14,7 +14,8 @@ if (Meteor.isServer) { // This code only runs on the server Meteor.publish('students', function(siteId) { - return Students.find({siteId}); + if(siteId) check(siteId, String); + return siteId ? Students.find({siteId}) : Students.find({}); }); Meteor.methods({ diff --git a/imports/ui/App.svelte b/imports/ui/App.svelte index 79b5626..f5f7b23 100644 --- a/imports/ui/App.svelte +++ b/imports/ui/App.svelte @@ -9,12 +9,14 @@ import Admin from './Admin.svelte'; import Announcer from './Announcer.svelte'; import Assets from "./Assets.svelte"; + import Assignments from "/imports/ui/Assignments.svelte"; // When the URL changes, run the code... in this case to scroll to the top. router.subscribe(_ => window.scrollTo(0, 0)); let canManageLaptops = false; let isAdmin = false; + let currentUser $: currentUser = useTracker(() => Meteor.user()); Tracker.autorun(() => { @@ -62,11 +64,10 @@ Home {#if canManageLaptops} Chromebooks - {/if} - {#if canManageLaptops} - Assets + Assignments {/if} {#if isAdmin} + Assets Users Admin {/if} @@ -81,8 +82,13 @@ - + {#if canManageLaptops} + + {/if} + + + {#if isAdmin} {/if} diff --git a/imports/ui/Assets.svelte b/imports/ui/Assets.svelte index fc65539..e055705 100644 --- a/imports/ui/Assets.svelte +++ b/imports/ui/Assets.svelte @@ -2,16 +2,13 @@ import Tab, { Label } from '@smui/tab'; import TabBar from '@smui/tab-bar'; import {Meteor} from "meteor/meteor"; - import {onMount} from "svelte"; import AssetList from "/imports/ui/Assets/AssetList.svelte"; import AddAssets from "/imports/ui/Assets/AddAssets.svelte"; import {useTracker} from "meteor/rdb:svelte-meteor-data"; - import AssignAssets from "/imports/ui/Assets/AssignAssets.svelte"; - import AssignmentByAssignee from "/imports/ui/Assets/AssignmentByAssignee.svelte"; - import AssignmentByAsset from "/imports/ui/Assets/AssignmentByAsset.svelte"; let canManageLaptops = false; let isAdmin = false; + let currentUser $: currentUser = useTracker(() => Meteor.user()); Tracker.autorun(() => { @@ -23,11 +20,6 @@ let tabs = []; - if(canManageLaptops) { - tabs.push({id: 'listAssignmentsByAssignee', label: 'Assignments By Assignee'}); - tabs.push({id: 'listAssignmentsByAsset', label: 'Assignments By Asset'}); - tabs.push({id: 'assignAssets', label: 'Assign Assets'}); - } if(isAdmin) { tabs.push({id: 'listAssets', label: 'Asset List'}); tabs.push({id: 'addAssets', label: 'Add Assets'}); @@ -45,12 +37,6 @@ {:else if activeTab && activeTab.id === 'addAssets'} - {:else if activeTab && activeTab.id === 'assignAssets'} - - {:else if activeTab && activeTab.id === 'listAssignmentsByAssignee'} - - {:else if activeTab && activeTab.id === 'listAssignmentsByAsset'} - {/if} diff --git a/imports/ui/Assignments.svelte b/imports/ui/Assignments.svelte index e69de29..1b8cc20 100644 --- a/imports/ui/Assignments.svelte +++ b/imports/ui/Assignments.svelte @@ -0,0 +1,51 @@ + + +
+ + + + + + {#if activeTab && activeTab.id === 'assignAssets'} + + {:else if activeTab && activeTab.id === 'listAssignmentsByAssignee'} + + {:else if activeTab && activeTab.id === 'listAssignmentsByPerson'} + + {:else if activeTab && activeTab.id === 'listAssignmentsByAsset'} + + {/if} +
+ + \ No newline at end of file diff --git a/imports/ui/Assignments/AssignmentByPerson.svelte b/imports/ui/Assignments/AssignmentByPerson.svelte index d6190b6..454cde7 100644 --- a/imports/ui/Assignments/AssignmentByPerson.svelte +++ b/imports/ui/Assignments/AssignmentByPerson.svelte @@ -9,97 +9,49 @@ import List, {Item, Graphic, Meta, Text, PrimaryText, SecondaryText} from '@smui/list'; import Paper from '@smui/paper'; import LayoutGrid, {Cell} from '@smui/layout-grid'; + import {Assets} from "/imports/api/assets"; + import {AssetTypes} from "/imports/api/asset-types"; - let grades = ['Staff', 'All Grades']; onMount(async () => { - Meteor.subscribe('sites'); - Meteor.call('students.getPossibleGrades', (err, result) => { - if(err) console.log(err); - else { - grades = ['Staff', 'All Grades', ...result]; - } - }); + Meteor.subscribe('students'); + Meteor.subscribe('staff'); + Meteor.subscribe('assets'); + Meteor.subscribe('assetTypes'); }); - // Load the sites (reactive). - let sites = Sites.find({}); let selectedSiteId; - let categories = ['Asset ID', 'Email', 'First Name', 'Last Name']; + let categories = ['Email', 'First Name', 'Last Name']; let selectedCategory = 'Email'; - let selectedGrade = 'All Grades'; let searchText = ""; - let searchResults; - let selectedResult; + let staffSearchResults; + let studentSearchResults; $: { - console.log("Site ID") - console.log(selectedSiteId) - if(selectedSiteId) { - Meteor.subscribe('students', selectedSiteId); - Meteor.subscribe('staff', selectedSiteId); - } + if(searchText && searchText.length > 1) { + let query = {}; + if (selectedCategory === 'Email') { + query.email = {$regex: searchText, $options: 'i'}; + } else if (selectedCategory === 'First Name') { + query.firstName = {$regex: searchText, $options: 'i'}; + } else { + query.lastName = {$regex: searchText, $options: 'i'}; + } + staffSearchResults = Staff.find(query); + studentSearchResults = Students.find(query); + } + else { + staffSearchResults = undefined; + studentSearchResults = undefined; + } } - - $: { - selectedResult = null; - console.log("Starting search") - - // Require at least two characters in the search field before we start filtering. - if(selectedSiteId && selectedGrade && selectedCategory) { - let query = {}; - let queryType = (selectedGrade === "Staff") ? 1 : 0; - - if(searchText && searchText.length > 0) { - if (selectedCategory === 'Email') { - query.email = {$regex: searchText, $options: 'i'}; - } else if( selectedCategory === 'Asset ID') { - //Do not do anything yet... - } else if (selectedCategory === 'First Name') { - query.firstName = {$regex: searchText, $options: 'i'}; - } else { - query.lastName = {$regex: searchText, $options: 'i'}; - } - } - - if(selectedCategory === 'Asset ID') { - Meteor.call('AssetAssignments.getOne', searchText, (err, result) => { - if(err) { - console.error(err); - } - else { - if(result && result.assigneeType && result.assigneeId) { - if (result.assigneeType === 'Staff') { - query._id = result.assigneeId; - queryType = 1; - } else if (result.assigneeType === 'Student') { - query._id = result.assigneeId; - queryType = 0; - } else { - console.error("Invalid AssigneeType"); - } - } - else { - console.error('Invalid result from AssetAssignments.getOne'); - } - } - }); - } - - if(queryType === 1) { - searchResults = Staff.find(query); - } - else { - if(selectedGrade !== 'All Grades') { - query.grade = selectedGrade; - } - - // console.log("Searching") - // console.log(query) - searchResults = Students.find(query); - } - } - else { - searchResults = undefined; - } + + const assignedAssets = (person) => { + let result = Assets.find({assigneeId: person._id}).fetch(); + + for(next of result) { + next.type = AssetTypes.findOne({_id: next.assetTypeId}) + } + + return result; } @@ -108,20 +60,6 @@ - - - - - -