@silexlabs/silex 3.0.0-alpha.49 → 3.0.0-alpha.51

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 (119) hide show
  1. package/dist/client/client/config.d.ts +14 -1
  2. package/dist/client/client/grapesjs/PublicationManager.d.ts +2 -7
  3. package/dist/client/client/publication-transformers.d.ts +41 -0
  4. package/dist/client/css/admin.css +4 -1
  5. package/dist/client/js/main.js +3 -3
  6. package/dist/client/types.d.ts +18 -16
  7. package/dist/plugins/client/client/api.d.ts +83 -0
  8. package/dist/plugins/client/client/api.js +105 -0
  9. package/dist/plugins/client/client/api.js.map +1 -0
  10. package/dist/plugins/client/client/config.d.ts +58 -0
  11. package/dist/plugins/client/client/config.js +80 -0
  12. package/dist/plugins/client/client/config.js.map +1 -0
  13. package/dist/plugins/client/client/events.js +2 -0
  14. package/dist/plugins/client/client/events.js.map +1 -1
  15. package/dist/plugins/client/client/grapesjs/LoginDialog.d.ts +15 -0
  16. package/dist/plugins/client/client/grapesjs/LoginDialog.js +193 -0
  17. package/dist/plugins/client/client/grapesjs/LoginDialog.js.map +1 -0
  18. package/dist/plugins/client/client/grapesjs/PublicationManager.d.ts +70 -0
  19. package/dist/plugins/client/client/grapesjs/PublicationManager.js +310 -0
  20. package/dist/plugins/client/client/grapesjs/PublicationManager.js.map +1 -0
  21. package/dist/plugins/client/client/grapesjs/PublicationUi.d.ts +61 -0
  22. package/dist/plugins/client/client/grapesjs/PublicationUi.js +324 -0
  23. package/dist/plugins/client/client/grapesjs/PublicationUi.js.map +1 -0
  24. package/dist/plugins/client/client/grapesjs/blocks.d.ts +1 -0
  25. package/dist/plugins/client/client/grapesjs/blocks.js +37 -0
  26. package/dist/plugins/client/client/grapesjs/blocks.js.map +1 -0
  27. package/dist/plugins/client/client/grapesjs/index.d.ts +5 -0
  28. package/dist/plugins/client/client/grapesjs/index.js +264 -0
  29. package/dist/plugins/client/client/grapesjs/index.js.map +1 -0
  30. package/dist/plugins/client/client/grapesjs/internal-links.d.ts +1 -0
  31. package/dist/plugins/client/client/grapesjs/internal-links.js +220 -0
  32. package/dist/plugins/client/client/grapesjs/internal-links.js.map +1 -0
  33. package/dist/plugins/client/client/grapesjs/new-page-dialog.d.ts +2 -0
  34. package/dist/plugins/client/client/grapesjs/new-page-dialog.js +83 -0
  35. package/dist/plugins/client/client/grapesjs/new-page-dialog.js.map +1 -0
  36. package/dist/plugins/client/client/grapesjs/openImport.d.ts +9 -0
  37. package/dist/plugins/client/client/grapesjs/openImport.js +74 -0
  38. package/dist/plugins/client/client/grapesjs/openImport.js.map +1 -0
  39. package/dist/plugins/client/client/grapesjs/page-panel.d.ts +3 -0
  40. package/dist/plugins/client/client/grapesjs/page-panel.js +113 -0
  41. package/dist/plugins/client/client/grapesjs/page-panel.js.map +1 -0
  42. package/dist/plugins/client/client/grapesjs/project-bar.d.ts +1 -0
  43. package/dist/plugins/client/client/grapesjs/project-bar.js +106 -0
  44. package/dist/plugins/client/client/grapesjs/project-bar.js.map +1 -0
  45. package/dist/plugins/client/client/grapesjs/rich-text.d.ts +1 -0
  46. package/dist/plugins/client/client/grapesjs/rich-text.js +31 -0
  47. package/dist/plugins/client/client/grapesjs/rich-text.js.map +1 -0
  48. package/dist/plugins/client/client/grapesjs/semantic.d.ts +1 -0
  49. package/dist/plugins/client/client/grapesjs/semantic.js +110 -0
  50. package/dist/plugins/client/client/grapesjs/semantic.js.map +1 -0
  51. package/dist/plugins/client/client/grapesjs/settings.d.ts +2 -0
  52. package/dist/plugins/client/client/grapesjs/settings.js +197 -0
  53. package/dist/plugins/client/client/grapesjs/settings.js.map +1 -0
  54. package/dist/plugins/client/client/grapesjs/storage.d.ts +1 -0
  55. package/dist/plugins/client/client/grapesjs/storage.js +124 -0
  56. package/dist/plugins/client/client/grapesjs/storage.js.map +1 -0
  57. package/dist/plugins/client/client/grapesjs/symbolDialogs.d.ts +3 -0
  58. package/dist/plugins/client/client/grapesjs/symbolDialogs.js +36 -0
  59. package/dist/plugins/client/client/grapesjs/symbolDialogs.js.map +1 -0
  60. package/dist/plugins/client/client/publication-transformers.d.ts +41 -0
  61. package/dist/plugins/client/client/publication-transformers.js +165 -0
  62. package/dist/plugins/client/client/publication-transformers.js.map +1 -0
  63. package/dist/plugins/client/constants.d.ts +29 -0
  64. package/dist/plugins/client/constants.js +46 -0
  65. package/dist/plugins/client/constants.js.map +1 -0
  66. package/dist/plugins/client/plugins/client/11ty.d.ts +17 -0
  67. package/dist/plugins/client/plugins/client/11ty.js +70 -0
  68. package/dist/plugins/client/plugins/client/11ty.js.map +1 -0
  69. package/dist/plugins/client/plugins/client/publicationRenderer.js +59 -21
  70. package/dist/plugins/client/plugins/client/publicationRenderer.js.map +1 -1
  71. package/dist/plugins/client/plugins/client/website-info.js +1 -1
  72. package/dist/plugins/client/plugins/client/website-info.js.map +1 -1
  73. package/dist/plugins/client/types.d.ts +18 -16
  74. package/dist/plugins/client/types.js.map +1 -1
  75. package/dist/plugins/server/plugins/server/FtpConnector.d.ts +2 -1
  76. package/dist/plugins/server/plugins/server/FtpConnector.js +5 -6
  77. package/dist/plugins/server/plugins/server/FtpConnector.js.map +1 -1
  78. package/dist/plugins/server/plugins/server/GitlabConnector.d.ts +1 -7
  79. package/dist/plugins/server/plugins/server/GitlabConnector.js +124 -112
  80. package/dist/plugins/server/plugins/server/GitlabConnector.js.map +1 -1
  81. package/dist/plugins/server/server/connectors/FsHosting.d.ts +2 -1
  82. package/dist/plugins/server/server/connectors/FsHosting.js +4 -5
  83. package/dist/plugins/server/server/connectors/FsHosting.js.map +1 -1
  84. package/dist/plugins/server/server/connectors/FsStorage.js +1 -0
  85. package/dist/plugins/server/server/connectors/FsStorage.js.map +1 -1
  86. package/dist/plugins/server/server/connectors/connectors.d.ts +2 -1
  87. package/dist/plugins/server/server/connectors/connectors.js.map +1 -1
  88. package/dist/plugins/server/server/jobs.d.ts +6 -0
  89. package/dist/plugins/server/server/jobs.js +3 -1
  90. package/dist/plugins/server/server/jobs.js.map +1 -1
  91. package/dist/plugins/server/types.d.ts +18 -16
  92. package/dist/plugins/server/types.js.map +1 -1
  93. package/dist/server/server/api/publicationApi.js +14 -20
  94. package/dist/server/server/connectors/FsHosting.js +4 -5
  95. package/dist/server/server/connectors/FsStorage.js +1 -0
  96. package/dist/server/server/jobs.js +2 -1
  97. package/package.json +1 -1
  98. package/public/silex.js +23 -0
  99. package/src/css/website-info.scss +4 -1
  100. package/src/ts/client/config.ts +22 -2
  101. package/src/ts/client/events.ts +3 -0
  102. package/src/ts/client/grapesjs/PublicationManager.ts +23 -3
  103. package/src/ts/client/grapesjs/internal-links.ts +0 -2
  104. package/src/ts/client/grapesjs/storage.ts +1 -1
  105. package/src/ts/client/index.ts +4 -0
  106. package/src/ts/client/publication-transformers.test.ts +146 -0
  107. package/src/ts/client/publication-transformers.ts +188 -0
  108. package/src/ts/plugins/client/11ty.ts +89 -0
  109. package/src/ts/plugins/client/publicationRenderer.ts +64 -22
  110. package/src/ts/plugins/client/website-info.ts +1 -1
  111. package/src/ts/plugins/server/FtpConnector.ts +3 -3
  112. package/src/ts/plugins/server/GitlabConnector.ts +128 -109
  113. package/src/ts/server/api/publicationApi.ts +16 -23
  114. package/src/ts/server/connectors/FsHosting.ts +2 -2
  115. package/src/ts/server/connectors/FsStorage.ts +1 -0
  116. package/src/ts/server/connectors/connectors.ts +3 -1
  117. package/src/ts/server/jobs.ts +10 -0
  118. package/src/ts/server/utils/BackwardCompat.ts +530 -529
  119. package/src/ts/types.ts +20 -17
