// from the Noded/frontend project - src/app/components/editor/database/editors/paragraph/paragraph-editor.component.tsimport {ICellEditorAngularComp} from 'ag-grid-angular';import {AfterViewInit, Component, ElementRef, ViewChild} from '@angular/core';import {ICellEditorParams} from 'ag-grid-community';import {ModalController} from '@ionic/angular';import {ParagraphModalComponent} from './paragraph-modal.component';@Component({  selector: 'cell-editor-paragraph',  template: `<input #input [(ngModel)]="value" readonly>`,  styles: [    `input {      width: 100%;      border: 1px solid grey;    }`  ],})export class ParagraphEditorComponent implements ICellEditorAngularComp, AfterViewInit {  private params: ICellEditorParams;  public value: string;  @ViewChild('input', {static: false}) input: ElementRef;  constructor(    protected modals: ModalController,  ) { }  agInit(params: ICellEditorParams): void {    this.params = params;    this.value = this.params.value;  }  getValue(): any {    return this.value;  }  ngAfterViewInit(): void {    setTimeout(() => {      this.modals.create({        component: ParagraphModalComponent,        componentProps: {          title: this.params.colDef.headerName,          value: this.value,        }      }).then(modal => {        modal.onDidDismiss().then(value => {          if ( typeof value.data === 'undefined' ) {            return;          }          this.value = String(value.data);        });        modal.present();      });    });  }}// from the Noded/frontend project - src/app/components/editor/database/editors/paragraph/paragraph-editor.component.tsimport {ICellEditorAngularComp} from 'ag-grid-angular';import {AfterViewInit, Component, ElementRef, ViewChild} from '@angular/core';import {ICellEditorParams} from 'ag-grid-community';import {ModalController} from '@ionic/angular';import {ParagraphModalComponent} from './paragraph-modal.component';@Component({  selector: 'cell-editor-paragraph',  template: `<input #input [(ngModel)]="value" readonly>`,  styles: [    `input {      width: 100%;      border: 1px solid grey;    }`  ],})export class ParagraphEditorComponent implements ICellEditorAngularComp, AfterViewInit {  private params: ICellEditorParams;  public value: string;  @ViewChild('input', {static: false}) input: ElementRef;  constructor(    protected modals: ModalController,  ) { }  agInit(params: ICellEditorParams): void {    this.params = params;    this.value = this.params.value;  }  getValue(): any {    return this.value;  }  ngAfterViewInit(): void {    setTimeout(() => {      this.modals.create({        component: ParagraphModalComponent,        componentProps: {          title: this.params.colDef.headerName,          value: this.value,        }      }).then(modal => {        modal.onDidDismiss().then(value => {          if ( typeof value.data === 'undefined' ) {            return;          }          this.value = String(value.data);        });        modal.present();      });    });  }}// from the Noded/frontend project - src/app/components/editor/database/editors/paragraph/paragraph-editor.component.tsimport {ICellEditorAngularComp} from 'ag-grid-angular';import {AfterViewInit, Component, ElementRef, ViewChild} from '@angular/core';import {ICellEditorParams} from 'ag-grid-community';import {ModalController} from '@ionic/angular';import {ParagraphModalComponent} from './paragraph-modal.component';@Component({  selector: 'cell-editor-paragraph',  template: `<input #input [(ngModel)]="value" readonly>`,  styles: [    `input {      width: 100%;      border: 1px solid grey;    }`  ],})export class ParagraphEditorComponent implements ICellEditorAngularComp, AfterViewInit {  private params: ICellEditorParams;  public value: string;  @ViewChild('input', {static: false}) input: ElementRef;  constructor(    protected modals: ModalController,  ) { }  agInit(params: ICellEditorParams): void {    this.params = params;    this.value = this.params.value;  }  getValue(): any {    return this.value;  }  ngAfterViewInit(): void {    setTimeout(() => {      this.modals.create({        component: ParagraphModalComponent,        componentProps: {          title: this.params.colDef.headerName,          value: this.value,        }      }).then(modal => {        modal.onDidDismiss().then(value => {          if ( typeof value.data === 'undefined' ) {            return;          }          this.value = String(value.data);        });        modal.present();      });    });  }}

