Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

218 rindas
4.9 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. class demoBuilder {
  40. constructor(LIB_OBJ) {
  41. this.LIB_OBJ = LIB_OBJ;
  42. }
  43. makeSection(parent, sys) {
  44. return new docSection(this.LIB_OBJ, parent, sys);
  45. }
  46. }
  47. class docSection {
  48. constructor(LIB_OBJ, parent, sys) {
  49. this.LIB_OBJ = LIB_OBJ;
  50. this.parent = parent;
  51. this.sys = sys;
  52. this.blockMap = {};
  53. this.demos = [];
  54. this.make();
  55. }
  56. make() {
  57. // const section = document.querySelector(this.parent);
  58. let s = this.sys;
  59. if(s.title) {
  60. $.create('h6', { inside: this.parent, innerHTML: s.title });
  61. }
  62. if(s.contentBlocks) {
  63. s.contentBlocks.forEach((blockConf, index) => {
  64. this.blockMap[index] = this.getBlock(blockConf);
  65. });
  66. } else {
  67. // TODO:
  68. this.blockMap['test'] = this.getDemo(s);
  69. }
  70. }
  71. getBlock(blockConf) {
  72. let fnName = 'get' + toTitleCase(blockConf.type);
  73. if(this[fnName]) {
  74. return this[fnName](blockConf);
  75. } else {
  76. throw new Error(`Unknown section block type '${blockConf.type}'.`);
  77. }
  78. }
  79. getText(blockConf) {
  80. return $.create('p', {
  81. inside: this.parent,
  82. className: 'new-context',
  83. innerHTML: blockConf.content
  84. });
  85. }
  86. getCode(blockConf) {
  87. let pre = $.create('pre', { inside: this.parent });
  88. let lang = blockConf.lang || 'javascript';
  89. let code = $.create('code', {
  90. inside: pre,
  91. className: `hljs ${lang}`,
  92. innerHTML: blockConf.content
  93. });
  94. }
  95. getCustom(blockConf) {
  96. this.parent.innerHTML += blockConf.html;
  97. }
  98. getDemo(blockConf) {
  99. let bc = blockConf;
  100. let args = bc.config;
  101. let figure, row;
  102. if(!bc.sideContent) {
  103. figure = $.create('figure', { inside: this.parent });
  104. } else {
  105. row = $.create('div', {
  106. inside: this.parent,
  107. className: "row",
  108. innerHTML: `<div class="col-sm-8"></div>
  109. <div class="col-sm-4"></div>`,
  110. });
  111. figure = $.create('figure', { inside: row.querySelector('.col-sm-8') });
  112. row.querySelector('.col-sm-4').innerHTML += bc.sideContent;
  113. }
  114. let libObj = new this.LIB_OBJ(figure, args);
  115. let demoIndex = this.demos.length;
  116. this.demos.push(libObj);
  117. if(bc.postSetup) {
  118. bc.postSetup(this.demos[demoIndex], figure, row);
  119. }
  120. this.getDemoOptions(demoIndex, bc.options, args, figure);
  121. this.getDemoActions(demoIndex, bc.actions, args);
  122. }
  123. getDemoOptions(demoIndex, options=[], args={}, figure) {
  124. options.forEach(o => {
  125. const btnGroup = $.create('div', {
  126. inside: this.parent,
  127. className: `btn-group ${o.name}`
  128. });
  129. const mapKeys = o.mapKeys;
  130. if(o.type === "number") {
  131. let numOpts = o.numberOptions;
  132. const inputGroup = $.create('input', {
  133. inside: btnGroup,
  134. className: `form-control`,
  135. type: "range",
  136. min: numOpts.min,
  137. max: numOpts.max,
  138. step: numOpts.step,
  139. value: o.activeState ? o.activeState : 0,
  140. // (max - min)/2
  141. onInput: (value) => {
  142. args[o.path[0]][o.path[1]] = value;
  143. this.demos[demoIndex] = new this.LIB_OBJ(figure, args);
  144. }
  145. });
  146. } else if(["map", "string"].includes(o.type)) {
  147. args[o.path[0]] = {};
  148. Object.keys(o.states).forEach(key => {
  149. let state = o.states[key];
  150. let activeClass = key === o.activeState ? 'active' : '';
  151. let button = $.create('button', {
  152. inside: btnGroup,
  153. className: `btn btn-sm btn-secondary ${activeClass}`,
  154. innerHTML: key,
  155. onClick: (e) => {
  156. // map
  157. if(o.type === "map") {
  158. mapKeys.forEach((attr, i) => {
  159. args[o.path[0]][attr] = state[i];
  160. })
  161. } else {
  162. // boolean, string, number, object
  163. args[o.path[0]] = state;
  164. }
  165. this.demos[demoIndex] = new this.LIB_OBJ(figure, args);
  166. }
  167. });
  168. if(activeClass) { button.click(); }
  169. });
  170. }
  171. });
  172. }
  173. getDemoActions(demoIndex, actions=[], args={}) {
  174. actions.forEach(o => {
  175. let args = o.args || [];
  176. $.create('button', {
  177. inside: this.parent,
  178. className: `btn btn-action btn-sm btn-secondary`,
  179. innerHTML: o.name,
  180. onClick: () => {this.demos[demoIndex][o.fn](...args);}
  181. });
  182. });
  183. }
  184. }