@@ -0,0 +1 @@
1
+ export declare const internalLinksPlugin: any;
@@ -0,0 +1,220 @@
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
+ import { html, render } from 'lit-html';
18
+ import { map } from 'lit-html/directives/map.js';
19
+ import grapesjs from 'grapesjs/dist/grapes.min.js';
20
+ import { getPageLink } from '../../page';
21
+ // constants
22
+ const pluginName = 'internal-links';
23
+ const options = [
24
+ { id: '', name: '-' },
25
+ { id: 'url', name: 'URL' },
26
+ { id: 'email', name: 'Email' },
27
+ { id: 'page', name: 'Page' },
28
+ ];
29
+ // plugin code
30
+ export const internalLinksPlugin = grapesjs.plugins.add(pluginName, (editor, opts) => {
31
+ // update links when a page link changes
32
+ function onAll(cbk) {
33
+ editor.Pages.getAll()
34
+ .forEach(page => {
35
+ page.getMainComponent()
36
+ .onAll(cbk);
37
+ });
38
+ }
39
+ editor.on('page', ({ event, page }) => {
40
+ if (!page)
41
+ return; // fixes UT
42
+ switch (event) {
43
+ case 'change:name':
44
+ // update all links to this page
45
+ onAll(component => {
46
+ if (component.getAttributes().href === getPageLink(page.previous('name'))) {
47
+ component.setAttributes({
48
+ href: getPageLink(page.get('name')),
49
+ });
50
+ }
51
+ });
52
+ break;
53
+ case 'remove':
54
+ // mark all links as issues
55
+ const issues = [];
56
+ onAll(component => {
57
+ console.log(component.getAttributes().href, getPageLink(page.previous('name')), page.previous('name'));
58
+ if (component.getAttributes().href === getPageLink(page.previous('name'))) {
59
+ issues.push(component);
60
+ }
61
+ });
62
+ opts?.onError(issues);
63
+ break;
64
+ }
65
+ });
66
+ // utility functions to render the UI
67
+ function getUi(type, href) {
68
+ switch (type) {
69
+ case 'email':
70
+ const mailTo = href.replace('mailto:', '').split('?');
71
+ const email = mailTo[0];
72
+ const params = (mailTo[1] || '').split('&').reduce((acc, item) => {
73
+ const items = item.split('=');
74
+ acc[items[0]] = items[1];
75
+ return acc;
76
+ }, {});
77
+ return html `<div class="href-next__email-inputs">
78
+ <label for="href-next__email" class="gjs-one-bg silex-label">Email address</label>
79
+ <input class="href-next__email" placeholder="Insert email" type="email" value=${email || ''}/>
80
+ <label for="href-next__email-subject" class="gjs-one-bg silex-label">Subject</label>
81
+ <input class="href-next__email-subject" placeholder="Insert subject" value=${params.subject || ''}/>
82
+ </div>`;
83
+ case 'page':
84
+ return html `<div class="href-next__page-inputs">
85
+ <label for="href-next__page" class="gjs-one-bg silex-label">Page name</label>
86
+ <select id="href-next__page" class="href-next__page">
87
+ ${map(editor.Pages.getAll(), page => html `<option
88
+ ?selected=${getPageLink(page.getName()) === href}
89
+ value=${getPageLink(page.getName())}>
90
+ ${page.getName() || 'Main'}
91
+ </option>`)}
92
+ </select>
93
+ </div>`;
94
+ case 'url':
95
+ return html `<div class="href-next__url-inputs">
96
+ <label for="href-next__url" class="gjs-one-bg silex-label">URL</label>
97
+ <input class="href-next__url" placeholder="Insert URL" type="url" value=${href}/>
98
+ </div>`;
99
+ default:
100
+ return '';
101
+ }
102
+ }
103
+ function getDefaultHref(type) {
104
+ switch (type) {
105
+ case 'email': return 'mailto:';
106
+ case 'page': return getPageLink();
107
+ case 'url': return 'https://';
108
+ }
109
+ }
110
+ function doRender(el, href = '') {
111
+ const type = getType(href);
112
+ const ui = getUi(type, href);
113
+ render(html `
114
+ <label for="href-next__type" class="gjs-one-bg silex-label">Type</label>
115
+ <select id="href-next__type" class="href-next__type" @change=${event => doRender(el, getDefaultHref(event.target.value))}>
116
+ ${map(options, opt => html `
117
+ <option value="${opt.id}" ?selected=${type === opt.id}>${opt.name}</option>
118
+ `)}
119
+ </select>
120
+ ${ui}
121
+ `, el);
122
+ }
123
+ function getType(href) {
124
+ if (href.indexOf('mailto:') === 0) {
125
+ return 'email';
126
+ }
127
+ else if (href.indexOf('./') === 0) {
128
+ return 'page';
129
+ }
130
+ else if (href) {
131
+ return 'url';
132
+ }
133
+ return '';
134
+ }
135
+ function doRenderCurrent(el) {
136
+ doRender(el, editor.getSelected()?.getAttributes().href || '');
137
+ }
138
+ // Add the new trait to all component types
139
+ editor.DomComponents.getTypes().map(type => {
140
+ editor.DomComponents.addType(type.id, {
141
+ model: {
142
+ defaults: {
143
+ traits: [
144
+ // Keep the type original traits
145
+ ...editor.DomComponents.getType(type.id).model.prototype.defaults.traits
146
+ // Filter original href trait
147
+ .filter(trait => trait.name ? trait.name !== 'href' : trait !== 'href'),
148
+ // Add the new trait
149
+ {
150
+ label: 'Link',
151
+ type: 'href-next',
152
+ name: 'href',
153
+ },
154
+ ]
155
+ }
156
+ }
157
+ });
158
+ });
159
+ editor.TraitManager.addType('href-next', {
160
+ createInput({ trait }) {
161
+ // Create a new element container and add some content
162
+ const el = document.createElement('div');
163
+ // update the UI when a page is added/renamed/removed
164
+ editor.on('page', () => doRenderCurrent(el));
165
+ doRenderCurrent(el);
166
+ // this will be the element passed to onEvent and onUpdate
167
+ return el;
168
+ },
169
+ // Update the component based on UI changes
170
+ // `elInput` is the result HTMLElement you get from `createInput`
171
+ onEvent({ elInput, component, event }) {
172
+ const inputType = elInput.querySelector('.href-next__type');
173
+ let href = '';
174
+ // Compute the new HREF value
175
+ switch (inputType.value) {
176
+ case 'page':
177
+ const valPage = elInput.querySelector('.href-next__page')?.value;
178
+ href = valPage || getDefaultHref('page');
179
+ break;
180
+ case 'url':
181
+ const valUrl = elInput.querySelector('.href-next__url')?.value;
182
+ href = valUrl || getDefaultHref('url');
183
+ break;
184
+ case 'email':
185
+ const valEmail = elInput.querySelector('.href-next__email')?.value;
186
+ const valSubj = elInput.querySelector('.href-next__email-subject')?.value;
187
+ href = valEmail ? `mailto:${valEmail}${valSubj ? `?subject=${valSubj}` : ''}` : getDefaultHref('email');
188
+ break;
189
+ default:
190
+ href = '';
191
+ }
192
+ // Store the new HREF value
193
+ component.addAttributes({ href });
194
+ // Handle the tag name
195
+ if (href === '') {
196
+ // Not a link
197
+ if (component.get('tagName').toUpperCase() === 'A') {
198
+ // Retrieve the original stored value
199
+ const original = component.get('originalTagName') ?? 'DIV';
200
+ // Case of the inline A tags inserted by the text bar
201
+ const value = original.toUpperCase() === 'A' ? 'SPAN' : original;
202
+ component.set('tagName', value);
203
+ }
204
+ }
205
+ else {
206
+ // Link
207
+ if (component.get('tagName').toUpperCase() !== 'A') {
208
+ component.set('originalTagName', component.get('tagName'));
209
+ component.set('tagName', 'A');
210
+ }
211
+ }
212
+ },
213
+ // Update UI on the component change
214
+ onUpdate({ elInput, component }) {
215
+ const href = component.getAttributes().href || '';
216
+ doRender(elInput, href);
217
+ },
218
+ });
219
+ });
220
+ //# sourceMappingURL=internal-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-links.js","sourceRoot":"","sources":["../../../../../src/ts/client/grapesjs/internal-links.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAC,IAAI,EAAE,MAAM,EAAC,MAAM,UAAU,CAAA;AACrC,OAAO,EAAC,GAAG,EAAC,MAAM,4BAA4B,CAAA;AAC9C,OAAO,QAAQ,MAAM,6BAA6B,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,YAAY;AACZ,MAAM,UAAU,GAAG,gBAAgB,CAAA;AACnC,MAAM,OAAO,GAA0B;IACrC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;IACrB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;IAC1B,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;IAC9B,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;CAC7B,CAAA;AAED,cAAc;AACd,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;IACnF,wCAAwC;IACxC,SAAS,KAAK,CAAC,GAAG;QAChB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;aAClB,OAAO,CAAC,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,gBAAgB,EAAE;iBACpB,KAAK,CAAC,GAAG,CAAC,CAAA;QACf,CAAC,CAAC,CAAA;IACN,CAAC;IACD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QACpC,IAAG,CAAC,IAAI;YAAE,OAAM,CAAC,WAAW;QAC5B,QAAQ,KAAK,EAAE;YACf,KAAK,aAAa;gBAChB,gCAAgC;gBAChC,KAAK,CAAC,SAAS,CAAC,EAAE;oBAChB,IAAG,SAAS,CAAC,aAAa,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;wBACxE,SAAS,CAAC,aAAa,CAAC;4BACtB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;yBACpC,CAAC,CAAA;qBACH;gBACH,CAAC,CAAC,CAAA;gBACF,MAAK;YACP,KAAK,QAAQ;gBACX,2BAA2B;gBAC3B,MAAM,MAAM,GAAG,EAAE,CAAA;gBACjB,KAAK,CAAC,SAAS,CAAC,EAAE;oBAChB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;oBACtG,IAAG,SAAS,CAAC,aAAa,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE;wBACxE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;qBACvB;gBACH,CAAC,CAAC,CAAA;gBACF,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrB,MAAK;SACN;IACH,CAAC,CAAC,CAAA;IACF,qCAAqC;IACrC,SAAS,KAAK,CAAC,IAAI,EAAE,IAAI;QACvB,QAAQ,IAAI,EAAE;YACd,KAAK,OAAO;gBACV,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACrD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;gBACvB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;oBAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBAC7B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;oBACxB,OAAO,GAAG,CAAA;gBACZ,CAAC,EAAE,EAAE,CAAC,CAAA;gBACN,OAAO,IAAI,CAAA;;4FAE2E,KAAK,IAAI,EAAE;;yFAEb,MAAM,CAAC,OAAO,IAAI,EAAG;iBAC9F,CAAA;YACb,KAAK,MAAM;gBACT,OAAO,IAAI,CAAA;;;gBAIf,GAAG,CAAgB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAA;8BAC1B,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI;0BACxC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;sBAC/B,IAAI,CAAC,OAAO,EAAE,IAAI,MAAM;0BACpB,CAC1B;;iBAEiB,CAAA;YACb,KAAK,KAAK;gBACR,OAAO,IAAI,CAAA;;oFAEoE,IAAK;eAC3E,CAAA;YACX;gBACE,OAAO,EAAE,CAAA;SACV;IACH,CAAC;IACD,SAAS,cAAc,CAAC,IAAI;QAC1B,QAAO,IAAI,EAAE;YACb,KAAK,OAAO,CAAC,CAAC,OAAO,SAAS,CAAA;YAC9B,KAAK,MAAM,CAAC,CAAC,OAAO,WAAW,EAAE,CAAA;YACjC,KAAK,KAAK,CAAC,CAAC,OAAO,UAAU,CAAA;SAC5B;IACH,CAAC;IACD,SAAS,QAAQ,CAAC,EAAe,EAAE,IAAI,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAE5B,MAAM,CAAC,IAAI,CAAA;;qEAEsD,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;UACpH,GAAG,CAAwB,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA;2BAC9B,GAAG,CAAC,EAAE,eAAe,IAAI,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI;SAClE,CAAC;;QAED,EAAG;KACP,EAAE,EAAE,CAAC,CAAA;IACR,CAAC;IACD,SAAS,OAAO,CAAC,IAAY;QAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACjC,OAAO,OAAO,CAAA;SACf;aAAM,IAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAC;YACjC,OAAO,MAAM,CAAA;SACd;aAAM,IAAG,IAAI,EAAC;YACb,OAAO,KAAK,CAAA;SACb;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IACD,SAAS,eAAe,CAAC,EAAE;QACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAChE,CAAC;IAED,2CAA2C;IAC3C,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACzC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;YACpC,KAAK,EAAE;gBACL,QAAQ,EAAE;oBACR,MAAM,EAAE;wBACN,gCAAgC;wBAChC,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM;4BACxE,6BAA6B;6BAC1B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC;wBACzE,oBAAoB;wBACpB;4BACE,KAAK,EAAE,MAAM;4BACb,IAAI,EAAE,WAAW;4BACjB,IAAI,EAAE,MAAM;yBACb;qBACF;iBACF;aACF;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE;QACvC,WAAW,CAAC,EAAE,KAAK,EAAE;YACnB,sDAAsD;YACtD,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YACxC,qDAAqD;YACrD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAA;YAC5C,eAAe,CAAC,EAAE,CAAC,CAAA;YACnB,0DAA0D;YAC1D,OAAO,EAAE,CAAA;QACX,CAAC;QACD,2CAA2C;QAC3C,iEAAiE;QACjE,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE;YACnC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAA;YAC3D,IAAI,IAAI,GAAG,EAAE,CAAA;YACb,6BAA6B;YAC7B,QAAQ,SAAS,CAAC,KAAK,EAAE;gBACzB,KAAK,MAAM;oBACT,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAA;oBAChE,IAAI,GAAG,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;oBACxC,MAAK;gBACP,KAAK,KAAK;oBACR,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAA;oBAC9D,IAAI,GAAG,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,CAAA;oBACtC,MAAK;gBACP,KAAK,OAAO;oBACV,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAA;oBAClE,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,2BAA2B,CAAC,EAAE,KAAK,CAAA;oBACzE,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,cAAc,CAAC,OAAO,CAAC,CAAA;oBACxG,MAAK;gBACP;oBACE,IAAI,GAAG,EAAE,CAAA;aACV;YAED,2BAA2B;YAC3B,SAAS,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;YAEjC,sBAAsB;YACtB,IAAG,IAAI,KAAK,EAAE,EAAE;gBACd,aAAa;gBACb,IAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,EAAC;oBAChD,qCAAqC;oBACrC,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAA;oBAC1D,qDAAqD;oBACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAA;oBAChE,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;iBAChC;aACF;iBAAM;gBACL,OAAO;gBACP,IAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;oBACjD,SAAS,CAAC,GAAG,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;oBAC1D,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;iBAC9B;aACF;QACH,CAAC;QACD,oCAAoC;QACpC,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE;YAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC,IAAI,IAAI,EAAE,CAAA;YACjD,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const cmdOpenNewPageDialog = "new-page-dialog";
2
+ export declare const newPageDialog: any;
@@ -0,0 +1,83 @@
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
+ import * as grapesjs from 'grapesjs/dist/grapes.min.js';
18
+ import { html, render } from 'lit-html';
19
+ import { live } from 'lit-html/directives/live.js';
20
+ const name = 'new-page-dialog';
21
+ const el = document.createElement('div');
22
+ let modal;
23
+ export const cmdOpenNewPageDialog = 'new-page-dialog';
24
+ export const newPageDialog = grapesjs.plugins.add(name, (editor, opts) => {
25
+ editor.Commands.add(cmdOpenNewPageDialog, {
26
+ run: (_, sender, { page }) => {
27
+ modal = editor.Modal.open({
28
+ title: 'New Page',
29
+ content: '',
30
+ attributes: { class: 'new-page-dialog' },
31
+ })
32
+ .onceClose(() => {
33
+ editor.stopCommand(cmdOpenNewPageDialog); // apparently this is needed to be able to run the command several times
34
+ });
35
+ displayDialog(editor, opts, page);
36
+ modal.setContent(el);
37
+ const form = el.querySelector('form');
38
+ form.onsubmit = event => {
39
+ event.preventDefault();
40
+ saveDialog(editor, opts, page);
41
+ editor.stopCommand(cmdOpenNewPageDialog);
42
+ };
43
+ form.querySelector('input')?.focus();
44
+ return modal;
45
+ },
46
+ stop: () => {
47
+ modal.close();
48
+ // el.innerHTML = ''
49
+ },
50
+ });
51
+ });
52
+ function onImport(editor, page) {
53
+ editor.Pages.select(page);
54
+ editor.runCommand('gjs-open-import-webpage');
55
+ }
56
+ function displayDialog(editor, config, page) {
57
+ render(html `
58
+ <form class="silex-form">
59
+ <label class="silex-form__element">
60
+ <h3>Name</h3>
61
+ <input type="text" name="name" .value=${live(page.getName() || '')}/>
62
+ </label>
63
+ <footer>
64
+ <input class="silex-button" type="button" @click=${e => onImport(editor, page)} value="Import from website">
65
+ <input class="silex-button" type="button" @click=${e => editor.stopCommand(cmdOpenNewPageDialog)} value="Cancel">
66
+ <input class="silex-button" type="submit" value="Ok">
67
+ </footer>
68
+ </form>
69
+ `, el);
70
+ }
71
+ function saveDialog(editor, config, page) {
72
+ const form = el.querySelector('form');
73
+ const formData = new FormData(form);
74
+ const data = Array.from(formData)
75
+ .reduce((aggregate, [key, value]) => {
76
+ aggregate[key] = value;
77
+ return aggregate;
78
+ }, {});
79
+ page.set(data);
80
+ // save if auto save is on
81
+ editor.getModel().set('changesCount', editor.getDirtyCount() + 1);
82
+ }
83
+ //# sourceMappingURL=new-page-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-page-dialog.js","sourceRoot":"","sources":["../../../../../src/ts/client/grapesjs/new-page-dialog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview Import feature
3
+ * Let the user import HTML code when she creates a new page
4
+ *
5
+ */
6
+ export default function openImport(editor: any, config: any): {
7
+ run(_: any): void;
8
+ stop(): void;
9
+ };
@@ -0,0 +1,74 @@
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
+ * @fileoverview Import feature
19
+ * Let the user import HTML code when she creates a new page
20
+ *
21
+ */
22
+ // from https://github.com/artf/grapesjs-preset-webpage/blob/3e5a9e12998c9a32b6f1199953084163678e6c17/src/commands/openImport.js
23
+ export default function openImport(editor, config) {
24
+ const pfx = editor.getConfig('stylePrefix');
25
+ const modal = editor.Modal;
26
+ const codeViewer = editor.CodeManager.getViewer('CodeMirror').clone();
27
+ const container = document.createElement('div');
28
+ const importLabel = config.modalImportLabel;
29
+ const importCnt = config.modalImportContent;
30
+ let viewerEditor = codeViewer.editor;
31
+ // Init import button
32
+ const btnImp = document.createElement('button');
33
+ btnImp.type = 'button';
34
+ btnImp.innerHTML = config.modalImportButton;
35
+ btnImp.className = `${pfx}btn-prim ${pfx}btn-import`;
36
+ btnImp.onclick = e => {
37
+ editor.setComponents(viewerEditor.getValue().trim());
38
+ modal.close();
39
+ };
40
+ // Init code viewer
41
+ codeViewer.set({ ...{
42
+ codeName: 'htmlmixed',
43
+ theme: 'hopscotch',
44
+ readOnly: 0
45
+ }, ...config.importViewerOptions });
46
+ return {
47
+ run(_) {
48
+ if (!viewerEditor) {
49
+ const txtarea = document.createElement('textarea');
50
+ if (importLabel) {
51
+ const labelEl = document.createElement('div');
52
+ labelEl.className = `${pfx}import-label`;
53
+ labelEl.innerHTML = importLabel;
54
+ container.appendChild(labelEl);
55
+ }
56
+ container.appendChild(txtarea);
57
+ container.appendChild(btnImp);
58
+ codeViewer.init(txtarea);
59
+ viewerEditor = codeViewer.editor;
60
+ }
61
+ modal.setTitle(config.modalImportTitle);
62
+ modal.setContent(container);
63
+ const cnt = typeof importCnt === 'function' ? importCnt(editor) : importCnt;
64
+ codeViewer.setContent(cnt || '');
65
+ modal.open().getModel()
66
+ .once('change:open', () => editor.stopCommand(this.id));
67
+ viewerEditor.refresh();
68
+ },
69
+ stop() {
70
+ modal.close();
71
+ }
72
+ };
73
+ }
74
+ //# sourceMappingURL=openImport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openImport.js","sourceRoot":"","sources":["../../../../../src/ts/client/grapesjs/openImport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;GAIG;AACH,gIAAgI;AAChI,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,MAAM,EAAE,MAAM;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAA;IACrE,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;IAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAA;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,kBAAkB,CAAA;IAC3C,IAAI,YAAY,GAAG,UAAU,CAAC,MAAM,CAAA;IAEpC,qBAAqB;IACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC/C,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAA;IACtB,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAA;IAC3C,MAAM,CAAC,SAAS,GAAG,GAAG,GAAG,YAAY,GAAG,YAAY,CAAA;IACpD,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE;QACnB,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QACpD,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAA;IAED,mBAAmB;IACnB,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG;YAClB,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,CAAC;SACZ,EAAE,GAAG,MAAM,CAAC,mBAAmB,EAAC,CAAC,CAAA;IAElC,OAAO;QACL,GAAG,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,EAAE;gBACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;gBAElD,IAAI,WAAW,EAAE;oBACf,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;oBAC7C,OAAO,CAAC,SAAS,GAAG,GAAG,GAAG,cAAc,CAAA;oBACxC,OAAO,CAAC,SAAS,GAAG,WAAW,CAAA;oBAC/B,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;iBAC/B;gBAED,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;gBAC9B,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;gBAC7B,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACxB,YAAY,GAAG,UAAU,CAAC,MAAM,CAAA;aACjC;YAED,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;YACvC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;YAC3B,MAAM,GAAG,GAAG,OAAO,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAC3E,UAAU,CAAC,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;YAChC,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;iBACpB,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;YACzD,YAAY,CAAC,OAAO,EAAE,CAAA;QACxB,CAAC;QAED,IAAI;YACF,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const cmdTogglePages = "pages:open-panel";
2
+ export declare const cmdAddPage = "pages:add";
3
+ export declare const pagePanelPlugin: any;
@@ -0,0 +1,113 @@
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
+ import * as grapesjs from 'grapesjs/dist/grapes.min.js';
18
+ import { html, render } from 'lit-html';
19
+ const pluginName = 'page-panel';
20
+ let open;
21
+ export const cmdTogglePages = 'pages:open-panel';
22
+ export const cmdAddPage = 'pages:add';
23
+ function selectPage(editor, page) {
24
+ editor.Pages.select(page);
25
+ }
26
+ function addPage(editor, config) {
27
+ const pages = editor.Pages.getAll();
28
+ let idx = 1;
29
+ const newPageName = config.newPageName || 'New page';
30
+ let pageName = newPageName;
31
+ while (pages.find(p => p.getName() === pageName)) {
32
+ pageName = `${newPageName} ${idx++}`;
33
+ }
34
+ const page = editor.Pages.add({ name: pageName });
35
+ editor.runCommand(config.cmdOpenNewPageDialog, { page });
36
+ }
37
+ function removePage(editor, page) {
38
+ if (editor.Pages.getAll().length === 1) {
39
+ console.error('can not delete the only page');
40
+ }
41
+ else {
42
+ const isMain = page.get('type') === 'main';
43
+ const isSelected = editor.Pages.getSelected() === page;
44
+ editor.Pages.remove(page.id);
45
+ const firstPage = editor.Pages.getAll()[0];
46
+ if (isMain)
47
+ firstPage.set('type', 'main');
48
+ if (isSelected)
49
+ selectPage(editor, firstPage);
50
+ }
51
+ }
52
+ function settingsPage(editor, config, page) {
53
+ editor.runCommand(config.cmdOpenSettings, { page });
54
+ }
55
+ function renderPages(editor, config) {
56
+ const pages = editor.Pages.getAll();
57
+ const selected = editor.Pages.getSelected();
58
+ const getPageFromEvent = (e) => {
59
+ const el = e.target.hasAttribute('data-page-id') ? e.target : e.target.parentNode;
60
+ e.stopPropagation();
61
+ return editor.Pages.get(el.getAttribute('data-page-id'));
62
+ };
63
+ return html `<section class="pages">
64
+ <main class="pages__main ${pages.length === 1 ? 'pages__single-page' : ''}">
65
+ <div class="pages__list">
66
+ ${pages.map(page => {
67
+ const name = page.getName() || page.attributes.type;
68
+ // keep the same structure as the layers panel
69
+ return html `
70
+ <div class="pages__page ${selected === page ? 'pages__page-selected' : ''}" data-page-id=${page.id} @click=${e => selectPage(editor, getPageFromEvent(e))}>
71
+ <div class="pages__page-name">
72
+ ${name}
73
+ </div>
74
+ <i class="pages__icon pages__remove-btn fa fa-trash" @click=${e => removePage(editor, getPageFromEvent(e))}></i>
75
+ <i class="pages__icon fa fa-cog" @click=${e => settingsPage(editor, config, getPageFromEvent(e))}></i>
76
+ </div>
77
+ </div>
78
+ `;
79
+ })}
80
+ </div>
81
+ ${pages.length ? '' : html `<div class="flex-row">
82
+ No page yet.
83
+ </div>
84
+ `}
85
+ </main></section>`;
86
+ }
87
+ export const pagePanelPlugin = grapesjs.plugins.add(pluginName, (editor, opts) => {
88
+ // create wrapper
89
+ const el = document.createElement('div');
90
+ el.classList.add('pages__wrapper');
91
+ // update
92
+ const doRender = () => render(renderPages(editor, opts), el);
93
+ editor.on('page', () => {
94
+ doRender();
95
+ });
96
+ editor.on('load', () => {
97
+ open = false;
98
+ document.querySelector(opts.appendTo)
99
+ .appendChild(el);
100
+ doRender();
101
+ // click anywhere close it
102
+ // const close = (event) => {
103
+ // if(open) {
104
+ // editor.stopCommand(cmdTogglePages)
105
+ // //event.preventDefault()
106
+ // }
107
+ // }
108
+ // document.addEventListener('mousedown', close)
109
+ // add command to add pages
110
+ editor.Commands.add(cmdAddPage, () => addPage(editor, opts));
111
+ });
112
+ });
113
+ //# sourceMappingURL=page-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-panel.js","sourceRoot":"","sources":["../../../../../src/ts/client/grapesjs/page-panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const projectBarPlugin: (editor: any, opts: any) => void;
@@ -0,0 +1,106 @@
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
+ import { html, render } from 'lit-html';
18
+ const panelId = 'project-bar-panel';
19
+ const containerPanelId = 'project-bar-container';
20
+ export const projectBarPlugin = (editor, opts) => {
21
+ // create the panels container for all panels in grapesjs
22
+ const containerPanel = editor.Panels.addPanel({
23
+ id: containerPanelId,
24
+ visible: false,
25
+ });
26
+ // create the project bar panel in grapesjs
27
+ const projectBarPanel = editor.Panels.addPanel({
28
+ id: panelId,
29
+ buttons: opts.panels,
30
+ visible: true,
31
+ });
32
+ const panelsEl = opts.panels.map(panel => {
33
+ const el = document.createElement('div');
34
+ // create container for panel
35
+ if (panel.attributes.containerClassName) {
36
+ el.classList.add('project-bar__panel', panel.attributes.containerClassName, 'gjs-hidden');
37
+ // add header
38
+ if (panel.attributes.title) {
39
+ render(html `
40
+ <header class="project-bar__panel-header">
41
+ <h3 class="project-bar__panel-header-title">${panel.attributes.title}</h3>
42
+ ${panel.buttons?.map(button => {
43
+ return html `
44
+ <div
45
+ class="project-bar__panel-header-button ${button.className}"
46
+ @click=${e => editor.runCommand(button.command)}
47
+ ><span>${button.text}</span></div>
48
+ `;
49
+ })}
50
+ </header>
51
+ `, el);
52
+ }
53
+ // temporarily attach it to the body
54
+ // this lets the block manager and other plugins attach to their container
55
+ document.body.appendChild(el);
56
+ // on load attach the panels to the main container
57
+ // this is when the main containerPanel has an element
58
+ editor.on('load', () => {
59
+ const containerPanelEl = containerPanel.view.el;
60
+ containerPanelEl.appendChild(el);
61
+ });
62
+ }
63
+ // commands for show / hide panels
64
+ editor.Commands.add(panel.command, {
65
+ run() {
66
+ if (panel.link) {
67
+ window.open(panel.link);
68
+ }
69
+ if (panel.attributes.containerClassName) {
70
+ containerPanel.set('visible', true);
71
+ el.classList.remove('gjs-hidden');
72
+ editor.Canvas.getFrameEl().classList.add('silex-squeeze-left');
73
+ }
74
+ },
75
+ stop() {
76
+ if (panel.attributes.containerClassName) {
77
+ containerPanel.set('visible', false);
78
+ el.classList.add('gjs-hidden');
79
+ editor.Canvas.getFrameEl().classList.remove('silex-squeeze-left');
80
+ }
81
+ },
82
+ });
83
+ });
84
+ function updateSqueez() {
85
+ const containerPanelEl = containerPanel.view.el;
86
+ const iframe = editor.Canvas.getFrameEl();
87
+ iframe.classList.remove('enable-squeeze');
88
+ setTimeout(() => {
89
+ const left = iframe.getClientRects()[0]?.left;
90
+ const right = containerPanelEl.getClientRects()[0]?.right;
91
+ if (left < right || !right)
92
+ iframe.classList.add('enable-squeeze');
93
+ else
94
+ iframe.classList.remove('enable-squeeze');
95
+ }, 400); // More than the transition duration
96
+ // make sure the squeez corresponds to the state (reset when change page)
97
+ if (containerPanel.get('visible'))
98
+ iframe.classList.add('silex-squeeze-left');
99
+ else
100
+ iframe.classList.remove('silex-squeeze-left');
101
+ }
102
+ editor.on('load device:select page', () => {
103
+ updateSqueez();
104
+ });
105
+ };
106
+ //# sourceMappingURL=project-bar.js.map