/// interface IInjectionTargetHeaderStore { [idx : string] : any } type Select = HTMLSelectElement; document.addEventListener('DOMContentLoaded', function (event : any) { var html = "REPLACE_WITH_HTML"; var css = "REPLACE_WITH_CSS"; var div = document.createElement('div'); div.innerHTML = html; var styleTag = document.createElement('style'); //for webkit styleTag.appendChild(document.createTextNode("")); styleTag.innerHTML = css; document.head.appendChild(styleTag); document.body.appendChild(div); var groupSelect = document.getElementById('harness-variant-select'); var harnessSelect = event.currentTarget); ctx.groupName = element.options[element.selectedIndex].value; ctx.updateHarnessList(); ctx.applyDefaultMocks(); ctx.writeToLocalStorage(); } } private harnessSelectHandler(ctx : HarnessClient) : EventListener { return function (event) { var element = (event.currentTarget); ctx.variantName = element.options[element.selectedIndex].value; var harness : Harness = Harness.getHarnessByName(ctx.harnessName); harness.activateVariant(ctx.variantName); ctx.applyDefaultMocks(); ctx.writeToLocalStorage(); } } private mockCheckboxHandler(ctx : HarnessClient, injectionTarget : string, mock : Mock) : EventListener { return function (event) { if (mock === null) { delete ctx.appliedMocks[this.getAttribute('name')]; } else { ctx.appliedMocks[this.getAttribute('name')] = mock.name; } //well this is just silly ... var header = this.parentNode.parentNode.parentNode.parentNode.childNodes[0]; ctx.setHeaderText(header, injectionTarget); ctx.writeToLocalStorage(); }; } private static selectOption(parent : Select, value : string) { for (var i = 0; i < parent.options.length; i++) { var option = parent.options[i]; if (option.value === value) { option.setAttribute('selected', 'true'); } else { option.removeAttribute('selected'); } } } private static createOptions(parent : Select, contents : Array) { contents.sort(); HarnessClient.removeChildren(parent); for (var i = 0; i < contents.length; i++) { var option = document.createElement('option'); option.value = contents[i]; option.text = contents[i]; parent.appendChild(option); } } private static removeChildren(element : HTMLElement) : void { //definitely leaking some event listeners, oh well while (element.firstChild) { element.removeChild(element.firstChild); } } private addAccordionListener(ctx : HarnessClient, injectionTarget : string, card : HTMLElement, header : HTMLElement) { header.addEventListener('click', function (e : MouseEvent) { card.classList.toggle(HarnessClient.ToggleAccordionClass); ctx.openInjectionTargetHeaders[injectionTarget] = !card.classList.contains(HarnessClient.ToggleAccordionClass); ctx.writeToLocalStorage(true); }, false); } private generateMockElements() : void { var parentElement = document.getElementById('harness-mock-accordion'); HarnessClient.removeChildren(parentElement); var fragment = document.createDocumentFragment(); var injectionTargets : Array = Mock.getInjectionTargetList(); for (var i = 0; i < injectionTargets.length; i++) { var card = document.createElement('div'); var header = document.createElement('div'); var contents = document.createElement('div'); if(this.openInjectionTargetHeaders[injectionTargets[i]]) { card.className = "harness-card"; } else { card.className = "harness-card closed"; } header.className = "harness-card-header"; contents.className = "harness-card-contents"; this.setHeaderText(header, injectionTargets[i]); this.addAccordionListener(this, injectionTargets[i], card, header); card.appendChild(header); card.appendChild(contents); contents.appendChild(this.createRadioOption(null, injectionTargets[i])); var mocks = Mock.getMocksForInjectionTarget(injectionTargets[i]); for (var j = 0; j < mocks.length; j++) { contents.appendChild(this.createRadioOption(mocks[j], injectionTargets[i])); } fragment.appendChild(card); } parentElement.appendChild(fragment); } private setHeaderText(header : HTMLElement, injectionTarget : string) : void { var appliedMock = this.appliedMocks[injectionTarget]; if(appliedMock) appliedMock = " [" + appliedMock + "]"; header.innerHTML = "
" + injectionTarget + (appliedMock || '') + "
"; } private createRadioOption(mock : Mock, injectionTarget : string) : HTMLDivElement { var labelText = (mock) ? mock.name : 'None'; var container = document.createElement('div'); container.className = "harness-input-container"; var label = document.createElement('label'); var radio = document.createElement('input'); var textNode = document.createTextNode(' ' + labelText); radio.setAttribute('type', 'radio'); radio.setAttribute('name', injectionTarget); var appliedMock = this.appliedMocks[injectionTarget]; if (!appliedMock && !mock) { radio.setAttribute('checked', 'true'); } else if (appliedMock && mock && appliedMock === mock.name) { radio.setAttribute('checked', 'true'); } radio.addEventListener('change', this.mockCheckboxHandler(this, injectionTarget, mock), false); label.appendChild(radio); label.appendChild(textNode); container.appendChild(label); return container; } public static bootstrap(harness : Harness) : void { var deps = [harness.getRootModuleName()]; window['angular'].module('AngularHarnessApplication', deps).directive('entryPoint', function () { return { template: harness.getTemplate(), templateUrl: harness.getTemplateUrl(), controller: harness.getContext() }; }); var element = document.querySelector("[ng-app]"); if (element) element.removeAttribute("ng-app"); var parent = document.getElementById('harness-page-contents'); parent.innerHTML = ''; parent.setAttribute('ng-app', 'AngularHarnessApplication'); } }