From e5b6fdf9b01550159ad833823b44f7ee469dac20 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Wed, 6 May 2020 22:15:09 +0200 Subject: [PATCH 01/55] =?UTF-8?q?=F0=9F=93=9D=20ORGANIZING=5FCOMPONENTS:?= =?UTF-8?q?=20Adjust=20component=20tree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ORGANIZING_COMPONENTS.md | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/ORGANIZING_COMPONENTS.md b/ORGANIZING_COMPONENTS.md index 2476411..56aab2d 100644 --- a/ORGANIZING_COMPONENTS.md +++ b/ORGANIZING_COMPONENTS.md @@ -2,9 +2,7 @@ Components should be stateless: this makes them easier to debug & test. Appart from utility getters defined in `store/index.js`, no component should import state/getters/actions or mutations (mutations shouldn't be called anywhere except inside actions, by the way.) -Only the pages/layouts are responsible for state CRUD operations. Data should be passed by props to components via `v-bind`, or `v-model` when using inputs, - - +Only the pages/layouts are responsible for state CRUD operations. Data should be passed by props to components via `v-bind`, or `v-model` when using inputs, ## Legend @@ -12,8 +10,8 @@ Only the pages/layouts are responsible for state CRUD operations. Data should be | --------------- | ------------------------------------------ | | *(Italic text)* | Notes | | _Subcomponent_ | Component implemented as a "variant" prop. | -| 🚧 Component | To-Do component | -| 🗃 Component | Stateful components. | +| 🚧 Component | To-Do component | +| 🗃 Component | Stateful components. | | ▶ Component | Components that takes inputs | ## The tree @@ -37,13 +35,9 @@ Only the pages/layouts are responsible for state CRUD operations. Data should be - ▶ Inputs - Text input - - passwords - - date - - - due date (smart) - + - due date (smart) - plain text - *block variant (textarea)* @@ -68,7 +62,7 @@ Only the pages/layouts are responsible for state CRUD operations. Data should be - Links - - inline link + - _inline link_ - State screens @@ -130,24 +124,22 @@ Only the pages/layouts are responsible for state CRUD operations. Data should be - mutation - - ▶ Pickers + - ▶ Pickers _"Modal" not in component names for brevity_ - 🗃 subject _(Only use when using the dropdown is not possible)_ - color - - dialogs + - dialogs _"Modal" not in component names for brevity_ - confirm (w/ challenge) - context menu -- Subject - - - Badge - - - Dot - +- Badges + - Subject + - _dot_ + - _badge_ - Schedule - Unique components (prefixed with "The") _(This is not a base component)_ From 0ba8c3ffe638bdb344eace4823be3724ab6f964c Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Wed, 6 May 2020 22:15:41 +0200 Subject: [PATCH 02/55] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Add=20new=20componen?= =?UTF-8?q?t=20files=20to=20match=20the=20goal=20component=20tree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/BaseBadge.vue | 0 components/BaseButton.vue | 0 components/BaseCard.vue | 0 components/BaseDialog.vue | 0 components/BaseHeading.vue | 0 components/BaseInput.vue | 0 components/BaseInputText.vue | 0 components/BaseLogo.vue | 0 components/BaseModalObject.vue | 0 components/BasePicker.vue | 0 components/BaseScreen.vue | 0 components/ButtonIcon.vue | 0 components/ButtonOutline.vue | 0 components/ButtonPrimary.vue | 0 components/CardAdd.vue | 0 components/DialogConfirm.vue | 0 components/HeadingRegular.vue | 0 components/HeadingUppercase.vue | 0 components/InputCheckbox.vue | 0 components/InputDropdown.vue | 0 components/InputDropdownSubject.vue | 0 components/InputRadios.vue | 0 components/InputRadiosButtons.vue | 0 components/InputTextDate.vue | 0 components/InputTextDueDate.vue | 0 components/InputTextNumber.vue | 0 components/InputTextPassword.vue | 0 components/InputTextPlain.vue | 0 components/Link.vue | 0 components/LogoSymbol.vue | 0 components/ModalObjectEvent.vue | 0 components/ModalObjectGrade.vue | 0 components/ModalObjectHomework.vue | 0 components/ModalObjectMutation.vue | 0 components/ModalObjectSubject.vue | 0 components/ScreenError.vue | 0 components/ScreenLoading.vue | 0 37 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 components/BaseBadge.vue create mode 100644 components/BaseButton.vue create mode 100644 components/BaseCard.vue create mode 100644 components/BaseDialog.vue create mode 100644 components/BaseHeading.vue create mode 100644 components/BaseInput.vue create mode 100644 components/BaseInputText.vue create mode 100644 components/BaseLogo.vue create mode 100644 components/BaseModalObject.vue create mode 100644 components/BasePicker.vue create mode 100644 components/BaseScreen.vue create mode 100644 components/ButtonIcon.vue create mode 100644 components/ButtonOutline.vue create mode 100644 components/ButtonPrimary.vue create mode 100644 components/CardAdd.vue create mode 100644 components/DialogConfirm.vue create mode 100644 components/HeadingRegular.vue create mode 100644 components/HeadingUppercase.vue create mode 100644 components/InputCheckbox.vue create mode 100644 components/InputDropdown.vue create mode 100644 components/InputDropdownSubject.vue create mode 100644 components/InputRadios.vue create mode 100644 components/InputRadiosButtons.vue create mode 100644 components/InputTextDate.vue create mode 100644 components/InputTextDueDate.vue create mode 100644 components/InputTextNumber.vue create mode 100644 components/InputTextPassword.vue create mode 100644 components/InputTextPlain.vue create mode 100644 components/Link.vue create mode 100644 components/LogoSymbol.vue create mode 100644 components/ModalObjectEvent.vue create mode 100644 components/ModalObjectGrade.vue create mode 100644 components/ModalObjectHomework.vue create mode 100644 components/ModalObjectMutation.vue create mode 100644 components/ModalObjectSubject.vue create mode 100644 components/ScreenError.vue create mode 100644 components/ScreenLoading.vue diff --git a/components/BaseBadge.vue b/components/BaseBadge.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/BaseButton.vue b/components/BaseButton.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/BaseCard.vue b/components/BaseCard.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/BaseDialog.vue b/components/BaseDialog.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/BaseHeading.vue b/components/BaseHeading.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/BaseInput.vue b/components/BaseInput.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/BaseInputText.vue b/components/BaseInputText.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/BaseLogo.vue b/components/BaseLogo.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/BaseModalObject.vue b/components/BaseModalObject.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/BasePicker.vue b/components/BasePicker.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/BaseScreen.vue b/components/BaseScreen.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/ButtonIcon.vue b/components/ButtonIcon.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/ButtonOutline.vue b/components/ButtonOutline.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/ButtonPrimary.vue b/components/ButtonPrimary.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/CardAdd.vue b/components/CardAdd.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/DialogConfirm.vue b/components/DialogConfirm.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/HeadingRegular.vue b/components/HeadingRegular.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/HeadingUppercase.vue b/components/HeadingUppercase.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/InputCheckbox.vue b/components/InputCheckbox.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/InputDropdown.vue b/components/InputDropdown.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/InputDropdownSubject.vue b/components/InputDropdownSubject.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/InputRadios.vue b/components/InputRadios.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/InputRadiosButtons.vue b/components/InputRadiosButtons.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/InputTextDate.vue b/components/InputTextDate.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/InputTextDueDate.vue b/components/InputTextDueDate.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/InputTextNumber.vue b/components/InputTextNumber.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/InputTextPassword.vue b/components/InputTextPassword.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/InputTextPlain.vue b/components/InputTextPlain.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/Link.vue b/components/Link.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/LogoSymbol.vue b/components/LogoSymbol.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/ModalObjectEvent.vue b/components/ModalObjectEvent.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/ModalObjectGrade.vue b/components/ModalObjectGrade.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/ModalObjectHomework.vue b/components/ModalObjectHomework.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/ModalObjectMutation.vue b/components/ModalObjectMutation.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/ModalObjectSubject.vue b/components/ModalObjectSubject.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/ScreenError.vue b/components/ScreenError.vue new file mode 100644 index 0000000..e69de29 diff --git a/components/ScreenLoading.vue b/components/ScreenLoading.vue new file mode 100644 index 0000000..e69de29 From b127f585f647d2a199a4a2af29e59960d00b9070 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Sun, 17 May 2020 23:15:08 +0200 Subject: [PATCH 03/55] =?UTF-8?q?=F0=9F=9A=9A=20Move=20old=20components=20?= =?UTF-8?q?to=20~/components/legacy/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/CardHomework.vue | 6 +- components/{ => legacy}/BadgeSubject.vue | 2 +- components/{ => legacy}/BaseBadge.vue | 0 .../{BaseDialog.vue => legacy/BaseButton.vue} | 0 .../{BaseHeading.vue => legacy/BaseCard.vue} | 0 .../{BaseInput.vue => legacy/BaseDialog.vue} | 0 .../BaseHeading.vue} | 0 .../{BaseLogo.vue => legacy/BaseInput.vue} | 0 .../BaseInputText.vue} | 0 .../{BasePicker.vue => legacy/BaseLogo.vue} | 0 components/{ => legacy}/BaseModal.vue | 2 +- .../BaseModalObject.vue} | 0 .../{ButtonIcon.vue => legacy/BasePicker.vue} | 0 .../BaseScreen.vue} | 0 .../{CardAdd.vue => legacy/ButtonIcon.vue} | 0 components/{ => legacy}/ButtonNormal.vue | 0 .../ButtonOutline.vue} | 0 .../ButtonPrimary.vue} | 0 .../CardAdd.vue} | 0 components/{ => legacy}/CardCourse.vue | 6 +- components/{ => legacy}/CardGrade.vue | 4 +- components/legacy/CardHomework.vue | 187 ++++++++++++++++++ components/{ => legacy}/CardMutation.vue | 2 +- components/{ => legacy}/CardNote.vue | 4 +- components/{ => legacy}/CardReport.vue | 4 +- components/{ => legacy}/CardSubject.vue | 4 +- components/{ => legacy}/Checkbox.vue | 2 +- .../DialogConfirm.vue} | 0 .../HeadingRegular.vue} | 0 components/{ => legacy}/HeadingSub.vue | 0 .../HeadingUppercase.vue} | 0 components/{ => legacy}/Icon.vue | 0 .../{ => legacy}/InputButtonsSelect.vue | 2 +- .../InputCheckbox.vue} | 0 .../InputDropdown.vue} | 0 .../InputDropdownSubject.vue} | 0 components/{ => legacy}/InputField.vue | 0 .../InputRadios.vue} | 0 .../InputRadiosButtons.vue} | 0 components/{ => legacy}/InputSelect.vue | 0 .../{ => legacy}/InputSelectSubject.vue | 6 +- components/{ => legacy}/InputSetting.vue | 8 +- .../InputTextDate.vue} | 0 .../InputTextDueDate.vue} | 0 .../{Link.vue => legacy/InputTextNumber.vue} | 0 .../InputTextPassword.vue} | 0 .../InputTextPlain.vue} | 0 .../{ModalObjectGrade.vue => legacy/Link.vue} | 0 components/{ => legacy}/LogoCompound.vue | 0 .../LogoSymbol.vue} | 0 components/{ => legacy}/LogoWordmark.vue | 0 components/{ => legacy}/ModalAddEvent.vue | 14 +- components/{ => legacy}/ModalAddGrade.vue | 10 +- components/{ => legacy}/ModalAddHomework.vue | 16 +- components/{ => legacy}/ModalAddReport.vue | 10 +- components/{ => legacy}/ModalAddSubject.vue | 8 +- .../{ => legacy}/ModalDialogConfirm.vue | 4 +- components/{ => legacy}/ModalNoteDownload.vue | 14 +- components/{ => legacy}/ModalObject.vue | 4 +- .../ModalObjectEvent.vue} | 0 .../ModalObjectGrade.vue} | 0 .../ModalObjectHomework.vue} | 0 .../ModalObjectMutation.vue} | 0 components/legacy/ModalObjectSubject.vue | 0 components/{ => legacy}/NavbarButton.vue | 0 .../{ => legacy}/OverlayLoadingLogo.vue | 0 components/{ => legacy}/PickerColor.vue | 6 +- components/{ => legacy}/PickerDateDue.vue | 10 +- components/{ => legacy}/PickerSubject.vue | 4 +- components/{ => legacy}/RadioButtons.vue | 0 components/{ => legacy}/Schedule.vue | 2 +- components/{ => legacy}/ScreenEmpty.vue | 2 +- components/legacy/ScreenError.vue | 0 components/legacy/ScreenLoading.vue | 0 components/{ => legacy}/ScreenSuccess.vue | 2 +- components/{ => legacy}/TheBottomBar.vue | 0 components/{ => legacy}/TheDrawer.vue | 8 +- components/{ => legacy}/TheFooter.vue | 6 +- components/{ => legacy}/TheHeading.vue | 0 components/{ => legacy}/TheSideRail.vue | 2 +- components/{ => legacy}/TheTopBar.vue | 6 +- layouts/bare.vue | 2 +- layouts/default.vue | 14 +- pages/grades/index.vue | 16 +- pages/homework/index.vue | 14 +- pages/login.vue | 8 +- pages/logout.vue | 2 +- pages/notes/_uuid.vue | 14 +- pages/notes/index.vue | 22 +-- pages/register.vue | 6 +- pages/reports/index.vue | 8 +- pages/reset-password/choose.vue | 6 +- pages/reset-password/index.vue | 4 +- pages/schedule/index.vue | 8 +- pages/settings/index.vue | 14 +- pages/setup/index.vue | 2 +- pages/setup/schedule/events.vue | 14 +- pages/setup/schedule/settings.vue | 10 +- pages/setup/settings.vue | 8 +- pages/setup/subjects.vue | 10 +- pages/timeline/index.vue | 8 +- tests/components/CardHomework.test.js | 12 +- tests/components/CardNote.test.js | 2 +- tests/components/CardReport.test.js | 2 +- tests/components/CardSubject.test.js | 2 +- tests/components/Icon.test.js | 2 +- 106 files changed, 382 insertions(+), 195 deletions(-) rename components/{ => legacy}/BadgeSubject.vue (98%) rename components/{ => legacy}/BaseBadge.vue (100%) rename components/{BaseDialog.vue => legacy/BaseButton.vue} (100%) rename components/{BaseHeading.vue => legacy/BaseCard.vue} (100%) rename components/{BaseInput.vue => legacy/BaseDialog.vue} (100%) rename components/{BaseInputText.vue => legacy/BaseHeading.vue} (100%) rename components/{BaseLogo.vue => legacy/BaseInput.vue} (100%) rename components/{BaseModalObject.vue => legacy/BaseInputText.vue} (100%) rename components/{BasePicker.vue => legacy/BaseLogo.vue} (100%) rename components/{ => legacy}/BaseModal.vue (98%) rename components/{BaseScreen.vue => legacy/BaseModalObject.vue} (100%) rename components/{ButtonIcon.vue => legacy/BasePicker.vue} (100%) rename components/{ButtonOutline.vue => legacy/BaseScreen.vue} (100%) rename components/{CardAdd.vue => legacy/ButtonIcon.vue} (100%) rename components/{ => legacy}/ButtonNormal.vue (100%) rename components/{DialogConfirm.vue => legacy/ButtonOutline.vue} (100%) rename components/{HeadingRegular.vue => legacy/ButtonPrimary.vue} (100%) rename components/{HeadingUppercase.vue => legacy/CardAdd.vue} (100%) rename components/{ => legacy}/CardCourse.vue (93%) rename components/{ => legacy}/CardGrade.vue (96%) create mode 100644 components/legacy/CardHomework.vue rename components/{ => legacy}/CardMutation.vue (95%) rename components/{ => legacy}/CardNote.vue (96%) rename components/{ => legacy}/CardReport.vue (95%) rename components/{ => legacy}/CardSubject.vue (93%) rename components/{ => legacy}/Checkbox.vue (97%) rename components/{InputCheckbox.vue => legacy/DialogConfirm.vue} (100%) rename components/{InputDropdown.vue => legacy/HeadingRegular.vue} (100%) rename components/{ => legacy}/HeadingSub.vue (100%) rename components/{InputDropdownSubject.vue => legacy/HeadingUppercase.vue} (100%) rename components/{ => legacy}/Icon.vue (100%) rename components/{ => legacy}/InputButtonsSelect.vue (94%) rename components/{InputRadios.vue => legacy/InputCheckbox.vue} (100%) rename components/{InputRadiosButtons.vue => legacy/InputDropdown.vue} (100%) rename components/{InputTextDate.vue => legacy/InputDropdownSubject.vue} (100%) rename components/{ => legacy}/InputField.vue (100%) rename components/{InputTextDueDate.vue => legacy/InputRadios.vue} (100%) rename components/{InputTextNumber.vue => legacy/InputRadiosButtons.vue} (100%) rename components/{ => legacy}/InputSelect.vue (100%) rename components/{ => legacy}/InputSelectSubject.vue (89%) rename components/{ => legacy}/InputSetting.vue (89%) rename components/{InputTextPassword.vue => legacy/InputTextDate.vue} (100%) rename components/{InputTextPlain.vue => legacy/InputTextDueDate.vue} (100%) rename components/{Link.vue => legacy/InputTextNumber.vue} (100%) rename components/{LogoSymbol.vue => legacy/InputTextPassword.vue} (100%) rename components/{ModalObjectEvent.vue => legacy/InputTextPlain.vue} (100%) rename components/{ModalObjectGrade.vue => legacy/Link.vue} (100%) rename components/{ => legacy}/LogoCompound.vue (100%) rename components/{ModalObjectHomework.vue => legacy/LogoSymbol.vue} (100%) rename components/{ => legacy}/LogoWordmark.vue (100%) rename components/{ => legacy}/ModalAddEvent.vue (91%) rename components/{ => legacy}/ModalAddGrade.vue (94%) rename components/{ => legacy}/ModalAddHomework.vue (88%) rename components/{ => legacy}/ModalAddReport.vue (94%) rename components/{ => legacy}/ModalAddSubject.vue (91%) rename components/{ => legacy}/ModalDialogConfirm.vue (96%) rename components/{ => legacy}/ModalNoteDownload.vue (89%) rename components/{ => legacy}/ModalObject.vue (94%) rename components/{ModalObjectMutation.vue => legacy/ModalObjectEvent.vue} (100%) rename components/{ModalObjectSubject.vue => legacy/ModalObjectGrade.vue} (100%) rename components/{ScreenError.vue => legacy/ModalObjectHomework.vue} (100%) rename components/{ScreenLoading.vue => legacy/ModalObjectMutation.vue} (100%) create mode 100644 components/legacy/ModalObjectSubject.vue rename components/{ => legacy}/NavbarButton.vue (100%) rename components/{ => legacy}/OverlayLoadingLogo.vue (100%) rename components/{ => legacy}/PickerColor.vue (96%) rename components/{ => legacy}/PickerDateDue.vue (95%) rename components/{ => legacy}/PickerSubject.vue (91%) rename components/{ => legacy}/RadioButtons.vue (100%) rename components/{ => legacy}/Schedule.vue (99%) rename components/{ => legacy}/ScreenEmpty.vue (93%) create mode 100644 components/legacy/ScreenError.vue create mode 100644 components/legacy/ScreenLoading.vue rename components/{ => legacy}/ScreenSuccess.vue (94%) rename components/{ => legacy}/TheBottomBar.vue (100%) rename components/{ => legacy}/TheDrawer.vue (93%) rename components/{ => legacy}/TheFooter.vue (92%) rename components/{ => legacy}/TheHeading.vue (100%) rename components/{ => legacy}/TheSideRail.vue (97%) rename components/{ => legacy}/TheTopBar.vue (91%) diff --git a/components/CardHomework.vue b/components/CardHomework.vue index 978005b..d41beaa 100644 --- a/components/CardHomework.vue +++ b/components/CardHomework.vue @@ -23,9 +23,9 @@ + + diff --git a/components/CardMutation.vue b/components/legacy/CardMutation.vue similarity index 95% rename from components/CardMutation.vue rename to components/legacy/CardMutation.vue index 4531cda..be4b712 100644 --- a/components/CardMutation.vue +++ b/components/legacy/CardMutation.vue @@ -18,7 +18,7 @@ import { mapGetters } from 'vuex' import { format } from 'date-fns' import { fr } from 'date-fns/locale' -import BadgeSubject from '~/components/BadgeSubject.vue' +import BadgeSubject from '~/components/legacy/BadgeSubject.vue' export default { components: { BadgeSubject }, diff --git a/components/CardNote.vue b/components/legacy/CardNote.vue similarity index 96% rename from components/CardNote.vue rename to components/legacy/CardNote.vue index 35410a0..2489111 100644 --- a/components/CardNote.vue +++ b/components/legacy/CardNote.vue @@ -25,8 +25,8 @@ + + diff --git a/components/BaseCard.vue b/components/BaseCard.vue index e69de29..917f0d8 100644 --- a/components/BaseCard.vue +++ b/components/BaseCard.vue @@ -0,0 +1,57 @@ + + + diff --git a/components/ButtonPrimary.vue b/components/ButtonPrimary.vue index e69de29..0f441ad 100644 --- a/components/ButtonPrimary.vue +++ b/components/ButtonPrimary.vue @@ -0,0 +1,98 @@ + + + + + From afac96ea1e9e410c7a1261d07dc5054142815bd2 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Mon, 18 May 2020 10:06:57 +0200 Subject: [PATCH 05/55] =?UTF-8?q?=F0=9F=9A=A7=20=20Handle?= =?UTF-8?q?=20[dangerous]=20*and*=20[disabled]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/ButtonPrimary.vue | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/components/ButtonPrimary.vue b/components/ButtonPrimary.vue index 0f441ad..11dc0bc 100644 --- a/components/ButtonPrimary.vue +++ b/components/ButtonPrimary.vue @@ -43,7 +43,10 @@ export default { //Spacing // .--button-primary - padding .7em 1.2em + padding 0.8em 1.4em + +.small + padding 0.5em 0.7em // //Decoration @@ -78,19 +81,26 @@ export default { //Reactions // .--button-primary:hover, .--button-primary:focus - border 1px solid var(--blue) - color var(--blue) + border 1px solid - &.dangerous + &:not(.dangerous):not(.disabled) + border-color var(--blue) + color var(--blue) + + &.dangerous:not(.disabled) border-color var(--red) + color var(--red) &.disabled border-color var(--black) + &.disabled.dangerous + border-color var(--red) + .--button-primary.clicked:not(.disabled) + border-color var(--blue-dark) background-color var(--blue-offset-dark) color var(--blue-dark) - border-color var(--blue-dark) &.dangerous background-color var(--red-offset-dark) From d37399c1e7592f46f9c6162f043bc48a395e8139 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Mon, 18 May 2020 10:23:59 +0200 Subject: [PATCH 06/55] =?UTF-8?q?=F0=9F=9A=9A=20Move=20legacy=20component?= =?UTF-8?q?=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/components/{ => legacy}/BadgeSubject.test.js | 4 ++-- tests/components/{ => legacy}/BaseModal.test.js | 10 +++++----- tests/components/{ => legacy}/ButtonNormal.test.js | 14 +++++++------- tests/components/{ => legacy}/CardCourse.test.js | 14 +++++++------- tests/components/{ => legacy}/CardHomework.test.js | 2 +- tests/components/{ => legacy}/CardNote.test.js | 2 +- tests/components/{ => legacy}/CardReport.test.js | 2 +- tests/components/{ => legacy}/CardSubject.test.js | 2 +- tests/components/{ => legacy}/Icon.test.js | 2 +- .../__snapshots__/BadgeSubject.test.js.snap | 0 .../__snapshots__/CardCourse.test.js.snap | 0 .../__snapshots__/CardHomework.test.js.snap | 0 .../__snapshots__/CardNote.test.js.snap | 0 .../__snapshots__/CardReport.test.js.snap | 0 .../__snapshots__/CardSubject.test.js.snap | 0 .../{ => legacy}/__snapshots__/Icon.test.js.snap | 0 16 files changed, 26 insertions(+), 26 deletions(-) rename tests/components/{ => legacy}/BadgeSubject.test.js (93%) rename tests/components/{ => legacy}/BaseModal.test.js (91%) rename tests/components/{ => legacy}/ButtonNormal.test.js (90%) rename tests/components/{ => legacy}/CardCourse.test.js (84%) rename tests/components/{ => legacy}/CardHomework.test.js (97%) rename tests/components/{ => legacy}/CardNote.test.js (93%) rename tests/components/{ => legacy}/CardReport.test.js (92%) rename tests/components/{ => legacy}/CardSubject.test.js (95%) rename tests/components/{ => legacy}/Icon.test.js (91%) rename tests/components/{ => legacy}/__snapshots__/BadgeSubject.test.js.snap (100%) rename tests/components/{ => legacy}/__snapshots__/CardCourse.test.js.snap (100%) rename tests/components/{ => legacy}/__snapshots__/CardHomework.test.js.snap (100%) rename tests/components/{ => legacy}/__snapshots__/CardNote.test.js.snap (100%) rename tests/components/{ => legacy}/__snapshots__/CardReport.test.js.snap (100%) rename tests/components/{ => legacy}/__snapshots__/CardSubject.test.js.snap (100%) rename tests/components/{ => legacy}/__snapshots__/Icon.test.js.snap (100%) diff --git a/tests/components/BadgeSubject.test.js b/tests/components/legacy/BadgeSubject.test.js similarity index 93% rename from tests/components/BadgeSubject.test.js rename to tests/components/legacy/BadgeSubject.test.js index 79c2c15..baf957e 100644 --- a/tests/components/BadgeSubject.test.js +++ b/tests/components/legacy/BadgeSubject.test.js @@ -1,8 +1,8 @@ import { mount, createLocalVue } from '@vue/test-utils' import VTooltip from 'v-tooltip' import Vuex from 'vuex' -import BadgeSubject from '../../components/BadgeSubject.vue' -import { getters } from '../../store/index' +import BadgeSubject from '../../../components/legacy/BadgeSubject.vue' +import { getters } from '../../../store/index' const vue = createLocalVue() vue.directive('tooltip', VTooltip) diff --git a/tests/components/BaseModal.test.js b/tests/components/legacy/BaseModal.test.js similarity index 91% rename from tests/components/BaseModal.test.js rename to tests/components/legacy/BaseModal.test.js index db0d73b..97e9e9a 100644 --- a/tests/components/BaseModal.test.js +++ b/tests/components/legacy/BaseModal.test.js @@ -1,17 +1,17 @@ import { mount, createLocalVue } from '@vue/test-utils' -import BaseModal from '../../components/BaseModal.vue' -import $modal from '../../plugins/vue-js-modal' +import BaseModal from '../../../components/legacy/BaseModal.vue' +import $modal from '../../../plugins/vue-js-modal' const vue = createLocalVue() vue.use($modal) describe('', () => { - const getModal = (props) => + const getModal = props => mount(BaseModal, { propsData: { name: 'lorem-ipsum', - ...props - } + ...props, + }, }) describe('opened', () => { test('is visible', () => { diff --git a/tests/components/ButtonNormal.test.js b/tests/components/legacy/ButtonNormal.test.js similarity index 90% rename from tests/components/ButtonNormal.test.js rename to tests/components/legacy/ButtonNormal.test.js index e503837..ce1f0fd 100644 --- a/tests/components/ButtonNormal.test.js +++ b/tests/components/legacy/ButtonNormal.test.js @@ -1,9 +1,9 @@ import { mount, createLocalVue } from '@vue/test-utils' import VTooltip from 'v-tooltip' -import ButtonNormal from '../../components/ButtonNormal.vue' +import ButtonNormal from '../../../components/legacy/ButtonNormal.vue' const vue = createLocalVue() vue.directive('tooltip', VTooltip) -const getButtonNormal = (props) => +const getButtonNormal = props => mount(ButtonNormal, { propsData: props, localVue: vue }) describe('', () => { @@ -39,9 +39,9 @@ describe('', () => { validation: { validated: false, errors: { - lorem: ['ipsum', 'dolor', 'sit'] - } - } + lorem: ['ipsum', 'dolor', 'sit'], + }, + }, }) expect(Object.keys(btn.get('.btn').attributes())).toContain('disabled') expect(btn.vm.validationErrors).toBe( @@ -53,8 +53,8 @@ describe('', () => { const btn = getButtonNormal({ validation: { validated: true, - errors: {} - } + errors: {}, + }, }) expect(btn.get('.btn').attributes()).not.toContain('disabled') }) diff --git a/tests/components/CardCourse.test.js b/tests/components/legacy/CardCourse.test.js similarity index 84% rename from tests/components/CardCourse.test.js rename to tests/components/legacy/CardCourse.test.js index 24d689e..8ae23de 100644 --- a/tests/components/CardCourse.test.js +++ b/tests/components/legacy/CardCourse.test.js @@ -1,23 +1,23 @@ import { mount, createLocalVue } from '@vue/test-utils' import VTooltip from 'v-tooltip' import Vuex from 'vuex' -import CardCourse from '../../components/CardCourse.vue' -import { getters } from '../../store/index' +import CardCourse from '../../../components/legacy/CardCourse.vue' +import { getters } from '../../../store/index' const vue = createLocalVue() vue.use(Vuex) vue.directive('tooltip', VTooltip) const mockSubject = { - color: 'red' + color: 'red', } const store = { - getters: { textColor: getters.textColor } + getters: { textColor: getters.textColor }, } -const mnt = (props) => +const mnt = props => mount(CardCourse, { propsData: { subject: mockSubject, ...props }, localVue: vue, - store + store, }) describe('', () => { @@ -38,7 +38,7 @@ describe('', () => { const CardCourse = mnt({ room: 'L102', start: new Date(0), - end: new Date(3600 * 1000) + end: new Date(3600 * 1000), }) expect(CardCourse).toMatchSnapshot() }) diff --git a/tests/components/CardHomework.test.js b/tests/components/legacy/CardHomework.test.js similarity index 97% rename from tests/components/CardHomework.test.js rename to tests/components/legacy/CardHomework.test.js index 489c7eb..49c692e 100644 --- a/tests/components/CardHomework.test.js +++ b/tests/components/legacy/CardHomework.test.js @@ -1,4 +1,4 @@ -import { bootstrapComponentTest } from '../utils' +import { bootstrapComponentTest } from '../../utils' import CardHomework from '~/components/legacy/CardHomework.vue' // import homework from '~/store/homework' diff --git a/tests/components/CardNote.test.js b/tests/components/legacy/CardNote.test.js similarity index 93% rename from tests/components/CardNote.test.js rename to tests/components/legacy/CardNote.test.js index e232b35..e854a42 100644 --- a/tests/components/CardNote.test.js +++ b/tests/components/legacy/CardNote.test.js @@ -1,4 +1,4 @@ -import { bootstrapComponentTest } from '../utils' +import { bootstrapComponentTest } from '../../utils' import CardNote from '~/components/legacy/CardNote.vue' const { mnt } = bootstrapComponentTest( diff --git a/tests/components/CardReport.test.js b/tests/components/legacy/CardReport.test.js similarity index 92% rename from tests/components/CardReport.test.js rename to tests/components/legacy/CardReport.test.js index 2cd5e9b..81c3288 100644 --- a/tests/components/CardReport.test.js +++ b/tests/components/legacy/CardReport.test.js @@ -1,4 +1,4 @@ -import { bootstrapComponentTest } from '../utils' +import { bootstrapComponentTest } from '../../utils' import CardReport from '~/components/legacy/CardReport.vue' const { mnt } = bootstrapComponentTest( diff --git a/tests/components/CardSubject.test.js b/tests/components/legacy/CardSubject.test.js similarity index 95% rename from tests/components/CardSubject.test.js rename to tests/components/legacy/CardSubject.test.js index e51dea2..c0e6abe 100644 --- a/tests/components/CardSubject.test.js +++ b/tests/components/legacy/CardSubject.test.js @@ -1,7 +1,7 @@ import { shallowMount, createLocalVue } from '@vue/test-utils' import VTooltip from 'v-tooltip' import Vuex from 'vuex' -import { getters } from '../../store/index' +import { getters } from '../../../store/index' import CardSubject from '~/components/legacy/CardSubject.vue' const vue = createLocalVue() diff --git a/tests/components/Icon.test.js b/tests/components/legacy/Icon.test.js similarity index 91% rename from tests/components/Icon.test.js rename to tests/components/legacy/Icon.test.js index 31cd220..b7a13a2 100644 --- a/tests/components/Icon.test.js +++ b/tests/components/legacy/Icon.test.js @@ -1,4 +1,4 @@ -import { bootstrapComponentTest } from '../utils' +import { bootstrapComponentTest } from '../../utils' import Icon from '~/components/legacy/Icon.vue' const { mnt } = bootstrapComponentTest( diff --git a/tests/components/__snapshots__/BadgeSubject.test.js.snap b/tests/components/legacy/__snapshots__/BadgeSubject.test.js.snap similarity index 100% rename from tests/components/__snapshots__/BadgeSubject.test.js.snap rename to tests/components/legacy/__snapshots__/BadgeSubject.test.js.snap diff --git a/tests/components/__snapshots__/CardCourse.test.js.snap b/tests/components/legacy/__snapshots__/CardCourse.test.js.snap similarity index 100% rename from tests/components/__snapshots__/CardCourse.test.js.snap rename to tests/components/legacy/__snapshots__/CardCourse.test.js.snap diff --git a/tests/components/__snapshots__/CardHomework.test.js.snap b/tests/components/legacy/__snapshots__/CardHomework.test.js.snap similarity index 100% rename from tests/components/__snapshots__/CardHomework.test.js.snap rename to tests/components/legacy/__snapshots__/CardHomework.test.js.snap diff --git a/tests/components/__snapshots__/CardNote.test.js.snap b/tests/components/legacy/__snapshots__/CardNote.test.js.snap similarity index 100% rename from tests/components/__snapshots__/CardNote.test.js.snap rename to tests/components/legacy/__snapshots__/CardNote.test.js.snap diff --git a/tests/components/__snapshots__/CardReport.test.js.snap b/tests/components/legacy/__snapshots__/CardReport.test.js.snap similarity index 100% rename from tests/components/__snapshots__/CardReport.test.js.snap rename to tests/components/legacy/__snapshots__/CardReport.test.js.snap diff --git a/tests/components/__snapshots__/CardSubject.test.js.snap b/tests/components/legacy/__snapshots__/CardSubject.test.js.snap similarity index 100% rename from tests/components/__snapshots__/CardSubject.test.js.snap rename to tests/components/legacy/__snapshots__/CardSubject.test.js.snap diff --git a/tests/components/__snapshots__/Icon.test.js.snap b/tests/components/legacy/__snapshots__/Icon.test.js.snap similarity index 100% rename from tests/components/__snapshots__/Icon.test.js.snap rename to tests/components/legacy/__snapshots__/Icon.test.js.snap From 6b7fc2f0f6173594efcff0fb770dcd9f0d778f64 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Mon, 18 May 2020 10:34:26 +0200 Subject: [PATCH 07/55] =?UTF-8?q?=F0=9F=92=84=20=20Add=20di?= =?UTF-8?q?splay:=20inline-block?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/ButtonPrimary.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/ButtonPrimary.vue b/components/ButtonPrimary.vue index 11dc0bc..294a008 100644 --- a/components/ButtonPrimary.vue +++ b/components/ButtonPrimary.vue @@ -34,6 +34,8 @@ export default { // //Positioning // +.--button-primary + display inline-block // //Sizing From 05f1f81d904b68a09e540ee2efd66a3254f5ddd6 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Mon, 18 May 2020 10:37:10 +0200 Subject: [PATCH 08/55] =?UTF-8?q?=F0=9F=93=9D=20CONTRIBUTING:=20Use=20HTML?= =?UTF-8?q?=20instead=20of=20pug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sure, I _personally_ find pug way cleaner than HTML, but: * the latter is much more supported and provides better integration in IDEs for .vue files * it lowers the barrier to entry for people wanting to contribute (few people know pug) --- CONTRIBUTING.adoc | 56 ++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 39 deletions(-) diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 0f6ae0b..5b302d5 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -163,32 +163,9 @@ order(objects, { by: '_your_default_sorting_method_' }) :: ## Code clarity guidelines ### In vue files' - From 0e19a645da0624ffdf0b06477f780a5886a8fce4 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Thu, 21 May 2020 21:46:08 +0200 Subject: [PATCH 26/55] =?UTF-8?q?=F0=9F=94=8C=20Add=20`isIn`=20validator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/validators.js | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/validators.js b/utils/validators.js index 63c8752..a4cb20f 100644 --- a/utils/validators.js +++ b/utils/validators.js @@ -1,3 +1,4 @@ export const isHexColor = value => /^#([0-9a-fA-F]{3}){1,2}$/.test(value) export const isURL = value => /^(ftp|https?):\/\/([\w\d-]+\.)+\w{2,}(\/.+)?$/.test(value) +export const isIn = allowedValues => value => allowedValues.includes(value) From 9753bd04a9f9deaadf76873b3b35d16334138fdc Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Thu, 21 May 2020 23:02:04 +0200 Subject: [PATCH 27/55] =?UTF-8?q?=F0=9F=94=8C=20=20Handle=20inte?= =?UTF-8?q?rnal=20&=20external=20links=20properly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/TextLink.vue | 67 +++++++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/components/TextLink.vue b/components/TextLink.vue index ac3998b..8c85941 100644 --- a/components/TextLink.vue +++ b/components/TextLink.vue @@ -1,7 +1,11 @@ @@ -43,12 +92,12 @@ export default Vue.extend({ border-bottom 2px solid .--text-link.external::after - font-family: 'Material Icons' - content: '\e89e' - font-size: 1.2em - margin-left: 0.1em - position: relative - bottom: -.1em + position relative + bottom -0.1em + margin-left 0.1em + content '\e89e' + font-size 1.2em + font-family 'Material Icons' // //Colors From 96edc76667fc4a6a7c9c188a1cc2938bbe4103db Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Thu, 21 May 2020 23:02:44 +0200 Subject: [PATCH 28/55] =?UTF-8?q?=F0=9F=9A=A7=20Start=20creating=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/BaseInput.vue | 137 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 components/BaseInput.vue diff --git a/components/BaseInput.vue b/components/BaseInput.vue new file mode 100644 index 0000000..c37840a --- /dev/null +++ b/components/BaseInput.vue @@ -0,0 +1,137 @@ + + + + + From e7ce25ce2f810eca03c74b32c02565a166f70a27 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 09:12:35 +0200 Subject: [PATCH 29/55] =?UTF-8?q?=F0=9F=93=9D=20CONTRIBUTING:=20Add=20sect?= =?UTF-8?q?ion=20about=20outer=20margins=20on=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.adoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 5b302d5..b2b12fa 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -25,6 +25,10 @@ Additionally, prefix component names with the following: | UI Component that are made for user data input |=== +### No outer margins on components + +Components should not include any king of spacing on the component's root element: components and pages that includes a component should be responsible for its spacing relative to the other elements included. + ### Inheritance [%header, cols=2*] From 826c22bb6f4607ba05ea6ab05525ad23d90fd774 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 09:28:52 +0200 Subject: [PATCH 30/55] =?UTF-8?q?=F0=9F=90=9B=20=20Apply=20noope?= =?UTF-8?q?ner,=20noreferrer=20to=20`isExternal`,=20not=20[new-tab]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/TextLink.vue | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/TextLink.vue b/components/TextLink.vue index 8c85941..458118f 100644 --- a/components/TextLink.vue +++ b/components/TextLink.vue @@ -54,10 +54,9 @@ export default Vue.extend({ }, rel(): string | null { let relArray: string[] = [] - // Use rel="external" when relevant - if (this.isExternal) relArray = [...relArray, 'external'] // Prevent leaks via `Window.opener` - if (this.newTab) relArray = [...relArray, 'noopener', 'noreferrer'] + if (this.isExternal) + relArray = [...relArray, 'external', 'noopener', 'noreferrer'] // rel list is space-separated const relString = relArray.join(' ') // Don't include the attribute if the list is empty From a1df55b8589f47b2827f1cecd985b0a03a155eba Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 10:44:37 +0200 Subject: [PATCH 31/55] =?UTF-8?q?=F0=9F=94=A7=20tsconfig:=20Temporarily=20?= =?UTF-8?q?disable=20libCheck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/Akryum/v-tooltip/issues/459 --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 78d150b..bbc39dd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,7 +25,8 @@ "types": [ "@types/node", "@nuxt/types" - ] + ], + "skipLibCheck": true }, "exclude": [ "node_modules/**", From 914089ed3c4748905e135ce71870d6958a87b02c Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 11:02:45 +0200 Subject: [PATCH 32/55] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20=20Fix?= =?UTF-8?q?=20type=20errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Renamed API resource types to prefix them with `ApiResource`, since `Event` is a builtin type - Removed the default value of [event], which was only there for testing anyway, and didn't match the type because it lacked a UUID - Put some (3) // @ts-ignore comments, one resolvable, the others need a fix from whoever defined `this.$el`'s type --- components/TimeTable.vue | 29 +++++++++++------------------ types/api-resources.d.ts | 6 +++--- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/components/TimeTable.vue b/components/TimeTable.vue index a581e3a..16f8749 100644 --- a/components/TimeTable.vue +++ b/components/TimeTable.vue @@ -75,20 +75,8 @@ export default Vue.extend({ } as PropOptions, events: { type: Array, - default: () => [ - { - day: 1, - room: 'L666', - start: 8 * 3600, - end: 9 * 3600, - subject: { - name: 'English', - color: 'blue', - }, - week_type: 'Q1', - }, - ], - } as PropOptions, + required: true, + } as PropOptions, }, data() { const defaults = { @@ -228,13 +216,13 @@ export default Vue.extend({ } return width }, - resolveHeight(event: Event): number { + resolveHeight(event: ApiResourceEvent): number { // Get the duration of this event const duration = event.end - event.start // Multiply by the factor return (duration / 60) * this.pixelsPerMinute }, - resolvePosition(event: Event) { + resolvePosition(event: ApiResourceEvent) { // Get the day and multiply by the base width of an event const baseWidth = this.resolveWidth({ week_type: 'BOTH' }) let x = baseWidth * event.day - baseWidth @@ -249,7 +237,7 @@ export default Vue.extend({ y += this.headerHeight return { x, y } }, - resolveRect(event: Event) { + resolveRect(event: ApiResourceEvent) { const { x, y } = this.resolvePosition(event) return { width: this.resolveWidth(event), @@ -259,7 +247,7 @@ export default Vue.extend({ fill: event.subject.color, } }, - resolveText(event: Event) { + resolveText(event: ApiResourceEvent) { const rect = this.resolveRect(event) return { text: event.subject.name + '\n' + event.room, @@ -292,18 +280,23 @@ export default Vue.extend({ start: parse(event.start, 'HH:mm:ss', new Date(0)), end: parse(event.end, 'HH:mm:ss', new Date(0)), } + // Open the modal + // @ts-ignore TODO: typescriptify plugins so that I don't have to do this this.$modal.open('edit-event') }, handleHover(evt: { target: { attrs: { id: string } }; type: string }) { + // this.$el's reported type is `Element`, which does not contain `.style`, so I'm resorting to @ts-ingore comments const canvas = this.$el // Check if its an event if (!evt.target.attrs.id) return switch (evt.type) { case 'mouseenter': + // @ts-ignore canvas.style.cursor = 'pointer' break case 'mouseleave': + // @ts-ignore canvas.style.cursor = 'default' break } diff --git a/types/api-resources.d.ts b/types/api-resources.d.ts index f7cb8ef..ebcefde 100644 --- a/types/api-resources.d.ts +++ b/types/api-resources.d.ts @@ -1,16 +1,16 @@ type WeekType = 'Q1' | 'Q2' | 'BOTH' -interface Subject { +interface ApiResourceSubject { name: string color: string } -interface Event { +interface ApiResourceEvent { day: number room: string start: number end: number - subject: Subject + subject: ApiResourceSubject // eslint-disable-next-line camelcase week_type: WeekType uuid: string | undefined From e316274eed6c63f17a27d690bb8e28dc661dcde6 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 11:05:36 +0200 Subject: [PATCH 33/55] =?UTF-8?q?=F0=9F=92=A1=20=20Comment=20`m?= =?UTF-8?q?ethods.handleEventClick`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/TimeTable.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/TimeTable.vue b/components/TimeTable.vue index 16f8749..c92a26d 100644 --- a/components/TimeTable.vue +++ b/components/TimeTable.vue @@ -271,10 +271,13 @@ export default Vue.extend({ target: { attrs: { id: string } } type: string }) { + // The event's target element's id is the UUID const eventUUID = vueComponent.target.attrs.id + // If the target element doesn't have an ID, we have nothing to handle if (!eventUUID) return - console.log(vueComponent) + // Get the element from the store with that UUID const event = this.event()(eventUUID) + // Set the `editingEvent` data variable this.editingEvent = { ...event, start: parse(event.start, 'HH:mm:ss', new Date(0)), From b6682c8c6b6a47d69ffa262c64f4c59493a9d27e Mon Sep 17 00:00:00 2001 From: ewen-lbh Date: Fri, 22 May 2020 11:07:24 +0200 Subject: [PATCH 34/55] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20=20Fix?= =?UTF-8?q?=20`handleHover`'s=20typing=20issue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By typecasting `this.$el` to an `HTMLElement` --- components/TimeTable.vue | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/components/TimeTable.vue b/components/TimeTable.vue index c92a26d..83b4d47 100644 --- a/components/TimeTable.vue +++ b/components/TimeTable.vue @@ -288,18 +288,16 @@ export default Vue.extend({ this.$modal.open('edit-event') }, handleHover(evt: { target: { attrs: { id: string } }; type: string }) { - // this.$el's reported type is `Element`, which does not contain `.style`, so I'm resorting to @ts-ingore comments - const canvas = this.$el + // this.$el's reported type is `Element`, which does not contain `.style`, so I'm typecasting it as an HTMLElement + const canvas = this.$el as HTMLElement // Check if its an event if (!evt.target.attrs.id) return switch (evt.type) { case 'mouseenter': - // @ts-ignore canvas.style.cursor = 'pointer' break case 'mouseleave': - // @ts-ignore canvas.style.cursor = 'default' break } From c49c59848b6ee8575b95f130d9e221a11828e2fe Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 19:10:02 +0200 Subject: [PATCH 35/55] =?UTF-8?q?=E2=9A=97=20Create=20/refactor-test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/refactor-test.vue | 104 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 pages/refactor-test.vue diff --git a/pages/refactor-test.vue b/pages/refactor-test.vue new file mode 100644 index 0000000..77d0cc6 --- /dev/null +++ b/pages/refactor-test.vue @@ -0,0 +1,104 @@ + + + + + From 914cb200d3b8ecd56a89268eaf6f966c80b82d8d Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 19:16:03 +0200 Subject: [PATCH 36/55] =?UTF-8?q?=F0=9F=93=9D=20CONTRIBUTING:=20Simpler=20?= =?UTF-8?q?structure=20for=20store=20action=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.adoc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index b2b12fa..b7afd4d 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -85,24 +85,23 @@ For each mutation, when the API request fails, handle the error by showing the u Each mutation should return... -When the action succeeded :: - `[true, object, null]` with `object` the value returned by the matching mutation, or the inner action's `object` return value. +When the action succeededs :: + `{ data: object, error: null]` with `object` the value returned by the matching mutation, or the inner action's `object` return value. When the action fails because of a validation error :: - `[false, validation, 'validation']` with `validation` the value returned by the `validate` getter, or by the inner action's `validation` return value + `{ data: validation, error: 'validation'}` with `validation` the value returned by the `validate` getter, or by the inner action's `validation` return value When the action fails because of a network error :: - `[false, error, 'network']` with `error` the error object from the `try`/`catch` block. + `{ data: error, error: 'network'}` with `error` the error object from the `try`/`catch` block. -More generally, the return value is an array with: +More generally, the return value is an object with: -1. whether the action succeeded or not -2. the object/array that results from the underlying mutation -3. the failure level, if any. If it succeeded, this is `null`. +1. the object/array that results from the underlying mutation +2. the failure level, if any. If it succeeded, this is `null`. Include the following actions: -load({ force: false, verbose: true }) :: +load({ force: false, verbose: false }) :: - If `loaded` is false or `force` is true ** Do a `GET` request ** Use the `SET` mutation to store the response in the store @@ -169,6 +168,7 @@ order(objects, { by: '_your_default_sorting_method_' }) :: Language :: html Indentation :: 2 spaces +write component tag names in :: kebab-case Class for root element of every component :: .--; eg. for root element has class=--base-card #### Attribute list order From 887ca10725187bc2019272f15f1044df7f552b37 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 23:27:57 +0200 Subject: [PATCH 37/55] =?UTF-8?q?=F0=9F=9A=A8=20eslint:=20Warn=20on=20came?= =?UTF-8?q?lcase,=20don't=20fail=20with=20an=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The rationale is that the API uses the already well-established snake_case convention, so some variables will inevitably end up snakecase'd --- .eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.js b/.eslintrc.js index 8a758af..2ffe6c2 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -18,5 +18,6 @@ module.exports = { rules: { 'no-console': 'off', '@typescript-eslint/no-unused-vars': 'off', + 'camelcase': 'warn' } } From 8338c6656730ea6147272f75a0b7566c68453c66 Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 23:29:19 +0200 Subject: [PATCH 38/55] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F=20Define=20types=20?= =?UTF-8?q?for=20homework,=20notes=20and=20quizzes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- types/api-resources.d.ts | 63 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/types/api-resources.d.ts b/types/api-resources.d.ts index ebcefde..d931c45 100644 --- a/types/api-resources.d.ts +++ b/types/api-resources.d.ts @@ -1,17 +1,74 @@ +// eslint-disable camelcase type WeekType = 'Q1' | 'Q2' | 'BOTH' -interface ApiResourceSubject { +interface ApiResource { + uuid: string + updated_at: string | null + created_at: string +} + +interface ApiResourceSubject extends ApiResource { name: string color: string } -interface ApiResourceEvent { +interface ApiResourceEvent extends ApiResource { day: number room: string start: number end: number subject: ApiResourceSubject - // eslint-disable-next-line camelcase week_type: WeekType uuid: string | undefined } + +type NoteContentType = 'html' | 'markdown' | 'asciidoc' | 'external' + +interface ApiResourceNote extends ApiResource { + title: string | null + content: string + thumbnail: string | null + type: NoteContentType + quizzes: string[] +} + +interface ApiResourceQuizQuestion extends ApiResource { + name: string + correct_answer: string +} + +interface ApiResourceQuizAnswer extends ApiResource { + answer: string + question: ApiResourceQuizQuestion +} + +interface ApiResourceQuizSession extends ApiResource { + start: String + end: String + answers: ApiResourceQuizAnswer[] +} + +interface ApiResourceQuiz extends ApiResource { + name: string + questions: ApiResourceQuizQuestion[] + tries: { test: number; train: number } + modified_at: string + time_spent: number + sessions: ApiResourceQuizSession[] + description: string +} + +type HomeworkType = 'test' | 'coursework' | 'to_bring' | 'exercise' + +interface ApiResourceHomework extends ApiResource { + title: string + subject: ApiResourceSubject + type: HomeworkType + completed_at: string | null + due_at: string + progress: number | null + notes: string[] + grades: string[] + quizzes: string[] + details: string +} From d83f5a1b3fe5fdfb733dc1c832b1ffd4ead1d6ac Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 23:30:12 +0200 Subject: [PATCH 39/55] =?UTF-8?q?=F0=9F=92=84=20=20Make=20th?= =?UTF-8?q?e=20dot=20smaller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/BadgeSubject.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/components/BadgeSubject.vue b/components/BadgeSubject.vue index d9569e7..50affc4 100644 --- a/components/BadgeSubject.vue +++ b/components/BadgeSubject.vue @@ -73,7 +73,7 @@ export default Vue.extend({ // //Definitions // -dot-size = 1.8em +dot-size = 1.4em // //Positioning @@ -140,7 +140,6 @@ dot-size = 1.8em transition 250ms ease all .expanded.editable - cursor pointer .button-edit opacity 1 From 744a541648030ca8719530a63b8f9c5554b5a57d Mon Sep 17 00:00:00 2001 From: Ewen Le Bihan Date: Fri, 22 May 2020 23:31:21 +0200 Subject: [PATCH 40/55] =?UTF-8?q?=F0=9F=9A=A7=20=F0=9F=94=8C=20=20Allow=20any=20URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/BaseButton.vue | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/components/BaseButton.vue b/components/BaseButton.vue index 83a747a..53013d4 100644 --- a/components/BaseButton.vue +++ b/components/BaseButton.vue @@ -1,7 +1,7 @@