abyme 0.6.5 → 0.6.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 380781ef1fe05c0f22184cda0d225b5be7d26d1c79f32bb8d79b9245cb33fb3d
4
- data.tar.gz: 8f91337ca76f7bfe75440191cb517fe577484f18a76bb00151cae93f289db0cd
3
+ metadata.gz: d3d4875d1b6733fb09f7fa6b68be69d8b84da7b2934ab62902362d94c777e37d
4
+ data.tar.gz: 300911ba93385f8c1320be6a2f6da518a4aa6731ac53434144b352f8065914b1
5
5
  SHA512:
6
- metadata.gz: c436e9f762efcba90ba2a1350af131c37f1e4225ba55529b634760e01a3173512d7395359eba6c2b25b5c06b078b731732e90776c5375ee847f77268ac39e42d
7
- data.tar.gz: a355cb770cafe56942a31232afeae185855b15f27e1f6a923840ef41c8fe880f805c624993121bf2fd0c31db540185b2c2d98eb2189f8fa7487afbb1b5f1ef46
6
+ metadata.gz: 1de2a81b92eae1a1526e5e8199d517d9fda8d88229b78b9c0fe2b34a245b545dc43e9ad167fe405f514abb6fad1b2af45b1f1a0d75b40b8efceb981c82fad00c
7
+ data.tar.gz: 37fa3175a0c1d93299432afe45c52cfb9c1dabba9c260b159355643fda2d677d839480e1679b290dfdb8251672be387eaaf2ef38f53ac301c5adeb17a4d39bc4
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- abyme (0.6.5)
4
+ abyme (0.6.6)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -45,8 +45,14 @@ And then execute:
45
45
  $ bundle
46
46
  $ yarn add abyme
47
47
 
48
+ ***IMPORTANT : With the launch of Stimulus V3 (which introduced a lot of changes), the connection with the AbymeController won't work. Please, make sure you're using Stimulus V2 for now.***
48
49
 
