ngx-axis-appforge 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (447) hide show
  1. package/.editorconfig +17 -0
  2. package/README.md +111 -0
  3. package/angular.json +40 -0
  4. package/axis-components/badge/badge.css +3 -0
  5. package/axis-components/badge/badge.html +20 -0
  6. package/axis-components/badge/badge.options.ts +23 -0
  7. package/axis-components/badge/badge.ts +17 -0
  8. package/axis-components/badge/design/config.ts +52 -0
  9. package/axis-components/badge/design/ng-package.json +5 -0
  10. package/axis-components/badge/design/setting/setting.css +0 -0
  11. package/axis-components/badge/design/setting/setting.html +181 -0
  12. package/axis-components/badge/design/setting/setting.ts +126 -0
  13. package/axis-components/badge/ng-package.json +5 -0
  14. package/axis-components/button/button.css +3 -0
  15. package/axis-components/button/button.html +13 -0
  16. package/axis-components/button/button.options.ts +17 -0
  17. package/axis-components/button/button.ts +56 -0
  18. package/axis-components/button/design/config.ts +30 -0
  19. package/axis-components/button/design/ng-package.json +5 -0
  20. package/axis-components/button/design/setting/setting.css +0 -0
  21. package/axis-components/button/design/setting/setting.html +151 -0
  22. package/axis-components/button/design/setting/setting.ts +76 -0
  23. package/axis-components/button/ng-package.json +5 -0
  24. package/axis-components/cmp-map.ts +52 -0
  25. package/axis-components/cmplib.ts +9 -0
  26. package/axis-components/desc/desc.css +8 -0
  27. package/axis-components/desc/desc.html +19 -0
  28. package/axis-components/desc/desc.options.ts +24 -0
  29. package/axis-components/desc/desc.ts +29 -0
  30. package/axis-components/desc/design/config.ts +113 -0
  31. package/axis-components/desc/design/desc-item-setting/desc-item-setting.css +0 -0
  32. package/axis-components/desc/design/desc-item-setting/desc-item-setting.html +47 -0
  33. package/axis-components/desc/design/desc-item-setting/desc-item-setting.ts +40 -0
  34. package/axis-components/desc/design/desc-items-menu/desc-items-menu.css +0 -0
  35. package/axis-components/desc/design/desc-items-menu/desc-items-menu.html +9 -0
  36. package/axis-components/desc/design/desc-items-menu/desc-items-menu.ts +23 -0
  37. package/axis-components/desc/design/desc-setting/desc-setting.css +0 -0
  38. package/axis-components/desc/design/desc-setting/desc-setting.html +76 -0
  39. package/axis-components/desc/design/desc-setting/desc-setting.ts +51 -0
  40. package/axis-components/desc/design/ng-package.json +5 -0
  41. package/axis-components/desc/ng-package.json +5 -0
  42. package/axis-components/design/cmplib/cmplib.css +5 -0
  43. package/axis-components/design/cmplib/cmplib.html +52 -0
  44. package/axis-components/design/cmplib/cmplib.ts +96 -0
  45. package/axis-components/design/design/config.ts +29 -0
  46. package/axis-components/design/design/ng-package.json +5 -0
  47. package/axis-components/design/design/setting/setting.css +0 -0
  48. package/axis-components/design/design/setting/setting.html +33 -0
  49. package/axis-components/design/design/setting/setting.ts +33 -0
  50. package/axis-components/design/design.css +15 -0
  51. package/axis-components/design/design.html +51 -0
  52. package/axis-components/design/design.options.ts +9 -0
  53. package/axis-components/design/design.ts +509 -0
  54. package/axis-components/design/ng-package.json +5 -0
  55. package/axis-components/design/preview/drag.service.ts +148 -0
  56. package/axis-components/design/preview/drop-handler.ts +56 -0
  57. package/axis-components/design/preview/preview.css +3 -0
  58. package/axis-components/design/preview/preview.html +1 -0
  59. package/axis-components/design/preview/preview.ts +250 -0
  60. package/axis-components/design/preview/select.service.ts +140 -0
  61. package/axis-components/design/shortcut-key.ts +160 -0
  62. package/axis-components/design/toolbar/toolbar.css +24 -0
  63. package/axis-components/design/toolbar/toolbar.html +96 -0
  64. package/axis-components/design/toolbar/toolbar.ts +65 -0
  65. package/axis-components/design/tree/drag-drop.ts +125 -0
  66. package/axis-components/design/tree/tree.css +30 -0
  67. package/axis-components/design/tree/tree.html +49 -0
  68. package/axis-components/design/tree/tree.ts +292 -0
  69. package/axis-components/dynamic-container/design/config.ts +30 -0
  70. package/axis-components/dynamic-container/design/ng-package.json +5 -0
  71. package/axis-components/dynamic-container/design/setting/setting.css +0 -0
  72. package/axis-components/dynamic-container/design/setting/setting.html +20 -0
  73. package/axis-components/dynamic-container/design/setting/setting.ts +30 -0
  74. package/axis-components/dynamic-container/dynamic-container.css +3 -0
  75. package/axis-components/dynamic-container/dynamic-container.html +2 -0
  76. package/axis-components/dynamic-container/dynamic-container.options.ts +6 -0
  77. package/axis-components/dynamic-container/dynamic-container.ts +17 -0
  78. package/axis-components/dynamic-container/ng-package.json +5 -0
  79. package/axis-components/editor/editor.css +47 -0
  80. package/axis-components/editor/editor.html +10 -0
  81. package/axis-components/editor/editor.options.ts +10 -0
  82. package/axis-components/editor/editor.ts +86 -0
  83. package/axis-components/editor/ng-package.json +5 -0
  84. package/axis-components/examples/examples/badge.ts +17 -0
  85. package/axis-components/examples/examples/button.ts +38 -0
  86. package/axis-components/examples/examples/desc.ts +31 -0
  87. package/axis-components/examples/examples/design.ts +15 -0
  88. package/axis-components/examples/examples/dynamic-container.ts +21 -0
  89. package/axis-components/examples/examples/flex.ts +18 -0
  90. package/axis-components/examples/examples/form-item.ts +39 -0
  91. package/axis-components/examples/examples/form.ts +315 -0
  92. package/axis-components/examples/examples/icon.ts +16 -0
  93. package/axis-components/examples/examples/image.ts +15 -0
  94. package/axis-components/examples/examples/input-component.ts +15 -0
  95. package/axis-components/examples/examples/input-icon.ts +15 -0
  96. package/axis-components/examples/examples/input-json.ts +15 -0
  97. package/axis-components/examples/examples/input-number.ts +15 -0
  98. package/axis-components/examples/examples/input.ts +15 -0
  99. package/axis-components/examples/examples/modal.ts +15 -0
  100. package/axis-components/examples/examples/scope.ts +17 -0
  101. package/axis-components/examples/examples/single-selector.ts +25 -0
  102. package/axis-components/examples/examples/splitter.ts +36 -0
  103. package/axis-components/examples/examples/table.ts +126 -0
  104. package/axis-components/examples/examples/text.ts +15 -0
  105. package/axis-components/examples/examples/textarea.ts +15 -0
  106. package/axis-components/examples/examples/tree-selector.ts +35 -0
  107. package/axis-components/examples/examples/upload.ts +15 -0
  108. package/axis-components/examples/examples.ts +73 -0
  109. package/axis-components/flex/design/config.ts +49 -0
  110. package/axis-components/flex/design/ng-package.json +5 -0
  111. package/axis-components/flex/design/setting/setting.css +0 -0
  112. package/axis-components/flex/design/setting/setting.html +72 -0
  113. package/axis-components/flex/design/setting/setting.ts +43 -0
  114. package/axis-components/flex/flex.css +5 -0
  115. package/axis-components/flex/flex.html +6 -0
  116. package/axis-components/flex/flex.options.ts +12 -0
  117. package/axis-components/flex/flex.ts +15 -0
  118. package/axis-components/flex/ng-package.json +5 -0
  119. package/axis-components/form/design/config.ts +71 -0
  120. package/axis-components/form/design/ng-package.json +5 -0
  121. package/axis-components/form/design/setting/setting.css +0 -0
  122. package/axis-components/form/design/setting/setting.html +21 -0
  123. package/axis-components/form/design/setting/setting.ts +31 -0
  124. package/axis-components/form/form.css +3 -0
  125. package/axis-components/form/form.html +3 -0
  126. package/axis-components/form/form.options.ts +9 -0
  127. package/axis-components/form/form.ts +121 -0
  128. package/axis-components/form/ng-package.json +5 -0
  129. package/axis-components/form-item/design/config.ts +43 -0
  130. package/axis-components/form-item/design/ng-package.json +5 -0
  131. package/axis-components/form-item/design/setting/input-validator/input-validator.css +8 -0
  132. package/axis-components/form-item/design/setting/input-validator/input-validator.html +140 -0
  133. package/axis-components/form-item/design/setting/input-validator/input-validator.ts +158 -0
  134. package/axis-components/form-item/design/setting/setting.css +0 -0
  135. package/axis-components/form-item/design/setting/setting.html +39 -0
  136. package/axis-components/form-item/design/setting/setting.ts +40 -0
  137. package/axis-components/form-item/form-item.css +4 -0
  138. package/axis-components/form-item/form-item.html +16 -0
  139. package/axis-components/form-item/form-item.options.ts +12 -0
  140. package/axis-components/form-item/form-item.ts +128 -0
  141. package/axis-components/form-item/ng-package.json +5 -0
  142. package/axis-components/icon/design/config.ts +29 -0
  143. package/axis-components/icon/design/ng-package.json +5 -0
  144. package/axis-components/icon/design/setting/setting.css +0 -0
  145. package/axis-components/icon/design/setting/setting.html +67 -0
  146. package/axis-components/icon/design/setting/setting.ts +48 -0
  147. package/axis-components/icon/icon.css +0 -0
  148. package/axis-components/icon/icon.html +7 -0
  149. package/axis-components/icon/icon.options.ts +10 -0
  150. package/axis-components/icon/icon.ts +17 -0
  151. package/axis-components/icon/ng-package.json +5 -0
  152. package/axis-components/image/design/config.ts +30 -0
  153. package/axis-components/image/design/ng-package.json +5 -0
  154. package/axis-components/image/design/setting/setting.css +0 -0
  155. package/axis-components/image/design/setting/setting.html +42 -0
  156. package/axis-components/image/design/setting/setting.ts +37 -0
  157. package/axis-components/image/image.css +58 -0
  158. package/axis-components/image/image.html +14 -0
  159. package/axis-components/image/image.options.ts +8 -0
  160. package/axis-components/image/image.ts +29 -0
  161. package/axis-components/image/ng-package.json +5 -0
  162. package/axis-components/input/design/config.ts +80 -0
  163. package/axis-components/input/design/ng-package.json +5 -0
  164. package/axis-components/input/design/setting/setting.css +0 -0
  165. package/axis-components/input/design/setting/setting.html +79 -0
  166. package/axis-components/input/design/setting/setting.ts +51 -0
  167. package/axis-components/input/input.css +4 -0
  168. package/axis-components/input/input.html +32 -0
  169. package/axis-components/input/input.options.ts +14 -0
  170. package/axis-components/input/input.ts +53 -0
  171. package/axis-components/input/ng-package.json +5 -0
  172. package/axis-components/input-component/design/config.ts +30 -0
  173. package/axis-components/input-component/design/ng-package.json +5 -0
  174. package/axis-components/input-component/design/setting/setting.css +0 -0
  175. package/axis-components/input-component/design/setting/setting.html +33 -0
  176. package/axis-components/input-component/design/setting/setting.ts +33 -0
  177. package/axis-components/input-component/input-component.css +4 -0
  178. package/axis-components/input-component/input-component.html +25 -0
  179. package/axis-components/input-component/input-component.options.ts +7 -0
  180. package/axis-components/input-component/input-component.ts +50 -0
  181. package/axis-components/input-component/ng-package.json +5 -0
  182. package/axis-components/input-icon/design/config.ts +30 -0
  183. package/axis-components/input-icon/design/ng-package.json +5 -0
  184. package/axis-components/input-icon/design/setting/setting.css +0 -0
  185. package/axis-components/input-icon/design/setting/setting.html +29 -0
  186. package/axis-components/input-icon/design/setting/setting.ts +33 -0
  187. package/axis-components/input-icon/input-icon.css +4 -0
  188. package/axis-components/input-icon/input-icon.html +70 -0
  189. package/axis-components/input-icon/input-icon.options.ts +7 -0
  190. package/axis-components/input-icon/input-icon.ts +51 -0
  191. package/axis-components/input-icon/ng-package.json +5 -0
  192. package/axis-components/input-json/design/config.ts +29 -0
  193. package/axis-components/input-json/design/ng-package.json +5 -0
  194. package/axis-components/input-json/design/setting/setting.css +0 -0
  195. package/axis-components/input-json/design/setting/setting.html +7 -0
  196. package/axis-components/input-json/design/setting/setting.ts +26 -0
  197. package/axis-components/input-json/input-json.css +4 -0
  198. package/axis-components/input-json/input-json.html +19 -0
  199. package/axis-components/input-json/input-json.ts +67 -0
  200. package/axis-components/input-json/ng-package.json +5 -0
  201. package/axis-components/input-number/design/config.ts +30 -0
  202. package/axis-components/input-number/design/ng-package.json +5 -0
  203. package/axis-components/input-number/design/setting/setting.css +0 -0
  204. package/axis-components/input-number/design/setting/setting.html +118 -0
  205. package/axis-components/input-number/design/setting/setting.ts +66 -0
  206. package/axis-components/input-number/input-number.css +22 -0
  207. package/axis-components/input-number/input-number.html +11 -0
  208. package/axis-components/input-number/input-number.options.ts +17 -0
  209. package/axis-components/input-number/input-number.ts +30 -0
  210. package/axis-components/input-number/ng-package.json +5 -0
  211. package/axis-components/modal/design/config.ts +50 -0
  212. package/axis-components/modal/design/ng-package.json +5 -0
  213. package/axis-components/modal/design/set-modal-visible-handler/set-modal-visible-handler.css +0 -0
  214. package/axis-components/modal/design/set-modal-visible-handler/set-modal-visible-handler.html +15 -0
  215. package/axis-components/modal/design/set-modal-visible-handler/set-modal-visible-handler.ts +34 -0
  216. package/axis-components/modal/design/setting/setting.css +0 -0
  217. package/axis-components/modal/design/setting/setting.html +139 -0
  218. package/axis-components/modal/design/setting/setting.ts +92 -0
  219. package/axis-components/modal/modal.css +0 -0
  220. package/axis-components/modal/modal.html +7 -0
  221. package/axis-components/modal/modal.options.ts +20 -0
  222. package/axis-components/modal/modal.ts +57 -0
  223. package/axis-components/modal/ng-package.json +5 -0
  224. package/axis-components/ng-package.json +5 -0
  225. package/axis-components/scope/design/config.ts +59 -0
  226. package/axis-components/scope/design/ng-package.json +5 -0
  227. package/axis-components/scope/design/setting/datasource-editor/datasource-editor.css +28 -0
  228. package/axis-components/scope/design/setting/datasource-editor/datasource-editor.html +188 -0
  229. package/axis-components/scope/design/setting/datasource-editor/datasource-editor.ts +245 -0
  230. package/axis-components/scope/design/setting/setting.css +0 -0
  231. package/axis-components/scope/design/setting/setting.html +19 -0
  232. package/axis-components/scope/design/setting/setting.ts +30 -0
  233. package/axis-components/scope/ng-package.json +5 -0
  234. package/axis-components/scope/scope.css +6 -0
  235. package/axis-components/scope/scope.html +4 -0
  236. package/axis-components/scope/scope.options.ts +8 -0
  237. package/axis-components/scope/scope.ts +48 -0
  238. package/axis-components/single-selector/design/config.ts +30 -0
  239. package/axis-components/single-selector/design/ng-package.json +5 -0
  240. package/axis-components/single-selector/design/setting/setting.css +0 -0
  241. package/axis-components/single-selector/design/setting/setting.html +164 -0
  242. package/axis-components/single-selector/design/setting/setting.ts +80 -0
  243. package/axis-components/single-selector/ng-package.json +5 -0
  244. package/axis-components/single-selector/single-selector.css +8 -0
  245. package/axis-components/single-selector/single-selector.html +51 -0
  246. package/axis-components/single-selector/single-selector.options.ts +22 -0
  247. package/axis-components/single-selector/single-selector.ts +80 -0
  248. package/axis-components/splitter/design/config.ts +84 -0
  249. package/axis-components/splitter/design/ng-package.json +5 -0
  250. package/axis-components/splitter/design/splitter-menu/splitter-menu.css +0 -0
  251. package/axis-components/splitter/design/splitter-menu/splitter-menu.html +10 -0
  252. package/axis-components/splitter/design/splitter-menu/splitter-menu.ts +22 -0
  253. package/axis-components/splitter/design/splitter-panel-setting/splitter-panel-setting.css +0 -0
  254. package/axis-components/splitter/design/splitter-panel-setting/splitter-panel-setting.html +66 -0
  255. package/axis-components/splitter/design/splitter-panel-setting/splitter-panel-setting.ts +47 -0
  256. package/axis-components/splitter/design/splitter-setting/splitter-setting.css +0 -0
  257. package/axis-components/splitter/design/splitter-setting/splitter-setting.html +28 -0
  258. package/axis-components/splitter/design/splitter-setting/splitter-setting.ts +30 -0
  259. package/axis-components/splitter/ng-package.json +5 -0
  260. package/axis-components/splitter/splitter.css +7 -0
  261. package/axis-components/splitter/splitter.html +12 -0
  262. package/axis-components/splitter/splitter.options.ts +18 -0
  263. package/axis-components/splitter/splitter.ts +29 -0
  264. package/axis-components/table/design/config.ts +147 -0
  265. package/axis-components/table/design/ng-package.json +5 -0
  266. package/axis-components/table/design/table-field-setting/table-field-setting.css +0 -0
  267. package/axis-components/table/design/table-field-setting/table-field-setting.html +259 -0
  268. package/axis-components/table/design/table-field-setting/table-field-setting.ts +105 -0
  269. package/axis-components/table/design/table-fields-menu/table-fields-menu.css +0 -0
  270. package/axis-components/table/design/table-fields-menu/table-fields-menu.html +9 -0
  271. package/axis-components/table/design/table-fields-menu/table-fields-menu.ts +24 -0
  272. package/axis-components/table/design/table-setting/table-setting.css +0 -0
  273. package/axis-components/table/design/table-setting/table-setting.html +417 -0
  274. package/axis-components/table/design/table-setting/table-setting.ts +173 -0
  275. package/axis-components/table/expand.ts +12 -0
  276. package/axis-components/table/ng-package.json +5 -0
  277. package/axis-components/table/select.ts +66 -0
  278. package/axis-components/table/table-setter/table-setter.css +55 -0
  279. package/axis-components/table/table-setter/table-setter.html +38 -0
  280. package/axis-components/table/table-setter/table-setter.ts +121 -0
  281. package/axis-components/table/table.css +5 -0
  282. package/axis-components/table/table.html +191 -0
  283. package/axis-components/table/table.options.ts +72 -0
  284. package/axis-components/table/table.ts +204 -0
  285. package/axis-components/text/design/config.ts +30 -0
  286. package/axis-components/text/design/ng-package.json +5 -0
  287. package/axis-components/text/design/setting/setting.css +0 -0
  288. package/axis-components/text/design/setting/setting.html +84 -0
  289. package/axis-components/text/design/setting/setting.ts +54 -0
  290. package/axis-components/text/ng-package.json +5 -0
  291. package/axis-components/text/text.css +3 -0
  292. package/axis-components/text/text.html +17 -0
  293. package/axis-components/text/text.options.ts +10 -0
  294. package/axis-components/text/text.ts +54 -0
  295. package/axis-components/textarea/design/config.ts +30 -0
  296. package/axis-components/textarea/design/ng-package.json +5 -0
  297. package/axis-components/textarea/design/setting/setting.css +0 -0
  298. package/axis-components/textarea/design/setting/setting.html +76 -0
  299. package/axis-components/textarea/design/setting/setting.ts +55 -0
  300. package/axis-components/textarea/ng-package.json +5 -0
  301. package/axis-components/textarea/textarea.css +4 -0
  302. package/axis-components/textarea/textarea.html +11 -0
  303. package/axis-components/textarea/textarea.options.ts +13 -0
  304. package/axis-components/textarea/textarea.ts +49 -0
  305. package/axis-components/tree-selector/design/config.ts +55 -0
  306. package/axis-components/tree-selector/design/ng-package.json +5 -0
  307. package/axis-components/tree-selector/design/tree-selector-menu/tree-selector-menu.css +0 -0
  308. package/axis-components/tree-selector/design/tree-selector-menu/tree-selector-menu.html +9 -0
  309. package/axis-components/tree-selector/design/tree-selector-menu/tree-selector-menu.ts +26 -0
  310. package/axis-components/tree-selector/design/tree-selector-menu-setting/tree-selector-menu-setting.css +0 -0
  311. package/axis-components/tree-selector/design/tree-selector-menu-setting/tree-selector-menu-setting.html +80 -0
  312. package/axis-components/tree-selector/design/tree-selector-menu-setting/tree-selector-menu-setting.ts +58 -0
  313. package/axis-components/tree-selector/design/tree-selector-setting/tree-selector-setting.css +0 -0
  314. package/axis-components/tree-selector/design/tree-selector-setting/tree-selector-setting.html +235 -0
  315. package/axis-components/tree-selector/design/tree-selector-setting/tree-selector-setting.ts +87 -0
  316. package/axis-components/tree-selector/ng-package.json +5 -0
  317. package/axis-components/tree-selector/tree-selector.css +43 -0
  318. package/axis-components/tree-selector/tree-selector.html +65 -0
  319. package/axis-components/tree-selector/tree-selector.options.ts +50 -0
  320. package/axis-components/tree-selector/tree-selector.ts +252 -0
  321. package/axis-components/upload/design/config.ts +37 -0
  322. package/axis-components/upload/design/ng-package.json +5 -0
  323. package/axis-components/upload/design/setting/setting.css +0 -0
  324. package/axis-components/upload/design/setting/setting.html +288 -0
  325. package/axis-components/upload/design/setting/setting.ts +96 -0
  326. package/axis-components/upload/ng-package.json +5 -0
  327. package/axis-components/upload/upload.css +3 -0
  328. package/axis-components/upload/upload.html +36 -0
  329. package/axis-components/upload/upload.options.ts +29 -0
  330. package/axis-components/upload/upload.ts +130 -0
  331. package/axis-components-covers/badge.svg +1 -0
  332. package/axis-components-covers/button.svg +14 -0
  333. package/axis-components-covers/desc.svg +39 -0
  334. package/axis-components-covers/design.jpg +0 -0
  335. package/axis-components-covers/dynamic-container.svg +9 -0
  336. package/axis-components-covers/flex.svg +33 -0
  337. package/axis-components-covers/form-item.svg +22 -0
  338. package/axis-components-covers/form.svg +38 -0
  339. package/axis-components-covers/icon.svg +22 -0
  340. package/axis-components-covers/image.svg +13 -0
  341. package/axis-components-covers/input-component.svg +27 -0
  342. package/axis-components-covers/input-icon.svg +29 -0
  343. package/axis-components-covers/input-json.svg +29 -0
  344. package/axis-components-covers/input-number.svg +35 -0
  345. package/axis-components-covers/input.svg +21 -0
  346. package/axis-components-covers/modal.svg +23 -0
  347. package/axis-components-covers/scope.svg +9 -0
  348. package/axis-components-covers/single-selector.svg +20 -0
  349. package/axis-components-covers/splitter.svg +8 -0
  350. package/axis-components-covers/table.svg +27 -0
  351. package/axis-components-covers/text.svg +22 -0
  352. package/axis-components-covers/textarea.svg +9 -0
  353. package/axis-components-covers/tree-selector.svg +77 -0
  354. package/axis-components-covers/upload.svg +26 -0
  355. package/core/base/base-menu.ts +22 -0
  356. package/core/base/base.ts +143 -0
  357. package/core/base/design-builder.ts +8 -0
  358. package/core/base/funfield-base.ts +106 -0
  359. package/core/base/funfield-value-base.ts +53 -0
  360. package/core/base/value-access.ts +70 -0
  361. package/core/directives/dynamic.ts +216 -0
  362. package/core/directives/scope.ts +432 -0
  363. package/core/models/api.options.ts +5 -0
  364. package/core/models/base.options.ts +11 -0
  365. package/core/models/cmplib.ts +7 -0
  366. package/core/models/data-source.options.ts +11 -0
  367. package/core/models/data.options.ts +6 -0
  368. package/core/models/design-build.ts +26 -0
  369. package/core/models/design-config.ts +14 -0
  370. package/core/models/design-tree-node.ts +16 -0
  371. package/core/models/event-desc.ts +28 -0
  372. package/core/models/event-handler.ts +6 -0
  373. package/core/models/event.options.ts +14 -0
  374. package/core/models/examples.ts +21 -0
  375. package/core/models/form-registe.options.ts +12 -0
  376. package/core/models/fun-field.options.ts +6 -0
  377. package/core/models/initobs.ts +8 -0
  378. package/core/models/options-node.ts +149 -0
  379. package/core/models/static-data-source.options.ts +4 -0
  380. package/core/models/trigge-events.options.ts +3 -0
  381. package/core/models/value-access.options.ts +10 -0
  382. package/core/ng-package.json +5 -0
  383. package/core/pipes/how-long.pipe.ts +69 -0
  384. package/core/public-api.ts +39 -0
  385. package/core/share/api-handler/api-handler.css +0 -0
  386. package/core/share/api-handler/api-handler.html +38 -0
  387. package/core/share/api-handler/api-handler.ts +51 -0
  388. package/core/share/array-filter-handler/array-filter-handler.css +0 -0
  389. package/core/share/array-filter-handler/array-filter-handler.html +26 -0
  390. package/core/share/array-filter-handler/array-filter-handler.ts +65 -0
  391. package/core/share/array-filter-handler/input-filter-options/filter-options.css +19 -0
  392. package/core/share/array-filter-handler/input-filter-options/filter-options.html +57 -0
  393. package/core/share/array-filter-handler/input-filter-options/filter-options.ts +100 -0
  394. package/core/share/base-design-setting/base-design-setting.css +0 -0
  395. package/core/share/base-design-setting/base-design-setting.html +50 -0
  396. package/core/share/base-design-setting/base-design-setting.ts +55 -0
  397. package/core/share/base-event-handler-descs.ts +100 -0
  398. package/core/share/common-menu/common-menu.css +0 -0
  399. package/core/share/common-menu/common-menu.html +21 -0
  400. package/core/share/common-menu/common-menu.ts +73 -0
  401. package/core/share/data-handler/data-handler.css +0 -0
  402. package/core/share/data-handler/data-handler.html +13 -0
  403. package/core/share/data-handler/data-handler.ts +39 -0
  404. package/core/share/events-handler.service.ts +185 -0
  405. package/core/share/fun-field/fun-field.css +55 -0
  406. package/core/share/fun-field/fun-field.html +175 -0
  407. package/core/share/fun-field/fun-field.ts +363 -0
  408. package/core/share/input-trigger/input-trigger.css +16 -0
  409. package/core/share/input-trigger/input-trigger.html +114 -0
  410. package/core/share/input-trigger/input-trigger.ts +394 -0
  411. package/core/share/msg-tip-handler/msg-tip-handler.css +0 -0
  412. package/core/share/msg-tip-handler/msg-tip-handler.html +40 -0
  413. package/core/share/msg-tip-handler/msg-tip-handler.ts +46 -0
  414. package/core/share/refresh-data-source-handler/refresh-data-source-handler.css +0 -0
  415. package/core/share/refresh-data-source-handler/refresh-data-source-handler.html +29 -0
  416. package/core/share/refresh-data-source-handler/refresh-data-source-handler.ts +55 -0
  417. package/core/share/route-handler/route-handler.css +0 -0
  418. package/core/share/route-handler/route-handler.html +49 -0
  419. package/core/share/route-handler/route-handler.ts +51 -0
  420. package/core/share/set-data-source-handler/set-data-source-handler.css +0 -0
  421. package/core/share/set-data-source-handler/set-data-source-handler.html +23 -0
  422. package/core/share/set-data-source-handler/set-data-source-handler.ts +44 -0
  423. package/core/share/simple-menu/simple-menu.css +0 -0
  424. package/core/share/simple-menu/simple-menu.html +5 -0
  425. package/core/share/simple-menu/simple-menu.ts +17 -0
  426. package/core/share/tokens.ts +29 -0
  427. package/core/share/value-design-setting/value-design-setting.css +0 -0
  428. package/core/share/value-design-setting/value-design-setting.html +48 -0
  429. package/core/share/value-design-setting/value-design-setting.ts +54 -0
  430. package/core/utils/code-name.utils.ts +19 -0
  431. package/core/utils/components-loader.ts +29 -0
  432. package/core/utils/declaration.utils.ts +38 -0
  433. package/core/utils/dynamic.util.ts +57 -0
  434. package/core/utils/form-validators.ts +160 -0
  435. package/core/utils/form.util.ts +25 -0
  436. package/core/utils/http.utils.ts +8 -0
  437. package/core/utils/object.utils.ts +182 -0
  438. package/core/utils/scripts-loader.ts +25 -0
  439. package/ng-package.json +13 -0
  440. package/package.json +37 -0
  441. package/providers/ng-package.json +5 -0
  442. package/providers/providers.ts +44 -0
  443. package/providers/public-api.ts +1 -0
  444. package/public-api.ts +1 -0
  445. package/tsconfig.json +38 -0
  446. package/tsconfig.lib.json +19 -0
  447. package/tsconfig.lib.prod.json +11 -0
