@silexlabs/silex-dashboard 1.0.41 → 1.0.45

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 (95) hide show
  1. package/.gitmodules +2 -2
  2. package/11ty/eleventy.config.mjs +62 -0
  3. package/README.md +8 -2
  4. package/_site/css/connectors-61bd21c2345101e48cc530cacf3afc0156ce7e089fcef3a34f853a537f0c55f2.css +1 -0
  5. package/_site/css/websites-4b9b2b0a0a907b33eca109d50c2a3eee97f1955c742cef487110d21a0bbf8f50.css +1 -0
  6. package/_site/en/connectors/index.html +176 -181
  7. package/_site/en/index.html +59 -470
  8. package/_site/fr/connectors/index.html +176 -181
  9. package/_site/fr/index.html +59 -470
  10. package/_site/js/main.js +362 -0
  11. package/_site/js/main.js.LICENSE.txt +38 -0
  12. package/_site/js/vue.cjs.js +89 -0
  13. package/_site/js/vue.cjs.prod.js +75 -0
  14. package/_site/js/vue.d.mts +7 -0
  15. package/_site/js/vue.d.ts +7 -0
  16. package/_site/js/vue.esm-browser.js +16740 -0
  17. package/_site/js/vue.esm-browser.prod.js +12 -0
  18. package/_site/js/vue.esm-bundler.js +80 -0
  19. package/_site/js/vue.global.js +16725 -0
  20. package/_site/js/vue.global.prod.js +12 -0
  21. package/_site/js/vue.runtime.esm-browser.js +11155 -0
  22. package/_site/js/vue.runtime.esm-browser.prod.js +12 -0
  23. package/_site/js/vue.runtime.esm-bundler.js +26 -0
  24. package/_site/js/vue.runtime.global.js +11302 -0
  25. package/_site/js/vue.runtime.global.prod.js +12 -0
  26. package/collections/connectors/en.md +70 -0
  27. package/collections/connectors/fr.md +72 -0
  28. package/collections/home/en.md +57 -0
  29. package/{pages/fr/index.md → collections/home/fr.md} +20 -21
  30. package/collections/languages/en.json +5 -0
  31. package/collections/languages/fr.json +5 -0
  32. package/collections/settings/en.json +127 -0
  33. package/collections/settings/fr.json +131 -0
  34. package/package.json +17 -8
  35. package/silex/client-config.js +24 -0
  36. package/{.silex.js → silex/server-config.js} +8 -18
  37. package/templates/connectors-en.11tydata.mjs +56 -0
  38. package/templates/connectors-en.html +440 -0
  39. package/templates/connectors-fr.11tydata.mjs +56 -0
  40. package/templates/connectors-fr.html +440 -0
  41. package/templates/css/connectors-61bd21c2345101e48cc530cacf3afc0156ce7e089fcef3a34f853a537f0c55f2.css +1 -0
  42. package/templates/css/websites-4b9b2b0a0a907b33eca109d50c2a3eee97f1955c742cef487110d21a0bbf8f50.css +1 -0
  43. package/templates/websites-en.11tydata.mjs +108 -0
  44. package/templates/websites-en.html +478 -0
  45. package/templates/websites-fr.11tydata.mjs +108 -0
  46. package/templates/websites-fr.html +478 -0
  47. package/tina/config.ts +258 -0
  48. package/tina/tina-lock.json +1 -0
  49. package/.eleventy.js +0 -11
  50. package/.silex-client.js +0 -22
  51. package/_data/languages.json +0 -7
  52. package/_includes/api-connectors.js.html +0 -96
  53. package/_includes/api-websites.js.html +0 -189
  54. package/_includes/connectors.html +0 -253
  55. package/_includes/websites.html +0 -548
  56. package/_silex/old/assets/alex-hoyau.jpg +0 -0
  57. package/_silex/old/assets/alex-small.jpg +0 -0
  58. package/_silex/old/assets/empty-projects.gif +0 -0
  59. package/_silex/old/assets/gitlab.svg +0 -13
  60. package/_silex/old/assets/picto-silex.png +0 -0
  61. package/_silex/old/assets/silex-icon-2018@200px.png +0 -0
  62. package/_silex/old/meta.json +0 -1
  63. package/_silex/old/website.json +0 -1
  64. package/_site/assets/alex-small.jpg +0 -0
  65. package/_site/assets/gitlab.svg +0 -13
  66. package/_site/assets/silex-dashboard.png +0 -0
  67. package/_site/assets/silex-icon-2018@200px.png +0 -0
  68. package/_site/css/connectors.css +0 -1
  69. package/_site/css/websites.css +0 -1
  70. package/assets/alex-small.jpg +0 -0
  71. package/assets/bg-purpel-silex.webp +0 -0
  72. package/assets/bg-silex-purpel.webp +0 -0
  73. package/assets/empty-projects-sos.gif +0 -0
  74. package/assets/gitlab.svg +0 -13
  75. package/assets/logo-silex.svg +0 -1
  76. package/assets/picto-silex@3x.png +0 -0
  77. package/assets/silex-dashboard.png +0 -0
  78. package/assets/silex-icon-2018@200px.png +0 -0
  79. package/pages/connectors.css.liquid +0 -4
  80. package/pages/en/connectors.md +0 -4
  81. package/pages/en/en.json +0 -72
  82. package/pages/en/index.md +0 -28
  83. package/pages/fr/connectors.md +0 -5
  84. package/pages/fr/fr.json +0 -72
  85. package/pages/pages.11tydata.js +0 -5
  86. package/pages/websites.css.liquid +0 -4
  87. /package/{_data → 11ty/_data}/api-translations.json +0 -0
  88. /package/{_data → 11ty/_data}/site.js +0 -0
  89. /package/{_includes → 11ty/_includes}/alternate.liquid +0 -0
  90. /package/{_silex/old → templates}/assets/bg-purpel-silex.webp +0 -0
  91. /package/{_silex/old → templates}/assets/bg-silex-purpel.webp +0 -0
  92. /package/{_silex/old → templates}/assets/empty-projects-sos.gif +0 -0
  93. /package/{assets → templates/assets}/favicon-32x32.png +0 -0
  94. /package/{_silex/old → templates}/assets/logo-silex.svg +0 -0
  95. /package/{_silex/old → templates}/assets/picto-silex@3x.png +0 -0
