@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/en/index.html
CHANGED
|
@@ -1,176 +1,556 @@
|
|
|
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="fr"
|
|
5
|
-
href="/fr/" />
|
|
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 = 'Failed to fetch websites'
|
|
95
|
-
}
|
|
96
|
-
this.loading = false
|
|
97
|
-
},
|
|
10
|
+
href="/fr/" />
|
|
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(`HTTP error! 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 = `/en${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('You need to provide a website name')
|
|
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
|
-
|
|
136
|
+
connectorId: this.user.storage.connectorId
|
|
137
|
+
})
|
|
138
|
+
this.message = 'Website created successfully'
|
|
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 = 'Failed to create website'
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
async deleteWebsite(websiteId) {
|
|
152
|
+
const ok = confirm('Deleting a website? Are your sure? Really?')
|
|
153
|
+
if (!ok) return
|
|
154
|
+
this.loading = true
|
|
155
|
+
try {
|
|
156
|
+
const result = await websiteDelete({websiteId, connectorId: this.user.storage.connectorId})
|
|
157
|
+
this.message = 'Website deleted successfully'
|
|
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 = 'Failed to delete website'
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
|
|
167
|
+
async renameWebsite(websiteId) {
|
|
168
|
+
const website = this.websites.find(w => w.websiteId === websiteId)
|
|
169
|
+
const name = prompt('New name for this website', 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 = 'Website renamed successfully'
|
|
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 = 'Failed to delete website'
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
// Start vue app
|
|
187
|
+
createApp(App).mount('.app');
|
|
188
|
+
})
|
|
189
|
+
</script>
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
<title>Silex Dashboard</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
|
+
>About</A><A
|
|
240
|
+
id="iels" href="https://mail-list.silexlabs.org/subscription/cemnfkaVrK?locale=en-US&source=silex-dashboard"
|
|
241
|
+
class="nav__item "
|
|
242
|
+
target="_blank"
|
|
243
|
+
|
|
244
|
+
>News</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 active"
|
|
252
|
+
hreflang="en"
|
|
253
|
+
|
|
254
|
+
>en</A><A
|
|
255
|
+
href="/fr" id="iciz"
|
|
256
|
+
class="lang__item nav__item "
|
|
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
|
+
>Welcome back!</H1><div
|
|
295
|
+
id="iyex8"
|
|
296
|
+
class="subtitle color--light "
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
>Dive into your projects or kickstart a new one</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
|
+
>Create website</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
|
+
>Create a new website</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
|
+
>Website name</label><input
|
|
350
|
+
type="text" id="ij5iwh" placeholder="My project website"
|
|
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
|
+
>Create</button><button
|
|
365
|
+
type="reset"
|
|
366
|
+
class="button rounded button--secondary "
|
|
367
|
+
@click="showCreationForm = !showCreationForm"
|
|
368
|
+
|
|
369
|
+
>Cancel</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="'Updated ' + 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="'Created ' + 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, 'en')"
|
|
403
|
+
|
|
404
|
+
>Edit</BUTTON><BUTTON
|
|
405
|
+
href="" id="ihf6ew"
|
|
406
|
+
class="button rounded button--small right-space button--tertiary "
|
|
407
|
+
@click="renameWebsite(website.websiteId, 'en')"
|
|
408
|
+
|
|
409
|
+
>Rename</BUTTON><BUTTON
|
|
410
|
+
id="iol4h"
|
|
411
|
+
class="button rounded button--small button--tertiary "
|
|
412
|
+
@click="deleteWebsite(website.websiteId)" title="Delete"
|
|
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
|
+
>Dismiss</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
|
+
>Dismiss</div></div></MAIN><FOOTER
|
|
545
|
+
id="ilzpl"
|
|
546
|
+
class="header footer "
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
><div
|
|
550
|
+
id="i238z"
|
|
551
|
+
class="section "
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
></div></FOOTER></body>
|
|
555
|
+
</html>
|
|
556
|
+
|