@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.
- package/.silex-client.js +27 -0
- package/.silex.js +47 -0
- package/_data/api-translations.json +6 -2
- package/_includes/api-connectors.js.html +47 -0
- package/_includes/api-websites.js.html +148 -0
- package/_includes/connectors.html +74 -0
- package/_includes/websites.html +385 -0
- package/_silex/default/meta.json +1 -0
- package/_silex/default/website.json +1 -0
- package/_site/css/connectors.css +1 -0
- package/_site/css/websites.css +1 -0
- package/_site/en/connectors/index.html +124 -0
- package/_site/en/index.html +549 -169
- package/_site/fr/connectors/index.html +124 -0
- package/_site/fr/index.html +550 -170
- package/package.json +10 -4
- package/pages/connectors.css.liquid +4 -0
- package/pages/en/connectors.md +4 -0
- package/pages/en/index.md +2 -1
- package/pages/fr/connectors.md +5 -0
- package/pages/fr/index.md +2 -1
- package/pages/websites.css.liquid +4 -0
- package/.silex/default/.silex.data.json +0 -1
- package/_includes/main.html +0 -1
- package/_includes/website-list.js.html +0 -172
- package/_site/README/index.html +0 -12
- package/_site/css/main.css +0 -1
- package/css/main.css.liquid +0 -4
- package/pages/main.css.liquid +0 -4
- /package/{.silex → _silex}/default/assets/alex-small.jpg +0 -0
- /package/{.silex → _silex}/default/assets/silex-icon-2018@200px.png +0 -0
package/_site/fr/index.html
CHANGED
|
@@ -1,177 +1,557 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
+
|