Compare commits

..

No commits in common. 'master' and 'build-validation' have entirely different histories.

@ -10,12 +10,10 @@ let tsSource = ts.createProject('tsconfig.json')
function clean(cb) {
del(['build/*']);
del(['out/*']);
cb();
}
function validateConfigSources(cb) {
console.log("Validating source json files...");
let confBase = "src/assets/conf/";
let configsToCheck = ["resources-landing-page.json"];
for (let i = 0, l = configsToCheck.length; i < l; i++) {
@ -23,11 +21,10 @@ function validateConfigSources(cb) {
let configContent = fs.readFileSync(path.join(confBase, currConfig));
let conf = JSON.parse(configContent.toString());
let keys = Object.keys(conf);
let fileSpecificRules = validationRules[currConfig];
for (let j = 0, m = keys.length; j < m; j++) {
let key = keys[i];
let content = conf[key];
let rules = fileSpecificRules[key];
let rules = resourceLandingPageRules[key];
let ruleKeys = Object.keys(rules);
for (let k = 0, n = ruleKeys.length; k < n; k++) {
let rule = ruleKeys[k];
@ -46,10 +43,6 @@ function validateConfigSources(cb) {
cb();
}
let deploy = () => {
};
function conf() {
return src(['src/assets/**/*', '!src/assets/**/*.scss'], {base: 'src/assets'})
.pipe(dest('build/assets/'));
@ -69,11 +62,6 @@ function scss() {
.pipe(dest('build/assets/pages/styles/'));
}
function tests() {
return src('tests/*',)
.pipe(dest('build/tests/'));
}
function root() {
return src('src/*.js')
.pipe(dest('build/'));
@ -105,17 +93,15 @@ function dependencies(cb) {
let stringLengthRule = function (str, fileName, rulename) {
let maxLen = 124;
let maxLen = 125;
if (str.length > maxLen) {
return Error(`Content too long in ${fileName}:${rulename}! Expected maximum of ${maxLen} characters, got ${str.length} "${str}"`)
return Error(`Content too long in ${fileName}->${rulename}! Expected ${maxLen} characters, got ${str.length} "${str}"`)
}
}
let validationRules = {
"resources-landing-page.json": {
"grid-container": {
"description": stringLengthRule
}
let resourceLandingPageRules = {
"grid-container": {
"description": stringLengthRule
}
}
@ -124,8 +110,4 @@ exports.clean = clean;
exports.default = series(validateConfigSources, conf, style, scss, root, pkg, typescript, dependencies);
exports.tests = series(validateConfigSources, conf, style, scss, root, pkg, typescript, dependencies, tests);
exports.runFast = series(validateConfigSources, conf, style, scss, root, pkg)
exports.deploy = series(clean, validateConfigSources, conf, style, scss, root, pkg, typescript, dependencies, deploy);
exports.runFast = series(validateConfigSources, conf, style, scss, root, pkg)

46
package-lock.json generated

@ -871,9 +871,9 @@
}
},
"base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
"integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
"dev": true
},
"bcrypt-pbkdf": {
@ -3540,9 +3540,9 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ini": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz",
"integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==",
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true
},
"interpret": {
@ -4879,9 +4879,9 @@
}
},
"y18n": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
"dev": true
},
"yargs": {
@ -5394,9 +5394,9 @@
}
},
"y18n": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
"dev": true
},
"yargs": {
@ -5864,14 +5864,14 @@
}
},
"plist": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz",
"integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==",
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz",
"integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==",
"dev": true,
"requires": {
"base64-js": "^1.5.1",
"base64-js": "^1.2.3",
"xmlbuilder": "^9.0.7",
"xmldom": "^0.5.0"
"xmldom": "0.1.x"
}
},
"plugin-error": {
@ -6461,9 +6461,9 @@
}
},
"y18n": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
"dev": true
},
"yargs": {
@ -7690,9 +7690,9 @@
"dev": true
},
"xmldom": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz",
"integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==",
"version": "0.1.31",
"resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz",
"integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==",
"dev": true
},
"xtend": {

@ -16,10 +16,10 @@
"start-fast": "gulp runFast && electron ./build --debug",
"dev": "npm run build && electron ./build --debug",
"package": "npm-run-all package:*",
"package:mac": "electron-packager ./build --overwrite --platform=darwin --arch=x64 --out=out --icon=src/assets/images/icon.ico --osx-sign.identity='Developer ID Application: GitHub' --extend-info=assets/mac/info.plist",
"package:win32": "electron-packager ./build --overwrite --platform=win32 --arch=ia32 --out=out --icon=src/assets/images/icon.ico",
"package:win64": "electron-packager ./build --overwrite --platform=win32 --arch=x64 --out=out --icon=src/assets/images/icon.ico",
"package:linux": "electron-packager ./build --overwrite --platform=linux --arch=x64 --out=out --icon=src/assets/images/icon.ico",
"package:mac": "electron-packager ./build --overwrite --platform=darwin --arch=x64 --out=out --icon=assets/images/app.icns --osx-sign.identity='Developer ID Application: GitHub' --extend-info=assets/mac/info.plist",
"package:win32": "electron-packager ./build --overwrite --platform=win32 --arch=ia32 --out=out --icon=assets/images/app.ico",
"package:win64": "electron-packager ./build --overwrite --platform=win32 --arch=x64 --out=out --icon=assets/images/app.ico",
"package:linux": "electron-packager ./build --overwrite --platform=linux --arch=x64 --out=out",
"package:installer": "node ./script/installer.js",
"release": "node ./script/release.js",
"prepack": "check-for-leaks",
@ -56,7 +56,6 @@
"gulp-typescript": "^6.0.0-alpha.1",
"gulp-exec": "^5.0.0",
"del": "^6.0.0",
"mocha": "^8.2.1",
"electron-mocha": "^9.3.1",
"chai": "^4.2.0",
"nyc": "^15.1.0",

@ -1,6 +1,3 @@
{
".pdf": "pdf-icon-100x100.png",
".eps": "image-eps-icon.png",
".png": "image-png-icon.png",
".docx": "word-icon-100x100.png"
".pdf": "pdf-icon.svg"
}

@ -1,228 +1,25 @@
{
"grid-container": {
"Human Resources": {
"description": "Policies, recruitment, onboarding, benefits and compensation",
"cards": [
{
"title": "Paycor",
"description": "Track your time off, manage your benefits plans, and access pay stubs using this human-resources application.",
"imagePath": "paycor-logo3-100x100.png",
"urlText": "https://hcm.paycor.com/authentication/signin",
"altText": "Paycor logo",
"keywords": "human resources, benefits, vacation, sick, bereavement, health, insurance, enrollment"
},
{
"title": "NC-4EZ Form",
"description": "Submit this form to HR so that the correct amount of state income tax can be witheld from your paychecks.",
"imagePath": "tax-icon-100x100.png",
"urlText": "https://files.nc.gov/ncdor/documents/files/NC-4EZ.pdf",
"altText": "tax icon",
"keywords": "human resources, taxes"
},
{
"title": "W-4 Form",
"description": "Fill out this form and submit to HR so that the company can withhold the correct federal income tax from your pay.",
"imagePath": "tax-icon-100x100.png",
"urlText": "https://www.irs.gov/pub/irs-pdf/fw4.pdf",
"altText": "tax icon",
"keywords": "human resources, taxes"
},
{
"title": "Employment Application",
"description": "Would you or someone you know like to apply for a position? JDS Consulting is always accepting applications.",
"imagePath":"word-icon-100x100.png",
"urlText": "https://docs.google.com/forms/d/e/1FAIpQLSdMwcVjS3SSqFhypnmgkbH_DVg_TMhB7VYYYyN0dwypshuVLw/viewform",
"altText": "Document icon",
"keywords": "human resources, career, job"
}
]
"grid-container": [
{
"title": "Paycor",
"description": "Clock in and out, request time off, review health benefits and access paystubs using the Paycor human-resources application.",
"imagePath": "PaycorLogo2-Transparent_100x100.png",
"urlText": "https://www.paycor.com/",
"altText": ""
},
"Marketing": {
"description": "Client-facing media, publications, public relations and advertising",
"cards": [
{
"title": "JDSConsulting.net",
"description": "Our website conveys the company's value to visitors and convinces them to take action by contacting JDS Consulting.",
"imagePath": "jds-favicon-logo_100x100.png",
"urlText": "https://jdsconsulting.net/",
"altText": "JDS Consulting brand mark",
"keywords": "marketing"
},
{
"title": "Salesforce",
"description": "Focus on the customer experience with the help of the Salesforce customer relationship management application.",
"imagePath": "salesforce-logo-100x100.png",
"urlText": "https://login.salesforce.com/",
"altText": "Salesforce logo",
"keywords": "marketing"
},
{
"title": "Facebook",
"description": "Through Facebook, the company connects with the community by sharing content and interacting with the public.",
"imagePath": "facebooklogogrey_100x100.png",
"urlText": "https://www.facebook.com/JDSconsultingPLLC/",
"altText": "Facebook icon",
"keywords": "marketing, social"
},
{
"title": "LinkedIn",
"description": "JDS Consulting maintains a presence on LinkedIn for professional networking, posting job openings and receiving resumes.",
"imagePath": "linkedinlogo_100x100.png",
"urlText": "https://www.linkedin.com/company/jdsconsultingpllc",
"altText": "LinkedIn icon",
"keywords": "marketing, social"
}
]
{
"title": "Gmail",
"description": "Access your company e-mail and a suite of Google apps, including a calendar, instant messaging and cloud storage.",
"imagePath": "Gmail-Transparent_100x100.png",
"urlText": "https://mail.google.com",
"altText": ""
},
"Productivity": {
"description": "Basic files and applications that employees use as tools or references to do their jobs",
"cards": [
{
"title": "Gmail",
"description": "Access your company e-mail along with a suite of Google apps, including a calendar, instant messaging and cloud storage.",
"imagePath": "gmail-logo2-100x100.png",
"urlText": "https://mail.google.com",
"altText": "Gmail logo",
"keywords": "productivity"
},
{
"title": "Workplace",
"description": "Get the latest news and connect with colleagues. JDS Consulting uses Workplace by Facebook for posting and sharing.",
"imagePath": "workplace-logo3-100x100.png",
"urlText": "https://jdsconsulting.workplace.com",
"altText": "Workplace logo",
"keywords": "productivity, social"
},
{
"title": "Google Workspace",
"description": "This suite of Google products includes Gmail, Calendar, Meet, Chat, Drive, Docs, Sheets, Slides, Forms and more.",
"imagePath": "google-logo2-100x100.png",
"urlText": "https://myaccount.google.com/",
"altText": "Google Workspace logo",
"keywords": "productivity, e-mail"
},
{"title": "Employee Directory",
"description": "Connect with other employees easily. This directory lists phone numbers and e-mail addresses.",
"imagePath": "word-icon-100x100.png",
"urlText": "https://docs.google.com/spreadsheets/d/1HSZ63Pw_r5ioFJUvJaEsBP4IO5Q_fs3TB_1FILZbn28/edit?usp=sharing",
"altText": "Document icon",
"keywords": "contact"
},
{
"title": "Client W-9 Form",
"description": "Clients need to fill out and return a W-9. Only authorized employees can access this form.",
"imagePath": "tax-icon-100x100.png",
"urlText": "https://drive.google.com/file/d/1frDN_hmo-GG2GIkTlPa8Dp7MBHfdXt83/view?usp=sharing",
"altText": "tax icon",
"keywords": "workflow, tax, taxes, account"
},
{
"title": "Management Forms",
"description": "Restricted access to departmental purchase requests, survey results, and hiring and procurement forms.",
"imagePath": "word-icon-100x100.png",
"urlText": "https://drive.google.com/drive/folders/1MN9Gr6HGMX6dc9Rjmu-Z7N514q_bjrvK?usp=sharing",
"altText": "Document icon",
"keywords": "counseling, requisition"
},
{
"title": "Field Forms",
"description": "Restricted access to templates and forms used for on-site data collection, lab sheets and project proposals.",
"imagePath": "word-icon-100x100.png",
"urlText": "https://drive.google.com/folderview?id=1O_dQpNp5qfGhOf6DvIOcZPz1oPckYSF-",
"altText": "Document icon",
"keywords": "PDS, sheet, scope of work, control fill, setup, set up, fee schedule, failure, approval, sketch, engagement"
},
{
"title": "Codes and Standards",
"description": "Various legal codes as well as standards developed by membership organizations are available here. Password: learningcenter",
"imagePath": "learning-center-icon4-100x100.png",
"urlText": "https://learning.carolina.engineering/additional-resources/",
"altText": "Learning Center icon",
"keywords": "ACI, ASCE, cement, concrete, PCA, residential, SRW, segmental"
},
{
"title": "Field Guide",
"description": "This quick-reference guide helps engineering technicians find frequently used charts, tables and values. Password: learningcenter",
"imagePath": "learning-center-icon4-100x100.png",
"urlText": "https://learning.carolina.engineering/additional-resources/",
"altText": "Learning Center icon",
"keywords": "training"
}
]
},
"Training": {
"description": "Career growth, skills development, online courses and manuals",
"cards": [
{
"title": "Learning Center",
"description": "Visit your central location for e-learning, offering the flexibility to learn on your own schedule and at your own pace. Password: learningcenter",
"imagePath": "learning-center-icon4-100x100.png",
"urlText": "https://learning.carolina.engineering/",
"altText": "Learning Center icon",
"keywords": "training, courses"
},
{
"title": "Company Procedures",
"description": "Find out how to carry out specific tasks at JDS Consulting with consistency using the company's best practices. Password: learningcenter",
"imagePath": "learning-center-icon4-100x100.png",
"urlText": "https://learning.carolina.engineering/additional-resources/",
"altText": "Learning Center icon",
"keywords": "SOP, standard operating procedure, training, instructions"
},
{
"title": "CAD Tech Study Guide",
"description": "This guide presents lessons for drafters, each of which can help a drafter advance to CAD Tech II status. Password: learningcenter",
"imagePath": "learning-center-icon4-100x100.png",
"urlText": "https://learning.carolina.engineering/additional-resources/",
"altText": "Learning Center icon",
"keywords": "training, modules, drafting, design"
},
{
"title": "Deltek Learning Zone",
"description": "Increase your Deltek knowledge with courses designed to teach you how to use Deltek solutions.",
"imagePath": "deltek-logo-black.png",
"urlText": "https://jdsfaulkner.dlz.deltek.com/hr/dlz/LearningSearch/index",
"altText": "Deltek logo",
"keywords": "training"
}
]
},
"Workflow": {
"description": "Robust applications for streamlining project management throughout the lifecycle",
"cards": [
{
"title": "Clarity",
"description": "Create, track, review and bill field-engineering projects, start to finish, with Clarity project management software.",
"imagePath": "clarity-icon-100x100.png",
"urlText": "https://learning.carolina.engineering/introduction-to-clarity/",
"altText": "Clarity image",
"keywords": "workflow, applications, account"
},
{
"title": "Project Insight",
"description": "Structural Engineering Design uses this project management software to centralize the group's work, tasks and projects.",
"imagePath": "project-insight-logo6-100x100.png",
"urlText": "https://jds.projectinsight.net/",
"altText": "Project Insight logo",
"keywords": "workflow, applications, CAD, draft, plans, account, track"
},
{
"title": "Deltek",
"description": "Project intelligence, management and collaboration software helps maximize productivity and revenue.",
"imagePath": "deltek-logo-black.png",
"urlText": "https://jdsfaulkner.deltekfirst.com/JDSfaulkner/app/",
"altText": "Deltek logo",
"keywords": "workflow, applications, account, track"
},
{
"title": "Procore",
"description": "Administrators for field engineering projects use Procore for collecting, reviewing and approving invoices.",
"imagePath": "ProcoreLogo2.png",
"urlText": "https://www.procore.com/",
"altText": "Procore logo",
"keywords": "workflow, applications, software, account"
}
]
{
"title": "Workplace",
"description": "Get the latest news and connect with colleagues. JDSfaulkner uses Workplace by Facebook for posting and sharing.",
"imagePath": "WorkplaceLogo-Transparent_100x100.png",
"urlText": "https://jdsfaulkner.workplace.com",
"altText": ""
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

@ -1 +0,0 @@
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-chevron-down" fill="#9d9d9d" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/></svg>

Before

Width:  |  Height:  |  Size: 283 B

@ -1 +0,0 @@
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-chevron-down" fill="#080404" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/></svg>

Before

Width:  |  Height:  |  Size: 283 B

@ -1 +0,0 @@
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-chevron-up" fill="#787572" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7.646 4.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1-.708.708L8 5.707l-5.646 5.647a.5.5 0 0 1-.708-.708l6-6z"/></svg>

Before

Width:  |  Height:  |  Size: 264 B

@ -1 +0,0 @@
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-chevron-up" fill="#3f4959" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M7.646 4.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1-.708.708L8 5.707l-5.646 5.647a.5.5 0 0 1-.708-.708l6-6z"/></svg>

Before

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

@ -0,0 +1,228 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="styles/bootstrap.css">
<!-- Custom CSS -->
<link rel="stylesheet" href="styles/Design1.css">
<title>Resources</title>
</head>
<body>
<header>
<div class="collapse bg-dark" id="navbarHeader">
<div class="container">
<div class="row">
<div class="col-sm-8 col-md-7 py-4">
<h4 class="text-white">About</h4>
<p class="text-muted">Add some information about the album below, the author, or any other background context. Make it a few sentences long so folks can pick up some informative tidbits. Then, link them off to some social networking sites or contact information.</p>
</div>
<div class="col-sm-4 offset-md-1 py-4">
<h4 class="text-white">Contact</h4>
<ul class="list-unstyled">
<li><a href="#" class="text-white">Follow on Twitter</a></li>
<li><a href="#" class="text-white">Like on Facebook</a></li>
<li><a href="#" class="text-white">Email me</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="navbar navbar-dark bg-dark shadow-sm">
<div class="container d-flex justify-content-between">
<a href="#" class="navbar-brand d-flex align-items-center">
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-book" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M1 2.828v9.923c.918-.35 2.107-.692 3.287-.81 1.094-.111 2.278-.039 3.213.492V2.687c-.654-.689-1.782-.886-3.112-.752-1.234.124-2.503.523-3.388.893zm7.5-.141v9.746c.935-.53 2.12-.603 3.213-.493 1.18.12 2.37.461 3.287.811V2.828c-.885-.37-2.154-.769-3.388-.893-1.33-.134-2.458.063-3.112.752zM8 1.783C7.015.936 5.587.81 4.287.94c-1.514.153-3.042.672-3.994 1.105A.5.5 0 0 0 0 2.5v11a.5.5 0 0 0 .707.455c.882-.4 2.303-.881 3.68-1.02 1.409-.142 2.59.087 3.223.877a.5.5 0 0 0 .78 0c.633-.79 1.814-1.019 3.222-.877 1.378.139 2.8.62 3.681 1.02A.5.5 0 0 0 16 13.5v-11a.5.5 0 0 0-.293-.455c-.952-.433-2.48-.952-3.994-1.105C10.413.809 8.985.936 8 1.783z"/>
</svg>
&nbsp;
<strong>Resources</strong>
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarHeader" aria-controls="navbarHeader" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</div>
</header>
<main role="main">
<section class="jumbotron text-center">
<div class="container">
<h1>Resources</h1>
<p class="font-weight-normal" style="font-size: 17px">Whether you're looking for a folder, document, tool, website or application, you can find it here.</p>
<div>
<a href="#" class="btn btn-primary my-2">Learn more</a>
<a href="#" class="btn btn-secondary my-2">Send feedback</a>
</div>
</div>
</section>
<div class="album py-5 bg-light">
<div class="container">
<div class="row">
<div class="col-md-4">
<div class="card mb-4 shadow-sm">
<img class="card-img-top" src="../images/InterfaceImagine_356x280.png" alt="Computer screen">
<div class="card-body">
<p class="card-text">Would you like to view a design that looks more like an application than a web page? Check out this <a href="Alternative1.html">alternative layout</a>.</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
<small class="text-muted">9 mins</small>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4 shadow-sm">
<img class="card-img-top" src="../images/Email-b_356x280.png" alt="Email image">
<div class="card-body">
<p class="card-text">Open your company e-mail application. Your Gmail account offers e-mail, a calendar and instant messaging.</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
<small class="text-muted">9 mins</small>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4 shadow-sm">
<img class="card-img-top" src="../images/SocialMedia_356x280.png" alt="Social media image">
<div class="card-body">
<p class="card-text">Get the latest company news and connect with your colleagues. JDSfaulkner uses Workplace by Facebook for sharing information.</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
<small class="text-muted">9 mins</small>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4 shadow-sm">
<svg class="bd-placeholder-img card-img-top" width="100%" height="225" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice" focusable="false" role="img" aria-label="Placeholder: Thumbnail"><title>Placeholder</title><rect width="100%" height="100%" fill="#55595c"/><text x="50%" y="50%" fill="#eceeef" dy=".3em">Thumbnail</text></svg>
<div class="card-body">
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
<small class="text-muted">9 mins</small>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4 shadow-sm">
<svg class="bd-placeholder-img card-img-top" width="100%" height="225" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice" focusable="false" role="img" aria-label="Placeholder: Thumbnail"><title>Placeholder</title><rect width="100%" height="100%" fill="#55595c"/><text x="50%" y="50%" fill="#eceeef" dy=".3em">Thumbnail</text></svg>
<div class="card-body">
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
<small class="text-muted">9 mins</small>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4 shadow-sm">
<svg class="bd-placeholder-img card-img-top" width="100%" height="225" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice" focusable="false" role="img" aria-label="Placeholder: Thumbnail"><title>Placeholder</title><rect width="100%" height="100%" fill="#55595c"/><text x="50%" y="50%" fill="#eceeef" dy=".3em">Thumbnail</text></svg>
<div class="card-body">
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
<small class="text-muted">9 mins</small>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4 shadow-sm">
<svg class="bd-placeholder-img card-img-top" width="100%" height="225" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice" focusable="false" role="img" aria-label="Placeholder: Thumbnail"><title>Placeholder</title><rect width="100%" height="100%" fill="#55595c"/><text x="50%" y="50%" fill="#eceeef" dy=".3em">Thumbnail</text></svg>
<div class="card-body">
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
<small class="text-muted">9 mins</small>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4 shadow-sm">
<svg class="bd-placeholder-img card-img-top" width="100%" height="225" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice" focusable="false" role="img" aria-label="Placeholder: Thumbnail"><title>Placeholder</title><rect width="100%" height="100%" fill="#55595c"/><text x="50%" y="50%" fill="#eceeef" dy=".3em">Thumbnail</text></svg>
<div class="card-body">
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
<small class="text-muted">9 mins</small>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4 shadow-sm">
<svg class="bd-placeholder-img card-img-top" width="100%" height="225" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice" focusable="false" role="img" aria-label="Placeholder: Thumbnail"><title>Placeholder</title><rect width="100%" height="100%" fill="#55595c"/><text x="50%" y="50%" fill="#eceeef" dy=".3em">Thumbnail</text></svg>
<div class="card-body">
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-secondary">View</button>
<button type="button" class="btn btn-sm btn-outline-secondary">Edit</button>
</div>
<small class="text-muted">9 mins</small>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<footer class="text-muted">
<div class="container">
<p class="float-right">
<a href="#">Back to top</a>
</p>
<!-- <p>Album example is &copy; Bootstrap, but please download and customize it for yourself!</p>-->
<!-- <p>New to Bootstrap? <a href="https://getbootstrap.com/">Visit the homepage</a> or read our <a href="/docs/4.5/getting-started/introduction/">getting started guide</a>.</p>-->
</div>
</footer>
<!-- Option 2: jQuery, Popper.js, and Bootstrap JS
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js" integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s" crossorigin="anonymous"></script>
-->
</body>
</html>

@ -0,0 +1,157 @@
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="styles/theme3.css">
<link rel="stylesheet" href="styles/Design3.css">
<title>ResourceFinder</title>
</head>
<body>
<header>
<div class="collapse bg-dark" id="navbarHeader">
<div class="container">
<div class="row">
<div class="col-sm-8 col-md-7 py-4">
<p class="text-muted">It's easy to find the resource you need with ResourceFinder. Enter your search term and view related resources. To access the resource, click "Go."</p>
</div>
<div class="col-sm-4 offset-md-1 py-4">
<ul class="list-unstyled">
<li><a href="#" class="text-white">Help</a></li>
<li><a href="#" class="text-white">Feedback</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="navbar navbar-dark bg-dark shadow-sm">
<div class="container d-flex justify-content-between">
<a href="#" class="navbar-brand d-flex align-items-center">
<svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-search" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M10.442 10.442a1 1 0 0 1 1.415 0l3.85 3.85a1 1 0 0 1-1.414 1.415l-3.85-3.85a1 1 0 0 1 0-1.415z"/>
<path fill-rule="evenodd" d="M6.5 12a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zM13 6.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0z"/>
</svg>
&nbsp;
<strong>ResourceFinder</strong>
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarHeader" aria-controls="navbarHeader" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</div>
</header>
<main role="main">
<section class="jumbotron text-center">
<div class="container">
<h1>Resources</h1>
<p class="font-weight-normal" style="font-size: 17px">What kind of resource are you looking for?</p>
<div>
<input class="form-control form-control-dark w-100 bg-secondary border-0" placeholder="Search" aria-label="Search">
</div>
</div>
</section>
<div class="album py-5">
<div class="container bg-white">
<div class="row">
<div class="col-md-4">
<div class="card mb-4 shadow-sm bg-secondary">
<div class="card-body">
<h5 class="card-text text-primary" style="text-align:center">Paycor</h5>
<p class="card-text text-primary">Clock in and out, request time off, review health benefits and access paystubs using the Paycor human-resources application.
</p>
<div class="d-flex justify-content-between align-items-center">
<img class="rounded-circle mx-auto d-block img-fluid" src="../images/PaycorLogo2-Circle_100x100.png" alt="Paycor logo" style="max-height:50px">
</div>
<hr width="95%" align="center" color="#A79D9D">
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-outline-primary">Go</button>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4 shadow-sm bg-secondary">
<div class="card-body">
<h5 class="card-text text-primary" style="text-align:center">Gmail</h5>
<p class="card-text text-primary">Access your company e-mail and a suite of Google apps, including a calendar, instant messaging and cloud storage.
</p>
<div class="d-flex justify-content-between align-items-center">
<img class="rounded-circle mx-auto d-block img-fluid" src="../images/GmailCircle_100x100.png" alt="Gmail logo" style="max-height:50px">
</div>
<hr width="95%" align="center" color="#A79D9D">
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-outline-primary">Go</button>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card mb-4 shadow-sm bg-secondary">
<div class="card-body">
<h5 class="card-text text-primary" style="text-align:center">Workplace</h5>
<p class="card-text text-primary">Get the latest news and connect with colleagues. JDSfaulkner uses Workplace by Facebook for posting and sharing.
</p>
<div class="d-flex justify-content-between align-items-center">
<img class="rounded-circle mx-auto d-block img-fluid" src="../images/WorkplaceLogo-Circle_100x100.png" alt="Workplace logo" style="max-height:50px">
</div>
<hr width="95%" align="center" color="#A79D9D">
<div class="d-flex justify-content-between align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-outline-primary">Go</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<footer class="text-muted">
<div class="container">
<p class="float-left">Would you like to return to the first design? Click
<a href="resources-landing-page.html"> here</a>.</p>
<p class="float-right">
<a href="#">Back to top</a>
</p>
<!-- <p>Album example is &copy; Bootstrap, but please download and customize it for yourself!</p>-->
<!-- <p>New to Bootstrap? <a href="https://getbootstrap.com/">Visit the homepage</a> or read our <a href="/docs/4.5/getting-started/introduction/">getting started guide</a>.</p>-->
</div>
</footer>
<!-- Option 2: jQuery, Popper.js, and Bootstrap JS
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/js/bootstrap.min.js" integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s" crossorigin="anonymous"></script>
-->
</body>
</html>

@ -1,12 +0,0 @@
<!doctype html>
<html lang="en">
<div class="helpcontent text-activetextaccordion">
<h4>About the Resource Center</h4>
<p></p>
<p class="lead">You rely on a vast amount of resources to do your job. How can you keep track of them all?
<p></p>
<p class="lead">Explore the Resource Center.
<p></p>
<p class="lead">From applications to documents to websites, the Resource Center can help you find what you need.</p>
</div>
</html>

@ -1,10 +0,0 @@
<!doctype html>
<html lang="en">
<div class="helpcontent text-activetextaccordion">
<h4>Categories</h4>
<p></p>
<p class="lead">By categorizing the many resources JDS has to offer, the Resource Center gives you more control. Categories structure information so that you don't get lost in complexity.</p>
<p></p>
<p class="lead">Click a category in the workspace to expand the section, or click a category in the left sidebar to jump to that section.</p>
</div>
</html>

@ -1,12 +0,0 @@
<!doctype html>
<html lang="en">
<div class="helpcontent text-paragraphtextcolor">
<h4>Resources</h4>
<p></p>
<p class="lead">What are <i>resources</i>?</p>
<p></p>
<p class="lead">Resources are more than just files. They're documents and images, but also applications and websites. Besides connecting you with resources, the Resource Center describes them. </p>
<p></p>
<p class="lead">Browse the Resource Center to become more famliiar with essential tools employees use to do their jobs at JDS Consulting.</p>
</div>
</html>

@ -1,12 +0,0 @@
<!doctype html>
<html lang="en">
<div class="helpcontent text-paragraphtextcolor">
<h4>Searches</h4>
<p></p>
<p class="lead">Save time. Find it fast.
<p></p>
<p class="lead">Enter a search phrase or keyword in the search bar. Relevant resources populate your workspace.</p>
<p></p>
<p class="lead">Voil&aacute; &mdash; helpful resources at your fingertips.</p>
</div>
</html>

@ -1,10 +0,0 @@
<!doctype html>
<html lang="en">
<div class="helpcontent text-paragraphtextcolor">
<h4>Updates</h4>
<p></p>
<p class="lead">Periodic updates improve the Resource Center's functionality. During an update, you might see computer code moving across your screen for a few seconds.</p>
<p></p>
<p class="lead">If you have a reliable internet connection, updates should occur quickly and automatically.</p>
</div>
</html>

@ -10,7 +10,7 @@
</head>
<body>
<div class="h2">
Welcome to the landing page for JDS Consulting resources
Welcome to the landing page for JDSfaulkner resources
</div>
<div>
<ul class="list-unstyled d-inline-block debug-green" id="container"></ul>

@ -1,11 +1,9 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Resource Center</title>
<title>ResourceFinder</title>
<link rel="stylesheet" href="styles/resources-landing-page.css">
@ -13,167 +11,68 @@
<script>require('popper.js')</script>
<script>require('bootstrap')</script>
</head>
<body hidden ONLOAD="$('body').removeAttr('hidden');" class="bg-secondary">
<div class="fixed-top d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-0 bg-primary border-top shadow-sm">
<a class="navbar-brand my-0 mr-md-auto">
<img src="../images/jdsconsulting-logo-nosubhead-green-web-01.png" height="30" class="d-inline-block align-top"
alt="JDS Consulting logo">
&nbsp;Resource Center
</a>
<nav class="my-2 my-md-0 mr-md-3">
<div class="sb-example-1">
<div class="search">
<input id="searchfield" type="text" class="searchTerm" placeholder="Search">
<button id="searchbutton" type="submit" class="searchbutton">
<svg width="100%" height="auto" viewBox="-1 -3 22 22" class="bi bi-search" fill="info"
xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd"
d="M10.442 10.442a1 1 0 0 1 1.415 0l3.85 3.85a1 1 0 0 1-1.414 1.415l-3.85-3.85a1 1 0 0 1 0-1.415z"/>
<path fill-rule="evenodd"
d="M6.5 12a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zM13 6.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0z"/>
</svg>
</button>
</div>
</div>
</nav>
<nav class="my-2 my-md-0 mr-md-3">
<div class="helpdropdown">
<a class="p-2 navigationitem" href="#" role="button" id="helpdropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" data-offset="-75,4">Help</a>
<div class="dropdown-menu" aria-labelledby="dropdownMenuOffset">
<a class="dropdown-item help-menu-item" onclick="help.openHelpOverlay('help-about.html');">About the Resource Center</a>
<a class="dropdown-item help-menu-item" onclick="help.openHelpOverlay('help-searches.html');">Searches</a>
<a class="dropdown-item help-menu-item" onclick="help.openHelpOverlay('help-categories.html');">Categories</a>
<a class="dropdown-item help-menu-item" onclick="help.openHelpOverlay('help-resources.html');">Resources</a>
<a class="dropdown-item help-menu-item" onclick="help.openHelpOverlay('help-updates.html');">Updates</a>
</div>
</div>
</nav>
<nav class="my-2 my-md-0 mr-md-3">
<div class="feedbackdropdown">
<a class="p-2 navigationitem" href="#" role="button" id="feedbackdropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Feedback</a>
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
<p class="feedback-instructions px-4 py-3">Would you like to send feedback or report an issue? Type your message and click "Submit."</p>
<div class="feedbackentry"><hr/>
<form class="px-4 py-3">
<div class="form-group">
<label for="DropdownFeedbackMessage">Message</label>
<input type="email" class="form-control" id="DropdownFeedbackEmail" placeholder="Type message here">
</div>
<button type="submit" class="btn btn-feedbacksubmitbutton">Submit</button>
</form>
<header>
<div class="collapse bg-secondary" id="navbarHeader">
<div class="container">
<div class="row">
<div class="col-sm-8 col-md-7 py-4">
<p class="text-success">You rely on a vast amount of resources to do your job. How can you keep track of them all? Explore ResourceFinder. From payroll to project-management, ResourceFinder can help you locate the tools you need.</p>
</div>
<div class="col-sm-4 offset-md-1 py-4">
<ul class="list-unstyled">
<li><a href="#" class="text-success">Help</a></li>
<li><a href="#" class="text-success">Feedback</a></li>
</ul>
</div>
</div>
</div>
</nav>
<a class="btn btn-outline-themebuttonoutline" id="theme-toggle">Theme</a>
</div>
<div class="container-fluid">
<div class="row">
<nav class="col-md-2 d-none d-md-block bg-sidebarfill sidebar">
<div class="sidebar-sticky">
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link active" href="#">
<span data-feather="home"></span>
Top <span class="sr-only">(current)</span>
</a>
</li>
</ul>
<h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1">
<span>Resource Categories</span>
<a class="d-flex align-items-center" href="#">
</a>
</h6>
<ul class="nav flex-column mb-2 ml-4">
<li class="nav-item">
<a class="nav-link" href="#human-resources-collapser">
<span data-feather="list-ul"></span>
Human Resources
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#marketing-collapser">
<span data-feather="list-ul"></span>
Marketing
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#productivity-collapser">
<span data-feather="list-ul"></span>
Productivity
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#training-collapser">
<span data-feather="list-ul"></span>
Training
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#workflow-collapser">
<span data-feather="list-ul"></span>
Workflow
</a>
</li>
</ul>
</div>
</nav>
<main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-md-4">
<div class="justify-content-between flex-wrap flex-md-nowrap align-items-center pt-5 pb-2 mb-3">
<div class="album py-5">
</div>
<div class="navbar navbar-light bg-primary shadow-sm">
<div class="container d-flex justify-content-between">
<a class="navbar-brand" href="#">
<img src="../images/JDS_faulkner_Logo_NoTextAtBottom.png" height="30" class="d-inline-block align-top" alt="JDSfaulkner logo" loading="lazy">&nbsp;&nbsp;ResourceFinder
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarHeader"
aria-controls="navbarHeader" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</div>
</header>
<main>
<div class="album py-5 bg-secondary">
<button id="theme-toggle" class="btn btn-light mb-2">Push to change theme</button>
<div class="container">
<input class="form-control form-control-dark w-100 bg-info border border-boxborder" placeholder="Search"
aria-label="Search">
</div>
<div class="album py-5 ">
<div class="container">
<div id="grid-container">
</div>
</div>
</div>
<div class="album py-5 bg-secondary">
<div class="container bg-secondary">
<!-- div container-->
<div id="grid-container" class="row">
</div>
</div>
<footer class="page-footer">
<div class="container">
<p class="float-right">
<a href="#" class="footer-text">Back to top</a>
</p>
</div>
</footer>
</main>
</div>
</div>
</div>
</main>
</body>
<footer class="page-footer">
<div class="container" style="background:#ff0000">
<p class="float-left text-warning">
<a href="Design3.html">Design 3</a>
<p class="float-right text-warning">
<a href="#">Back to top</a>
</p>
</div>
</footer>
<script src="scripts/tsUtil.js"></script>
<script>loadTSTarget("themes.js");</script>
<script>let help = loadTSTarget("help.js");</script>
<script>loadTSTarget("search.js");</script>
<script src="scripts/index_app.js"></script>
</html>

@ -2,7 +2,7 @@ const path = require('path');
const factory = require(path.join(appDir, 'viewFactory'))
function loadDocuments() {
factory.buildUiFromConfig("resources-landing-page.json");
factory.buildWebCardsFromConfig("resources-landing-page.json");
}
loadDocuments();

@ -0,0 +1,46 @@
.jumbotron {
padding-top: 3rem;
padding-bottom: 3rem;
margin-bottom: 0;
background-color: #fff;
background-image: url('../../images/FilesImage_WebBanner_1800x600.png');
background-repeat: no-repeat;
background-position:bottom center;
background-size:cover;
}
@media (min-width: 768px) {
.jumbotron {
padding-top: 6rem;
padding-bottom: 6rem;
}
}
.jumbotron p:last-child {
margin-bottom: 0;
}
.jumbotron h1 {
font-weight: 500;
color: rgb(90,90,90);
text-shadow: 0 0 4px rgba (0,0,0,0.5);
}
.jumbotron .container {
max-width: 40rem;
background: rgba(255,255,255,0.45);
padding: 2rem;
color: white;
}
.jumbotron p {
color: rgb(55,55,55);
}
footer {
padding-top: 3rem;
padding-bottom: 3rem;
}
footer p {
margin-bottom: .25rem;
}

@ -1,42 +1,13 @@
html {
font-size: 14px;
}
@media (min-width: 876px) {
html {
font-size: 16px;
}
.main {
padding-right: 40px;
padding-left: 220px; /* 180 + 40 */
}
}
.input-group {
max-width: 960px;
margin: auto;
}
.main {
background-color: secondary;
}
body {
font-size: 1rem;
padding-top: 125px;
padding-bottom: 20px;
}
.feather {
width: 16px;
height: 16 px;
vertical-align: text-bottom;
color: warning
}
.album {
background-color: secondary;
color: navbartext;
color: warning
}
.img-thumbnail {
@ -47,84 +18,32 @@ body {
background-color: primary;
}
.navbar {
margin-bottom: 20px;
color: #c1c0cc;
}
/*
* Sidebar
*/
.sidebar {
position: fixed;
top: 0;
bottom: 0;
left: 0;
z-index: 100; /* Behind the navbar */
padding-top: 0px;
padding-bottom: 0px;
padding-left: 0px;
padding-right: 10px;
box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1);
.form-control {
color: #searchfont;
}
.sidebar-sticky {
position: -webkit-sticky;
position: sticky;
top: 48px; /* Height of navbar */
height: calc(100vh - 48px);
margin-top: 6rem;
padding-left: .5rem;
overflow-x: hidden;
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
.form-control:focus {
color: #searchfont;
}
.sidebar-heading {
font-size: .75rem;
text-transform: uppercase;
}
/*
* End Sidebar
*/
.border-top { border-top: 1px solid #e5e5e5; }
.border-bottom { border-bottom: 1px solid #e5e5e5; }
.nav-link {
color: navbartext;
}
.searchbutton {
background-color: transparent;
color: searchhint;
border-radius: 25px;
}
.searchbutton svg {
fill: searchhint;
}
.card-image-background {
.card-image-background{
display: flex;
}
.text-align-left {
.text-align-left{
text-align: left;
}
.category-header p {
margin: 0 0 .15em 0;
padding-left: 1rem;
padding-bottom: .5rem;
}
.form-control::-webkit-input-placeholder { color: searchfont; } /* WebKit, Blink, Edge */
.form-control:-moz-placeholder { color: searchfont; } /* Mozilla Firefox 4 to 18 */
.form-control::-moz-placeholder { color: searchfont; } /* Mozilla Firefox 19+ */
.form-control:-ms-input-placeholder { color: searchfont; } /* Internet Explorer 10-11 */
.form-control::-ms-input-placeholder { color: searchfont; } /* Microsoft Edge */
.category-header h5 {
padding-left: 1rem;
padding-top: .5rem;
}
.footer {
padding-top: 3rem;
@ -134,12 +53,5 @@ body {
.footer p {
margin-bottom: .25rem;
margin-left: 25rem;
padding-left: 25rem;
}
.helpcontent {
margin: 3rem;
padding: 3rem;
font-size: 11px;
}

@ -1,5 +1,4 @@
@use "sass:map";
$enable-rounded: true !default;
@ -12,27 +11,27 @@ $enable-rounded: true !default;
cursor: pointer;
}
.web-card-background {
.web-card-background{
background-color: map-get($theme-colors, inactivecard);
}
.web-card-background:hover {
.web-card-background:hover{
background-color: map-get($theme-colors, activecard);
}
.web-card-background:hover .text-header {
.web-card-background:hover .text-header{
color: map-get($theme-colors, headertextcolorhover);
}
.web-card-background:hover .text-paragraph {
.web-card-background:hover .text-paragraph{
color: map-get($theme-colors, paragraphtextcolorhover);
}
.web-card-background:hover .web-card-image-background {
.web-card-background:hover .web-card-image-background{
background-color: map-get($theme-colors, webcardimagebackgroundhover);
}
.web-card-image-background {
.web-card-image-background{
background-color: map-get($theme-colors, webcardimagebackground);
border-radius: 50%;
}
@ -41,277 +40,14 @@ $enable-rounded: true !default;
color: map-get($theme-colors, headertextcolor);
}
.text-paragraph {
.text-paragraph{
color: map-get($theme-colors, paragraphtextcolor);
}
.no-overflow {
overflow: hidden;
}
html {
height: 100%;
}
body {
height: 100%;
}
.category-header {
border: 1px solid;
border-radius: 5px;
cursor: pointer;
margin-bottom: 4px;
background-color: map-get($theme-colors, inactiveaccordion);
color: map-get($theme-colors, inactivetextaccordion);
border-color: map-get($theme-colors, inactiveborderaccordion);
}
.category-header.active {
margin-bottom: 25px;
background-color: map-get($theme-colors, activeaccordion);
color: map-get($theme-colors, activetextaccordion);
border-color: map-get($theme-colors, activeborderaccordion);
}
#theme-toggle {
btn-outline: map-get($theme-colors, themebuttonoutline);
}
#theme-toggle:hover {
btn: map-get($theme-colors, themebuttonfill) !important;
color: map-get($theme-colors, themebuttontext) !important;
}
#theme-toggle:focus {
btn: map-get($theme-colors, themebuttonfill) !important;
color: map-get($theme-colors, themebuttontext) !important;
}
#theme-toggle:active {
btn: map-get($theme-colors, themebuttonfill) !important;
color: map-get($theme-colors, themebuttontext) !important;
}
.searchTerm::-webkit-input-placeholder {
color: map-get($theme-colors, searchhint) !important;
}
.sb-example-1 .search {
width: 95%;
position: relative;
display: flex;
margin: auto;
max-width: 1100px;
}
.sb-example-1 .searchTerm {
width: 100%;
border: 1px solid;
border-color: map-get($theme-colors, boxborder3);
border-right: none;
padding-left: 15px;
padding-right: 15px;
border-radius: 25px 0 0 25px;
stroke: map-get($theme-colors, searchicon);
color: map-get($theme-colors, searchhint);
background-color: map-get($theme-colors, searchfill);
box-shadow: none;
outline: none;
}
.sb-example-1 .searchTerm:hover {
stroke: map-get($theme-colors, searchiconhover);
background-color: map-get($theme-colors, searchfill);
box-shadow: none;
color: map-get($theme-colors, searchfont) !important;
outline: none;
}
.sb-example-1 .searchTerm:focus {
stroke: map-get($theme-colors, searchiconhover);
background-color: map-get($theme-colors, searchfill);
box-shadow: none;
color: map-get($theme-colors, searchfont) !important;
outline: none;
}
.sb-example-1 .searchbutton {
width: 40px;
height: 50px;
border: 1px solid;
border-color: map-get($theme-colors, boxborder2);
background-color: map-get($theme-colors, searchbuttonfill);
text-align: center;
fill: map-get($theme-colors, searchicon);
border-radius: 0 25px 25px 0;
cursor: pointer;
font-weight: normal;
box-shadow: none;
outline: none;
}
.sb-example-1 .searchbutton:hover {
width: 40px;
height: 50px;
border: 1px solid;
border-color: map-get($theme-colors, boxborder2);
background-color: map-get($theme-colors, searchbuttonfill);
text-align: center;
fill: map-get($theme-colors, searchiconhover) !important;
border-radius: 0 25px 25px 0;
cursor: pointer;
font-weight: normal;
box-shadow: none;
outline: none;
}
.sb-example-1 .searchbutton:focus {
width: 40px;
height: 50px;
border: 1px solid;
border-color: map-get($theme-colors, boxborder2);
background-color: map-get($theme-colors, searchbuttonfill);
text-align: center;
fill: map-get($theme-colors, searchiconfocus) !important;
border-radius: 0 25px 25px 0;
cursor: pointer;
font-weight: normal;
box-shadow: none;
outline: none;
}
.navigationitem {
outline: none;
color: map-get($theme-colors, navbartext);
}
.navigationitem:hover {
color: map-get($theme-colors, activetextaccordion);
}
.navbar-brand {
outline: none;
color: map-get($theme-colors, navbarbrandtext);
}
.navbar-brand:hover {
outline: none;
color: map-get($theme-colors, navbarbrandtext);
}
.helpdropdown .dropdown-menu {
background-color: map-get($theme-colors, menudropdownfill);
font-size: 15px;
margin-bottom: 9px;
color: map-get($theme-colors, activetextaccordion) !important;
box-shadow: -1 1 3 1 #cccccc;
}
.feedbackentry .btn {
color: map-get($theme-colors, feedbacksubmitbuttontext);
}
.feedbackdropdown .dropdown-menu {
background-color: map-get($theme-colors, menudropdownfill);
font-size: 15px;
margin-bottom: 9px;
color: map-get($theme-colors, activetextaccordion);
box-shadow: -1 1 3 1 #cccccc;
}
#DropdownFeedbackEmail {
background-color: map-get($theme-colors, feedbackmessagefill);
border: 1px solid;
border-color: map-get($theme-colors, feedbackmessageborder);
color: map-get($theme-colors, searchfont);
}
.form-control::-webkit-input-placeholder {
color: map-get($theme-colors, feedbackmessagehint) !important;
}
.help-menu-item {
color: map-get($theme-colors, helpmenudropdowntext) !important;
}
.help-menu-item:hover {
color: map-get($theme-colors, helpmenudropdowntexthover) !important;
background-color: map-get($theme-colors, helpmenudropdownbghover) !important;
}
.footer-text {
color: map-get($theme-colors, footerback);
}
.footer-text:hover {
color: map-get($theme-colors, footerbackhover);
}
.footer-text:focus {
color: map-get($theme-colors, footerbackfocus);
}
.sidebar {
color: map-get($theme-colors, sidebartext); /* This is the RESOURCE CATEGORIES color inactive */
}
.sidebar:hover {
color: map-get($theme-colors, sidebartext); /* This is the RESOURCE CATEGORIES color on hover */
}
.sidebar .nav-link.active {
color: map-get($theme-colors, sidebartext); /* This is the color of the Top item in menu when inactive */
}
.sidebar .nav-link.active:hover {
color: map-get($theme-colors, activetextaccordion); /* This is the color of the Top item in menu when hovered */
background-color: map-get($theme-colors, sidebarbg);
}
.sidebar .nav-link {
font-weight: 500;
color: map-get($theme-colors, sidebartext); /* This is the color of the category names when inactive */
}
.sidebar .nav-link:hover {
font-weight: 500;
color: map-get($theme-colors, activetextaccordion); /* This is the color of the category names when hovered */
background-color: map-get($theme-colors, sidebarbg);
}
.overlay-custom {
position: fixed; /* Sit on top of the page content */
width: 100%; /* Full width (cover the whole page) */
height: 100%; /* Full height (cover the whole page) */
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0,0,0,0.7); /* Black background with opacity */
z-index: 2000; /* Specify a stack order in case you're using a different order for other elements */
cursor: pointer; /* Add a pointer on hover */
}
.overlay-content {
position: fixed; /* Sit on top of the page content */
width: 50%; /* Full width (cover the whole page) */
height: 100%; /* Full height (cover the whole page) */
top: 0%;
right: 0%;
background-color: map-get($theme-colors, sidebarfill); /* Black background with opacity */
cursor: pointer; /* Add a pointer on hover */
}
hr {
margin-top: 1rem;
margin-bottom: 1rem;
border: 0;
border-top: 1px solid rgba(0, 0, 0, 0.1);
html{
height:100%
}
.highlight {
color: map-get($theme-colors, highlight-text-color);
background-color: map-get($theme-colors, highlight-background);
body{
height:100%;
}

@ -1,74 +1,21 @@
$theme-colors: (
"primary": #45454c,
"secondary": #121212,
"primary": #707070,
"secondary": #303033,
"success": #808080,
"info": #2d2d31,
"info": #202023,
"warning": #000000,
"navbarbrandtext": #9d9d9d,
"navbartext": #808080,
"navbartextfeather": #303033,
"navbartextactive": #202022,
"inactivecard": #333337,
"activecard": #4f4f56,
"boxborder": #272727,
"boxborder2": #3c3c42,
"boxborder3": #323237,
"inactivecard": #414144,
"activecard": #707070,
"boxborder": #55555c,
"activecardfont":#e1e4e8,
"searchhint": #6b6866,
"searchfont": #9f9c9a,
"searchfill": #323237,
"sidebarfill": #202023,
"searchbuttonfill": #585861,
"searchbuttonfillhover": #808080,
"searchbuttonfillfocus": #585861,
"searchicon": #808080,
"searchiconhover": #c5c5c5,
"searchiconfocus": #c5c5c5,
"sidebartext": #7d7d7d,
"sidebarbg": #29292d,
"searchfont": #808080,
"webcardimagebackground": #707070,
"webcardimagebackgroundhover": #98928F,
"headertextcolor": #9d9d9d,
"headertextcolorhover": #d9d2d2,
"paragraphtextcolor": #9d9d9d,
"paragraphtextcolorhover":#d9d2d2,
"themebuttonoutline": #808080,
"themebuttonfill": #c0c0c0,
"themebuttontext": #cdcdcd,
"inactiveaccordion": #202023,
"activeaccordion": #333337,
"inactivetextaccordion": #787572,
"activetextaccordion": #9d9d9d,
"inactiveborderaccordion": #180606,
"activeborderaccordion": rgba(26, 26, 26, 0),
"footertext": #787572,
"chevronup": #787572,
"chevrondown": #9d9d9d,
"menudropdownfill": #4e4e56,
"feedbacksubmitbutton": #103171,
"feedbacksubmitbuttontext": #a3a3a3,
"feedbackmessagefill": #3c3c42,
"feedbackmessageborder": #5b5b63,
"feedbackmessagehint": #787572,
"footerback": #787572,
"footerbackfocus": #787572,
"footerbackhover": rgba(157, 157, 157, .8),
"helpmenudropdowntext": #9d9d9d,
"helpmenudropdowntexthover": #a8a8a8,
"helpmenudropdownbghover": #5c5c66,
"highlight-text-color": #000,
"highlight-background": #ece665,
"webcardimagebackgroundhover": #808080,
"headertextcolor": #808080,
"headertextcolorhover": #ffffff,
"paragraphtextcolor": #808080,
"paragraphtextcolorhover":#ffffff,
);
.theme-button{
width:40px;
height: 30px;
background-size: contain;
background-color: transparent;
background-repeat: no-repeat;
background-image: url("../../images/dark-theme-toggle.png");
cursor: pointer;
}
@import "theme-base";

@ -1,74 +1,21 @@
$theme-colors: (
"primary": #fdfdfd,
"secondary": #dcdcdc,
"primary": #2c2c2c,
"secondary": #e5e5e5,
"success": #0B031C,
"info": #f9f9f9,
"info": #ffffff,
"warning": #700000,
"navbartext": #3f4959,
"navbarbrandtext": #3f4a5a,
"navbartextfeather": #080404,
"navbartextactive": #080404,
"inactivecard": #ffffff,
"activecard": #13a04a,
"boxborder": #c0c2c6,
"boxborder2": #ececec,
"boxborder3": #ebebeb,
"activecardfont": #e1e4e8,
"searchhint": #c0c2c6,
"activecardfont":#e1e4e8,
"searchfont": #2c2c2c,
"sidebarfill": #efefef,
"sidebartext": #3f4959,
"sidebarbg": #e5e5e5,
"searchfill": #f0f0f2,
"searchbuttonfill": #ffffff,
"searchbuttonfillhover": #f6f6f6,
"searchbuttonfillfocus": #f1f1f1,
"searchicon": #3f4959,
"searchiconhover": #000,
"searchiconfocus": #000,
"webcardimagebackground": #eeeeee,
"webcardimagebackgroundhover": #f0f0f0,
"headertextcolor": #080404,
"webcardimagebackgroundhover": #ffffff,
"headertextcolor": #2c2c2c,
"headertextcolorhover": #ffffff,
"paragraphtextcolor": #080404,
"paragraphtextcolorhover": #ffffff,
"themebuttonoutline": #3f4959,
"themebuttonfill": #dcdcdc,
"themebuttontext": #fdfdfd,
"inactiveaccordion": #efefef,
"activeaccordion": #ffffff,
"inactivetextaccordion": #3f4959,
"activetextaccordion": #080404,
"borderaccordion": #c0c2c6,
"inactiveborderaccordion": #c0c2c6,
"activeborderaccordion": rgba(26, 26, 26, 0),
"footertext": #434344,
"chevronup": #434344,
"chevrondown": #434344,
"menudropdownfill": #ffffff,
"feedbacksubmitbutton": #099f4a,
"feedbacksubmitbuttontext": #ffffff,
"feedbackmessagefill": #efefef,
"feedbackmessageborder": #dbdbdb,
"feedbackmessagehint": #c0c2c6,
"footerback": #3f4959,
"footerbackfocus": #3f4959,
"footerbackhover": #080404,
"helpmenudropdowntext": #3f4a5a,
"helpmenudropdowntexthover": #080404,
"helpmenudropdownbghover": #f2f2f2,
"highlight-text-color": #000,
"highlight-background": #ece665,
"paragraphtextcolor": #2c2c2c,
"paragraphtextcolorhover":#ffffff,
);
.theme-button{
width: 40px;
height: 30px;
background-size: contain;
background-color: transparent;
background-repeat: no-repeat;
background-image: url("../../images/light-theme-toggle.png");
cursor: pointer;
}
@import "theme-base";

@ -0,0 +1,14 @@
$theme-colors: (
"primary": #393939,
"secondary": #e1e4e8,
"success": #e1e1e1,
"info": #507CBF,
"warning": #F9E3D3
);
$enable-rounded: true !default;
@import "node_modules/bootstrap/scss/bootstrap";
@import "node_modules/bootstrap/scss/functions";
@import "node_modules/bootstrap/scss/variables";
@import "node_modules/bootstrap/scss/mixins";

@ -1,6 +0,0 @@
{
"title": "Direct Deposit",
"description": "Would you like have your paychecks deposited into your bank account? Fill out this form and submit it to HR.",
"altText": "PDF icon",
"keywords": "human resources"
}

@ -1,6 +0,0 @@
{
"title": "Expense Report",
"description": "Request reimbursement for preapproved, company-related expenses. Send this form and receipts to Accounts Payable.",
"altText": "PDF icon",
"keywords": "human resources, purchase"
}

@ -1,6 +0,0 @@
{
"title": "Drafting Quiz",
"description": "Click here to access a prequalifying quiz that is a requirement for those applying for drafting positions.",
"altText": "Document icon",
"keywords": "human resources, plans, design, job, career, interview"
}

@ -1,6 +0,0 @@
{
"title": "SRA",
"description": "A salary reduction agreement helps you to establish or change the part of your compensation that goes to an IRA.",
"altText": "PDF icon",
"keywords": "human resources, savings, retirement"
}

@ -1,6 +0,0 @@
{
"title": "Performance Evaluation",
"description": "Employees fill out this form and send it to their supervisors for their annual performance-evaluation meetings.",
"altText": "Document icon",
"keywords": "self, assessment"
}

@ -1,6 +0,0 @@
{
"title": "JDS Consulting Letterhead",
"description": "Represent the company in a professional and consistent manner using the official letterhead for correspondence.",
"altText": "Document icon",
"keywords": "marketing, template"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 599 KiB

@ -1,6 +0,0 @@
{
"title": "JDS Consulting Logo - PNG",
"description": "Do you need to present the logo in your work? Here's a PNG format to use in documents and merchandise.",
"altText": "Image icon",
"keywords": "marketing"
}

@ -1,6 +0,0 @@
{
"title": "JDS Consulting Logo - EPS",
"description": "Do you need to present the logo in your work? Here's an EPS format to use in documents and merchandise.",
"altText": "Image icon",
"keywords": "marketing"
}

@ -1,9 +0,0 @@
<html lang="en">
<div>
<div id="{{{category-key}}}-collapser" class="category-header">
<div class="d-flex"><h5>{{{category-id-clean}}}</h5><img id="{{{category-key}}}-img" class="ml-auto p-2 chevron-img" src="../images/chevron-up-dark.svg" alt="button"/></div>
<p class="align-self-center">{{{category-description}}}</p>
</div>
<div id="{{{category-key}}}-container" class="{{{category-key}}}-collapse no-overflow row" style="display:none;"></div>
</div>
</html>

@ -1,7 +0,0 @@
<html lang="en">
<div id="help-overlay" onclick="help.closeOverlay()" class="overlay-custom">
<div class="overlay-content">
{{{content}}}
</div>
</div>
</html>

@ -1,15 +1,14 @@
<html lang="en">
<div class="col-md-4 mb-4 web-card" id="{{{id}}}">
<div class="card mb-4 h-100 shadow-sm web-card-background">
<div class="card-body d-flex flex-column text-center">
<h6 class="card-text text-header" style="text-align:center">{{{title}}}</h6>
<p class="card-text text-paragraph text-align-left">{{{description}}} </p>
<div class="d-inline-block mt-auto mx-auto justify-content-between align-items-center web-card-image-background">
<img id="collapse-image" class="rounded-circle mx-auto d-block img-fluid"
<div class="col-md-4 web-card" id="{{{id}}}" >
<div class="card mb-4 shadow-sm web-card-background">
<div class="card-body text-center">
<h7 class="card-text text-header" style="text-align:center">{{title}}</h7>
<p class="card-text text-paragraph text-align-left">{{description}} </p>
<div class="d-inline-block mx-auto justify-content-between align-items-center web-card-image-background">
<img class="rounded-circle mx-auto d-block img-fluid"
src="{{{imgPath}}}" alt="{{{altText}}}"
style="max-height:50px">
</div>
</div>
</div>
</div>
</html>
</div>

@ -2,55 +2,22 @@ require('update-electron-app')({
logger: require('electron-log')
})
const updateCheckInterval = 1000 * 60
const path = require('path')
const {app, BrowserWindow} = require('electron')
const server = 'https://update.jdsconsulting.net'
const url = `${server}/update/${process.platform}/${app.getVersion()}`
// autoUpdater.setFeedURL({url})
//
// autoUpdater.checkForUpdates();
// setInterval(() => {
// console.log("Checking for update...");
// autoUpdater.checkForUpdates();
// }, updateCheckInterval)
//
// autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
// console.log("Handling updates...")
// const dialogOpts = {
// type: 'info',
// buttons: ['Restart', 'Later'],
// title: 'Application Update',
// message: process.platform === 'win32' ? releaseNotes : releaseName,
// detail: 'A new version has been downloaded. Restart the application to apply the updates.'
// }
//
// dialog.showMessageBox(dialogOpts).then((returnValue) => {
// if (returnValue.response === 0) autoUpdater.quitAndInstall()
// })
// })
//
// autoUpdater.on('error', message => {
// console.error('There was a problem updating the application')
// console.error(message)
// })
const debug = /--debug/.test(process.argv[2])
if (process.mas) app.setName('JDS Consulting Portal')
if (process.mas) app.setName('JDSfaulkner Portal')
let mainWindow = null
function initialize() {
function initialize () {
makeSingleInstance()
function createWindow() {
function createWindow () {
const windowOptions = {
width: 1080,
minWidth: 769,
minWidth: 680,
height: 840,
title: app.name,
webPreferences: {
@ -102,7 +69,7 @@ function initialize() {
//
// Returns true if the current version of the app should quit instead of
// launching.
function makeSingleInstance() {
function makeSingleInstance () {
if (process.mas) return
app.requestSingleInstanceLock()

@ -1,8 +1,8 @@
let path = require('path')
let fs = require('fs');
let os = require('os');
const shell = require('electron').shell;
let fileExtensionToImage: object;
import {Themes} from "./themes";
export enum ConfigPaths {
ApplicationConfigName = "dashboard.json",
@ -49,7 +49,7 @@ export module Configurator {
function buildDefaultConfig(): object {
let userConfig = {};
userConfig['theme'] = "theme-dark";
userConfig['theme'] = Themes.AppTheme.Dark;
saveUserConfig(ConfigPaths.UserConfigName, userConfig)
return userConfig
}
@ -61,10 +61,6 @@ export module FileUtils {
return path.join(getPathToAssets(), "views", templateName + ".mustache")
}
export function getPathToPage(pageName: string): string {
return path.join(getPathToAssets(), "pages", pageName)
}
export function getPathToImage(imageName: string): string {
return path.join(getPathToAssets(), "images", imageName)
}
@ -97,34 +93,6 @@ export module FileUtils {
fs.mkdirSync(dirPath);
}
}
export function showFileInDir(resourcePath: string) {
let localFile = copyFileToUserDocuments(resourcePath);
shell.showItemInFolder(localFile);
}
/**
* @param resourcePath pathlike of system resource
* @private
* @returns pathlike of local user resource
*/
function copyFileToUserDocuments(resourcePath: string): string {
let fileName = path.basename(resourcePath);
let userFilePath = getPathToUserDocumentDir(fileName);
if(!fs.existsSync(userFilePath)){
fs.copyFileSync(resourcePath, userFilePath);
}
return userFilePath;
}
function getPathToUserDocumentDir(fileName: string): string {
let homeDir = os.homedir();
let parent = path.join(homeDir, "Documents", "Employee Resources");
if(!fs.existsSync(parent)){
fs.mkdirSync(parent);
}
return path.join(parent, fileName);
}
}
@ -138,62 +106,6 @@ export class DocumentDirectory {
root: DirectoryNode;
getCards(): Map<string, object[]> {
return DocumentDirectory.walkCards(this.root);
}
private static walkCards(d: DirectoryNode): Map<string, object[]> {
let cardsByCategory = new Map<string, object[]>();
for (let child of d.children) {
if (child instanceof DirectoryNode) {
let dir = child as DirectoryNode;
if (dir.containsDirectory()) {
let childDirectories = dir.getDirectories();
for (let dir of childDirectories) {
let subCards = DocumentDirectory.walkCards(dir);
this.mergeMaps(cardsByCategory, subCards);
}
}
let sCards = dir.getDocuments();
let category = dir.getCategory();
for (let sCard of sCards) {
let cards = cardsByCategory.get(category);
if (cards === undefined || cards === null) {
cards = [];
}
cards.push(sCard.toCard());
cardsByCategory.set(category, cards);
}
} else {
let category = (child.parent as DirectoryNode).getCategory();
let cards = cardsByCategory.get(category);
if (cards === undefined || cards === null) {
cards = [];
}
cards.push(child.toCard());
cardsByCategory.set(category, cards);
}
}
return cardsByCategory;
}
private static mergeMaps(a: Map<string, Object[]>, b: Map<string, Object[]>) {
let keys = Object.keys(b);
for (let key of keys) {
let sa = a.get(key)
if (sa === undefined || sa === null) {
sa = [];
}
let sb = b.get(key)
if (sb === undefined) {
sb = [];
}
sa.push(...sb);
a[key] = sa;
}
}
}
export class FileNode {
@ -206,62 +118,10 @@ export class FileNode {
this.parent = parent;
}
static loadAltProps(path: string): object {
let props = {};
let jsonPath = path + ".json"
if (fs.existsSync(jsonPath)) {
let raw = fs.readFileSync(jsonPath);
props = JSON.parse(raw.toString());
}
return props
}
private static getImagePathFromDocumentName(name: string): string {
let ext = FileUtils.getFileExtension(name);
return Configurator.getFileExtensionToImageMap()[ext];
}
open() {
shell.openItem(this.filePath);
}
show() {
shell.showItemInFolder(this.filePath);
}
toCard(): object {
let altProps = FileNode.loadAltProps(this.filePath);
let imageName = FileNode.getImagePathFromDocumentName(this.filePath);
let cardObj = {
"title": this.getTitle(),
"description": "",
"imagePath": imageName,
"urlText": this.filePath,
"altText": "",
"fileCard": true,
"open": this.open
}
let altKeys = Object.keys(altProps);
for (let key of altKeys) {
cardObj[key] = altProps[key]
}
return cardObj
}
getTitle(): string {
let name = path.basename(this.filePath);
let ext = path.extname(name);
let cName = name.replace(ext, "");
cName = cName.replace(/[\-._]/ig, " ")
return `${cName} (${ext.substr(1).toUpperCase()})`
}
isDescriptor() {
}
static compare(a: FileNode, b: FileNode): number {
return a.filePath.localeCompare(b.filePath);
}
@ -276,9 +136,8 @@ export class DirectoryNode extends FileNode {
let stats = fs.lstatSync(filePath);
if (stats.isDirectory()) {
let contents = fs.readdirSync(filePath);
for (let fileName of contents) {
if (path.extname(fileName) === ".json") continue;
let childPath = path.join(filePath, fileName);
for (let i = 0, l = contents.length; i < l; i++) {
let childPath = path.join(filePath, contents[i]);
let childStats = fs.lstatSync(childPath);
if (childStats.isDirectory()) {
this.children.push(new DirectoryNode(childPath, this));
@ -305,24 +164,6 @@ export class DirectoryNode extends FileNode {
return x instanceof DirectoryNode
}) as DirectoryNode[]
}
containsDirectory(): Boolean {
for (let child of this.children) {
if (child instanceof DirectoryNode) return true;
}
return false
}
getCategory(): string {
let rawName = path.basename(this.filePath);
let parts = rawName.split("-");
for (let i = 0, l = parts.length; i < l; i++) {
let part = parts[i].split('');
part[0] = part[0].toUpperCase();
parts[i] = part.join('')
}
return parts.join(" ")
}
}

@ -1,19 +0,0 @@
import {loadTemplate, readHTML} from "./templates";
let $ = require('jquery')
export function openHelpOverlay(resourceName: string){
let body = $("body");
let content = readHTML(resourceName);
let obj = {"content": content};
let loadedTemplate = loadTemplate("help-overlay.mustache", obj, (x)=>{});
let wrapper = $(loadedTemplate);
body.append(wrapper)
}
export function closeOverlay(){
$("#help-overlay").remove();
}

@ -1,160 +0,0 @@
import {Configurator, DocumentDirectory} from "./fileutils";
import * as path from "path";
import {buildCardsFromConfig, buildUiFromConfig} from "./viewFactory";
function register() {
let searchBar = $("#searchfield");
let searchButton = $("#searchbutton");
searchBar.on("keyup", (evt) => {
if ("Enter" === evt.code) {
let term = searchBar.val().toString();
if (!term || 0 === term.length) {
reset()
} else {
search(term);
}
} else {
let term = searchBar.val().toString();
if (!term || 0 === term.length) {
reset()
}
}
});
searchButton.on("click", () => {
let term = searchBar.val().toString();
if (!term || 0 === term.length) {
reset()
} else {
search(term);
}
})
}
function reset() {
buildUiFromConfig("resources-landing-page.json");
}
function search(term: string) {
let webCards = getWebCardsWithSearchTerm(term);
let fileCards = getFileCardsWithSearchTerm(term);
copyMissingKeys(webCards, fileCards);
buildCardsFromConfig(webCards, fileCards);
expandAllContainers();
}
function copyMissingKeys(webCards: object, fileCards: Map<string, object>) {
let elementConfig = Configurator.loadAppConfig("resources-landing-page.json");
let containerKeys = Object.keys(elementConfig);
for (let containerKey of containerKeys) {
let container = webCards[containerKey];
let elementContainer = elementConfig[containerKey];
for (let [key, value] of fileCards) {
if (!container[key]) {
let original = elementContainer[key];
original["cards"] = [];
container[key] = original;
}
}
}
}
function getFileCardsWithSearchTerm(term): Map<string, object> {
let map = new Map<string, object>()
let directoryPath = path.join(__dirname, "../assets/resources");
let fileCards = new DocumentDirectory(directoryPath).getCards();
for (let [key, value] of fileCards) {
for (let card of value) {
if (cardContainsTerm(term, card)) {
addToFileMap(map, key, highlightCardTerm(term, card));
}
}
}
return map;
}
function getWebCardsWithSearchTerm(term): object {
let map = {};
let elementConfig = Configurator.loadAppConfig("resources-landing-page.json");
let containerKeys = Object.keys(elementConfig);
for (let i = 0, l = containerKeys.length; i < l; i++) {
let containerKey = containerKeys[i];
map[containerKey] = {};
let container = elementConfig[containerKey];
let categoryKeys = Object.keys(container);
for (let categoryIdx in categoryKeys) {
let categoryKey = categoryKeys[categoryIdx]
let category = container[categoryKey];
let cards = category.cards;
for (let j = 0, k = cards.length; j < k; j++) {
let card = cards[j];
if (cardContainsTerm(term, card)) {
addToWebMap(map, containerKey, categoryKey, category["description"], highlightCardTerm(term, card));
}
}
}
}
return map;
}
function addToWebMap(map: object, containerKey: string, categoryKey: string, categoryDescription: string, card: object) {
let container = map[containerKey];
if (!container) {
container = {};
}
let category = container[categoryKey];
if (!category) {
category = {"description": categoryDescription, "cards": []}
}
category["cards"].push(card);
container[categoryKey] = category;
map[containerKey] = container;
}
function addToFileMap(map: Map<string, object>, categoryKey: string, card) {
if (!map.get(categoryKey)) {
map.set(categoryKey, []);
}
let cards = map.get(categoryKey) as Array<object>;
cards.push(card);
map.set(categoryKey, cards);
}
function cardContainsTerm(term: string, card: object): boolean {
let titleContains = card["title"].toLowerCase().includes(term.toLowerCase());
let descriptionContains = card["description"].toLowerCase().includes(term.toLowerCase());
let keywordContains = false;
if (card["keywords"]) {
keywordContains = card["keywords"].toLowerCase().includes(term.toLowerCase());
}
//todo: add keywords
return titleContains || descriptionContains || keywordContains;
}
function highlightCardTerm(term: string, card: object): object {
let regexTerm = escapeRegExp(term);
let pattern = new RegExp(regexTerm, 'ig');
card["title"] = card["title"].replace(pattern, `<span class="highlight">$&</span>`);
card["description"] = card["description"].replace(pattern, `<span class="highlight">$&</span>`);
return card;
}
function escapeRegExp(term: string): string {
return term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
function expandAllContainers() {
let containers = $('[id$="collapser"]')
for (let container of containers) {
container.click()
}
}
register()

@ -20,20 +20,22 @@ export function cacheTemplates() {
});
}
export function loadTemplate(filename: string, obj: object, cb: TemplateCallbackType): string {
export function loadTemplate(filename: string, objs: object[], cb: TemplateCallbackType) {
let contents = templateCache[filename];
if (!contents) throw new Error("No such template: " + filename);
let rendered = Mustache.render(contents, obj)
if (null !== cb) {
cb(rendered)
let results: string[] = []
for (let i = 0, l = objs.length; i < l; i++) {
let obj = objs[i]
let rendered = Mustache.render(contents, obj)
results.push(rendered)
}
return rendered;
cb(results)
}
export function loadTemplateSingle(filename: string, cardModel: CardModel, cb: (content: string, id: string) => void) {
let contents = templateCache[filename];
if (!contents) throw new Error("No such template: " + filename);
cardModel['id'] = createId(cardModel.title + cardModel.resourcePath);
cardModel['id'] = createId(cardModel.resourcePath);
let rendered = Mustache.render(contents, cardModel);
cb(rendered, cardModel['id']);
}
@ -42,11 +44,6 @@ function createId(fileName: String) {
return crypto.createHash('md5').update(fileName).digest('hex');
}
export function readHTML(fileName: string): string{
let baseFilePath = FileUtils.getPathToPage(fileName);
return fs.readFileSync(baseFilePath, "utf8").toString();
}
module.exports = {loadTemplate, loadTemplateSingle, readHTML}
module.exports = {loadTemplate, loadTemplateSingle}
cacheTemplates()

@ -2,8 +2,6 @@ const $ = require('jquery');
import {ConfigPaths, Configurator} from "./fileutils";
export module Themes {
export enum AppTheme {
Light = "theme-light",
Dark = "theme-dark"
@ -15,12 +13,15 @@ export module Themes {
applyTheme(initTheme);
let initToggle = $('#theme-toggle');
let initThemeEnum = getThemeFromValue(initTheme);
// initToggle.addClass(getButtonClassFromAppTheme(initThemeEnum));
initToggle.addClass(getButtonClassFromAppTheme(initThemeEnum));
initToggle.on("click", () => {
let conf = Configurator.loadUserConfig(ConfigPaths.UserConfigName);
let toggle = $("#theme-toggle");
let themeValue = conf['theme'];
let currTheme = getThemeFromValue(themeValue);
let opposite = getOppositeTheme(currTheme);
toggle.removeClass(getButtonClassFromAppTheme(currTheme));
toggle.addClass(getButtonClassFromAppTheme(opposite));
applyTheme(opposite);
conf['theme'] = opposite;
Configurator.saveUserConfig(ConfigPaths.UserConfigName, conf);
@ -39,20 +40,6 @@ export module Themes {
}
}
head.prepend(buildCSSLink(newResource));
let images = document.querySelectorAll(".chevron-img");
for (let i = 0, l = images.length; i < l; i++) {
let imageMatchRegex = /\.\.\/images\/chevron-(\w+)-(\w+)\.svg$/ig;
let element = images[i];
let srcImg = element.getAttribute("src");
let groups = imageMatchRegex.exec(srcImg);
let direction = groups[1];
let theme = groups[2];
let newTheme = theme === "dark" ? "light" : "dark";
element.setAttribute("src", `../images/chevron-${direction}-${newTheme}.svg`);
}
}
function getButtonClassFromAppTheme(t: AppTheme): string {
@ -89,4 +76,4 @@ export module Themes {
}
}
Themes.initTheme();
Themes.initTheme();

@ -1,10 +1,7 @@
import {Configurator, DocumentDirectory, FileUtils} from './fileutils'
import {loadTemplate, loadTemplateSingle} from "./templates"
import * as path from "path";
import {Configurator, FileUtils} from './fileutils'
import {loadTemplateSingle} from "./templates"
const shell = require('electron').shell;
const fs = require('fs');
export class CardModel {
@ -21,114 +18,42 @@ export class CardModel {
}
}
export function buildFileCard(elem: JQuery<HTMLElement>, obj, append: boolean = false, $: any = require('jquery')) {
let model = new CardModel(
obj["title"],
obj["description"],
FileUtils.getPathToImage(obj["imagePath"]),
obj["urlText"]
);
model["show"] = obj["show"];
loadTemplateSingle("web-card.mustache", model, (content: string, id: string) => {
if (append) {
elem.append(content);
} else {
elem.html(content)
}
$(`#${id}`).on("click", () => {
FileUtils.showFileInDir(model.resourcePath);
});
// if (model["show"] !== undefined) {
// $(`#${id}`).on("click", () => {
// shell.showItemInFolder(model.resourcePath)
// });
// } else {
// $(`#${id}`).on("click", () => {
// shell.openItem(model.resourcePath)
// });
// }
});
export function buildFileCard(filePath: string, elem: Element, append: boolean = false, $: any = require('jquery')) {
// let model = new CardModel(getImagePathFromDocumentName(filePath), fileNameToPrettyString(filePath));
// loadTemplateSingle("file-card.mustache", model, (content: string, id: string) => {
// let snip = $(content);
// let container = $("#" + elem.id);
//
// if (append) {
// container.append(snip);
// } else {
// container.empty().append(snip);
// }
// setTimeout(() => {
// $(`#${id}`).on("click", () => {
// launchDocument(filePath);
// });
// }, 1); //for some reason we have to let the dom breathe before it will let us do this?
// });
}
export function buildUiFromConfig(configName: string){
export function buildWebCardsFromConfig(configName: string) {
let elementConfig = Configurator.loadAppConfig(configName);
let directoryPath = path.join(__dirname, "../assets/resources");
let fileCards = new DocumentDirectory(directoryPath).getCards();
buildCardsFromConfig(elementConfig, fileCards);
}
export function buildCardsFromConfig(elementConfig: object, fileCards: Map<string, object>) {
let $ = require('jquery')
let containers = Object.keys(elementConfig);
for (let i = 0, l = containers.length; i < l; i++) {
let containerName = containers[i];
let containerObject = elementConfig[containerName];
let containerElem = $(`#${containerName}`);
containerElem.html("")
let containerCategories = Object.keys(containerObject);
for (let j = 0, m = containerCategories.length; j < m; j++) {
let categoryMetaObjectKey = containerCategories[j];
let categoryMetaObject = containerObject[categoryMetaObjectKey];
let contentList = categoryMetaObject["cards"];//should be array of objects to render
let files = fileCards.get(categoryMetaObjectKey);
let categoryDescription = categoryMetaObject["description"];
let categoryKey = categoryMetaObjectKey.replace(/[\s,]/ig, '-').toLowerCase();
let categoryObject = {
"category-description": categoryDescription,
"category-key": categoryKey,
"category-id-clean": categoryMetaObjectKey
};
let categoryWrapperRaw = loadTemplate("card-category.mustache", categoryObject, (x) => {
});
let categoryWrapper = $(categoryWrapperRaw);
containerElem.append(categoryWrapper);
let view = $(`#${categoryKey}-container`);
let collapseButton = $(`#${categoryKey}-collapser`);
setCollapseOnElement(collapseButton, categoryKey);
for (let j in files) {
let file = files[j];
buildFileCard(view, file, true, $)
}
for (let j = 0, m = contentList.length; j < m; j++) {
let content = contentList[j];
buildWebCard(view, content, true, $);
}
}
}
}
let keys = Object.keys(elementConfig);
function setCollapseOnElement(collapseButton: JQuery<HTMLElement>, categoryKey: string){
collapseButton.on("click", () => {
let imageMatchRegex = /\.\.\/images\/chevron-(\w+)-(\w+)\.svg$/ig;
let collapsable = $(`#${categoryKey}-container`);
let collapseButton = $(`#${categoryKey}-collapser`);
let collapseImg = $(`#${categoryKey}-img`);
if ("none" === collapsable.css('display')) {
collapsable.css("display", "");
collapseButton.addClass("active");
} else {
collapsable.css("display", "none");
collapseButton.removeClass("active");
for (let i = 0, l = keys.length; i < l; i++) {
let key = keys[i];
let contentList = elementConfig[key];
let element = $(`#${key}`);
console.log(element);
for (let j = 0, m = contentList.length; j<m;j++){
let content = contentList[j];
buildWebCard(element, content, true, $);
}
let srcImg = collapseImg.attr("src");
let groups = imageMatchRegex.exec(srcImg);
let direction = groups[1];
let theme = groups[2];
let newDirection = direction === "up"? "down": "up";
collapseImg.attr("src", `../images/chevron-${newDirection}-${theme}.svg`);
});
}
}
export function buildWebCard(elem: JQuery<HTMLElement>, obj, append: boolean = false, $: any = require('jquery')) {
@ -140,6 +65,7 @@ export function buildWebCard(elem: JQuery<HTMLElement>, obj, append: boolean = f
);
loadTemplateSingle("web-card.mustache", model, (content: string, id: string) => {
console.log(elem);
if (append) {
elem.append(content);
} else {
@ -166,12 +92,19 @@ function fileNameToPrettyString(fileName: string): string {
return buffer.join('');
}
function getImagePathFromDocumentName(name: string): string {
let ext = FileUtils.getFileExtension(name);
let thumbnail = Configurator.getFileExtensionToImageMap()[ext];
return FileUtils.getPathToImage(thumbnail);
}
function launchDocument(filename: string) {
let fullPath = FileUtils.getPathToDocument(filename);
console.log(`Attempting to open file: ${fullPath}`);
shell.openItem(fullPath);
}
function launchWebsite(url: string) {
console.log("Attempting to launch " + url)
shell.openItem(url);
}
}

@ -2,13 +2,11 @@ import {DocumentDirectory, FileNode} from "../src/ts_source/fileutils";
const path = require('path');
const chai = require('chai');
const {performance} = require('perf_hooks');
describe('fileutils', () => {
it('DocumentDirectory Constructor fail-on-not-exist', testDocumentDirectoryFailNoExist)
it('DocumentDirectory Constructor fail-on-file', testDocumentDirectoryFailFile)
it('documentDirectoryConstructor - debug', testDocumentDirectoryConstructor);
});
function testDocumentDirectoryFailNoExist() {
@ -26,11 +24,9 @@ function testDocumentDirectoryFailFile() {
}
function testDocumentDirectoryConstructor() {
let directoryPath = path.join(__dirname, "../src/assets/resources");
let start = performance.now()
let directoryPath = path.join(__dirname, "../src/assets/documents");
let documents = new DocumentDirectory(directoryPath);
let end = performance.now()
console.log(documents.getCards());
console.log(`Execution time: ${end-start}ms`)
console.log(documents);
console.log((documents.root.getDirectories()[0].children));
}

Loading…
Cancel
Save