Create Angular version; brought in about pages

This commit is contained in:
Daniel J. Summers 2019-11-09 14:20:21 -06:00
parent 7dc609cf94
commit 083ca12ddf
73 changed files with 9256 additions and 0 deletions

1
.gitignore vendored
View File

@ -14,3 +14,4 @@ selenium-debug.log
*.ntvs* *.ntvs*
*.njsproj *.njsproj
*.sln *.sln
.ionide/

View File

@ -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

46
bit-badger-solutions/.gitignore vendored Normal file
View File

@ -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

View File

@ -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"
}

View File

@ -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'.

View File

@ -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 } }));
}
};

View File

@ -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));
});
});

View File

@ -0,0 +1,11 @@
import { browser, by, element } from 'protractor';
export class AppPage {
navigateTo() {
return browser.get(browser.baseUrl) as Promise<any>;
}
getTitleText() {
return element(by.css('app-root .content span')).getText() as Promise<string>;
}
}

View File

@ -0,0 +1,13 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"outDir": "../out-tsc/e2e",
"module": "commonjs",
"target": "es5",
"types": [
"jasmine",
"jasminewd2",
"node"
]
}
}

View File

@ -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
});
};

View File

@ -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"
}
}

View File

@ -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 { }

View File

@ -0,0 +1,5 @@
<app-header></app-header>
<div id="content">
<router-outlet></router-outlet>
</div>
<app-footer></app-footer>

View File

@ -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!');
});
});

View File

@ -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';
}

View File

@ -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 { }

View File

@ -0,0 +1,12 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
@NgModule({
declarations: [],
imports: [
CommonModule
]
})
export class ApplicationsModule { }

View File

@ -0,0 +1,95 @@
<app-page-title title="Information Publicizing Solutions"></app-page-title>
<article class="content auto">
<h1>Information Publicizing and Blogging</h1>
<p>
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. <a href="https://wordpress.org" title="WordPress">WordPress</a> is one of the most popular
<abbr title="Web Log">blog</abbr>ging platforms in use today; it allows authors to concentrate on the content of
their websites, rather than forcing authors to turn into programmers.
</p>
<h2>Custom-Built Sites</h2>
<ul>
<li>
<p>
We developed and maintained the site for <a href="http://www.emeraldmountainchristianschool.org">Emerald
Mountain Christian School</a>
<small> (<a routerLink="/solutions/emerald-mountain-christian-school" title="Emerald Mountain Christian School | Bit Badger Solutions">about</a>)</small>
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.
</p>
</li>
<li>
<p>
We built and maintained the site for <a href="https://www.summershome.org">Photography by Michelle</a>
<small> (<a routerLink="/solutions/photography-by-michelle" title="Photography by Michelle | Bit Badger Solutions">about</a>)</small>,
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.
</p>
</li>
<li>
<p>
The site for <a href="https://bayvista.org" title="Bay Vista Baptist Church">Bay Vista Baptist Church</a>
<small> (<a routerLink="/solutions/bay-vista" title="Bay Vista Baptist Church | Bit Badger Solutions">about</a>)</small>
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.
</p>
</li>
<li>
<p>
This site is a single-page application (SPA) utilizing the <a href="https://angular.io">Angular</a> 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 <a href="https://github.com/bit-badger/bitbadger.solutions">open source</a> if
you want to see how we did it.)
</p>
</li>
</ul>
<h2>WordPress Design, Customization, and Support</h2>
<ul>
<li>
<p>
We helped <a routerLink="/solutions/cassy-fiano" title="Cassy Fiano | Bit Badger Solutions">Cassy Fiano</a>
and <a routerLink="/solutions/dr-melissa-clouthier" title="Dr. Melissa Clouthier | Bit Badger Solutions">Dr.
Melissa Clouthier</a> both move their blogs from Blogspot to their own domains.
</p>
</li>
<li>
<p>
We migrated <a routerLink="/solutions/liberty-pundits" title="Liberty Pundits">Liberty Pundits</a> 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.
</p>
</li>
<li>
<p>
For <a href="https://www.futilitycloset.com" title="Futility Closet">Futility Closet</a>
<small> (<a routerLink="/solutions/futility-closet" title="Futility Closet | Bit Badger Solutions">about</a>)</small>,
we moved their site from a shared hosting platform to its own <abbr title="Virtual Private Server">VPS</abbr>,
to enable it to handle its ever-increasing traffic.
</p>
</li>
<li>
<p>
<a routerLink="/solutions/tcms" title="TCMS | Bit Badger Solutions">TCMS</a> and
<a routerLink="/solutions/nsx" title="NSXapp | Bit Badger Solutions">NSXapp</a> both used WordPress as their
front end, which also provided a public web presence that the customers could update themselves.
</p>
</li>
</ul>
<p>
On <em><a href="https://blog.bitbadger.solutions" title="The Bit Badger Blog">The Bit Badger Blog</a></em> you can
browse the
<a href="https://blog.bitbadger.solutions/category/wordpress" title="WordPress | The Bit Badger Blog">WordPress</a>
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.
</p>
<p><br><a routerLink="/" title="Home">&laquo; Home</a></p>
</article>

