Skip to content

Instantly share code, notes, and snippets.

View danielrose7's full-sized avatar

Daniel Rose danielrose7

View GitHub Profile
@danielrose7
danielrose7 / DisplayLocalStorage.js
Last active December 20, 2022 20:25
react component to read and display localStorage in a _more_ human readable manner
import * as React from "react";
import { SmallButton } from "../../shared"; // a cool <button />
const DisplayLocalStorage = () => {
const [changes, setChanges] = React.useState(0); // triggers re-renders
let localStorageState = {};
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
let value;
@danielrose7
danielrose7 / ClientSideFiltering.js
Last active June 9, 2021 14:10
abstracted, client side filtering with location.search navigation via hooks
import * as React from "react";
import { GET } from "../utils/service"; // a fetch wrapper
import { useFilters } from "../hooks";
import FilterForm from "../components/FilterForm";
// filterTemplate instructs useFilters
// which filters should be allowed
// and how they are to traverse the data object tree
@danielrose7
danielrose7 / application_system_test_case.rb
Last active October 9, 2020 16:38
helpers for debugging webpacker + rails system test for minitest including printing to the console and disabling uglify
# based on https://intellipaat.com/community/16534/is-there-a-way-to-print-javascript-console-errors-to-the-terminal-with-rspec-capybara-selenium
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
JavaScriptError = Class.new(StandardError)
driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400]
def teardown
logs = page.driver.browser.manage.logs.get(:browser)
errors = logs.select { |e| e.level == 'SEVERE' && e.message.present? }
@danielrose7
danielrose7 / passwordVisibilityToggle.js
Last active September 29, 2020 23:35
vanilla JS password visibility toggle
const getPasswordToggleStyle = offsetEl => {
const top = offsetEl.offsetTop + 6;
const left = offsetEl.offsetLeft + offsetEl.clientWidth - 28;
return `position: absolute; top: ${top}px; left: ${left}px; max-height: 16px; vertical-align: top; padding: 0; z-index: 7;`;
};
const addPasswordToggle = domId => {
const el = document.getElementById(domId);
if (!el) return;
@danielrose7
danielrose7 / Autosave.js
Last active September 3, 2020 23:14
Basically FormikPersist but saved on a server not in device-specific storage
import { useEffect, useRef } from "react";
import debounce from "lodash/debounce";
// basically a save-dedicated clone of
// a hook that would be called useDebouncedCallback
const AutoSave = ({
values, // what's in the form
saveProgress, // a network request / api call
interval = 5000, // ms
}) => {
@danielrose7
danielrose7 / cancancan_ability_delegator.rb
Created July 19, 2019 21:00
CanCanCan ability delegator. Like alias_action but across model classes
# frozen_string_literal: true
module Abilities
module AbilityDelegator
def self.included(klass)
klass.class_eval do
def delegate_action(action_or_actions, to:, traversal:, user:)
actions = [*action_or_actions]
can actions, model_class do |instance|
delegate = traversal.reduce(instance, &:public_send)
@danielrose7
danielrose7 / Router.js
Last active May 24, 2019 18:49
useServerRender React hook that fetches DOM from the server and places it (dangerously) into the view. Helpful for migrating legacy applications
// I put this in app/index.js but you do you!
import React, { Suspense, lazy } from "react";
import PropTypes from "prop-types";
import { Route, Switch } from "react-router-dom";
import { SharedProvider } from "../../../modules/something/context"; // to easily share state without going full redux
import SharedHeader from "../../widgets/employees/Header"; // some shared header
import SomeMenu from "./SomeMenu"; // some shared navigation
import { ThreeDotLoader } from "../../shared"; // simple loader
@danielrose7
danielrose7 / google_sheet_report_writer.rb
Last active November 15, 2023 11:37
Write reports straight to google sheets! We use this in our Rails app to run queries and share the data outside the app.
require 'google/apis/sheets_v4'
require 'google/apis/drive_v3'
require 'googleauth'
require 'fileutils'
class GoogleSheetReportWriter
def initialize(notification_email:)
@creds = build_credentials
@notification_email = notification_email
end
@danielrose7
danielrose7 / AnimatedComponent.jsx
Last active August 9, 2018 15:46
Example reusable scss mixin of a slide in animation for a React component using CSSTransitionGroup
import React from "react";
import ReactCSSTransitionGroup from "react-addons-css-transition-group";
import SomeOtherComponentOrChild from "./SomeOtherComponentOrChild" // more likely defined inline
// Great for list items or quick, inline forms!
const AnimatedComponent = props =>
<ReactCSSTransitionGroup
transitionName="transition-name" // creates class that is passed to scss mixin
transitionEnterTimeout={400}
@danielrose7
danielrose7 / starterAuth.js
Last active July 6, 2018 17:08
react-router and several other demos offer up a "fakeAuth". This is a starterAuth that sends an email and password to an external API and then stores the returned auth_token JWT in localStorage. Main benefit of doing so is to persist login between page refreshes.
import fetch from "cross-fetch";
const apiUrl = "//localhost:5000"; // or where ever your api lives!
const checkStatus = response => {
if (response.status >= 200 && response.status < 300) {
return response;
}
const error = new Error(`${response.statusText}`);
error.status = response.statusText;
error.response = response;