@silexlabs/silex 3.0.1-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 (250) hide show
  1. package/.env.default +3 -2
  2. package/.silex.js +39 -1
  3. package/README.md +37 -35
  4. package/dist/client/client/api.d.ts +8 -1
  5. package/dist/client/client/assetUrl.d.ts +54 -0
  6. package/dist/client/client/config.d.ts +60 -1
  7. package/dist/client/client/events.d.ts +19 -10
  8. package/dist/client/client/grapesjs/PublicationManager.d.ts +6 -8
  9. package/dist/client/client/grapesjs/PublicationUi.d.ts +8 -10
  10. package/dist/client/client/grapesjs/breadcrumbs.d.ts +1 -0
  11. package/dist/client/client/grapesjs/css-props.d.ts +6 -0
  12. package/dist/client/client/grapesjs/footer.d.ts +2 -0
  13. package/dist/client/client/grapesjs/img.d.ts +6 -0
  14. package/dist/client/client/grapesjs/index.d.ts +6 -2
  15. package/dist/client/client/grapesjs/internal-links.d.ts +1 -1
  16. package/dist/client/client/grapesjs/keymaps.d.ts +123 -0
  17. package/dist/client/client/grapesjs/new-page-dialog.d.ts +1 -1
  18. package/dist/client/client/grapesjs/page-panel.d.ts +7 -1
  19. package/dist/client/client/grapesjs/project-bar.d.ts +20 -0
  20. package/dist/client/client/grapesjs/resize-panel.d.ts +1 -0
  21. package/dist/client/client/grapesjs/rich-text.d.ts +4 -1
  22. package/dist/client/client/grapesjs/semantic.d.ts +1 -1
  23. package/dist/client/client/grapesjs/settings-sections.d.ts +16 -0
  24. package/dist/client/client/grapesjs/settings.d.ts +3 -1
  25. package/dist/client/client/grapesjs/storage.d.ts +1 -0
  26. package/dist/client/client/grapesjs/symbolDialogs.d.ts +1 -1
  27. package/dist/client/client/grapesjs/view-buttons.d.ts +1 -0
  28. package/dist/client/client/index.d.ts +5 -0
  29. package/dist/client/client/publication-transformers.d.ts +42 -0
  30. package/dist/client/client/publish-custom-code-block.d.ts +4 -0
  31. package/dist/client/client/publish-fonts.d.ts +4 -0
  32. package/dist/client/client/utils.d.ts +22 -1
  33. package/dist/client/constants.d.ts +3 -0
  34. package/dist/client/css/admin.css +1107 -411
  35. package/dist/client/css/admin.css.map +1 -0
  36. package/dist/client/grapesjs-filter-styles/dist/index.d.ts +4 -0
  37. package/dist/client/grapesjs-fonts/dist/index.d.ts +4 -0
  38. package/dist/client/grapesjs-fonts/src/commands.d.ts +3 -0
  39. package/dist/client/grapesjs-fonts/src/fonts.d.ts +4 -0
  40. package/dist/client/grapesjs-storage-rate-limit/dist/index.d.ts +4 -0
  41. package/dist/client/grapesjs-ui-suggest-classes/dist/index.d.ts +4 -0
  42. package/dist/client/index.html +3 -2
  43. package/dist/client/js/main.js +305 -170
  44. package/dist/client/js/main.js.LICENSE.txt +21 -1
  45. package/dist/client/page.d.ts +1 -1
  46. package/dist/client/silex-lib/src/ts/client/api.d.ts +90 -0
  47. package/dist/client/silex-lib/src/ts/client/assetUrl.d.ts +54 -0
  48. package/dist/client/silex-lib/src/ts/client/config.d.ts +102 -0
  49. package/dist/client/silex-lib/src/ts/client/events.d.ts +23 -0
  50. package/dist/client/silex-lib/src/ts/client/expose.d.ts +8 -0
  51. package/dist/client/silex-lib/src/ts/client/grapesjs/LoginDialog.d.ts +15 -0
  52. package/dist/client/silex-lib/src/ts/client/grapesjs/PublicationManager.d.ts +73 -0
  53. package/dist/client/silex-lib/src/ts/client/grapesjs/PublicationUi.d.ts +59 -0
  54. package/dist/client/silex-lib/src/ts/client/grapesjs/blocks.d.ts +1 -0
  55. package/dist/client/silex-lib/src/ts/client/grapesjs/breadcrumbs.d.ts +1 -0
  56. package/dist/client/silex-lib/src/ts/client/grapesjs/css-props.d.ts +6 -0
  57. package/dist/client/silex-lib/src/ts/client/grapesjs/footer.d.ts +2 -0
  58. package/dist/client/silex-lib/src/ts/client/grapesjs/img.d.ts +6 -0
  59. package/dist/client/silex-lib/src/ts/client/grapesjs/index.d.ts +9 -0
  60. package/dist/client/silex-lib/src/ts/client/grapesjs/internal-links.d.ts +1 -0
  61. package/dist/client/silex-lib/src/ts/client/grapesjs/keymaps.d.ts +123 -0
  62. package/dist/client/silex-lib/src/ts/client/grapesjs/new-page-dialog.d.ts +2 -0
  63. package/dist/client/silex-lib/src/ts/client/grapesjs/openImport.d.ts +9 -0
  64. package/dist/client/silex-lib/src/ts/client/grapesjs/page-panel.d.ts +9 -0
  65. package/dist/client/silex-lib/src/ts/client/grapesjs/project-bar.d.ts +21 -0
  66. package/dist/client/silex-lib/src/ts/client/grapesjs/resize-panel.d.ts +1 -0
  67. package/dist/client/silex-lib/src/ts/client/grapesjs/rich-text.d.ts +4 -0
  68. package/dist/client/silex-lib/src/ts/client/grapesjs/semantic.d.ts +1 -0
  69. package/dist/client/silex-lib/src/ts/client/grapesjs/settings-sections.d.ts +16 -0
  70. package/dist/client/silex-lib/src/ts/client/grapesjs/settings.d.ts +4 -0
  71. package/dist/client/silex-lib/src/ts/client/grapesjs/storage.d.ts +2 -0
  72. package/dist/client/silex-lib/src/ts/client/grapesjs/symbolDialogs.d.ts +3 -0
  73. package/dist/client/silex-lib/src/ts/client/grapesjs/view-buttons.d.ts +1 -0
  74. package/dist/client/silex-lib/src/ts/client/index.d.ts +10 -0
  75. package/dist/client/silex-lib/src/ts/client/publication-transformers.d.ts +42 -0
  76. package/dist/client/silex-lib/src/ts/client/publish-custom-code-block.d.ts +4 -0
  77. package/dist/client/silex-lib/src/ts/client/publish-fonts.d.ts +4 -0
  78. package/dist/client/silex-lib/src/ts/client/utils.d.ts +22 -0
  79. package/dist/client/silex-lib/src/ts/constants.d.ts +32 -0
  80. package/dist/client/silex-lib/src/ts/page.d.ts +2 -0
  81. package/dist/client/silex-lib/src/ts/types.d.ts +339 -0
  82. package/dist/client/types.d.ts +59 -35
  83. package/dist/plugins/client/client/events.d.ts +19 -10
  84. package/dist/plugins/client/client/events.js +11 -0
  85. package/dist/plugins/client/client/events.js.map +1 -1
  86. package/dist/plugins/client/plugins/client/template.js +119 -71
  87. package/dist/plugins/client/plugins/client/template.js.map +1 -1
  88. package/dist/plugins/client/plugins/client/website-info.d.ts +1 -0
  89. package/dist/plugins/client/plugins/client/website-info.js +72 -0
  90. package/dist/plugins/client/plugins/client/website-info.js.map +1 -0
  91. package/dist/plugins/client/types.d.ts +59 -35
  92. package/dist/plugins/client/types.js +23 -0
  93. package/dist/plugins/client/types.js.map +1 -1
  94. package/dist/plugins/server/constants.d.ts +3 -0
  95. package/dist/plugins/server/constants.js +28 -1
  96. package/dist/plugins/server/constants.js.map +1 -1
  97. package/dist/plugins/server/plugins/server/Cache.js +9 -5
  98. package/dist/plugins/server/plugins/server/Cache.js.map +1 -1
  99. package/dist/plugins/server/plugins/server/DownloadConnector.d.ts +29 -0
  100. package/dist/plugins/server/plugins/server/DownloadConnector.js +127 -0
  101. package/dist/plugins/server/plugins/server/DownloadConnector.js.map +1 -0
  102. package/dist/plugins/server/plugins/server/FtpConnector.d.ts +5 -2
  103. package/dist/plugins/server/plugins/server/FtpConnector.js +38 -23
  104. package/dist/plugins/server/plugins/server/FtpConnector.js.map +1 -1
  105. package/dist/plugins/server/plugins/server/GitlabConnector.d.ts +63 -9
  106. package/dist/plugins/server/plugins/server/GitlabConnector.js +367 -91
  107. package/dist/plugins/server/plugins/server/GitlabConnector.js.map +1 -1
  108. package/dist/plugins/server/plugins/server/GitlabHostingConnector.d.ts +16 -0
  109. package/dist/plugins/server/plugins/server/GitlabHostingConnector.js +209 -0
  110. package/dist/plugins/server/plugins/server/GitlabHostingConnector.js.map +1 -0
  111. package/dist/plugins/server/plugins/server/SslPlugin.js +6 -6
  112. package/dist/plugins/server/plugins/server/SslPlugin.js.map +1 -1
  113. package/dist/plugins/server/plugins/server/StaticPlugin.d.ts +8 -1
  114. package/dist/plugins/server/plugins/server/StaticPlugin.js +5 -31
  115. package/dist/plugins/server/plugins/server/StaticPlugin.js.map +1 -1
  116. package/dist/plugins/server/server/config.js +8 -9
  117. package/dist/plugins/server/server/config.js.map +1 -1
  118. package/dist/plugins/server/server/connectors/FsHosting.d.ts +3 -2
  119. package/dist/plugins/server/server/connectors/FsHosting.js +18 -7
  120. package/dist/plugins/server/server/connectors/FsHosting.js.map +1 -1
  121. package/dist/plugins/server/server/connectors/FsStorage.d.ts +3 -1
  122. package/dist/plugins/server/server/connectors/FsStorage.js +35 -28
  123. package/dist/plugins/server/server/connectors/FsStorage.js.map +1 -1
  124. package/dist/plugins/server/server/connectors/connectors.d.ts +7 -7
  125. package/dist/plugins/server/server/connectors/connectors.js +6 -7
  126. package/dist/plugins/server/server/connectors/connectors.js.map +1 -1
  127. package/dist/plugins/server/server/events.js +16 -0
  128. package/dist/plugins/server/server/events.js.map +1 -1
  129. package/dist/plugins/server/server/jobs.d.ts +6 -0
  130. package/dist/plugins/server/server/jobs.js +12 -8
  131. package/dist/plugins/server/server/jobs.js.map +1 -1
  132. package/dist/plugins/server/server/utils/validation.js +1 -2
  133. package/dist/plugins/server/server/utils/validation.js.map +1 -1
  134. package/dist/plugins/server/types.d.ts +59 -35
  135. package/dist/plugins/server/types.js +24 -1
  136. package/dist/plugins/server/types.js.map +1 -1
  137. package/dist/server/constants.js +27 -1
  138. package/dist/server/plugins/server/Cache.js +9 -5
  139. package/dist/server/server/api/api.js +1 -1
  140. package/dist/server/server/api/connectorApi.js +154 -25
  141. package/dist/server/server/api/publicationApi.js +17 -25
  142. package/dist/server/server/api/websiteApi.js +30 -8
  143. package/dist/server/server/cli.js +9 -6
  144. package/dist/server/server/config.js +8 -9
  145. package/dist/server/server/connectors/FsHosting.js +17 -7
  146. package/dist/server/server/connectors/FsStorage.js +34 -28
  147. package/dist/server/server/connectors/connectors.js +6 -7
  148. package/dist/server/server/express.js +4 -5
  149. package/dist/server/server/index.js +5 -1
  150. package/dist/server/server/jobs.js +11 -8
  151. package/dist/server/server/utils/validation.js +1 -2
  152. package/dist/server/types.js +13 -1
  153. package/package.json +56 -42
  154. package/public/assets/download.png +0 -0
  155. package/public/assets/favicon.ico +0 -0
  156. package/public/assets/favicon.png +0 -0
  157. package/public/assets/ftp.png +0 -0
  158. package/public/assets/gitlab.png +0 -0
  159. package/public/assets/gitlab2.png +0 -0
  160. package/public/assets/laptop.png +0 -0
  161. package/public/assets/logo-silex-small.png +0 -0
  162. package/public/silex.js +5 -23
  163. package/src/css/_variables.scss +23 -20
  164. package/src/css/dialog.scss +27 -1
  165. package/src/css/fonts.scss +31 -0
  166. package/src/css/footer.scss +12 -0
  167. package/src/css/grapesjs-light.scss +180 -0
  168. package/src/css/grapesjs-plugins.scss +227 -0
  169. package/src/css/grapesjs.scss +84 -10
  170. package/src/css/index.scss +12 -1
  171. package/src/css/light.scss +7 -0
  172. package/src/css/project-bar.scss +32 -16
  173. package/src/css/silex.scss +79 -5
  174. package/src/css/website-info.scss +14 -0
  175. package/src/html/index.pug +3 -3
  176. package/src/ts/client/api.ts +38 -14
  177. package/src/ts/client/assetUrl.test.ts +164 -0
  178. package/src/ts/client/assetUrl.ts +254 -0
  179. package/src/ts/client/config.ts +133 -5
  180. package/src/ts/client/events.ts +21 -9
  181. package/src/ts/client/grapesjs/LoginDialog.ts +4 -2
  182. package/src/ts/client/grapesjs/PublicationManager.ts +180 -54
  183. package/src/ts/client/grapesjs/PublicationUi.ts +122 -86
  184. package/src/ts/client/grapesjs/breadcrumbs.ts +79 -0
  185. package/src/ts/client/grapesjs/css-props.ts +910 -0
  186. package/src/ts/client/grapesjs/eleventy.ts +11 -8
  187. package/{dist/plugins/client/page.js → src/ts/client/grapesjs/footer.ts} +24 -13
  188. package/src/ts/client/grapesjs/img.ts +147 -0
  189. package/src/ts/client/grapesjs/index.ts +234 -52
  190. package/src/ts/client/grapesjs/internal-links.test.ts +2 -1
  191. package/src/ts/client/grapesjs/internal-links.ts +14 -7
  192. package/src/ts/client/grapesjs/keymaps.ts +207 -0
  193. package/src/ts/client/grapesjs/new-page-dialog.ts +2 -3
  194. package/src/ts/client/grapesjs/page-panel.ts +92 -7
  195. package/src/ts/client/grapesjs/project-bar.ts +116 -72
  196. package/src/ts/client/grapesjs/resize-panel.ts +20 -0
  197. package/src/ts/client/grapesjs/rich-text.ts +21 -13
  198. package/src/ts/client/grapesjs/semantic.ts +3 -3
  199. package/src/ts/client/grapesjs/settings-sections.ts +117 -0
  200. package/src/ts/client/grapesjs/settings.ts +174 -96
  201. package/src/ts/client/grapesjs/storage.ts +98 -33
  202. package/src/ts/client/grapesjs/symbolDialogs.ts +3 -4
  203. package/src/ts/{plugins/server/AuthPlugin.ts → client/grapesjs/view-buttons.ts} +23 -19
  204. package/src/ts/client/index.ts +35 -16
  205. package/src/ts/client/publication-transformers.test.ts +207 -0
  206. package/src/ts/client/publication-transformers.ts +280 -0
  207. package/{dist/plugins/client/client/utils.js → src/ts/client/publish-custom-code-block.ts} +14 -8
  208. package/src/ts/client/publish-fonts.ts +36 -0
  209. package/src/ts/client/utils.ts +53 -1
  210. package/src/ts/constants.ts +31 -0
  211. package/src/ts/page.ts +2 -2
  212. package/src/ts/plugins/client/template.ts +125 -75
  213. package/src/ts/plugins/client/website-info.ts +84 -0
  214. package/src/ts/plugins/server/Cache.ts +6 -2
  215. package/src/ts/plugins/server/DownloadConnector.ts +146 -0
  216. package/src/ts/plugins/server/FtpConnector.ts +47 -21
  217. package/src/ts/plugins/server/GitlabConnector.ts +423 -108
  218. package/src/ts/plugins/server/GitlabHostingConnector.ts +215 -0
  219. package/src/ts/plugins/server/SslPlugin.ts +5 -5
  220. package/src/ts/plugins/server/StaticPlugin.ts +3 -30
  221. package/src/ts/server/api/connectorApi.ts +165 -28
  222. package/src/ts/server/api/publicationApi.ts +17 -24
  223. package/src/ts/server/api/websiteApi.ts +57 -14
  224. package/src/ts/server/cli.ts +7 -5
  225. package/src/ts/server/config.ts +9 -10
  226. package/src/ts/server/connectors/FsHosting.ts +14 -8
  227. package/src/ts/server/connectors/FsStorage.ts +40 -7
  228. package/src/ts/server/connectors/connectors.ts +8 -6
  229. package/src/ts/server/events.ts +17 -0
  230. package/src/ts/server/express.ts +2 -2
  231. package/src/ts/server/index.ts +6 -0
  232. package/src/ts/server/jobs.ts +14 -2
  233. package/src/ts/server/utils/BackwardCompat.ts +530 -529
  234. package/src/ts/types.ts +78 -34
  235. package/dist/plugins/client/client/utils.d.ts +0 -1
  236. package/dist/plugins/client/client/utils.js.map +0 -1
  237. package/dist/plugins/client/page.d.ts +0 -2
  238. package/dist/plugins/client/page.js.map +0 -1
  239. package/dist/plugins/client/plugins/client/publicationRenderer.d.ts +0 -2
  240. package/dist/plugins/client/plugins/client/publicationRenderer.js +0 -128
  241. package/dist/plugins/client/plugins/client/publicationRenderer.js.map +0 -1
  242. package/dist/plugins/server/plugins/server/AuthPlugin.d.ts +0 -1
  243. package/dist/plugins/server/plugins/server/AuthPlugin.js +0 -38
  244. package/dist/plugins/server/plugins/server/AuthPlugin.js.map +0 -1
  245. package/dist/plugins/server/plugins/server/HooksPlugin.d.ts +0 -7
  246. package/dist/plugins/server/plugins/server/HooksPlugin.js +0 -74
  247. package/dist/plugins/server/plugins/server/HooksPlugin.js.map +0 -1
  248. package/src/example-client-config.js +0 -64
  249. package/src/ts/plugins/client/publicationRenderer.ts +0 -128
  250. package/src/ts/plugins/server/HooksPlugin.ts +0 -76