View File

@ -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() { }
}

View File

@ -0,0 +1,14 @@
<app-page-title title="Legacy Data Solutions"></app-page-title>
<article class="content auto">
<h1>Legacy Data Sharing</h1>
<p>
Our background in mainframe applications gives us a knowledgeable perspective on retrieving information from
older, &ldquo;legacy&rdquo; 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.
</p>
<p><br><a routerLink="/" title="Home">&laquo; Home</a></p>
</article>

View File

@ -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() { }
}

View File

@ -0,0 +1,45 @@
<app-page-title title="Process Automation Solutions"></app-page-title>
<article class="content auto">
<h1>Process Automation and User Engagement</h1>
<p>
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 <em>your</em> 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 &ldquo;engagement,&rdquo; we are not
describing intrusive page pop-ups and other <span class="strike">marketing gimmicks</span> web annoyances; we
determine an optimal user experience for <em>your</em> customers, and tailor the solution to work for both of you.
</p>
<p>Several of our solutions fit this description.</p>
<ul>
<li>
<p>
<a routerLink="/solutions/virtual-prayer-room" title="Virtual Prayer Room | Bit Badger Solutions">Virtual
Prayer Room</a> helped the prayer ministry of
<a href="http://www.hoffmantown.org" title="Hoffmantown Church in Albuquerque, NM">Hoffmantown Church</a>
enable their prayer warriors to have access to requests wherever they are, even in their inbox once a day!
</p>
</li>
<li>
<p>
<a routerLink="/solutions/tcms" title="TCMS | Bit Badger Solutions">TCMS</a> was an application that helped
organizations such as <a href="http://www.loveincabq.org">Love INC of South Albuquerque</a> connect people with
needs to people who can help fulfill those needs. TCMS sprung from the
<a href="https://nsx.archive.bitbadger.solutions" title="Not So Extreme Makeover: Community Edition (Archive)">Not
So Extreme Makeover: Community Edition</a> in Albuquerque, New Mexico during spring break 2008; we not only
developed the public presence, but a private system called
<a routerLink="/solutions/nsx" title="NSXapp | Bit Badger Solutions">NSXapp</a> that enabled the management of
the volunteers, families, and things for this massive effort.
</p>
</li>
<li>
<p>
We continue to offer <a href="https://prayer.bitbadger.solutions" title="PrayerTracker">PrayerTracker</a>
<small> (<a routerLink="/solutions/prayer-tracker'" title="PrayerTracker | Bit Badger Solutions">about</a>)</small>,
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.
</p>
</li>
</ul>
<p><br><a routerLink="/" title="Home">&laquo; Home</a></p>
</article>

View File

@ -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() { }
}

View File

