{ "version": 3, "sources": ["node_modules/imba/src/imba/dom/bind.imba"], "sourcesContent": ["import {\n\tElement,\n\tHTMLSelectElement,\n\tHTMLInputElement,\n\tHTMLButtonElement,\n\tHTMLTextAreaElement,\n\tHTMLOptionElement\n} from './core'\n\nimport {commit} from '../scheduler'\n\n# TODO use meta properties for $$value, $$bound etc\n\nexport def use_dom_bind\n\tyes\n\nconst toBind = {\n\tINPUT: yes\n\tSELECT: yes\n\tTEXTAREA: yes\n\tBUTTON: yes\n}\n\nlet isGroup = do(obj)\n\treturn obj isa Array or (obj && obj.has isa Function)\n\nlet bindHas = do(object,value)\n\tif object == value\n\t\treturn true\n\telif object isa Array\n\t\tobject.indexOf(value) >= 0\n\telif object and object.has isa Function\n\t\tobject.has(value)\n\telif object and object.contains isa Function\n\t\tobject.contains(value)\n\telse\n\t\treturn false\n\nlet bindAdd = do(object,value)\n\tif object isa Array\n\t\tobject.push(value)\n\telif object and object.add isa Function\n\t\tobject.add(value)\n\nlet bindRemove = do(object,value)\n\tif object isa Array\n\t\tlet idx = object.indexOf(value)\n\t\tobject.splice(idx,1) if idx >= 0\n\telif object and object.delete isa Function\n\t\tobject.delete(value)\n\ndef createProxyProperty target\n\tdef getter\n\t\ttarget[0] ? target[0][target[1]] : undefined\n\n\tdef setter v\n\t\ttarget[0] ? (target[0][target[1]] = v) : null\n\n\treturn {\n\t\tget: getter\n\t\tset: setter\n\t}\n\n###\nData binding\n###\nextend class Element\n\tdef getRichValue\n\t\tself.value\n\n\tdef setRichValue value\n\t\tself.value = value\n\t\n\tdef bind$ key, value\n\t\tlet o = value or []\n\n\t\tif key == 'data' and !$$bound and toBind[nodeName]\n\t\t\t$$bound = yes\n\t\t\tif change$\n\t\t\t\taddEventListener('change',change$ = change$.bind(this))\n\t\t\tif input$\n\t\t\t\taddEventListener('input',input$ = input$.bind(this),capture: yes)\n\t\t\tif click$\n\t\t\t\taddEventListener('click',click$ = click$.bind(this),capture: yes)\n\t\t\t# this.on$('change',{_change$: true},this) if this.change$\n\t\t\t# this.on$('input',{capture: true,_input$: true},this) if this.input$\n\n\t\tObject.defineProperty(self,key,o isa Array ? createProxyProperty(o) : o)\n\t\treturn o\n\nObject.defineProperty(Element.prototype,'richValue',{\n\tget: do this.getRichValue()\n\tset: do(v) this.setRichValue(v)\n})\n\nextend class HTMLSelectElement\n\n\tdef change$ e\n\t\tlet model = self.data\n\t\tlet prev = $$value\n\t\t$$value = undefined\n\t\tlet values = self.getRichValue()\n\n\t\tif self.multiple\n\t\t\tif prev\n\t\t\t\tfor value in prev when values.indexOf(value) == -1\n\t\t\t\t\tbindRemove(model,value)\n\n\t\t\tfor value in values\n\t\t\t\tif !prev or prev.indexOf(value) == -1\n\t\t\t\t\tbindAdd(model,value)\n\t\telse\n\t\t\tself.data = values[0]\n\t\tcommit!\n\t\tself\n\n\tdef getRichValue\n\t\tif $$value\n\t\t\treturn $$value\n\n\t\t$$value = for o in self.selectedOptions\n\t\t\to.richValue\n\n\tdef syncValue\n\t\tlet model = self.data\n\n\t\tif self.multiple\n\t\t\tlet vals = []\n\t\t\tfor option,i in self.options\n\t\t\t\tlet val = option.richValue\n\t\t\t\tlet sel = bindHas(model,val)\n\t\t\t\toption.selected = sel\n\t\t\t\tvals.push(val) if sel\n\t\t\t$$value = vals\n\n\t\telse\n\t\t\tfor option,i in self.options\n\t\t\t\tlet val = option.richValue\n\t\t\t\tif val == model\n\t\t\t\t\t$$value = [val]\n\t\t\t\t\tbreak self.selectedIndex = i\n\t\treturn\n\n\tdef #afterVisit\n\t\tself.syncValue()\n\nextend class HTMLOptionElement\n\tdef setRichValue value\n\t\t$$value = value\n\t\tself.value = value\n\n\tdef getRichValue\n\t\tif $$value !== undefined\n\t\t\treturn $$value\n\t\treturn self.value\n\nextend class HTMLTextAreaElement\n\tdef setRichValue value\n\t\t$$value = value\n\t\tself.value = value\n\n\tdef getRichValue\n\t\tif $$value !== undefined\n\t\t\treturn $$value\n\t\treturn self.value\n\n\tdef input$ e\n\t\tself.data = self.value\n\t\tcommit!\n\n\tdef #afterVisit\n\t\tif $$bound and self.value != self.data\n\t\t\tself.value = self.data\n\n\n\nextend class HTMLInputElement\n\t\n\tdef input$ e\n\t\tlet typ = self.type\n\n\t\tif typ == 'checkbox' or typ == 'radio'\n\t\t\treturn\n\n\t\t$$value = undefined\n\t\tself.data = self.richValue\n\t\tcommit!\n\n\tdef change$ e\n\t\tlet model = self.data\n\t\tlet val = self.richValue\n\n\t\tif self.type == 'checkbox' or self.type == 'radio'\n\t\t\tlet checked = self.checked\n\t\t\tif isGroup(model)\n\t\t\t\tchecked ? bindAdd(model,val) : bindRemove(model,val)\n\t\t\telse\n\t\t\t\tself.data = checked ? val : false\n\t\tcommit!\n\n\tdef setRichValue value\n\t\tif $$value !== value\n\t\t\t$$value = value\n\n\t\t\tif self.value !== value\n\t\t\t\tself.value = value\n\t\treturn\n\n\tdef getRichValue\n\t\tif $$value !== undefined\n\t\t\treturn $$value\n\n\t\tlet value = self.value\n\t\tlet typ = self.type\n\n\t\tif typ == 'range' or typ == 'number'\n\t\t\tvalue = self.valueAsNumber\n\t\t\tvalue = null if Number.isNaN(value)\n\t\telif typ == 'checkbox'\n\t\t\tvalue = true if value == undefined or value === 'on'\n\n\t\treturn value\n\n\tdef #afterVisit\n\t\tif $$bound\n\t\t\tlet typ = self.type\n\t\t\tif typ == 'checkbox' or typ == 'radio'\n\t\t\t\tlet val = self.data\n\t\t\t\tif val === true or val === false or val == null\n\t\t\t\t\tself.checked = !!val\n\t\t\t\telse\n\t\t\t\t\tself.checked = bindHas(val,self.richValue)\n\t\t\telse\n\t\t\t\tself.richValue = self.data\n\t\treturn\n\t\t\nextend class HTMLButtonElement\n\n\tget checked\n\t\t$checked\n\t\t\n\tset checked val\n\t\tif val != $checked\n\t\t\t$checked = val\n\t\t\tflags.toggle('checked',!!val)\n\t\n\tdef setRichValue value\n\t\t$$value = value\n\t\tself.value = value\n\n\tdef getRichValue\n\t\tif $$value !== undefined\n\t\t\treturn $$value\n\t\treturn self.value\n\t\t\n\tdef click$ e\n\t\tlet data = self.data\n\t\tlet toggled = self.checked\n\t\tlet val = self.richValue\n\t\t# if self.type == 'checkbox' or self.type == 'radio'\n\t\tif isGroup(data)\n\t\t\ttoggled ? bindRemove(data,val) : bindAdd(data,val)\n\t\telif $$value == undefined\n\t\t\tself.data = toggled ? false : true\n\t\telse\n\t\t\tself.data = toggled ? null : val\n\t\t#afterVisit!\n\t\tcommit!\n\n\tdef #afterVisit\n\t\tif $$bound\n\t\t\tlet data = self.data\n\t\t\tlet val = $$value == undefined ? yes : $$value\n\t\t\t\n\t\t\tif isGroup(data)\n\t\t\t\tself.checked = bindHas(data,val)\n\t\t\telse\n\t\t\t\tself.checked = data == val\n\t\treturn"], "mappings": "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", "names": [] }