Skip to content

Instantly share code, notes, and snippets.

@smailliwcs
smailliwcs / filter.js
Created September 22, 2020 15:24
Knockout extender: filter
ko.extenders.filter = function (target, pattern) {
var result = ko.computed({
read: target,
write: function (value) {
if (typeof value !== "string") {
target(value);
return;
}
var current = target();
var filtered = value.replace(pattern, "");
@smailliwcs
smailliwcs / numeric.js
Created September 22, 2020 15:24
Knockout extender: numeric
function log(value) {
console.log(typeof value + ": " + value);
}
ko.extenders.numeric1 = function (target) {
return ko.computed({
read: target,
write: function (value) {
var number = parseFloat(value);
target(isNaN(number) ? value : number);
@smailliwcs
smailliwcs / observe.js
Created September 22, 2020 15:24
Knockout extender: observe
ko.extenders.observe = function (target, source) {
target(source);
var result = ko.computed({
read: function () {
return target()();
},
write: function (value) {
target()(value);
}
});
@smailliwcs
smailliwcs / slide.html
Created September 22, 2020 15:24
Knockout binding handler: slide
<script type="text/javascript">
ko.bindingHandlers.slide = {
enabled: true,
queue: "ko.bindingHandlers.slide",
init: function (element, valueAccessor) {
var visible = Boolean(ko.unwrap(valueAccessor()));
$(element).toggle(visible);
},
@smailliwcs
smailliwcs / sortable.html
Created September 22, 2020 15:24
Knockout binding handler: sortable
<script type="text/javascript">
ko.bindingHandlers.sortable = {
normalize: function (valueAccessor) {
var value = ko.unwrap(valueAccessor());
if (typeof value === "object" && "data" in value) {
return value;
} else {
return { data: valueAccessor() };
}
},
@smailliwcs
smailliwcs / tooltip.html
Created September 22, 2020 15:24
Knockout binding handler: tooltip
<script type="text/javascript">
ko.bindingHandlers.tooltip = {
normalize: function (valueAccessor) {
var value = ko.unwrap(valueAccessor());
if (typeof value === "object" && "data" in value) {
return value;
} else {
return { data: value };
}
},
@smailliwcs
smailliwcs / validationPopover.html
Created September 22, 2020 15:24
Knockout binding handler: validationPopover
<script type="text/javascript">
ko.bindingHandlers.validationPopover = {
init: function (element, valueAccessor, allBindings) {
if (!allBindings.has("value")) {
return;
}
var $element = $(element);
var value = allBindings.get("value");
$element.popover($.extend({}, ko.unwrap(valueAccessor()), {
content: function () {
@smailliwcs
smailliwcs / toggler.js
Created September 22, 2020 15:24
jQuery UI widget: toggler
$.widget("scw.toggler", {
options: {
active: true,
animated: true,
duration: "_default",
cssClass: "toggler-active"
},
_finish: function () {
while (this.element.queue().length > 0) {
@smailliwcs
smailliwcs / ObservableObject.cs
Created September 22, 2020 15:24
Implementing INotifyPropertyChanged
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected ObservableObject() { }
@smailliwcs
smailliwcs / STATask.cs
Created September 22, 2020 15:24
Running tasks in STA threads
using System;
using System.Threading;
using System.Threading.Tasks;
public static class STATask
{
public static Task Start(Action action)
{
TaskCompletionSource<object> source = new TaskCompletionSource<object>();
Thread thread = new Thread(() =>