From 083ca12ddf682851a43d96f019ba377936bbaa58 Mon Sep 17 00:00:00 2001 From: "Daniel J. Summers" Date: Sat, 9 Nov 2019 14:20:21 -0600 Subject: [PATCH] Create Angular version; brought in about pages --- .gitignore | 1 + bit-badger-solutions/.editorconfig | 13 + bit-badger-solutions/.gitignore | 46 + bit-badger-solutions/angular.json | 129 + bit-badger-solutions/browserslist | 12 + bit-badger-solutions/e2e/protractor.conf.js | 32 + bit-badger-solutions/e2e/src/app.e2e-spec.ts | 23 + bit-badger-solutions/e2e/src/app.po.ts | 11 + bit-badger-solutions/e2e/tsconfig.json | 13 + bit-badger-solutions/karma.conf.js | 32 + bit-badger-solutions/package.json | 47 + .../src/app/app-routing.module.ts | 24 + .../src/app/app.component.html | 5 + .../src/app/app.component.sass | 0 .../src/app/app.component.spec.ts | 35 + bit-badger-solutions/src/app/app.component.ts | 10 + bit-badger-solutions/src/app/app.module.ts | 34 + .../app/applications/applications.module.ts | 12 + .../information-publicizing.component.html | 95 + .../information-publicizing.component.ts | 13 + .../pages/about/legacy-data.component.html | 14 + .../app/pages/about/legacy-data.component.ts | 13 + .../about/process-automation.component.html | 45 + .../about/process-automation.component.ts | 13 + .../pages/about/web-services.component.html | 45 + .../app/pages/about/web-services.component.ts | 13 + .../pages/about/why-bit-badger.component.html | 24 + .../pages/about/why-bit-badger.component.ts | 13 + .../src/app/pages/home/home.component.html | 60 + .../src/app/pages/home/home.component.sass | 0 .../src/app/pages/home/home.component.ts | 14 + .../app/shared/footer/footer.component.html | 3 + .../app/shared/footer/footer.component.sass | 10 + .../src/app/shared/footer/footer.component.ts | 14 + .../app/shared/header/header.component.html | 20 + .../app/shared/header/header.component.sass | 31 + .../src/app/shared/header/header.component.ts | 14 + .../src/app/shared/page-title.component.ts | 18 + .../src/app/shared/shared.module.ts | 22 + bit-badger-solutions/src/assets/bitbadger.png | Bin 0 -> 17821 bytes bit-badger-solutions/src/assets/facebook.png | Bin 0 -> 6518 bytes .../src/assets/screenshots/bay-vista.png | Bin 0 -> 55577 bytes .../src/assets/screenshots/cassy-fiano.png | Bin 0 -> 58589 bytes .../screenshots/dr-melissa-clouthier.png | Bin 0 -> 70797 bytes .../emerald-mountain-christian-school.png | Bin 0 -> 71356 bytes .../assets/screenshots/futility-closet.png | Bin 0 -> 92669 bytes .../assets/screenshots/hard-corps-wife.png | Bin 0 -> 71627 bytes .../assets/screenshots/liberty-pundits.png | Bin 0 -> 69306 bytes .../assets/screenshots/mindy-mackenzie.png | Bin 0 -> 38444 bytes .../assets/screenshots/my-prayer-journal.png | Bin 0 -> 52028 bytes .../src/assets/screenshots/nsx.png | Bin 0 -> 47811 bytes .../src/assets/screenshots/olivet-baptist.png | Bin 0 -> 15508 bytes .../screenshots/photography-by-michelle.png | Bin 0 -> 91626 bytes .../src/assets/screenshots/prayer-tracker.png | Bin 0 -> 42936 bytes .../assets/screenshots/riehl-world-news.png | Bin 0 -> 73056 bytes .../src/assets/screenshots/tcms.png | Bin 0 -> 34726 bytes .../src/assets/screenshots/tech-blog.png | Bin 0 -> 61486 bytes .../src/assets/screenshots/the-shark-tank.png | Bin 0 -> 97351 bytes .../screenshots/virtual-prayer-room.png | Bin 0 -> 44572 bytes bit-badger-solutions/src/assets/twitter.png | Bin 0 -> 10348 bytes .../src/environments/environment.prod.ts | 3 + .../src/environments/environment.ts | 16 + bit-badger-solutions/src/favicon.ico | Bin 0 -> 9528 bytes bit-badger-solutions/src/index.html | 13 + bit-badger-solutions/src/main.ts | 12 + bit-badger-solutions/src/polyfills.ts | 63 + bit-badger-solutions/src/styles.sass | 54 + bit-badger-solutions/src/test.ts | 20 + bit-badger-solutions/tsconfig.app.json | 18 + bit-badger-solutions/tsconfig.json | 26 + bit-badger-solutions/tsconfig.spec.json | 18 + bit-badger-solutions/tslint.json | 91 + bit-badger-solutions/yarn.lock | 7949 +++++++++++++++++ 73 files changed, 9256 insertions(+) create mode 100644 bit-badger-solutions/.editorconfig create mode 100644 bit-badger-solutions/.gitignore create mode 100644 bit-badger-solutions/angular.json create mode 100644 bit-badger-solutions/browserslist create mode 100644 bit-badger-solutions/e2e/protractor.conf.js create mode 100644 bit-badger-solutions/e2e/src/app.e2e-spec.ts create mode 100644 bit-badger-solutions/e2e/src/app.po.ts create mode 100644 bit-badger-solutions/e2e/tsconfig.json create mode 100644 bit-badger-solutions/karma.conf.js create mode 100644 bit-badger-solutions/package.json create mode 100644 bit-badger-solutions/src/app/app-routing.module.ts create mode 100644 bit-badger-solutions/src/app/app.component.html create mode 100644 bit-badger-solutions/src/app/app.component.sass create mode 100644 bit-badger-solutions/src/app/app.component.spec.ts create mode 100644 bit-badger-solutions/src/app/app.component.ts create mode 100644 bit-badger-solutions/src/app/app.module.ts create mode 100644 bit-badger-solutions/src/app/applications/applications.module.ts create mode 100644 bit-badger-solutions/src/app/pages/about/information-publicizing.component.html create mode 100644 bit-badger-solutions/src/app/pages/about/information-publicizing.component.ts create mode 100644 bit-badger-solutions/src/app/pages/about/legacy-data.component.html create mode 100644 bit-badger-solutions/src/app/pages/about/legacy-data.component.ts create mode 100644 bit-badger-solutions/src/app/pages/about/process-automation.component.html create mode 100644 bit-badger-solutions/src/app/pages/about/process-automation.component.ts create mode 100644 bit-badger-solutions/src/app/pages/about/web-services.component.html create mode 100644 bit-badger-solutions/src/app/pages/about/web-services.component.ts create mode 100644 bit-badger-solutions/src/app/pages/about/why-bit-badger.component.html create mode 100644 bit-badger-solutions/src/app/pages/about/why-bit-badger.component.ts create mode 100644 bit-badger-solutions/src/app/pages/home/home.component.html create mode 100644 bit-badger-solutions/src/app/pages/home/home.component.sass create mode 100644 bit-badger-solutions/src/app/pages/home/home.component.ts create mode 100644 bit-badger-solutions/src/app/shared/footer/footer.component.html create mode 100644 bit-badger-solutions/src/app/shared/footer/footer.component.sass create mode 100644 bit-badger-solutions/src/app/shared/footer/footer.component.ts create mode 100644 bit-badger-solutions/src/app/shared/header/header.component.html create mode 100644 bit-badger-solutions/src/app/shared/header/header.component.sass create mode 100644 bit-badger-solutions/src/app/shared/header/header.component.ts create mode 100644 bit-badger-solutions/src/app/shared/page-title.component.ts create mode 100644 bit-badger-solutions/src/app/shared/shared.module.ts create mode 100644 bit-badger-solutions/src/assets/bitbadger.png create mode 100644 bit-badger-solutions/src/assets/facebook.png create mode 100644 bit-badger-solutions/src/assets/screenshots/bay-vista.png create mode 100644 bit-badger-solutions/src/assets/screenshots/cassy-fiano.png create mode 100644 bit-badger-solutions/src/assets/screenshots/dr-melissa-clouthier.png create mode 100644 bit-badger-solutions/src/assets/screenshots/emerald-mountain-christian-school.png create mode 100644 bit-badger-solutions/src/assets/screenshots/futility-closet.png create mode 100644 bit-badger-solutions/src/assets/screenshots/hard-corps-wife.png create mode 100644 bit-badger-solutions/src/assets/screenshots/liberty-pundits.png create mode 100644 bit-badger-solutions/src/assets/screenshots/mindy-mackenzie.png create mode 100644 bit-badger-solutions/src/assets/screenshots/my-prayer-journal.png create mode 100644 bit-badger-solutions/src/assets/screenshots/nsx.png create mode 100644 bit-badger-solutions/src/assets/screenshots/olivet-baptist.png create mode 100644 bit-badger-solutions/src/assets/screenshots/photography-by-michelle.png create mode 100644 bit-badger-solutions/src/assets/screenshots/prayer-tracker.png create mode 100644 bit-badger-solutions/src/assets/screenshots/riehl-world-news.png create mode 100644 bit-badger-solutions/src/assets/screenshots/tcms.png create mode 100644 bit-badger-solutions/src/assets/screenshots/tech-blog.png create mode 100644 bit-badger-solutions/src/assets/screenshots/the-shark-tank.png create mode 100644 bit-badger-solutions/src/assets/screenshots/virtual-prayer-room.png create mode 100644 bit-badger-solutions/src/assets/twitter.png create mode 100644 bit-badger-solutions/src/environments/environment.prod.ts create mode 100644 bit-badger-solutions/src/environments/environment.ts create mode 100644 bit-badger-solutions/src/favicon.ico create mode 100644 bit-badger-solutions/src/index.html create mode 100644 bit-badger-solutions/src/main.ts create mode 100644 bit-badger-solutions/src/polyfills.ts create mode 100644 bit-badger-solutions/src/styles.sass create mode 100644 bit-badger-solutions/src/test.ts create mode 100644 bit-badger-solutions/tsconfig.app.json create mode 100644 bit-badger-solutions/tsconfig.json create mode 100644 bit-badger-solutions/tsconfig.spec.json create mode 100644 bit-badger-solutions/tslint.json create mode 100644 bit-badger-solutions/yarn.lock diff --git a/.gitignore b/.gitignore index 4105b14..e84673b 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ selenium-debug.log *.ntvs* *.njsproj *.sln +.ionide/ diff --git a/bit-badger-solutions/.editorconfig b/bit-badger-solutions/.editorconfig new file mode 100644 index 0000000..e89330a --- /dev/null +++ b/bit-badger-solutions/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/bit-badger-solutions/.gitignore b/bit-badger-solutions/.gitignore new file mode 100644 index 0000000..86d943a --- /dev/null +++ b/bit-badger-solutions/.gitignore @@ -0,0 +1,46 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/bit-badger-solutions/angular.json b/bit-badger-solutions/angular.json new file mode 100644 index 0000000..728b1f9 --- /dev/null +++ b/bit-badger-solutions/angular.json @@ -0,0 +1,129 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "bit-badger-solutions": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "sass" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/bit-badger-solutions", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "aot": false, + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.sass" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "6kb", + "maximumError": "10kb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "bit-badger-solutions:build" + }, + "configurations": { + "production": { + "browserTarget": "bit-badger-solutions:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "bit-badger-solutions:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.sass" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "tsconfig.spec.json", + "e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "bit-badger-solutions:serve" + }, + "configurations": { + "production": { + "devServerTarget": "bit-badger-solutions:serve:production" + } + } + } + } + }}, + "defaultProject": "bit-badger-solutions" +} \ No newline at end of file diff --git a/bit-badger-solutions/browserslist b/bit-badger-solutions/browserslist new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/bit-badger-solutions/browserslist @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/bit-badger-solutions/e2e/protractor.conf.js b/bit-badger-solutions/e2e/protractor.conf.js new file mode 100644 index 0000000..7c798cf --- /dev/null +++ b/bit-badger-solutions/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + browserName: 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/bit-badger-solutions/e2e/src/app.e2e-spec.ts b/bit-badger-solutions/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..a122d6e --- /dev/null +++ b/bit-badger-solutions/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('bit-badger-solutions app is running!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/bit-badger-solutions/e2e/src/app.po.ts b/bit-badger-solutions/e2e/src/app.po.ts new file mode 100644 index 0000000..b8498c2 --- /dev/null +++ b/bit-badger-solutions/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root .content span')).getText() as Promise; + } +} diff --git a/bit-badger-solutions/e2e/tsconfig.json b/bit-badger-solutions/e2e/tsconfig.json new file mode 100644 index 0000000..39b800f --- /dev/null +++ b/bit-badger-solutions/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/bit-badger-solutions/karma.conf.js b/bit-badger-solutions/karma.conf.js new file mode 100644 index 0000000..1770437 --- /dev/null +++ b/bit-badger-solutions/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, './coverage/bit-badger-solutions'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/bit-badger-solutions/package.json b/bit-badger-solutions/package.json new file mode 100644 index 0000000..7844333 --- /dev/null +++ b/bit-badger-solutions/package.json @@ -0,0 +1,47 @@ +{ + "name": "bit-badger-solutions", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "~8.2.13", + "@angular/common": "~8.2.13", + "@angular/compiler": "~8.2.13", + "@angular/core": "~8.2.13", + "@angular/forms": "~8.2.13", + "@angular/platform-browser": "~8.2.13", + "@angular/platform-browser-dynamic": "~8.2.13", + "@angular/router": "~8.2.13", + "rxjs": "~6.4.0", + "tslib": "^1.10.0", + "zone.js": "~0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~0.803.18", + "@angular/cli": "~8.3.18", + "@angular/compiler-cli": "~8.2.13", + "@angular/language-service": "~8.2.13", + "@types/node": "~8.9.4", + "@types/jasmine": "~3.3.8", + "@types/jasminewd2": "~2.0.3", + "codelyzer": "^5.0.0", + "jasmine-core": "~3.4.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~4.1.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.4.0", + "protractor": "~5.4.0", + "ts-node": "~7.0.0", + "tslint": "~5.15.0", + "typescript": "~3.5.3" + } +} diff --git a/bit-badger-solutions/src/app/app-routing.module.ts b/bit-badger-solutions/src/app/app-routing.module.ts new file mode 100644 index 0000000..b144d4e --- /dev/null +++ b/bit-badger-solutions/src/app/app-routing.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core' +import { Routes, RouterModule } from '@angular/router' + +import { HomeComponent } from './pages/home/home.component' +import { InformationPublicizingComponent } from './pages/about/information-publicizing.component' +import { LegacyDataComponent } from './pages/about/legacy-data.component' +import { ProcessAutomationComponent } from './pages/about/process-automation.component' +import { WebServicesComponent } from './pages/about/web-services.component' +import { WhyBitBadgerComponent } from './pages/about/why-bit-badger.component' + +const routes: Routes = [ + { path: '', component: HomeComponent }, + { path: 'about/information-publicizing-solutions', component: InformationPublicizingComponent }, + { path: 'about/legacy-data', component: LegacyDataComponent }, + { path: 'about/process-automation-solutions', component: ProcessAutomationComponent }, + { path: 'about/web-services-solutions', component: WebServicesComponent }, + { path: 'about/why-bit-badger', component: WhyBitBadgerComponent } +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule] +}) +export class AppRoutingModule { } diff --git a/bit-badger-solutions/src/app/app.component.html b/bit-badger-solutions/src/app/app.component.html new file mode 100644 index 0000000..bc7ad65 --- /dev/null +++ b/bit-badger-solutions/src/app/app.component.html @@ -0,0 +1,5 @@ + +
+ +
+ diff --git a/bit-badger-solutions/src/app/app.component.sass b/bit-badger-solutions/src/app/app.component.sass new file mode 100644 index 0000000..e69de29 diff --git a/bit-badger-solutions/src/app/app.component.spec.ts b/bit-badger-solutions/src/app/app.component.spec.ts new file mode 100644 index 0000000..6f4e26b --- /dev/null +++ b/bit-badger-solutions/src/app/app.component.spec.ts @@ -0,0 +1,35 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule + ], + declarations: [ + AppComponent + ], + }).compileComponents(); + })); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have as title 'bit-badger-solutions'`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('bit-badger-solutions'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('.content span').textContent).toContain('bit-badger-solutions app is running!'); + }); +}); diff --git a/bit-badger-solutions/src/app/app.component.ts b/bit-badger-solutions/src/app/app.component.ts new file mode 100644 index 0000000..34dc164 --- /dev/null +++ b/bit-badger-solutions/src/app/app.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.sass'] +}) +export class AppComponent { + title = 'bit-badger-solutions'; +} diff --git a/bit-badger-solutions/src/app/app.module.ts b/bit-badger-solutions/src/app/app.module.ts new file mode 100644 index 0000000..7ee9b64 --- /dev/null +++ b/bit-badger-solutions/src/app/app.module.ts @@ -0,0 +1,34 @@ +import { BrowserModule } from '@angular/platform-browser' +import { NgModule } from '@angular/core' + +import { AppRoutingModule } from './app-routing.module' +import { AppComponent } from './app.component' +import { ApplicationsModule } from './applications/applications.module' +import { SharedModule } from './shared/shared.module'; +import { HomeComponent } from './pages/home/home.component'; +import { WhyBitBadgerComponent } from './pages/about/why-bit-badger.component'; +import { InformationPublicizingComponent } from './pages/about/information-publicizing.component'; +import { LegacyDataComponent } from './pages/about/legacy-data.component'; +import { ProcessAutomationComponent } from './pages/about/process-automation.component'; +import { WebServicesComponent } from './pages/about/web-services.component' + +@NgModule({ + declarations: [ + AppComponent, + HomeComponent, + WhyBitBadgerComponent, + InformationPublicizingComponent, + LegacyDataComponent, + ProcessAutomationComponent, + WebServicesComponent + ], + imports: [ + BrowserModule, + AppRoutingModule, + ApplicationsModule, + SharedModule + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/bit-badger-solutions/src/app/applications/applications.module.ts b/bit-badger-solutions/src/app/applications/applications.module.ts new file mode 100644 index 0000000..096f62b --- /dev/null +++ b/bit-badger-solutions/src/app/applications/applications.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + + + +@NgModule({ + declarations: [], + imports: [ + CommonModule + ] +}) +export class ApplicationsModule { } diff --git a/bit-badger-solutions/src/app/pages/about/information-publicizing.component.html b/bit-badger-solutions/src/app/pages/about/information-publicizing.component.html new file mode 100644 index 0000000..27cbc7d --- /dev/null +++ b/bit-badger-solutions/src/app/pages/about/information-publicizing.component.html @@ -0,0 +1,95 @@ + +
+

Information Publicizing and Blogging

+

+ In the early days of the World Wide Web, it was known as the "information superhighway." From its inception, the + web's primary goal is information. The open nature of the Internet allows anyone, anywhere to say anything, + provided they can connect a machine to the network. In fact, there are software products to handle everything + except creating the content; all you have to bring is the ability to form a coherent thought, and type that + thought into a box. WordPress is one of the most popular + blogging platforms in use today; it allows authors to concentrate on the content of + their websites, rather than forcing authors to turn into programmers. +

+

Custom-Built Sites

+
    +
  • +

    + We developed and maintained the site for Emerald + Mountain Christian School + (about) + for 9 years, where they had information about the type of curriculum they teach, the school's 40+-year history, + a calendar of events, and how to get more information. +

    +
  • +
  • +

    + We built and maintained the site for Photography by Michelle + (about), + which had information, prices, and samples of the photographer's work, as well as the ability for customers to + view proofs and make photo selections online. +

    +
  • +
  • +

    + The site for Bay Vista Baptist Church + (about) + utilizes a "static site generator," where the entire site is generated from source files, then served. It + requires no back-end database, which means that the server can send pages as fast as its clients can take them. + This site even has a generated podcast feed! Adding content to these types of sites requires a bit more + technical knowledge beyond "typing text in a box," but it is a great way to build ultra-fast, scalable web + sites. +

    +
  • +
  • +

    + This site is a single-page application (SPA) utilizing the Angular JavaScript + framework. The application pages are generated based on an internal data set, and the other pages are simple + text components. Its bundling means that the initial page is small, and after the initial load, it runs + entirely in the browser or on a phone or tablet. Sites that reference external data sets would still need to + access the Internet to retrieve data, but this is much more efficient than having to download the entire page + every single click. (It's even open source if + you want to see how we did it.) +

    +
  • +
+

WordPress Design, Customization, and Support

+
    +
  • +

    + We helped Cassy Fiano + and Dr. + Melissa Clouthier both move their blogs from Blogspot to their own domains. +

    +
  • +
  • +

    + We migrated Liberty Pundits from a + custom blog platform to WordPress, and set up and maintained their server, which routinely cleared 100,000 + hits per day in its prime. +

    +
  • +
  • +

    + For Futility Closet + (about), + we moved their site from a shared hosting platform to its own VPS, + to enable it to handle its ever-increasing traffic. +

    +
  • +
  • +

    + TCMS and + NSXapp both used WordPress as their + front end, which also provided a public web presence that the customers could update themselves. +

    +
  • +
+

+ On The Bit Badger Blog you can + browse the + WordPress + category for information on plug-ins, and we have supported theme customizations for nearly all of the WordPress + sites linked on the sidebar/footer of the home page. +

+


« Home

+
diff --git a/bit-badger-solutions/src/app/pages/about/information-publicizing.component.ts b/bit-badger-solutions/src/app/pages/about/information-publicizing.component.ts new file mode 100644 index 0000000..3023455 --- /dev/null +++ b/bit-badger-solutions/src/app/pages/about/information-publicizing.component.ts @@ -0,0 +1,13 @@ +import { Component, OnInit } from '@angular/core' + +@Component({ + selector: 'app-information-publicizing', + templateUrl: './information-publicizing.component.html' +}) +export class InformationPublicizingComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/bit-badger-solutions/src/app/pages/about/legacy-data.component.html b/bit-badger-solutions/src/app/pages/about/legacy-data.component.html new file mode 100644 index 0000000..e8d0049 --- /dev/null +++ b/bit-badger-solutions/src/app/pages/about/legacy-data.component.html @@ -0,0 +1,14 @@ + +
+

Legacy Data Sharing

+

+ Our background in mainframe applications gives us a knowledgeable perspective on retrieving information from + older, “legacy” systems. This data can be migrated to a more modern relational or document database, + where a web application can retrieve the information; in some cases, the data can even be exposed as a web service + in place. These types of systems are often a great way for companies to expose their data to their customers, + without having to move their day-to-day system from its current environment. While we currently have no active + projects along these lines, our developers have done them in the past for other organizations; sadly, none can be + linked publicly. +

+


« Home

+
diff --git a/bit-badger-solutions/src/app/pages/about/legacy-data.component.ts b/bit-badger-solutions/src/app/pages/about/legacy-data.component.ts new file mode 100644 index 0000000..1316c5f --- /dev/null +++ b/bit-badger-solutions/src/app/pages/about/legacy-data.component.ts @@ -0,0 +1,13 @@ +import { Component, OnInit } from '@angular/core' + +@Component({ + selector: 'app-legacy-data', + templateUrl: './legacy-data.component.html' +}) +export class LegacyDataComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/bit-badger-solutions/src/app/pages/about/process-automation.component.html b/bit-badger-solutions/src/app/pages/about/process-automation.component.html new file mode 100644 index 0000000..c1f6965 --- /dev/null +++ b/bit-badger-solutions/src/app/pages/about/process-automation.component.html @@ -0,0 +1,45 @@ + +
+

Process Automation and User Engagement

+

+ Computers can be used to augment or automate nearly any process; could you think of generating bank statements, + processing mailing lists, or tracking orders without some form of automation? We develop web-based solutions to + automate your processes, ensuring that your business constraints are satisfied; these systems can run on + the Internet or your private network. For Internet-facing solutions, we engineer solutions that allow them to + interact with you securely, presented in an engaging manner. And, by “engagement,” we are not + describing intrusive page pop-ups and other marketing gimmicks web annoyances; we + determine an optimal user experience for your customers, and tailor the solution to work for both of you. +

+

Several of our solutions fit this description.

+
    +
  • +

    + Virtual + Prayer Room helped the prayer ministry of + Hoffmantown Church + enable their prayer warriors to have access to requests wherever they are, even in their inbox once a day! +

    +
  • +
  • +

    + TCMS was an application that helped + organizations such as Love INC of South Albuquerque connect people with + needs to people who can help fulfill those needs. TCMS sprung from the + Not + So Extreme Makeover: Community Edition in Albuquerque, New Mexico during spring break 2008; we not only + developed the public presence, but a private system called + NSXapp that enabled the management of + the volunteers, families, and things for this massive effort. +

    +
  • +
  • +

    + We continue to offer PrayerTracker + (about), + a free-to-use web application that helps Sunday School classes (or other small groups) generate a prayer + request list; it provides a central place for list management and continuity. +

    +
  • +
+


« Home

+
diff --git a/bit-badger-solutions/src/app/pages/about/process-automation.component.ts b/bit-badger-solutions/src/app/pages/about/process-automation.component.ts new file mode 100644 index 0000000..ed4300b --- /dev/null +++ b/bit-badger-solutions/src/app/pages/about/process-automation.component.ts @@ -0,0 +1,13 @@ +import { Component, OnInit } from '@angular/core' + +@Component({ + selector: 'app-process-automation', + templateUrl: './process-automation.component.html' +}) +export class ProcessAutomationComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/bit-badger-solutions/src/app/pages/about/web-services.component.html b/bit-badger-solutions/src/app/pages/about/web-services.component.html new file mode 100644 index 0000000..37e215a --- /dev/null +++ b/bit-badger-solutions/src/app/pages/about/web-services.component.html @@ -0,0 +1,45 @@ + +
+

Web Services and APIs

+

+ A web service is a way of using the Internet to provide or accept information that makes sense to computers; this + allows other sites or applications to consume information from, or provide information to, your service. This + enables communication between applications, without having to establish any communication channels other than the + ones that web browsers already use. It isn't the best fit for every application, but when it is useful, it is + very useful. +

+

+ An API can be a synonym for a web service, but it can also + be a generally accessible way of providing data. For example, Twitter has a public API, which other applications + can use to display tweets on their site. +

+
    +
  • +

    + Photography + by Michelle had a private web API that a desktop application utilized to create the online proof sets right + from the computer where the images resided. +

    +
  • +
  • +

    + We + wrote + a service for the 2010 + 40/40 + Prayer Vigil, which was utilized by several sites to display the current day's (or hour's) prayer focus, and + wrote + one for 2012 as well. (As the ERLC does not host these any more, this service is no longer active.) +

    +
  • +
  • +

    + myPrayerJournal + (about) + is a SPA which only downloads the structure of the site the first + time you go there, then utilizes a stateless API to access data from the browser. +

    +
  • +
+


« Home

+
diff --git a/bit-badger-solutions/src/app/pages/about/web-services.component.ts b/bit-badger-solutions/src/app/pages/about/web-services.component.ts new file mode 100644 index 0000000..ac2e852 --- /dev/null +++ b/bit-badger-solutions/src/app/pages/about/web-services.component.ts @@ -0,0 +1,13 @@ +import { Component, OnInit } from '@angular/core' + +@Component({ + selector: 'app-web-services', + templateUrl: './web-services.component.html' +}) +export class WebServicesComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/bit-badger-solutions/src/app/pages/about/why-bit-badger.component.html b/bit-badger-solutions/src/app/pages/about/why-bit-badger.component.html new file mode 100644 index 0000000..74a1b7a --- /dev/null +++ b/bit-badger-solutions/src/app/pages/about/why-bit-badger.component.html @@ -0,0 +1,24 @@ + +
+

Why “Bit Badger”?

+

+ A while back, our primary developer Daniel learned through genetic testing that he had one gene that was not right + (technically known as a genetic mutation). He is currently fine (thank you for asking), but his co-workers + thought of another group of genetic mutants – the X-Men. They wanted to develop the mutant identity for him + in that style; since Wolverine is already taken, they wanted something similar, but based on a member of the weasel + family (for its normal private life and fierce tenacity, not its morals). They went through several different + options, but when “Bit Badger” was mentioned, it was the winner. The Bit Badger's mutant superpower is + the ability to shoot 1s and 0s out its nostrils! +

+

+ Daniel liked this moniker, and decided to run with it. He had been growing dissatisfied with the name “DJS + Consulting,” as he felt that name was passive. He enjoys taking problems and finding creative solutions for + them, making our computers work for us instead of the other way around. While he can't actually breathe out 1s and + 0s, they do flow from his fingers (in groups of 8, of course). +

+

+ Do you have a problem that needs a solution? Sic the Bit Badger on + it! +

+


« Home

+
diff --git a/bit-badger-solutions/src/app/pages/about/why-bit-badger.component.ts b/bit-badger-solutions/src/app/pages/about/why-bit-badger.component.ts new file mode 100644 index 0000000..d1d1414 --- /dev/null +++ b/bit-badger-solutions/src/app/pages/about/why-bit-badger.component.ts @@ -0,0 +1,13 @@ +import { Component, OnInit } from '@angular/core' + +@Component({ + selector: 'app-why-bit-badger', + templateUrl: './why-bit-badger.component.html' +}) +export class WhyBitBadgerComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/bit-badger-solutions/src/app/pages/home/home.component.html b/bit-badger-solutions/src/app/pages/home/home.component.html new file mode 100644 index 0000000..3b9fdab --- /dev/null +++ b/bit-badger-solutions/src/app/pages/home/home.component.html @@ -0,0 +1,60 @@ + +
+
+

Bit Badger Solutions develops the site you need to enable your success!

+

These solutions can take several different forms.

+

Process Automation and User Engagement

+

+ Do you have a process that requires recording the same thing multiple times? Do you have information in different + places, but you need it all together? This solution is for you. + Learn more about how + our solutions automate processes and engage users. +

+

Information Publicizing and Blogging

+

+ From its inception, the Web has been about information. Do you need to get information out about an upcoming + event? Are you wanting to start blogging, or breathe some fresh life into an existing blog? Those are but a few + of the problems that this solution solves. + Find out more + about our information publicizing and blogging solutions (including WordPress and statically-generated + sites). +

+

Web Services and APIs

+

+ Do you have a need for multiple computers to talk to each other? Do you have an interesting data set that you want + to make available to the public? A web service or API may be just the solution for you. + Learn about web services, + along with examples of current solutions. +

+

Legacy Data Sharing

+

+ Do you have data that's old — and by “old,” we aren’t talking “iPhone 6” old, + we’re talking “this data + could + run for President” old? Just because the information is in an older “legacy” system + doesn’t mean it has to stay there. + Learn how our solutions can help get + this data where you and your customers can access it more easily. +

+

Why Web-Based?

+

Web-based solutions have many advantages:

+
    +
  • They can be used just on a local, private network (an intranet) or on the public Internet.

  • +
  • They are available to any device connected to the network.

  • +
  • They require no special software; every device has a browser - which you're using to read this!)

  • +
  • They can get your most critical needs met first, then evolved and improved over time.

  • +
+

What Is a “Bit Badger”?

+

+ Read the Bit Badger’s origin story. +

+

Solutions to Your Problems

+

+ We’d be happy to discuss your information technology needs, and which of our solutions are right for you. + Just e-mail us and let us know what we can do for you! You can + also browse a complete list of our current and previous + solutions. +

+
+ +
\ No newline at end of file diff --git a/bit-badger-solutions/src/app/pages/home/home.component.sass b/bit-badger-solutions/src/app/pages/home/home.component.sass new file mode 100644 index 0000000..e69de29 diff --git a/bit-badger-solutions/src/app/pages/home/home.component.ts b/bit-badger-solutions/src/app/pages/home/home.component.ts new file mode 100644 index 0000000..eb29459 --- /dev/null +++ b/bit-badger-solutions/src/app/pages/home/home.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core' + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.sass'] +}) +export class HomeComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/bit-badger-solutions/src/app/shared/footer/footer.component.html b/bit-badger-solutions/src/app/shared/footer/footer.component.html new file mode 100644 index 0000000..5aa5d83 --- /dev/null +++ b/bit-badger-solutions/src/app/shared/footer/footer.component.html @@ -0,0 +1,3 @@ + diff --git a/bit-badger-solutions/src/app/shared/footer/footer.component.sass b/bit-badger-solutions/src/app/shared/footer/footer.component.sass new file mode 100644 index 0000000..0107029 --- /dev/null +++ b/bit-badger-solutions/src/app/shared/footer/footer.component.sass @@ -0,0 +1,10 @@ +footer + padding: 20px 15px 10px 15px + text-align: right + font-size: 1rem + color: black + clear: both + background-image: linear-gradient(to bottom, #FFFAFA, lightgray) +footer a:link, footer a:visited + color: black + \ No newline at end of file diff --git a/bit-badger-solutions/src/app/shared/footer/footer.component.ts b/bit-badger-solutions/src/app/shared/footer/footer.component.ts new file mode 100644 index 0000000..85d8fb2 --- /dev/null +++ b/bit-badger-solutions/src/app/shared/footer/footer.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core' + +@Component({ + selector: 'app-footer', + templateUrl: './footer.component.html', + styleUrls: ['./footer.component.sass'] +}) +export class FooterComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/bit-badger-solutions/src/app/shared/header/header.component.html b/bit-badger-solutions/src/app/shared/header/header.component.html new file mode 100644 index 0000000..41f14d1 --- /dev/null +++ b/bit-badger-solutions/src/app/shared/header/header.component.html @@ -0,0 +1,20 @@ + diff --git a/bit-badger-solutions/src/app/shared/header/header.component.sass b/bit-badger-solutions/src/app/shared/header/header.component.sass new file mode 100644 index 0000000..ef5e413 --- /dev/null +++ b/bit-badger-solutions/src/app/shared/header/header.component.sass @@ -0,0 +1,31 @@ +.site-header + height: 100px + display: flex + flex-direction: row + justify-content: space-between + background-image: linear-gradient(to bottom, lightgray, #FFFAFA) +.site-header a, .site-header a:visited + color: black +.site-header a:hover + border-bottom: none +.header-title + font-size: 3rem + font-weight: bold + line-height: 100px + text-align: center +.header-spacer + flex-grow: 3 +.header-social + padding: 25px .8rem 0 0 +.header-social img + width: 50px + height: 50px +@media all and (max-width:40rem) + .site-header + height: auto + flex-direction: column + align-items: center + .header-title + line-height: 3rem + .header-spacer + display: none diff --git a/bit-badger-solutions/src/app/shared/header/header.component.ts b/bit-badger-solutions/src/app/shared/header/header.component.ts new file mode 100644 index 0000000..c51481f --- /dev/null +++ b/bit-badger-solutions/src/app/shared/header/header.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core' + +@Component({ + selector: 'app-header', + templateUrl: './header.component.html', + styleUrls: ['./header.component.sass'] +}) +export class HeaderComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/bit-badger-solutions/src/app/shared/page-title.component.ts b/bit-badger-solutions/src/app/shared/page-title.component.ts new file mode 100644 index 0000000..24be594 --- /dev/null +++ b/bit-badger-solutions/src/app/shared/page-title.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit, Input } from '@angular/core' +import { Title } from '@angular/platform-browser' + +@Component({ + selector: 'app-page-title', + template: '' +}) +export class PageTitleComponent implements OnInit { + + @Input() title: string + + constructor(private titleService: Title) { } + + ngOnInit() { + this.titleService.setTitle(`${this.title} « Bit Badger Solutions`) + } + +} diff --git a/bit-badger-solutions/src/app/shared/shared.module.ts b/bit-badger-solutions/src/app/shared/shared.module.ts new file mode 100644 index 0000000..d7c8fc0 --- /dev/null +++ b/bit-badger-solutions/src/app/shared/shared.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { HeaderComponent } from './header/header.component' +import { FooterComponent } from './footer/footer.component'; +import { PageTitleComponent } from './page-title.component' + +@NgModule({ + declarations: [ + HeaderComponent, + FooterComponent, + PageTitleComponent + ], + imports: [ + CommonModule + ], + exports: [ + HeaderComponent, + FooterComponent, + PageTitleComponent + ] +}) +export class SharedModule { } diff --git a/bit-badger-solutions/src/assets/bitbadger.png b/bit-badger-solutions/src/assets/bitbadger.png new file mode 100644 index 0000000000000000000000000000000000000000..62f8d7638d8e71d53a97a7551968a7919c3cd081 GIT binary patch literal 17821 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