@ -0,0 +1,45 @@
<app-page-title title="Web Services and API Solutions"></app-page-title>
<article class="content auto">
<h1>Web Services and APIs</h1>
<p>
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
<em>very</em> useful.
</p>
<p>
An <abbr title="Application Programming Interface">API</abbr> 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.
</p>
<ul>
<li>
<p>
<a routerLink="/solutions/photography-by-michelle" title="Photography by Michelle | Bit Badger Solutions">Photography
by Michelle</a> had a private web API that a desktop application utilized to create the online proof sets right
from the computer where the images resided.
</p>
</li>
<li>
<p>
We
<a href="https://blog.bitbadger.solutions/2010/4040-web-service.html" title="40/40 Web Service | The Bit Badger Blog">wrote
a service</a> for the 2010
<a href="http://erlc.com/4040/" title="40/40 Prayer Vigil | Ethics and Religious Liberty Commission of the Southern Baptist Convention">40/40
Prayer Vigil</a>, which was utilized by several sites to display the current day's (or hour's) prayer focus, and
<a href="https://blog.bitbadger.solutions/2012/4040-web-service-for-2012.html" title="40/40 Web Service for 2012 | The Bit Badger Blog">wrote
one for 2012</a> as well. <em>(As the ERLC does not host these any more, this service is no longer active.)</em>
</p>
</li>
<li>
<p>
<a href="https://prayerjournal.me">myPrayerJournal</a>
<small> (<a routerLink="/solutions/my-prayer-journal" title="myPrayerJournal | Bit Badger Solutions">about</a>)</small>
is a <abbr title="Single Page Application">SPA</abbr> 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.
</p>
</li>
</ul>
<p><br><a routerLink="/" title="Home">&laquo; Home</a></p>
</article>

View File

@ -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() { }
}

View File

@ -0,0 +1,24 @@
<app-page-title title="Why Bit Badger?"></app-page-title>
<article class="content auto">
<h1>Why &ldquo;Bit Badger&rdquo;?</h1>
<p>
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 <em>(thank you for asking)</em>, but his co-workers
thought of another group of genetic mutants &ndash; 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 &ldquo;Bit Badger&rdquo; was mentioned, it was the winner. The Bit Badger's mutant superpower is
the ability to shoot 1s and 0s out its nostrils!
</p>
<p>
Daniel liked this moniker, and decided to run with it. He had been growing dissatisfied with the name &ldquo;DJS
Consulting,&rdquo; 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).
</p>
<p>
Do you have a problem that needs a solution? <a href="mailto:daniel@bitbadger.solutions">Sic the Bit Badger on
it</a>!
</p>
<p><br><a routerLink="/" title="Home">&laquo; Home</a></p>
</article>

View File

@ -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() { }
}

View File

@ -0,0 +1,60 @@
<app-page-title title="Welcome!"></app-page-title>
<div class="home">
<article class="content auto">
<p class="home-lead">Bit Badger Solutions develops the site you need to enable your success!</p>
<p>These solutions can take several different forms.</p>
<h2>Process Automation and User Engagement</h2>
<p>
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.
<a routerLink="/about/process-automation-solutions" title="Process Automation Solutions">Learn more about how
our solutions automate processes and engage users</a>.
</p>
<h2>Information Publicizing and Blogging</h2>
<p>
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.
<a routerLink="/about/information-publicizing-solutions" title="Information Publicizing Solutions">Find out more
about our information publicizing and blogging solutions</a> (including WordPress and statically-generated
sites).
</p>
<h2>Web Services and APIs</h2>
<p>
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.
<a routerLink="/about/web-services-solutions" title="Web Services and API Solutions">Learn about web services,
along with examples of current solutions</a>.
</p>
<h2>Legacy Data Sharing</h2>
<p>
Do you have data that's old &mdash; and by &ldquo;old,&rdquo; we aren&rsquo;t talking &ldquo;iPhone 6&rdquo; old,
we&rsquo;re talking &ldquo;this data
<a href="https://en.wikipedia.org/wiki/Age_of_candidacy#United_States" title="Age of Candidacy (United States) | Wikipedia">could
run for President</a>&rdquo; old? Just because the information is in an older &ldquo;legacy&rdquo; system
doesn&rsquo;t mean it has to stay there.
<a routerLink="/about/legacy-data" title="Legacy Data Sharing Solutions">Learn how our solutions can help get
this data where you and your customers can access it more easily</a>.
</p>
<h2>Why Web-Based?</h2>
<p>Web-based solutions have many advantages:</p>
<ul>
<li><p>They can be used just on a local, private network (an intranet) or on the public Internet.</p></li>
<li><p>They are available to any device connected to the network.</p></li>
<li><p>They require no special software; every device has a browser - which you're using to read this!)</p></li>
<li><p>They can get your most critical needs met first, then evolved and improved over time.</p></li>
</ul>
<h2>What Is a &ldquo;Bit Badger&rdquo;?</h2>
<p>
<a routerLink="/about/why-bit-badger" title="Why Bit Badger?">Read the Bit Badger&rsquo;s origin story</a>.
</p>
<h2>Solutions to Your Problems</h2>
<p>
We&rsquo;d be happy to discuss your information technology needs, and which of our solutions are right for you.
Just <a href="mailto:daniel@bitbadger.solutions">e-mail us</a> and let us know what we can do for you! You can
also <a routerLink="/solutions" title="All Solutions">browse a complete list of our current and previous
solutions</a>.
</p>
</article>
<!-- app-sidebar -->
</div>

