@silexlabs/silex 3.0.1-alpha.0 → 3.0.1

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 (323) hide show
  1. package/.env.default +20 -0
  2. package/.silex.js +67 -8
  3. package/LICENSE +661 -203
  4. package/README.md +37 -35
  5. package/dist/client/client/api.d.ts +90 -0
  6. package/dist/client/client/assetUrl.d.ts +54 -0
  7. package/dist/client/client/config.d.ts +102 -0
  8. package/dist/client/client/events.d.ts +23 -0
  9. package/dist/client/client/expose.d.ts +8 -0
  10. package/dist/client/client/grapesjs/LoginDialog.d.ts +15 -0
  11. package/dist/client/client/grapesjs/PublicationManager.d.ts +73 -0
  12. package/dist/client/client/grapesjs/PublicationUi.d.ts +59 -0
  13. package/dist/client/client/grapesjs/blocks.d.ts +1 -0
  14. package/dist/client/client/grapesjs/breadcrumbs.d.ts +1 -0
  15. package/dist/client/client/grapesjs/css-props.d.ts +6 -0
  16. package/dist/client/client/grapesjs/footer.d.ts +2 -0
  17. package/dist/client/client/grapesjs/img.d.ts +6 -0
  18. package/dist/client/client/grapesjs/index.d.ts +9 -0
  19. package/dist/client/client/grapesjs/internal-links.d.ts +1 -0
  20. package/dist/client/client/grapesjs/keymaps.d.ts +123 -0
  21. package/dist/client/client/grapesjs/new-page-dialog.d.ts +2 -0
  22. package/dist/client/client/grapesjs/openImport.d.ts +9 -0
  23. package/dist/client/client/grapesjs/page-panel.d.ts +9 -0
  24. package/dist/client/client/grapesjs/project-bar.d.ts +21 -0
  25. package/dist/client/client/grapesjs/resize-panel.d.ts +1 -0
  26. package/dist/client/client/grapesjs/rich-text.d.ts +4 -0
  27. package/dist/client/client/grapesjs/semantic.d.ts +1 -0
  28. package/dist/client/client/grapesjs/settings-sections.d.ts +16 -0
  29. package/dist/client/client/grapesjs/settings.d.ts +4 -0
  30. package/dist/client/client/grapesjs/storage.d.ts +2 -0
  31. package/dist/client/client/grapesjs/symbolDialogs.d.ts +3 -0
  32. package/dist/client/client/grapesjs/view-buttons.d.ts +1 -0
  33. package/dist/client/client/index.d.ts +10 -0
  34. package/dist/client/client/publication-transformers.d.ts +42 -0
  35. package/dist/client/client/publish-custom-code-block.d.ts +4 -0
  36. package/dist/client/client/publish-fonts.d.ts +4 -0
  37. package/dist/client/client/utils.d.ts +22 -0
  38. package/dist/client/constants.d.ts +32 -0
  39. package/dist/client/css/admin.css +1114 -328
  40. package/dist/client/css/admin.css.map +1 -0
  41. package/dist/client/grapesjs-filter-styles/dist/index.d.ts +4 -0
  42. package/dist/client/grapesjs-fonts/dist/index.d.ts +4 -0
  43. package/dist/client/grapesjs-fonts/src/commands.d.ts +3 -0
  44. package/dist/client/grapesjs-fonts/src/fonts.d.ts +4 -0
  45. package/dist/client/grapesjs-storage-rate-limit/dist/index.d.ts +4 -0
  46. package/dist/client/grapesjs-ui-suggest-classes/dist/index.d.ts +4 -0
  47. package/dist/client/index.html +3 -2
  48. package/dist/client/js/main.js +356 -131
  49. package/dist/client/js/main.js.LICENSE.txt +15 -1
  50. package/dist/client/page.d.ts +2 -0
  51. package/dist/client/silex-lib/src/ts/client/api.d.ts +90 -0
  52. package/dist/client/silex-lib/src/ts/client/assetUrl.d.ts +54 -0
  53. package/dist/client/silex-lib/src/ts/client/config.d.ts +102 -0
  54. package/dist/client/silex-lib/src/ts/client/events.d.ts +23 -0
  55. package/dist/client/silex-lib/src/ts/client/expose.d.ts +8 -0
  56. package/dist/client/silex-lib/src/ts/client/grapesjs/LoginDialog.d.ts +15 -0
  57. package/dist/client/silex-lib/src/ts/client/grapesjs/PublicationManager.d.ts +73 -0
  58. package/dist/client/silex-lib/src/ts/client/grapesjs/PublicationUi.d.ts +59 -0
  59. package/dist/client/silex-lib/src/ts/client/grapesjs/blocks.d.ts +1 -0
  60. package/dist/client/silex-lib/src/ts/client/grapesjs/breadcrumbs.d.ts +1 -0
  61. package/dist/client/silex-lib/src/ts/client/grapesjs/css-props.d.ts +6 -0
  62. package/dist/client/silex-lib/src/ts/client/grapesjs/footer.d.ts +2 -0
  63. package/dist/client/silex-lib/src/ts/client/grapesjs/img.d.ts +6 -0
  64. package/dist/client/silex-lib/src/ts/client/grapesjs/index.d.ts +9 -0
  65. package/dist/client/silex-lib/src/ts/client/grapesjs/internal-links.d.ts +1 -0
  66. package/dist/client/silex-lib/src/ts/client/grapesjs/keymaps.d.ts +123 -0
  67. package/dist/client/silex-lib/src/ts/client/grapesjs/new-page-dialog.d.ts +2 -0
  68. package/dist/client/silex-lib/src/ts/client/grapesjs/openImport.d.ts +9 -0
  69. package/dist/client/silex-lib/src/ts/client/grapesjs/page-panel.d.ts +9 -0
  70. package/dist/client/silex-lib/src/ts/client/grapesjs/project-bar.d.ts +21 -0
  71. package/dist/client/silex-lib/src/ts/client/grapesjs/resize-panel.d.ts +1 -0
  72. package/dist/client/silex-lib/src/ts/client/grapesjs/rich-text.d.ts +4 -0
  73. package/dist/client/silex-lib/src/ts/client/grapesjs/semantic.d.ts +1 -0
  74. package/dist/client/silex-lib/src/ts/client/grapesjs/settings-sections.d.ts +16 -0
  75. package/dist/client/silex-lib/src/ts/client/grapesjs/settings.d.ts +4 -0
  76. package/dist/client/silex-lib/src/ts/client/grapesjs/storage.d.ts +2 -0
  77. package/dist/client/silex-lib/src/ts/client/grapesjs/symbolDialogs.d.ts +3 -0
  78. package/dist/client/silex-lib/src/ts/client/grapesjs/view-buttons.d.ts +1 -0
  79. package/dist/client/silex-lib/src/ts/client/index.d.ts +10 -0
  80. package/dist/client/silex-lib/src/ts/client/publication-transformers.d.ts +42 -0
  81. package/dist/client/silex-lib/src/ts/client/publish-custom-code-block.d.ts +4 -0
  82. package/dist/client/silex-lib/src/ts/client/publish-fonts.d.ts +4 -0
  83. package/dist/client/silex-lib/src/ts/client/utils.d.ts +22 -0
  84. package/dist/client/silex-lib/src/ts/constants.d.ts +32 -0
  85. package/dist/client/silex-lib/src/ts/page.d.ts +2 -0
  86. package/dist/client/silex-lib/src/ts/types.d.ts +339 -0
  87. package/dist/client/types.d.ts +339 -0
  88. package/dist/plugins/client/client/events.d.ts +23 -0
  89. package/dist/plugins/client/client/events.js +43 -0
  90. package/dist/plugins/client/client/events.js.map +1 -0
  91. package/dist/plugins/client/plugins/client/template.d.ts +2 -0
  92. package/dist/plugins/client/plugins/client/template.js +234 -0
  93. package/dist/plugins/client/plugins/client/template.js.map +1 -0
  94. package/dist/plugins/client/plugins/client/website-info.d.ts +1 -0
  95. package/dist/plugins/client/plugins/client/website-info.js +72 -0
  96. package/dist/plugins/client/plugins/client/website-info.js.map +1 -0
  97. package/dist/plugins/client/types.d.ts +339 -0
  98. package/dist/plugins/client/types.js +80 -0
  99. package/dist/plugins/client/types.js.map +1 -0
  100. package/dist/plugins/server/constants.d.ts +32 -0
  101. package/dist/plugins/server/constants.js +76 -0
  102. package/dist/plugins/server/constants.js.map +1 -0
  103. package/dist/plugins/server/plugins/server/Cache.d.ts +2 -0
  104. package/dist/plugins/server/plugins/server/Cache.js +36 -0
  105. package/dist/plugins/server/plugins/server/Cache.js.map +1 -0
  106. package/dist/plugins/server/plugins/server/DownloadConnector.d.ts +29 -0
  107. package/dist/plugins/server/plugins/server/DownloadConnector.js +127 -0
  108. package/dist/plugins/server/plugins/server/DownloadConnector.js.map +1 -0
  109. package/dist/plugins/server/plugins/server/FtpConnector.d.ts +86 -0
  110. package/dist/plugins/server/plugins/server/FtpConnector.js +536 -0
  111. package/dist/plugins/server/plugins/server/FtpConnector.js.map +1 -0
  112. package/dist/plugins/server/plugins/server/GitlabConnector.d.ts +135 -0
  113. package/dist/plugins/server/plugins/server/GitlabConnector.js +649 -0
  114. package/dist/plugins/server/plugins/server/GitlabConnector.js.map +1 -0
  115. package/dist/plugins/server/plugins/server/GitlabHostingConnector.d.ts +16 -0
  116. package/dist/plugins/server/plugins/server/GitlabHostingConnector.js +209 -0
  117. package/dist/plugins/server/plugins/server/GitlabHostingConnector.js.map +1 -0
  118. package/dist/plugins/server/plugins/server/PublicationOptimizer.d.ts +0 -0
  119. package/dist/plugins/server/plugins/server/PublicationOptimizer.js +14 -0
  120. package/dist/plugins/server/plugins/server/PublicationOptimizer.js.map +1 -0
  121. package/dist/plugins/server/plugins/server/SslPlugin.d.ts +1 -0
  122. package/dist/plugins/server/plugins/server/SslPlugin.js +86 -0
  123. package/dist/plugins/server/plugins/server/SslPlugin.js.map +1 -0
  124. package/dist/plugins/server/plugins/server/StaticPlugin.d.ts +8 -0
  125. package/dist/plugins/server/plugins/server/StaticPlugin.js +45 -0
  126. package/dist/plugins/server/plugins/server/StaticPlugin.js.map +1 -0
  127. package/dist/plugins/server/server/config.d.ts +59 -0
  128. package/dist/plugins/server/server/config.js +181 -0
  129. package/dist/plugins/server/server/config.js.map +1 -0
  130. package/dist/plugins/server/server/connectors/FsHosting.d.ts +14 -0
  131. package/dist/plugins/server/server/connectors/FsHosting.js +66 -0
  132. package/dist/plugins/server/server/connectors/FsHosting.js.map +1 -0
  133. package/dist/plugins/server/server/connectors/FsStorage.d.ts +44 -0
  134. package/dist/plugins/server/server/connectors/FsStorage.js +261 -0
  135. package/dist/plugins/server/server/connectors/FsStorage.js.map +1 -0
  136. package/dist/plugins/server/server/connectors/connectors.d.ts +86 -0
  137. package/dist/plugins/server/server/connectors/connectors.js +126 -0
  138. package/dist/plugins/server/server/connectors/connectors.js.map +1 -0
  139. package/dist/plugins/server/server/events.d.ts +26 -0
  140. package/dist/plugins/server/server/events.js +31 -0
  141. package/dist/plugins/server/server/events.js.map +1 -0
  142. package/dist/plugins/server/server/jobs.d.ts +12 -0
  143. package/dist/plugins/server/server/jobs.js +79 -0
  144. package/dist/plugins/server/server/jobs.js.map +1 -0
  145. package/dist/plugins/server/server/utils/validation.d.ts +7 -0
  146. package/dist/plugins/server/server/utils/validation.js +37 -0
  147. package/dist/plugins/server/server/utils/validation.js.map +1 -0
  148. package/dist/plugins/server/types.d.ts +339 -0
  149. package/dist/plugins/server/types.js +84 -0
  150. package/dist/plugins/server/types.js.map +1 -0
  151. package/dist/server/constants.js +55 -0
  152. package/dist/server/plugins/server/Cache.js +19 -0
  153. package/dist/server/server/api/api.js +20 -0
  154. package/dist/server/server/api/connectorApi.js +334 -0
  155. package/dist/server/server/api/publicationApi.js +106 -0
  156. package/dist/server/server/api/websiteApi.js +315 -0
  157. package/dist/server/server/cli.js +71 -0
  158. package/dist/server/server/config.js +120 -0
  159. package/dist/server/server/connectors/FsHosting.js +47 -0
  160. package/dist/server/server/connectors/FsStorage.js +228 -0
  161. package/dist/server/server/connectors/connectors.js +88 -0
  162. package/dist/server/server/events.js +14 -0
  163. package/dist/server/server/expose.js +27 -0
  164. package/dist/server/server/express.js +46 -0
  165. package/dist/server/server/index.js +94 -0
  166. package/dist/server/server/jobs.js +50 -0
  167. package/dist/server/server/utils/validation.js +14 -0
  168. package/dist/server/types.js +40 -0
  169. package/package.json +99 -49
  170. package/public/assets/download.png +0 -0
  171. package/public/assets/favicon.ico +0 -0
  172. package/public/assets/favicon.png +0 -0
  173. package/public/assets/ftp.png +0 -0
  174. package/public/assets/gitlab.png +0 -0
  175. package/public/assets/gitlab2.png +0 -0
  176. package/public/assets/laptop.png +0 -0
  177. package/public/assets/logo-silex-small.png +0 -0
  178. package/public/silex.js +22 -23
  179. package/src/css/_variables.scss +24 -20
  180. package/src/css/dialog.scss +35 -2
  181. package/src/css/fonts.scss +31 -0
  182. package/src/css/footer.scss +12 -0
  183. package/src/css/grapesjs-light.scss +180 -0
  184. package/src/css/grapesjs-plugins.scss +227 -0
  185. package/src/css/grapesjs.scss +159 -1
  186. package/src/css/index.scss +12 -1
  187. package/src/css/light.scss +7 -0
  188. package/src/css/loader.scss +2 -0
  189. package/src/css/project-bar.scss +32 -16
  190. package/src/css/silex.scss +79 -5
  191. package/src/css/website-info.scss +14 -0
  192. package/src/html/index.pug +3 -3
  193. package/src/html/templates/includes.pug +0 -1
  194. package/src/ts/client/api.ts +156 -0
  195. package/src/ts/client/assetUrl.test.ts +164 -0
  196. package/src/ts/client/assetUrl.ts +254 -0
  197. package/src/ts/client/config.ts +175 -13
  198. package/src/ts/client/events.ts +43 -0
  199. package/src/ts/client/expose.ts +27 -1
  200. package/src/ts/client/grapesjs/LoginDialog.ts +204 -0
  201. package/src/ts/client/grapesjs/PublicationManager.ts +433 -0
  202. package/src/ts/client/grapesjs/PublicationUi.ts +366 -0
  203. package/src/ts/client/grapesjs/blocks.ts +17 -0
  204. package/src/ts/client/grapesjs/breadcrumbs.ts +79 -0
  205. package/src/ts/client/grapesjs/css-props.ts +910 -0
  206. package/src/ts/client/grapesjs/eleventy.ts +30 -7
  207. package/src/ts/client/grapesjs/footer.ts +42 -0
  208. package/src/ts/client/grapesjs/img.ts +147 -0
  209. package/src/ts/client/grapesjs/index.ts +311 -122
  210. package/src/ts/client/grapesjs/internal-links.test.ts +19 -1
  211. package/src/ts/client/grapesjs/internal-links.ts +31 -7
  212. package/src/ts/client/grapesjs/keymaps.ts +207 -0
  213. package/src/ts/client/grapesjs/new-page-dialog.ts +19 -3
  214. package/src/ts/client/grapesjs/openImport.ts +22 -0
  215. package/src/ts/client/grapesjs/page-panel.ts +109 -7
  216. package/src/ts/client/grapesjs/project-bar.ts +133 -72
  217. package/src/ts/client/grapesjs/resize-panel.ts +20 -0
  218. package/src/ts/client/grapesjs/rich-text.ts +38 -13
  219. package/src/ts/client/grapesjs/semantic.ts +20 -3
  220. package/src/ts/client/grapesjs/settings-sections.ts +117 -0
  221. package/src/ts/client/grapesjs/settings.ts +191 -96
  222. package/src/ts/client/grapesjs/storage.ts +187 -0
  223. package/src/ts/client/grapesjs/symbolDialogs.ts +21 -5
  224. package/src/ts/client/grapesjs/view-buttons.ts +42 -0
  225. package/src/ts/client/index.ts +80 -21
  226. package/src/ts/client/publication-transformers.test.ts +207 -0
  227. package/src/ts/client/publication-transformers.ts +280 -0
  228. package/src/ts/client/publish-custom-code-block.ts +31 -0
  229. package/src/ts/client/publish-fonts.ts +36 -0
  230. package/src/ts/client/utils.ts +70 -1
  231. package/src/ts/constants.ts +78 -0
  232. package/src/ts/externs.ts +17 -0
  233. package/src/ts/page.ts +20 -3
  234. package/src/ts/plugins/client/template.ts +246 -0
  235. package/src/ts/plugins/client/website-info.ts +84 -0
  236. package/src/ts/plugins/server/Cache.ts +32 -0
  237. package/src/ts/plugins/server/DownloadConnector.ts +146 -0
  238. package/src/ts/plugins/server/FtpConnector.test.ts +82 -0
  239. package/src/ts/plugins/server/FtpConnector.ts +621 -0
  240. package/src/ts/plugins/server/GitlabConnector.ts +749 -0
  241. package/src/ts/plugins/server/GitlabHostingConnector.ts +215 -0
  242. package/src/ts/plugins/server/PublicationOptimizer.ts +14 -0
  243. package/src/ts/plugins/server/SslPlugin.ts +84 -0
  244. package/src/ts/plugins/server/StaticPlugin.ts +45 -0
  245. package/src/ts/server/api/api.ts +19 -0
  246. package/src/ts/server/api/connectorApi.ts +464 -0
  247. package/src/ts/server/api/publicationApi.ts +159 -0
  248. package/src/ts/server/api/websiteApi.ts +462 -0
  249. package/src/ts/server/cli.ts +48 -14
  250. package/src/ts/server/config.ts +158 -60
  251. package/src/ts/server/connectors/FsHosting.ts +66 -0
  252. package/src/ts/server/connectors/FsStorage.test.ts +51 -0
  253. package/src/ts/server/connectors/FsStorage.ts +290 -0
  254. package/src/ts/server/connectors/connectors.ts +203 -0
  255. package/src/ts/server/events.ts +37 -0
  256. package/src/ts/server/expose.ts +19 -0
  257. package/src/ts/server/express.ts +57 -5
  258. package/src/ts/server/index.ts +79 -16
  259. package/src/ts/server/jobs.test.ts +75 -0
  260. package/src/ts/server/jobs.ts +89 -0
  261. package/src/ts/server/utils/BackwardCompat.ts +546 -528
  262. package/src/ts/server/utils/validation.ts +34 -0
  263. package/src/ts/types.ts +295 -85
  264. package/.dockerignore +0 -5
  265. package/.editorconfig +0 -14
  266. package/.eslintrc.json +0 -43
  267. package/.github/FUNDING.yml +0 -13
  268. package/.github/workflows/docker-hub-publish.yml +0 -36
  269. package/.github/workflows/npm-publish.yml +0 -19
  270. package/.github/workflows/test.yml +0 -26
  271. package/.nvmrc +0 -1
  272. package/.silex/default/.silex.data.json +0 -1
  273. package/CODE_OF_CONDUCT.md +0 -128
  274. package/CONTRIBUTING.md +0 -131
  275. package/Dockerfile +0 -15
  276. package/directus.silex.js +0 -7
  277. package/dist/constants.js +0 -4
  278. package/dist/events.js +0 -5
  279. package/dist/page.js +0 -15
  280. package/dist/server/cli.js +0 -43
  281. package/dist/server/config.js +0 -70
  282. package/dist/server/express.js +0 -18
  283. package/dist/server/index.js +0 -58
  284. package/dist/types.js +0 -34
  285. package/jest.config.js +0 -10
  286. package/logos/logo_by_ceubri/silex-icon-2018@200px.png +0 -0
  287. package/logos/logo_by_ceubri/silex-icon-2018@4x.png +0 -0
  288. package/logos/logo_by_ceubri/silex-logo-2018-white-transp.pdf +0 -0
  289. package/logos/logo_by_ceubri/silex-logo-2018-white.jpg +0 -0
  290. package/logos/logo_by_ceubri/silex-logo-2018-white.pdf +0 -0
  291. package/logos/logo_by_ceubri/silex-logo-2018-white.png +0 -0
  292. package/logos/logo_by_ceubri/silex-logo-2018-white@0.5x.png +0 -0
  293. package/logos/logo_by_ceubri/silex-logo-2018-white@0.75x.png +0 -0
  294. package/logos/logo_by_ceubri/silex-logo-2018-white@4x.jpg +0 -0
  295. package/logos/logo_by_ceubri/silex-logo-2018-white@4x.png +0 -0
  296. package/logos/logo_by_ceubri/silex-logo-2018.ai +5 -2521
  297. package/logos/logo_by_ceubri/silex-logo-2018.jpg +0 -0
  298. package/logos/logo_by_ceubri/silex-logo-2018.pdf +0 -0
  299. package/logos/logo_by_ceubri/silex-logo-2018.png +0 -0
  300. package/logos/logo_by_ceubri/silex-logo-2018@0.5x.png +0 -0
  301. package/logos/logo_by_ceubri/silex-logo-2018@0.75x.png +0 -0
  302. package/logos/logo_by_ceubri/silex-logo-2018@4x.jpg +0 -0
  303. package/logos/logo_by_ceubri/silex-logo-2018@4x.png +0 -0
  304. package/logos/silexlabs.png +0 -0
  305. package/src/example-client-config.js +0 -47
  306. package/src/plugins/AuthPlugin.js +0 -21
  307. package/src/plugins/Cache.js +0 -11
  308. package/src/plugins/DefaultBackend.js +0 -149
  309. package/src/plugins/ExpressPlugin.js +0 -39
  310. package/src/plugins/HooksPlugin.js +0 -58
  311. package/src/plugins/PublishPlugin.js +0 -69
  312. package/src/plugins/SslPlugin.js +0 -66
  313. package/src/plugins/StaticPlugin.js +0 -48
  314. package/src/plugins/WebsitePlugin.js +0 -207
  315. package/src/ts/client/grapesjs/publish.ts +0 -386
  316. package/src/ts/client/grapesjs/template.ts +0 -166
  317. package/src/ts/events.ts +0 -2
  318. package/tsconfig-server-debug.json +0 -19
  319. package/tsconfig-server-release.json +0 -19
  320. package/tsconfig.jest.json +0 -9
  321. package/tsconfig.json +0 -26
  322. package/webpack.config.js +0 -28
  323. package/webpack.debug.config.js +0 -8
