import { RegExpUtility } from "../text/RegExpUtitlity"; import { DOMEditor } from "./DOMEditor"; export class ClassFlag { static readonly active = new ClassFlag( "active" ); static readonly inactive = new ClassFlag( "inactive" ); static readonly enabled = new ClassFlag( "enabled" ); static readonly disabled = new ClassFlag( "disabled" ); static readonly button = new ClassFlag( "button" ); static readonly visible = new ClassFlag( "visible" ); static readonly invisible = new ClassFlag( "invisible" ); static readonly hidden = new ClassFlag( "hidden" ); static readonly show = new ClassFlag( "show" ); static readonly hideable = new ClassFlag( "hideable" ); static readonly playing = new ClassFlag( "playing" ); static readonly paused = new ClassFlag( "paused" ); static readonly error = new ClassFlag( "error" ); static readonly warning = new ClassFlag( "warning" ); static readonly ok = new ClassFlag( "ok" ); static readonly debugging = new ClassFlag( "debugging" ); static readonly loggedIn = new ClassFlag( "logged-in" ); static readonly loggedOut = new ClassFlag( "logged-out" ); static readonly hovered = new ClassFlag( "hovered" ); static readonly selected = new ClassFlag( "selected" ); static readonly dragging = new ClassFlag( "dragging" ); static readonly smooth = new ClassFlag( "smooth" ); static readonly debug = new ClassFlag( "debug" ); static readonly open = new ClassFlag( "open" ); static readonly default = new ClassFlag( "default" ); static readonly clickable = new ClassFlag( "clickable" ); private _value:string; constructor( value:string ) { this._value = value; } static isIn( flag:string, element:Element ) { return new ClassFlag( flag ).in( element ); } static fromEnum( value:string, prefix = "", appendix = "" ) { let flag = value.toLowerCase().replace( "_", "-" ); return new ClassFlag( prefix + flag + appendix ); } get selector() { return "." + this._value; } query( element:Element ) { return element.querySelector( this.selector ); } queryAll( element:Element ) { return DOMEditor.nodeListToArray( element.querySelectorAll( this.selector ) ); } forEachInDoc( callback:( n:Element ) => void ) { let all = this.queryAll( document.body ); for ( let i = 0; i < all.length; i++) { callback( all[ i ] ); } } forEachIn( source:Element, callback:( n:Element ) => void ) { let all = this.queryAll( source); for ( let i = 0; i < all.length; i++) { callback( all[ i ] ); } } queryPrefixed( element:Element ) { return element.querySelector( `[class^="${this._value}"]` ); } queryPrefixedAll( element:Element ) { return element.querySelectorAll( `[class^="${this._value}"]` ); } queryDoc() { return document.querySelector( this.selector ); } set( element:Element ) { ClassFlag.setClass( element, this._value, true ); return element; } setAll( elements:Element[], selectedElement:Element ) { elements.forEach( e => this.setAs( e, e === selectedElement ) ); } setSolo( element:Element ) { element.setAttribute( "class", this._value ); } setAs( element:Element, value:boolean ) { ClassFlag.setClass( element, this._value, value ); return element; } removeFrom( element:Element ) { ClassFlag.setClass( element, this._value, false ); return element; } toggle( element:Element ) { ClassFlag.toggleClass( element, this._value ); return element; } in( element:Element ) { return ClassFlag.hasClass( element, this._value ); } static clear( element: Element ) { element.removeAttribute( "class" ); } static assign( element:Element, value:string ) { new ClassFlag( value ).set( element ); } static addClass( element:Element, classString:string ) { element.classList.add( classString ); } static removeClass( element:Element, classString:string ) { element.classList.remove( classString ); } static hasClass( element:Element, classString:string ) { return element.classList.contains( classString ); } static toggleClass( element:Element, className:string ) { element.classList.toggle( className ); } static setClass( element:Element, classString:string, enable:boolean ) { if ( enable ) { ClassFlag.addClass( element, classString ); } else { ClassFlag.removeClass( element, classString ); } } static toggleClassState( element:Element, classString:string ) { let hasClassAssigned = ClassFlag.hasClass( element, classString ); ClassFlag.setClass( element, classString, ! hasClassAssigned ); } }