diff --git a/.gitignore b/.gitignore
index 8703365..0db40ed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -91,3 +91,6 @@ sw.*
# Files marked as sensitive
*.nogit.*
+
+# Now by Vercel
+.now/
diff --git a/components/LoadingSpinner.vue b/components/LoadingSpinner.vue
new file mode 100644
index 0000000..585d91f
--- /dev/null
+++ b/components/LoadingSpinner.vue
@@ -0,0 +1,134 @@
+
+ .la-ball-clip-rotate: div
+
+
+
diff --git a/components/ModalAddReport.vue b/components/ModalAddReport.vue
index c4c811c..9a511d9 100644
--- a/components/ModalAddReport.vue
+++ b/components/ModalAddReport.vue
@@ -3,78 +3,87 @@
v-bind="{...description, action, validation}"
@submit="handleSubmit()"
@delete="$emit('delete')"
- :add-button-text="canSubmit ? 'Envoyer' : false"
+ @close="handleClosed()"
+ :add-button-text="submitButtonText"
:modal-title="modalTitle"
:delete-button-text="null"
+ :close-on-form-submit="closeOnFormSubmit"
+ :close-button="!submitting"
+ :class="{submitting, submitted, errored, 'come-back-later': !canSubmit}"
)
- template(v-if="canSubmit")
- .report-type
- InputButtonsSelect(
- :values="reportTypes"
- :value="value.type"
- @input="$emit('input', { ...value, type: $event })"
- )
- .report-title
- InputField(
- type="text"
- name="title"
- :value="value.title"
- @input="$emit('input', { ...value, title: $event })"
- ) Titre
- .report-message
- template(v-if="value.type === 'BUG'")
+ transition
+ template(v-if="submitting")
+ ScreenLoading(small :fullscreen="false")
+ p Soumission de votre {{ this.value.type === 'BUG' ? 'rapport' : 'idée' }}...
+ template(v-else-if="submitted")
+ ScreenSuccess(small @cta="seeReports()" image="thumbs-up" :fullscreen="false")
+ h1 Merci pour votre contribution !
+ template(#cta) Voir vos rapports
+ template(v-else-if="canSubmit")
+ .report-type
+ InputButtonsSelect(
+ :values="reportTypes"
+ :value="value.type"
+ @input="$emit('input', { ...value, type: $event })"
+ )
+ .report-title
InputField(
- type="block"
- name="what"
- :value="message.what",
- @input="handleMessageInput('what', $event)"
- placeholder="Décrivez le comportement du bug et comment vous l'avez rencontré"
- ) Que s'est-il passé ?
- InputField(
- type="block"
- name="expected"
- :value="message.expected",
- @input="handleMessageInput('expected', $event)"
- placeholder="Décrivez le comportement correct qui aurait dû avoir lieu si le bug n'existait pas"
- ) À quoi vous attendiez-vous ?
- template(v-else)
- InputField(
- type="block"
- name="problem"
- :value="message.problem",
- @input="handleMessageInput('problem', $event)"
- placeholder="Si votre solution ne répond pas à un problème en particulier, expliquez pourquoi elle est utile"
- ) Quel est le problème ?
- InputField(
- type="block"
- name="solution"
- :value="message.solution",
- @input="handleMessageInput('solution', $event)"
- placeholder="N'hésitez pas à rajouter des captures d'écrans et autres ressources que vous pensez utiles."
- ) Quel est votre solution ?
- p.notice
- | Votre rapport sera publié #[a(href="https://github.com/schoolsyst/frontend/issues" target="_blank") sur GitHub], où votre nom d'utilisateur
- | , navigateur, OS et type d'appareil seront visibles, afin d'aider le réglage de votre problème.
- template(v-else-if="submitted")
- ScreenSuccess(small @cta="$router.push('/reports')" image="thumbs-up")
- h1 Merci pour votre contribution !
- template(#cta) Voir vos rapports
- template(v-else="!canSubmit")
- ScreenEmpty(small @cta="$router.push('/')")
- template(#smiley) T_T
- h1 Revenez demain.
- p Pour éviter les abus, il est impossible de publier plus de 5 rapports par jour. Merci pour vos contributions acharnées !
- p Vous pouvez toujours créer votre demande sur github.com directement, mais il faudra vous faudra un compte GitHub.
- template(#cta) Créer une demande sur GitHub
+ type="text"
+ name="title"
+ :value="value.title"
+ @input="$emit('input', { ...value, title: $event })"
+ ) Titre
+ .report-message
+ template(v-if="value.type === 'BUG'")
+ InputField(
+ type="block"
+ name="what"
+ :value="message.what",
+ @input="handleMessageInput('what', $event)"
+ placeholder="Décrivez le comportement du bug et comment vous l'avez rencontré"
+ ) Que s'est-il passé ?
+ InputField(
+ type="block"
+ name="expected"
+ :value="message.expected",
+ @input="handleMessageInput('expected', $event)"
+ placeholder="Décrivez le comportement correct qui aurait dû avoir lieu si le bug n'existait pas"
+ ) À quoi vous attendiez-vous ?
+ template(v-else)
+ InputField(
+ type="block"
+ name="problem"
+ :value="message.problem",
+ @input="handleMessageInput('problem', $event)"
+ placeholder="Si votre solution ne répond pas à un problème en particulier, expliquez pourquoi elle est utile"
+ ) Quel est le problème ?
+ InputField(
+ type="block"
+ name="solution"
+ :value="message.solution",
+ @input="handleMessageInput('solution', $event)"
+ placeholder="N'hésitez pas à rajouter des captures d'écrans et autres ressources que vous pensez utiles."
+ ) Quel est votre solution ?
+ p.notice
+ | Votre rapport sera publié #[a(href="https://github.com/schoolsyst/frontend/issues" target="_blank") sur GitHub], où votre nom d'utilisateur
+ | , navigateur, OS et type d'appareil seront visibles, afin d'aider le réglage de votre problème.
+ template(v-else)
+ ScreenEmpty(small @cta="$router.push('/')")
+ template(#smiley) T_T
+ h1 Revenez demain.
+ p Pour éviter les abus, il est impossible de publier plus de 5 rapports par jour. Merci pour vos contributions acharnées !
+ p Vous pouvez toujours créer votre demande sur github.com directement, mais il faudra vous faudra un compte GitHub.
+ template(#cta) Créer une demande sur GitHub
diff --git a/components/ScreenLoading.vue b/components/ScreenLoading.vue
new file mode 100644
index 0000000..85ee0c0
--- /dev/null
+++ b/components/ScreenLoading.vue
@@ -0,0 +1,57 @@
+
+ .loading-wrapper.loading-state(:class="{small, fullscreen, [`spinner-${spinner}`]: true}")
+ .loading
+ LoadingSpinner
+ .text: slot
+
+
+
+
+
diff --git a/components/ScreenSuccess.vue b/components/ScreenSuccess.vue
index eeebb47..621f4ea 100644
--- a/components/ScreenSuccess.vue
+++ b/components/ScreenSuccess.vue
@@ -1,5 +1,5 @@
- .success-wrapper#success-state(:class="{small, [`image-${image}`]: true}")
+ .success-wrapper.success-state(:class="{small, fullscreen, [`image-${image}`]: true}")
.success
img(:src="`/misc/${image}.svg`")
.text
@@ -19,6 +19,10 @@ export default {
type: Boolean,
default: false,
},
+ fullscreen: {
+ type: Boolean,
+ default: true,
+ },
image: {
type: String,
default: 'checkmark',
diff --git a/layouts/default.vue b/layouts/default.vue
index f56b3cc..dcec99e 100644
--- a/layouts/default.vue
+++ b/layouts/default.vue
@@ -6,7 +6,7 @@
aside.left
TheSideRail
main.right
- ModalAddReport(action="add" v-model="newReport" @submit="postReport({ report: newReport })")
+ ModalAddReport(action="add" v-model="newReport")
nuxt#page
#loading-screen
OverlayLoadingLogo(animation="loop")
@@ -104,7 +104,7 @@ main, .container
.side-by-side
display flex
-#page, /deep/ [id$=-state], /deep/ #loading-screen
+#page, /deep/ [class$=-state].fullscreen, /deep/ #loading-screen
min-height calc(100vh - 100px) //top bar height
/deep/ #loading-screen
diff --git a/nuxt.config.js b/nuxt.config.js
index 5502e8c..5a2ea65 100644
--- a/nuxt.config.js
+++ b/nuxt.config.js
@@ -3,10 +3,10 @@ const metaInfo = {
'Gérez vos notes, prises de cours, devoirs et autres en un seul endroit. Une application web faite par un étudiant, pour les étudiants.',
title: "schoolsyst: une nouvelle façon d'étudier",
url: 'https://www.schoolsyst.com', // We link to the presentation website for SEO tags, better for discovery.
- imagePath: '/assets/schoolsyst-social-preview-card.png' // Hosted on the presentation website
+ imagePath: '/assets/schoolsyst-social-preview-card.png', // Hosted on the presentation website
}
-const getSocialCardPreviewTags = (data) => {
+const getSocialCardPreviewTags = data => {
const tags = []
// Prepend the url to the image
data.image = data.url + data.imagePath
@@ -14,11 +14,11 @@ const getSocialCardPreviewTags = (data) => {
const namespaces = ['og', 'twitter']
const properties = ['title', 'url', 'image', 'description']
- namespaces.forEach((namespace) => {
- properties.forEach((prop) => {
+ namespaces.forEach(namespace => {
+ properties.forEach(prop => {
tags.push({
name: `${namespace}:${prop}`,
- content: data[prop]
+ content: data[prop],
})
})
})
@@ -35,7 +35,7 @@ export default {
*/
head: {
title: 'schoolsyst',
- titleTemplate: (titleChunk) => {
+ titleTemplate: titleChunk => {
return !titleChunk || titleChunk === 'schoolsyst'
? 'schoolsyst'
: titleChunk + ' · schoolsyst'
@@ -50,47 +50,47 @@ export default {
content:
'A complete, centralized school management system made for students, by a student.' ||
process.env.npm_package_description ||
- ''
+ '',
},
{ name: 'apple-mobile-web-app-title', content: 'Schoolsyst' },
{ name: 'application-name', content: 'Schoolsyst' },
{ name: 'msapplication-TileColor', content: '#2d89ef' },
- { name: 'theme-color', content: '#1389df' }
+ { name: 'theme-color', content: '#1389df' },
],
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' },
{
rel: 'apple-touch-icon',
sizes: '180x180',
- href: '/apple-touch-icon.png'
+ href: '/apple-touch-icon.png',
},
{
rel: 'icon',
type: 'image/png',
sizes: '32x32',
- href: '/favicon-32x32.png'
+ href: '/favicon-32x32.png',
},
{
rel: 'icon',
type: 'image/png',
sizes: '16x16',
- href: '/favicon-16x16.png'
+ href: '/favicon-16x16.png',
},
{ rel: 'manifest', href: '/site.webmanifest' },
- { rel: 'mask-icon', href: '/safari-pinned-tab.svg', color: '#1389fd' }
+ { rel: 'mask-icon', href: '/safari-pinned-tab.svg', color: '#1389fd' },
],
script: [
{
- src: '/lottie.min.js'
- }
- ]
+ src: '/lottie.min.js',
+ },
+ ],
},
/*
** Customize the progress-bar color
*/
loading: {
color: 'var(--blue)',
- height: '2px'
+ height: '2px',
},
/*
** Global CSS
@@ -106,7 +106,7 @@ export default {
// Icons
'~/assets/fonts/Material-Icons/import.css',
// Plugins
- '~/plugins/v-tooltip.scss'
+ '~/plugins/v-tooltip.scss',
],
/*
** Plugins to load before mounting the App
@@ -118,14 +118,14 @@ export default {
'~plugins/v-tooltip.js',
'~plugins/vue-konva.js',
'~plugins/vue2-touch-events',
- { src: '~plugins/ga.js', mode: 'client' }
+ { src: '~plugins/ga.js', mode: 'client' },
],
/*
** Nuxt.js dev-modules
*/
buildModules: [
// Doc: https://github.com/nuxt-community/eslint-module
- '@nuxtjs/eslint-module'
+ '@nuxtjs/eslint-module',
// // Doc: https://github.com/nuxt-community/stylelint-module
// '@nuxtjs/stylelint-module'
],
@@ -138,14 +138,14 @@ export default {
'@nuxtjs/pwa',
'@nuxtjs/auth',
'@nuxtjs/toast',
- ['nuxt-vue-select', {}]
+ ['nuxt-vue-select', {}],
],
/*
** Toasts
*/
toast: {
position: 'bottom-left',
- duration: 3000
+ duration: 3000,
},
/*
** Auth module configuration.
@@ -156,24 +156,24 @@ export default {
login: '/login',
logout: '/login',
callback: false,
- home: false
+ home: false,
},
strategies: {
local: {
endpoints: {
login: { url: '/auth/', method: 'post', propertyName: 'token' },
user: { url: '/users/self/', method: 'get', propertyName: '' },
- logout: { url: '/auth/logout/', method: 'post' }
+ logout: { url: '/auth/logout/', method: 'post' },
},
tokenRequired: true,
- tokenType: 'Bearer'
- }
+ tokenType: 'Bearer',
+ },
},
// resetOnError: true,
- rewriteRedirects: false
+ rewriteRedirects: false,
},
router: {
- middleware: ['auth']
+ middleware: ['auth'],
},
/*
** Axios module configuration
@@ -183,7 +183,7 @@ export default {
baseURL:
process.env.NODE_ENV === 'development'
? 'http://localhost:9999/api'
- : 'https://api.schoolsyst.com/api'
+ : 'https://api.schoolsyst.com/api',
},
/*
** Build configuration
@@ -196,7 +196,7 @@ export default {
if (ctx.isDev) {
config.devtool = ctx.isClient ? 'source-map' : 'inline-source-map'
}
- }
+ },
},
pwa: {
meta: {
@@ -207,7 +207,7 @@ export default {
theme_color: '#ffffff',
lang: 'fr',
// Needed to make sure it works w/ iOS, will do testing (See: https://medium.com/@firt/dont-use-ios-web-app-meta-tag-irresponsibly-in-your-progressive-web-apps-85d70f4438cb)
- nativeUI: true
- }
- }
+ nativeUI: true,
+ },
+ },
}