@@ -1,14 +1,17 @@
1
1
  @use "variables" as *;
2
2
 
3
3
  // squeeze the stage iframe when panel is open
4
- iframe.enable-squeeze.gjs-frame {
5
- transition: width $transitionSpeedMedium, height $transitionSpeedMedium, left $transitionSpeedMedium;
6
- }
7
- iframe.enable-squeeze.silex-squeeze-left {
8
- --project-panel-width: max(150px, 15.7%); /* Why 16? Also sass vars do not work here */
9
- left: var(--project-panel-width);
10
- width: calc(100% - var(--project-panel-width));
4
+ //.silex-squeeze-left .gjs-frame-wrapper {
5
+ // margin-left: 18%;
6
+ // width: auto;
7
+ //}
8
+ .silex-squeeze-left .gjs-cv-canvas {
9
+ left: calc(var(--viewsProjectPanelWidth) + 35px);
10
+ width: auto;
11
+ right: var(--viewsPanelWidth);
11
12
  }
13
+
14
+
12
15
  // button bar
13
16
  .#{$pn-prefix}project-bar-panel {
14
17
  width: $projectBarWidth;
@@ -21,13 +24,17 @@ iframe.enable-squeeze.silex-squeeze-left {
21
24
  flex: 1;
22
25
  }
23
26
  .#{$pn-prefix}btn {
24
- margin: 5px 0 0;
27
+ margin: 5px 0 5px 0px;
25
28
  padding: 5px;
26
29
  &.#{$pn-prefix}active {
27
30
  background-color: $lighterPrimaryColor;
28
31
  width: $projectBarWidth;
29
32
  box-shadow: none;
30
- }
33
+ }
34
+ }
35
+ .#{$pn-prefix}btn.project-bar__dirty {
36
+ background-color: $quaternaryColor;
37
+ color: white;
31
38
  }
