Compare commits

..

No commits in common. "master" and "MissionaryForm" have entirely different histories.

121 changed files with 213 additions and 16147 deletions

View File

@ -1,3 +0,0 @@
node_modules
.git
.gitignore

View File

@ -29,14 +29,6 @@
"scripts": []
},
"configurations": {
"test": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.test.ts"
}
]
},
"production": {
"fileReplacements": [
{

13104
Client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -21,11 +21,8 @@
"@angular/platform-browser": "~7.2.0",
"@angular/platform-browser-dynamic": "~7.2.0",
"@angular/router": "~7.2.0",
"chart.js": "^2.9.3",
"chartjs-plugin-datalabels": "^0.7.0",
"core-js": "^2.5.4",
"hammerjs": "^2.0.8",
"luxon": "^1.22.0",
"rxjs": "~6.3.3",
"tslib": "^1.9.0",
"zone.js": "~0.8.26"
@ -38,7 +35,6 @@
"@types/jasmine": "~2.8.8",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~8.9.4",
"@types/chart.js": "^2.9.7",
"codelyzer": "~4.5.0",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",

View File

@ -14,14 +14,6 @@ import { CampPageComponent } from './components/camp-page/camp-page.component';
import { MembersPageComponent } from './components/members-page/members-page.component';
import { AddTransactionPageComponent } from './components/add-transaction-page/add-transaction-page.component';
import { MissionaryFormPageComponent } from './components/missionary-form-page/missionary-form-page.component';
import { ContributorYearlyReportComponent } from './components/contributor-yearly-report/contributor-yearly-report.component';
import { ContributorAllReportsComponent } from './components/contributor-all-reports/contributor-all-reports.component';
import { LiveStreamComponent } from './components/live-stream/live-stream.component';
import { VideoServicesComponent } from './components/video-services/video-services.component';
import { ImageComponent } from './components/image/image.component';
import { VideoComponent } from './components/video/video.component';
import { FCCPermitPageComponent } from './components/fcc-permit-page/fcc-permit-page.component';
import { BalloonComponent } from './components/balloon/balloon.component';
const routes =
[
@ -53,10 +45,6 @@ const routes =
path: 'sermons',
component: SermonsComponent
},
{
path: 'video',
component: VideoComponent
},
{
path: 'sermons/:id',
component: SermonsComponent
@ -81,45 +69,13 @@ const routes =
path: 'user',
component: MembersPageComponent
},
{
path: 'covid',
component: ImageComponent,
data: {
imageUrl: 'assets/images/tiny/covid_tract.jpg',
shareName: 'covid'
}
},
{
path: 'covid2',
component: ImageComponent,
data: {
imageUrl: 'assets/images/tiny/covid_tract_2.jpg',
shareName: 'covid2'
}
},
{
path: 'camp',
component: CampPageComponent
},
{
path: 'live',
component: LiveStreamComponent
},
{
path: 'transactions/add',
component: AddTransactionPageComponent
},
{
path: 'contributor/report',
component: ContributorAllReportsComponent
},
{
path: 'fmpermit',
component: FCCPermitPageComponent
},
{
path: 'balloon',
component: BalloonComponent
}
]

View File

@ -3,7 +3,6 @@ import { GoogleAnalyticsService } from './services/google-analytics.service';
import { WindowRefService } from './services/window-ref.service';
import { EmailService } from './services/email.service';
import { SermonService } from './services/sermon.service';
import { PrintService } from './services/print-service';
import { LoginService } from './services/login.service';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
@ -17,8 +16,7 @@ import { MatButtonModule,
MatSelectModule,
MatOptionModule,
MatRadioModule,
MatAutocompleteModule,
MatCheckboxModule} from '@angular/material';
MatAutocompleteModule} from '@angular/material';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import 'hammerjs';
@ -53,8 +51,6 @@ import { EventLargeComponent } from './components/event-large/event-large.compon
import { SalvationPageComponent } from './components/salvation-page/salvation-page.component';
import { MediaPageComponent } from './components/media-page/media-page.component';
import { VideoPopupComponent } from './components/popups/video-popup/video-popup.component';
import { FCCPermitPageComponent } from './components/fcc-permit-page/fcc-permit-page.component';
import { BalloonComponent } from './components/balloon/balloon.component';
//Directives
import { FadeInOnScrollDirective } from './directives/fade-in-on-scroll.directive';
@ -76,17 +72,6 @@ import { AddTransactionPageComponent } from './components/add-transaction-page/a
import { AddTransactionPopupComponent } from './components/add-transaction-page/add-transaction-popup/add-transaction-popup.component';
import { MissionaryFormPageComponent } from './components/missionary-form-page/missionary-form-page.component';
import { MissionarySupportService } from './services/missionary-support-service';
import { ContributorYearlyReportComponent } from './components/contributor-yearly-report/contributor-yearly-report.component';
import { ContributorAllReportsComponent } from './components/contributor-all-reports/contributor-all-reports.component';
import { LiveStreamComponent } from './components/live-stream/live-stream.component';
import { VideoServicesComponent } from './components/video-services/video-services.component';
import { ImageComponent } from './components/image/image.component';
import { YoutubeListComponent } from './components/youtube-list/youtube-list.component';
import { VideoComponent } from './components/video/video.component';
import { YoutubeListService } from './components/youtube-list/youtube-list-service';
import { VideoItemComponent } from './components/video-item/video-item.component';
import { YoutubePopupComponent } from './components/popups/youtube-popup/youtube-popup.component';
@ -111,7 +96,6 @@ import { YoutubePopupComponent } from './components/popups/youtube-popup/youtube
DurationPipe,
LocationComponent,
SermonLargeComponent,
VideoServicesComponent,
AddSermonPopupComponent,
LoginPopupComponent,
OkPopupComponent,
@ -130,20 +114,10 @@ import { YoutubePopupComponent } from './components/popups/youtube-popup/youtube
VideoPopupComponent,
CampPageComponent,
MembersPageComponent,
FCCPermitPageComponent,
BalloonComponent,
AddUserPopupComponent,
AddTransactionPageComponent,
AddTransactionPopupComponent,
MissionaryFormPageComponent,
ContributorYearlyReportComponent,
ContributorAllReportsComponent,
LiveStreamComponent,
ImageComponent,
YoutubeListComponent,
VideoComponent,
VideoItemComponent,
YoutubePopupComponent
MissionaryFormPageComponent
],
imports: [
BrowserModule,
@ -161,10 +135,9 @@ import { YoutubePopupComponent } from './components/popups/youtube-popup/youtube
MatSnackBarModule,
MatDialogModule,
MatAutocompleteModule,
MatRadioModule,
MatCheckboxModule
MatRadioModule
],
providers: [LoginService,PrintService,UserService,GoogleAnalyticsService,SermonService,TransactionService,EventService,EmailService,MissionarySupportService,YoutubeListService,WindowRefService],
providers: [LoginService,UserService,GoogleAnalyticsService,SermonService,TransactionService,EventService,EmailService,MissionarySupportService,WindowRefService],
entryComponents: [AddSermonPopupComponent,
LoginPopupComponent,
OkPopupComponent,
@ -175,8 +148,7 @@ import { YoutubePopupComponent } from './components/popups/youtube-popup/youtube
AddEventPopupComponent,
AddUserPopupComponent,
VideoPopupComponent,
AddTransactionPopupComponent,
YoutubePopupComponent],
AddTransactionPopupComponent],
bootstrap: [AppComponent]
})
export class AppModule { }

View File

