diff --git a/backend/src/components/utils.js b/backend/src/components/utils.js index a4c2eae5..a5c8b6d9 100644 --- a/backend/src/components/utils.js +++ b/backend/src/components/utils.js @@ -186,8 +186,8 @@ function addDistrictLabels(jsonData, districtList) { function sortJSONByDistrictNumber(districts) { return districts.slice().sort((a, b) => { - const districtNumberA = a.districtNumber || ''; - const districtNumberB = b.districtNumber || ''; + const districtNumberA = a['District Number'] || ''; + const districtNumberB = b['District Number'] || ''; return districtNumberA.localeCompare(districtNumberB, undefined, { numeric: true, sensitivity: 'base' }); }); } @@ -197,7 +197,15 @@ function addDistrictLabels(jsonData, districtList) { const schoolCodeB = b.mincode || ''; return schoolCodeA.localeCompare(schoolCodeB, undefined, { numeric: true, sensitivity: 'base' }); }); - } + } + + function sortByProperty(arr, propertyName, options = { numeric: true, sensitivity: 'base' }) { + return arr.slice().sort((a, b) => { + const valueA = a[propertyName] || ''; + const valueB = b[propertyName] || ''; + return valueA.localeCompare(valueB, undefined, options); + }); + } function rearrangeAndRelabelObjectProperties(object, propertyList) { const reorderedObject = {}; @@ -227,6 +235,30 @@ function addDistrictLabels(jsonData, districtList) { return item; }); } + function filterByField(jsonArray, fieldName, stringsToRemove) { + // Filter the array based on the condition + const filteredArray = jsonArray.filter(item => { + // Extract the field value (or use an empty string if the field is not present) + const fieldValue = item[fieldName] || ''; + + // Check if the fieldValue exactly matches any string from the stringsToRemove array + return !stringsToRemove.includes(fieldValue); + }); + + return filteredArray; + } + function getArrayofNonPubliclyAvailableCodes(codes, field) { + if (!Array.isArray(codes)) { + throw new Error('Invalid input. Expecting an array of objects.'); + } + + // Filter out objects where "publiclyAvailable" is false + const nonPubliclyAvailableCodes = codes + .filter(item => item && item.publiclyAvailable !== true) + .map(item => item[field]); + + return nonPubliclyAvailableCodes; + } function createSchoolCache(schoolData, schoolGrades) { // Preload convertedGrades with schoolGrades.schoolGradeCode and set the value to "N" @@ -314,44 +346,8 @@ function addDistrictLabels(jsonData, districtList) { // Remove the contacts property delete school.contacts; - const propertyOrder = [ - - { property: "displayName", label: "School Name" }, - { property: "mincode", label: "mincode" }, - { property: "districtNumber", label: "District Number" }, - { property: "districtName", label: "District Name" }, - - { property: "mailing_addressLine1", label: "Address" }, - { property: "mailing_city", label: "City" }, - { property: "mailing_provinceCode", label: "Province" }, - { property: "mailing_postal", label: "Postal Code" }, - // { property: "principalTitle", label: "Principal Title" }, - { property: "firstName", label: "Principal First Name" }, - { property: "lastName", label: "Principal Last Name" }, - { property: "schoolCategoryCode", label: "Type" }, - // { property: "gradeRange", label: "Grade Range" }, - // { property: "schoolCategory", label: "School Category" }, - // { property: "fundingGroups", label: "Funding Group(s)" }, - { property: "phoneNumber", label: "Phone" }, - { property: "faxNumber", label: "Fax" }, - { property: "email", label: "Email" }, - { property: "GRADE01", label: "Grade 1 Enrollment" }, - { property: "GRADE02", label: "Grade 2 Enrollment" }, - { property: "GRADE03", label: "Grade 3 Enrollment" }, - { property: "GRADE04", label: "Grade 4 Enrollment" }, - { property: "GRADE05", label: "Grade 5 Enrollment" }, - { property: "GRADE06", label: "Grade 6 Enrollment" }, - { property: "GRADE07", label: "Grade 7 Enrollment" }, - { property: "GRADE08", label: "Grade 8 Enrollment" }, - { property: "GRADE09", label: "Grade 9 Enrollment" }, - { property: "GRADE10", label: "Grade 10 Enrollment" }, - { property: "GRADE11", label: "Grade 11 Enrollment" }, - { property: "GRADE12", label: "Grade 12 Enrollment" } - - - ]; - const schools = rearrangeAndRelabelObjectProperties(school,propertyOrder) - return schools; + + return school; }); } - module.exports = {appendMailingAddressDetailsAndRemoveAddresses,sortJSONBySchoolCode,sortJSONByDistrictNumber,normalizeJsonObject, removeFieldsByCriteria, createList, isSafeFilePath,isAllowedSchoolCategory, addDistrictLabels, districtNumberSort, createSchoolCache, formatGrades, rearrangeAndRelabelObjectProperties}; \ No newline at end of file + module.exports = {sortByProperty,getArrayofNonPubliclyAvailableCodes,filterByField,appendMailingAddressDetailsAndRemoveAddresses,sortJSONBySchoolCode,sortJSONByDistrictNumber,normalizeJsonObject, removeFieldsByCriteria, createList, isSafeFilePath,isAllowedSchoolCategory, addDistrictLabels, districtNumberSort, createSchoolCache, formatGrades, rearrangeAndRelabelObjectProperties}; \ No newline at end of file diff --git a/backend/src/routes/authority-router.js b/backend/src/routes/authority-router.js index 073995ee..fab626db 100644 --- a/backend/src/routes/authority-router.js +++ b/backend/src/routes/authority-router.js @@ -8,7 +8,7 @@ const fs = require("fs"); const path = require("path"); const { checkToken } = require("../components/auth"); const { listCache } = require("../components/cache"); -const {appendMailingAddressDetailsAndRemoveAddresses, rearrangeAndRelabelObjectProperties} = require("../components/utils.js") +const {appendMailingAddressDetailsAndRemoveAddresses, rearrangeAndRelabelObjectProperties, sortByProperty} = require("../components/utils.js") //Batch Routes router.get("/all-mailing/:type", checkToken, getAllAuthorityMailing); router.get("/:id", checkToken, getAuthority); @@ -32,6 +32,7 @@ router.get("/:id", checkToken, getAuthority); // } async function getAllAuthorityMailing(req, res) { + //type = OFFSHORE or INDEPENDNT const {type} = req.params const params = [ @@ -66,11 +67,11 @@ async function getAllAuthorityMailing(req, res) { const propertyOrder = [ { property: "authorityNumber", label: "Number" }, { property: "displayName", label: "Name" }, - { property: "physicalAddressLine1", label: "Address" }, - { property: "physicalAddressLine2", label: "Address Line 2" }, - { property: "physicalCity", label: "City" }, - { property: "physicalProvinceCode", label: "Province" }, - { property: "physicalPostal", label: "Postal Code" }, + { property: "mailingAddressLine1", label: "Address" }, + { property: "mailingAddressLine2", label: "Address Line 2" }, + { property: "mailingCity", label: "City" }, + { property: "mailingProvinceCode", label: "Province" }, + { property: "mailingPostal", label: "Postal Code" }, { property: "phoneNumber", label: "Phone Number" }, { property: "faxNumber", label: "Fax" }, { property: "email", label: "Email" }, @@ -78,17 +79,14 @@ async function getAllAuthorityMailing(req, res) { ]; authorityResponse.data.content.forEach(appendMailingAddressDetailsAndRemoveAddresses); - // const includedFields = ['createUser', 'updateUser', 'districtContactTypeCode', 'label', 'description']; - // let content = normalizeJsonObject(districtContactResponse.data.content, contactTypeCodes.codesList.districtContactTypeCodes, 'districtContactTypeCode', (info) => info.publiclyAvailable === true, includedFields); - // content = normalizeJsonObject(content, districtList, 'districtId', null, ['displayName', 'districtNumber']); - // content = sortJSONByDistrictNumber(content) - authorityResponse.data.content.forEach((currentElement, index, array) => { + + authorityResponse.data.content.forEach((currentElement, index, array) => { const rearrangedElement = rearrangeAndRelabelObjectProperties(currentElement, propertyOrder); array[index] = rearrangedElement; }); - + const authorityResponseSorted = sortByProperty(authorityResponse.data.content, 'Number') - res.json(authorityResponse.data.content); + res.json(authorityResponseSorted); //res.json(districtContactsReorderedAndRelabeled ); } catch (e) { log.error("getData Error", e.response ? e.response.status : e.message); diff --git a/backend/src/routes/district-router.js b/backend/src/routes/district-router.js index d088b3e5..bae6e3b4 100644 --- a/backend/src/routes/district-router.js +++ b/backend/src/routes/district-router.js @@ -8,7 +8,7 @@ const fs = require("fs"); const path = require("path"); const { checkToken } = require("../components/auth"); const { listCache } = require("../components/cache"); -const {appendMailingAddressDetailsAndRemoveAddresses, rearrangeAndRelabelObjectProperties, addDistrictLabels, normalizeJsonObject, sortJSONByDistrictNumber} = require("../components/utils.js") +const {getArrayofNonPubliclyAvailableCodes, filterByField,appendMailingAddressDetailsAndRemoveAddresses, rearrangeAndRelabelObjectProperties, addDistrictLabels, normalizeJsonObject, sortJSONByDistrictNumber} = require("../components/utils.js") //Batch Routes router.get("/all-contacts", checkToken, getAllDistrictContacts); @@ -133,13 +133,20 @@ async function getAllDistrictContacts(req, res) { const includedFields = ['createUser', 'updateUser', 'districtContactTypeCode', 'label', 'description']; let content = normalizeJsonObject(districtContactResponse.data.content, contactTypeCodes.codesList.districtContactTypeCodes, 'districtContactTypeCode', (info) => info.publiclyAvailable === true, includedFields); - content = normalizeJsonObject(content, districtList, 'districtId', null, ['displayName', 'districtNumber']); - content = sortJSONByDistrictNumber(content) - content.forEach((currentElement, index, array) => { + content = normalizeJsonObject(content, districtList, 'districtId', null, ['displayName', 'districtNumber']); + //console.log(contactTypeCodes.codesList.districtContactTypeCodes) + //console.log(getArrayofNonPubliclyAvailableCodes(contactTypeCodes.codesList.districtContactTypeCodes, "districtContactTypeCode")) + //let filteredData = filterByField(content, 'districtContactTypeCode', getArrayofNonPubliclyAvailableCodes(contactTypeCodes.codesList.districtContactTypeCodes, "districtContactTypeCode")); + let filteredData = filterByField(content, 'districtNumber', ['']); + filteredData.forEach((currentElement, index, array) => { const rearrangedElement = rearrangeAndRelabelObjectProperties(currentElement, propertyOrder); array[index] = rearrangedElement; }); - res.json(content); + let sortedData = sortJSONByDistrictNumber(filteredData) + + + + res.json(sortedData); //res.json(districtContactsReorderedAndRelabeled ); } catch (e) { log.error("getData Error", e.response ? e.response.status : e.message); @@ -230,6 +237,13 @@ async function getDistrict(req, res) { valueType: "UUID", condition: "AND", }, + { + key: "closedDate", + operation: "eq", + value: null, + valueType: "STRING", + condition: "AND", + }, ], }, ]; diff --git a/backend/src/routes/school-router.js b/backend/src/routes/school-router.js index dba841a1..8f7e4df2 100644 --- a/backend/src/routes/school-router.js +++ b/backend/src/routes/school-router.js @@ -4,13 +4,13 @@ const log = require("../components/logger"); const config = require("../config/index"); const axios = require("axios"); -const { createSchoolCache, addDistrictLabels, formatGrades, sortJSONBySchoolCode} = require("../components/utils"); +const { createSchoolCache, addDistrictLabels, formatGrades, sortJSONBySchoolCode, rearrangeAndRelabelObjectProperties} = require("../components/utils"); const { checkToken } = require("../components/auth"); const { schoolCache, listCache, codeCache } = require("../components/cache"); //Batch Routes +router.get("/all/mailing", checkToken, getAllSchoolMailing); router.get("/all/:schoolCategory", checkToken, getAllSchools); -router.get("/all-mailing", checkToken, getAllSchools); router.get("/:schoolId", checkToken, getSchool); async function getSchool(req, res) { @@ -36,7 +36,12 @@ async function getSchool(req, res) { }); } +async function getAllSchoolMailing(req, res) { + const allSchools = await getAllSchools(req,res) + console.log(allSchools) + res.json(allSchools) +} async function getAllSchools(req, res) { const {schoolCategory} = req.params @@ -96,6 +101,48 @@ async function getAllSchools(req, res) { const openSchoolListWithDistrictLabels = addDistrictLabels(response.data, districtList) const openSchoolList = sortJSONBySchoolCode(createSchoolCache(openSchoolListWithDistrictLabels.content, schoolGrades)); + const propertyOrder = [ + + { property: "displayName", label: "School Name" }, + { property: "mincode", label: "School Code" }, + { property: "districtName", label: "District Name" }, + { property: "districtNumber", label: "District Number" }, + + { property: "mailing_addressLine1", label: "Address" }, + { property: "mailing_city", label: "City" }, + { property: "mailing_provinceCode", label: "Province" }, + { property: "mailing_postal", label: "Postal Code" }, + // { property: "principalTitle", label: "Principal Title" }, + { property: "firstName", label: "Principal First Name" }, + { property: "lastName", label: "Principal Last Name" }, + { property: "schoolCategoryCode", label: "School Category" }, + // { property: "gradeRange", label: "Grade Range" }, + // { property: "fundingGroups", label: "Funding Group(s)" }, + { property: "phoneNumber", label: "Phone" }, + { property: "faxNumber", label: "Fax" }, + { property: "email", label: "Email" }, + { property: "KINDHALF", label: "Kindergarten Half Enrollment" }, + { property: "KINDFULL", label: "Kindergarten Full Enrollment" }, + { property: "GRADE01", label: "Grade 1 Enrollment" }, + { property: "GRADE02", label: "Grade 2 Enrollment" }, + { property: "GRADE03", label: "Grade 3 Enrollment" }, + { property: "GRADE04", label: "Grade 4 Enrollment" }, + { property: "GRADE05", label: "Grade 5 Enrollment" }, + { property: "GRADE06", label: "Grade 6 Enrollment" }, + { property: "GRADE07", label: "Grade 7 Enrollment" }, + { property: "GRADE08", label: "Grade 8 Enrollment" }, + { property: "GRADE09", label: "Grade 9 Enrollment" }, + { property: "GRADE10", label: "Grade 10 Enrollment" }, + { property: "GRADE11", label: "Grade 11 Enrollment" }, + { property: "GRADE12", label: "Grade 12 Enrollment" } + + + ]; + + openSchoolList.forEach((currentElement, index, array) => { + const rearrangedElement = rearrangeAndRelabelObjectProperties(currentElement, propertyOrder); + array[index] = rearrangedElement; + }); res.json(openSchoolList); schoolCache.set("openschoollist" + schoolCategory, openSchoolList); log.info(req.url); diff --git a/frontend/src/components/AuthoritySelect.vue b/frontend/src/components/AuthoritySelect.vue index 48a12849..747f11dd 100644 --- a/frontend/src/components/AuthoritySelect.vue +++ b/frontend/src/components/AuthoritySelect.vue @@ -57,16 +57,8 @@ function downloadAuthorityContacts() { href="/api/v1/download/csv/authority/all-mailing/INDEPENDNT?filepath=authoritymailing" variant="text" class="v-btn-align-left text-none text-subtitle-1 my-1" - > Mailing for All - Authorities (CSV) - - - Contacts for All Authorities (CSV) Contact + information for all Authorities (CSV) diff --git a/frontend/src/components/ContactTypeModel.vue b/frontend/src/components/ContactTypeModel.vue index 9de86534..0db38601 100644 --- a/frontend/src/components/ContactTypeModel.vue +++ b/frontend/src/components/ContactTypeModel.vue @@ -123,7 +123,7 @@ const searchContact = async () => { - TOTAL: {{ results }} + Total: {{ results }}