@@ -1,21 +1,19 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="">
3
3
  <head>
4
- <link rel="stylesheet" href="/css/connectors.css" />
4
+ <meta charset="UTF-8">
5
+ <link rel="stylesheet" href="/css/connectors-61bd21c2345101e48cc530cacf3afc0156ce7e089fcef3a34f853a537f0c55f2.css" />
5
6
  <!-- font google -->
6
7
  <link rel="preconnect" href="https://fonts.gstatic.com" />
7
8
  <link href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@300;700&display=swap" rel="stylesheet">
8
9
 
9
- <link
10
- rel="alternate"
11
- hreflang="en"
12
- href="/en/connectors" />
13
10
  <style>
14
11
  .before-js > * {
15
12
  visibility: hidden;
16
13
  opacity: 0;
17
14
  transition: opacity .5s ease;
18
15
  }
16
+ .before-js[data-gjs-type] > *, /* This is only inside the editor, .before-js needs to be on the body */
19
17
  .after-js > * {
20
18
  visibility: visible;
21
19
  opacity: 1;
@@ -26,6 +24,7 @@
26
24
  top: 49%;
27
25
  left: 49%;
28
26
  }
27
+ .before-js[data-gjs-type]:before, /* This is only inside the editor, .before-js needs to be on the body */
29
28
  .after-js:before {
30
29
  content: none;
31
30
  }
@@ -61,7 +60,7 @@
61
60
  color: #8873FE;
62
61
  }
63
62
  input:focus {
64
- border: 2px solid ##9977FE;
63
+ border: 2px solid #9977FE;
65
64
  background-color:#ffffff;
66
65
  }
67
66
  :focus {
@@ -129,12 +128,12 @@
129
128
  }
130
129
  /*flash*/