49
- Assuming you [already installed Stimulus](https://stimulusjs.org/handbook/introduction), you need to register the `stimulus` controller that takes care of the JavaScript behaviour. You can launch this generator :
50
+ If you don't have Stimulus installed yet, please run :
51
+ ```bash
52
+ yarn add stimulus@2.0.0
53
+ ```
54
+
55
+ With [Stimulus](https://stimulusjs.org/handbook/introduction) installed, you need to register the `stimulus` controller that takes care of the JavaScript behaviour. You can launch this generator :
50
56
  ```bash
51
57
  rails generate abyme:stimulus
52
58
  ```
data/dist/abyme.js CHANGED
@@ -1,2 +1,2 @@
1
- function e(t,n){return(e=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(t,n)}function t(e,n,i){if(!e.s){if(i instanceof r){if(!i.s)return void(i.o=t.bind(null,e,n));1&n&&(n=i.s),i=i.v}if(i&&i.then)return void i.then(t.bind(null,e,n),t.bind(null,e,2));e.s=n,e.v=i;var o=e.o;o&&o(e)}}var n=function(n){var o,a;function s(){return n.apply(this,arguments)||this}a=n,(o=s).prototype=Object.create(a.prototype),o.prototype.constructor=o,e(o,a);var c,u=s.prototype;return u.connect=function(){console.log("Abyme Connected"),this.count&&this.add_default_associations()},u.add_association=function(e){if(e&&e.preventDefault(),this.element.dataset.limit&&this.limit_check())return this.create_event("limit-reached"),!1;var t=this.build_html();this.create_event("before-add"),this.associationsTarget.insertAdjacentHTML(this.position,t),this.create_event("after-add")},u.remove_association=function(e){e.preventDefault(),this.create_event("before-remove"),this.mark_for_destroy(e),this.create_event("after-remove")},u.create_event=function(e,t){void 0===t&&(t=null);var n=new CustomEvent("abyme:"+e,{detail:{controller:this,content:t}});this.element.dispatchEvent(n),this.dispatch(n,e)},u.dispatch=function(e,t){"before-add"===t&&this.abymeBeforeAdd&&this.abymeBeforeAdd(e),"after-add"===t&&this.abymeAfterAdd&&this.abymeAfterAdd(e),"before-remove"===t&&this.abymeBeforeRemove&&this.abymeBeforeAdd(e),"after-remove"===t&&this.abymeAfterRemove&&this.abymeAfterRemove(e)},u.abymeBeforeAdd=function(e){},u.abymeAfterAdd=function(e){},u.abymeBeforeRemove=function(e){},u.abymeAfterRemove=function(e){},u.build_html=function(){var e=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,(new Date).getTime());if(e.match(/<template[\s\S]+<\/template>/)){var t=e.match(/<template[\s\S]+<\/template>/)[0].replace(/(\[\d{12,}\])(\[[^\[\]]+\]"){1}/g,"[NEW_RECORD]$2");e=e.replace(/<template[\s\S]+<\/template>/g,t)}return e},u.mark_for_destroy=function(e){var t=e.target.closest(".abyme--fields");t.querySelector("input[name*='_destroy']").value=1,t.style.display="none",t.classList.add("abyme--marked-for-destroy")},u.limit_check=function(){return this.newFieldsTargets.filter(function(e){return!e.classList.contains("abyme--marked-for-destroy")}).length>=parseInt(this.element.dataset.limit)},u.add_default_associations=function(){try{var e=this,n=0,o=function(e,n,o){for(var a;;){var s=e();if(i(s)&&(s=s.v),!s)return c;if(s.then){a=0;break}var c=o();if(c&&c.then){if(!i(c)){a=1;break}c=c.s}}var u=new r,f=t.bind(null,u,2);return(0===a?s.then(h):1===a?c.then(d):(void 0).then(function(){(s=e())?s.then?s.then(h).then(void 0,f):h(s):t(u,1,c)})).then(void 0,f),u;function d(n){c=n;do{if(!(s=e())||i(s)&&!s.v)return void t(u,1,c);if(s.then)return void s.then(h).then(void 0,f);i(c=o())&&(c=c.v)}while(!c||!c.then);c.then(d).then(void 0,f)}function h(e){e?(c=o())&&c.then?c.then(d).then(void 0,f):d(c):t(u,1,c)}}(function(){return n<e.count},0,function(){return e.add_association(),n++,Promise.resolve(e.sleep(1)).then(function(){})});return Promise.resolve(o&&o.then?o.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},u.sleep=function(e){return new Promise(function(t){return setTimeout(t,e)})},(c=[{key:"count",get:function(){return this.element.dataset.minCount||0}},{key:"position",get:function(){return"end"===this.associationsTarget.dataset.abymePosition?"beforeend":"afterbegin"}}])&&function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(s.prototype,c),s}(require("stimulus").Controller),r=function(){function e(){}return e.prototype.then=function(n,r){var i=new e,o=this.s;if(o){var a=1&o?n:r;if(a){try{t(i,1,a(this.v))}catch(e){t(i,2,e)}return i}return this}return this.o=function(e){try{var o=e.v;1&e.s?t(i,1,n?n(o):o):r?t(i,1,r(o)):t(i,2,o)}catch(e){t(i,2,e)}},i},e}();function i(e){return e instanceof r&&1&e.s}n.targets=["template","associations","fields","newFields"],exports.AbymeController=n;
1
+ function e(t,n){return e=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},e(t,n)}function t(e,n,i){if(!e.s){if(i instanceof r){if(!i.s)return void(i.o=t.bind(null,e,n));1&n&&(n=i.s),i=i.v}if(i&&i.then)return void i.then(t.bind(null,e,n),t.bind(null,e,2));e.s=n,e.v=i;var o=e.o;o&&o(e)}}var n=function(n){var o,a;function s(){return n.apply(this,arguments)||this}a=n,(o=s).prototype=Object.create(a.prototype),o.prototype.constructor=o,e(o,a);var c,f,u=s.prototype;return u.connect=function(){console.log("Abyme Connected"),this.count&&this.add_default_associations()},u.add_association=function(e){if(e&&e.preventDefault(),this.element.dataset.limit&&this.limit_check())return this.create_event("limit-reached"),!1;var t=this.build_html();this.create_event("before-add"),this.associationsTarget.insertAdjacentHTML(this.position,t),this.create_event("after-add")},u.remove_association=function(e){e.preventDefault(),this.create_event("before-remove"),this.mark_for_destroy(e),this.create_event("after-remove")},u.create_event=function(e,t){void 0===t&&(t=null);var n=new CustomEvent("abyme:"+e,{detail:{controller:this,content:t}});this.element.dispatchEvent(n),this.dispatch(n,e)},u.dispatch=function(e,t){"before-add"===t&&this.abymeBeforeAdd&&this.abymeBeforeAdd(e),"after-add"===t&&this.abymeAfterAdd&&this.abymeAfterAdd(e),"before-remove"===t&&this.abymeBeforeRemove&&this.abymeBeforeAdd(e),"after-remove"===t&&this.abymeAfterRemove&&this.abymeAfterRemove(e)},u.abymeBeforeAdd=function(e){},u.abymeAfterAdd=function(e){},u.abymeBeforeRemove=function(e){},u.abymeAfterRemove=function(e){},u.build_html=function(){var e=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,(new Date).getTime());if(e.match(/<template[\s\S]+<\/template>/)){var t=e.match(/<template[\s\S]+<\/template>/)[0].replace(/(\[\d{12,}\])(\[[^\[\]]+\]"){1}/g,"[NEW_RECORD]$2");e=e.replace(/<template[\s\S]+<\/template>/g,t)}return e},u.mark_for_destroy=function(e){var t=e.target.closest(".abyme--fields");t.querySelector("input[name*='_destroy']").value=1,t.style.display="none",t.classList.add("abyme--marked-for-destroy")},u.limit_check=function(){return this.newFieldsTargets.filter(function(e){return!e.classList.contains("abyme--marked-for-destroy")}).length>=parseInt(this.element.dataset.limit)},u.add_default_associations=function(){try{var e=this,n=0,o=function(e,n,o){for(var a;;){var s=e();if(i(s)&&(s=s.v),!s)return c;if(s.then){a=0;break}var c=o();if(c&&c.then){if(!i(c)){a=1;break}c=c.s}}var f=new r,u=t.bind(null,f,2);return(0===a?s.then(h):1===a?c.then(d):(void 0).then(function(){(s=e())?s.then?s.then(h).then(void 0,u):h(s):t(f,1,c)})).then(void 0,u),f;function d(n){c=n;do{if(!(s=e())||i(s)&&!s.v)return void t(f,1,c);if(s.then)return void s.then(h).then(void 0,u);i(c=o())&&(c=c.v)}while(!c||!c.then);c.then(d).then(void 0,u)}function h(e){e?(c=o())&&c.then?c.then(d).then(void 0,u):d(c):t(f,1,c)}}(function(){return n<e.count},0,function(){return e.add_association(),n++,Promise.resolve(e.sleep(1)).then(function(){})});return Promise.resolve(o&&o.then?o.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},u.sleep=function(e){return new Promise(function(t){return setTimeout(t,e)})},c=s,(f=[{key:"count",get:function(){return this.element.dataset.minCount||0}},{key:"position",get:function(){return"end"===this.associationsTarget.dataset.abymePosition?"beforeend":"afterbegin"}}])&&function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(c.prototype,f),Object.defineProperty(c,"prototype",{writable:!1}),s}(require("stimulus").Controller),r=function(){function e(){}return e.prototype.then=function(n,r){var i=new e,o=this.s;if(o){var a=1&o?n:r;if(a){try{t(i,1,a(this.v))}catch(e){t(i,2,e)}return i}return this}return this.o=function(e){try{var o=e.v;1&e.s?t(i,1,n?n(o):o):r?t(i,1,r(o)):t(i,2,o)}catch(e){t(i,2,e)}},i},e}();function i(e){return e instanceof r&&1&e.s}n.targets=["template","associations","fields","newFields"],exports.AbymeController=n;
2
2
  //# sourceMappingURL=abyme.js.map
data/dist/abyme.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"abyme.js","sources":["../src/abyme_controller.js"],"sourcesContent":["import { Controller } from 'stimulus';\n\nexport default class extends Controller {\n // static targets = ['template', 'associations', 'fields', 'newFields'];\n // Some applications don't compile correctly with the usual static syntax. \n // Thus implementing targets with standard getters below\n\n static targets = ['template', 'associations', 'fields', 'newFields']\n\n connect() {\n console.log(\"Abyme Connected\")\n\n if (this.count) {\n // If data-count is present,\n // add n default fields on page load\n\n this.add_default_associations();\n }\n }\n\n // return the value of the data-count attribute\n\n get count() {\n return this.element.dataset.minCount || 0;\n }\n \n // return the value of the data-position attribute\n // if there is no position specified set end as default\n\n get position() {\n return this.associationsTarget.dataset.abymePosition === 'end' ? 'beforeend' : 'afterbegin';\n }\n\n // ADD_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#add_association\n // <button> element by default\n\n // if a data-count is present the add_association\n // will be call without an event so we have to check\n // this case\n\n // check for limit reached \n // dispatch an event if the limit is reached\n\n // - call the function build_html that take care\n // for building the correct html to be inserted in the DOM\n // - dispatch an event before insert\n // - insert html into the dom\n // - dispatch an event after insert\n\n add_association(event) {\n if (event) {\n event.preventDefault();\n }\n\n if (this.element.dataset.limit && this.limit_check()) {\n this.create_event('limit-reached')\n return false\n }\n\n const html = this.build_html();\n this.create_event('before-add');\n this.associationsTarget.insertAdjacentHTML(this.position, html);\n this.create_event('after-add');\n }\n\n // REMOVE_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#remove_association\n // <button> element by default\n\n // - call the function mark_for_destroy that takes care\n // of marking the element for destruction and hiding it\n // - dispatch an event before mark & hide\n // - mark for descrution + hide the element\n // - dispatch an event after mark and hide\n\n remove_association(event) {\n event.preventDefault();\n\n this.create_event('before-remove');\n this.mark_for_destroy(event);\n this.create_event('after-remove');\n }\n\n // LIFECYCLE EVENTS RELATED\n\n // CREATE_EVENT\n\n // take a stage (String) => before-add, after-add...\n // create a new custom event \n // and dispatch at at the controller level\n\n create_event(stage, html = null) {\n const event = new CustomEvent(`abyme:${stage}`, { detail: {controller: this, content: html} });\n this.element.dispatchEvent(event);\n // WIP\n this.dispatch(event, stage);\n }\n\n // WIP : Trying to integrate event handling through controller inheritance\n dispatch(event, stage) {\n if (stage === 'before-add' && this.abymeBeforeAdd) this.abymeBeforeAdd(event);\n if (stage === 'after-add' && this.abymeAfterAdd) this.abymeAfterAdd(event);\n if (stage === 'before-remove' && this.abymeBeforeRemove) this.abymeBeforeAdd(event);\n if (stage === 'after-remove' && this.abymeAfterRemove) this.abymeAfterRemove(event);\n }\n\n abymeBeforeAdd(event) {\n }\n\n abymeAfterAdd(event) {\n }\n\n abymeBeforeRemove(event) {\n }\n\n abymeAfterRemove(event) {\n }\n\n // BUILD HTML\n\n // takes the html template and substitutes the sub-string\n // NEW_RECORD for a generated timestamp\n // then if there is a sub template in the html (multiple nested level)\n // set all the sub timestamps back as NEW_RECORD\n // finally returns the html \n\n build_html() {\n let html = this.templateTarget.innerHTML.replace(\n /NEW_RECORD/g,\n new Date().getTime()\n );\n \n if (html.match(/<template[\\s\\S]+<\\/template>/)) {\n const template = html\n .match(/<template[\\s\\S]+<\\/template>/)[0]\n .replace(/(\\[\\d{12,}\\])(\\[[^\\[\\]]+\\]\"){1}/g, `[NEW_RECORD]$2`);\n \n html = html.replace(/<template[\\s\\S]+<\\/template>/g, template);\n }\n\n return html;\n }\n \n // MARK_FOR_DESTROY\n\n // mark association for destruction\n // get the closest abyme--fields from the remove_association button\n // set the _destroy input value as 1\n // hide the element\n // add the class of abyme--marked-for-destroy to the element\n\n mark_for_destroy(event) {\n let item = event.target.closest('.abyme--fields');\n item.querySelector(\"input[name*='_destroy']\").value = 1;\n item.style.display = 'none';\n item.classList.add('abyme--marked-for-destroy')\n }\n\n\n // LIMIT_CHECK\n\n // Check if associations limit is reached\n // based on newFieldsTargets only\n // persisted fields are ignored\n\n limit_check() {\n return (this.newFieldsTargets\n .filter(item => !item.classList.contains('abyme--marked-for-destroy'))).length \n >= parseInt(this.element.dataset.limit)\n }\n\n // ADD_DEFAULT_ASSOCIATION\n\n // Add n default blank associations at page load\n // call sleep function to ensure uniqueness of timestamp\n\n async add_default_associations() {\n let i = 0\n while (i < this.count) {\n this.add_association()\n i++\n await this.sleep(1);\n }\n }\n\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","connect","console","log","this","count","add_default_associations","add_association","event","preventDefault","element","dataset","limit","limit_check","create_event","html","build_html","associationsTarget","insertAdjacentHTML","position","remove_association","mark_for_destroy","stage","CustomEvent","detail","controller","content","dispatchEvent","dispatch","abymeBeforeAdd","abymeAfterAdd","abymeBeforeRemove","abymeAfterRemove","templateTarget","innerHTML","replace","Date","getTime","match","template","item","target","closest","querySelector","style","display","classList","add","newFieldsTargets","filter","contains","length","parseInt","i","test","update","body","shouldContinue","_isSettledPact","result","reject","_resumeAfterTest","_resumeAfterBody","updateValue","_this2","sleep","ms","Promise","resolve","setTimeout","minCount","abymePosition","prototype","onFulfilled","onRejected","callback","e","_this","thenable","targets"],"mappings":"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"}
1
+ {"version":3,"file":"abyme.js","sources":["../src/abyme_controller.js"],"sourcesContent":["import { Controller } from 'stimulus';\n\nexport default class extends Controller {\n // static targets = ['template', 'associations', 'fields', 'newFields'];\n // Some applications don't compile correctly with the usual static syntax. \n // Thus implementing targets with standard getters below\n\n static targets = ['template', 'associations', 'fields', 'newFields']\n\n connect() {\n console.log(\"Abyme Connected\")\n\n if (this.count) {\n // If data-count is present,\n // add n default fields on page load\n\n this.add_default_associations();\n }\n }\n\n // return the value of the data-count attribute\n\n get count() {\n return this.element.dataset.minCount || 0;\n }\n \n // return the value of the data-position attribute\n // if there is no position specified set end as default\n\n get position() {\n return this.associationsTarget.dataset.abymePosition === 'end' ? 'beforeend' : 'afterbegin';\n }\n\n // ADD_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#add_association\n // <button> element by default\n\n // if a data-count is present the add_association\n // will be call without an event so we have to check\n // this case\n\n // check for limit reached \n // dispatch an event if the limit is reached\n\n // - call the function build_html that take care\n // for building the correct html to be inserted in the DOM\n // - dispatch an event before insert\n // - insert html into the dom\n // - dispatch an event after insert\n\n add_association(event) {\n if (event) {\n event.preventDefault();\n }\n\n if (this.element.dataset.limit && this.limit_check()) {\n this.create_event('limit-reached')\n return false\n }\n\n const html = this.build_html();\n this.create_event('before-add');\n this.associationsTarget.insertAdjacentHTML(this.position, html);\n this.create_event('after-add');\n }\n\n // REMOVE_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#remove_association\n // <button> element by default\n\n // - call the function mark_for_destroy that takes care\n // of marking the element for destruction and hiding it\n // - dispatch an event before mark & hide\n // - mark for descrution + hide the element\n // - dispatch an event after mark and hide\n\n remove_association(event) {\n event.preventDefault();\n\n this.create_event('before-remove');\n this.mark_for_destroy(event);\n this.create_event('after-remove');\n }\n\n // LIFECYCLE EVENTS RELATED\n\n // CREATE_EVENT\n\n // take a stage (String) => before-add, after-add...\n // create a new custom event \n // and dispatch at at the controller level\n\n create_event(stage, html = null) {\n const event = new CustomEvent(`abyme:${stage}`, { detail: {controller: this, content: html} });\n this.element.dispatchEvent(event);\n // WIP\n this.dispatch(event, stage);\n }\n\n // WIP : Trying to integrate event handling through controller inheritance\n dispatch(event, stage) {\n if (stage === 'before-add' && this.abymeBeforeAdd) this.abymeBeforeAdd(event);\n if (stage === 'after-add' && this.abymeAfterAdd) this.abymeAfterAdd(event);\n if (stage === 'before-remove' && this.abymeBeforeRemove) this.abymeBeforeAdd(event);\n if (stage === 'after-remove' && this.abymeAfterRemove) this.abymeAfterRemove(event);\n }\n\n abymeBeforeAdd(event) {\n }\n\n abymeAfterAdd(event) {\n }\n\n abymeBeforeRemove(event) {\n }\n\n abymeAfterRemove(event) {\n }\n\n // BUILD HTML\n\n // takes the html template and substitutes the sub-string\n // NEW_RECORD for a generated timestamp\n // then if there is a sub template in the html (multiple nested level)\n // set all the sub timestamps back as NEW_RECORD\n // finally returns the html \n\n build_html() {\n let html = this.templateTarget.innerHTML.replace(\n /NEW_RECORD/g,\n new Date().getTime()\n );\n \n if (html.match(/<template[\\s\\S]+<\\/template>/)) {\n const template = html\n .match(/<template[\\s\\S]+<\\/template>/)[0]\n .replace(/(\\[\\d{12,}\\])(\\[[^\\[\\]]+\\]\"){1}/g, `[NEW_RECORD]$2`);\n \n html = html.replace(/<template[\\s\\S]+<\\/template>/g, template);\n }\n\n return html;\n }\n \n // MARK_FOR_DESTROY\n\n // mark association for destruction\n // get the closest abyme--fields from the remove_association button\n // set the _destroy input value as 1\n // hide the element\n // add the class of abyme--marked-for-destroy to the element\n\n mark_for_destroy(event) {\n let item = event.target.closest('.abyme--fields');\n item.querySelector(\"input[name*='_destroy']\").value = 1;\n item.style.display = 'none';\n item.classList.add('abyme--marked-for-destroy')\n }\n\n\n // LIMIT_CHECK\n\n // Check if associations limit is reached\n // based on newFieldsTargets only\n // persisted fields are ignored\n\n limit_check() {\n return (this.newFieldsTargets\n .filter(item => !item.classList.contains('abyme--marked-for-destroy'))).length \n >= parseInt(this.element.dataset.limit)\n }\n\n // ADD_DEFAULT_ASSOCIATION\n\n // Add n default blank associations at page load\n // call sleep function to ensure uniqueness of timestamp\n\n async add_default_associations() {\n let i = 0\n while (i < this.count) {\n this.add_association()\n i++\n await this.sleep(1);\n }\n }\n\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","connect","console","log","this","count","add_default_associations","add_association","event","preventDefault","element","dataset","limit","limit_check","create_event","html","build_html","associationsTarget","insertAdjacentHTML","position","remove_association","mark_for_destroy","stage","CustomEvent","detail","controller","content","dispatchEvent","dispatch","abymeBeforeAdd","abymeAfterAdd","abymeBeforeRemove","abymeAfterRemove","templateTarget","innerHTML","replace","Date","getTime","match","template","item","target","closest","querySelector","style","display","classList","add","newFieldsTargets","filter","contains","length","parseInt","i","test","update","body","shouldContinue","_isSettledPact","result","reject","_resumeAfterTest","_resumeAfterBody","updateValue","_this2","sleep","ms","Promise","resolve","setTimeout","minCount","abymePosition","prototype","onFulfilled","onRejected","callback","e","_this","thenable","targets"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"abyme.modern.js","sources":["../src/abyme_controller.js"],"sourcesContent":["import { Controller } from 'stimulus';\n\nexport default class extends Controller {\n // static targets = ['template', 'associations', 'fields', 'newFields'];\n // Some applications don't compile correctly with the usual static syntax. \n // Thus implementing targets with standard getters below\n\n static targets = ['template', 'associations', 'fields', 'newFields']\n\n connect() {\n console.log(\"Abyme Connected\")\n\n if (this.count) {\n // If data-count is present,\n // add n default fields on page load\n\n this.add_default_associations();\n }\n }\n\n // return the value of the data-count attribute\n\n get count() {\n return this.element.dataset.minCount || 0;\n }\n \n // return the value of the data-position attribute\n // if there is no position specified set end as default\n\n get position() {\n return this.associationsTarget.dataset.abymePosition === 'end' ? 'beforeend' : 'afterbegin';\n }\n\n // ADD_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#add_association\n // <button> element by default\n\n // if a data-count is present the add_association\n // will be call without an event so we have to check\n // this case\n\n // check for limit reached \n // dispatch an event if the limit is reached\n\n // - call the function build_html that take care\n // for building the correct html to be inserted in the DOM\n // - dispatch an event before insert\n // - insert html into the dom\n // - dispatch an event after insert\n\n add_association(event) {\n if (event) {\n event.preventDefault();\n }\n\n if (this.element.dataset.limit && this.limit_check()) {\n this.create_event('limit-reached')\n return false\n }\n\n const html = this.build_html();\n this.create_event('before-add');\n this.associationsTarget.insertAdjacentHTML(this.position, html);\n this.create_event('after-add');\n }\n\n // REMOVE_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#remove_association\n // <button> element by default\n\n // - call the function mark_for_destroy that takes care\n // of marking the element for destruction and hiding it\n // - dispatch an event before mark & hide\n // - mark for descrution + hide the element\n // - dispatch an event after mark and hide\n\n remove_association(event) {\n event.preventDefault();\n\n this.create_event('before-remove');\n this.mark_for_destroy(event);\n this.create_event('after-remove');\n }\n\n // LIFECYCLE EVENTS RELATED\n\n // CREATE_EVENT\n\n // take a stage (String) => before-add, after-add...\n // create a new custom event \n // and dispatch at at the controller level\n\n create_event(stage, html = null) {\n const event = new CustomEvent(`abyme:${stage}`, { detail: {controller: this, content: html} });\n this.element.dispatchEvent(event);\n // WIP\n this.dispatch(event, stage);\n }\n\n // WIP : Trying to integrate event handling through controller inheritance\n dispatch(event, stage) {\n if (stage === 'before-add' && this.abymeBeforeAdd) this.abymeBeforeAdd(event);\n if (stage === 'after-add' && this.abymeAfterAdd) this.abymeAfterAdd(event);\n if (stage === 'before-remove' && this.abymeBeforeRemove) this.abymeBeforeAdd(event);\n if (stage === 'after-remove' && this.abymeAfterRemove) this.abymeAfterRemove(event);\n }\n\n abymeBeforeAdd(event) {\n }\n\n abymeAfterAdd(event) {\n }\n\n abymeBeforeRemove(event) {\n }\n\n abymeAfterRemove(event) {\n }\n\n // BUILD HTML\n\n // takes the html template and substitutes the sub-string\n // NEW_RECORD for a generated timestamp\n // then if there is a sub template in the html (multiple nested level)\n // set all the sub timestamps back as NEW_RECORD\n // finally returns the html \n\n build_html() {\n let html = this.templateTarget.innerHTML.replace(\n /NEW_RECORD/g,\n new Date().getTime()\n );\n \n if (html.match(/<template[\\s\\S]+<\\/template>/)) {\n const template = html\n .match(/<template[\\s\\S]+<\\/template>/)[0]\n .replace(/(\\[\\d{12,}\\])(\\[[^\\[\\]]+\\]\"){1}/g, `[NEW_RECORD]$2`);\n \n html = html.replace(/<template[\\s\\S]+<\\/template>/g, template);\n }\n\n return html;\n }\n \n // MARK_FOR_DESTROY\n\n // mark association for destruction\n // get the closest abyme--fields from the remove_association button\n // set the _destroy input value as 1\n // hide the element\n // add the class of abyme--marked-for-destroy to the element\n\n mark_for_destroy(event) {\n let item = event.target.closest('.abyme--fields');\n item.querySelector(\"input[name*='_destroy']\").value = 1;\n item.style.display = 'none';\n item.classList.add('abyme--marked-for-destroy')\n }\n\n\n // LIMIT_CHECK\n\n // Check if associations limit is reached\n // based on newFieldsTargets only\n // persisted fields are ignored\n\n limit_check() {\n return (this.newFieldsTargets\n .filter(item => !item.classList.contains('abyme--marked-for-destroy'))).length \n >= parseInt(this.element.dataset.limit)\n }\n\n // ADD_DEFAULT_ASSOCIATION\n\n // Add n default blank associations at page load\n // call sleep function to ensure uniqueness of timestamp\n\n async add_default_associations() {\n let i = 0\n while (i < this.count) {\n this.add_association()\n i++\n await this.sleep(1);\n }\n }\n\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":["Controller","connect","console","log","this","count","add_default_associations","element","dataset","minCount","position","associationsTarget","abymePosition","add_association","event","preventDefault","limit","limit_check","create_event","html","build_html","insertAdjacentHTML","remove_association","mark_for_destroy","stage","CustomEvent","detail","controller","content","dispatchEvent","dispatch","abymeBeforeAdd","abymeAfterAdd","abymeBeforeRemove","abymeAfterRemove","templateTarget","innerHTML","replace","Date","getTime","match","template","item","target","closest","querySelector","value","style","display","classList","add","newFieldsTargets","filter","contains","length","parseInt","[object Object]","i","sleep","ms","Promise","resolve","setTimeout","targets"],"mappings":"sDAE6BA,EAO3BC,UACEC,QAAQC,IAAI,mBAERC,KAAKC,OAIPD,KAAKE,2BAMAD,YACP,YAAYE,QAAQC,QAAQC,UAAY,EAM9BC,eACV,MAAyD,aAA7CC,mBAAmBH,QAAQI,cAA0B,YAAc,aAsBjFC,gBAAgBC,GAKd,GAJIA,GACFA,EAAMC,iBAGJX,KAAKG,QAAQC,QAAQQ,OAASZ,KAAKa,cAErC,OADAb,KAAKc,aAAa,oBAIpB,MAAMC,EAAOf,KAAKgB,aAClBhB,KAAKc,aAAa,cAClBd,KAAKO,mBAAmBU,mBAAmBjB,KAAKM,SAAUS,GAC1Df,KAAKc,aAAa,aAepBI,mBAAmBR,GACjBA,EAAMC,iBAENX,KAAKc,aAAa,iBAClBd,KAAKmB,iBAAiBT,GACtBV,KAAKc,aAAa,gBAWpBA,aAAaM,EAAOL,EAAO,MACzB,MAAML,EAAQ,IAAIW,YAAa,SAAQD,IAAS,CAAEE,OAAQ,CAACC,WAAYvB,KAAMwB,QAAST,KACtFf,KAAKG,QAAQsB,cAAcf,GAE3BV,KAAK0B,SAAShB,EAAOU,GAIvBM,SAAShB,EAAOU,GACA,eAAVA,GAA0BpB,KAAK2B,gBAAgB3B,KAAK2B,eAAejB,GACzD,cAAVU,GAAyBpB,KAAK4B,eAAe5B,KAAK4B,cAAclB,GACtD,kBAAVU,GAA6BpB,KAAK6B,mBAAmB7B,KAAK2B,eAAejB,GAC/D,iBAAVU,GAA4BpB,KAAK8B,kBAAkB9B,KAAK8B,iBAAiBpB,GAG/EiB,eAAejB,IAGfkB,cAAclB,IAGdmB,kBAAkBnB,IAGlBoB,iBAAiBpB,IAWjBM,aACE,IAAID,EAAOf,KAAK+B,eAAeC,UAAUC,QACvC,eACA,IAAIC,MAAOC,WAGb,GAAIpB,EAAKqB,MAAM,gCAAiC,CAC9C,MAAMC,EAAWtB,EAChBqB,MAAM,gCAAgC,GACtCH,QAAQ,mCAAqC,kBAE9ClB,EAAOA,EAAKkB,QAAQ,gCAAiCI,GAGvD,OAAOtB,EAWTI,iBAAiBT,GACf,IAAI4B,EAAO5B,EAAM6B,OAAOC,QAAQ,kBAChCF,EAAKG,cAAc,2BAA2BC,MAAQ,EACtDJ,EAAKK,MAAMC,QAAU,OACrBN,EAAKO,UAAUC,IAAI,6BAUrBjC,cACE,YAAakC,iBACAC,OAAOV,IAASA,EAAKO,UAAUI,SAAS,8BAA+BC,QACrEC,SAASnD,KAAKG,QAAQC,QAAQQ,OAQjBwC,iCAC5B,IAAIC,EAAI,EACR,KAAOA,EAAIrD,KAAKC,OACdD,KAAKS,kBACL4C,eACWC,MAAM,GAIrBA,MAAMC,GACJ,WAAWC,QAAQC,GAAWC,WAAWD,EAASF,OAxL7CI,QAAU,CAAC,WAAY,eAAgB,SAAU"}
1
+ {"version":3,"file":"abyme.modern.js","sources":["../src/abyme_controller.js"],"sourcesContent":["import { Controller } from 'stimulus';\n\nexport default class extends Controller {\n // static targets = ['template', 'associations', 'fields', 'newFields'];\n // Some applications don't compile correctly with the usual static syntax. \n // Thus implementing targets with standard getters below\n\n static targets = ['template', 'associations', 'fields', 'newFields']\n\n connect() {\n console.log(\"Abyme Connected\")\n\n if (this.count) {\n // If data-count is present,\n // add n default fields on page load\n\n this.add_default_associations();\n }\n }\n\n // return the value of the data-count attribute\n\n get count() {\n return this.element.dataset.minCount || 0;\n }\n \n // return the value of the data-position attribute\n // if there is no position specified set end as default\n\n get position() {\n return this.associationsTarget.dataset.abymePosition === 'end' ? 'beforeend' : 'afterbegin';\n }\n\n // ADD_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#add_association\n // <button> element by default\n\n // if a data-count is present the add_association\n // will be call without an event so we have to check\n // this case\n\n // check for limit reached \n // dispatch an event if the limit is reached\n\n // - call the function build_html that take care\n // for building the correct html to be inserted in the DOM\n // - dispatch an event before insert\n // - insert html into the dom\n // - dispatch an event after insert\n\n add_association(event) {\n if (event) {\n event.preventDefault();\n }\n\n if (this.element.dataset.limit && this.limit_check()) {\n this.create_event('limit-reached')\n return false\n }\n\n const html = this.build_html();\n this.create_event('before-add');\n this.associationsTarget.insertAdjacentHTML(this.position, html);\n this.create_event('after-add');\n }\n\n // REMOVE_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#remove_association\n // <button> element by default\n\n // - call the function mark_for_destroy that takes care\n // of marking the element for destruction and hiding it\n // - dispatch an event before mark & hide\n // - mark for descrution + hide the element\n // - dispatch an event after mark and hide\n\n remove_association(event) {\n event.preventDefault();\n\n this.create_event('before-remove');\n this.mark_for_destroy(event);\n this.create_event('after-remove');\n }\n\n // LIFECYCLE EVENTS RELATED\n\n // CREATE_EVENT\n\n // take a stage (String) => before-add, after-add...\n // create a new custom event \n // and dispatch at at the controller level\n\n create_event(stage, html = null) {\n const event = new CustomEvent(`abyme:${stage}`, { detail: {controller: this, content: html} });\n this.element.dispatchEvent(event);\n // WIP\n this.dispatch(event, stage);\n }\n\n // WIP : Trying to integrate event handling through controller inheritance\n dispatch(event, stage) {\n if (stage === 'before-add' && this.abymeBeforeAdd) this.abymeBeforeAdd(event);\n if (stage === 'after-add' && this.abymeAfterAdd) this.abymeAfterAdd(event);\n if (stage === 'before-remove' && this.abymeBeforeRemove) this.abymeBeforeAdd(event);\n if (stage === 'after-remove' && this.abymeAfterRemove) this.abymeAfterRemove(event);\n }\n\n abymeBeforeAdd(event) {\n }\n\n abymeAfterAdd(event) {\n }\n\n abymeBeforeRemove(event) {\n }\n\n abymeAfterRemove(event) {\n }\n\n // BUILD HTML\n\n // takes the html template and substitutes the sub-string\n // NEW_RECORD for a generated timestamp\n // then if there is a sub template in the html (multiple nested level)\n // set all the sub timestamps back as NEW_RECORD\n // finally returns the html \n\n build_html() {\n let html = this.templateTarget.innerHTML.replace(\n /NEW_RECORD/g,\n new Date().getTime()\n );\n \n if (html.match(/<template[\\s\\S]+<\\/template>/)) {\n const template = html\n .match(/<template[\\s\\S]+<\\/template>/)[0]\n .replace(/(\\[\\d{12,}\\])(\\[[^\\[\\]]+\\]\"){1}/g, `[NEW_RECORD]$2`);\n \n html = html.replace(/<template[\\s\\S]+<\\/template>/g, template);\n }\n\n return html;\n }\n \n // MARK_FOR_DESTROY\n\n // mark association for destruction\n // get the closest abyme--fields from the remove_association button\n // set the _destroy input value as 1\n // hide the element\n // add the class of abyme--marked-for-destroy to the element\n\n mark_for_destroy(event) {\n let item = event.target.closest('.abyme--fields');\n item.querySelector(\"input[name*='_destroy']\").value = 1;\n item.style.display = 'none';\n item.classList.add('abyme--marked-for-destroy')\n }\n\n\n // LIMIT_CHECK\n\n // Check if associations limit is reached\n // based on newFieldsTargets only\n // persisted fields are ignored\n\n limit_check() {\n return (this.newFieldsTargets\n .filter(item => !item.classList.contains('abyme--marked-for-destroy'))).length \n >= parseInt(this.element.dataset.limit)\n }\n\n // ADD_DEFAULT_ASSOCIATION\n\n // Add n default blank associations at page load\n // call sleep function to ensure uniqueness of timestamp\n\n async add_default_associations() {\n let i = 0\n while (i < this.count) {\n this.add_association()\n i++\n await this.sleep(1);\n }\n }\n\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":["Controller","connect","console","log","this","count","add_default_associations","element","dataset","minCount","position","associationsTarget","abymePosition","add_association","event","preventDefault","limit","limit_check","create_event","html","build_html","insertAdjacentHTML","remove_association","mark_for_destroy","stage","CustomEvent","detail","controller","content","dispatchEvent","dispatch","abymeBeforeAdd","abymeAfterAdd","abymeBeforeRemove","abymeAfterRemove","templateTarget","innerHTML","replace","Date","getTime","match","template","item","target","closest","querySelector","value","style","display","classList","add","newFieldsTargets","filter","contains","length","parseInt","async","i","sleep","ms","Promise","resolve","setTimeout","targets"],"mappings":"sDAE6BA,EAO3BC,UACEC,QAAQC,IAAI,mBAERC,KAAKC,OAIPD,KAAKE,2BAMLD,YACF,YAAYE,QAAQC,QAAQC,UAAY,EAMtCC,eACF,MAAyD,aAA7CC,mBAAmBH,QAAQI,cAA0B,YAAc,aAsBjFC,gBAAgBC,GAKd,GAJIA,GACFA,EAAMC,iBAGJX,KAAKG,QAAQC,QAAQQ,OAASZ,KAAKa,cAErC,OADAb,KAAKc,aAAa,oBAIpB,MAAMC,EAAOf,KAAKgB,aAClBhB,KAAKc,aAAa,cAClBd,KAAKO,mBAAmBU,mBAAmBjB,KAAKM,SAAUS,GAC1Df,KAAKc,aAAa,aAepBI,mBAAmBR,GACjBA,EAAMC,iBAENX,KAAKc,aAAa,iBAClBd,KAAKmB,iBAAiBT,GACtBV,KAAKc,aAAa,gBAWpBA,aAAaM,EAAOL,EAAO,MACzB,MAAML,EAAQ,IAAIW,YAAa,SAAQD,IAAS,CAAEE,OAAQ,CAACC,WAAYvB,KAAMwB,QAAST,KACtFf,KAAKG,QAAQsB,cAAcf,GAE3BV,KAAK0B,SAAShB,EAAOU,GAIvBM,SAAShB,EAAOU,GACA,eAAVA,GAA0BpB,KAAK2B,gBAAgB3B,KAAK2B,eAAejB,GACzD,cAAVU,GAAyBpB,KAAK4B,eAAe5B,KAAK4B,cAAclB,GACtD,kBAAVU,GAA6BpB,KAAK6B,mBAAmB7B,KAAK2B,eAAejB,GAC/D,iBAAVU,GAA4BpB,KAAK8B,kBAAkB9B,KAAK8B,iBAAiBpB,GAG/EiB,eAAejB,IAGfkB,cAAclB,IAGdmB,kBAAkBnB,IAGlBoB,iBAAiBpB,IAWjBM,aACE,IAAID,EAAOf,KAAK+B,eAAeC,UAAUC,QACvC,eACA,IAAIC,MAAOC,WAGb,GAAIpB,EAAKqB,MAAM,gCAAiC,CAC9C,MAAMC,EAAWtB,EAChBqB,MAAM,gCAAgC,GACtCH,QAAQ,mCAAqC,kBAE9ClB,EAAOA,EAAKkB,QAAQ,gCAAiCI,GAGvD,OAAOtB,EAWTI,iBAAiBT,GACf,IAAI4B,EAAO5B,EAAM6B,OAAOC,QAAQ,kBAChCF,EAAKG,cAAc,2BAA2BC,MAAQ,EACtDJ,EAAKK,MAAMC,QAAU,OACrBN,EAAKO,UAAUC,IAAI,6BAUrBjC,cACE,YAAakC,iBACAC,OAAOV,IAASA,EAAKO,UAAUI,SAAS,8BAA+BC,QACrEC,SAASnD,KAAKG,QAAQC,QAAQQ,OAQjBwC,iCAC5B,IAAIC,EAAI,EACR,KAAOA,EAAIrD,KAAKC,OACdD,KAAKS,kBACL4C,eACWC,MAAM,GAIrBA,MAAMC,GACJ,WAAWC,QAAQC,GAAWC,WAAWD,EAASF,OAxL7CI,QAAU,CAAC,WAAY,eAAgB,SAAU"}
data/dist/abyme.module.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Controller as e}from"stimulus";function t(e,n){return(t=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,n)}function n(e,t,r){if(!e.s){if(r instanceof i){if(!r.s)return void(r.o=n.bind(null,e,t));1&t&&(t=r.s),r=r.v}if(r&&r.then)return void r.then(n.bind(null,e,t),n.bind(null,e,2));e.s=t,e.v=r;var o=e.o;o&&o(e)}}var r=function(e){var r,a;function s(){return e.apply(this,arguments)||this}a=e,(r=s).prototype=Object.create(a.prototype),r.prototype.constructor=r,t(r,a);var c,f=s.prototype;return f.connect=function(){console.log("Abyme Connected"),this.count&&this.add_default_associations()},f.add_association=function(e){if(e&&e.preventDefault(),this.element.dataset.limit&&this.limit_check())return this.create_event("limit-reached"),!1;var t=this.build_html();this.create_event("before-add"),this.associationsTarget.insertAdjacentHTML(this.position,t),this.create_event("after-add")},f.remove_association=function(e){e.preventDefault(),this.create_event("before-remove"),this.mark_for_destroy(e),this.create_event("after-remove")},f.create_event=function(e,t){void 0===t&&(t=null);var n=new CustomEvent("abyme:"+e,{detail:{controller:this,content:t}});this.element.dispatchEvent(n),this.dispatch(n,e)},f.dispatch=function(e,t){"before-add"===t&&this.abymeBeforeAdd&&this.abymeBeforeAdd(e),"after-add"===t&&this.abymeAfterAdd&&this.abymeAfterAdd(e),"before-remove"===t&&this.abymeBeforeRemove&&this.abymeBeforeAdd(e),"after-remove"===t&&this.abymeAfterRemove&&this.abymeAfterRemove(e)},f.abymeBeforeAdd=function(e){},f.abymeAfterAdd=function(e){},f.abymeBeforeRemove=function(e){},f.abymeAfterRemove=function(e){},f.build_html=function(){var e=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,(new Date).getTime());if(e.match(/<template[\s\S]+<\/template>/)){var t=e.match(/<template[\s\S]+<\/template>/)[0].replace(/(\[\d{12,}\])(\[[^\[\]]+\]"){1}/g,"[NEW_RECORD]$2");e=e.replace(/<template[\s\S]+<\/template>/g,t)}return e},f.mark_for_destroy=function(e){var t=e.target.closest(".abyme--fields");t.querySelector("input[name*='_destroy']").value=1,t.style.display="none",t.classList.add("abyme--marked-for-destroy")},f.limit_check=function(){return this.newFieldsTargets.filter(function(e){return!e.classList.contains("abyme--marked-for-destroy")}).length>=parseInt(this.element.dataset.limit)},f.add_default_associations=function(){try{var e=this,t=0,r=function(e,t,r){for(var a;;){var s=e();if(o(s)&&(s=s.v),!s)return c;if(s.then){a=0;break}var c=r();if(c&&c.then){if(!o(c)){a=1;break}c=c.s}}var f=new i,u=n.bind(null,f,2);return(0===a?s.then(h):1===a?c.then(d):(void 0).then(function(){(s=e())?s.then?s.then(h).then(void 0,u):h(s):n(f,1,c)})).then(void 0,u),f;function d(t){c=t;do{if(!(s=e())||o(s)&&!s.v)return void n(f,1,c);if(s.then)return void s.then(h).then(void 0,u);o(c=r())&&(c=c.v)}while(!c||!c.then);c.then(d).then(void 0,u)}function h(e){e?(c=r())&&c.then?c.then(d).then(void 0,u):d(c):n(f,1,c)}}(function(){return t<e.count},0,function(){return e.add_association(),t++,Promise.resolve(e.sleep(1)).then(function(){})});return Promise.resolve(r&&r.then?r.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},f.sleep=function(e){return new Promise(function(t){return setTimeout(t,e)})},(c=[{key:"count",get:function(){return this.element.dataset.minCount||0}},{key:"position",get:function(){return"end"===this.associationsTarget.dataset.abymePosition?"beforeend":"afterbegin"}}])&&function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(s.prototype,c),s}(e),i=function(){function e(){}return e.prototype.then=function(t,r){var i=new e,o=this.s;if(o){var a=1&o?t:r;if(a){try{n(i,1,a(this.v))}catch(e){n(i,2,e)}return i}return this}return this.o=function(e){try{var o=e.v;1&e.s?n(i,1,t?t(o):o):r?n(i,1,r(o)):n(i,2,o)}catch(e){n(i,2,e)}},i},e}();function o(e){return e instanceof i&&1&e.s}r.targets=["template","associations","fields","newFields"];export{r as AbymeController};
1
+ import{Controller as e}from"stimulus";function t(e,n){return t=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},t(e,n)}function n(e,t,r){if(!e.s){if(r instanceof i){if(!r.s)return void(r.o=n.bind(null,e,t));1&t&&(t=r.s),r=r.v}if(r&&r.then)return void r.then(n.bind(null,e,t),n.bind(null,e,2));e.s=t,e.v=r;var o=e.o;o&&o(e)}}var r=function(e){var r,a;function s(){return e.apply(this,arguments)||this}a=e,(r=s).prototype=Object.create(a.prototype),r.prototype.constructor=r,t(r,a);var c,f,u=s.prototype;return u.connect=function(){console.log("Abyme Connected"),this.count&&this.add_default_associations()},u.add_association=function(e){if(e&&e.preventDefault(),this.element.dataset.limit&&this.limit_check())return this.create_event("limit-reached"),!1;var t=this.build_html();this.create_event("before-add"),this.associationsTarget.insertAdjacentHTML(this.position,t),this.create_event("after-add")},u.remove_association=function(e){e.preventDefault(),this.create_event("before-remove"),this.mark_for_destroy(e),this.create_event("after-remove")},u.create_event=function(e,t){void 0===t&&(t=null);var n=new CustomEvent("abyme:"+e,{detail:{controller:this,content:t}});this.element.dispatchEvent(n),this.dispatch(n,e)},u.dispatch=function(e,t){"before-add"===t&&this.abymeBeforeAdd&&this.abymeBeforeAdd(e),"after-add"===t&&this.abymeAfterAdd&&this.abymeAfterAdd(e),"before-remove"===t&&this.abymeBeforeRemove&&this.abymeBeforeAdd(e),"after-remove"===t&&this.abymeAfterRemove&&this.abymeAfterRemove(e)},u.abymeBeforeAdd=function(e){},u.abymeAfterAdd=function(e){},u.abymeBeforeRemove=function(e){},u.abymeAfterRemove=function(e){},u.build_html=function(){var e=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,(new Date).getTime());if(e.match(/<template[\s\S]+<\/template>/)){var t=e.match(/<template[\s\S]+<\/template>/)[0].replace(/(\[\d{12,}\])(\[[^\[\]]+\]"){1}/g,"[NEW_RECORD]$2");e=e.replace(/<template[\s\S]+<\/template>/g,t)}return e},u.mark_for_destroy=function(e){var t=e.target.closest(".abyme--fields");t.querySelector("input[name*='_destroy']").value=1,t.style.display="none",t.classList.add("abyme--marked-for-destroy")},u.limit_check=function(){return this.newFieldsTargets.filter(function(e){return!e.classList.contains("abyme--marked-for-destroy")}).length>=parseInt(this.element.dataset.limit)},u.add_default_associations=function(){try{var e=this,t=0,r=function(e,t,r){for(var a;;){var s=e();if(o(s)&&(s=s.v),!s)return c;if(s.then){a=0;break}var c=r();if(c&&c.then){if(!o(c)){a=1;break}c=c.s}}var f=new i,u=n.bind(null,f,2);return(0===a?s.then(h):1===a?c.then(d):(void 0).then(function(){(s=e())?s.then?s.then(h).then(void 0,u):h(s):n(f,1,c)})).then(void 0,u),f;function d(t){c=t;do{if(!(s=e())||o(s)&&!s.v)return void n(f,1,c);if(s.then)return void s.then(h).then(void 0,u);o(c=r())&&(c=c.v)}while(!c||!c.then);c.then(d).then(void 0,u)}function h(e){e?(c=r())&&c.then?c.then(d).then(void 0,u):d(c):n(f,1,c)}}(function(){return t<e.count},0,function(){return e.add_association(),t++,Promise.resolve(e.sleep(1)).then(function(){})});return Promise.resolve(r&&r.then?r.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},u.sleep=function(e){return new Promise(function(t){return setTimeout(t,e)})},c=s,(f=[{key:"count",get:function(){return this.element.dataset.minCount||0}},{key:"position",get:function(){return"end"===this.associationsTarget.dataset.abymePosition?"beforeend":"afterbegin"}}])&&function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(c.prototype,f),Object.defineProperty(c,"prototype",{writable:!1}),s}(e),i=function(){function e(){}return e.prototype.then=function(t,r){var i=new e,o=this.s;if(o){var a=1&o?t:r;if(a){try{n(i,1,a(this.v))}catch(e){n(i,2,e)}return i}return this}return this.o=function(e){try{var o=e.v;1&e.s?n(i,1,t?t(o):o):r?n(i,1,r(o)):n(i,2,o)}catch(e){n(i,2,e)}},i},e}();function o(e){return e instanceof i&&1&e.s}r.targets=["template","associations","fields","newFields"];export{r as AbymeController};
2
2
  //# sourceMappingURL=abyme.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"abyme.module.js","sources":["../src/abyme_controller.js"],"sourcesContent":["import { Controller } from 'stimulus';\n\nexport default class extends Controller {\n // static targets = ['template', 'associations', 'fields', 'newFields'];\n // Some applications don't compile correctly with the usual static syntax. \n // Thus implementing targets with standard getters below\n\n static targets = ['template', 'associations', 'fields', 'newFields']\n\n connect() {\n console.log(\"Abyme Connected\")\n\n if (this.count) {\n // If data-count is present,\n // add n default fields on page load\n\n this.add_default_associations();\n }\n }\n\n // return the value of the data-count attribute\n\n get count() {\n return this.element.dataset.minCount || 0;\n }\n \n // return the value of the data-position attribute\n // if there is no position specified set end as default\n\n get position() {\n return this.associationsTarget.dataset.abymePosition === 'end' ? 'beforeend' : 'afterbegin';\n }\n\n // ADD_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#add_association\n // <button> element by default\n\n // if a data-count is present the add_association\n // will be call without an event so we have to check\n // this case\n\n // check for limit reached \n // dispatch an event if the limit is reached\n\n // - call the function build_html that take care\n // for building the correct html to be inserted in the DOM\n // - dispatch an event before insert\n // - insert html into the dom\n // - dispatch an event after insert\n\n add_association(event) {\n if (event) {\n event.preventDefault();\n }\n\n if (this.element.dataset.limit && this.limit_check()) {\n this.create_event('limit-reached')\n return false\n }\n\n const html = this.build_html();\n this.create_event('before-add');\n this.associationsTarget.insertAdjacentHTML(this.position, html);\n this.create_event('after-add');\n }\n\n // REMOVE_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#remove_association\n // <button> element by default\n\n // - call the function mark_for_destroy that takes care\n // of marking the element for destruction and hiding it\n // - dispatch an event before mark & hide\n // - mark for descrution + hide the element\n // - dispatch an event after mark and hide\n\n remove_association(event) {\n event.preventDefault();\n\n this.create_event('before-remove');\n this.mark_for_destroy(event);\n this.create_event('after-remove');\n }\n\n // LIFECYCLE EVENTS RELATED\n\n // CREATE_EVENT\n\n // take a stage (String) => before-add, after-add...\n // create a new custom event \n // and dispatch at at the controller level\n\n create_event(stage, html = null) {\n const event = new CustomEvent(`abyme:${stage}`, { detail: {controller: this, content: html} });\n this.element.dispatchEvent(event);\n // WIP\n this.dispatch(event, stage);\n }\n\n // WIP : Trying to integrate event handling through controller inheritance\n dispatch(event, stage) {\n if (stage === 'before-add' && this.abymeBeforeAdd) this.abymeBeforeAdd(event);\n if (stage === 'after-add' && this.abymeAfterAdd) this.abymeAfterAdd(event);\n if (stage === 'before-remove' && this.abymeBeforeRemove) this.abymeBeforeAdd(event);\n if (stage === 'after-remove' && this.abymeAfterRemove) this.abymeAfterRemove(event);\n }\n\n abymeBeforeAdd(event) {\n }\n\n abymeAfterAdd(event) {\n }\n\n abymeBeforeRemove(event) {\n }\n\n abymeAfterRemove(event) {\n }\n\n // BUILD HTML\n\n // takes the html template and substitutes the sub-string\n // NEW_RECORD for a generated timestamp\n // then if there is a sub template in the html (multiple nested level)\n // set all the sub timestamps back as NEW_RECORD\n // finally returns the html \n\n build_html() {\n let html = this.templateTarget.innerHTML.replace(\n /NEW_RECORD/g,\n new Date().getTime()\n );\n \n if (html.match(/<template[\\s\\S]+<\\/template>/)) {\n const template = html\n .match(/<template[\\s\\S]+<\\/template>/)[0]\n .replace(/(\\[\\d{12,}\\])(\\[[^\\[\\]]+\\]\"){1}/g, `[NEW_RECORD]$2`);\n \n html = html.replace(/<template[\\s\\S]+<\\/template>/g, template);\n }\n\n return html;\n }\n \n // MARK_FOR_DESTROY\n\n // mark association for destruction\n // get the closest abyme--fields from the remove_association button\n // set the _destroy input value as 1\n // hide the element\n // add the class of abyme--marked-for-destroy to the element\n\n mark_for_destroy(event) {\n let item = event.target.closest('.abyme--fields');\n item.querySelector(\"input[name*='_destroy']\").value = 1;\n item.style.display = 'none';\n item.classList.add('abyme--marked-for-destroy')\n }\n\n\n // LIMIT_CHECK\n\n // Check if associations limit is reached\n // based on newFieldsTargets only\n // persisted fields are ignored\n\n limit_check() {\n return (this.newFieldsTargets\n .filter(item => !item.classList.contains('abyme--marked-for-destroy'))).length \n >= parseInt(this.element.dataset.limit)\n }\n\n // ADD_DEFAULT_ASSOCIATION\n\n // Add n default blank associations at page load\n // call sleep function to ensure uniqueness of timestamp\n\n async add_default_associations() {\n let i = 0\n while (i < this.count) {\n this.add_association()\n i++\n await this.sleep(1);\n }\n }\n\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","connect","console","log","this","count","add_default_associations","add_association","event","preventDefault","element","dataset","limit","limit_check","create_event","html","build_html","associationsTarget","insertAdjacentHTML","position","remove_association","mark_for_destroy","stage","CustomEvent","detail","controller","content","dispatchEvent","dispatch","abymeBeforeAdd","abymeAfterAdd","abymeBeforeRemove","abymeAfterRemove","templateTarget","innerHTML","replace","Date","getTime","match","template","item","target","closest","querySelector","style","display","classList","add","newFieldsTargets","filter","contains","length","parseInt","i","test","update","body","shouldContinue","_isSettledPact","result","reject","_resumeAfterTest","_resumeAfterBody","updateValue","_this2","sleep","ms","Promise","resolve","setTimeout","minCount","abymePosition","Controller","prototype","onFulfilled","onRejected","callback","e","_this","thenable","targets"],"mappings":"kIAuCO,SAASA,EAAQC,EAAMC,EAAOC,GACpC,IAAKF,EAAKG,EAAG,CACZ,GAAID,aAAiBE,EAAO,CAC3B,IAAIF,EAAMC,EAOT,YADAD,EAAMG,EAAIN,EAAQO,KAAK,KAAMN,EAAMC,IALvB,EAARA,IACHA,EAAQC,EAAMC,GAEfD,EAAQA,EAAMK,EAMhB,GAAIL,GAASA,EAAMM,KAElB,YADAN,EAAMM,KAAKT,EAAQO,KAAK,KAAMN,EAAMC,GAAQF,EAAQO,KAAK,KAAMN,EAAM,IAGtEA,EAAKG,EAAIF,EACTD,EAAKO,EAAIL,EACT,IAAMO,EAAWT,EAAKK,EAClBI,GACHA,EAAST,6LAnDVU,QAAA,WACEC,QAAQC,IAAI,mBAERC,KAAKC,OAIPD,KAAKE,8BAoCTC,gBAAA,SAAgBC,GAKd,GAJIA,GACFA,EAAMC,iBAGJL,KAAKM,QAAQC,QAAQC,OAASR,KAAKS,cAErC,OADAT,KAAKU,aAAa,oBAIpB,IAAMC,EAAOX,KAAKY,aAClBZ,KAAKU,aAAa,cAClBV,KAAKa,mBAAmBC,mBAAmBd,KAAKe,SAAUJ,GAC1DX,KAAKU,aAAa,gBAepBM,mBAAA,SAAmBZ,GACjBA,EAAMC,iBAENL,KAAKU,aAAa,iBAClBV,KAAKiB,iBAAiBb,GACtBJ,KAAKU,aAAa,mBAWpBA,aAAA,SAAaQ,EAAOP,YAAAA,IAAAA,EAAO,MACzB,IAAMP,EAAQ,IAAIe,qBAAqBD,EAAS,CAAEE,OAAQ,CAACC,WAAYrB,KAAMsB,QAASX,KACtFX,KAAKM,QAAQiB,cAAcnB,GAE3BJ,KAAKwB,SAASpB,EAAOc,MAIvBM,SAAA,SAASpB,EAAOc,GACA,eAAVA,GAA0BlB,KAAKyB,gBAAgBzB,KAAKyB,eAAerB,GACzD,cAAVc,GAAyBlB,KAAK0B,eAAe1B,KAAK0B,cAActB,GACtD,kBAAVc,GAA6BlB,KAAK2B,mBAAmB3B,KAAKyB,eAAerB,GAC/D,iBAAVc,GAA4BlB,KAAK4B,kBAAkB5B,KAAK4B,iBAAiBxB,MAG/EqB,eAAA,SAAerB,OAGfsB,cAAA,SAActB,OAGduB,kBAAA,SAAkBvB,OAGlBwB,iBAAA,SAAiBxB,OAWjBQ,WAAA,WACE,IAAID,EAAOX,KAAK6B,eAAeC,UAAUC,QACvC,eACA,IAAIC,MAAOC,WAGb,GAAItB,EAAKuB,MAAM,gCAAiC,CAC9C,IAAMC,EAAWxB,EAChBuB,MAAM,gCAAgC,GACtCH,QAAQ,qDAETpB,EAAOA,EAAKoB,QAAQ,gCAAiCI,GAGvD,OAAOxB,KAWTM,iBAAA,SAAiBb,GACf,IAAIgC,EAAOhC,EAAMiC,OAAOC,QAAQ,kBAChCF,EAAKG,cAAc,2BAA2BlD,MAAQ,EACtD+C,EAAKI,MAAMC,QAAU,OACrBL,EAAKM,UAAUC,IAAI,gCAUrBlC,YAAA,WACE,YAAamC,iBACAC,OAAO,SAAAT,UAASA,EAAKM,UAAUI,SAAS,+BAA+BC,QACrEC,SAAShD,KAAKM,QAAQC,QAAQC,UAQzCN,8CAEOF,KADPiD,EAAI,IAyEL,SAAcC,EAAMC,EAAQC,GAElC,IADA,IAAIlC,IACK,CACR,IAAImC,EAAiBH,IAIrB,GAHII,EAAeD,KAClBA,EAAiBA,EAAe3D,IAE5B2D,EACJ,OAAOE,EAER,GAAIF,EAAe1D,KAAM,CACxBuB,EAAQ,EACR,MAED,IAAIqC,EAASH,IACb,GAAIG,GAAUA,EAAO5D,KAAM,CAC1B,IAAI2D,EAAeC,GAEZ,CACNrC,EAAQ,EACR,MAHAqC,EAASA,EAAOjE,GAcnB,IAAIH,EAAO,MACPqE,EAAStE,EAAQO,KAAK,KAAMN,EAAM,GAEtC,OADW,IAAV+B,EAAcmC,EAAe1D,KAAK8D,GAA8B,IAAVvC,EAAcqC,EAAO5D,KAAK+D,SAT3EC,GAS2GhE,KAwCjH,YACK0D,EAAiBH,KAChBG,EAAe1D,KAClB0D,EAAe1D,KAAK8D,GAAkB9D,UAAK,EAAQ6D,GAEnDC,EAAiBJ,GAGlBnE,EAAQC,EAAM,EAAGoE,MAhDwH5D,UAAK,EAAQ6D,GACjJrE,EACP,SAASuE,EAAiBrE,GACzBkE,EAASlE,EACT,EAAG,CASF,KADAgE,EAAiBH,MACOI,EAAeD,KAAoBA,EAAe3D,EAEzE,YADAR,EAAQC,EAAM,EAAGoE,GAGlB,GAAIF,EAAe1D,KAElB,YADA0D,EAAe1D,KAAK8D,GAAkB9D,UAAK,EAAQ6D,GAIhDF,EADJC,EAASH,OAERG,EAASA,EAAO7D,UAER6D,IAAWA,EAAO5D,MAC5B4D,EAAO5D,KAAK+D,GAAkB/D,UAAK,EAAQ6D,GAE5C,SAASC,EAAiBJ,GACrBA,GACHE,EAASH,MACKG,EAAO5D,KACpB4D,EAAO5D,KAAK+D,GAAkB/D,UAAK,EAAQ6D,GAE3CE,EAAiBH,GAGlBrE,EAAQC,EAAM,EAAGoE,uBA9ITN,EAAIW,EAAK3D,oBAAO,OACrB2D,EAAKzD,kBACL8C,oBACMW,EAAKC,MAAM,6HAIrBA,MAAA,SAAMC,GACJ,WAAWC,QAAQ,SAAAC,UAAWC,WAAWD,EAASF,2BAzKpD,WACE,YAAYxD,QAAQC,QAAQ2D,UAAY,wBAM1C,WACE,MAAyD,aAA7CrD,mBAAmBN,QAAQ4D,cAA0B,YAAc,yMA5BtDC,KADM,WAClC,cAiCA,OAhCA7E,EAAM8E,UAAU1E,KAAO,SAAS2E,EAAaC,GAC5C,IAAMhB,EAAS,MACTnE,EAAQY,KAAKV,EACnB,GAAIF,EAAO,CACV,IAAMoF,EAAmB,EAARpF,EAAYkF,EAAcC,EAC3C,GAAIC,EAAU,CACb,IACCtF,EAAQqE,EAAQ,EAAGiB,EAASxE,KAAKN,IAChC,MAAO+E,GACRvF,EAAQqE,EAAQ,EAAGkB,GAEpB,OAAOlB,EAEP,YAiBF,OAdAvD,KAAKR,EAAI,SAASkF,GACjB,IACC,IAAMrF,EAAQqF,EAAMhF,EACN,EAAVgF,EAAMpF,EACTJ,EAAQqE,EAAQ,EAAGe,EAAcA,EAAYjF,GAASA,GAC5CkF,EACVrF,EAAQqE,EAAQ,EAAGgB,EAAWlF,IAE9BH,EAAQqE,EAAQ,EAAGlE,GAEnB,MAAOoF,GACRvF,EAAQqE,EAAQ,EAAGkB,KAGdlB,KAhC0B,GAgE5B,WAAwBoB,GAC9B,OAAOA,gBAA0C,EAAbA,EAASrF,IA3DrCsF,QAAU,CAAC,WAAY,eAAgB,SAAU"}
1
+ {"version":3,"file":"abyme.module.js","sources":["../src/abyme_controller.js"],"sourcesContent":["import { Controller } from 'stimulus';\n\nexport default class extends Controller {\n // static targets = ['template', 'associations', 'fields', 'newFields'];\n // Some applications don't compile correctly with the usual static syntax. \n // Thus implementing targets with standard getters below\n\n static targets = ['template', 'associations', 'fields', 'newFields']\n\n connect() {\n console.log(\"Abyme Connected\")\n\n if (this.count) {\n // If data-count is present,\n // add n default fields on page load\n\n this.add_default_associations();\n }\n }\n\n // return the value of the data-count attribute\n\n get count() {\n return this.element.dataset.minCount || 0;\n }\n \n // return the value of the data-position attribute\n // if there is no position specified set end as default\n\n get position() {\n return this.associationsTarget.dataset.abymePosition === 'end' ? 'beforeend' : 'afterbegin';\n }\n\n // ADD_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#add_association\n // <button> element by default\n\n // if a data-count is present the add_association\n // will be call without an event so we have to check\n // this case\n\n // check for limit reached \n // dispatch an event if the limit is reached\n\n // - call the function build_html that take care\n // for building the correct html to be inserted in the DOM\n // - dispatch an event before insert\n // - insert html into the dom\n // - dispatch an event after insert\n\n add_association(event) {\n if (event) {\n event.preventDefault();\n }\n\n if (this.element.dataset.limit && this.limit_check()) {\n this.create_event('limit-reached')\n return false\n }\n\n const html = this.build_html();\n this.create_event('before-add');\n this.associationsTarget.insertAdjacentHTML(this.position, html);\n this.create_event('after-add');\n }\n\n // REMOVE_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#remove_association\n // <button> element by default\n\n // - call the function mark_for_destroy that takes care\n // of marking the element for destruction and hiding it\n // - dispatch an event before mark & hide\n // - mark for descrution + hide the element\n // - dispatch an event after mark and hide\n\n remove_association(event) {\n event.preventDefault();\n\n this.create_event('before-remove');\n this.mark_for_destroy(event);\n this.create_event('after-remove');\n }\n\n // LIFECYCLE EVENTS RELATED\n\n // CREATE_EVENT\n\n // take a stage (String) => before-add, after-add...\n // create a new custom event \n // and dispatch at at the controller level\n\n create_event(stage, html = null) {\n const event = new CustomEvent(`abyme:${stage}`, { detail: {controller: this, content: html} });\n this.element.dispatchEvent(event);\n // WIP\n this.dispatch(event, stage);\n }\n\n // WIP : Trying to integrate event handling through controller inheritance\n dispatch(event, stage) {\n if (stage === 'before-add' && this.abymeBeforeAdd) this.abymeBeforeAdd(event);\n if (stage === 'after-add' && this.abymeAfterAdd) this.abymeAfterAdd(event);\n if (stage === 'before-remove' && this.abymeBeforeRemove) this.abymeBeforeAdd(event);\n if (stage === 'after-remove' && this.abymeAfterRemove) this.abymeAfterRemove(event);\n }\n\n abymeBeforeAdd(event) {\n }\n\n abymeAfterAdd(event) {\n }\n\n abymeBeforeRemove(event) {\n }\n\n abymeAfterRemove(event) {\n }\n\n // BUILD HTML\n\n // takes the html template and substitutes the sub-string\n // NEW_RECORD for a generated timestamp\n // then if there is a sub template in the html (multiple nested level)\n // set all the sub timestamps back as NEW_RECORD\n // finally returns the html \n\n build_html() {\n let html = this.templateTarget.innerHTML.replace(\n /NEW_RECORD/g,\n new Date().getTime()\n );\n \n if (html.match(/<template[\\s\\S]+<\\/template>/)) {\n const template = html\n .match(/<template[\\s\\S]+<\\/template>/)[0]\n .replace(/(\\[\\d{12,}\\])(\\[[^\\[\\]]+\\]\"){1}/g, `[NEW_RECORD]$2`);\n \n html = html.replace(/<template[\\s\\S]+<\\/template>/g, template);\n }\n\n return html;\n }\n \n // MARK_FOR_DESTROY\n\n // mark association for destruction\n // get the closest abyme--fields from the remove_association button\n // set the _destroy input value as 1\n // hide the element\n // add the class of abyme--marked-for-destroy to the element\n\n mark_for_destroy(event) {\n let item = event.target.closest('.abyme--fields');\n item.querySelector(\"input[name*='_destroy']\").value = 1;\n item.style.display = 'none';\n item.classList.add('abyme--marked-for-destroy')\n }\n\n\n // LIMIT_CHECK\n\n // Check if associations limit is reached\n // based on newFieldsTargets only\n // persisted fields are ignored\n\n limit_check() {\n return (this.newFieldsTargets\n .filter(item => !item.classList.contains('abyme--marked-for-destroy'))).length \n >= parseInt(this.element.dataset.limit)\n }\n\n // ADD_DEFAULT_ASSOCIATION\n\n // Add n default blank associations at page load\n // call sleep function to ensure uniqueness of timestamp\n\n async add_default_associations() {\n let i = 0\n while (i < this.count) {\n this.add_association()\n i++\n await this.sleep(1);\n }\n }\n\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","connect","console","log","this","count","add_default_associations","add_association","event","preventDefault","element","dataset","limit","limit_check","create_event","html","build_html","associationsTarget","insertAdjacentHTML","position","remove_association","mark_for_destroy","stage","CustomEvent","detail","controller","content","dispatchEvent","dispatch","abymeBeforeAdd","abymeAfterAdd","abymeBeforeRemove","abymeAfterRemove","templateTarget","innerHTML","replace","Date","getTime","match","template","item","target","closest","querySelector","style","display","classList","add","newFieldsTargets","filter","contains","length","parseInt","i","test","update","body","shouldContinue","_isSettledPact","result","reject","_resumeAfterTest","_resumeAfterBody","updateValue","_this2","sleep","ms","Promise","resolve","setTimeout","minCount","abymePosition","Controller","prototype","onFulfilled","onRejected","callback","e","_this","thenable","targets"],"mappings":"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"}
data/dist/abyme.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("stimulus")):"function"==typeof define&&define.amd?define(["exports","stimulus"],t):t((e||self).abyme={},e.Stimulus)}(this,function(e,t){function n(e,t){return(n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function i(e,t,n){if(!e.s){if(n instanceof o){if(!n.s)return void(n.o=i.bind(null,e,t));1&t&&(t=n.s),n=n.v}if(n&&n.then)return void n.then(i.bind(null,e,t),i.bind(null,e,2));e.s=t,e.v=n;var r=e.o;r&&r(e)}}var r=function(e){var t,r;function s(){return e.apply(this,arguments)||this}r=e,(t=s).prototype=Object.create(r.prototype),t.prototype.constructor=t,n(t,r);var f,u=s.prototype;return u.connect=function(){console.log("Abyme Connected"),this.count&&this.add_default_associations()},u.add_association=function(e){if(e&&e.preventDefault(),this.element.dataset.limit&&this.limit_check())return this.create_event("limit-reached"),!1;var t=this.build_html();this.create_event("before-add"),this.associationsTarget.insertAdjacentHTML(this.position,t),this.create_event("after-add")},u.remove_association=function(e){e.preventDefault(),this.create_event("before-remove"),this.mark_for_destroy(e),this.create_event("after-remove")},u.create_event=function(e,t){void 0===t&&(t=null);var n=new CustomEvent("abyme:"+e,{detail:{controller:this,content:t}});this.element.dispatchEvent(n),this.dispatch(n,e)},u.dispatch=function(e,t){"before-add"===t&&this.abymeBeforeAdd&&this.abymeBeforeAdd(e),"after-add"===t&&this.abymeAfterAdd&&this.abymeAfterAdd(e),"before-remove"===t&&this.abymeBeforeRemove&&this.abymeBeforeAdd(e),"after-remove"===t&&this.abymeAfterRemove&&this.abymeAfterRemove(e)},u.abymeBeforeAdd=function(e){},u.abymeAfterAdd=function(e){},u.abymeBeforeRemove=function(e){},u.abymeAfterRemove=function(e){},u.build_html=function(){var e=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,(new Date).getTime());if(e.match(/<template[\s\S]+<\/template>/)){var t=e.match(/<template[\s\S]+<\/template>/)[0].replace(/(\[\d{12,}\])(\[[^\[\]]+\]"){1}/g,"[NEW_RECORD]$2");e=e.replace(/<template[\s\S]+<\/template>/g,t)}return e},u.mark_for_destroy=function(e){var t=e.target.closest(".abyme--fields");t.querySelector("input[name*='_destroy']").value=1,t.style.display="none",t.classList.add("abyme--marked-for-destroy")},u.limit_check=function(){return this.newFieldsTargets.filter(function(e){return!e.classList.contains("abyme--marked-for-destroy")}).length>=parseInt(this.element.dataset.limit)},u.add_default_associations=function(){try{var e=this,t=0,n=function(e,t,n){for(var r;;){var s=e();if(a(s)&&(s=s.v),!s)return f;if(s.then){r=0;break}var f=n();if(f&&f.then){if(!a(f)){r=1;break}f=f.s}}var u=new o,c=i.bind(null,u,2);return(0===r?s.then(l):1===r?f.then(d):(void 0).then(function(){(s=e())?s.then?s.then(l).then(void 0,c):l(s):i(u,1,f)})).then(void 0,c),u;function d(t){f=t;do{if(!(s=e())||a(s)&&!s.v)return void i(u,1,f);if(s.then)return void s.then(l).then(void 0,c);a(f=n())&&(f=f.v)}while(!f||!f.then);f.then(d).then(void 0,c)}function l(e){e?(f=n())&&f.then?f.then(d).then(void 0,c):d(f):i(u,1,f)}}(function(){return t<e.count},0,function(){return e.add_association(),t++,Promise.resolve(e.sleep(1)).then(function(){})});return Promise.resolve(n&&n.then?n.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},u.sleep=function(e){return new Promise(function(t){return setTimeout(t,e)})},(f=[{key:"count",get:function(){return this.element.dataset.minCount||0}},{key:"position",get:function(){return"end"===this.associationsTarget.dataset.abymePosition?"beforeend":"afterbegin"}}])&&function(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}(s.prototype,f),s}(t.Controller),o=function(){function e(){}return e.prototype.then=function(t,n){var r=new e,o=this.s;if(o){var a=1&o?t:n;if(a){try{i(r,1,a(this.v))}catch(e){i(r,2,e)}return r}return this}return this.o=function(e){try{var o=e.v;1&e.s?i(r,1,t?t(o):o):n?i(r,1,n(o)):i(r,2,o)}catch(e){i(r,2,e)}},r},e}();function a(e){return e instanceof o&&1&e.s}r.targets=["template","associations","fields","newFields"],e.AbymeController=r});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("stimulus")):"function"==typeof define&&define.amd?define(["exports","stimulus"],t):t((e||self).abyme={},e.Stimulus)}(this,function(e,t){function n(e,t){return n=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},n(e,t)}function i(e,t,n){if(!e.s){if(n instanceof o){if(!n.s)return void(n.o=i.bind(null,e,t));1&t&&(t=n.s),n=n.v}if(n&&n.then)return void n.then(i.bind(null,e,t),i.bind(null,e,2));e.s=t,e.v=n;var r=e.o;r&&r(e)}}var r=function(e){var t,r;function s(){return e.apply(this,arguments)||this}r=e,(t=s).prototype=Object.create(r.prototype),t.prototype.constructor=t,n(t,r);var f,u,c=s.prototype;return c.connect=function(){console.log("Abyme Connected"),this.count&&this.add_default_associations()},c.add_association=function(e){if(e&&e.preventDefault(),this.element.dataset.limit&&this.limit_check())return this.create_event("limit-reached"),!1;var t=this.build_html();this.create_event("before-add"),this.associationsTarget.insertAdjacentHTML(this.position,t),this.create_event("after-add")},c.remove_association=function(e){e.preventDefault(),this.create_event("before-remove"),this.mark_for_destroy(e),this.create_event("after-remove")},c.create_event=function(e,t){void 0===t&&(t=null);var n=new CustomEvent("abyme:"+e,{detail:{controller:this,content:t}});this.element.dispatchEvent(n),this.dispatch(n,e)},c.dispatch=function(e,t){"before-add"===t&&this.abymeBeforeAdd&&this.abymeBeforeAdd(e),"after-add"===t&&this.abymeAfterAdd&&this.abymeAfterAdd(e),"before-remove"===t&&this.abymeBeforeRemove&&this.abymeBeforeAdd(e),"after-remove"===t&&this.abymeAfterRemove&&this.abymeAfterRemove(e)},c.abymeBeforeAdd=function(e){},c.abymeAfterAdd=function(e){},c.abymeBeforeRemove=function(e){},c.abymeAfterRemove=function(e){},c.build_html=function(){var e=this.templateTarget.innerHTML.replace(/NEW_RECORD/g,(new Date).getTime());if(e.match(/<template[\s\S]+<\/template>/)){var t=e.match(/<template[\s\S]+<\/template>/)[0].replace(/(\[\d{12,}\])(\[[^\[\]]+\]"){1}/g,"[NEW_RECORD]$2");e=e.replace(/<template[\s\S]+<\/template>/g,t)}return e},c.mark_for_destroy=function(e){var t=e.target.closest(".abyme--fields");t.querySelector("input[name*='_destroy']").value=1,t.style.display="none",t.classList.add("abyme--marked-for-destroy")},c.limit_check=function(){return this.newFieldsTargets.filter(function(e){return!e.classList.contains("abyme--marked-for-destroy")}).length>=parseInt(this.element.dataset.limit)},c.add_default_associations=function(){try{var e=this,t=0,n=function(e,t,n){for(var r;;){var s=e();if(a(s)&&(s=s.v),!s)return f;if(s.then){r=0;break}var f=n();if(f&&f.then){if(!a(f)){r=1;break}f=f.s}}var u=new o,c=i.bind(null,u,2);return(0===r?s.then(l):1===r?f.then(d):(void 0).then(function(){(s=e())?s.then?s.then(l).then(void 0,c):l(s):i(u,1,f)})).then(void 0,c),u;function d(t){f=t;do{if(!(s=e())||a(s)&&!s.v)return void i(u,1,f);if(s.then)return void s.then(l).then(void 0,c);a(f=n())&&(f=f.v)}while(!f||!f.then);f.then(d).then(void 0,c)}function l(e){e?(f=n())&&f.then?f.then(d).then(void 0,c):d(f):i(u,1,f)}}(function(){return t<e.count},0,function(){return e.add_association(),t++,Promise.resolve(e.sleep(1)).then(function(){})});return Promise.resolve(n&&n.then?n.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},c.sleep=function(e){return new Promise(function(t){return setTimeout(t,e)})},f=s,(u=[{key:"count",get:function(){return this.element.dataset.minCount||0}},{key:"position",get:function(){return"end"===this.associationsTarget.dataset.abymePosition?"beforeend":"afterbegin"}}])&&function(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}(f.prototype,u),Object.defineProperty(f,"prototype",{writable:!1}),s}(t.Controller),o=function(){function e(){}return e.prototype.then=function(t,n){var r=new e,o=this.s;if(o){var a=1&o?t:n;if(a){try{i(r,1,a(this.v))}catch(e){i(r,2,e)}return r}return this}return this.o=function(e){try{var o=e.v;1&e.s?i(r,1,t?t(o):o):n?i(r,1,n(o)):i(r,2,o)}catch(e){i(r,2,e)}},r},e}();function a(e){return e instanceof o&&1&e.s}r.targets=["template","associations","fields","newFields"],e.AbymeController=r});
2
2
  //# sourceMappingURL=abyme.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"abyme.umd.js","sources":["../src/abyme_controller.js"],"sourcesContent":["import { Controller } from 'stimulus';\n\nexport default class extends Controller {\n // static targets = ['template', 'associations', 'fields', 'newFields'];\n // Some applications don't compile correctly with the usual static syntax. \n // Thus implementing targets with standard getters below\n\n static targets = ['template', 'associations', 'fields', 'newFields']\n\n connect() {\n console.log(\"Abyme Connected\")\n\n if (this.count) {\n // If data-count is present,\n // add n default fields on page load\n\n this.add_default_associations();\n }\n }\n\n // return the value of the data-count attribute\n\n get count() {\n return this.element.dataset.minCount || 0;\n }\n \n // return the value of the data-position attribute\n // if there is no position specified set end as default\n\n get position() {\n return this.associationsTarget.dataset.abymePosition === 'end' ? 'beforeend' : 'afterbegin';\n }\n\n // ADD_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#add_association\n // <button> element by default\n\n // if a data-count is present the add_association\n // will be call without an event so we have to check\n // this case\n\n // check for limit reached \n // dispatch an event if the limit is reached\n\n // - call the function build_html that take care\n // for building the correct html to be inserted in the DOM\n // - dispatch an event before insert\n // - insert html into the dom\n // - dispatch an event after insert\n\n add_association(event) {\n if (event) {\n event.preventDefault();\n }\n\n if (this.element.dataset.limit && this.limit_check()) {\n this.create_event('limit-reached')\n return false\n }\n\n const html = this.build_html();\n this.create_event('before-add');\n this.associationsTarget.insertAdjacentHTML(this.position, html);\n this.create_event('after-add');\n }\n\n // REMOVE_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#remove_association\n // <button> element by default\n\n // - call the function mark_for_destroy that takes care\n // of marking the element for destruction and hiding it\n // - dispatch an event before mark & hide\n // - mark for descrution + hide the element\n // - dispatch an event after mark and hide\n\n remove_association(event) {\n event.preventDefault();\n\n this.create_event('before-remove');\n this.mark_for_destroy(event);\n this.create_event('after-remove');\n }\n\n // LIFECYCLE EVENTS RELATED\n\n // CREATE_EVENT\n\n // take a stage (String) => before-add, after-add...\n // create a new custom event \n // and dispatch at at the controller level\n\n create_event(stage, html = null) {\n const event = new CustomEvent(`abyme:${stage}`, { detail: {controller: this, content: html} });\n this.element.dispatchEvent(event);\n // WIP\n this.dispatch(event, stage);\n }\n\n // WIP : Trying to integrate event handling through controller inheritance\n dispatch(event, stage) {\n if (stage === 'before-add' && this.abymeBeforeAdd) this.abymeBeforeAdd(event);\n if (stage === 'after-add' && this.abymeAfterAdd) this.abymeAfterAdd(event);\n if (stage === 'before-remove' && this.abymeBeforeRemove) this.abymeBeforeAdd(event);\n if (stage === 'after-remove' && this.abymeAfterRemove) this.abymeAfterRemove(event);\n }\n\n abymeBeforeAdd(event) {\n }\n\n abymeAfterAdd(event) {\n }\n\n abymeBeforeRemove(event) {\n }\n\n abymeAfterRemove(event) {\n }\n\n // BUILD HTML\n\n // takes the html template and substitutes the sub-string\n // NEW_RECORD for a generated timestamp\n // then if there is a sub template in the html (multiple nested level)\n // set all the sub timestamps back as NEW_RECORD\n // finally returns the html \n\n build_html() {\n let html = this.templateTarget.innerHTML.replace(\n /NEW_RECORD/g,\n new Date().getTime()\n );\n \n if (html.match(/<template[\\s\\S]+<\\/template>/)) {\n const template = html\n .match(/<template[\\s\\S]+<\\/template>/)[0]\n .replace(/(\\[\\d{12,}\\])(\\[[^\\[\\]]+\\]\"){1}/g, `[NEW_RECORD]$2`);\n \n html = html.replace(/<template[\\s\\S]+<\\/template>/g, template);\n }\n\n return html;\n }\n \n // MARK_FOR_DESTROY\n\n // mark association for destruction\n // get the closest abyme--fields from the remove_association button\n // set the _destroy input value as 1\n // hide the element\n // add the class of abyme--marked-for-destroy to the element\n\n mark_for_destroy(event) {\n let item = event.target.closest('.abyme--fields');\n item.querySelector(\"input[name*='_destroy']\").value = 1;\n item.style.display = 'none';\n item.classList.add('abyme--marked-for-destroy')\n }\n\n\n // LIMIT_CHECK\n\n // Check if associations limit is reached\n // based on newFieldsTargets only\n // persisted fields are ignored\n\n limit_check() {\n return (this.newFieldsTargets\n .filter(item => !item.classList.contains('abyme--marked-for-destroy'))).length \n >= parseInt(this.element.dataset.limit)\n }\n\n // ADD_DEFAULT_ASSOCIATION\n\n // Add n default blank associations at page load\n // call sleep function to ensure uniqueness of timestamp\n\n async add_default_associations() {\n let i = 0\n while (i < this.count) {\n this.add_association()\n i++\n await this.sleep(1);\n }\n }\n\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","connect","console","log","this","count","add_default_associations","add_association","event","preventDefault","element","dataset","limit","limit_check","create_event","html","build_html","associationsTarget","insertAdjacentHTML","position","remove_association","mark_for_destroy","stage","CustomEvent","detail","controller","content","dispatchEvent","dispatch","abymeBeforeAdd","abymeAfterAdd","abymeBeforeRemove","abymeAfterRemove","templateTarget","innerHTML","replace","Date","getTime","match","template","item","target","closest","querySelector","style","display","classList","add","newFieldsTargets","filter","contains","length","parseInt","i","test","update","body","shouldContinue","_isSettledPact","result","reject","_resumeAfterTest","_resumeAfterBody","updateValue","_this2","sleep","ms","Promise","resolve","setTimeout","minCount","abymePosition","Controller","prototype","onFulfilled","onRejected","callback","e","_this","thenable","targets"],"mappings":"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"}
1
+ {"version":3,"file":"abyme.umd.js","sources":["../src/abyme_controller.js"],"sourcesContent":["import { Controller } from 'stimulus';\n\nexport default class extends Controller {\n // static targets = ['template', 'associations', 'fields', 'newFields'];\n // Some applications don't compile correctly with the usual static syntax. \n // Thus implementing targets with standard getters below\n\n static targets = ['template', 'associations', 'fields', 'newFields']\n\n connect() {\n console.log(\"Abyme Connected\")\n\n if (this.count) {\n // If data-count is present,\n // add n default fields on page load\n\n this.add_default_associations();\n }\n }\n\n // return the value of the data-count attribute\n\n get count() {\n return this.element.dataset.minCount || 0;\n }\n \n // return the value of the data-position attribute\n // if there is no position specified set end as default\n\n get position() {\n return this.associationsTarget.dataset.abymePosition === 'end' ? 'beforeend' : 'afterbegin';\n }\n\n // ADD_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#add_association\n // <button> element by default\n\n // if a data-count is present the add_association\n // will be call without an event so we have to check\n // this case\n\n // check for limit reached \n // dispatch an event if the limit is reached\n\n // - call the function build_html that take care\n // for building the correct html to be inserted in the DOM\n // - dispatch an event before insert\n // - insert html into the dom\n // - dispatch an event after insert\n\n add_association(event) {\n if (event) {\n event.preventDefault();\n }\n\n if (this.element.dataset.limit && this.limit_check()) {\n this.create_event('limit-reached')\n return false\n }\n\n const html = this.build_html();\n this.create_event('before-add');\n this.associationsTarget.insertAdjacentHTML(this.position, html);\n this.create_event('after-add');\n }\n\n // REMOVE_ASSOCIATION\n\n // this function is call whenever a click occurs\n // on the element with the click->abyme#remove_association\n // <button> element by default\n\n // - call the function mark_for_destroy that takes care\n // of marking the element for destruction and hiding it\n // - dispatch an event before mark & hide\n // - mark for descrution + hide the element\n // - dispatch an event after mark and hide\n\n remove_association(event) {\n event.preventDefault();\n\n this.create_event('before-remove');\n this.mark_for_destroy(event);\n this.create_event('after-remove');\n }\n\n // LIFECYCLE EVENTS RELATED\n\n // CREATE_EVENT\n\n // take a stage (String) => before-add, after-add...\n // create a new custom event \n // and dispatch at at the controller level\n\n create_event(stage, html = null) {\n const event = new CustomEvent(`abyme:${stage}`, { detail: {controller: this, content: html} });\n this.element.dispatchEvent(event);\n // WIP\n this.dispatch(event, stage);\n }\n\n // WIP : Trying to integrate event handling through controller inheritance\n dispatch(event, stage) {\n if (stage === 'before-add' && this.abymeBeforeAdd) this.abymeBeforeAdd(event);\n if (stage === 'after-add' && this.abymeAfterAdd) this.abymeAfterAdd(event);\n if (stage === 'before-remove' && this.abymeBeforeRemove) this.abymeBeforeAdd(event);\n if (stage === 'after-remove' && this.abymeAfterRemove) this.abymeAfterRemove(event);\n }\n\n abymeBeforeAdd(event) {\n }\n\n abymeAfterAdd(event) {\n }\n\n abymeBeforeRemove(event) {\n }\n\n abymeAfterRemove(event) {\n }\n\n // BUILD HTML\n\n // takes the html template and substitutes the sub-string\n // NEW_RECORD for a generated timestamp\n // then if there is a sub template in the html (multiple nested level)\n // set all the sub timestamps back as NEW_RECORD\n // finally returns the html \n\n build_html() {\n let html = this.templateTarget.innerHTML.replace(\n /NEW_RECORD/g,\n new Date().getTime()\n );\n \n if (html.match(/<template[\\s\\S]+<\\/template>/)) {\n const template = html\n .match(/<template[\\s\\S]+<\\/template>/)[0]\n .replace(/(\\[\\d{12,}\\])(\\[[^\\[\\]]+\\]\"){1}/g, `[NEW_RECORD]$2`);\n \n html = html.replace(/<template[\\s\\S]+<\\/template>/g, template);\n }\n\n return html;\n }\n \n // MARK_FOR_DESTROY\n\n // mark association for destruction\n // get the closest abyme--fields from the remove_association button\n // set the _destroy input value as 1\n // hide the element\n // add the class of abyme--marked-for-destroy to the element\n\n mark_for_destroy(event) {\n let item = event.target.closest('.abyme--fields');\n item.querySelector(\"input[name*='_destroy']\").value = 1;\n item.style.display = 'none';\n item.classList.add('abyme--marked-for-destroy')\n }\n\n\n // LIMIT_CHECK\n\n // Check if associations limit is reached\n // based on newFieldsTargets only\n // persisted fields are ignored\n\n limit_check() {\n return (this.newFieldsTargets\n .filter(item => !item.classList.contains('abyme--marked-for-destroy'))).length \n >= parseInt(this.element.dataset.limit)\n }\n\n // ADD_DEFAULT_ASSOCIATION\n\n // Add n default blank associations at page load\n // call sleep function to ensure uniqueness of timestamp\n\n async add_default_associations() {\n let i = 0\n while (i < this.count) {\n this.add_association()\n i++\n await this.sleep(1);\n }\n }\n\n sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n"],"names":["_settle","pact","state","value","s","_Pact","o","bind","v","then","observer","connect","console","log","this","count","add_default_associations","add_association","event","preventDefault","element","dataset","limit","limit_check","create_event","html","build_html","associationsTarget","insertAdjacentHTML","position","remove_association","mark_for_destroy","stage","CustomEvent","detail","controller","content","dispatchEvent","dispatch","abymeBeforeAdd","abymeAfterAdd","abymeBeforeRemove","abymeAfterRemove","templateTarget","innerHTML","replace","Date","getTime","match","template","item","target","closest","querySelector","style","display","classList","add","newFieldsTargets","filter","contains","length","parseInt","i","test","update","body","shouldContinue","_isSettledPact","result","reject","_resumeAfterTest","_resumeAfterBody","updateValue","_this2","sleep","ms","Promise","resolve","setTimeout","minCount","abymePosition","Controller","prototype","onFulfilled","onRejected","callback","e","_this","thenable","targets"],"mappings":"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"}
@@ -8,12 +8,13 @@ module Abyme
8
8
  # the form object, lookup_context optionaly a partial path
9
9
  # then yield itself to the block
10
10
 
11
- def initialize(association:, form:, context:, partial:, &block)
11
+ def initialize(association:, form:, context:, partial:, locals:, &block)
12
12
  @association = association
13
13
  @form = form
14
14
  @context = context
15
15
  @lookup_context = context.lookup_context
16
16
  @partial = partial
17
+ @locals = locals || {}
17
18
  yield(self) if block
18
19
  end
19
20
 
@@ -23,8 +24,9 @@ module Abyme
23
24
  # passing association, form and options to it
24
25
 
25
26
  def records(options = {})
27
+ locals = merge_locals(options[:locals])
26
28
  persisted_records_for(@association, @form, options) do |fields_for_association|
27
- render_association_partial(@association, fields_for_association, @partial, @context)
29
+ render_association_partial(@association, fields_for_association, @partial, locals, @context)
28
30
  end
29
31
  end
30
32
 
@@ -33,9 +35,16 @@ module Abyme
33
35
  # calls the #new_records_for helper method
34
36
  # passing association, form and options to it
35
37
  def new_records(options = {}, &block)
38
+ locals = merge_locals(options[:locals])
36
39
  new_records_for(@association, @form, options) do |fields_for_association|
37
- render_association_partial(@association, fields_for_association, @partial, @context)
40
+ render_association_partial(@association, fields_for_association, @partial, locals, @context)
38
41
  end
39
42
  end
43
+
44
+ private
45
+
46
+ def merge_locals(passed_locals)
47
+ passed_locals ? @locals.merge(passed_locals) : @locals
48
+ end
40
49
  end
41
50
  end
data/lib/abyme/version.rb CHANGED
@@ -3,7 +3,7 @@ module Abyme
3
3
  module VERSION
4
4
  MAJOR = 0
5
5
  MINOR = 6
6
- PATCH = 5
6
+ PATCH = 6
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH].join(".")
9
9
  end
@@ -42,11 +42,10 @@ module Abyme
42
42
  if block
43
43
  yield(
44
44
  Abyme::AbymeBuilder.new(
45
- association: association, form: form, context: self, partial: options[:partial]
45
+ association: association, form: form, context: self, partial: options[:partial], locals: options[:locals]
46
46
  )
47
47
  )
48
48
  else
49
- # model = association.to_s.singularize.classify.constantize
50
49
  model = association.to_s.singularize
51
50
  concat(persisted_records_for(association, form, options))
52
51
  concat(new_records_for(association, form, options))
@@ -117,7 +116,7 @@ module Abyme
117
116
  content_tag(:div, build_attributes(fields_default, basic_fields_markup(options[:fields_html], association))) do
118
117
  # Here, if a block is passed, we're passing the association fields to it, rather than the form itself
119
118
  # block_given? ? yield(f) : render(options[:partial] || "abyme/#{association.to_s.singularize}_fields", f: f)
120
- block ? yield(f) : render_association_partial(association, f, options[:partial])
119
+ block ? yield(f) : render_association_partial(association, f, options[:partial], options[:locals])
121
120
  end
122
121
  end
123
122
  end
@@ -184,7 +183,7 @@ module Abyme
184
183
  content_tag(:div, options[:wrapper_html]) do
185
184
  fields_for_builder(form, association, records) do |f|
186
185
  content_tag(:div, build_attributes(fields_default, basic_fields_markup(options[:fields_html], association))) do
187
- block_given? ? yield(f) : render_association_partial(association, f, options[:partial])
186
+ block_given? ? yield(f) : render_association_partial(association, f, options[:partial], options[:locals])
188
187
  end
189
188
  end
190
189
  end
@@ -291,11 +290,13 @@ module Abyme
291
290
  # RENDER PARTIAL
292
291
 
293
292
  # renders a partial based on the passed path, or will expect a partial to be found in the views/abyme directory.
293
+ # If any locals have been passed as options, they will be passed on and made available in the partial
294
294
 
295
- def render_association_partial(association, form, partial = nil, context = nil)
295
+ def render_association_partial(association, form, partial = nil, locals = nil, context = nil)
296
296
  partial_path = partial || "abyme/#{association.to_s.singularize}_fields"
297
+ locals ||= {}
297
298
  context ||= self
298
- context.render(partial: partial_path, locals: {f: form})
299
+ context.render(partial: partial_path, locals: locals.merge(f: form))
299
300
  end
300
301
  end
301
302
  end