Skip to content

Instantly share code, notes, and snippets.

View bartwttewaall's full-sized avatar

Bart Wttewaall bartwttewaall

View GitHub Profile
@bartwttewaall
bartwttewaall / click-outside.js
Last active March 29, 2022 09:03
Detect a click event within or outside an element
var parentElement = document.querySelector('.card');
document.addEventListener('click', (event) => {
// option 1
const isClickInside = parentElement.contains(event.target);
if (!isClickInside) // click outside
// option 2
const isNested = event.target.closest('.card') == parentElement;
if (!isNested) // click outside
@bartwttewaall
bartwttewaall / Extension.php
Created April 28, 2021 12:51
Find the default site's entry by path, then find the entry for the current site/language and return that entry's url
<?php
/** Find primary site's entry by path and return translated variant */
public function getEntryByDefaultPath($defaultPath)
{
$primaryHandle = Craft::$app->getSites()->getPrimarySite()->handle;
$currentHandle = Craft::$app->getSites()->getCurrentSite()->handle;
$primaryEntry = \craft\elements\Entry::find()->site($primaryHandle)->uri($defaultPath)->one();
<?php
/**
* @return array
*/
public function getFilters()
{
return [
new TwigFilter('find', [$this, 'array_find']),
new TwigFilter('findIndex', [$this, 'array_find_index']),
@bartwttewaall
bartwttewaall / resolveLocale.js
Created March 3, 2021 08:52
Tests a segment in a url with a country code (en, nl) or locale pattern (en-UK, nl-BE)
function resolveLocale(url, segmentIndex, defaultLanguage = 'en') {
const segments = url.split('/');
// look for either ISO 3166-1 alpha-2 or combined with ISO 3166-2
const pattern = /\b\w{2}(-\w{2})?\b/gim;
return (segmentIndex < segments.length && pattern.test(segments[segmentIndex]))
? segments[segmentIndex]
: defaultLanguage;
}
@bartwttewaall
bartwttewaall / langservice.service.ts
Last active March 3, 2021 08:54
Quick and dirty translation service in Angular
import { Injectable } from '@angular/core';
import { STRING_MESSAGES } from '../components/comet-chat-components/utils/messageConstants';
import { DA_MESSAGES } from '../i18n/da';
import { DE_MESSAGES } from '../i18n/de';
import { EN_MESSAGES } from '../i18n/en';
import { ES_MESSAGES } from '../i18n/es';
import { FR_MESSAGES } from '../i18n/fr';
import { HU_MESSAGES } from '../i18n/hu';
import { IT_MESSAGES } from '../i18n/it';
import { NL_MESSAGES } from '../i18n/nl';
@bartwttewaall
bartwttewaall / usort-multiple-poperties.twig
Last active January 14, 2022 09:03
Sort on multiple properties by priority and ASC/DESC
{% for language in languages|sort((a, b) => [b.selected, a.title] <=> [a.selected, b.title]) %}
<div class="{{ language.selected ? 'selected' }}">{{ language.title }}</div>
{% endfor %}
{# The order of properties determines priority #}
{# The order of a or b determines ASC or DESC sorting #}
@bartwttewaall
bartwttewaall / match-with-fuzzysearch.js
Created February 8, 2021 08:37
Crossreference 2 lists of users by (fuzzy) name, where users were free to input whatever they wanted. Output as CSV format
import * as users from "/cometchat-users.json";
import * as press from "/press.json";
import * as dealers from "/dealers.json";
import fuzzysort from "fuzzysort";
const toName = (item) => ({
name: item.firstName + " " + item.lastName,
...item,
});
function domReady(callback) {
if (['interactive', 'complete'].includes(document.readyState)) {
callback();
} else {
document.addEventListener('DOMContentLoaded', callback);
}
}
domReady(() => {
if (!document.body) return;
@bartwttewaall
bartwttewaall / timeutils.js
Created January 12, 2021 14:32
Simple time formatting without the use of Date (expensive)
/**
* @param {Number} time in seconds
**/
export function secondsToObject(time) {
const hours = Math.floor(time / 3600);
const minutes = Math.floor((time - hours * 3600) / 60);
const seconds = Math.floor(time - minutes * 60);
return { hours, minutes, seconds };
}
@bartwttewaall
bartwttewaall / searchparams.js
Last active December 2, 2021 14:53
serialize and deserialize between an object and a search string
/**
* (de)serialize an object to a search string, like ?key=value&other=more
**/
export function getSearchValues(key: string) {
const params = new URLSearchParams(location.search);
return params.get(key);
}
export function setSearchParams(key: string, value: any, push = false) {