131
130
  .fx-flash:hover {
132
- animation: flash-in .5s ;
131
+ animation: flash-in .25s ;
133
132
  }
134
133
  /*flash-in animation*/
135
134
  @keyframes flash-in{
136
135
  0% {
137
- opacity:0;
136
+ opacity:.25;
138
137
  }
139
138
  100% {
140
139
  opacity:1;
@@ -143,10 +142,13 @@
143
142
  /*flash-in animation*/
144
143
  /*FX ANIMATIONS*/
145
144
  </style>
146
- <script src="/js/vue.global.js"></script>
145
+ <script src="/js/vue.global.prod.js"></script>
147
146
  <script src="/js/main.js"></script>
148
147
  <script type="module">
148
+ console.log('xxxxxx')
149
+ const CONNECTORS_PATH = '/connectors/'
149
150
  window.addEventListener('load', function() {
151
+ console.log('xxxxxx')
150
152
  const { createApp } = Vue;
151
153
  const { api, constants, types } = silex;
152
154
  const {
@@ -154,84 +156,190 @@ window.addEventListener('load', function() {
154
156
  } = types
155
157
  const {
156
158
  setServerUrl,
157
- connectorList,
159
+ getUser,
158
160
  logout,
161
+ websiteDelete,
162
+ websiteDuplicate,
163
+ websiteList,
164
+ websiteCreate,
165
+ websiteMetaWrite,
159
166
  } = api
167
+ function toSafeId(name) {
168
+ return name.replace(/[/\\?%*:|"<>]/g, '_')
169
+ }
160
170
 
161
171
  const App = {
162
172
  data() {
163
173
  return {
164
- connectors: [],
174
+ websites: [],
175
+ newWebsiteName: '',
176
+ showCreationForm: false,
165
177
  error: null,
166
178
  message: null,
179
+ loggedIn: false,
167
180
  loading: true,
168
- lastConnector: null,
181
+ storage: null,
182
+ user: null,
183
+ showMenu: false,
184
+ empty: false,
169
185
  }
170
186
  },
171
187
  mounted() {
172
188
  this.init()
173
- window.addEventListener('message', (event) => {
174
- if(event.data && event.data.type === 'login') {
175
- this.loginResult(event.data)
176
- }
177
- })
178
189
  },
179
190
 
180
191
  methods: {
181
192
  async init() {
182
193
  try {
183
194
  // Init Silex server path
184
- // Go up 2 levels because of the language prefix + the page path
185
- setServerUrl((window.location.origin + window.location.pathname.replace(/\/$/, '')).replace(/\/[^/]+\/[^/]+$/, ''))
195
+ // Go up one level because of the language prefix
196
+ setServerUrl(window.location.origin)
186
197
  // Start
187
- this.loading = true
188
- console.log('init')
189
- this.connectors = await connectorList({type: ConnectorType.STORAGE})
190
- console.log('connectors', this.connectors)
191
- this.loading = false
198
+ const user = await getUser({type: ConnectorType.STORAGE})
199
+ // Escape single quotes in the picture URL and decode the picture URL
200
+ user.picture = decodeURIComponent(user.picture).replace(/'/g, "\\'")
201
+ if(user) {
202
+ this.user = user
203
+ this.loggedIn = true
204
+ this.websites = await websiteList({connectorId: this.user.storage.connectorId})
205
+ this.empty = this.websites.length === 0
206
+ this.loading = false
207
+ } else {
208
+ this.openLogin()
209
+ }
192
210
  } catch (error) {
193
211
  console.error(error)
194
- this.error = error
195
212
  this.loading = false
213
+ if(error.code === 401 || error.httpStatusCode === 401) {
214
+ this.loggedIn = false
215
+ this.openLogin()
216
+ } else {
217
+ this.error = `Erreur, impossible de démarrer le tableau de bord - ${error.message}`
218
+ this.message = ''
219
+ }
196
220
  }
197
221
  },
198
- openLogin(connector) {
199
- this.lastConnector = connector
200
- const nonOAuthUrl = `${constants.API_PATH}${constants.API_CONNECTOR_PATH}${constants.API_CONNECTOR_LOGIN}?connectorId=${connector.connectorId}&type=${connector.type}`
201
- console.log('openLogin', connector.oauthUrl, nonOAuthUrl)
202
- window.open(connector.oauthUrl || nonOAuthUrl, '_blank')
222
+
223
+ openLogin(id, lang) {
224
+ //throw new Error('debug')
225
+ const path = `/fr${CONNECTORS_PATH}`
226
+ console.log(window.location.pathname, window.location.path, path)
227
+ if(window.location.pathname === path) return
228
+ window.open(path, '_self')
203
229
  },
204
- loginResult(data) {
205
- console.log('loginResult', data)
206
- if(data.error) {
207
- this.error = data.error
208
- this.message = `Erreur, impossible de se connecter. ${data.message}`
209
- } else {
210
- window.location.href = '/'
211
- }
230
+
231
+ openEditor(id, lang) {
232
+ window.open(`/?id=${id}&lang=${lang}&connectorId=${this.user.storage.connectorId}`, '_self')
212
233
  },
234
+
213
235
  async logout() {
236
+ await logout({
237
+ type: ConnectorType.STORAGE,
238
+ connectorId: this.user.storage.connectorId,
239
+ })
240
+ window.location.reload()
241
+ },
242
+
243
+ async createWebsite() {
214
244
  try {
215
- this.message = 'Déconnexion en cours'
216
- await logout({type: ConnectorType.STORAGE, connectorId: this.lastConnector.connectorId})
217
- this.loggedIn = false
218
- this.user = null
219
- this.websites = []
245
+ if (!this.newWebsiteName) throw new Error('Vous n\'avez pas donné de nom à votre site')
246
+ this.loading = true
247
+ const websiteId = toSafeId(this.newWebsiteName)
248
+ const result = await websiteCreate({
249
+ websiteId,
250
+ data: {
251
+ name: this.newWebsiteName,
252
+ imageUrl: null,
253
+ },
254
+ connectorId: this.user.storage.connectorId
255
+ })
256
+ this.message = 'Le site a bien été créé'
257
+ this.error = ''
258
+ this.newWebsiteName = ''
259
+ this.showCreationForm = false;
260
+ this.websites = await websiteList({connectorId: this.user.storage.connectorId})
261
+ this.empty = this.websites.length === 0
220
262
  this.loading = false
221
- this.message = ''
222
- this.error = false
263
+ return result
223
264
  } catch (error) {
265
+ this.loading = false
224
266
  console.error(error)
225
- this.error = error
226
- this.message = error.message
267
+ this.error = `Erreur, le site n\'a pas été créé - ${error.message}`
268
+ this.message = ''
269
+ }
270
+ },
271
+
272
+ async deleteWebsite(websiteId) {
273
+ const ok = confirm('Etes vous sûr.e de vouloir supprimer définitivement ce site ?')
274
+ if (!ok) return
275
+ this.loading = true
276
+ try {
277
+ const result = await websiteDelete({websiteId, connectorId: this.user.storage.connectorId})
278
+ this.message = 'Le site a bien été effacé'
279
+ this.error = ''
280
+ this.websites = await websiteList({connectorId: this.user.storage.connectorId})
281
+ this.empty = this.websites.length === 0
227
282
  this.loading = false
283
+ return result
284
+ } catch (error) {
285
+ this.loading = false
286
+ this.error = `Erreur, le site n\'a pas été effacé - ${error.message}`
287
+ this.message = ''
288
+ }
289
+ },
290
+
291
+ async duplicateWebsite(websiteId) {
292
+ this.loading = true
293
+ try {
294
+ await websiteDuplicate({websiteId, connectorId: this.user.storage.connectorId, data: { name }})
295
+ this.error = ''
296
+ this.websites = await websiteList({connectorId: this.user.storage.connectorId})
297
+ this.message = 'Le site a bien été dupliqué'
298
+ this.empty = this.websites.length === 0
299
+ this.loading = false
300
+ } catch (error) {
301
+ this.loading = false
302
+ this.error = `Erreur, le site n'a pas été dupliqué - ${error.message}`
303
+ this.message = ''
304
+ }
305
+ },
306
+
307
+ async renameWebsite(websiteId) {
308
+ const website = this.websites.find(w => w.websiteId === websiteId)
309
+ const name = prompt('Nouveau nom', website.name)
310
+ if (!name) return
311
+ this.loading = true
312
+ try {
313
+ const result = await websiteMetaWrite({websiteId, connectorId: this.user.storage.connectorId, data: { name }})
314
+ this.message = 'Changement de nom effectué'
315
+ this.error = ''
316
+ this.websites = await websiteList({connectorId: this.user.storage.connectorId})
317
+ this.empty = this.websites.length === 0
318
+ this.loading = false
319
+ return result
320
+ } catch (error) {
321
+ this.loading = false
322
+ this.error = `Erreur, le nom n\'a pas été changé - ${error.message}`
323
+ this.message = ''
228
324
  }
229
325
  },
230
326
  },
231
327
  };
328
+ // Prepare elements for vue
329
+ document.querySelectorAll('[v-text], [v-html]')
330
+ .forEach(el => el.innerText = '')
331
+
332
+ // Create the app
333
+ const app = createApp(App);
334
+
335
+ // Suppress "v-text will override element children" warning
336
+ app.config.compilerOptions.directiveTransforms = {
337
+ text: false,
338
+ }
339
+
340
+ // Mount the app
341
+ app.mount('.app');
232
342
 
233
- // Start vue app
234
- createApp(App).mount('.app');
235
343
 
236
344
  // Remove loading
237
345
  setTimeout(() => {
@@ -240,137 +348,24 @@ window.addEventListener('load', function() {
240
348
  })
241
349
  </script>
242
350
 
243
- <title></title>
351
+ <title>Silex Dashboard</title>
244
352
  <link rel="icon" href="/assets/favicon-32x32.png" />
245
- <meta name="description" property="description" content=""/>
246
- <meta name="og:title" property="og:title" content=""/>
247
- <meta name="og:description" property="og:description" content=""/>
248
- <meta name="og:image" property="og:image" content=""/>
249
- </head>
250
- <body
251
- id="i2hcfw"
252
- class="body app"
253
-
254
-
255
- ><HEADER
256
- id="ij139z"
257
- class="menu-bar "
258
-
259
-
260
- ><A
261
- href="/" id="iy54t1"
262
-
263
-
264
-
265
- ><img
266
- src="/assets/picto-silex@3x.png"
267
- class="nav__logo "
268
-
269
-
270
- ></img></A><NAV
271
- id="in5jeq"
272
- class="nav "
273
-
274
-
275
- ><A
276
- href="/" id="i0g3ac"
277
- class="nav__item uppercase active"
278
- target=""
279
-
280
- >Sites</A><A
281
- href="http://docs.silex.me/" id="i0g3ac"
282
- class="nav__item uppercase "
283
- target="_blank"
284
-
285
- >Docs</A><A
286
- href="https://www.silex.me/" id="i0g3ac"
287
- class="nav__item uppercase "
288
- target="_blank"
289
-
290
- >A propos</A><A
291
- href="https://community.silex.me/" id="i0g3ac"
292
- class="nav__item uppercase "
293
- target="_blank"
294
-
295
- >Communauté</A><A
296
- href="https://mail-list.silexlabs.org/subscription/cemnfkaVrK?locale=fr-FR&source=silex-dashboard" id="i0g3ac"
297
- class="nav__item uppercase "
298
- target="_blank"
299
-
300
- >News</A></NAV><div
301
-
302
- class="lang h-space uppercase "
303
-
304
-
305
- ><A
306
- href="/en"
307
- class="lang__item nav__item "
308
- hreflang="en"
309
-
310
- >en</A><A
311
- href="/fr"
312
- class="lang__item nav__item active"
313
- hreflang="fr"
314
-
315
- >fr</A></div></HEADER><A
316
- id="ixzhcr" href="/"
317
- class="button button-bar__item--secondary "
318
-
319
-
320
- >< Retour</A><div
321
- id="imawg3"
322
- class="bg-silex-purpel "
323
-
324
-
325
- ><div
326
- id="imgx81"
327
- class=" before-js"
328
-
329
-
330
- ><div
331
- id="iikf0s"
332
- class="box text-centered padding-100-30 box_login "
333
-
334
-
335
- ><H1
336
- id="ighycb"
337
- class="title-40 "
338
-
339
-
340
- >Bienvenue sur Silex</H1><div
341
- id="it2175"
342
- class="subtitle-16 "
343
-
344
-
345
- >Merci de vous connecter pour continuer</div><div
346
- id="in62y2"
347
- class="button-bar "
348
-
349
-
350
- ><A
351
- id="isqe61"
352
- class="button big-button "
353
- v-if="!loading" v-for="(connector, index) in connectors" :key="index" :style="{ backgroundColor: connector.background, color: connector.color }" @click="openLogin(connector)"
354
-
355
- ><div
356
- id="io3lid"
357
- class="button-bar__item__icon "
358
- :style='`background: url("${connector.icon}"); background-repeat: no-repeat; background-size: contain;`'
359
-
360
- ></div><div
361
- id="i87asw"
362
-
363
- v-text="connector.displayName"
364
-
365
- >Insert your text here</div></A></div></div><div
366
- id="i9msnk"
367
- class="text-white top-space-20 "
368
- v-if="error" v-html="message"
369
-
370
- >Insert your text here</div><div
371
- id="i6akll"
372
- class="button button--tertiary text-centered "
373
- v-if="error" @click="logout()"
374
-
375
- >Déconnexion</div></div></div></body>
353
+ <meta name="og:title" property="og:title" content="Silex Dashboard"/>
354
+ <link href="https://www.googleapis.com" rel="preconnect" ><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin ><link href="https://www.googleapis.com/css?family=Ubuntu&display=swap" rel="stylesheet" ></head>
355
+ <body id="i2hcfw" class="body app before-js"><A id="ixzhcr" href="/" class="button button-bar__item--secondary">< Retour</A><div id="imawg3" class="bg-silex-purpel"><div id="imgx81" class=""><div id="iikf0s" class="box box_login"><div id="ie0dxn" class="text-centered"><img id="ior0hl" src="/assets/logo-silex.svg"/><p id="it2175" class="subtitle-16">Connectez-vous pour continuer</p><div id="ilq8ui" class="text-centered">Avez-vous besoin d'aide ? Consultez <a href="https://docs.silex.me/fr/user/login" target="_blank">la documentation</a>.</div></div><h3 id="iqc1xf" class="margin-top">Recommandé et gratuit</h3><div id="in62y2">
356
+
357
+
358
+
359
+ <div id="isqe61" class="">
360
+ <a id="i0vhjr" href="/api/connector/login?connectorId=gitlab&type=STORAGE" class="connector__card" data-style="background: rgba(252, 109, 38, 0.2); color: #2B1B63;" title="Gitlab.com est le service que nous recommandons pour héberger votre site web Silex. Nous faisons confiance à l'entreprise derrière ce service, allez les voir."><div id="io3lid" class="button-bar__item__icon"><svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="100%" height="100%" viewBox="0 0 1000 963.197" version="1.1" id="svg85"> <sodipodi:namedview id="namedview87" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageshadow="2" inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" showgrid="false" inkscape:zoom="1" inkscape:cx="991.5" inkscape:cy="964.5" inkscape:window-width="1126" inkscape:window-height="895" inkscape:window-x="774" inkscape:window-y="12" inkscape:window-maximized="0" inkscape:current-layer="svg85" /> <defs id="defs74"> <style id="style72"> .cls-1{fill:#e24329;} .cls-2{fill:#fc6d26;} .cls-3{fill:#fca326;} </style> </defs> <g id="LOGO" transform="matrix(5.2068817,0,0,5.2068817,-489.30756,-507.76085)"> <path class="cls-1" d="m 282.83,170.73 -0.27,-0.69 -26.14,-68.22 a 6.81,6.81 0 0 0 -2.69,-3.24 7,7 0 0 0 -8,0.43 7,7 0 0 0 -2.32,3.52 l -17.65,54 h -71.47 l -17.65,-54 a 6.86,6.86 0 0 0 -2.32,-3.53 7,7 0 0 0 -8,-0.43 6.87,6.87 0 0 0 -2.69,3.24 L 97.44,170 l -0.26,0.69 a 48.54,48.54 0 0 0 16.1,56.1 l 0.09,0.07 0.24,0.17 39.82,29.82 19.7,14.91 12,9.06 a 8.07,8.07 0 0 0 9.76,0 l 12,-9.06 19.7,-14.91 40.06,-30 0.1,-0.08 a 48.56,48.56 0 0 0 16.08,-56.04 z" id="path76" /> <path class="cls-2" d="m 282.83,170.73 -0.27,-0.69 a 88.3,88.3 0 0 0 -35.15,15.8 L 190,229.25 c 19.55,14.79 36.57,27.64 36.57,27.64 l 40.06,-30 0.1,-0.08 a 48.56,48.56 0 0 0 16.1,-56.08 z" id="path78" /> <path class="cls-3" d="m 153.43,256.89 19.7,14.91 12,9.06 a 8.07,8.07 0 0 0 9.76,0 l 12,-9.06 19.7,-14.91 c 0,0 -17.04,-12.89 -36.59,-27.64 -19.55,14.75 -36.57,27.64 -36.57,27.64 z" id="path80" /> <path class="cls-2" d="M 132.58,185.84 A 88.19,88.19 0 0 0 97.44,170 l -0.26,0.69 a 48.54,48.54 0 0 0 16.1,56.1 l 0.09,0.07 0.24,0.17 39.82,29.82 c 0,0 17,-12.85 36.57,-27.64 z" id="path82" /> </g> </svg></div><div id="i87asw" class="connector__description">Se connecter avec GitLab.com</div></a></div>
361
+
362
+ </div><h3 id="i8w75b" class="margin-30">Utilisateurs avancés</h3><div id="igp4xl">
363
+
364
+
365
+
366
+
367
+
368
+ <div id="id9k25" href="" class="">
369
+ <a href="/api/connector/login?connectorId=ftp&type=STORAGE" id="irgt6z" class="connector__card" data-style="background: #0066CC; color: #ffffff;" title="FTP est destiné aux utilisateurs professionnels qui souhaitent héberger leurs sites web avec une société d'hébergement de leur choix.
370
+ "><div class="button-bar__item__icon"><svg xmlns='http://www.w3.org/2000/svg' height='100%' viewBox='0 0 512 512'> <path d='M64 32C28.7 32 0 60.7 0 96v64c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zm280 72a24 24 0 1 1 0 48 24 24 0 1 1 0-48zm48 24a24 24 0 1 1 48 0 24 24 0 1 1 -48 0zM64 288c-35.3 0-64 28.7-64 64v64c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V352c0-35.3-28.7-64-64-64H64zm280 72a24 24 0 1 1 0 48 24 24 0 1 1 0-48zm56 24a24 24 0 1 1 48 0 24 24 0 1 1 -48 0z' /> </svg></div><div class="connector__description">Se connecter avec un FTP</div></a></div></div><div id="i3cney" class="button-bar"><a id="iacshy" class="button big-button connector__card" v-if="!loading" :key="index" :style="{ backgroundColor: connector.background, color: connector.color }" v-for="(connector, index) in connectors" v-on-click="openLogin(connector)"><div id="iiwn36"><div class="button-bar__item__icon" :style="`background: url('${connector.icon}'); background-repeat: no-repeat; background-size: contain;`"></div><div id="if4gvb" class="" v-text="connector.displayName">Name<br/></div></div><div id="isndui">This connector is about blablabla<br/></div></a></div></div><div id="i9msnk" class="text-white top-space-20" v-if="error" v-text="message" :test="message">Insert your text here</div><div id="i6akll" class="button button--tertiary text-centered" v-if="error" v-on:click="logout()">Déconnexion</div></div></div></body>
376
371
  </html>