Hi, there.

My name is Garrett.

I'm a speaker, developer, and designer.

Hi, there.

My name is Garrett.

I'm a speaker, developer, and designer.

about me

Hi! My name is Garrett. Welcome to my little corner of the internet. I'm a self-taught developer and tech-nerd. I create software that I hope makes people's lives better. I created the Flitter web framework, and a couple other fun projects. I love to communicate my work, and help others pursue their projects, which is why I've got a long history of sharing about my passion. I write blog posts, create video tutorials, hold talks, and publish code from my projects in the hope that others will find it useful.

A bit more background: I grew up in the rural mid-west, so I taught myself everything I know. I'm a big fan of learning to code this way. I'm currently studying computer science at the University of Kansas.

about me

Hi! My name is Garrett. Welcome to my little corner of the internet. I'm a self-taught developer and tech-nerd. I create software that I hope makes people's lives better. I created the Flitter web framework, and a couple other fun projects. I love to communicate my work, and help others pursue their projects, which is why I've got a long history of sharing about my passion. I write blog posts, create video tutorials, hold talks, and publish code from my projects in the hope that others will find it useful.

A bit more background: I grew up in the rural mid-west, so I taught myself everything I know. I'm a big fan of learning to code this way. I'm currently studying computer science at the University of Kansas.

get in touch

I'd love to hear from you if you have questions or inquiries related to me or my projects. You can get in touch by text, e-mail, or using this form. I also tweet sometimes, and share thoughts on my blog.

E-Mail: shout@garrettmills.dev
Phone: (913) 730-7124

I'd love to hear from you if you have questions or inquiries related to me or my projects. You can get in touch by text, e-mail, or using this form. I also tweet sometimes, and share thoughts on my blog.

E-Mail: shout@garrettmills.dev
Phone: (913) 730-7124

what I've been up to

Blog Post

Blog Post

How to Code From Home Like a Boss

With the current need to work from home, I've put together a list of tricks and tools I use to do my work as a software developer remotely, and discuss the challenges. Here's what I use.

2020-07-23T09:15:49.731Z

Code Release

Code Release

Feed Page, RSS, & Atom - Minor Website Updates I recently made some tweaks to my website. I added a dedicated page as a historical archive for these updates.

I also added the ability to subscribe to this feed using RSS, Atom, and JSON thanks to a handy NPM package.

2020-05-09T00:30:33.192Z

Code Release

Code Release

VuES6 - ES6 Vue.js Components, in Plain JavaScript

I recently released a small utility library for defining Vue components as proper ES6 classes, but in vanilla JavaScript. I like to use this in small projects where I don't want to have to set up vue-cli and compile templates. More info here.

2020-04-22T23:17:15.369Z

Side Project

Side Project

Connect-4 Webtoy

I've built a simple Connect-4 webtoy as a project for EECS 368 at the University of Kansas. You can play with it here.

2020-04-08T14:20:25.849Z

Blog Post

Blog Post

Code Freedom with Gitea & Drone - Part I

In my never-ending quest to self-host all the things, I've deployed a combination of Gitea and Drone CI for a feature-for-feature, self-hosted alternative to GitHub. Here's how.

2020-03-07T05:10:49.731Z

HackKU 2020

HackKU 2020

Noded - Free-Form Notes & Databases

I recently attended the annual University of Kansas hackathon, where me and a couple friends built Noded.

Noded is a tree-based note taking app based on reusable page elements. It provides support for basic notes, uploaded files, a built-in code editor, customizable databases, static website exports, and sub-tree sharing. Check it out here.

2020-02-25T01:28:06.154Z

Garrett Mills
Copyright © 2020 Garrett Mills