Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

223 řádky
5.0 KiB

  1. function $(expr, con) {
  2. return typeof expr === "string"? (con || document).querySelector(expr) : expr || null;
  3. }
  4. $.create = (tag, o) => {
  5. var element = document.createElement(tag);
  6. for (var i in o) {
  7. var val = o[i];
  8. if (i === "inside") {
  9. $(val).appendChild(element);
  10. }
  11. else if (i === "around") {
  12. var ref = $(val);
  13. ref.parentNode.insertBefore(element, ref);
  14. element.appendChild(ref);
  15. } else if (i === "onClick" ) {
  16. element.addEventListener('click', val);
  17. } else if (i === "onInput" ) {
  18. element.addEventListener('input', function(e) {
  19. val(element.value);
  20. });
  21. } else if (i === "styles") {
  22. if(typeof val === "object") {
  23. Object.keys(val).map(prop => {
  24. element.style[prop] = val[prop];
  25. });
  26. }
  27. } else if (i in element ) {
  28. element[i] = val;
  29. }
  30. else {
  31. element.setAttribute(i, val);
  32. }
  33. }
  34. return element;
  35. };
  36. function toTitleCase(str) {
  37. return str.replace(/\w*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
  38. }
  39. // export class demoBuilder {
  40. class demoBuilder {
  41. constructor(LIB_OBJ) {
  42. this.LIB_OBJ = LIB_OBJ;
  43. }
  44. makeSection(parent, sys) {
  45. return new docSection(this.LIB_OBJ, parent, sys);
  46. }
  47. }
  48. class docSection {
  49. constructor(LIB_OBJ, parent, sys) {
  50. this.LIB_OBJ = LIB_OBJ;
  51. this.parent = parent;
  52. this.sys = sys;
  53. this.blockMap = {};
  54. this.demos = [];
  55. this.make();
  56. }
  57. make() {
  58. // const section = document.querySelector(this.parent);
  59. let s = this.sys;
  60. if(s.title) {
  61. $.create('h6', { inside: this.parent, innerHTML: s.title });
  62. }
  63. if(s.contentBlocks) {
  64. s.contentBlocks.forEach((blockConf, index) => {
  65. this.blockMap[index] = this.getBlock(blockConf);
  66. });
  67. } else {
  68. // TODO:
  69. this.blockMap['test'] = this.getDemo(s);
  70. }
  71. }
  72. getBlock(blockConf) {
  73. let fnName = 'get' + toTitleCase(blockConf.type);
  74. if(this[fnName]) {
  75. return this[fnName](blockConf);
  76. } else {
  77. throw new Error(`Unknown section block type '${blockConf.type}'.`);
  78. }
  79. }
  80. getText(blockConf) {
  81. return $.create('p', {
  82. inside: this.parent,
  83. className: 'new-context',
  84. innerHTML: blockConf.content
  85. });
  86. }
  87. getCode(blockConf) {
  88. let pre = $.create('pre', { inside: this.parent });
  89. let lang = blockConf.lang || 'javascript';
  90. let code = $.create('code', {
  91. inside: pre,
  92. className: `hljs ${lang}`,
  93. innerHTML: blockConf.content
  94. });
  95. }
  96. getCustom(blockConf) {
  97. this.parent.innerHTML += blockConf.html;
  98. }
  99. getDemo(blockConf) {
  100. let bc = blockConf;
  101. let args = bc.config;
  102. let figure, row;
  103. if(!bc.sideContent) {
  104. figure = $.create('figure', { inside: this.parent });
  105. } else {
  106. row = $.create('div', {
  107. inside: this.parent,
  108. className: "row",
  109. innerHTML: `<div class="col-sm-8"></div>
  110. <div class="col-sm-4"></div>`,
  111. });
  112. figure = $.create('figure', { inside: row.querySelector('.col-sm-8') });
  113. row.querySelector('.col-sm-4').innerHTML += bc.sideContent;
  114. }
  115. let libObj = new this.LIB_OBJ(figure, args);
  116. let demoIndex = this.demos.length;
  117. this.demos.push(libObj);
  118. if(bc.postSetup) {
  119. bc.postSetup(this.demos[demoIndex], figure, row);
  120. }
  121. this.getDemoOptions(demoIndex, bc.options, args, figure);
  122. this.getDemoActions(demoIndex, bc.actions, args);
  123. }
  124. getDemoOptions(demoIndex, options=[], args={}, figure) {
  125. options.forEach(o => {
  126. const btnGroup = $.create('div', {
  127. inside: this.parent,
  128. className: `btn-group ${o.name}`
  129. });
  130. const mapKeys = o.mapKeys;
  131. if(o.type === "number") {
  132. let numOpts = o.numberOptions;
  133. const inputGroup = $.create('input', {
  134. inside: btnGroup,
  135. className: `form-control`,
  136. type: "range",
  137. min: numOpts.min,
  138. max: numOpts.max,
  139. step: numOpts.step,
  140. value: o.activeState ? o.activeState : 0,
  141. // (max - min)/2
  142. onInput: (value) => {
  143. if(o.path[1]) {
  144. args[o.path[0]][o.path[1]] = value;
  145. } else {
  146. args[o.path[0]] = value;
  147. }
  148. this.demos[demoIndex] = new this.LIB_OBJ(figure, args);
  149. }
  150. });
  151. } else if(["map", "string", "boolean"].includes(o.type)) {
  152. args[o.path[0]] = {};
  153. Object.keys(o.states).forEach(key => {
  154. let state = o.states[key];
  155. let activeClass = key === o.activeState ? 'active' : '';
  156. let button = $.create('button', {
  157. inside: btnGroup,
  158. className: `btn btn-sm btn-secondary ${activeClass}`,
  159. innerHTML: key,
  160. onClick: (e) => {
  161. // map
  162. if(o.type === "map") {
  163. mapKeys.forEach((attr, i) => {
  164. args[o.path[0]][attr] = state[i];
  165. })
  166. } else {
  167. // boolean, string, number, object
  168. args[o.path[0]] = state;
  169. }
  170. this.demos[demoIndex] = new this.LIB_OBJ(figure, args);
  171. }
  172. });
  173. if(activeClass) { button.click(); }
  174. });
  175. }
  176. });
  177. }
  178. getDemoActions(demoIndex, actions=[], args={}) {
  179. actions.forEach(o => {
  180. let args = o.args || [];
  181. $.create('button', {
  182. inside: this.parent,
  183. className: `btn btn-action btn-sm btn-secondary`,
  184. innerHTML: o.name,
  185. onClick: () => {this.demos[demoIndex][o.fn](...args);}
  186. });
  187. });
  188. }
  189. }