@@ -1,8 +1,23 @@
1
+ /*
2
+ * Silex website builder, free/libre no-code tool for makers.
3
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
+ */
17
+
1
18
  import {html, render} from 'lit-html'
2
19
  import {map} from 'lit-html/directives/map.js'
3
20
  import grapesjs from 'grapesjs/dist/grapes.min.js'
4
-
5
- import { Page } from '../../types'
6
21
  import { getPageLink } from '../../page'
7
22
 
8
23
  // constants
@@ -15,7 +30,7 @@ const options: grapesjs.SelectOption = [
15
30
  ]
16
31
 
17
32
  // plugin code
18
- export const internalLinksPlugin = grapesjs.plugins.add(pluginName, (editor, opts) => {
33
+ export const internalLinksPlugin = (editor, opts) => {
19
34
  // update links when a page link changes
20
35
  function onAll(cbk) {
21
36
  editor.Pages.getAll()
@@ -41,12 +56,21 @@ export const internalLinksPlugin = grapesjs.plugins.add(pluginName, (editor, opt
41
56
  // mark all links as issues
42
57
  const issues = []
43
58
  onAll(component => {
44
- console.log(component.getAttributes().href, getPageLink(page.previous('name')), page.previous('name'))
45
59
  if(component.getAttributes().href === getPageLink(page.previous('name'))) {
46
60
  issues.push(component)
47
61
  }
48
62
  })
49
- opts?.onError(issues)
63
+ // Add a notification for the issues
64
+ if(issues.length) {
65
+ issues.forEach(component => {
66
+ editor.runCommand('notifications:add', {
67
+ type: 'error',
68
+ message: `Page ${page.previous('name')} was removed, please fix the following links:`,
69
+ componentId: component.getId(),
70
+ group: 'Broken internal links',
71
+ })
72
+ })
73
+ }
50
74
  break
51
75
  }
52
76
  })
@@ -92,7 +116,7 @@ export const internalLinksPlugin = grapesjs.plugins.add(pluginName, (editor, opt
92
116
  function getDefaultHref(type) {
93
117
  switch(type) {
94
118
  case 'email': return 'mailto:'
95
- case 'page': return getPageLink()
119
+ case 'page': return getPageLink(null)
96
120
  case 'url': return 'https://'
97
121
  }
98
122
  }
@@ -207,4 +231,4 @@ export const internalLinksPlugin = grapesjs.plugins.add(pluginName, (editor, opt
207
231
  doRender(elInput, href)
208
232
  },
209
233
  })
210
- })
234
+ }
@@ -0,0 +1,207 @@
1
+ import {Editor, PluginOptions} from 'grapesjs'
2
+ import {isTextOrInputField, selectBody} from '../utils'
3
+ import {PublishableEditor} from './PublicationManager'
4
+
5
+ // Utility functions
6
+
7
+ function setButton(editor: Editor, panel_id: string, btn_id: string, active?: boolean): void {
8
+ const button = editor.Panels.getButton(panel_id, btn_id)
9
+ button.set('active', active ?? !button.get('active'))
10
+ }
11
+
12
+ /**
13
+ * Opens the Publish dialog and publishes the website.
14
+ * @param editor The editor.
15
+ */
16
+ function publish(editor: Editor): void {
17
+ setButton(editor, 'options', 'publish-button', true)
18
+ editor.runCommand('publish')
19
+ }
20
+
21
+ /**
22
+ * Closes any open left panel.
23
+ * @param editor The editor.
24
+ */
25
+ function resetPanel(editor: Editor): void {
26
+ const projectBarBtns = editor.Panels.getPanels().get('project-bar-panel').buttons
27
+ projectBarBtns.forEach(button => button.set('active', false))
28
+ }
29
+
30
+ /**
31
+ * Escapes the current context in this order : modal, Publish dialog, left panel.
32
+ * If none of these are open, it selects the body.
33
+ * @param editor The editor.
34
+ */
35
+ function escapeContext(editor: Editor): void {
36
+ const publishDialog = (editor as PublishableEditor).PublicationManager.dialog
37
+ const projectBarPanel = editor.Panels.getPanel('project-bar-panel')
38
+
39
+ if (editor.Modal.isOpen()) {
40
+ editor.Modal.close()
41
+ } else if (publishDialog && publishDialog.isOpen) {
42
+ publishDialog.closeDialog()
43
+ } else if (projectBarPanel.buttons.some(b => b.get('active'))) {
44
+ resetPanel(editor)
45
+ } else {
46
+ selectBody(editor)
47
+ }
48
+ }
49
+
50
+ function whenNoFocus(editor: Editor, cbk: () => void): void {
51
+ if(editor.getEditing()) return
52
+ if(editor.Modal.isOpen()) return
53
+ const target = document.activeElement as HTMLElement | null
54
+ if (target && target.tagName === 'INPUT' && target.getAttribute('type') === 'submit') return
55
+ if (target && isTextOrInputField(target)) return
56
+ cbk()
57
+ }
58
+
59
+ // Constants
60
+
61
+ export const cmdSelectBody = 'select-body'
62
+ export let prefixKey = 'shift'
63
+
64
+ export const defaultKms = {
65
+ kmOpenSettings: {
66
+ id: 'general:open-settings',
67
+ keys: 'alt+s',
68
+ handler: editor => setButton(editor, 'project-bar-panel', 'settings-dialog-btn')
69
+ },
70
+ kmOpenPublish: {
71
+ id: 'general:open-publish',
72
+ keys: 'alt+p',
73
+ handler: editor => setButton(editor, 'options', 'publish-button')
74
+ },
75
+ kmOpenFonts: {
76
+ id: 'general:open-fonts',
77
+ keys: 'alt+f',
78
+ handler: editor => setButton(editor, 'project-bar-panel', 'font-dialog-btn')
79
+ },
80
+ kmPreviewMode: {
81
+ id: 'general:preview-mode',
82
+ keys: 'tab',
83
+ handler: editor => whenNoFocus(editor, () => setButton(editor, 'options', 'preview'))
84
+ },
85
+ kmLayers: {
86
+ id: 'panels:layers',
87
+ keys: prefixKey + '+l',
88
+ handler: editor => setButton(editor, 'project-bar-panel', 'layer-manager-btn')
89
+ },
90
+ kmBlocks: {
91
+ id: 'panels:blocks',
92
+ keys: prefixKey + '+a',
93
+ handler: editor => setButton(editor, 'project-bar-panel', 'block-manager-btn')
94
+ },
95
+ kmNotifications: {
96
+ id: 'panels:notifications',
97
+ keys: prefixKey + '+n',
98
+ handler: editor => setButton(editor, 'project-bar-panel', 'notifications-btn')
99
+ },
100
+ kmPages: {
101
+ id: 'panels:pages',
102
+ keys: prefixKey + '+p',
103
+ handler: editor => setButton(editor, 'project-bar-panel', 'page-panel-btn')
104
+ },
105
+ kmSymbols: {
106
+ id: 'panels:symbols',
107
+ keys: prefixKey + '+s',
108
+ handler: editor => setButton(editor, 'project-bar-panel', 'symbols-btn')
109
+ },
110
+ kmStyleManager: {
111
+ id: 'panels:style-manager',
112
+ keys: 'r',
113
+ handler: editor => setButton(editor, 'views', 'open-sm', true)
114
+ },
115
+ kmTraitsManager: {
116
+ id: 'panels:traits',
117
+ keys: 't',
118
+ handler: editor => setButton(editor, 'views', 'open-tm', true)
119
+ },
120
+ kmClosePanel: {
121
+ id: 'panels:close-panel',
122
+ keys: 'escape',
123
+ handler: escapeContext
124
+ },
125
+ kmSelectBody: {
126
+ id: 'workflow:select-body',
127
+ keys: prefixKey + '+b',
128
+ handler: cmdSelectBody
129
+ },
130
+ kmDuplicateSelection: {
131
+ id: 'workflow:duplicate-selection',
132
+ keys: 'ctrl+d',
133
+ handler: 'tlb-clone',
134
+ },
135
+ kmPublish: {
136
+ id: 'workflow:publish',
137
+ keys: 'ctrl+alt+p',
138
+ handler: publish
139
+ },
140
+ kmAddPage: {
141
+ id: 'pages:add-page',
142
+ keys: 'ctrl+alt+n',
143
+ handler: 'pages:add'
144
+ },
145
+ kmRemovePage: {
146
+ id: 'pages:remove-page',
147
+ keys: 'ctrl+alt+backspace',
148
+ handler: 'pages:remove'
149
+ },
150
+ kmClonePage: {
151
+ id: 'pages:clone-page',
152
+ keys: 'ctrl+alt+d',
153
+ handler: 'pages:clone'
154
+ },
155
+ kmSelectNextPage: {
156
+ id: 'pages:select-next',
157
+ keys: 'ctrl+alt+j',
158
+ handler: 'pages:select-next'
159
+ },
160
+ kmSelectPrevPage: {
161
+ id: 'pages:select-previous',
162
+ keys: 'ctrl+alt+k',
163
+ handler: 'pages:select-prev'
164
+ },
165
+ kmSelectFirstPage: {
166
+ id: 'pages:select-first',
167
+ keys: 'ctrl+alt+h',
168
+ handler: 'pages:select-first'
169
+ }
170
+ }
171
+
172
+ // Main part
173
+
174
+ export function keymapsPlugin(editor: Editor, opts: PluginOptions): void {
175
+ // Commands
176
+ editor.Commands.add(cmdSelectBody, selectBody)
177
+
178
+ if (opts.disableKeymaps) return
179
+ if (opts.prefixKey) prefixKey = opts.prefixKey
180
+
181
+ const km = editor.Keymaps
182
+
183
+ // Default keymaps
184
+ for (const keymap in defaultKms) {
185
+ km.add(defaultKms[keymap].id, defaultKms[keymap].keys, defaultKms[keymap].handler, {
186
+ prevent: true,
187
+ ...defaultKms[keymap].options
188
+ })
189
+ }
190
+
191
+ // Handling the Escape keymap during text edition
192
+ document.addEventListener('keydown', event => {
193
+ if (event.key.toLowerCase() === defaultKms.kmClosePanel.keys) {
194
+ const target = event.target as HTMLElement | null
195
+ if(editor.getEditing()) return // Close the rich text edition
196
+ if(editor.Modal.isOpen()) {
197
+ editor.Modal.close()
198
+ } else if (target) { // If target exists...
199
+ if (target.tagName === 'INPUT' && target.getAttribute('type') === 'submit') { // If it's a submit button...
200
+ escapeContext(editor)
201
+ } else if (isTextOrInputField(target)) { // If it's a text field...
202
+ target.blur()
203
+ }
204
+ }
205
+ }
206
+ })
207
+ }
@@ -1,4 +1,20 @@
1
- import * as grapesjs from 'grapesjs/dist/grapes.min.js'
1
+ /*
2
+ * Silex website builder, free/libre no-code tool for makers.
3
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
+ */
17
+
2
18
  import {html, render} from 'lit-html'
3
19
  import {live} from 'lit-html/directives/live.js'
4
20
 
@@ -9,7 +25,7 @@ let modal
9
25
 
10
26
  export const cmdOpenNewPageDialog = 'new-page-dialog'
11
27
 
12
- export const newPageDialog = grapesjs.plugins.add(name, (editor, opts) => {
28
+ export const newPageDialog = (editor, opts) => {
13
29
  editor.Commands.add(cmdOpenNewPageDialog, {
14
30
  run: (_, sender, {page}) => {
15
31
  modal = editor.Modal.open({
@@ -36,7 +52,7 @@ export const newPageDialog = grapesjs.plugins.add(name, (editor, opts) => {
36
52
  // el.innerHTML = ''
37
53
  },
38
54
  })
39
- })
55
+ }
40
56
 
41
57
  function onImport(editor, page) {
42
58
  editor.Pages.select(page)
@@ -1,3 +1,25 @@
1
+ /*
2
+ * Silex website builder, free/libre no-code tool for makers.
3
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ /**
19
+ * @fileoverview Import feature
20
+ * Let the user import HTML code when she creates a new page
21
+ *
22
+ */
1
23
  // from https://github.com/artf/grapesjs-preset-webpage/blob/3e5a9e12998c9a32b6f1199953084163678e6c17/src/commands/openImport.js
2
24
  export default function openImport(editor, config) {
3
25
  const pfx = editor.getConfig('stylePrefix')
@@ -1,27 +1,75 @@
1
- import * as grapesjs from 'grapesjs/dist/grapes.min.js'
1
+ /*
2
+ * Silex website builder, free/libre no-code tool for makers.
3
+ * Copyright (c) 2023 lexoyo and Silex Labs foundation
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
+ */
17
+
18
+ import { Editor } from 'grapesjs'
2
19
  import {html, render} from 'lit-html'
20
+ import {ref} from 'lit-html/directives/ref.js'
3
21
 
4
22
  const pluginName = 'page-panel'
5
23
  let open
6
24
 
7
25
  export const cmdTogglePages = 'pages:open-panel'
8
26
  export const cmdAddPage = 'pages:add'
27
+ export const cmdRemovePage = 'pages:remove'
28
+ export const cmdClonePage = 'pages:clone'
29
+ export const cmdSelectNextPage = 'pages:select-next'
30
+ export const cmdSelectPrevPage = 'pages:select-prev'
31
+ export const cmdSelectFirstPage = 'pages:select-first'
9
32
 
10
33
  function selectPage(editor, page) {
11
34
  editor.Pages.select(page)
12
35
  }
13
36
  function addPage(editor, config) {
14
37
  const pages = editor.Pages.getAll()
38
+ // Get a name
15
39
  let idx = 1
16
40
  const newPageName = config.newPageName || 'New page'
17
41
  let pageName = newPageName
18
42
  while(pages.find(p => p.getName() === pageName)) {
19
43
  pageName = `${newPageName} ${idx++}`
20
44
  }
45
+ // Add page
21
46
  const page = editor.Pages.add({ name: pageName })
47
+ // Select the new page
48
+ editor.Pages.select(page)
49
+ // Open page settings to edit the name
22
50
  editor.runCommand(config.cmdOpenNewPageDialog, {page})
23
51
  }
24
52
 
53
+ function clonePage(editor, page) {
54
+ const pages = editor.Pages.getAll()
55
+ // Get a name
56
+ let idx = 1
57
+ const newPageName = (page.getName() || 'main') + ' copy'
58
+ let pageName = newPageName
59
+ while(pages.find(p => p.getName() === pageName)) {
60
+ pageName = `${newPageName} ${idx++}`
61
+ }
62
+ // Clone components
63
+ const body = page.getMainComponent().clone()
64
+ // Add page
65
+ const newPage = editor.Pages.add({
66
+ name: pageName,
67
+ component: body,
68
+ })
69
+ // Select the new page
70
+ editor.Pages.select(newPage)
71
+ }
72
+
25
73
  function removePage(editor, page) {
26
74
  if(editor.Pages.getAll().length === 1) {
27
75
  console.error('can not delete the only page')
@@ -35,6 +83,54 @@ function removePage(editor, page) {
35
83
  }
36
84
  }
37
85
 
86
+ function removePageWithConfirm(editor, page) {
87
+ const content = document.createElement('div')
88
+ const modal = editor.Modal.open({
89
+ title: 'Are you sure?',
90
+ content,
91
+ })
92
+ render(html`
93
+ <p>Do you really want to remove this page?</p>
94
+ <footer>
95
+ <button
96
+ ${ref((el: HTMLButtonElement) => {
97
+ console.log('focus', el)
98
+ setTimeout(() => el.focus())
99
+ })}
100
+ @click=${() => {
101
+ removePage(editor, page)
102
+ modal.close()
103
+ }}
104
+ class="silex-button silex-button--primary">Delete page</button>
105
+ <button
106
+ @click=${() => modal.close()}
107
+ class="silex-button silex-button--secondary">Cancel</button
108
+ </footer>
109
+ `, content)
110
+ }
111
+
112
+ function selectNextPage(editor) {
113
+ const pages = editor.Pages.getAll()
114
+ const selected = editor.Pages.getSelected()
115
+ const idx = pages.indexOf(selected)
116
+ if(idx < pages.length - 1) {
117
+ selectPage(editor, pages[idx + 1])
118
+ } else {
119
+ selectPage(editor, pages[0])
120
+ }
121
+ }
122
+
123
+ function selectPrevPage(editor) {
124
+ const pages = editor.Pages.getAll()
125
+ const selected = editor.Pages.getSelected()
126
+ const idx = pages.indexOf(selected)
127
+ if(idx > 0) {
128
+ selectPage(editor, pages[idx - 1])
129
+ } else {
130
+ selectPage(editor, pages[pages.length - 1])
131
+ }
132
+ }
133
+
38
134
  function settingsPage(editor, config, page) {
39
135
  editor.runCommand(config.cmdOpenSettings, {page})
40
136
  }
@@ -59,6 +155,7 @@ function renderPages(editor, config) {
59
155
  ${ name }
60
156
  </div>
61
157
  <i class="pages__icon pages__remove-btn fa fa-trash" @click=${e => removePage(editor, getPageFromEvent(e))}></i>
158
+ <i class="pages__icon pages__clone-btn fa fa-clone" @click=${e => clonePage(editor, getPageFromEvent(e))}></i>
62
159
  <i class="pages__icon fa fa-cog" @click=${e => settingsPage(editor, config, getPageFromEvent(e))}></i>
63
160
  </div>
64
161
  </div>
@@ -72,7 +169,7 @@ function renderPages(editor, config) {
72
169
  </main></section>`
73
170
  }
74
171
 
75
- export const pagePanelPlugin = grapesjs.plugins.add(pluginName, (editor, opts) => {
172
+ export const pagePanelPlugin = (editor: Editor, opts) => {
76
173
  // create wrapper
77
174
  const el = document.createElement('div')
78
175
  el.classList.add('pages__wrapper')
@@ -83,9 +180,9 @@ export const pagePanelPlugin = grapesjs.plugins.add(pluginName, (editor, opts) =
83
180
  })
84
181
  editor.on('load', () => {
85
182
  open = false
86
- document.querySelector(opts.appendTo)
87
- .appendChild(el)
183
+ document.querySelector(opts.appendTo).appendChild(el)
88
184
  doRender()
185
+
89
186
  // click anywhere close it
90
187
  // const close = (event) => {
91
188
  // if(open) {
@@ -94,8 +191,13 @@ export const pagePanelPlugin = grapesjs.plugins.add(pluginName, (editor, opts) =
94
191
  // }
95
192
  // }
96
193
  // document.addEventListener('mousedown', close)
97
- // add command to add pages
194
+
195
+ // add useful commands
98
196
  editor.Commands.add(cmdAddPage, () => addPage(editor, opts))
197
+ editor.Commands.add(cmdRemovePage, () => removePageWithConfirm(editor, editor.Pages.getSelected()))
198
+ editor.Commands.add(cmdClonePage, () => clonePage(editor, editor.Pages.getSelected()))
199
+ editor.Commands.add(cmdSelectNextPage, () => selectNextPage(editor))
200
+ editor.Commands.add(cmdSelectPrevPage, () => selectPrevPage(editor))
201
+ editor.Commands.add(cmdSelectFirstPage, () => selectPage(editor, editor.Pages.getAll()[0]))
99
202
  })
100
- })
101
-
203
+ }