@ -2,7 +2,7 @@
border: 0;
}
.fab-buttons {
.fab-buttons{
display: none;
}

View File

@ -6,13 +6,12 @@
<table>
<tbody>
<ng-container *ngFor="let c of contributions; let ci = index">
<tr [class.bg-red]="!contributorDatesMatch(c.contributorId)">
<tr>
<td colspan="2" class="fw-bold fs-1-2-5">{{c.date}}</td>
<td colspan="4" class="fw-bold fs-1-2-5">{{contributorName(c.contributorId)}}</td>
<td colspan="3" class="fw-bold fs-1-2-5">{{contributorName(c.contributorId)}}</td>
</tr>
<tr>
<td></td>
<td class="fw-bold">Date</td>
<td class="fw-bold">Type</td>
<td class="fw-bold">Check</td>
<td class="fw-bold">Fund</td>
@ -23,11 +22,10 @@
<td rowspan="2" style="width: 30px;">
<button mat-icon-button (click)="deleteTransaction(t.contributorId, ti)"><i ofbicon>delete_forever</i></button>
</td>
<td colspan="5" *ngIf="t.description && t.description.length > 0">{{t.description}}</td>
<td colspan="5" *ngIf="!t.description || t.description.length === 0" class="b-0 p-0"></td>
<td colspan="4" *ngIf="t.description && t.description.length > 0">{{t.description}}</td>
<td colspan="4" *ngIf="!t.description || t.description.length === 0" class="b-0 p-0"></td>
</tr>
<tr [class.highlight]="ti % 2">
<td [class.remove-top-border]="!t.description || t.description.length === 0">{{t.date}}</td>
<td [class.remove-top-border]="!t.description || t.description.length === 0">{{transactionType[t.typeId]}}</td>
<td [class.remove-top-border]="!t.description || t.description.length === 0">{{t.checkNumber}}</td>
<td [class.remove-top-border]="!t.description || t.description.length === 0">{{fund[t.fundId]}}</td>
@ -35,7 +33,6 @@
</tr>
</ng-container>
<tr>
<td></td>
<td></td>
<td></td>
<td class="fw-bold">General</td>
@ -43,7 +40,6 @@
<td class="fw-bold">Total</td>
</tr>
<tr class="highlight-yellow">
<td></td>
<td></td>
<td></td>
<td>{{contributorTotal(c.contributorId, 1) | currency}}</td>
@ -57,10 +53,9 @@
</tr>
</ng-container>
<tr>
<td colspan="6" class="fw-bold fs-1-2-5">Grand Totals</td>
<td colspan="5" class="fw-bold fs-1-2-5">Grand Totals</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td class="fw-bold">General</td>
@ -68,7 +63,6 @@
<td class="fw-bold">Total</td>
</tr>
<tr class="highlight-yellow">
<td></td>
<td></td>
<td></td>
<td>{{combinedTotal(1) | currency}}</td>

View File

@ -62,8 +62,7 @@ export class AddTransactionPageComponent implements OnInit {
contributor: contrib ? contrib : undefined,
typeId: lastTransaction ? lastTransaction.typeId : TransactionType.Cash,
fundId: lastTransaction ? (lastTransaction.fundId === Fund.General ? Fund.Missions : Fund.General) : Fund.General,
checkNumber: lastTransaction ? lastTransaction.checkNumber : '',
goodsOrServices: false
checkNumber: lastTransaction ? lastTransaction.checkNumber : ''
}
});
@ -77,7 +76,6 @@ export class AddTransactionPageComponent implements OnInit {
contrib.transactions = [];
this.contributions.push(contrib);
}
res.transaction.taxYear = +res.transaction.date.split('-')[0];
contrib.transactions.push(res.transaction);
if (res.saveAndAdd === true) {
this.addTransaction(contrib.contributorId);
@ -109,18 +107,6 @@ export class AddTransactionPageComponent implements OnInit {
return contributor ? contributor.display : undefined;
}
contributorDatesMatch(contributorId: number) {
const contributor = this.contributions.find(c => c.contributorId === contributorId);
if (!contributor) return true;
let match = true;
contributor.transactions.forEach(t => {
if (t.date != contributor.date) {
match = false;
}
});
return match;
}
contributorTotal(contributorId: number, fundId: number) {
const contrib = this.contributions.find(c => c.contributorId === contributorId);
if (!contrib) return 0;

View File

@ -1,5 +1,5 @@
<div md-dialog-title>
<p>Add Transaction</p>
<p>Add Event</p>
</div>
<div md-dialog-content>
<form [formGroup]="form" (ngSubmit)="onSubmit()">
@ -14,7 +14,6 @@
</mat-option>
</mat-autocomplete>
</mat-form-field>
<button mat-button class="m-5" type="button" (click)="addUser()">Add</button>
<br>
<mat-form-field class="w-50">
<mat-select formControlName="typeId">
@ -42,9 +41,6 @@
<input matInput placeholder="Description" type="text" formControlName="description" >
</mat-form-field>
<br>
<mat-checkbox formControlName="goodsOrServices">Goods Or Services Received?</mat-checkbox>
<br>
<br>
<button mat-raised-button class="m-5" type="button" (click)="cancel()" >Cancel</button>
<button mat-raised-button class="m-5" type="submit" [disabled]="!form.valid || saveBtnDisabled">{{ saveBtnTxt }}</button>
<button mat-raised-button class="m-5" type="button" (click)="onSubmit(true)" [disabled]="!form.valid || saveBtnDisabled">{{ saveAndAddBtnTxt }}</button>

View File

@ -1,9 +1,8 @@
import { Component, OnInit, Inject } from '@angular/core';
import { FormBuilder, FormGroup, Validators, FormArray } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef, MatDialog } from '@angular/material';
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material';
import { contributorValidator } from '../contributor-validator';
import { Transaction } from '../transaction';
import { AddUserPopupComponent } from '../../popups/add-user-popup/add-user-popup.component';
export interface ValDisplay {
value: number;
@ -20,8 +19,7 @@ export interface DialogData {
fundId: number,
checkNumber: string,
description: string,
taxYear: number,
goodsOrServices: boolean
taxYear: number
}
@ -42,7 +40,7 @@ export class AddTransactionPopupComponent implements OnInit {
funds: ValDisplay[];
types: ValDisplay[];
constructor(private dialogService: MatDialog, private formBuilder: FormBuilder, @Inject(MAT_DIALOG_DATA) public data: DialogData, private dialogRef:MatDialogRef<AddTransactionPopupComponent>) {
constructor(private formBuilder: FormBuilder, @Inject(MAT_DIALOG_DATA) public data: DialogData, private dialogRef:MatDialogRef<AddTransactionPopupComponent>) {
this.contributors = this.data.contributors || [];
this.funds = this.data.funds || [];
this.types = this.data.types || [];
@ -58,8 +56,7 @@ export class AddTransactionPopupComponent implements OnInit {
checkNumber: [this.data.checkNumber],
description: [this.data.description],
amount: ['', [Validators.required]],
taxYear: [this.data.taxYear || new Date().getFullYear(), [Validators.required]],
goodsOrServices: [this.data.goodsOrServices || false]
taxYear: [this.data.taxYear || new Date().getFullYear(), [Validators.required]]
});
}
@ -94,7 +91,6 @@ export class AddTransactionPopupComponent implements OnInit {
trans.fundId = this.form.value.fundId;
trans.taxYear = this.form.value.taxYear;
trans.typeId = this.form.value.typeId;
trans.goodsOrServices = this.form.value.goodsOrServices;
this.dialogRef.close({transaction:trans,saveAndAdd:saveAndAdd});
}
@ -102,19 +98,4 @@ export class AddTransactionPopupComponent implements OnInit {
this.dialogRef.close();
}
addUser() {
const ref = this.dialogService.open(AddUserPopupComponent);
ref.afterClosed().subscribe((res: any) => {
if (res && res.id > 0) {
this.contributors.push({ value: res.id, display: res.lastName + ' ' + res.firstName });
let contrib = this.contributors.find(c => c.value === res.id);
this.form.get("contributor").setValue(contrib);
}
});
}
}

View File

@ -7,5 +7,4 @@ export class Transaction {
fundId: number;
taxYear: number;
typeId: number;
goodsOrServices: boolean;
}

View File

@ -1,6 +1,6 @@
div.header{
header{
position:fixed;
top:0;
left:0;
@ -51,7 +51,7 @@ div.header{
padding-bottom: 140px;
}
div.footer{
footer{
background-color: rgb(50,50,50);
padding-top: 20px;
padding-bottom: 20px;
@ -81,7 +81,7 @@ div.footer{
}
@media(max-width: 800px){
div.footer{
footer{
height: 380px;
}
.footer-panel{

View File

@ -1,6 +1,6 @@
<div class="header" [class.print-hide]="printService.isPrinting">
<header>
<div id="header-background" [ngStyle]="{'opacity':headerOpacity}"></div>
<button mat-button class="header-button-home" routerLink="/home"><img id="logo" src="assets/images/tiny/logo.png" height="30" alt="logo"> Old Fashion Baptist</button>
<span class="hideOnMobile"></span>
@ -12,13 +12,13 @@
(click)="mainMenuClick()">
<i ofbicon class="example-icon" style="line-height:20px;">menu</i>
</button>
</div>
</header>
<div class="content" [class.print-hide-children]="printService.isPrinting">
<div class="content">
<router-outlet></router-outlet>
</div>
<div class="footer" [class.print-hide]="printService.isPrinting">
<footer>
<div id="footer-content">
<div id="footer-contact-content" class="footer-panel">
<a target="_blank" href="https://www.google.com/maps/place/Old+Fashion+Baptist+Church/@45.9814004,-112.5320574,11.87z/data=!4m12!1m6!3m5!1s0x535b078c3c74ea33:0xac299097142c5894!2sOld+Fashion+Baptist+Church!8m2!3d45.951287!4d-112.511978!3m4!1s0x535b078c3c74ea33:0xac299097142c5894!8m2!3d45.951287!4d-112.511978">
@ -27,9 +27,8 @@
</a>
<p><a href="tel:+1-406-494-5028" class="phone">(406) 494 - 5028</a></p>
<p>Pastor Derek Loewen</p>
<br>
<p>Pastor Emeritus Ron Derksen</p>
</div>
<div id="footer-services-content" class="footer-panel">
<p>Sunday School: 10AM</p>
<p>Sunday Worship: 11AM</p>
@ -41,14 +40,14 @@
<p><i ofbicon class="copyright">copyright</i> Copyright {{copyrightYear}}</p>
<p>Old Fashion Baptist</p>
<p><a routerLink="/home">ofbbutte.com</a></p>
<p><a href="https://publicfiles.fcc.gov/fm-profile/KFGL" target="_blank">KFGL Public Information File</a></p>
<p>Powered by God</p>
<br>
</div>
</div>
<div class="audio-player-filler" [hidden]="!showAudioPlayer" ></div>
</div>
</footer>
<div class="audio-player" [class.audio-player-slide-up]="showAudioPlayer" [class.print-hide]="printService.isPrinting">
<div class="audio-player" [class.audio-player-slide-up]="showAudioPlayer">
<audio-player-component (closed)="audioPlayerClosed()" (started)="audioPlayerStarted()"></audio-player-component>
</div>

View File

@ -4,7 +4,6 @@ import { Router, NavigationEnd, Event } from '@angular/router';
import { EventService } from '../../services/event.service';
import { AudioPlayerService } from '../../services/audio-player.service';
import { BibleVerseService } from '../../services/bible-verse.service';
import { PrintService } from '../../services/print-service';
@Injectable()
@ -27,8 +26,7 @@ export class AppComponent {
constructor(private router: Router,
private audioPlayerService: AudioPlayerService,
private googleAnalyticsService: GoogleAnalyticsService,
public printService: PrintService){
private googleAnalyticsService: GoogleAnalyticsService){
this.router.events.subscribe((event:Event) => {
if(event instanceof NavigationEnd) {
this.lastRoute = this.currRoute;

View File

@ -1,23 +0,0 @@
.full-width{
width: 100%;
}
.hide{
display: none;
}
.bold {
font-weight: bold;
}
.margin-top-space {
margin-top: 20px;
}
.errorMessages{
color: white;
background-color: rgb(255,90,90);
padding: 10px;
border-radius: 3px;
margin-bottom: 5px;
}

View File

@ -1,49 +0,0 @@
<secondary-page-component [hideSideBarOnMobile]="true" >
<div mainContent>
<br>
<p class="bold">
We are so glad you found one of our balloons. We would love to hear from you
and where you found it!
</p>
<p class="margin-top-space">
Click <a routerLink="/whoweare">here</a> to learn more about us.
</p>
<p class="margin-top-space">
Click <a routerLink="/salvation">here</a> to learn more about <span class="bold">Jesus</span>.
</p>
<br>
<div *ngIf="!formSubmitted">
<form class="form" #contactForm="ngForm" (ngSubmit)="onSubmit()">
<mat-form-field class="full-width">
<input matInput type="text" placeholder="Name" required value="" [(ngModel)]="name" name="name" >
</mat-form-field>
<mat-form-field class="full-width">
<input matInput type="text" placeholder="City, State" required value="" [(ngModel)]="location" name="location" >
</mat-form-field>
<mat-form-field class="full-width">
<input matInput type="email" placeholder="Email" value="" [(ngModel)]="email" name="email" pattern="^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$">
</mat-form-field>
<mat-form-field class="full-width">
<input matInput type="tel" placeholder="Phone" value="" [(ngModel)]="phone" name="phone">
</mat-form-field>
<mat-form-field class="full-width">
<textarea matInput type="text" placeholder="Other Information or Questions" value="" [(ngModel)]="body" name="body" rows="5" ></textarea>
</mat-form-field>
<mat-form-field class="hide">
<input matInput type="text" placeholder="hp" required value="" [(ngModel)]="hp" name="subject">
</mat-form-field>
<div class="errorMessages" *ngIf="errorMessages.length > 0">
<p *ngFor="let error of errorMessages">{{error}}</p>
</div>
<button mat-raised-button type="submit" [disabled]="!contactForm.form.valid || submitButtonDisabled">{{submitButtonText}}</button>
</form>
</div>
<div *ngIf="formSubmitted">
<p><b>Thank You!</b></p>
<p>Your message has been sent.</p>
</div>
</div>
<div sideBar ofbFadeInOnScroll>
</div>
</secondary-page-component>

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { BalloonComponent } from './balloon.component';
describe('BalloonComponent', () => {
let component: BalloonComponent;
let fixture: ComponentFixture<BalloonComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ BalloonComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(BalloonComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,84 +0,0 @@
import { Router } from '@angular/router';
import { MatDialogConfig } from '@angular/material';
import { OkPopupComponent } from '../popups/ok-popup/ok-popup.component';
import { EmailService } from '../../services/email.service';
import { Component, OnInit } from '@angular/core';
import { MatDialog } from '@angular/material';
@Component({
selector: 'app-contact-page',
templateUrl: './balloon.component.html',
styleUrls: ['./balloon.component.css']
})
export class BalloonComponent implements OnInit {
public submitButtonText: string = "Submit";
public submitButtonDisabled: boolean = false;
public formSubmitted: boolean = false;
public name: string;
public email: string;
public location: string;
public phone: string;
public body: string;
public hp: string = ".";
public errorMessages: string[] = [];
constructor(private emailService: EmailService,
private MatDialog: MatDialog,
private router: Router) { }
ngOnInit() {
}
onSubmit(){
this.errorMessages = [];
if (this.name == null || this.name == ""){
this.errorMessages.push("Please enter a name");
}
if (this.location == null || this.location == ""){
this.errorMessages.push("Please enter a city and state");
}
if (this.errorMessages.length > 0){ return; }
const body = `Location of balloon: ${this.location}<br>${this.body || ''}`;
let email = this.email;
if (!email || email.length === 0) {
email = 'N/A';
}
this.submitButtonText = "Please Wait...";
this.submitButtonDisabled = true;
this.emailService.sendEmail(this.name,
email,
this.phone || '',
body,
this.hp)
.subscribe(
success => {this.emailSuccess();},
error => {this.emailError();});
}
private emailSuccess(){
let opts = new MatDialogConfig;
opts.data = { title:'Email Sent','message':'Thank You! Your message has been sent.' };
let popup = this.MatDialog.open(OkPopupComponent,opts);
this.submitButtonText = "Submit";
this.submitButtonDisabled = false;
popup.afterClosed().subscribe(()=>{
this.formSubmitted = true;
});
}
private emailError(){
console.error("error");
let opts = new MatDialogConfig;
opts.data = { title:'Email Error','message':'Please make sure that you have entered a valid email address.' };
let popup = this.MatDialog.open(OkPopupComponent,opts);
this.submitButtonText = "Submit";
this.submitButtonDisabled = false;
}
}

View File

@ -1,10 +1,5 @@
<secondary-page-component [hideSideBarOnMobile]="true" >
<div mainContent>
<br>
<p>
For general questions please complete the form below. If you are a missionary requesting
support please complete the <a routerLink="/missionary">Missionary Questionnaire form by clicking here.</a>
</p>
<br>
<div *ngIf="!formSubmitted">
<form class="form" #contactForm="ngForm" (ngSubmit)="onSubmit()">

View File

@ -1,5 +0,0 @@
@media print {
:host {
display: block;
}
}

View File

@ -1,3 +0,0 @@
<app-contributor-yearly-report *ngFor="let c of contributors; let i = index" [index]="i" [contributorTransactions]="c">
</app-contributor-yearly-report>

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ContributorAllReportsComponent } from './contributor-all-reports.component';
describe('ContributorAllReportsComponent', () => {
let component: ContributorAllReportsComponent;
let fixture: ComponentFixture<ContributorAllReportsComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ContributorAllReportsComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ContributorAllReportsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,50 +0,0 @@
import { Component, OnInit } from '@angular/core';
import { PrintService } from 'src/app/services/print-service';
import { UserService } from 'src/app/services/user.service';
import { TransactionService } from 'src/app/services/transaction.service';
import { forkJoin } from 'rxjs';
@Component({
selector: 'app-contributor-all-reports',
templateUrl: './contributor-all-reports.component.html',
styleUrls: ['./contributor-all-reports.component.css']
})
export class ContributorAllReportsComponent implements OnInit {
public contributors: {contributor:{}, transactions:[]}[] = [];
constructor(private printService: PrintService, private userService: UserService, private transactionService: TransactionService) { }
ngOnInit() {
const taxYear = 2024;
const query = forkJoin([this.userService.getAll(), this.transactionService.getByYear(taxYear), this.transactionService.getByYear(taxYear - 1)]);
query.subscribe(res => this.setup(res[0], res[1], res[2]));
this.printService.setPrinting(true);
}
private setup(contributorResult, transactionResult, priorYearTransactionResult) {
const contributors = contributorResult.users;
const transactions = transactionResult.transactions;
const priorYearTransactions = priorYearTransactionResult.transactions;
const contrib = {};
transactions.forEach(t => {
if (contrib.hasOwnProperty(t.contributorId)) {
contrib[t.contributorId].transactions.push(t);
} else {
const con = contributors.find(c => c.id === t.contributorId);
if (con) {
contrib[con.id] = {contributor: con, transactions: [t]};
contrib[con.id].priorYearTransactions = priorYearTransactions.filter(t => t.contributorId === con.id);
this.contributors.push(contrib[con.id]);
} else {
console.error('coould not find contributor for', t);
}
}
});
}
}

View File

@ -1,140 +0,0 @@
@media screen {
:host {
display: none;
}
}
@media print {
:host {
display: block;
margin-top: -50px;
-webkit-print-color-adjust: exact;
color-adjust: exact;
}
tr.page-break-after:after { content:""; display: block; page-break-before: always; }
}
.h-100 {
height: 300px;
}
.w-100 {
width: 100%;
}
.d-block {
display: block;
}
.flex {
display: flex;
}
.flex-grow-1 {
flex-grow: 1;
}
.flex-direction-column {
flex-direction: column;
}
.flex-align-center {
align-items: center;
}
.flex-justify-space-between {
justify-content: space-between;
}
.flex-align-space-between {
align-content: space-between;
}
.flex-align-top {
align-items: start;
}
.flex-align-stretch {
align-items: stretch;
}
.flex-justify-center {
justify-content: center;
}
.flex-justify-space-between {
justify-content: space-between;
}
hr {
border-top: 1px solid green;
}
.text-center {
text-align: center;
}
.text-right {
text-align: right;
}
.text-left {
text-align: left;
}
.mt-5 {
margin-top: 5px;
}
.mt-20 {
margin-top: 20px;
}
.mb-20 {
margin-bottom: 20px;
}
.mr-40 {
margin-right: 40px;
}
.flex-direction-column {
flex-direction: column;
}
.page-break-before {
page-break-before: always;
}
.fw-bold {
font-weight: bold;
}
.hilight-yellow {
background-color: yellow;
}
table.borders {
border-collapse: collapse;
}
table.borders th, table.borders tr.row td {
border: 1px solid black;
}
table.cell-padding-5 td, table.cell-padding-5 th {
padding: 5px;
}
table.highlight-even tr.row:nth-child(even) {
background-color: #e6ffe6;
}
table tbody tr.footer td {
font-size: small;
vertical-align: bottom;
}
.text-align-right {
text-align: right;
}

View File

@ -1,121 +0,0 @@
<div *ngIf="index > 0" class="page-break-before"></div>
<div class="h-100 flex flex-align-center flex-justify-center flex-direction-column">
<img src="../../../assets/images/original/logo_dark.png">
<p class="mt-5">
Old Fashion Baptist Church Giving Statement {{taxYear}}
</p>
<p class="mt-5">
{{contributorName}}
</p>
<p *ngIf="contributorStreet && contributorCity && contributorState && contributorZip">{{contributorStreet}}</p>
<p *ngIf="contributorStreet && contributorCity && contributorState && contributorZip">{{contributorCity}} {{contributorState}}, {{contributorZip}}</p>
</div>
<div class="page-break-before">
<div class="header flex flex-justify-space-between">
<div>
<img src="../../../assets/images/original/logo_dark.png">
</div>
<div class="text-right">
<p>Old Fashion Baptist Church</p>
<p>5003 Wynne Ave</p>
<p>Butte, MT 59701</p>
<p>(406) 494-5028</p>
<p>ofbbutte.com</p>
</div>
</div>
<hr class="hr mt-20">
<h2 class="text-center mt-20">Old Fashion Baptist Church Giving Statement {{taxYear}}</h2>
<hr class="mt-20">
<div class="flex flex-align-stretch flex-justify-space-between">
<div class="mt-20 mb-20 mr-40 flex-grow-1 flex flex-direction-column flex-justify-space-between">
<div class="mt-20">
<p><b>Name: </b>{{contributorName}}</p>
<p><b>Year: </b>{{taxYear}}</p>
</div>
<table class="cell-padding-5 borders w-100">
<thead>
<tr>
<th colspan="2">{{taxYear}} Giving Summary</th>
</tr>
</thead>
<tbody class="cell-padding-5">
<tr class="row">
<td class="fw-bold">General Fund</td>
<td class="text-right">{{totalGeneral() | currency}}</td>
</tr>
<tr class="row">
<td class="fw-bold">Missions Fund</td>
<td class="text-right">{{totalMissions() | currency}}</td>
</tr>
<tr class="row">
<td class="fw-bold">Total Giving</td>
<td class="text-right hilight-yellow">{{(totalGeneral() + totalMissions()) | currency}}</td>
</tr>
</tbody>
</table>
<div>
Thank you for your support. The information provided in this statement reflects
your gifts on record for {{taxYear}}.
No goods or services were provided in exchange for your contributions.
</div>
</div>
<div class="mt-20">
<canvas #chart width="400" height="300"></canvas>
</div>
</div>
</div>
<table class="highlight-even cell-padding-5 w-100 borders mt-20">
<thead>
<tr>
<th class="text-left">Date</th>
<th nowrap class="text-left">Payment Type</th>
<th nowrap class="text-left">Check Number</th>
<th class="text-left">Fund</th>
<th class="text-left">Description</th>
<th class="text-left">Amount</th>
</tr>
</thead>
<tbody>
<ng-container *ngFor="let t of transactions; let i = index">
<tr class="row">
<td nowrap>{{t.date | date:'MM-dd-yyyy':'UTC'}}</td>
<td nowrap>{{t.typeId === 1 ? 'Cash' : (t.typeId === 2 ? 'Check' : 'NA')}}</td>
<td nowrap>{{t.checkNumber}}</td>
<td nowrap>{{t.fundId === 1 ? 'General' : (t.fundId === 2 ? 'Missions' : 'NA')}}</td>
<td width="99%">{{t.description}}</td>
<td nowrap class="text-align-right">{{t.amount | currency}}</td>
</tr>
<tr *ngIf="isFooter(i+1)" class="footer page-break-after">
<td colspan="6">
<div class="flex flex-justify-space-between">
<p>Old Fashion Baptist Church Giving Statement {{taxYear }}</p>
<p>Page {{calcPage(i+1)}} of {{pages}}</p>
</div>
</td>
<div></div><!--DIV IS HERE TO MAKE PAGE BREAKS WORK CORRECTLY-->
</tr>
</ng-container>
<ng-container *ngFor="let r of fillerRows; let i = index">
<tr>
<td nowrap>&nbsp;</td>
<td nowrap></td>
<td nowrap></td>
<td nowrap></td>
<td width="99%"></td>
<td nowrap></td>
</tr>
<tr *ngIf="i === fillerRows.length-1" class="footer">
<td colspan="6">
<div class="flex flex-justify-space-between">
<p>Old Fashion Baptist Church Giving Statement {{taxYear}}</p>
<p>Page {{pages}} of {{pages}}</p>
</div>
</td>
</tr>
</ng-container>
</tbody>
</table>
<div *ngIf="pagesOdd" class="page-break-before">&nbsp;</div>

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ContributorYearlyReportComponent } from './contributor-yearly-report.component';
describe('ContributorYearlyReportComponent', () => {
let component: ContributorYearlyReportComponent;
let fixture: ComponentFixture<ContributorYearlyReportComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ContributorYearlyReportComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ContributorYearlyReportComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,158 +0,0 @@
import { Component, OnInit, Input, ViewChild, ElementRef } from '@angular/core';
import { PrintService } from '../../services/print-service';
import { Transaction } from '../add-transaction-page/transaction';
import * as Chart from 'chart.js';
import ChartDataLabels from 'chartjs-plugin-datalabels';
import { CurrencyPipe } from '@angular/common';
@Component({
selector: 'app-contributor-yearly-report',
templateUrl: './contributor-yearly-report.component.html',
styleUrls: ['./contributor-yearly-report.component.css']
})
export class ContributorYearlyReportComponent implements OnInit {
@ViewChild('chart') chartElement:ElementRef;
@Input() index: number;
@Input() contributorTransactions: {contributor: {}, transactions: {}, priorYearTransactions: {}};
public transactions: Transaction[] = [];
public priorTransactions: Transaction[] = [];
public get contributorName(): string {
const first = (<any>this.contributorTransactions.contributor).firstName;
const last = (<any>this.contributorTransactions.contributor).lastName;
if (last && first) {
return last + ', ' + first;
} else if (last) {
return last;
} else if (first) {
return first;
} else {
return '';
}
}
public contributorStreet: string = '7878 Washington St';
public contributorCity: string = 'Butte';
public contributorState: string = 'MT';
public contributorZip: string = '59701';
public taxYear: number = 2024;
public rowsFirstPage: number = 11;
public rowsPerPage: number = 30;
public get fillerRows(): number[] {
const rowsToFillPage = this.rowsFirstPage + ((this.pages - 2) * this.rowsPerPage);
const rowsNeeded = rowsToFillPage - this.transactions.length;
return Array(rowsNeeded).fill(1).map((x,i)=>i)
}
public get pages(): number {
return Math.ceil((this.transactions.length - this.rowsFirstPage) / this.rowsPerPage) + 2;
}
public get pagesOdd(): boolean {
return !(this.pages % 2 == 0)
}
private currencyPipe: CurrencyPipe = new CurrencyPipe('en-US');
constructor(public printService: PrintService) { }
ngOnInit() {
this.contributorCity = (<any>this.contributorTransactions.contributor).city;
this.contributorState = (<any>this.contributorTransactions.contributor).state;
this.contributorStreet = (<any>this.contributorTransactions.contributor).street;
this.contributorZip = (<any>this.contributorTransactions.contributor).zip;
this.transactions = <any>this.contributorTransactions.transactions;
this.priorTransactions = <any>this.contributorTransactions.priorYearTransactions;
this.renderChart();
}
public totalGeneral() {
let sum = 0;
this.transactions.filter(t => t.fundId === 1).forEach(t => sum += t.amount);
return sum;
}
public priorGeneral() {
let sum = 0;
this.priorTransactions.filter(t => t.fundId === 1).forEach(t => sum += t.amount);
return sum;
}
public totalMissions() {
let sum = 0;
this.transactions.filter(t => t.fundId === 2).forEach(t => sum += t.amount);
return sum;
}
public priorMissions() {
let sum = 0;
this.priorTransactions.filter(t => t.fundId === 2).forEach(t => sum += t.amount);
return sum;
}
public calcPage(index: number): number {
const val = Math.max(index, this.rowsFirstPage);
return Math.ceil((val - this.rowsFirstPage) / this.rowsPerPage) + 2;
}
public isFooter(index: number): boolean {
if (index === this.rowsFirstPage) {
return true;
}
if (index === (this.rowsFirstPage + ((this.calcPage(index) - 2) * this.rowsPerPage))) {
return true;
}
return false;
}
private renderChart() {
const me = this;
var myChart = new Chart(this.chartElement.nativeElement, {
plugins: [ChartDataLabels],
type: 'bar',
data: {
labels: [(this.taxYear - 1).toString(), this.taxYear.toString()],
datasets: [{
label: 'General',
data: [this.priorGeneral(), this.totalGeneral()],
backgroundColor: 'rgba(54, 245, 162, 0.2)',
borderColor: 'rgba(54, 245, 162, 1)',
borderWidth: 1
}, {
label: 'Missions',
data: [this.priorMissions(), this.totalMissions()],
backgroundColor: 'rgba(54, 162, 235, 0.2)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 1
}]
},
options:{
scales: {
xAxes: [{
stacked: true
}],
yAxes: [{
stacked: true,
ticks: {
callback: function(value, index, values) {
return me.currencyPipe.transform(value, 'USD', 'symbol', '1.0-0');
}
}
}]
},
plugins:{
datalabels:{
font:{
weight: 'bold'
},
formatter: function(value, context){
if (value === 0) {
return '';
}
return me.currencyPipe.transform(value, 'USD', 'symbol', '1.0-2');
}
}
}
}
});
}
}

View File

@ -1,23 +0,0 @@
.section-header{
font-size: 1.2em;
font-weight: bold;
border-bottom: 1px solid gray;
margin-bottom: 10px;
}
a{
color: inherit;
}
a:visited{
color: inherit;
}
.break-word {
overflow-wrap: break-word;
word-wrap: break-word;
-ms-word-break: break-all;
word-break: break-word;
}

View File

@ -1,16 +0,0 @@
<secondary-page-component [hideSideBarOnMobile]="true">
<div mainContent>
<p ofbFadeInOnScroll class="section-header">FCC Noncommercial FM Radio Station Construction Permit</p>
<p ofbFadeInOnScroll class="section-paragraph">
On November 9, 2021, Old Fashion Baptist Church of Butte, applicant for a Noncommercial FM Radio Station on
88.1mhz, in Butte, MT, filed an application with the Federal Communications Commission for a new Noncommercial FM
Station. Members of the public wishing to view this application or obtain information about how to file comments and
petitions on the application can visit <a class="break-word" href="https://enterpriseefiling.fcc.gov/dataentry/views/public/nceDraftCopy?displayType=html&appKey=25076f917cce2f5b0
17cd34cdd450dee&id=25076f917cce2f5b017cd34cdd450dee&goBack=N">https://enterpriseefiling.fcc.gov/dataentry/views/public/nceDraftCopy?displayType=html&appKey=25076f917cce2f5b0
17cd34cdd450dee&id=25076f917cce2f5b017cd34cdd450dee&goBack=N</a>.
</p>
</div>
<div sideBar class="side-bar">
</div>
</secondary-page-component>

View File

@ -1,15 +0,0 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-fcc-permit-page',
templateUrl: './fcc-permit-page.component.html',
styleUrls: ['./fcc-permit-page.component.css']
})
export class FCCPermitPageComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}

View File

@ -1,151 +0,0 @@
import { DateTime } from "luxon";
import { VideoServices, VideoService } from './video-services';
export class Countdown {
public days: number = 0;
public hours: number = 0;
public minutes: number = 0;
public seconds: number = 0;
public services: VideoService[] = [];
public showButton: boolean;
public showCounter: boolean = false;
public dateDisplay: string;
public dateDisplaySmall: string;
public get daysDisplay(): string {
return this.formatDisplay(this.days);
}
public get daysText(): string {
return this.days === 1 ? 'day ' : 'days';
}
public get hoursDisplay(): string {
return this.formatDisplay(this.hours);
}
public get hoursText(): string {
return this.hours === 1 ? 'hr ' : 'hrs';
}
public get minutesDisplay(): string {
return this.formatDisplay(this.minutes);
}
public get minutesText(): string {
return this.minutes === 1 ? 'min ' : 'mins';
}
public get secondsDisplay(): string {
return this.formatDisplay(this.seconds);
}
public get secondsText(): string {
return this.seconds === 1 ? 'sec ' : 'secs';
}
private clock;
constructor(services: VideoService[]) {
if (!services || services.length == 0) return;
this.services = services;
this.services.forEach(v => {
v.date = DateTime.fromISO(v.date, {zone: 'America/Denver'})
});
this.services.sort((a, b) => {
if (a.date < b.date) return -1;
if (a.date === b.date) return 0;
return 1;
});
this.updateClock();
this.startClock();
}
private resetToZero() {
this.days = 0;
this.hours = 0;
this.minutes = 0;
this.seconds = 0;
}
private updateClock() {
this.showCounter = true;
var now = DateTime.local();
var firstNonArchived = this.getFirstNonArchived(now);
if (!firstNonArchived) {
this.stopClock();
this.resetToZero();
this.showCounter = false;
this.dateDisplay = '';
this.dateDisplaySmall = '';
return;
}
var hourDiff = (<DateTime>firstNonArchived.date).diff(now, ['hours']);
if (hourDiff.hours >= 48) {
this.showCounter = false;
this.dateDisplay = '';
this.dateDisplaySmall = '';
return;
}
var secDiff = (<DateTime>firstNonArchived.date).diff(now, ['seconds']);
if (secDiff.seconds <= 0) {
this.showButton = true;
}
var diff = (<DateTime>firstNonArchived.date).diff(now, ['days', 'hours', 'minutes', 'seconds']);
this.days = diff.days;
this.hours = diff.hours;
this.minutes = diff.minutes;
this.seconds = Math.floor(diff.seconds);
this.dateDisplay = firstNonArchived.date.toLocaleString(DateTime.DATETIME_HUGE);
this.dateDisplaySmall = firstNonArchived.date.toLocaleString(DateTime.DATETIME_MED)
}
private startClock() {
this.clock = setInterval(this.updateClock.bind(this), 1000);
}
private stopClock() {
clearInterval(this.clock);
}
private getFirstNonArchived(now: DateTime): VideoService {
if (this.services.length === 0) return null;
const nonArchived = this.services.filter(s => s.archived === false);
if (!nonArchived || nonArchived.length === 0) return null;
return nonArchived[0];
}
private getNearestPastDate(now: DateTime): VideoService {
if (this.services.length === 0) return null;
const archived = this.services.filter(s => s.archived === false);
if (!archived || archived.length === 0) return null;
var now = now || DateTime.local();
var nearestIndex = archived.findIndex(s => s.date > now);
if (nearestIndex === 0) return null;
if (nearestIndex === -1) return archived[archived.length - 1];
return archived[nearestIndex - 1];
}
private getNearestFutureDate(now: DateTime): VideoService {
if (this.services.length === 0) return null;
var now = now || DateTime.local();
var nearest = this.services.find(s => s.date > now);
return nearest;
}
private formatDisplay(val: number): string {
if (val <= 0) {
return '00';
}
if (val < 10) {
return '0' + val.toString();
}
return val.toString();
}
}

View File

@ -7,42 +7,21 @@ a{
color: inherit;
}
a {
text-decoration: underline;
}
a:hover {
cursor: pointer;
}
a:visited{
color: inherit;
}
.bold {
font-weight: bold;
}
img{
width: 70%;
height: auto;
}
img.w-100pct {
width: 100%;
height: auto;
}
img.full {
width: 100%;
height: auto;
}
.color-white {
color: white;
}
#call-to-action-container {
text-align: center;
position: absolute;
@ -51,128 +30,6 @@ img.full {
bottom: 10%;
}
#live-stream-container {
text-align: left;
position: absolute;
left: 10%;
right: 0;
bottom: 20%;
}
#title > .live {
display: inline-block;
background-color: red;
color: white;
padding: 0px 7px;
border-radius: 10px;
}
#live-date {
color: white;
font-weight: bold;
margin-top: 5px;
}
#live-stream-container > #title {
font-size: 25pt;
font-weight: bold;
color: white;
font-family: Franklin Gothic Medium,Franklin Gothic,ITC Franklin Gothic,Arial,sans-serif;
}
#countdown-container {
text-decoration: none;
position: relative;
margin-top: 7px;
display: inline-block;
font-size: 30pt;
font-weight: bold;
border-radius: 10px;
background-color: rgba(255, 255, 255, 1);
padding: 15px 20px;
-webkit-box-shadow: inset 0px 0px 20px -15px rgba(0,0,0,1);
-moz-box-shadow: inset 0px 0px 20px -15px rgba(0,0,0,1);
box-shadow: inset 0px 0px 20px -15px rgba(0,0,0,1);
border: 1px solid green;
font-family: Consolas,monaco,monospace;
}
/*Button*/
#countdown-container.show-button {
background-color:#2dabf9;
color:#ffffff;
text-shadow:0px 1px 0px #263666;
}
#countdown-container.show-button:hover {
background-color:#0688fa;
}
#countdown-container.show-button:active {
position:relative;
top:1px;
}
/*End Button*/
#countdown-container .text {
font-size: 10pt;
}
.opacity-zero {
opacity: 0;
}
#live-button {
position: absolute;
font-size: 25pt;
width: 100%;
height: 100%;
}
@media(max-width:900px){
#live-stream-container > #title {
font-size: 18pt;
}
#countdown-container {
font-size: 20pt;
}
#live-button {
font-size: 20pt;
}
}
.display-sm {
display: none;
}
@media(max-width:600px){
#live-stream-container {
left: 5%;
right: 5%;
bottom: 5%
}
#live-stream-container > #title {
font-size: 13pt;
}
#countdown-container {
font-size: 13pt;
margin-top: 3px;
}
.display-none-sm {
display: none;
}
.display-sm {
display: block;
}
#live-date {
margin-top: 2px;
}
#live-button {
font-size: 18pt;
margin-top: -5px;
}
}
#action-button {
font-size: 16pt;
max-width: 100%;
@ -182,18 +39,6 @@ img.full {
margin-right: 10px;
}
.w-100 {
width: 100%;
}
.w-200 {
width: 200px;
}
.h-200 {
height: 200px;
}
.action{
font-weight: bold;
font-size: 20px;
@ -330,9 +175,7 @@ img.full {
margin: 10px;
}
img.m-100-lg {
margin-left: 100px;
}
@media(max-width: 850px){
.row-content-col-left, .row-content-col-right{
@ -344,16 +187,5 @@ img.m-100-lg {
img.full {
width: 90%;
}
img.m-100-lg {
margin-left: 0;
}
img.w-100pct {
width: 65%;
}
}
@media(max-width: 600px) {
img.w-100pct {
width: 95%;
}
}

View File

@ -2,112 +2,38 @@
<img id="background-image" src="assets/images/home-images/tiny/sunset_b.jpg" alt="background image" width="100%">
<div id="filler">
<div id="live-stream-container" *ngIf="showCountdown && countdown && countdown.showCounter">
<div id="title">
<span class="live">VIDEO</span>
<span *ngIf="!countdown.showButton"> SERVICE STARTS IN</span>
<span *ngIf="countdown.showButton"> SERVICE AVAILABLE NOW</span>
</div>
<a id="countdown-container" routerLink="/live" [class.show-button]="countdown.showButton" >
<div id="live-button" [class.opacity-zero]="!countdown.showButton">
<i ofbicon class="mr-10" >live_tv</i>
Click to Watch
</div>
<div [class.opacity-zero]="countdown.showButton">
<span class="number">{{countdown.daysDisplay}}</span>
<span class="text">&nbsp;{{countdown.daysText}}</span>
<span class="number">&nbsp;{{countdown.hoursDisplay}}</span>
<span class="text">&nbsp;{{countdown.hoursText}}</span>
<span class="number">&nbsp;{{countdown.minutesDisplay}}</span>
<span class="text">&nbsp;{{countdown.minutesText}}</span>
<span class="number">&nbsp;{{countdown.secondsDisplay}}</span>
<span class="text">&nbsp;{{countdown.secondsText}}</span>
</div>
</a>
<div id="live-date" class="display-none-sm">
{{countdown.dateDisplay}}
</div>
<div id="live-date" class="display-sm">
{{countdown.dateDisplaySmall}}
</div>
</div>
<div id="call-to-action-container" *ngIf="showCallToAction">
<a id="action-button" href="/assets/Reopening Church Guidelines.pdf" target="_blank" mat-raised-button color="accent"><i ofbicon class="mr-10 color-white">info_outline</i><span class="color-white">Reopening Guidelines</span></a>
<button id="action-button" routerLink="/camp" mat-raised-button color="accent"><i ofbicon class="mr-10">info_outline</i>2019 Youth Camp</button>
</div>
</div>
<div id="content-wrapper">
<div style="text-align: center; position: relative; margin-bottom: 15px;" *ngIf="showVBS">
<div style="position: absolute; width: 100%; height: calc(65% + 15px); top: 35%; background-color: white;"></div>
<img src="assets/images/home-images/tiny/VBS_small.jpg" style="width:75%; max-width: 350px; position: relative; z-index: 1; box-shadow: 0 0 20px pink;" >
</div>
<div class="row tint" *ngIf="showVGC" >
<div class="row tint" *ngIf="showSpecial" >
<div class="row-content">
<div class="row-content-col-left center">
<img style="max-height:500px" ofbFadeInOnScroll src="assets/images/original/VictoryGospelCrusade.png" height="500">
</div>
<div class="row-content-col-right align-top">
<p ofbFadeInOnScroll class="row-content-header">Victory Gospel Crusade</p>
<br />
<p ofbFadeInOnScroll class="bold">
When
</p>
<p ofbFadeInOnScroll>
August 4 - 9 @ 7PM
<br />
August 11 - 15 @ 7 PM
</p>
<br>
<p ofbFadeInOnScroll class="bold">
Where
</p>
<p ofbFadeInOnScroll>
Behind Pizza Ranch
<br />
1839 Longfellow St, Butte, Mt
<br /><br />
<i ofbicon>directions</i> <a target="_blank" class="align-top" href="https://www.google.com/maps/place/1839+Longfellow+St,+Butte,+MT+59701/@45.9732501,-112.513401,17z/data=!3m1!4b1!4m6!3m5!1s0x535b07e062beaaf7:0x827616c9ef692eed!8m2!3d45.9732464!4d-112.5108261!16s%2Fg%2F11v03h9chf?entry=ttu">View Map</a>
</p>
<p ofbFadeInOnScroll class="action">
<i ofbicon>play_arrow</i> <a (click)="playVictoryGospelCrusade()" class="align-top">Click Here To Watch The Trailer</a>
</p>
</div>
</div>
</div>
<div class="row" *ngIf="showSpecial" >
<div class="row-content">
<div class="row-content-col-left center">
<img style="max-height:500px" ofbFadeInOnScroll src="assets/images/home-images/tiny/Cowboy Carnival.jpg" height="500">
<div class="row-content-col-left">
<a href="assets/images/champ_flyer.jpg" download="champ_flyer.jpg"><img class="full" ofbFadeInOnScroll src="assets/images/home-images/tiny/champ.jpg" height="300"></a>
</div>
<div class="row-content-col-right align-top center">
<p ofbFadeInOnScroll class="row-content-header">Cowboy Carnival</p>
<p ofbFadeInOnScroll class="row-content-header">Champ the Smiling Trick Horse</p>
<p ofbFadeInOnScroll>
Come join us for Ranger Walkers Wild West Cowboy Carnival!
Come join us for this special event happening September 5th and 6th at Old Fashion Baptist!
</p>
<br>
<p ofbFadeInOnScroll class="bold">
Family Fun
<p ofbFadeInOnScroll>
<b>Wednesday, September 5 @ 7 PM</b>
<br>
Bible Preaching & Bluegrass Gospel Music
</p>
<br>
<p ofbFadeInOnScroll class="bold">
Games
<p ofbFadeInOnScroll>
<b>Thursday, September 6 @ 5:30 PM</b>
<br>
Food, Games, Music & Preaching
</p>
<br>
<p ofbFadeInOnScroll class="bold">
Rides
</p>
<br>
<p ofbFadeInOnScroll class="bold">
Inflatables
</p>
<br>
<p ofbFadeInOnScroll style="font-size:1.25em;">
<b>Sunday, September 18 @ 11:00 AM</b>
<p ofbFadeInOnScroll>
<a href="assets/images/champ_flyer.jpg" download="champ_flyer.jpg"><b>Click here to download the flyer</b></a>
</p>
<br>
<p ofbFadeInOnScroll class="action">
@ -119,7 +45,7 @@
<div class="row">
<div class="row-content">
<div class="row-content-col-right align-top">
<div class="row-content-col-left align-top">
<p ofbFadeInOnScroll class="row-content-header">...that ye also may have fellowship with us...</p>
<p ofbFadeInOnScroll>It is exciting to gather together in the name of the Lord and
we sincerily hope that YOU will join us. Guests are always welcome at Old Fashion
@ -127,7 +53,7 @@
<p class="verse" ofbFadeInOnScroll>For where two or three are gathered together in my name, there am I in the midst of them. - Matthew 18:20</p>
<p ofbFadeInOnScroll class="action"><i ofbicon>info_outline</i> <a href="#" routerLink="/whoweare" class="align-top">Learn more about us</a></p>
</div>
<div class="row-content-col-left">
<div class="row-content-col-right">
<!-- <img ofbFadeInOnScroll src="assets/images/home-images/2-church-color.png"> -->
<a routerLink="/whoweare"><img ofbFadeInOnScroll src="assets/images/home-images/tiny/family.jpg"></a>
</div>

View File

@ -2,10 +2,6 @@ import { Component, HostListener } from '@angular/core';
import { MatDialog, MatDialogConfig } from '@angular/material';
import { VideoPopupComponent } from '../popups/video-popup/video-popup.component';
import { environment } from '../../../environments/environment';
import { Countdown } from './countdown';
import { HttpClient } from '@angular/common/http';
import { VideoServices } from './video-services';
import { YoutubePopupComponent } from '../popups/youtube-popup/youtube-popup.component';
@Component({
selector: 'home-component',
@ -14,55 +10,20 @@ import { YoutubePopupComponent } from '../popups/youtube-popup/youtube-popup.com
})
export class HomeComponent {
backgroundTop: string = "0px";
public get showVGC() : boolean {
let maxDate = new Date(2024,7,15,11); // August 15th 2018 -- Set the month one month behind since JavaScript dates are 0 based
let now = new Date();
if (now.getFullYear() > maxDate.getFullYear()) return false;
if (now.getFullYear() == maxDate.getFullYear()) {
if (now.getMonth() > maxDate.getMonth()) return false;
if (now.getMonth() == maxDate.getMonth()) {
if (now.getDate() > maxDate.getDate()) return false;
if (now.getDate() == maxDate.getDate()) {
if (now.getHours() > maxDate.getHours()) return false;
}
}
}
return true;
}
public get showSpecial() : boolean {
let maxDate = new Date(2022,8,18,11); // September 18th 2018 -- Set the month one month behind since JavaScript dates are 0 based
let maxDate = new Date(2018,8,6); // September 6th 2018 -- Set the month one month behind since JavaScript dates are 0 based
let now = new Date();
if (now.getFullYear() > maxDate.getFullYear()) return false;
if (now.getFullYear() == maxDate.getFullYear()) {
if (now.getMonth() > maxDate.getMonth()) return false;
if (now.getMonth() == maxDate.getMonth()) {
if (now.getDate() > maxDate.getDate()) return false;
if (now.getDate() == maxDate.getDate()) {
if (now.getHours() > maxDate.getHours()) return false;
}
}
}
return true;
}
public get showCallToAction(): boolean {
let maxDate = new Date(2020,4,10); // July 8th 2018 -- Set the month one month behind since JavaScript dates are 0 based
let now = new Date();
if (now.getFullYear() > maxDate.getFullYear()) return false;
if (now.getFullYear() == maxDate.getFullYear()) {
if (now.getMonth() > maxDate.getMonth()) return false;
if (now.getMonth() == maxDate.getMonth()) {
if (now.getDate() > maxDate.getDate()) return false;
}
}
return true;
}
public get showVBS(): boolean {
let maxDate = new Date(2019,7,22); // August 22nd 2018 -- Set the month one month behind since JavaScript dates are 0 based
let maxDate = new Date(2019,6,8); // September 6th 2018 -- Set the month one month behind since JavaScript dates are 0 based
let now = new Date();
if (now.getFullYear() > maxDate.getFullYear()) return false;
if (now.getFullYear() == maxDate.getFullYear()) {
@ -74,26 +35,11 @@ export class HomeComponent {
return true;
}
public countdown: Countdown;
public showCountdown: boolean = false;
constructor(private dialog: MatDialog, private http: HttpClient)
constructor(private dialog: MatDialog)
{
this.http.get<VideoServices>('assets/json/videoServices.json').subscribe(res => {
this.countdown = new Countdown(res.videos);
});
}
playVictoryGospelCrusade() {
const url = 'https://drive.google.com/file/d/1gPdCTLkJEtNWEyn_y8FQ78PaDi40MU7N/preview'
let opts = new MatDialogConfig;
opts.data = { title: 'Victory Gospel Crusade', embedUrl: url };
let dialog = this.dialog.open(YoutubePopupComponent, opts);
}
@HostListener('window:scroll', ['$event'])
onScroll(event){
let scrollTop = event.target.documentElement.scrollTop || event.target.body.scrollTop || window.pageYOffset;

View File

@ -1,12 +0,0 @@
export class VideoServices {
videos: VideoService[];
}
export class VideoService {
isReady: boolean;
title: string;
src: string;
date: Date;
archived: boolean;
yt: string;
}

View File

@ -1,16 +0,0 @@
.fab-buttons{
display: none;
}
.side-bar{
position: fixed;
}
@media(max-width:800px){
.fab-buttons{
display: inline-block;
position: fixed;
bottom: 20px;
right: 20px;
}
}

View File

@ -1,13 +0,0 @@
<secondary-page-component [hideSideBarOnMobile]="true" >
<div mainContent class="mapWrapper">
<img style="width: 100%" src="{{imageUrl}}">
<div class="fab-buttons" >
<button mat-fab (click)="share()"><i ofbicon>share</i></button>
</div>
</div>
<div sideBar ofbFadeInOnScroll>
<div class="side-bar">
<button style="width: 100%;" mat-stroked-button (click)="share()"><i ofbicon>share</i> Share</button>
</div>
</div>
</secondary-page-component>

View File

@ -1,40 +0,0 @@
import { BibleVerseService } from './../../services/bible-verse.service';
import { Component, OnInit, Inject, Input } from '@angular/core';
import { MatDialogConfig, MatDialog } from '@angular/material';
import { SharePopupComponent } from '../popups/share-popup/share-popup.component';
import { DOCUMENT } from '@angular/platform-browser';
import { Router, ActivatedRouteSnapshot, ActivatedRoute } from '@angular/router';
@Component({
selector: 'image-component',
templateUrl: './image.component.html',
styleUrls: ['./image.component.css']
})
export class ImageComponent implements OnInit {
public imageUrl: string;
public shareName: string
constructor(private dialog: MatDialog, @Inject(DOCUMENT) private document, private route: ActivatedRoute) {
this.imageUrl = this.route.snapshot.data.imageUrl;
this.shareName = this.route.snapshot.data.shareName;
}
ngOnInit() {
// this.bibleVerseService.randomVerse().subscribe(
// verse => {
// },
// error => console.log(error) );
}
public share() {
let opts = new MatDialogConfig;
opts.data = {
prefix: 'o',
otherName: this.shareName
};
let dialog = this.dialog.open(SharePopupComponent, opts);
}
}

View File

@ -1,17 +0,0 @@
.video-container {
position: relative;
width: 100%;
height: 0;
padding-bottom: 56.25%;
}
.video-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.opacity-zero {
opacity: 0;
}

View File

@ -1,19 +0,0 @@
<secondary-page-component [hideSideBarOnMobile]="true" >
<div mainContent class="mapWrapper">
<h2 *ngIf="!showVideo">{{message}}</h2>
<div class="video-container" *ngIf="showVideo && !yt">
<video [class.opacity-zero]="!showVideo" *ngIf="!error" style="width:100%" [src]="videoSrc" controls [poster]="poster" (error)="vidError()"></video>
</div>
<div *ngIf="showVideo && yt" class="video-container">
<iframe [src]="yt | safeUrl" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<div style="margin-top: 10px">
<button routerLink="/video" style="margin-top:5px; width:100%;" mat-stroked-button>
<b><i ofbicon style="margin-top:-4px; vertical-align: middle;">play_arrow</i> Click here for previous video services</b>
</button>
</div>
</div>
<div sideBar ofbFadeInOnScroll>
</div>
</secondary-page-component>

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { LiveStreamComponent } from './live-stream.component';
describe('LiveStreamComponent', () => {
let component: LiveStreamComponent;
let fixture: ComponentFixture<LiveStreamComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ LiveStreamComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LiveStreamComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,66 +0,0 @@
import { BibleVerseService } from './../../services/bible-verse.service';
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { HttpClient } from '@angular/common/http';
import { VideoServices } from '../home/video-services';
import { DateTime } from "luxon";
@Component({
selector: 'live-stream-component',
templateUrl: './live-stream.component.html',
styleUrls: ['./live-stream.component.css']
})
export class LiveStreamComponent implements OnInit {
public sermonVideo: string = 'https://ofbbutte.com/static/media/video/sermon.mp4';
public pleaseWait: string = 'https://ofbbutte.com/static/media/video/PleaseWait.jpg';
public clickToPlay: string = 'https://ofbbutte.com/static/media/video/ClickToPlay.jpg';
public message: string = "Please Wait...";
public isReady: boolean = false;
public videoSrc: string = this.sermonVideo;
public yt: string;
public poster: string = this.clickToPlay;
public error: boolean = false;
public showVideo: boolean = false;
constructor(private http: HttpClient) { }
private interval;
ngOnInit() {
this.update();
this.interval = setInterval(() => {
this.update();
}, 3000);
}
update() {
this.http.get<VideoServices>('assets/json/videoServices.json').subscribe(res => {
res.videos = res.videos.filter(v => v.archived === false);
res.videos.forEach(v => v.date = DateTime.fromISO(v.date, {zone: 'America/Denver'}));
res.videos.sort((a, b) => {
if (a.date < b.date) return -1;
if (a.date === b.date) return 0;
return 1;
});
var service = res.videos[0];
if (service) {
this.message = (<any>service).message;
if (service.isReady === true) {
this.showVideo = true;
this.videoSrc = '';
this.videoSrc = service.src;
this.yt = service.yt;
clearInterval(this.interval);
}
} else {
this.message = 'No Live Services';
}
});
}
}

View File

@ -6,7 +6,6 @@
</p>
<p>
I hate questionnaires! I've been there. I understand that deputation itself is tough enough already without some pastor probing into all kinds of areas! Then there is the fact that so many fundamental pastors themselves disagree in so many areas!
<br><br>
Now that Ive said what you may have already been thinking, let me also say that I am continually amazed that every church doesnt use a questionnaire to vet their missionaries. The truth is, we take seriously the fact that you are being considered for support by our church and feel that we cant truly get to know you unless we ask some simple questions.
<br><br>
You must understand that anyone whom we consider as a missionary for our Church has certain doctrinal beliefs which are assumed by us or else we would not be sending them a questionnaire. We also realize that good men will differ on some things and will make allowances accordingly. Also, because we have one questionnaire for all candidates, many of the things that are asked would be unnecessary if it were not being sent to everyone. We hope you understand that. In order for a missionary to be considered, we request that every question be answered.
@ -19,7 +18,7 @@
</p>
<br><br>
<form [formGroup]="form" (ngSubmit)="onSubmit()">
<mat-form-field class="w-50" [class.background-error]="hasErrors('name')">
<mat-form-field class="w-50">
<mat-label>Name</mat-label>
<input matInput type="text" formControlName="name" required>
</mat-form-field>
@ -206,15 +205,15 @@
</mat-form-field>
<label id="fellowshipAssociationLabel">Do you claim identity with any group or fellowship such as BBF, GARB, FBF, Other?</label>
<mat-form-field class="w-100" floatLabel="never">
<textarea matInput type="text" placeholder="Your Answer" formControlName="fellowshipAssociation" required></textarea>
<textarea matInput type="text" placeholder="Your Answer" formControlName="fellowshipAssocation" required></textarea>
</mat-form-field>
<label id="collegeRecommendationsLabel">To a young person asking you to recommend a Christian College, list two or three Christian Colleges, in order of preference, which you would recommend?</label>
<label id="collegeRecomendationsLabel">To a young person asking you to recommend a Christian College, list two or three Christian Colleges, in order of preference, which you would recommend?</label>
<label class="sub">Please list the name, city, and state for each</label>
<div *ngIf="form.get('collegeRecommendations').errors?.minColleges && (form.touched || form.dirty)" class="error">
{{form.get('collegeRecommendations').errors?.minColleges}}
<div *ngIf="form.get('collegeRecomendations').errors?.minColleges && (form.touched || form.dirty)" class="error">
{{form.get('collegeRecomendations').errors?.minColleges}}
</div>
<ol>
<li formArrayName="collegeRecommendations" *ngFor="let college of collegeRecommendationFormArray().controls; let i = index;">
<li formArrayName="collegeRecomendations" *ngFor="let college of collegeRecommendationFormArray().controls; let i = index;">
<div [formGroupName]="i">
<mat-form-field floatLabel="never" class="w-100">
<mat-label>Name</mat-label>
@ -316,8 +315,6 @@
<textarea matInput type="text" placeholder="Your Answer" formControlName="honeyPot" required></textarea>
</mat-form-field>
<button mat-raised-button type="submit" [disabled]="!form.valid || submitButtonDisabled">{{submitButtonText}}</button>
<br>
<p *ngIf="!form.valid">Please complete all fields to submit</p>
</form>
</div>
<div sideBar class="side-bar">

View File

@ -64,8 +64,8 @@ export class MissionaryFormPageComponent implements OnInit {
numberWeeklyTracts: ['', [Validators.required, Validators.min(0), Validators.max(10000)]],
rateOfSuccess: ['', Validators.required],
predestination: ['', Validators.required],
fellowshipAssociation: ['', Validators.required],
collegeRecommendations: this.formBuilder.array([this.createCollegeRecommendation(),this.createCollegeRecommendation(),this.createCollegeRecommendation()], this.minCollegeValidator),
fellowshipAssocation: ['', Validators.required],
collegeRecomendations: this.formBuilder.array([this.createCollegeRecommendation(),this.createCollegeRecommendation(),this.createCollegeRecommendation()], this.minCollegeValidator),
admittedWrong: ['', Validators.required],
divorced: [undefined, Validators.required],
groundsForRemarry: [undefined, Validators.required],
@ -120,14 +120,6 @@ export class MissionaryFormPageComponent implements OnInit {
}
}
hasErrors(formControlName: string): boolean {
let res = this.form.get(formControlName) && typeof this.form.get(formControlName).errors !== 'undefined';
if (res === true) {
res = this.form.get(formControlName).dirty || (this.form.get(formControlName).touched && this.form.get(formControlName).valid === false);
}
return res;
}
onSubmit(){
this.errorMessages = [];
if (this.errorMessages.length > 0){ return; }
@ -142,8 +134,10 @@ export class MissionaryFormPageComponent implements OnInit {
private emailSuccess(){
let opts = new MatDialogConfig;
opts.data = { title:'Missionary Support','message':'Thank You! Your submission has been received.' };
opts.data = { title:'Email Sent','message':'Thank You! Your message has been sent.' };
let popup = this.matDialog.open(OkPopupComponent,opts);
this.submitButtonText = "Submit";
this.submitButtonDisabled = false;
popup.afterClosed().subscribe(()=>{
this.submitButtonText = "Form Submitted"
});
@ -152,7 +146,7 @@ export class MissionaryFormPageComponent implements OnInit {
private emailError(){
console.error("error");
let opts = new MatDialogConfig;
opts.data = { title:'Error','message':'Please make sure that you have entered all fields correctly.' };
opts.data = { title:'Email Error','message':'Please make sure that you have entered a valid email address.' };
let popup = this.matDialog.open(OkPopupComponent,opts);
this.submitButtonText = "Submit";
this.submitButtonDisabled = false;

View File

@ -88,8 +88,7 @@ export class AddSermonPopupComponent implements OnInit {
if (this.sermonFile == null){
this.errorMessages.push("Please add a sermon MP3 file");
}
if (this.sermonFile != null && this.sermonFile.type != 'audio/mpeg'){
if (this.sermonFile != null && this.sermonFile.type != 'audio/mp3'){
this.errorMessages.push("File must be a MP3");
}
if (this.errorMessages.length > 0){ this.updateAddButton(true); return; }

View File

@ -1,7 +1,3 @@
.full-width {
width: 100%;
}
.m-5 {
margin: 5px;
}

View File

@ -31,7 +31,7 @@
{{error}}
</p>
</div>
<button mat-raised-button class="first m-5" (click)="cancel($event)" >Cancel</button><!--
--><button mat-raised-button class="m-5" type="submit" [disabled]="!addUserForm.form.valid || addUserButtonDisabled">{{ addUserButtonText }}</button>
<button mat-raised-button class="first" (click)="cancel($event)" >Cancel</button><!--
--><button mat-raised-button type="submit" [disabled]="!addUserForm.form.valid || addUserButtonDisabled">{{ addUserButtonText }}</button>
</form>
</div>

View File

@ -30,12 +30,6 @@ export class SharePopupComponent implements OnInit {
this.id = data.id;
let port = this.document.location.port ? ":"+this.document.location.port : "";
this.shareUrl = this.document.location.protocol +'//'+ this.document.location.hostname + port + this.shareBaseUrl + data.prefix + this.id;
if (this.data.prefix === 'o') {
this.shareUrl = this.document.location.protocol + '//' + this.document.location.hostname + port + this.shareBaseUrl + data.prefix + data.otherName;
}
if (this.data.url) {
this.shareUrl = this.data.url;
}
this.facebookIframeUrl = this.urlPartA + this.shareUrl + this.urlPartB;
this.twitterUrl = this.twitterPartA + data.title + " - " + data.description + "&url=" + this.shareUrl;
}

View File

@ -1,26 +0,0 @@
iframe {
max-width: 100%;
}
h2 {
display: inline-block;
margin-bottom: 15px;
width: calc(100% - 50px);
}
hr{
margin-bottom: 15px;
}
i {
font-size: 24pt;
}
.vertical-align-top {
vertical-align: top;
}
.align-right {
text-align: right;
}

View File

@ -1,10 +0,0 @@
<div md-dialog-title>
<h2>{{title}}</h2>
<button mat-icon-button (click)="close()">
<i ofbicon>close</i>
</button>
</div>
<hr color="primary">
<div md-dialog-content>
<iframe width="560" height="315" [src]="embedUrl | safeUrl" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { YoutubePopupComponent } from './youtube-popup.component';
describe('YoutubePopupComponent', () => {
let component: YoutubePopupComponent;
let fixture: ComponentFixture<YoutubePopupComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ YoutubePopupComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(YoutubePopupComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,26 +0,0 @@
import { Component, OnInit, Inject } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
@Component({
selector: 'app-youtube-popup',
templateUrl: './youtube-popup.component.html',
styleUrls: ['./youtube-popup.component.css']
})
export class YoutubePopupComponent implements OnInit {
public title: string;
public embedUrl: string;
constructor(@Inject(MAT_DIALOG_DATA) public data: any, private MatDialogRef: MatDialogRef<YoutubePopupComponent>) {
this.title = data.title;
this.embedUrl = data.embedUrl;
}
ngOnInit() {
}
public close() {
this.MatDialogRef.close();
}
}

View File

@ -8,7 +8,7 @@
<div class="description">{{ description }}</div><!--
--><div class="action-buttons">
<button mat-button class="action pct40" (click)="play()" ><i ofbicon>headset</i> Listen</button><!--
--><a download="{{title}}" href="{{url}}" mat-button class="action pct50" ><i ofbicon>file_download</i> Download</a><!--
--><button mat-button class="action pct50" (click)="download()" ><i ofbicon>file_download</i> Download</button><!--
--><button mat-button class="action pct10" (click)="share()" ><i ofbicon>share</i> Share</button>
</div><!--
--><div class="action-buttons" *ngIf="loggedIn">

View File

@ -1,92 +0,0 @@
.wrapper{
box-shadow: 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12);
}
.photo{
box-sizing: border-box;
display: inline-block;
max-width: 180px;
margin: 0;
vertical-align: top;
}
.fade{
text-align: center;
vertical-align: bottom;
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 20px;
padding-bottom: 2px;
/* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#ffffff+0,ffffff+100&0+0,0.8+100 */
background: -moz-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(255,255,255,0.8) 100%); /* FF3.6-15 */
background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,0.8) 100%); /* Chrome10-25,Safari5.1-6 */
background: linear-gradient(to bottom, rgba(255,255,255,0) 0%,rgba(255,255,255,0.8) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ccffffff',GradientType=0 ); /* IE6-9 */
}
.photo button{
padding: 0;
vertical-align: top;
}
button img{
display: block;
height: 100%;
width: 100%;
}
.info{
display: inline-block;
vertical-align: top;
padding: 2px 2px 8px 5px;
box-sizing: border-box;
width: calc(100% - 180px);
overflow-y: hidden;
position: relative;
height: 100px;
}
.title{
font-weight: bold;
}
.date, .author{
font-style: italic;
font-size: 14px;
}
.description{
font-size: 14px;
color: darkgray;
word-wrap: none;
border-top: 0px solid lightgray;
padding-top:6px;
margin-top: 6px;
}
.expanded{
overflow-y: hidden;
}
.expanded-content{
margin: 10px;
}
.buttons, .buttons-edit{
background-color: lightgray;
}
.buttons button, .buttons .filler{
display: inline-block;
width: 50%;
}
.border{
margin: 0px 5px 0px 5px;
border-top: 1px inset lightgray;
}
.buttons-edit button{
display: inline-block;
width: 50%;
}

View File

@ -1,26 +0,0 @@
<div class="wrapper" [@inout]="startFadeIn">
<div class="photo">
<button mat-button (click)="play()">
<img src="{{thumbnailUrl}}" />
</button>
</div><!--
--><div class="info" (click)="toggleState()">
<span class="title">{{ title }}</span>
<br>
<span class="date">{{ publishTime | ofbDate:true }}</span>
<br>
<p class="description" [@toggleAnimationFade]="state">
{{ description }}
</p>
<div class="fade"><i ofbicon *ngIf="state === 'closed'">arrow_drop_down</i><i ofbicon *ngIf="state === 'open'">arrow_drop_up</i></div>
</div>
<div class="expanded" [@toggleAnimation]="state" (click)="toggleState()">
<p class="expanded-content">
{{ description }}
</p>
</div>
<div class="buttons">
<button mat-button class="action pct50" (click)="play()" ><i ofbicon>tv</i> Play</button><!--
--><button mat-button class="action pct50" (click)="share()" ><i ofbicon>share</i> Share</button>
</div>
</div>

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { VideoItemComponent } from './video-item.component';
describe('VideoItemComponent', () => {
let component: VideoItemComponent;
let fixture: ComponentFixture<VideoItemComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ VideoItemComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(VideoItemComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,88 +0,0 @@
import { Component, AfterContentInit, Input, Inject } from '@angular/core';
import { MatDialog, MatDialogConfig } from '@angular/material';
import { trigger, state, style, transition, animate } from '@angular/animations';
import { SharePopupComponent } from './../popups/share-popup/share-popup.component';
import { YesNoPopupComponent } from './../popups/yes-no-popup/yes-no-popup.component';
import { YoutubePopupComponent } from '../popups/youtube-popup/youtube-popup.component';
@Component({
selector: 'app-video-item',
templateUrl: './video-item.component.html',
styleUrls: ['./video-item.component.css'],
animations:[
trigger("inout",[
state("1", style({ opacity: '1' })),
state("0",style({ opacity: '0' })),
transition('* => 1',[
animate('500ms ease-in-out')
]),
transition(':enter',[
animate('0ms')
])
]),
trigger('toggleAnimation', [
state('open', style({
height: '*',
})),
state('closed', style({
height: '0px',
})),
transition('open <=> closed', animate('500ms ease-in-out'))
]),
trigger('toggleAnimationFade', [
state('open', style({
opacity: 0,
})),
state('closed', style({
opacity: 1,
})),
transition('open <=> closed', animate('500ms ease-in-out'))
])
]
})
export class VideoItemComponent implements AfterContentInit {
public state: string = 'closed';
@Input()
id: number;
@Input()
title: string;
@Input()
description: string;
@Input()
publishTime: Date;
@Input()
thumbnailUrl: string;
@Input()
shareUrl: string;
@Input()
embedUrl: string;
public startFadeIn: boolean = false;
@Input()
public delayFadeIn: number = 100;
constructor(private dialog: MatDialog){
}
ngAfterContentInit(): void{
setTimeout(() => this.startFadeIn = true, this.delayFadeIn);
}
toggleState(){
this.state = this.state === 'open' ? 'closed' : 'open'
}
share(){
let opts = new MatDialogConfig;
opts.data = { url: this.shareUrl, id: this.id, title: this.title, description: '' };
let dialog = this.dialog.open(SharePopupComponent, opts);
}
play(){
let opts = new MatDialogConfig;
opts.data = { title: this.title, embedUrl:this.embedUrl };
let dialog = this.dialog.open(YoutubePopupComponent, opts);
}
}

View File

@ -1,13 +0,0 @@
.yt-container {
position: relative;
padding-bottom: 56.25%; /* 16:9 */
height: 0;
}
.yt-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}

View File

@ -1,17 +0,0 @@
<secondary-page-component [hideSideBarOnMobile]="true" >
<div mainContent>
<div *ngFor="let video of services; let i = index;" style="margin-top: 10px;">
<button (click)="showVideo(i)" mat-stroked-button style="margin-bottom: 10px;">
<i ofbicon class="mr-10" >live_tv</i>
{{getTitle(i)}}
</button>
<div *ngIf="video.show && video.yt" class="yt-container">
<iframe [src]="video.yt | safeUrl" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
<video style="width:100%" *ngIf="video.show && !video.yt" src="{{video.src}}" controls poster="https://ofbbutte.com/static/media/video/ClickToPlay.jpg"></video>
</div>
</div>
<div sideBar class="side-bar">
</div>
</secondary-page-component>

View File

@ -1,41 +0,0 @@
import { WindowRefService } from './../../services/window-ref.service';
import { Component, HostListener, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { VideoServices, VideoService } from '../home/video-services';
import { DateTime } from "luxon";
@Component({
selector: 'video-services-component',
templateUrl: './video-services.component.html',
styleUrls: ['./video-services.component.css'],
})
export class VideoServicesComponent implements OnInit {
public loading: boolean = true;
public services: VideoService[];
constructor(private http: HttpClient){ }
ngOnInit(){
this.http.get<VideoServices>('assets/json/videoServices.json')
.subscribe(res => {
this.services = res.videos.filter(v => v.isReady === true);
this.loading = false;
});
}
showVideo(index: number) {
this.services.forEach(s => {
(<any>s).show = false;
});
(<any>this.services[index]).show = true;
}
getTitle(index: number): string {
const title = this.services[index].title;
const dte = DateTime.fromISO(this.services[index].date, {zone: 'America/Denver'})
return title + ' | ' + dte.toLocaleString(DateTime.DATETIME_MED);
}
}

View File

@ -1,13 +0,0 @@
.side-bar{
position: fixed;
}
.width100{
width: 100%;
}
#showAllButton{
margin-top: 10px;
}

View File

@ -1,12 +0,0 @@
<secondary-page-component [hideSideBarOnMobile]="true" >
<div mainContent>
<app-youtube-list></app-youtube-list>
</div>
<div sideBar class="side-bar">
</div>
</secondary-page-component>

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { VideoComponent } from './video.component';
describe('VideoComponent', () => {
let component: VideoComponent;
let fixture: ComponentFixture<VideoComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ VideoComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(VideoComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,15 +0,0 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-video',
templateUrl: './video.component.html',
styleUrls: ['./video.component.css']
})
export class VideoComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}

View File

@ -91,6 +91,6 @@ p.margin-bottom {
@media(max-width: 450px) {
.float-left {
width: 200px;
width: 175px
}
}

View File

@ -17,10 +17,9 @@
<img class="image shadow container-3-col" src="assets/images/home-images/tiny/church.jpg" alt="Church Image" />
</div>
<br><br>
<p ofbFadeInOnScroll class="section-header">Pastor Derek Loewen</p>
<div ofbFadeInOnScroll class="section-paragraph overflow-hidden">
<img class="float-left margin-right-10 border-radius-5" src="assets/images/tiny/pstr3.jpg" alt="Pastor Photo" width="350px" />
<img class="float-left margin-right-10 border-radius-5" src="assets/images/tiny/pstr.jpg" alt="Pastor Photo" width="225px" />
<p class="margin-bottom">
Pastor Derek Loewen heard the gospel for the first time when a friend invited him to
Florence Baptist Church in Florence, Montana. They rode the bus to Sunday School.
@ -30,10 +29,10 @@
</p>
<p class="margin-bottom">
During his senior year of high school, Pastor Loewen yielded his life to the Lord.
Upon graduation from Bible College in 2003, he served in the church he
Upon graduation from Crown College of the Bible in 2003, he served in the church he
was saved in as a young boy before marrying his bride, Rebecca in June 2004.
The Lord has graciously allowed them to serve Him together across the country both
assisting pastors and planting a church. God has blessed their home with 5 delightful
assisting pastors and planting a church. God has blessed their home with 3 delightful
children.
</p>
<p>

View File

@ -1,39 +0,0 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { YoutubeSearchResult } from './youtube-snippet';
import { tap } from 'rxjs/operators';
const apiKey = 'AIzaSyDYI1UzFyc-5UvWiN7BqkWm-8vXU6i5Au0';
const baseUrl = `https://www.googleapis.com/youtube/v3/search`;
const part = `snippet`;
const channelId = `UCplK-bimKe_E8k6Gka87IaQ`;
const maxResults = `20`;
const order = `date`;
const itemType = `video`;
@Injectable()
export class YoutubeListService {
constructor(private httpClient: HttpClient){}
private nextPageToken: string;
public getFirstPage() : Observable<YoutubeSearchResult> {
const url = this.getUrl(undefined);
return this.httpClient.get<YoutubeSearchResult>(url).pipe(tap(x => this.nextPageToken = x.nextPageToken));
}
public getNextPage() : Observable<YoutubeSearchResult> {
const url = this.getUrl(this.nextPageToken);
return this.httpClient.get<YoutubeSearchResult>(url).pipe(tap(x => this.nextPageToken = x.nextPageToken));
}
private getUrl(nextPageToken: string): string {
let url = `${baseUrl}?type=${itemType}&part=${part}&channelId=${channelId}&maxResults=${maxResults}&order=${order}&key=${apiKey}`;
if (nextPageToken) {
url = url + `&pageToken=${nextPageToken}`;
}
return url;
}
}

View File

@ -1,24 +0,0 @@
.width100 {
width: 100%;
}
.mt-20 {
margin-top: 20px;
}
ul{
list-style: none;
}
li{
margin: 40px 0px 40px 0px; /* top right bottom left */
}
li:first-child{
margin-top: 0px;
}
li:last-child{
margin-bottom: 0px;
}

View File

@ -1,22 +0,0 @@
<ul>
<li *ngFor="let item of items">
<app-video-item
[title]="item.snippet.title"
[description]="item.snippet.description"
[publishTime]="item.snippet.publishTime"
[thumbnailUrl]="item.snippet.thumbnails.medium.url"
shareUrl="https://youtu.be/{{item.id.videoId}}"
embedUrl="https://www.youtube.com/embed/{{item.id.videoId}}">
</app-video-item>
</li>
</ul>
<button *ngIf="showLoadMore()" mat-button [disabled]="loading" class="width100 mt-20" style="text-align: center;" (click)="loadMore()">
<i ofbicon *ngIf="loading">access_time</i><span *ngIf="loading"> Loading...</span>
<i ofbicon *ngIf="!loading">expand_more</i><span *ngIf="!loading"> Load More</span>
</button>

View File

@ -1,25 +0,0 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { YoutubeListComponent } from './youtube-list.component';
describe('YoutubeListComponent', () => {
let component: YoutubeListComponent;
let fixture: ComponentFixture<YoutubeListComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ YoutubeListComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(YoutubeListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -1,58 +0,0 @@
import { Component, OnInit } from '@angular/core';
import { YoutubeListService } from './youtube-list-service';
import { take } from 'rxjs/operators';
import { YoutubeSnippet, YoutubeSnippetItem, YoutubeSearchResult } from './youtube-snippet';
@Component({
selector: 'app-youtube-list',
templateUrl: './youtube-list.component.html',
styleUrls: ['./youtube-list.component.css']
})
export class YoutubeListComponent implements OnInit {
public loading: boolean = false;
public items: YoutubeSnippetItem[] = [];
private totalResults: number = 0;
constructor(private youtube: YoutubeListService) { }
ngOnInit() {
this.loading = true;
this.youtube.getFirstPage().pipe(take(1)).subscribe(x => {
this.totalResults = x.pageInfo.totalResults;
this.processResults(x);
this.loading = false;
});
}
public showLoadMore() {
if (this.items.length < this.totalResults && this.loading === false) {
return true;
}
return false;
}
public loadMore() {
if (this.items.length >= this.totalResults) {
return;
}
this.loading = true;
this.youtube.getNextPage().pipe(take(1)).subscribe(x => {
this.processResults(x);
this.loading = false;
});
}
private processResults(res: YoutubeSearchResult) {
var parser = new DOMParser;
res.items.forEach(x => x.snippet.title = parser.parseFromString(x.snippet.title, "text/html").body.innerHTML);
if (this.items.length === 0) {
this.items = res.items;
} else {
for(let i = 0; i < res.items.length; i++) {
this.items.push(res.items[i]);
}
}
}
}

View File

@ -1,48 +0,0 @@
export class YoutubeSearchResult {
public kind: string;
public etag: string;
public nextPageToken: string;
public regionCode: string;
public pageInfo: YoutubeSearchResultPageInfo;
public items: YoutubeSnippetItem[];
}
export class YoutubeSearchResultPageInfo {
public totalResults: number;
public resultsPerPage: number;
}
export class YoutubeSnippetItem {
public kind: string;
public etag: string;
public id: YoutubeSnippetId;
public snippet: YoutubeSnippet
}
export class YoutubeSnippetId {
public kind: string;
public videoId: string;
}
export class YoutubeSnippet {
public publishedAt: Date;
public channelId: string;
public title: string;
public description: string;
public channelTitle: string;
public liveBroadcastContent: string;
public publishTime: Date;
public thumbnails: YoutubeSnippetThumbnails;
}
export class YoutubeSnippetThumbnails {
public default: YoutubeThumbnail;
public medium: YoutubeThumbnail;
public high: YoutubeThumbnail;
}
export class YoutubeThumbnail {
public url: string;
public width: number;
public height: number;
}

View File

@ -4,17 +4,16 @@ export const EVENTS_ADD_URL = environment.baseUrl + "/api2/events/a/";
export const EVENT_BY_ID = environment.baseUrl + "/api2/events/";
export const EVENTS_BY_PAGE_URL = environment.baseUrl + "/api2/events/page/";
export const EVENTS_DELETE_BY_ID_URL = environment.baseUrl + "/api2/events/a/";
export const MISSIONARY_SUPPORT_CREATE_URL = environment.baseApi + "/missionary";
export const MISSIONARY_SUPPORT_CREATE_URL = environment.baseUrl + "/2/api/missionary";
export const SERMONS_BY_ID = environment.baseUrl + '/api2/sermons/';
export const SERMONS_BY_PAGE_URL = environment.baseUrl + '/api2/sermons/page/';
export const SERMONS_BY_SEARCH_URL = environment.baseUrl + '/api2/sermons/search';
export const SERMON_MP3_BASE_URL = '/media/';
export const SERMON_MP3_BASE_URL = '//ofbbutte.com/static/media/';
export const SERMON_ADD_URL = environment.baseUrl + "/api2/sermons/a/";
export const SERMON_DELETE_URL = environment.baseUrl + "/api2/sermons/a/";
export const SERMON_UPDATE_URL = environment.baseUrl + "/api2/sermons/a/";
export const SERMON_DOWNLOAD_URL = environment.baseUrl + "/api2/sermons/download/";
export const TRANSACTION_CREATE_URL = environment.baseUrl + "/api2/transactions/a/";
export const TRANSACTION_GET_BY_YEAR_URL = environment.baseUrl + "/api2/transactions/a/";
export const USER_CREATE_URL = environment.baseUrl + "/api2/users/a/";
export const USER_GET_ALL_URL = environment.baseUrl + "/api2/users/a";
export const LOGIN_URL = environment.baseUrl + '/api2/login';

View File

@ -1,7 +1,6 @@
export const ICONS = {
access_time: '&#xE192;',
add: '&#xE145;',
announcement: '&#xE85A;',
close: '&#xE5CD;',
copyright: '&#xE90C;',
delete_forever: '&#xE92B;',

View File

@ -10,9 +10,6 @@ export class OfbDatePipe implements PipeTransform {
console.error("value for ofb-date-pipe was undefined or null");
return value;
}
if (typeof value === 'string') {
value = new Date(value);
}
var year = value.getFullYear();
var month = value.getMonth() + 1;
var day = value.getDate();

View File

@ -1,15 +0,0 @@
import { Injectable } from '@angular/core';
@Injectable()
export class PrintService {
public isPrinting: boolean = false;
constructor(){}
public setPrinting(printing: boolean) {
this.isPrinting = printing;
}
}

View File

@ -4,7 +4,7 @@ import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable, Subject, throwError, of } from 'rxjs';
import { catchError, map, tap, first } from 'rxjs/operators';
import { TRANSACTION_CREATE_URL, TRANSACTION_GET_BY_YEAR_URL } from '../constants/urls';
import { TRANSACTION_CREATE_URL } from '../constants/urls';
import { Transaction } from '../components/add-transaction-page/transaction';
@Injectable()
@ -41,11 +41,6 @@ export class TransactionService {
.pipe(tap(res => console.log(res)), catchError(this.handleError));
}
getByYear(taxYear: number) {
return this.httpClient.get(TRANSACTION_GET_BY_YEAR_URL + "?taxYear=" + taxYear, this.options)
.pipe(catchError(this.handleError));
}
private handleError(error: HttpErrorResponse) {
if (error.error instanceof ErrorEvent) {
// A client-side or network error occurred. Handle it accordingly.

View File

@ -19,7 +19,7 @@ export class UserService {
getAll(){
return this.httpClient.get(USER_GET_ALL_URL, this.options)
.pipe(catchError(this.handleError));
.pipe(tap(res => console.log(res)), catchError(this.handleError));
}
create(firstName: string, lastName: string, street: string, city: string, state: string, zip: string, country: string) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 734 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 638 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 63 KiB

View File

@ -1,154 +0,0 @@
{
"videos": [
{
"isReady": true,
"title": "Sunday Evening",
"src": "",
"yt": "https://www.youtube.com/embed/MTej_Yk5py0",
"date": "2020-05-17T19:00:00-06:00",
"archived": false,
"message": "Please check back later for the Sunday Evening Service"
},
{
"isReady": true,
"title": "Sunday Morning",
"src": "",
"yt": "https://www.youtube.com/embed/7t48zsLmZvM",
"date": "2020-05-17T11:00:00-06:00",
"archived": true,
"message": "Please check back later for the Sunday Morning Service"
},
{
"isReady": true,
"title": "Wednesday Evening",
"src": "",
"yt": "https://www.youtube.com/embed/eUOQ4Cm-eKM",
"date": "2020-05-13T19:00:00-06:00",
"archived": true,
"message": "Please check back later for the Wednesday Evening Service"
},
{
"isReady": true,
"title": "Sunday Evening",
"src": "",
"yt": "https://www.youtube.com/embed/wCqhj3HnhKU",
"date": "2020-05-10T19:00:00-06:00",
"archived": true,
"message": "Please check back later for the Sunday Evening Service"
},
{
"isReady": true,
"title": "Sunday Morning",
"src": "",
"yt": "https://www.youtube.com/embed/kTQ9D7-cLOI",
"date": "2020-05-10T11:00:00-06:00",
"archived": true,
"message": "Please check back later for the Sunday Morning Service"
},
{
"isReady": true,
"title": "Wednesday Evening",
"src": "",
"yt": "https://www.youtube.com/embed/NnzoF1TZ6hM",
"date": "2020-05-06T19:00:00-06:00",
"archived": true,
"message": "Please check back later for the Wednesday Evening Service"
},
{
"isReady": true,
"title": "Sunday Evening",
"src": "",
"yt": "https://www.youtube.com/embed/IBztmi6WUEM",
"date": "2020-05-03T19:00:00-06:00",
"archived": true,
"message": "Please check back later for the Sunday Evening Service"
},
{
"isReady": true,
"title": "Sunday Morning",
"src": "",
"yt": "https://www.youtube.com/embed/czA4T0z6QOU",
"date": "2020-05-03T11:00:00-06:00",
"archived": true,
"message": "Please check back later for the Sunday Morning Service"
},
{
"isReady": true,
"title": "Wednesday Evening",
"src": "",
"yt": "https://www.youtube.com/embed/KIoxrDl6L9o",
"date": "2020-04-29T19:00:00-06:00",
"archived": true,
"message": "Please check back later for the Wednesday Evening Service"
},
{
"isReady": true,
"title": "Sunday Evening",
"src": "https://ofbbutte.com/static/media/video/2020-03-29 1900 Pastor Derek Loewen.mp4",
"yt": "https://www.youtube.com/embed/YdePie9pCrM",
"date": "2020-04-26T11:00:00-06:00",
"archived": true,
"message": "Please check back later for the Sunday Evening Service"
},
{
"isReady": true,
"title": "Sunday Morning",
"src": "https://ofbbutte.com/static/media/video/2020-03-29 1900 Pastor Derek Loewen.mp4",
"yt": "https://www.youtube.com/embed/95_22pM0hTA",
"date": "2020-04-26T11:00:00-06:00",
"archived": true,
"message": "Online service will be available at 3:00 PM"
},
{
"isReady": true,
"title": "Sunday Evening",
"src": "https://ofbbutte.com/static/media/video/2020-03-29 1900 Pastor Derek Loewen.mp4",
"yt": "https://www.youtube.com/embed/o5cKFlPWzfw",
"date": "2020-03-29T20:30:00-06:00",
"archived": true,
"message": "Network congestion is causing delays. Please check back at 8:30 PM."
},
{
"isReady": true,
"title": "Sunday Morning",
"src": "https://ofbbutte.com/static/media/video/2020-03-29 1100 Pastor Derek Loewen.mp4",
"yt": "https://www.youtube.com/embed/kqipYdaQc3k",
"date": "2020-03-29T11:00:00-06:00",
"archived": true,
"message": "Please Wait... Service will begin in aproximately 15 minutes"
},
{
"isReady": true,
"title": "Wednesday Evening",
"src": "https://ofbbutte.com/static/media/video/2020-03-25 1900 Pastor Derek Loewen.mp4",
"date": "2020-03-25T19:00:00-06:00",
"archived": true,
"message": "Please Stay Tuned Until 3/25/2020 at 7:00 PM MDT"
},
{
"isReady": true,
"title": "Sunday Evening",
"src": "https://ofbbutte.com/static/media/video/2020-03-22 1900 Pastor Derek Loewen.mp4",
"date": "2020-03-22T19:00:00-06:00",
"archived": true,
"message": "Please Stay Tuned Until 3/22/2020 at 7:00 PM MDT"
},
{
"isReady": true,
"title": "Sunday Morning",
"src": "https://ofbbutte.com/static/media/video/sermon.mp4",
"date": "2020-03-22T11:00:00-06:00",
"archived": true
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,8 +0,0 @@
{
"title": "Coronavirus Anxiety?",
"description": "The cure for coronavirus anxiety",
"imageUrl": "/covid_header.jpg",
"imageWidth": 750,
"imageHeight": 404,
"url": "/covid"
}

Some files were not shown because too many files have changed in this diff Show More