32
39
  }
33
40
  .logo {
@@ -35,15 +42,30 @@ iframe.enable-squeeze.silex-squeeze-left {
35
42
  background-repeat: no-repeat;
36
43
  background-position: center center;
37
44
  background-color: transparent;
45
+ background-size: contain;
38
46
  }
39
47
  }
40
48
 
49
+ // Resize options project panel button
50
+ .viewsOptionsProjectPanel__size-btn::before {
51
+ content: '→';
52
+ }
53
+ .viewsOptionsProjectPanel__size-btn {
54
+ z-index: $z-views-options-buttons;
55
+ right: auto;
56
+ left: 0;
57
+ }
58
+ // For fixed block size after project panel resizing (instead of default value 45%)
59
+ .gjs-block {
60
+ width: 84px;
61
+ }
62
+
41
63
  // panels
42
64
  .#{$pn-prefix}project-bar-container {
43
65
  top: $topBarHeight;
44
66
  width: $projectPanelWidth;
45
67
  min-width: $projectPanelMinWidth;
46
- height: calc(100% - $topBarHeight);
68
+ height: calc(100% - $topBarHeight - $footerHeight);
47
69
  background-color: $lighterPrimaryColor;
48
70
  &:not(.gjs-hidden) {
49
71
  display: flex; // let the child take the whole height
@@ -81,13 +103,7 @@ iframe.enable-squeeze.silex-squeeze-left {
81
103
  }
82
104
  .project-bar__panel-header-button {
83
105
  cursor: pointer;
84
- font-size: large;
85
- font-weight: 400;
86
106
  span {
87
- position: relative;
88
- left: -2px;
89
- top: -11px;
90
- font-weight: bolder;
91
107
  background-color: #444;
92
108
  border-radius: 100%;
93
109
  display: inline-block;
@@ -4,6 +4,9 @@
4
4
  .silex-workspace {
5
5
  @include mixins.silex-ui-full;
6
6
  display: flex;
7
+ body {
8
+ font-family: $fontFamily;
9
+ }
7
10
  a {
8
11
  color: inherit;
9
12
  }
@@ -20,20 +23,53 @@
20
23
  font-size: 18px;
21
24
  font-weight: normal;
22
25
  }
26
+ //Better contrast than grapesjs default for select menu et input
27
+ select, input {
28
+ background-color: $darkerPrimaryColor;
29
+ }
30
+ .gjs-color-warn, .gjs-sm-sector .gjs-sm-field input, .gjs-clm-tags .gjs-sm-field input, .gjs-sm-sector .gjs-clm-field input, .gjs-clm-tags .gjs-clm-field input, .gjs-sm-sector .gjs-sm-field select, .gjs-clm-tags .gjs-sm-field select, .gjs-sm-sector .gjs-clm-field select, .gjs-clm-tags .gjs-clm-field select {
31
+ color: $secondaryColor;
32
+ }
23
33
  }
24
34
 
25
35
  .full-width {
26
36
  width: 100%;
27
37
  }
28
38
 
39
+ // Resize options panel button
40
+ .silex-workspace {
41
+ .gjs-pn-viewsOptions {
42
+ z-index: $z-views-options-buttons;
43
+ right: 0;
44
+ left: auto;
45
+
46
+ .viewsOptions__size-btn::before {
47
+ content: '←';
48
+ }
49
+ }
50
+ }
51
+
52
+ .silex-hidden {
53
+ /* do not really hide, because it breaks the code editor init in the site settings + for animation */
54
+ visibility: hidden;
55
+ position: absolute;
56
+ opacity: 0;
57
+ height: 10px;
58
+ width: 10px;
59
+ overflow: hidden;
60
+ }
61
+
29
62
  // full screen settings
30
63
  .settings-dialog > div {
31
64
  max-width: none;
32
65
  width: 100%;
33
- max-height: 100vh;
66
+ height: 100vh;
34
67
  overflow: auto;
35
68
  form.silex-form {
36
69
  padding-bottom: 100px; // leave space for fixed footer
70
+ textarea {
71
+ min-height: 250px;
72
+ }
37
73
  }
38
74
  .silex-form__element {
39
75
  padding: 10px 5px;
@@ -43,6 +79,7 @@
43
79
  }
44
80
  footer {
45
81
  position: fixed;
82
+ z-index: 10;
46
83
  bottom: 0;
47
84
  left: 0;
48
85
  width: 100%;
@@ -57,6 +94,10 @@
57
94
  font-size: x-small;
58
95
  }
59
96
  }
97
+ .CodeMirror {
98
+ min-height: 400px;
99
+ height: auto;
100
+ }
60
101
  }
61
102
 
62
103
  button.silex-button,
@@ -75,8 +116,16 @@ input.silex-button[type="submit"] {
75
116
  background-color: $lighterPrimaryColor;
76
117
  border-color: transparent;
77
118
  padding: 5px;
119
+ &:focus {
120
+ outline: none;
121
+ box-shadow: 0 0 0 2px $tertiaryColor;
122
+ }
123
+ &:hover {
124
+ background-color: $darkerPrimaryColor;
125
+ }
78
126
  }
79
127
 
128
+ .silex-button.disabled,
80
129
  .silex-button[disabled] {
81
130
  opacity: .8;
82
131
  cursor: unset;
@@ -92,6 +141,7 @@ input.silex-button[type="submit"] {
92
141
 
93
142
  .silex-button--size {
94
143
  max-height: 30px;
144
+ margin: 0 10px;
95
145
  }
96
146
 
97
147
  .silex-button--small {
@@ -107,11 +157,15 @@ input.silex-button[type="submit"] {
107
157
  display: block;
108
158
  }
109
159
 
160
+ .silex-sidebar-dialog,
110
161
  .silex-bar {
111
162
  display: flex;
112
163
  &>* {
113
164
  margin: 5px;
114
165
  }
166
+ main {
167
+ width: 100%;
168
+ }
115
169
  }
116
170
 
117
171
  ol.silex-list,
@@ -119,15 +173,15 @@ ul.silex-list {
119
173
  list-style: none;
120
174
  margin: 0;
121
175
  padding: 0;
122
- background-color: #575757;
176
+ //background-color: #575757;
123
177
  &>li {
124
178
  padding: 5px;
125
- border-bottom: 1px solid #575757;
126
- background-color: #444;
179
+ border-bottom: 1px solid $lighterPrimaryColor;
180
+ //background-color: #444;
127
181
  margin: 5px;
128
182
  }
129
183
  fieldset {
130
- border-color: #575757;
184
+ border-color: $lighterPrimaryColor;
131
185
  }
132
186
  h4 { // badge-like
133
187
  display: inline-block;
@@ -152,6 +206,26 @@ ul.silex-list {
152
206
  }
153
207
  }
154
208
 
209
+ ol.silex-list--menu,
210
+ ul.silex-list--menu {
211
+ &>li {
212
+ padding: 15px;
213
+ margin: 0;
214
+ border: 1px solid transparent;
215
+ border-bottom-color: $lighterPrimaryColor;
216
+ text-align: center;
217
+ cursor: pointer;
218
+ }
219
+ &>li:first-child {
220
+ border-top-color: $lighterPrimaryColor;
221
+ }
222
+ .active,
223
+ &>li:hover {
224
+ color: $tertiaryColor;
225
+ background-color: $darkerPrimaryColor;
226
+ }
227
+ }
228
+
155
229
  form.silex-form {
156
230
  display: flex;
157
231
  flex-direction: column;
@@ -0,0 +1,14 @@
1
+ @use "variables" as *;
2
+
3
+ .gjs-website-meta {
4
+ display: flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ margin-left: 10px;
8
+ margin-right: 10px;
9
+ padding: 0 10px;
10
+ line-height: 1;
11
+ min-width: 100px;
12
+ border: 1px solid $lighterPrimaryColor;
13
+ background-color: $darkerPrimaryColor;
14
+ }
@@ -12,7 +12,7 @@ html(lang="en", translate="no")
12
12
  style.
13
13
  body {
14
14
  background-color: #444444;
15
- font-family: Helvetica,sans-serif;
15
+ font-family: "Ubuntu", "Helvetica Neue", Helvetica, Arial, sans-serif;
16
16
  }
17
17
  .silex-loader {
18
18
  display: none;
@@ -34,6 +34,6 @@ html(lang="en", translate="no")
34
34
  script(src='js/main.js')
35
35
 
36
36
  block silex-start
37
- // Here you can use silex.config to hook into silex options before silex starts
38
37
  script.
39
- window.silex.start()
38
+ silex.start()
39
+ // From here silex.config is available and Silex is getting started
@@ -15,8 +15,8 @@
15
15
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
16
  */
17
17
 
18
- import { API_CONNECTOR_LIST, API_CONNECTOR_USER, API_CONNECTOR_LOGOUT, API_CONNECTOR_PATH, API_PATH, API_PUBLICATION_PATH, API_PUBLICATION_PUBLISH, API_PUBLICATION_STATUS, API_WEBSITE_ASSET_READ, API_WEBSITE_ASSETS_WRITE, API_WEBSITE_DELETE, API_WEBSITE_LIST, API_WEBSITE_PATH, API_WEBSITE_READ, API_WEBSITE_WRITE, API_WEBSITE_META_READ, API_WEBSITE_META_WRITE, API_WEBSITE_CREATE } from '../constants'
19
- import { ApiPublicationPublishBody, ApiPublicationPublishQuery, ApiPublicationPublishResponse, ApiPublicationStatusQuery, ApiPublicationStatusResponse, ConnectorId, JobData, JobId, PublicationJobData, WebsiteId, ApiConnectorListResponse, ApiConnectorListQuery, ConnectorData, ConnectorType, ApiWebsiteReadQuery, ApiWebsiteReadResponse, WebsiteData, ApiWebsiteWriteQuery, ApiWebsiteWriteBody, ApiWebsiteWriteResponse, ApiWebsiteDeleteQuery, ApiWebsiteAssetsReadQuery, ApiWebsiteAssetsReadResponse, ApiWebsiteAssetsWriteQuery, ApiWebsiteAssetsWriteBody, ApiWebsiteAssetsWriteResponse, ClientSideFile, PublicationData, ApiConnectorUserResponse, ConnectorUser, WebsiteMeta, ApiConnectorLogoutQuery, ApiConnectorUserQuery, ApiWebsiteListResponse, ApiWebsiteListQuery, WebsiteMetaFileContent, ApiWebsiteCreateQuery, ApiWebsiteCreateBody, ApiWebsiteCreateResponse, ApiWebsiteMetaWriteQuery, ApiWebsiteMetaWriteBody, ApiWebsiteMetaWriteResponse, ApiWebsiteMetaReadQuery, ApiWebsiteMetaReadResponse, ConnectorOptions, ApiError } from '../types'
18
+ import { API_CONNECTOR_LIST, API_CONNECTOR_USER, API_CONNECTOR_LOGOUT, API_CONNECTOR_PATH, API_PATH, API_PUBLICATION_PATH, API_PUBLICATION_PUBLISH, API_PUBLICATION_STATUS, API_WEBSITE_ASSET_READ, API_WEBSITE_ASSETS_WRITE, API_WEBSITE_DELETE, API_WEBSITE_LIST, API_WEBSITE_PATH, API_WEBSITE_READ, API_WEBSITE_WRITE, API_WEBSITE_META_READ, API_WEBSITE_META_WRITE, API_WEBSITE_CREATE, API_WEBSITE_DUPLICATE } from '../constants'
19
+ import { ApiPublicationPublishBody, ApiPublicationPublishQuery, ApiPublicationPublishResponse, ApiPublicationStatusQuery, ApiPublicationStatusResponse, ConnectorId, JobData, JobId, PublicationJobData, WebsiteId, ApiConnectorListResponse, ApiConnectorListQuery, ConnectorData, ConnectorType, ApiWebsiteReadQuery, ApiWebsiteReadResponse, WebsiteData, ApiWebsiteWriteQuery, ApiWebsiteWriteBody, ApiWebsiteWriteResponse, ApiWebsiteDeleteQuery, ApiWebsiteAssetsReadQuery, ApiWebsiteAssetsReadResponse, ApiWebsiteAssetsWriteQuery, ApiWebsiteAssetsWriteBody, ApiWebsiteAssetsWriteResponse, ClientSideFile, PublicationData, ApiConnectorUserResponse, ConnectorUser, WebsiteMeta, ApiConnectorLogoutQuery, ApiConnectorUserQuery, ApiWebsiteListResponse, ApiWebsiteListQuery, WebsiteMetaFileContent, ApiWebsiteCreateQuery, ApiWebsiteCreateBody, ApiWebsiteCreateResponse, ApiWebsiteMetaWriteQuery, ApiWebsiteMetaWriteBody, ApiWebsiteMetaWriteResponse, ApiWebsiteMetaReadQuery, ApiWebsiteMetaReadResponse, ConnectorOptions, ApiError, ApiWebsiteDuplicateQuery } from '../types'
20
20
 
21
21
  export enum ApiRoute {
22
22
  PUBLICATION_PUBLISH = API_PATH + API_PUBLICATION_PATH + API_PUBLICATION_PUBLISH,
@@ -27,6 +27,7 @@ export enum ApiRoute {
27
27
  WEBSITE_READ = API_PATH + API_WEBSITE_PATH + API_WEBSITE_READ,
28
28
  WEBSITE_WRITE = API_PATH + API_WEBSITE_PATH + API_WEBSITE_WRITE,
29
29
  WEBSITE_DELETE = API_PATH + API_WEBSITE_PATH + API_WEBSITE_DELETE,
30
+ WEBSITE_DUPLICATE = API_PATH + API_WEBSITE_PATH + API_WEBSITE_DUPLICATE,
30
31
  WEBSITE_CREATE = API_PATH + API_WEBSITE_PATH + API_WEBSITE_CREATE,
31
32
  WEBSITE_LIST = API_PATH + API_WEBSITE_PATH + API_WEBSITE_LIST,
32
33
  WEBSITE_ASSETS_READ = API_PATH + API_WEBSITE_PATH + API_WEBSITE_ASSET_READ,
@@ -35,7 +36,14 @@ export enum ApiRoute {
35
36
  WEBSITE_META_WRITE = API_PATH + API_WEBSITE_PATH + API_WEBSITE_META_WRITE,
36
37
  }
37
38
 
38
- const ROOT_URL = window.location.origin
39
+ // Root URL of Silex server, should we use config.rootUrl ?
40
+ let serverUrl = window.location.origin + window.location.pathname.replace(/\/$/, '')
41
+ export function setServerUrl(url: string): void {
42
+ serverUrl = url
43
+ }
44
+ export function getServerUrl(): string {
45
+ return serverUrl
46
+ }
39
47
 
40
48
  export async function getUser({type, connectorId}: {type: ConnectorType, connectorId?: ConnectorId}): Promise<ConnectorUser> {
41
49
  return api<ApiConnectorUserQuery, null, ApiConnectorUserResponse>(ApiRoute.CONNECTOR_USER, 'GET', {
@@ -76,31 +84,35 @@ export async function websiteList({connectorId}: {connectorId?: ConnectorId}): P
76
84
  }
77
85
 
78
86
  export async function websiteLoad({websiteId, connectorId}: {websiteId: WebsiteId, connectorId?: ConnectorId}): Promise<WebsiteData> {
79
- return api<ApiWebsiteReadQuery, null, ApiWebsiteReadResponse>(ApiRoute.WEBSITE_READ, 'GET', { websiteId, connectorId: connectorId }) as Promise<WebsiteData>
87
+ return api<ApiWebsiteReadQuery, null, ApiWebsiteReadResponse>(ApiRoute.WEBSITE_READ, 'GET', { websiteId, connectorId }) as Promise<WebsiteData>
80
88
  }
81
89
 
82
90
  export async function websiteSave({websiteId, data, connectorId}: {websiteId: WebsiteId, data: WebsiteData, connectorId?: ConnectorId}): Promise<void> {
83
- const { message } = await api<ApiWebsiteWriteQuery, ApiWebsiteWriteBody, ApiWebsiteWriteResponse>(ApiRoute.WEBSITE_WRITE, 'POST', { websiteId, connectorId: connectorId }, data)
91
+ const { message } = await api<ApiWebsiteWriteQuery, ApiWebsiteWriteBody, ApiWebsiteWriteResponse>(ApiRoute.WEBSITE_WRITE, 'POST', { websiteId, connectorId }, data)
84
92
  }
85
93
 
86
94
  export async function websiteDelete({websiteId, connectorId}: {websiteId: WebsiteId, connectorId?: ConnectorId}): Promise<void> {
87
- await api<ApiWebsiteDeleteQuery, null, null>(ApiRoute.WEBSITE_DELETE, 'DELETE', { websiteId, connectorId: connectorId })
95
+ await api<ApiWebsiteDeleteQuery, null, null>(ApiRoute.WEBSITE_DELETE, 'DELETE', { websiteId, connectorId })
96
+ }
97
+
98
+ export async function websiteDuplicate({websiteId, connectorId}: {websiteId: WebsiteId, connectorId?: ConnectorId}): Promise<void> {
99
+ await api<ApiWebsiteDuplicateQuery, null, null>(ApiRoute.WEBSITE_DUPLICATE, 'POST', { websiteId, connectorId })
88
100
  }
89
101
 
90
102
  export async function websiteCreate({websiteId, data, connectorId}: {websiteId: WebsiteId, data: WebsiteMetaFileContent, connectorId?: ConnectorId}): Promise<void> {
91
- await api<ApiWebsiteCreateQuery, ApiWebsiteCreateBody, ApiWebsiteCreateResponse>(ApiRoute.WEBSITE_CREATE, 'PUT', { connectorId: connectorId }, data)
103
+ await api<ApiWebsiteCreateQuery, ApiWebsiteCreateBody, ApiWebsiteCreateResponse>(ApiRoute.WEBSITE_CREATE, 'PUT', { connectorId }, data)
92
104
  }
93
105
 
94
106
  export async function websiteMetaWrite({websiteId, data, connectorId}: {websiteId: WebsiteId, data: WebsiteMetaFileContent, connectorId?: ConnectorId}): Promise<void> {
95
- await api<ApiWebsiteMetaWriteQuery, ApiWebsiteMetaWriteBody, ApiWebsiteMetaWriteResponse>(ApiRoute.WEBSITE_META_WRITE, 'POST', { websiteId, connectorId: connectorId }, data)
107
+ await api<ApiWebsiteMetaWriteQuery, ApiWebsiteMetaWriteBody, ApiWebsiteMetaWriteResponse>(ApiRoute.WEBSITE_META_WRITE, 'POST', { websiteId, connectorId }, data)
96
108
  }
97
109
 
98
- export async function websiteMetaRead({websiteId, connectorId}: {websiteId: WebsiteId, connectorId?: ConnectorId}): Promise<void> {
99
- await api<ApiWebsiteMetaReadQuery, null, ApiWebsiteMetaReadResponse>(ApiRoute.WEBSITE_META_WRITE, 'PUT', { websiteId, connectorId: connectorId })
110
+ export async function websiteMetaRead({websiteId, connectorId}: {websiteId: WebsiteId, connectorId?: ConnectorId}): Promise<WebsiteMeta> {
111
+ return api<ApiWebsiteMetaReadQuery, null, ApiWebsiteMetaReadResponse>(ApiRoute.WEBSITE_META_WRITE, 'GET', { websiteId, connectorId })
100
112
  }
101
113
 
102
114
  export async function websiteAssetsLoad({path, websiteId, connectorId}: {path: string, websiteId: WebsiteId, connectorId: ConnectorId}): Promise<string> {
103
- return api<ApiWebsiteAssetsReadQuery, null, ApiWebsiteAssetsReadResponse>(`${ApiRoute.WEBSITE_ASSETS_READ}/${path}`, 'GET', { websiteId, connectorId: connectorId })
115
+ return api<ApiWebsiteAssetsReadQuery, null, ApiWebsiteAssetsReadResponse>(`${ApiRoute.WEBSITE_ASSETS_READ}/${path}`, 'GET', { websiteId, connectorId })
104
116
  }
105
117
 
106
118
  /**
@@ -108,12 +120,17 @@ export async function websiteAssetsLoad({path, websiteId, connectorId}: {path: s
108
120
  * @see assetManager in src/ts/client/grapesjs/index.ts
109
121
  */
110
122
  export async function websiteAssetsSave({websiteId, connectorId, files}: {websiteId: WebsiteId, connectorId: ConnectorId, files: ClientSideFile[]}): Promise<string[]> {
111
- const { data } = await api<ApiWebsiteAssetsWriteQuery, ApiWebsiteAssetsWriteBody, ApiWebsiteAssetsWriteResponse>(ApiRoute.WEBSITE_ASSETS_WRITE, 'POST', { websiteId, connectorId: connectorId }, files)
123
+ const { data } = await api<ApiWebsiteAssetsWriteQuery, ApiWebsiteAssetsWriteBody, ApiWebsiteAssetsWriteResponse>(ApiRoute.WEBSITE_ASSETS_WRITE, 'POST', { websiteId, connectorId }, files)
112
124
  return data
113
125
  }
114
126
 
115
127
  export async function api<ReqQuery, ReqBody, ResBody>(route: ApiRoute | string, method: string, query?: ReqQuery, payload?: ReqBody): Promise<ResBody> {
116
- const url = `${ROOT_URL}${route.toString()}?${new URLSearchParams(Object.entries(query).filter(([key, value]) => !!value)).toString()}`
128
+ const url = `${serverUrl}${route.toString()}?${
129
+ new URLSearchParams(
130
+ Object.entries(query)
131
+ .filter(([key, value]) => !!value)
132
+ .map(([key, value]) => [key, typeof value === 'string' ? value : JSON.stringify(value)])
133
+ ).toString()}`
117
134
  const response = await fetch(url, {
118
135
  method,
119
136
  headers: {
@@ -124,7 +141,14 @@ export async function api<ReqQuery, ReqBody, ResBody>(route: ApiRoute | string,
124
141
  })
125
142
 
126
143
  if (!response.ok) {
127
- const json = await response.json()
144
+ let json
145
+ try {
146
+ json = await response.json()
147
+ } catch (err) {
148
+ // If the response is not JSON, throw a generic error
149
+ // This is the case when Silex backend has an uncatched error, e.g. expressjs 413 PayloadTooLargeError: request entity too large
150
+ throw new ApiError(response.statusText, response.status)
151
+ }
128
152
  throw new ApiError(json.message, response.status)
129
153
  }
130
154
 
@@ -0,0 +1,164 @@
1
+ import { jest, expect, describe, it, beforeEach } from '@jest/globals'
2
+ import { removeTempDataFromStyles } from './assetUrl'
3
+
4
+ describe('assetUrl', () => {
5
+ beforeEach(() => {
6
+ jest.resetModules()
7
+ Object.defineProperty(window, 'location', {
8
+ value: {
9
+ href: 'http://localhost:6800/',
10
+ pathname: '',
11
+ origin: 'http://localhost:6800',
12
+ },
13
+ })
14
+ Object.assign(window.location, {
15
+ href: 'http://localhost:6800/',
16
+ pathname: '',
17
+ origin: 'http://localhost:6800',
18
+ })
19
+ })
20
+
21
+ it('store url to display url', async () => {
22
+ const { displayedToStored, storedToDisplayed } = await import('./assetUrl')
23
+ // Convert a valid URL as stored
24
+ expect(storedToDisplayed('/assets/test.webp', 'test-id', 'test-connector'))
25
+ .toBe('/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector')
26
+ // Convert a URL which is already as displayed
27
+ expect(storedToDisplayed('/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector', 'test-id', 'test-connector'))
28
+ .toBe('/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector')
29
+ })
30
+
31
+ it('display url to store url', async () => {
32
+ const { displayedToStored, storedToDisplayed } = await import('./assetUrl')
33
+ // Convert a valid URL as displayed
34
+ expect(displayedToStored('/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector'))
35
+ .toBe('/assets/test.webp')
36
+ // Convert a URL which is already as stored
37
+ expect(displayedToStored('/assets/test.webp'))
38
+ .toBe('/assets/test.webp')
39
+ })
40
+
41
+ it('store url to display url with a root path', async () => {
42
+ Object.assign(window.location, {
43
+ href: 'http://localhost:6800/silex',
44
+ pathname: '/silex',
45
+ origin: 'http://localhost:6800',
46
+ })
47
+ const { displayedToStored, storedToDisplayed } = await import('./assetUrl')
48
+ // Convert a valid URL as stored
49
+ expect(storedToDisplayed('/assets/test.webp', 'test-id', 'test-connector'))
50
+ .toBe('/silex/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector')
51
+ // Convert a URL which is already as displayed
52
+ expect(storedToDisplayed('/silex/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector', 'test-id', 'test-connector'))
53
+ .toBe('/silex/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector')
54
+ })
55
+
56
+ it('display url to store url with a root path', async () => {
57
+ Object.assign(window.location, {
58
+ href: 'http://localhost:6800/silex',
59
+ pathname: '/silex',
60
+ origin: 'http://localhost:6800',
61
+ })
62
+ const { displayedToStored, storedToDisplayed } = await import('./assetUrl')
63
+ // Convert a valid URL as displayed
64
+ expect(displayedToStored('/silex/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector'))
65
+ .toBe('/assets/test.webp')
66
+ // Convert a URL which is already as stored
67
+ expect(displayedToStored('/assets/test.webp'))
68
+ .toBe('/assets/test.webp')
69
+ })
70
+
71
+ it('store url to display url with escapable chars', async () => {
72
+ Object.assign(window.location, {
73
+ href: 'http://localhost:6800/silex%20with%20spaces',
74
+ pathname: '/silex%20with%20spaces',
75
+ origin: 'http://localhost:6800',
76
+ })
77
+ const { displayedToStored, storedToDisplayed } = await import('./assetUrl')
78
+ // Convert a valid URL as displayed
79
+ expect(displayedToStored('/silex%20with%20spaces/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector'))
80
+ .toBe('/assets/test.webp')
81
+ // Convert a URL which is already as stored
82
+ expect(displayedToStored('/assets/test.webp'))
83
+ .toBe('/assets/test.webp')
84
+ })
85
+
86
+ it('display url to store url with escapable chars', async () => {
87
+ Object.assign(window.location, {
88
+ href: 'http://localhost:6800/silex%20with%20spaces',
89
+ pathname: '/silex%20with%20spaces',
90
+ origin: 'http://localhost:6800',
91
+ })
92
+ const { displayedToStored, storedToDisplayed } = await import('./assetUrl')
93
+ // Convert a valid URL as stored
94
+ expect(storedToDisplayed('/assets/test.webp', 'test-id', 'test-connector'))
95
+ .toBe('/silex with spaces/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector')
96
+ // Convert a URL which is already as displayed
97
+ expect(storedToDisplayed('/silex%20with%20spaces/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector', 'test-id', 'test-connector'))
98
+ .toBe('/silex%20with%20spaces/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector')
99
+ expect(storedToDisplayed('/silex with spaces/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector', 'test-id', 'test-connector'))
100
+ .toBe('/silex with spaces/api/website/assets/test.webp?websiteId=test-id&connectorId=test-connector')
101
+ })
102
+
103
+ it('store url to display url with escapable website id and connector id', async () => {
104
+ const { displayedToStored, storedToDisplayed } = await import('./assetUrl')
105
+ // Convert a valid URL as displayed
106
+ expect(displayedToStored('/api/website/assets/test.webp?websiteId=test%20id&connectorId=test%20connector'))
107
+ .toBe('/assets/test.webp')
108
+ // Convert a URL which is already as stored
109
+ expect(displayedToStored('/assets/test.webp'))
110
+ .toBe('/assets/test.webp')
111
+ })
112
+
113
+ it('display url to store url with escapable website id and connector id', async () => {
114
+ const { displayedToStored, storedToDisplayed } = await import('./assetUrl')
115
+ const websiteId = 'test id'
116
+ const websiteIdEncoded = 'test+id'
117
+ const connectorId = 'test connector'
118
+ const connectorIdEncoded = 'test+connector'
119
+ // Convert a valid URL as stored
120
+ expect(storedToDisplayed('/assets/test.webp', websiteId, connectorId))
121
+ .toBe(`/api/website/assets/test.webp?websiteId=${websiteIdEncoded}&connectorId=${connectorIdEncoded}`)
122
+ // Convert a URL which is already as displayed
123
+ expect(storedToDisplayed(`/api/website/assets/test.webp?websiteId=${websiteIdEncoded}&connectorId=${connectorIdEncoded}`, websiteId, connectorId))
124
+ .toBe(`/api/website/assets/test.webp?websiteId=${websiteIdEncoded}&connectorId=${connectorIdEncoded}`)
125
+ })
126
+
127
+ it('multiple backgrounds', async () => {
128
+ // // FIXME: this should mock the functions but it doesnt
129
+ // const mocked = {
130
+ // displayedToStored: jest.fn((url: string) => url),
131
+ // storedToDisplayed: jest.fn((url: string) => url),
132
+ // }
133
+ // jest.mock('./assetUrl', () => (mocked))
134
+ //addTempDataToStyles([toStyle(bgImageDisplayed)], websiteId, connectorId)
135
+ //expect(mocked.displayedToStored).toBeCalledTimes(1)
136
+ const { addTempDataToStyles } = await import('./assetUrl')
137
+
138
+ const websiteId = 'test-id'
139
+ const connectorId = 'test-connector'
140
+ const bgImageDisplayed = `linear-gradient(to right, #1fb101 0%, #df1313 67%, rgba(234, 97, 97, 255) 78%, white 100%), url('/api/website/assets/qIg7JPRc.webp?websiteId=${websiteId}&connectorId=${connectorId}'), linear-gradient(#0ca311 0%, #0ca311 100%)`
141
+ const bgImageStored = 'linear-gradient(to right, #1fb101 0%, #df1313 67%, rgba(234, 97, 97, 255) 78%, white 100%), url(\'/assets/qIg7JPRc.webp\'), linear-gradient(#0ca311 0%, #0ca311 100%)'
142
+ const selectors = ['body']
143
+ function toStyle(bgImage: string) {
144
+ return {
145
+ style: {
146
+ 'background-image': bgImage,
147
+ },
148
+ selectors,
149
+ }
150
+ }
151
+ // From stored to displayed
152
+ expect(addTempDataToStyles([toStyle(bgImageStored)], websiteId, connectorId))
153
+ .toEqual([toStyle(bgImageDisplayed)])
154
+ // From displayed to displayed (error case)
155
+ expect(addTempDataToStyles([toStyle(bgImageDisplayed)], websiteId, connectorId))
156
+ .toEqual([toStyle(bgImageDisplayed)])
157
+ // From displayed to stored
158
+ expect(removeTempDataFromStyles([toStyle(bgImageDisplayed)]))
159
+ .toEqual([toStyle(bgImageStored)])
160
+ //// From stored to stored (error case)
161
+ expect(removeTempDataFromStyles([toStyle(bgImageStored)]))
162
+ .toEqual([toStyle(bgImageStored)])
163
+ })
164
+ })