@@ -0,0 +1,509 @@
1
+ import { ChangeDetectionStrategy, Component, ComponentRef, HostListener, inject, Injector, model, OnDestroy, signal, ViewChild, ViewContainerRef } from '@angular/core';
2
+ import { NzSplitterModule } from 'ng-zorro-antd/splitter';
3
+ import { NzTabsModule } from 'ng-zorro-antd/tabs';
4
+ import { Tree } from './tree/tree';
5
+ import { Preview } from './preview/preview';
6
+ import { NzFlexModule } from 'ng-zorro-antd/flex';
7
+ import { AXIS_COMPONENTS_LOADER_TOKEN, ValueAccess, FunFieldValueBase, ScopeInfo, NextInfo, OptionsNode, AXIS_DESIGN_OPTIONS_NODE_FOR_MENU, AXIS_DESIGN_ALL_PERMISSIONS_TOKEN, DynamicDirective, AXIS_DESIGN_SCOPE_INFOS_GETTER_TOKEN, Example, AXIS_DESIGN_COMPONENT_INFO_FOR_SETTING_TOKEN, EventHandlerDesc, AXIS_INJECT_FUNC_TOKEN, copy, AXIS_DESIGN_CHOOSE_COMPONENT_FUNC_TOKEN, DesignConfig } from 'ngx-axis-appforge/core';
8
+ import { Cmplib } from './cmplib/cmplib';
9
+ import { FormsModule } from '@angular/forms';
10
+ import { NzEmptyModule } from 'ng-zorro-antd/empty';
11
+ import { ShortcutKey } from './shortcut-key';
12
+ import { DesignOptions } from './design.options';
13
+ import { BehaviorSubject, debounceTime, filter, from, map, merge, NEVER, Observable, of, Subject, switchMap, take } from 'rxjs';
14
+ import { NzDrawerModule } from 'ng-zorro-antd/drawer';
15
+ import { Toolbar } from './toolbar/toolbar';
16
+ import { toObservable } from '@angular/core/rxjs-interop';
17
+ import { ClipboardService } from 'ngx-clipboard';
18
+
19
+ @Component({
20
+ selector: 'axis-design',
21
+ imports: [NzSplitterModule, NzTabsModule, Preview, Tree, NzFlexModule, Cmplib, FormsModule, NzEmptyModule, DynamicDirective, NzDrawerModule, Toolbar],
22
+ templateUrl: './design.html',
23
+ styleUrl: './design.css',
24
+ changeDetection: ChangeDetectionStrategy.OnPush,
25
+ host: {
26
+ tabindex: "-1",
27
+ autofocus: "true",
28
+ }
29
+ })
30
+ export class Design extends ValueAccess<DesignOptions> implements OnDestroy {
31
+
32
+ constructor() {
33
+ super();
34
+ this.addSubscribe(this.changeSubject
35
+ .pipe(debounceTime(300))
36
+ .subscribe((value) => this.onChangeOptionsConfig(value)))
37
+ }
38
+
39
+ protected override options = new DesignOptions();
40
+
41
+ clipboard = inject(ClipboardService);
42
+ loader = inject(AXIS_COMPONENTS_LOADER_TOKEN);
43
+ injectDataObs = toObservable(this.options.injectData);
44
+ funcs = inject(AXIS_INJECT_FUNC_TOKEN);
45
+
46
+ treeNode = signal<OptionsNode | null | undefined>(undefined);
47
+ loadAndOptions = signal<[Promise<any>, any] | undefined>(undefined);
48
+
49
+ @ViewChild("menu", { static: true, read: ViewContainerRef })
50
+ menu!: ViewContainerRef;
51
+ readonly chooseComponentVisible = model(false);
52
+ readonly chooseComponentSubject = new Subject<Example | undefined>();
53
+ readonly chooseComponentTags = signal<string[]>([]);
54
+
55
+ cacheSized: [number, number] = [300, 300];
56
+ @ViewChild("setting", { static: true, read: ViewContainerRef })
57
+ setting!: ViewContainerRef;
58
+ settingRef?: ComponentRef<FunFieldValueBase>;
59
+ settingOptionsNodeId?: string;
60
+ settingOptionsStr = model("");
61
+
62
+ @ViewChild("preview", { static: true })
63
+ preview!: Preview;
64
+
65
+ @ViewChild("tree", { static: true })
66
+ tree!: Tree;
67
+
68
+ @ViewChild("codeEditor")
69
+ codeEditor?: DynamicDirective;
70
+
71
+ @ViewChild("tools", { static: true })
72
+ tools!: Toolbar;
73
+
74
+ readonly shortcutKey = new ShortcutKey(this);
75
+ @HostListener("keydown", ['$event'])
76
+ onKeyPress(e: KeyboardEvent) {
77
+ this.shortcutKey.onKeyPress(e);
78
+ }
79
+
80
+ readonly optionsNodes = new Map<string, OptionsNode>();
81
+ readonly optionsNodeScopes = new Map<string, OptionsNode[]>();
82
+ readonly scopeInfos = new Map<string, ScopeInfo>();
83
+
84
+ readonly componentsInfo = new Map<string, { component: string, componentName: string, eventHandlerDescs: { [name: string]: EventHandlerDesc } }>
85
+ readonly componentsCounter = new Map<string, number>();
86
+ readonly scopInfoSubjects = new Map<string, BehaviorSubject<ScopeInfo[]>>();
87
+
88
+ readonly changeSubject = new Subject<any>();
89
+
90
+ override setInitValue(value: any): void {
91
+ super.setInitValue(value);
92
+ this.tools.putHistory(value);
93
+ this.render(value);
94
+ }
95
+
96
+ override writeValue(value: any): void {
97
+ super.writeValue(value);
98
+ this.tools.putHistory(value);
99
+ this.render(value);
100
+ }
101
+
102
+ async inspect(nextInfo: NextInfo): Promise<OptionsNode | undefined> {
103
+ if (!nextInfo.currentObject?.component) {
104
+ return;
105
+ }
106
+ const config = await this.loader.loadComponent(`${nextInfo.currentObject.component}/design`);
107
+ if (!this.componentsInfo.has(nextInfo.currentObject.component)) {
108
+ this.componentsInfo.set(nextInfo.currentObject.component, { component: nextInfo.currentObject.component, componentName: config.componentName, eventHandlerDescs: config.eventHandlerDescs });
109
+ }
110
+ if (!this.componentsCounter.has(nextInfo.currentObject.component)) {
111
+ this.componentsCounter.set(nextInfo.currentObject.component, 0);
112
+ }
113
+ this.componentsCounter.set(nextInfo.currentObject.component, this.componentsCounter.get(nextInfo.currentObject.component)! + 1);
114
+ const res = config.buildOptionsNodes?.(nextInfo);
115
+ if (res) {
116
+ let nodes = [res.treeNode];
117
+ while (nodes.length) {
118
+ let next: OptionsNode[] = [];
119
+ for (const node of nodes) {
120
+ this.optionsNodes.set(node.id!, node);
121
+ if (node.children) {
122
+ next = next.concat(node.children);
123
+ }
124
+ nodes = next;
125
+ }
126
+ }
127
+ if (res.treeNode.scopeId) {
128
+ if (!this.optionsNodeScopes.has(res.treeNode.scopeId)) {
129
+ this.optionsNodeScopes.set(res.treeNode.scopeId, []);
130
+ }
131
+ this.optionsNodeScopes.get(res.treeNode.scopeId)!.push(res.treeNode);
132
+ }
133
+ if (res.newScopes) {
134
+ for (const scope of res.newScopes) {
135
+ this.scopeInfos.set(scope.scopeId, scope);
136
+ }
137
+ }
138
+ if (res.next?.length) {
139
+ for (const r of res.next) {
140
+ if (Array.isArray(r.parentObject)) {
141
+ for (let i = 0; i < r.parentObject.length; i++) {
142
+ r.indexOfParent = i;
143
+ r.currentObject = r.parentObject[i];
144
+ const parent = this.optionsNodes.get(r.parentId);
145
+ const child = await this.inspect(r);
146
+ if (child) {
147
+ parent?.children?.push(child);
148
+ }
149
+ }
150
+ } else if (r.indexOfParent != undefined) {
151
+ r.currentObject = r.parentObject[r.indexOfParent];
152
+ const child = await this.inspect(r);
153
+ if (child) {
154
+ this.optionsNodes.get(r.parentId)?.children?.push(child);
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+ return res?.treeNode;
161
+ }
162
+
163
+ onChangeOptionsConfig(value?: any, putHistory = true) {
164
+ this.reset();
165
+ if (value === undefined) {
166
+ value = this.value();
167
+ }
168
+ this.value.set(copy(value, true));
169
+ this.render(this.value());
170
+ this.loadAndOptions()?.[0].then(() => {
171
+ if (!putHistory && this.settingOptionsNodeId) {
172
+ const node = this.optionsNodes.get(this.settingOptionsNodeId);
173
+ if (node) {
174
+ this.settingRef?.instance.writeValue(node.options);
175
+ }
176
+ this.syncToCode();
177
+ }
178
+ });
179
+ this.onChange?.(this.value());
180
+ if (putHistory) {
181
+ this.tools.putHistory(this.value());
182
+ }
183
+ }
184
+
185
+ render(value: any) {
186
+ this.loadAndOptions.set([this.inspect({ currentObject: value }).then(v => {
187
+ this.treeNode.set(v ?? null);
188
+ return v;
189
+ }), value])
190
+ }
191
+
192
+ onSettingChange(settingValue: any) {
193
+ if (this.settingOptionsNodeId) {
194
+ const optionsNode = this.optionsNodes.get(this.settingOptionsNodeId!);
195
+ if (optionsNode) {
196
+ if (optionsNode.isRoot) {
197
+ Object.assign(this.value(), settingValue);
198
+ } else {
199
+ optionsNode.updateOptions(settingValue);
200
+ }
201
+ this.settingOptionsNodeId = optionsNode.id;
202
+ this.preview.selectByNodeIds([this.settingOptionsNodeId!]);
203
+ this.tree.selectByNodeIds([this.settingOptionsNodeId!]);
204
+ this.changeSubject.next(undefined);
205
+ }
206
+ }
207
+ }
208
+
209
+ onTreeSelect(nodeIds: string[]) {
210
+ this.preview.selectByNodeIds(nodeIds);
211
+ if (nodeIds.length == 1) {
212
+ this.updateScopeWithNodeId(nodeIds[0]);
213
+ this.loadSetting(nodeIds[0]);
214
+ } else {
215
+ this.settingOptionsNodeId = undefined;
216
+ this.resetSetting();
217
+ }
218
+ }
219
+
220
+ onPreviewSelect(nodeIds: string[]) {
221
+ this.menu.clear();
222
+ this.tree.selectByNodeIds(nodeIds);
223
+ if (nodeIds.length == 1) {
224
+ this.updateScopeWithNodeId(nodeIds[0]);
225
+ this.loadSetting(nodeIds[0]);
226
+ } else {
227
+ this.settingOptionsNodeId = undefined;
228
+ this.resetSetting();
229
+ }
230
+ let expandIds: string[] = [];
231
+ for (const nodeid of nodeIds) {
232
+ expandIds = expandIds.concat(this.getAllParentNodes(nodeid).map(n => n.id!));
233
+ }
234
+ this.tree.expandByNodeIds(expandIds);
235
+ }
236
+
237
+ private updateScopeWithNodeId(nodeId: string) {
238
+ let scopeId = this.optionsNodes.get(nodeId)?.scopeId;
239
+ while (scopeId && this.scopeInfos.has(scopeId)) {
240
+ this.preview.updateScopeWithSelectedElement(scopeId);
241
+ scopeId = this.scopeInfos.get(scopeId)?.parentScopeId;
242
+ }
243
+ }
244
+
245
+ loadSetting(nodeId: string) {
246
+ if (nodeId && this.optionsNodes.has(nodeId)) {
247
+ if (this.settingOptionsNodeId == nodeId) {
248
+ return;
249
+ } else if (this.settingOptionsNodeId) {
250
+ const oldNode = this.optionsNodes.get(this.settingOptionsNodeId)!;
251
+ const newNode = this.optionsNodes.get(nodeId)!;
252
+ if (oldNode.parentId == newNode.parentId && oldNode.settingType == newNode.settingType) {
253
+ this.settingOptionsNodeId = nodeId;
254
+ this.settingOptionsStr.set(JSON.stringify(newNode.options, null, " "));
255
+ this.settingRef?.instance.writeValue(newNode.options);
256
+ return;
257
+ }
258
+ }
259
+ this.resetSetting();
260
+ this.settingOptionsNodeId = nodeId;
261
+ const optionsNode = this.optionsNodes.get(nodeId)!;
262
+ this.settingOptionsStr.set(JSON.stringify(optionsNode.options, null, " "));
263
+ if (optionsNode.settingType) {
264
+ const injector = Injector.create({
265
+ providers: [
266
+ { provide: AXIS_DESIGN_SCOPE_INFOS_GETTER_TOKEN, useValue: this.buildScopeInfosGetter(optionsNode) },
267
+ { provide: AXIS_DESIGN_COMPONENT_INFO_FOR_SETTING_TOKEN, useValue: this.buildComponentInfoForSetting(optionsNode) },
268
+ { provide: AXIS_DESIGN_ALL_PERMISSIONS_TOKEN, useValue: this.options.allPermissions() },
269
+ { provide: AXIS_INJECT_FUNC_TOKEN, useValue: this.funcs }
270
+ ]
271
+ })
272
+ this.settingRef = this.setting.createComponent(optionsNode.settingType, { injector: injector });
273
+ this.settingRef.instance.onChange = this.onSettingChange.bind(this);
274
+ this.settingRef.instance.writeValue(optionsNode.options);
275
+ }
276
+ } else {
277
+ this.resetSetting();
278
+ }
279
+ }
280
+
281
+ private buildScopeInfosGetter(optionsNode: OptionsNode): (scopeId?: string) => BehaviorSubject<ScopeInfo[]> {
282
+ const _scopeId = optionsNode.scopeId;
283
+ return (scopeId?: string): BehaviorSubject<ScopeInfo[]> => {
284
+ scopeId ??= _scopeId;
285
+ if (scopeId) {
286
+ if (!this.scopInfoSubjects.has(scopeId)) {
287
+ this.scopInfoSubjects.set(scopeId, this.buildScopeInfoSubject(scopeId));
288
+ }
289
+ return this.scopInfoSubjects.get(scopeId)!;
290
+ }
291
+ return new BehaviorSubject<ScopeInfo[]>([]);
292
+ }
293
+ }
294
+
295
+ private buildScopeInfoSubject(scopeId: string | undefined): BehaviorSubject<ScopeInfo[]> {
296
+ const scopeObs: Observable<{ scopeInfo: ScopeInfo, index: number }>[] = [];
297
+ const scopeInfosOrder: string[] = [];
298
+ while (scopeId && this.scopeInfos.has(scopeId)) {
299
+ const scopeInfo = this.scopeInfos.get(scopeId)!;
300
+ scopeInfosOrder.push(scopeId);
301
+ const scopeSubject = this.preview.getAndUpdateScopeSubject(scopeId);
302
+ scopeObs.push(scopeSubject.pipe(
303
+ filter(s => !!s),
304
+ switchMap(s => {
305
+ return merge(new Observable(sub => sub.next(s.getSnapshoptAllWithScopeId(s.axisScope()))), s.getAllWithScopeId(s.axisScope()) ?? NEVER);
306
+ }),
307
+ filter(realDs => !!realDs && this.scopeInfos.has(scopeInfo.scopeId)),
308
+ map(realDs => {
309
+ const _scopeInfo = this.scopeInfos.get(scopeInfo.scopeId)!;
310
+ return {
311
+ scopeInfo: { ..._scopeInfo, ds: { ..._scopeInfo.ds, ...realDs } },
312
+ index: scopeInfosOrder.indexOf(scopeInfo.scopeId),
313
+ };
314
+ })
315
+ ));
316
+ scopeId = scopeInfo.parentScopeId;
317
+ }
318
+ const subject = new BehaviorSubject<ScopeInfo[]>([]);
319
+ const res: ScopeInfo[] = [];
320
+ this.addSubscribe(merge(...scopeObs).pipe(map(row => {
321
+ res[row.index] = row.scopeInfo;
322
+ return [...res];
323
+ })).subscribe(subject));
324
+ return subject;
325
+ }
326
+
327
+ private buildComponentInfoForSetting(optionsNode: OptionsNode): { component: string, componentName: string, nodes: OptionsNode[], eventHandlerDescs: { [event: string]: EventHandlerDesc } }[] {
328
+ const componentInfo: Map<string, { component: string, componentName: string, nodes: OptionsNode[], eventHandlerDescs: { [event: string]: EventHandlerDesc } }> = new Map();
329
+ let scopeId = optionsNode.scopeId;
330
+ while (scopeId) {
331
+ let nodes = this.optionsNodeScopes.get(scopeId)!
332
+ if (nodes) {
333
+ for (const node of nodes) {
334
+ const component = node.options.component;
335
+ if (!componentInfo.has(component)) {
336
+ const info = this.componentsInfo.get(component)!;
337
+ componentInfo.set(component, { component: info.component, componentName: info.componentName, nodes: [], eventHandlerDescs: info.eventHandlerDescs ?? {} })
338
+ }
339
+ componentInfo.get(component)!.nodes.push(node);
340
+ }
341
+ }
342
+ scopeId = this.scopeInfos.get(scopeId)?.parentScopeId;
343
+ }
344
+ return Array.from(componentInfo.values());
345
+ }
346
+
347
+ onContextMenu(e: MouseEvent, nodeId: string) {
348
+ const node = this.optionsNodes.get(nodeId);
349
+ if (node?.contextMenu) {
350
+ const parent = node.isRoot ? undefined : this.optionsNodes.get(node.parentId!)
351
+ const injector = Injector.create({
352
+ providers: [
353
+ { provide: AXIS_DESIGN_OPTIONS_NODE_FOR_MENU, useValue: { current: node, parent } },
354
+ { provide: AXIS_DESIGN_CHOOSE_COMPONENT_FUNC_TOKEN, useValue: this.chooseComponent.bind(this) },
355
+ ]
356
+ })
357
+ this.menu.clear();
358
+ const ref = this.menu.createComponent(node.contextMenu, { injector: injector });
359
+ ref.instance.contextMenu(e);
360
+ ref.instance.onChange = (value: any) => {
361
+ this.onChangeOptionsConfig(value);
362
+ }
363
+ }
364
+ }
365
+
366
+ chooseComponent(...tags: string[]): Observable<{ options?: any, config?: DesignConfig }> {
367
+ this.chooseComponentTags.set(tags);
368
+ this.chooseComponentVisible.set(true);
369
+ const existsIds = new Set<string>();
370
+ return this.chooseComponentSubject.asObservable()
371
+ .pipe(take(1), map((example) => example?.builder((component, offset) => this.genNewComponentId(component, offset, existsIds))),
372
+ switchMap(options => options ? from(this.loader.loadComponent(`${options.component}/design`)).pipe(map(config => ({ options, config }))) : of({})));
373
+ }
374
+
375
+ private genNewComponentId(component: string, offset = 1, existsIds?: Set<string>): string {
376
+ let id: string;
377
+ if (this.componentsCounter.has(component)) {
378
+ id = `${component}#${this.componentsCounter.get(component)! + offset}`
379
+ } else {
380
+ id = `${component}#${offset}`
381
+ }
382
+ if (existsIds?.has(id) || this.optionsNodes.has(id)) {
383
+ return this.genNewComponentId(component, offset + 1, existsIds);
384
+ }
385
+ existsIds?.add(id);
386
+ return id;
387
+ }
388
+
389
+ onCmplibDragStart(example: Example, element: HTMLElement) {
390
+ const options = example.builder((component, offset) => this.genNewComponentId(component, offset));
391
+ const optionsNode = new OptionsNode({
392
+ canDrag: true,
393
+ dragType: "component",
394
+ rootOptions: options
395
+ });
396
+ this.optionsNodes.set(optionsNode.id, optionsNode);
397
+ this.preview.dragForOuter(optionsNode.toElementNode({ element }));
398
+ }
399
+
400
+ async onCmplibDragEnd() {
401
+ const nodeId = this.preview.dragEndForOuter();
402
+ if (nodeId) {
403
+ await this.loadAndOptions()![0];
404
+ this.tree.selectByNodeIds([nodeId]);
405
+ this.preview.selectByNodeIds([nodeId]);
406
+ this.loadSetting(nodeId);
407
+ }
408
+ }
409
+
410
+ onExamplePaste(examples: Example[]) {
411
+ const nodes: OptionsNode[] = []
412
+ for (const example of examples) {
413
+ const options = example.builder((component, offset) => this.genNewComponentId(component, offset));
414
+ const optionsNode = new OptionsNode({
415
+ canDrag: true,
416
+ dragType: "component",
417
+ rootOptions: options
418
+ });
419
+ nodes.push(optionsNode);
420
+ this.optionsNodes.set(optionsNode.id, optionsNode);
421
+ }
422
+ this.tree.addNodeForSelected(nodes);
423
+ }
424
+
425
+ onNodesMove(nodeIds: string[]) {
426
+ if (this.tree.selectListSelection.selected.length == 1) {
427
+ this.tree.addNodeForSelected(nodeIds.map(id => this.optionsNodes.get(id)!), true);
428
+ }
429
+ }
430
+
431
+ onEditorChange(optionsStr: string) {
432
+ try {
433
+ const options = JSON.parse(optionsStr);
434
+ this.onSettingChange(options);
435
+ } catch (_) { }
436
+ }
437
+
438
+ syncToSetting() {
439
+ if (this.settingOptionsNodeId) {
440
+ const optionsNode = this.optionsNodes.get(this.settingOptionsNodeId);
441
+ if (optionsNode) {
442
+ const instance = (this.setting.get(0) as any)?.context as FunFieldValueBase | undefined;
443
+ instance?.writeValue(optionsNode.options);
444
+ }
445
+ }
446
+ }
447
+
448
+ syncToCode() {
449
+ if (this.settingOptionsNodeId) {
450
+ const optionsNode = this.optionsNodes.get(this.settingOptionsNodeId);
451
+ if (optionsNode) {
452
+ this.settingOptionsStr.set(JSON.stringify(optionsNode.options, null, " "));
453
+ }
454
+ }
455
+ setTimeout(() => {
456
+ this.layoutEditor();
457
+ });
458
+ }
459
+
460
+ layoutEditor(e?: number[]) {
461
+ if (e) {
462
+ if (e[0] > 0) {
463
+ this.cacheSized[0] = e[0];
464
+ }
465
+ if (e[2] > 0) {
466
+ this.cacheSized[1] = e[2];
467
+ }
468
+ }
469
+ this.codeEditor?.onEvents?.({
470
+ target: "component",
471
+ name: "layout",
472
+ })?.subscribe();
473
+ }
474
+
475
+ private resetSetting() {
476
+ this.settingOptionsNodeId = undefined;
477
+ this.setting.clear();
478
+ this.settingOptionsStr.set("");
479
+ }
480
+
481
+ private reset(): void {
482
+ this.optionsNodes.clear();
483
+ this.componentsInfo.clear();
484
+ this.optionsNodeScopes.clear();
485
+ this.scopeInfos.clear();
486
+ this.componentsCounter.clear();
487
+ }
488
+
489
+ private getAllParentNodes(node: OptionsNode | string | undefined, parentNodes: OptionsNode[] = []): OptionsNode[] {
490
+ if (typeof node == "string") {
491
+ node = this.optionsNodes.get(node);
492
+ }
493
+ if (node?.parentId) {
494
+ const parent = this.optionsNodes.get(node.parentId);
495
+ if (parent) {
496
+ parentNodes.push(parent);
497
+ this.getAllParentNodes(parent, parentNodes);
498
+ }
499
+ }
500
+ return parentNodes;
501
+ }
502
+
503
+ override ngOnDestroy(): void {
504
+ super.ngOnDestroy();
505
+ for (const s of this.scopInfoSubjects.values()) {
506
+ s.unsubscribe();
507
+ }
508
+ }
509
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "lib": {
3
+ "entryFile": "design.ts"
4
+ }
5
+ }
@@ -0,0 +1,148 @@
1
+ import { ElementNode, OptionsNode } from "ngx-axis-appforge/core";
2
+ import { DropHandler } from "./drop-handler";
3
+ import { Preview } from "./preview";
4
+
5
+ export class DragService {
6
+
7
+ constructor(private preview: Preview) { }
8
+
9
+ private canDropNodes: ElementNode[] = [];
10
+ private oriDragDisplay?: string;
11
+ private readonly currentDropNodes = new Map<ElementNode, any>();
12
+ private dragEn?: ElementNode;
13
+ private dropHandler?: DropHandler;
14
+
15
+ initElement(node: OptionsNode, en: ElementNode) {
16
+ if (!node.isRoot && node.canDrag) {
17
+ this.bindDragEvent(en);
18
+ }
19
+ if (node.canDrop) {
20
+ this.canDropNodes.push(en);
21
+ }
22
+ }
23
+
24
+ private getOptionsNode(node: ElementNode): OptionsNode {
25
+ return this.preview.optionsNodes().get(node.id)!;
26
+ }
27
+
28
+ private bindDragEvent(node: ElementNode) {
29
+ node.element!.setAttribute("draggable", "true");
30
+ node.element!.ondragstart = (e) => {
31
+ e.stopPropagation();
32
+ this.dragStart(node);
33
+ this.oriDragDisplay = node.element!.style.display;
34
+ setTimeout(() => {
35
+ node.element!.style.display = "none";
36
+ });
37
+ };
38
+ node.element!.ondragend = (e) => {
39
+ e.preventDefault();
40
+ e.stopPropagation();
41
+ this.dragEnd();
42
+ }
43
+ }
44
+
45
+ private bindDropEvent(en: ElementNode) {
46
+ this.currentDropNodes.set(en, null);
47
+ setTimeout(() => {
48
+ const { clientWidth, clientHeight } = en.dropElement!;
49
+ if (!clientWidth || !clientHeight) {
50
+ const { display, minWidth, minHeight } = en.dropElement!.style;
51
+ this.currentDropNodes.set(en,
52
+ { display, minWidth, minHeight }
53
+ );
54
+ if (!clientWidth) {
55
+ en.dropElement!.style.minWidth = "100px";
56
+ }
57
+ if (!clientHeight) {
58
+ en.dropElement!.style.minHeight = "50px";
59
+ }
60
+ en.dropElement!.style.display = "block";
61
+ }
62
+ });
63
+ en.dropElement!.ondragenter = (e) => {
64
+ e?.preventDefault();
65
+ e.stopPropagation();
66
+ if (this.dropHandler?.dropNode == en) {
67
+ return;
68
+ }
69
+ this.dropHandler?.close();
70
+ const node = this.getOptionsNode(en);
71
+ this.dropHandler = new DropHandler(this.dragEn!, en, this.preview.elementOptionIds, node.childDirection == "horizontal");
72
+ }
73
+ en.dropElement!.ondragover = (e) => {
74
+ e.preventDefault();
75
+ e.stopPropagation();
76
+ this.dropHandler?.onDragOver?.(e);
77
+ }
78
+ }
79
+
80
+ dragStart(dragEn: ElementNode) {
81
+ this.dragEn = dragEn;
82
+ this.canDropNodes = this.canDropNodes.filter(en => this.preview.optionsNodes().has(en.id));
83
+ this.canDropNodes
84
+ .filter(dropEn => {
85
+ const dropNode = this.getOptionsNode(dropEn);
86
+ const dragNode = this.getOptionsNode(dragEn);
87
+ return dropNode.dropType == dragNode.dragType && !dropNode.dropObj[dropNode.defaultDropIndex!] && dropEn.dropElement;
88
+ })
89
+ .forEach(node => this.bindDropEvent(node));
90
+ this.preview.onDragStart();
91
+ }
92
+
93
+ dragEnd(): string | undefined {
94
+ let dragId: string | undefined;
95
+ if (this.dropHandler) {
96
+ const dropEn = this.dropHandler.dropNode;
97
+ const dropNode = this.getOptionsNode(dropEn);
98
+ const dragNode = this.getOptionsNode(this.dragEn!);
99
+ let targetIndex = this.dropHandler.beforeElement ? this.preview.getNodeByElement(this.dropHandler.beforeElement)?.indexOfParentObj : dropNode?.defaultDropIndex;
100
+ if (dropNode!.dropObj == dragNode!.parentObj && dragNode!.indexOfParentObj == targetIndex) {
101
+ this.preview.onDragEnd(false);
102
+ } else {
103
+ dragId = dragNode?.id;
104
+ if (dropNode!.dropObj instanceof Array && dropNode!.dropObj == dragNode!.parentObj && dragNode!.indexOfParentObj! < targetIndex!) {
105
+ (targetIndex as number)!--;
106
+ }
107
+ const dragObj = dragNode!.options;
108
+ if (!dragNode!.isRoot) {
109
+ if (dragNode?.parentObj instanceof Array) {
110
+ dragNode!.parentObj.splice(dragNode!.indexOfParentObj as number, 1);
111
+ } else {
112
+ dragNode!.parentObj[dragNode!.indexOfParentObj!] = null;
113
+ }
114
+ }
115
+ if (dropNode?.dropObj instanceof Array) {
116
+ dropNode!.dropObj.splice(targetIndex as number, 0, dragObj);
117
+ } else {
118
+ dropNode!.dropObj[targetIndex!] = dragObj;
119
+ }
120
+ this.preview.onDragEnd(true);
121
+ }
122
+ this.dropHandler.onDragEnd();
123
+ this.dropHandler = undefined;
124
+ } else {
125
+ this.preview.onDragEnd(false);
126
+ }
127
+ this.dragEn!.element!.style.display = this.oriDragDisplay!;
128
+ this.dragEn = undefined;
129
+ this.oriDragDisplay = undefined;
130
+ this.currentDropNodes.forEach((style, en) => {
131
+ if (style) {
132
+ en.dropElement!.style.minWidth = style.minWidth;
133
+ en.dropElement!.style.minHeight = style.minHeight;
134
+ en.dropElement!.style.display = style.display;
135
+ }
136
+ en.dropElement!.ondragenter = null;
137
+ en.dropElement!.ondragover = null;
138
+ });
139
+ this.currentDropNodes.clear();
140
+ return dragId;
141
+ }
142
+
143
+ reset() {
144
+ this.dropHandler?.close();
145
+ this.dragEn = undefined;
146
+ this.dropHandler = undefined;
147
+ }
148
+ }