View File

@ -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() { }
}

View File

@ -0,0 +1,3 @@
<footer>
A <strong><a routerLink="/home">Bit Badger Solutions</a></strong> original design
</footer>

View File

@ -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

View File

@ -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() { }
}

View File

@ -0,0 +1,20 @@
<header class="site-header">
<div class="header-logo">
<a routerLink="/">
<img src="/assets/bitbadger.png"
alt="A cartoon badger looking at a computer screen, with his paw on a mouse"
title="Bit Badger Solutions">
</a>
</div>
<div class="header-title"><a routerLink="/">Bit Badger Solutions</a></div>
<div class="header-spacer">&nbsp;</div>
<div class="header-social">
<a href="https://twitter.com/Bit_Badger" title="Bit_Badger on Twitter">
<img src="/assets/twitter.png" alt="Twitter">
</a>
&nbsp; &nbsp;
<a href="https://www.facebook.com/bitbadger.solutions" title="Bit Badger Solutions on Facebook">
<img src="/assets/facebook.png" alt="Facebook">
</a>
</div>
</header>

View File

@ -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

View File

@ -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() { }
}

View File

@ -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`)
}
}

View File

@ -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 { }

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,3 @@
export const environment = {
production: true
};

View File

@ -0,0 +1,16 @@
// This file can be replaced during build by using the `fileReplacements` array.
// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.
// The list of file replacements can be found in `angular.json`.
export const environment = {
production: false
};
/*
* For easier debugging in development mode, you can import the following file
* to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
*
* This import should be commented out in production mode because it will have a negative impact
* on performance if an error is thrown.
*/
// import 'zone.js/dist/zone-error'; // Included with Angular CLI.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>BitBadgerSolutions</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
</body>
</html>

View File

@ -0,0 +1,12 @@
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));

View File

@ -0,0 +1,63 @@
/**
* This file includes polyfills needed by Angular and is loaded before the app.
* You can add your own extra polyfills to this file.
*
* This file is divided into 2 sections:
* 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
* 2. Application imports. Files imported after ZoneJS that should be loaded before your main
* file.
*
* The current setup is for so-called "evergreen" browsers; the last versions of browsers that
* automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
* Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
*
* Learn more in https://angular.io/guide/browser-support
*/
/***************************************************************************************************
* BROWSER POLYFILLS
*/
/** IE10 and IE11 requires the following for NgClass support on SVG elements */
// import 'classlist.js'; // Run `npm install --save classlist.js`.
/**
* Web Animations `@angular/platform-browser/animations`
* Only required if AnimationBuilder is used within the application and using IE/Edge or Safari.
* Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0).
*/
// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
/**
* By default, zone.js will patch all possible macroTask and DomEvents
* user can disable parts of macroTask/DomEvents patch by setting following flags
* because those flags need to be set before `zone.js` being loaded, and webpack
* will put import in the top of bundle, so user need to create a separate file
* in this directory (for example: zone-flags.ts), and put the following flags
* into that file, and then add the following code before importing zone.js.
* import './zone-flags.ts';
*
* The flags allowed in zone-flags.ts are listed here.
*
* The following flags will work for all browsers.
*
* (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
* (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
* (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
*
* in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
* with the following flag, it will bypass `zone.js` patch for IE/Edge
*
* (window as any).__Zone_enable_cross_context_check = true;
*
*/
/***************************************************************************************************
* Zone JS is required by default for Angular itself.
*/
import 'zone.js/dist/zone'; // Included with Angular CLI.
/***************************************************************************************************
* APPLICATION IMPORTS
*/

View File

@ -0,0 +1,54 @@
@import url('https://fonts.googleapis.com/css?family=Oswald|Raleway')
html
background-color: lightgray
body
margin: 0px
font-family: "Raleway", "Segoe UI", Ubuntu, Tahoma, "DejaVu Sans", "Liberation Sans", Arial, sans-serif
background-color: #FFFAFA
a
color: navy
text-decoration: none
a:hover
border-bottom: dotted 1px navy
a img
border: 0
acronym
border-bottom: dotted 1px black
header, h1, h2, h3, footer a
font-family: "Oswald", "Segoe UI", Ubuntu, "DejaVu Sans", "Liberation Sans", Arial, sans-serif
h1
text-align: center
margin: 1.4rem 0
font-size: 2rem
h2
margin: 1.2rem 0
h3
margin: 1rem 0
h2, h3
border-bottom: solid 2px navy
@media all and (min-width:40rem)
h2, h3
width: 80%
p
margin: 1rem 0
#content
margin: 0 1rem
.content
font-size: 1.1rem
.auto
margin: 0 auto
@media all and (min-width: 68rem)
.content
width: 66rem
.hdr
font-size: 14pt
font-weight: bold
.strike
text-decoration: line-through
.alignleft
float: left
padding-right: 5px
ul
padding-left: 40px
li
list-style-type: disc

View File

@ -0,0 +1,20 @@
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
import 'zone.js/dist/zone-testing';
import { getTestBed } from '@angular/core/testing';
import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
declare const require: any;
// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);

View File

@ -0,0 +1,18 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/app",
"types": []
},
"files": [
"src/main.ts",
"src/polyfills.ts"
],
"include": [
"src/**/*.ts"
],
"exclude": [
"src/test.ts",
"src/**/*.spec.ts"
]
}

View File

@ -0,0 +1,26 @@
{
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"downlevelIteration": true,
"experimentalDecorators": true,
"module": "esnext",
"moduleResolution": "node",
"importHelpers": true,
"target": "es2015",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2018",
"dom"
]
},
"angularCompilerOptions": {
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true
}
}

View File

@ -0,0 +1,18 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/spec",
"types": [
"jasmine",
"node"
]
},
"files": [
"src/test.ts",
"src/polyfills.ts"
],
"include": [
"src/**/*.spec.ts",
"src/**/*.d.ts"
]
}

View File

@ -0,0 +1,91 @@
{
"extends": "tslint:recommended",
"rules": {
"array-type": false,
"arrow-parens": false,
"deprecation": {
"severity": "warning"
},
"component-class-suffix": true,
"contextual-lifecycle": true,
"directive-class-suffix": true,
"directive-selector": [
true,
"attribute",
"app",
"camelCase"
],
"component-selector": [
true,
"element",
"app",
"kebab-case"
],
"import-blacklist": [
true,
"rxjs/Rx"
],
"interface-name": false,
"max-classes-per-file": false,
"max-line-length": [
true,
140
],
"member-access": false,
"member-ordering": [
true,
{
"order": [
"static-field",
"instance-field",
"static-method",
"instance-method"
]
}
],
"no-consecutive-blank-lines": false,
"no-console": [
true,
"debug",
"info",
"time",
"timeEnd",
"trace"
],
"no-empty": false,
"no-inferrable-types": [
true,
"ignore-params"
],
"no-non-null-assertion": true,
"no-redundant-jsdoc": true,
"no-switch-case-fall-through": true,
"no-var-requires": false,
"object-literal-key-quotes": [
true,
"as-needed"
],
"object-literal-sort-keys": false,
"ordered-imports": false,
"quotemark": [
true,
"single"
],
"trailing-comma": false,
"no-conflicting-lifecycle": true,
"no-host-metadata-property": true,
"no-input-rename": true,
"no-inputs-metadata-property": true,
"no-output-native": true,
"no-output-on-prefix": true,
"no-output-rename": true,
"no-outputs-metadata-property": true,
"template-banana-in-box": true,
"template-no-negated-async": true,
"use-lifecycle-interface": true,
"use-pipe-transform-interface": true
},
"rulesDirectory": [
"codelyzer"
]
}

File diff suppressed because it is too large Load Diff