@silexlabs/silex-dashboard 1.0.1 → 1.0.3

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.
@@ -1,177 +1,557 @@
1
- <!DOCTYPE html><html lang=""><head><link rel="stylesheet" href="/css/main.css">
1
+
2
+ <!DOCTYPE html>
3
+ <html lang="">
4
+ <head>
5
+ <link rel="stylesheet" href="/css/websites.css" />
6
+
2
7
  <link
3
8
  rel="alternate"
4
9
  hreflang="en"
5
- href="/en/" /> <!--
6
- <div class="app">
7
- <div v-if="showLoginForm">
8
- <h2>Login</h2>
9
- <form @submit.prevent="login">
10
- <label>
11
- Username:
12
- <input type="text" v-model="username" required />
13
- </label>
14
- <label>
15
- Password:
16
- <input type="password" v-model="password" required />
17
- </label>
18
- <button type="submit">Login</button>
19
- </form>
20
- </div>
21
-
22
- <div v-if="loggedIn">
23
- <button @click="showLoginForm = true; loggedIn = false; websites = []">Logout</button>
24
- <h2>Websites</h2>
25
- <ul>
26
- <li v-for="(website, index) in websites" :key="index">
27
- <div v-text="website.name || website.id"></div>
28
- <button @click="deleteWebsite(website.id)">Delete</button>
29
- </li>
30
- </ul>
31
-
32
- <button @click="showCreationForm = true">Create Website</button>
33
-
34
- <div v-if="showCreationForm">
35
- <h2>Create Website</h2>
36
- <form @submit.prevent="createWebsite">
37
- <label>
38
- Website Name:
39
- <input type="text" v-model="newWebsiteName" required />
40
- </label>
41
- <button type="submit">Create</button>
42
- </form>
43
- </div>
44
- </div>
45
-
46
- <div v-if="error">
47
- <p>Error: </p>
48
- <button @click="error = null">Dismiss</button>
49
- </div>
50
-
51
- <div v-if="message">
52
- <p></p>
53
- <button @click="message = null">Dismiss</button>
54
- </div>
55
- </div>
56
- -->
57
- <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
58
- <script>
59
- const { createApp, ref, onMounted, reactive } = Vue;
60
- const apiUrl = 'http://localhost:6805';
61
-
62
- const App = {
63
- data() {
64
- return {
65
- websites: [],
66
- newWebsiteName: '',
67
- showCreationForm: false,
68
- error: null,
69
- message: null,
70
- showLoginForm: false,
71
- username: '',
72
- password: '',
73
- loggedIn: true,
74
- loading: true,
75
- }
76
- },
77
- mounted() {
78
- if (this.loggedIn) this.fetchWebsites()
79
- else this.showLoginForm = true
80
- },
81
- methods: {
82
- openEditor(id) {
83
- window.open(`${apiUrl}/?id=${id}`)
84
- },
85
- async fetchWebsites() {
86
- this.loading = true
87
- try {
88
- const response = await fetch(`${apiUrl}/website/`)
89
- if (!response.ok) {
90
- throw new Error(`HTTP error! status: ${response.status}`)
91
- }
92
- this.websites = await response.json();
93
- } catch (error) {
94
- this.error = 'Erreur, impossible de récupérer la liste des sites'
95
- }
96
- this.loading = false
97
- },
10
+ href="/en/" />
98
11
 
99
- async login() {
100
- this.loading = true
101
- try {
102
- const response = await fetch(`${apiUrl}/me/`, {
103
- method: 'POST',
104
- headers: {
105
- 'Content-Type': 'application/json',
106
- },
107
- body: JSON.stringify({
108
- username: this.username,
109
- password: this.password,
110
- }),
111
- })
112
- if (!response.ok) {
113
- throw new Error(`Erreur HTTP ! status: ${response.status}`)
114
- }
115
- this.loggedIn = true;
116
- this.showLoginForm = false;
117
- await this.fetchWebsites()
118
- } catch (error) {
119
- this.error = 'Failed to log in'
120
- }
121
- this.loading = false
122
- },
12
+ <style>
13
+ .button { cursor: pointer; }
14
+ a { text-decoration: none; }
15
+ a:hover { text-decoration: underline; }
123
16
 
124
- async createWebsite() {
125
- if(!this.newWebsiteName) throw new Error('Vous n\'avez pas donné de nom à votre site')
126
- this.loading = true
127
- try {
128
- const id = this.newWebsiteName.replace(/[/\\?%*:|"<>]/g, '_')
129
- const response = await fetch(`${apiUrl}/website/?id=${id}`, {
130
- method: 'POST',
131
- headers: {
132
- 'Content-Type': 'application/json',
133
- },
134
- body: JSON.stringify({
135
- name: this.newWebsiteName,
136
- }),
137
- })
138
- if (!response.ok) {
139
- throw new Error(`Erreur HTTP ! status: ${response.status}`)
140
- }
141
- this.message = 'Le site a bien été créé'
142
- this.newWebsiteName = ''
143
- this.showCreationForm = false;
144
- await this.fetchWebsites()
145
- } catch (error) {
146
- this.error = 'Erreur, le site n\'a pas été créé'
147
- }
148
- this.loading = false
149
- },
17
+ .skeleton-anim:after {
18
+ width: 100%;
19
+ height: 100%;
20
+ position: absolute;
21
+ top: 0;
22
+ left: 0;
23
+ content: "";
24
+ background:
25
+ linear-gradient(0.25turn, transparent, rgba(255,255,255,.75), transparent),
26
+ linear-gradient(transparent, transparent),
27
+ radial-gradient(38px circle at 19px 19px, transparent 50%, transparent 51%),
28
+ linear-gradient(transparent, transparent);
29
+ background-repeat: no-repeat;
30
+ background-size: 315px 250px, 315px 180px, 100px 100px, 225px 30px;
31
+ background-position: -315px 0, 0 0, 0px 190px, 50px 195px;
32
+ animation: loading 1.5s infinite;
33
+ }
34
+
35
+ @keyframes loading {
36
+ to {
37
+ background-position: 200% 0, 0 0, 0 190px, 50px 195px;
38
+ }
39
+ }
40
+
41
+ </style>
42
+ <script src="/node_modules/vue/dist/vue.global.js"></script>
43
+ <script src="/js/main.js"></script>
44
+ <script type="module">
45
+ const CONNECTORS_PATH = '/connectors/'
46
+ window.addEventListener('load', function() {
47
+ const { createApp } = Vue;
48
+ const { api, constants, types } = silex;
49
+ const {
50
+ ConnectorType,
51
+ } = types
52
+ const {
53
+ getUser,
54
+ logout,
55
+ websiteDelete,
56
+ websiteList,
57
+ websiteCreate,
58
+ websiteMetaWrite,
59
+ } = api
60
+
61
+ const App = {
62
+ data() {
63
+ return {
64
+ websites: [],
65
+ newWebsiteName: '',
66
+ showCreationForm: false,
67
+ error: null,
68
+ message: null,
69
+ loggedIn: false,
70
+ loading: true,
71
+ storage: null,
72
+ user: null,
73
+ showMenu: false,
74
+ }
75
+ },
76
+ mounted() {
77
+ this.init()
78
+ },
79
+
80
+ methods: {
81
+ async init() {
82
+ try {
83
+ // Debug
84
+ window.app = this
85
+ const user = await getUser({type: ConnectorType.STORAGE})
86
+ if(user) {
87
+ this.user = user
88
+ this.loggedIn = true
89
+ this.websites = await websiteList({connectorId: this.user.storage.connectorId})
90
+ this.loading = false
91
+ } else {
92
+ this.openLogin()
93
+ }
94
+ } catch (error) {
95
+ console.error(error)
96
+ this.loading = false
97
+ if(error.code === 401) {
98
+ this.loggedIn = false
99
+ this.openLogin()
100
+ } else {
101
+ this.error = error
102
+ }
103
+ }
104
+ },
150
105
 
151
- async deleteWebsite(id) {
152
- const ok = confirm('Etes vous sûr.e de vouloir supprimer définitivement ce site ?')
153
- if(!ok) return
154
- this.loading = true
155
- try {
156
- const response = await fetch(`${apiUrl}/website/?id=${id}`, {
157
- method: 'DELETE',
158
- })
159
- if (!response.ok) {
160
- throw new Error(`HTTP error! status: ${response.status}`)
161
- }
162
- this.message = 'Le site a bien été effacé'
163
- await this.fetchWebsites()
164
- } catch (error) {
165
- this.error = 'Erreur, le site n\'a pas été effacé'
166
- }
167
- this.loading = false
106
+ openLogin(id, lang) {
107
+ //throw new Error('debug')
108
+ const path = `/fr${CONNECTORS_PATH}`
109
+ console.log(window.location.pathname, window.location.path, path)
110
+ if(window.location.pathname === path) return
111
+ window.open(path, '_self')
112
+ },
113
+
114
+ openEditor(id, lang) {
115
+ window.open(`/?id=${id}&lang=${lang}&connectorId=${this.user.storage.connectorId}`, '_blank')
116
+ },
117
+
118
+ async logout() {
119
+ await logout({
120
+ type: ConnectorType.STORAGE,
121
+ connectorId: this.user.storage.connectorId,
122
+ })
123
+ },
124
+
125
+ async createWebsite() {
126
+ if (!this.newWebsiteName) throw new Error('Vous n\'avez pas donné de nom à votre site')
127
+ this.loading = true
128
+ try {
129
+ const websiteId = this.newWebsiteName.replace(/[/\\?%*:|"<>]/g, '_')
130
+ const result = await websiteCreate({
131
+ websiteId,
132
+ data: {
133
+ name: this.newWebsiteName,
134
+ imageUrl: null,
168
135
  },
169
- },
170
- };
171
-
172
- window.addEventListener('load', () => {
173
- createApp(App).mount('.app');
174
- })
175
- </script>
176
- <style>.button{cursor:pointer}.skeleton-anim:after{width:100%;height:100%;position:absolute;top:0;left:0;content:"";background:linear-gradient(.25turn,transparent,rgba(255,255,255,.75),transparent),linear-gradient(transparent,transparent),radial-gradient(38px circle at 19px 19px,transparent 50%,transparent 51%),linear-gradient(transparent,transparent);background-repeat:no-repeat;background-size:315px 250px,315px 180px,100px 100px,225px 30px;background-position:-315px 0,0 0,0 190px,50px 195px;animation:loading 1.5s infinite}@keyframes loading{to{background-position:200% 0,0 0,0 190px,50px 195px}}</style><title>Dashboard Silex</title><link rel="icon" href=""><meta property="description" content=""><meta property="og:title" content=""><meta property="og:description" content=""><meta property="og:image" content=""></head><body id="ik0i" class="body loading"><header id="igrg" class="header padding-normal"><img id="ir7s" src="/assets//silex-icon-2018@200px.png"><nav id="i9jq" class="nav"><a id="iels" href="/" class="nav__item active" target="">Sites</a><a id="iels" href="http://docs.silex.me/" class="nav__item " target="_blank">Docs</a><a id="iels" href="https://www.silex.me/" class="nav__item " target="_blank">A propos</a><a id="iels" href="https://mail-list.silexlabs.org/subscription/cemnfkaVrK?locale=fr-FR&source=silex-dashboard" class="nav__item " target="_blank">Info</a></nav><div id="i2red7" class="lang h-space"><a href="/en" id="iciz" class="lang__item nav__item " hreflang="en">en</a><a href="/fr" id="iciz" class="lang__item nav__item active" hreflang="fr">fr</a></div><div id="i24ew"><img id="idkdk" src="/assets//alex-small.jpg" src="${json.avatar.url}"></div></header><main id="iz63r" class="padding-normal section app"><h1 id="itp1f">Bienvenue !</h1><div id="iyex8" class="subtitle color--light">Plongez-vous dans un projet ou créez-en un nouveau</div><div id="ickx4" class="button-bar margin-20"><div id="i2x0l" class="button button--primary rounded top-space-40" @click="showCreationForm = !showCreationForm" v-if="!showCreationForm"><span id="ibsgw" class="icon-font">+</span><span id="itl2n8">Créer un site</span></div><div id="i0ro3" class="button button--secondary rounded">Import</div></div><div id="ihwwxz" class="box top-space-40" v-if="showCreationForm"><h3 id="i3gd1b" class="box__header">Créer un nouveau site internet</h3><form method="get" id="i50acf" class="form" @submit.prevent="createWebsite"><div id="igtg1t" class="v-space"><label id="i1nmbc" class="v-space">Nom du site</label><input type="text" id="ij5iwh" placeholder="Mon super projet" class="input full-width" v-model="newWebsiteName"></div><div id="ie0xes"><button type="submit" id="i021na" class="button rounded button--primary right-space">Créer</button><button type="reset" class="button rounded button--secondary" @click="showCreationForm = !showCreationForm">Annuler</button></div></form></div><div id="if80m"><section id="idgvg" class="button-bar button-bar--full-width bg-white rounded loaded__item" v-if="!loading" v-for="(website, index) in websites" :key="index"><h3 id="i69a7" class="button-bar_item button-bar__item--main" v-text="website.name || website.id">My first website</h3><p id="i65hn" class="button-bar_item button-bar__item--secondary flex-no-shrink" v-text="'Mis à jour le ' + new Date(website.stats.mtime).toLocaleDateString(undefined, { day: 'numeric', month: 'long', year: 'numeric' })">Updated 1h ago by lexoyo</p><p id="i64qa" class="button-bar_item button-bar__item--secondary flex-no-shrink" v-text="'Créé le ' + new Date(website.stats.birthtime).toLocaleDateString(undefined, { day: 'numeric', month: 'long', year: 'numeric' })">Created 2023-02-16 by lexoyo</p><div id="i3b4tr" class="button-bar_item flex-no-shrink"><div id="ifyf6p" href="" class="button rounded button--primary button--small right-space" @click="openEditor(website.id)">Editer</div><div id="iol4h" class="button rounded button--secondary button--small" @click="deleteWebsite(website.id)" title="Supprimer">X</div></div></section><section id="i1fjn" class="button-bar button-bar--full-width bg-white rounded loading__item skeleton-anim skeleton-wrapper" v-if="loading"><h3 class="button-bar_item button-bar__item--main skeleton-text skeleton">My first websiteMy first websiteMy first websiteMy first</h3><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Updated 1h ago by lexoyo</p><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Created 2023-02-16 by lexoyo</p><div id="ixz6c" class="button-bar_item skeleton skeleton-button">Edit</div></section><section class="button-bar button-bar--full-width bg-white rounded loading__item skeleton-anim skeleton-wrapper" v-if="loading"><h3 class="button-bar_item button-bar__item--main skeleton-text skeleton">My first websiteMy first websiteMy first websiteMy first</h3><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Updated 1h ago by lexoyo</p><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Created 2023-02-16 by lexoyo</p><div class="button-bar_item skeleton skeleton-button">Edit</div></section><section class="button-bar button-bar--full-width bg-white rounded loading__item skeleton-anim skeleton-wrapper" v-if="loading"><h3 class="button-bar_item button-bar__item--main skeleton-text skeleton">My first websiteMy first websiteMy first websiteMy first</h3><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Updated 1h ago by lexoyo</p><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Created 2023-02-16 by lexoyo</p><div class="button-bar_item skeleton skeleton-button">Edit</div></section><section class="button-bar button-bar--full-width bg-white rounded loading__item skeleton-anim skeleton-wrapper" v-if="loading"><h3 class="button-bar_item button-bar__item--main skeleton-text skeleton">My first websiteMy first websiteMy first websiteMy first</h3><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Updated 1h ago by lexoyo</p><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Created 2023-02-16 by lexoyo</p><div class="button-bar_item skeleton skeleton-button">Edit</div></section><section class="button-bar button-bar--full-width bg-white rounded loading__item skeleton-anim skeleton-wrapper" v-if="loading"><h3 class="button-bar_item button-bar__item--main skeleton-text skeleton">My first websiteMy first websiteMy first websiteMy first</h3><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Updated 1h ago by lexoyo</p><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Created 2023-02-16 by lexoyo</p><div class="button-bar_item skeleton skeleton-button">Edit</div></section><section class="button-bar button-bar--full-width bg-white rounded loading__item skeleton-anim skeleton-wrapper" v-if="loading"><h3 class="button-bar_item button-bar__item--main skeleton-text skeleton">My first websiteMy first websiteMy first websiteMy first</h3><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Updated 1h ago by lexoyo</p><p class="button-bar_item button-bar__item--secondary skeleton-text skeleton">Created 2023-02-16 by lexoyo</p><div class="button-bar_item skeleton skeleton-button">Edit</div></section></div><div id="i7ej6j" class="box horizontal" v-if="error"><div id="iv0eyi" class="full-width v-space h-space" v-text="error">Insert your text here</div><div id="i4656n" class="button rounded button--small button--tertiary" @click="error = null">Fermer</div></div><div id="ilteie" class="box horizontal" v-if="message"><div id="i2d31v" class="full-width v-space h-space" v-text="message">Insert your text here</div><div id="i2urco" class="button rounded button--small button--tertiary" @click="message = null">Fermer</div></div></main><footer id="ilzpl" class="header footer"><div id="i238z" class="section"><p><a href="https://www.silex.me/">Silex website builder</a> est un projet libre et open source, supporté par l'<a href="https://www.silexlabs.org/">association Silex Labs</a></p>
177
- </div></footer></body></html>
136
+ connectorId: this.user.storage.connectorId
137
+ })
138
+ this.message = 'Le site a bien été créé'
139
+ this.newWebsiteName = ''
140
+ this.showCreationForm = false;
141
+ this.websites = await websiteList({connectorId: this.user.storage.connectorId})
142
+ this.loading = false
143
+ return result
144
+ } catch (error) {
145
+ this.loading = false
146
+ console.error(error)
147
+ this.error = 'Erreur, le site n\'a pas été créé'
148
+ }
149
+ },
150
+
151
+ async deleteWebsite(websiteId) {
152
+ const ok = confirm('Etes vous sûr.e de vouloir supprimer définitivement ce site ?')
153
+ if (!ok) return
154
+ this.loading = true
155
+ try {
156
+ const result = await websiteDelete({websiteId, connectorId: this.user.storage.connectorId})
157
+ this.message = 'Le site a bien été effacé'
158
+ this.websites = await websiteList({connectorId: this.user.storage.connectorId})
159
+ this.loading = false
160
+ return result
161
+ } catch (error) {
162
+ this.loading = false
163
+ this.error = 'Erreur, le site n\'a pas été effacé'
164
+ }
165
+ },
166
+
167
+ async renameWebsite(websiteId) {
168
+ const website = this.websites.find(w => w.websiteId === websiteId)
169
+ const name = prompt('Nouveau nom', website.name)
170
+ if (!name) return
171
+ this.loading = true
172
+ try {
173
+ const result = await websiteMetaWrite({websiteId, connectorId: this.user.storage.connectorId, data: { name }})
174
+ this.message = 'Changement de nom effectué'
175
+ this.websites = await websiteList({connectorId: this.user.storage.connectorId})
176
+ this.loading = false
177
+ return result
178
+ } catch (error) {
179
+ this.loading = false
180
+ this.error = 'Erreur, le site n\'a pas été effacé'
181
+ }
182
+ },
183
+ },
184
+ };
185
+
186
+ // Start vue app
187
+ createApp(App).mount('.app');
188
+ })
189
+ </script>
190
+
191
+
192
+ <title>Dashboard Silex</title>
193
+ <link rel="icon" href="" />
194
+ <meta property="description" content=""/>
195
+ <meta property="og:title" content=""/>
196
+ <meta property="og:description" content=""/>
197
+ <meta property="og:image" content=""/>
198
+ </head>
199
+ <body
200
+ id="ik0i"
201
+ class="body loading app"
202
+
203
+
204
+ ><HEADER
205
+ id="igrg"
206
+ class="header padding-normal "
207
+
208
+
209
+ ><A
210
+ id="igvu43" href="/"
211
+
212
+
213
+
214
+ ><img
215
+ src="/assets/silex-icon-2018@200px.png" href="" id="iel80b-2"
216
+ class="nav__logo "
217
+
218
+
219
+ ></img></A><NAV
220
+ id="i9jq"
221
+ class="nav "
222
+
223
+
224
+ ><A
225
+ id="iels" href="/"
226
+ class="nav__item active"
227
+ target=""
228
+
229
+ >Sites</A><A
230
+ id="iels" href="http://docs.silex.me/"
231
+ class="nav__item "
232
+ target="_blank"
233
+
234
+ >Docs</A><A
235
+ id="iels" href="https://www.silex.me/"
236
+ class="nav__item "
237
+ target="_blank"
238
+
239
+ >A propos</A><A
240
+ id="iels" href="https://mail-list.silexlabs.org/subscription/cemnfkaVrK?locale=fr-FR&source=silex-dashboard"
241
+ class="nav__item "
242
+ target="_blank"
243
+
244
+ >Info</A></NAV><div
245
+ id="i2red7"
246
+ class="lang h-space "
247
+
248
+
249
+ ><A
250
+ href="/en" id="iciz"
251
+ class="lang__item nav__item "
252
+ hreflang="en"
253
+
254
+ >en</A><A
255
+ href="/fr" id="iciz"
256
+ class="lang__item nav__item active"
257
+ hreflang="fr"
258
+
259
+ >fr</A></div><div
260
+ id="i24ew"
261
+ class="user__wrapper "
262
+ v-if="user" @NOmouseover="showMenu = true" @NOmouseout="showMenu = false" @click="showMenu = !showMenu"
263
+
264
+ ><div
265
+ id="i5xsbd"
266
+ class="user-icon__wrapper "
267
+ v-if="user" v-show="!showMenu || user.storage.disableLogout"
268
+
269
+ ><div
270
+ id="i5wlbq"
271
+ class="user-icon__image "
272
+ v-if="user" v-show="!showMenu || user.storage.disableLogout" :style='`background: url("${user.picture}"); background-repeat: no-repeat; background-size: contain;`'
273
+
274
+ ></div></div><div
275
+ id="ic9eoa"
276
+
277
+ v-show="showMenu && !user.storage.disableLogout"
278
+
279
+ ><div
280
+ id="iksw4d"
281
+ class="button button--secondary "
282
+ @click="logout()"
283
+
284
+ >Logout</div></div></div></HEADER><MAIN
285
+ id="iz63r"
286
+ class="padding-normal section "
287
+
288
+
289
+ ><H1
290
+ id="itp1f"
291
+
292
+
293
+
294
+ >Bienvenue !</H1><div
295
+ id="iyex8"
296
+ class="subtitle color--light "
297
+
298
+
299
+ >Plongez-vous dans un projet ou créez-en un nouveau</div><div
300
+ id="ickx4"
301
+ class="button-bar margin-20 "
302
+
303
+
304
+ ><BUTTON
305
+ id="i2x0l"
306
+ class="button button--primary rounded top-space-40 "
307
+ @click="showCreationForm = !showCreationForm" v-if="!showCreationForm"
308
+
309
+ ><span
310
+ id="ibsgw"
311
+ class="icon-font "
312
+
313
+
314
+ >+</span> <span
315
+ id="itl2n8"
316
+
317
+
318
+
319
+ >Créer un site</span></BUTTON><div
320
+ id="i0ro3"
321
+ class="button button--secondary rounded "
322
+
323
+
324
+ >Import</div></div><div
325
+ id="ihwwxz"
326
+ class="box top-space-40 "
327
+ v-if="showCreationForm"
328
+
329
+ ><H3
330
+ id="i3gd1b"
331
+ class="box__header "
332
+
333
+
334
+ >Créer un nouveau site internet</H3><form
335
+ method="get" id="i50acf"
336
+ class="form "
337
+ @submit.prevent="createWebsite"
338
+
339
+ ><div
340
+ id="igtg1t"
341
+ class="v-space "
342
+
343
+
344
+ ><label
345
+ id="i1nmbc"
346
+ class="v-space "
347
+
348
+
349
+ >Nom du site</label><input
350
+ type="text" id="ij5iwh" placeholder="Mon super projet"
351
+ class="input full-width "
352
+ v-model="newWebsiteName"
353
+
354
+ ></input></div><div
355
+ id="ie0xes"
356
+
357
+
358
+
359
+ ><button
360
+ type="submit" id="i021na"
361
+ class="button rounded button--primary right-space "
362
+
363
+
364
+ >Créer</button><button
365
+ type="reset"
366
+ class="button rounded button--secondary "
367
+ @click="showCreationForm = !showCreationForm"
368
+
369
+ >Annuler</button></div></form></div><div
370
+ id="if80m"
371
+
372
+
373
+
374
+ ><SECTION
375
+ id="idgvg"
376
+ class="button-bar button-bar--full-width bg-white rounded loaded__item "
377
+ v-if="!loading" v-for="(website, index) in websites" :key="index"
378
+
379
+ ><H3
380
+ id="i69a7"
381
+ class="button-bar_item button-bar__item--main "
382
+ v-text="website.name || website.id"
383
+
384
+ >My first website</H3><P
385
+ id="i65hn"
386
+ class="button-bar_item button-bar__item--secondary flex-no-shrink "
387
+ v-text="'Mis à jour le ' + new Date(website.updatedAt).toLocaleDateString(undefined, { day: 'numeric', month: 'long', year: 'numeric' })"
388
+
389
+ >Updated 1h ago by lexoyo</P><P
390
+ id="i64qa"
391
+ class="button-bar_item button-bar__item--secondary flex-no-shrink "
392
+ v-text="'Créé le ' + new Date(website.createdAt).toLocaleDateString(undefined, { day: 'numeric', month: 'long', year: 'numeric' })"
393
+
394
+ >Created 2023-02-16 by lexoyo</P><div
395
+ id="i3b4tr"
396
+ class="button-bar_item flex-no-shrink "
397
+
398
+
399
+ ><BUTTON
400
+ id="ifyf6p" href=""
401
+ class="button rounded button--primary button--small right-space "
402
+ @click="openEditor(website.websiteId, 'fr')"
403
+
404
+ >Editer</BUTTON><BUTTON
405
+ href="" id="ihf6ew"
406
+ class="button rounded button--small right-space button--tertiary "
407
+ @click="renameWebsite(website.websiteId, 'fr')"
408
+
409
+ >Renommer</BUTTON><BUTTON
410
+ id="iol4h"
411
+ class="button rounded button--small button--tertiary "
412
+ @click="deleteWebsite(website.websiteId)" title="Supprimer"
413
+
414
+ >X</BUTTON></div></SECTION><SECTION
415
+ id="i1fjn"
416
+ class="button-bar button-bar--full-width bg-white rounded loading__item skeleton-anim skeleton-wrapper "
417
+ v-if="loading"
418
+
419
+ ><H3
420
+
421
+ class="button-bar_item button-bar__item--main skeleton-text skeleton "
422
+
423
+
424
+ >My first websiteMy first websiteMy first websiteMy first</H3><P
425
+
426
+ class="button-bar_item button-bar__item--secondary skeleton-text skeleton "
427
+
428
+
429
+ >Updated 1h ago by lexoyo</P><P
430
+
431
+ class="button-bar_item button-bar__item--secondary skeleton-text skeleton "
432
+
433
+
434
+ >Created 2023-02-16 by lexoyo</P><div
435
+ id="ixz6c"
436
+ class="button-bar_item skeleton skeleton-button "
437
+
438
+
439
+ >Edit</div></SECTION><SECTION
440
+ id="iwxxo5"
441
+ class="button-bar button-bar--full-width bg-white rounded loading__item skeleton-anim skeleton-wrapper "
442
+ v-if="loading"
443
+
444
+ ><H3
445
+
446
+ class="button-bar_item button-bar__item--main skeleton-text skeleton "
447
+
448
+
449
+ >My first websiteMy first websiteMy first websiteMy first</H3><P
450
+
451
+ class="button-bar_item button-bar__item--secondary skeleton-text skeleton "
452
+
453
+
454
+ >Updated 1h ago by lexoyo</P><P
455
+
456
+ class="button-bar_item button-bar__item--secondary skeleton-text skeleton "
457
+
458
+
459
+ >Created 2023-02-16 by lexoyo</P><div
460
+ id="i9fx3l"
461
+ class="button-bar_item skeleton skeleton-button "
462
+
463
+
464
+ >Edit</div></SECTION><SECTION
465
+ id="isld3r"
466
+ class="button-bar button-bar--full-width bg-white rounded loading__item skeleton-anim skeleton-wrapper "
467
+ v-if="loading"
468
+
469
+ ><H3
470
+
471
+ class="button-bar_item button-bar__item--main skeleton-text skeleton "
472
+
473
+
474
+ >My first websiteMy first websiteMy first websiteMy first</H3><P
475
+
476
+ class="button-bar_item button-bar__item--secondary skeleton-text skeleton "
477
+
478
+
479
+ >Updated 1h ago by lexoyo</P><P
480
+
481
+ class="button-bar_item button-bar__item--secondary skeleton-text skeleton "
482
+
483
+
484
+ >Created 2023-02-16 by lexoyo</P><div
485
+ id="i8oes3"
486
+ class="button-bar_item skeleton skeleton-button "
487
+
488
+
489
+ >Edit</div></SECTION><SECTION
490
+ id="iqmx38"
491
+ class="button-bar button-bar--full-width bg-white rounded loading__item skeleton-anim skeleton-wrapper "
492
+ v-if="loading"
493
+
494
+ ><H3
495
+
496
+ class="button-bar_item button-bar__item--main skeleton-text skeleton "
497
+
498
+
499
+ >My first websiteMy first websiteMy first websiteMy first</H3><P
500
+
501
+ class="button-bar_item button-bar__item--secondary skeleton-text skeleton "
502
+
503
+
504
+ >Updated 1h ago by lexoyo</P><P
505
+
506
+ class="button-bar_item button-bar__item--secondary skeleton-text skeleton "
507
+
508
+
509
+ >Created 2023-02-16 by lexoyo</P><div
510
+ id="ie83jl"
511
+ class="button-bar_item skeleton skeleton-button "
512
+
513
+
514
+ >Edit</div></SECTION></div><div
515
+ id="i7ej6j"
516
+ class="box horizontal "
517
+ v-if="error"
518
+
519
+ ><div
520
+ id="iv0eyi"
521
+ class="full-width v-space h-space "
522
+ v-text="error"
523
+
524
+ >Insert your text here</div><div
525
+ id="i4656n"
526
+ class="button rounded button--small button--tertiary "
527
+ @click="error = null"
528
+
529
+ >Fermer</div></div><div
530
+ id="ilteie"
531
+ class="box horizontal "
532
+ v-if="message"
533
+
534
+ ><div
535
+ id="i2d31v"
536
+ class="full-width v-space h-space "
537
+ v-text="message"
538
+
539
+ >Insert your text here</div><div
540
+ id="i2urco"
541
+ class="button rounded button--small button--tertiary "
542
+ @click="message = null"
543
+
544
+ >Fermer</div></div></MAIN><FOOTER
545
+ id="ilzpl"
546
+ class="header footer "
547
+
548
+
549
+ ><div
550
+ id="i238z"
551
+ class="section "
552
+
553
+
554
+ ><p><a href="https://www.silex.me/">Silex website builder</a> est un projet libre et open source, supporté par l'<a href="https://www.silexlabs.org/">association Silex Labs</a></p>
555
+ </div></FOOTER></body>
556
+ </html>
557
+