From 9b232c7d4ff942f09666ed391e10743f1019e6c8 Mon Sep 17 00:00:00 2001 From: konrad Date: Sun, 19 Jan 2020 19:23:06 +0000 Subject: [PATCH] Add Wunderlist migration (#46) Complete migration flow Add migration in progress animation Add handling wunderlist migration flow Basic migration init structure Add migrator structure Co-authored-by: kolaente Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/46 --- public/images/migration/wunderlist.png | Bin 0 -> 26693 bytes src/components/Home.vue | 1 + src/components/migrator/migrate.vue | 18 ++++ src/components/migrator/wunderlist.vue | 87 ++++++++++++++++++ src/router/index.js | 13 +++ .../migrator/abstractMigrationService.js | 20 ++++ src/services/migrator/wunderlist.js | 7 ++ src/styles/components/_all.scss | 1 + src/styles/components/migrator.scss | 69 ++++++++++++++ 9 files changed, 216 insertions(+) create mode 100644 public/images/migration/wunderlist.png create mode 100644 src/components/migrator/migrate.vue create mode 100644 src/components/migrator/wunderlist.vue create mode 100644 src/services/migrator/abstractMigrationService.js create mode 100644 src/services/migrator/wunderlist.js create mode 100644 src/styles/components/migrator.scss diff --git a/public/images/migration/wunderlist.png b/public/images/migration/wunderlist.png new file mode 100644 index 0000000000000000000000000000000000000000..907ed0ca150b12a073e84b9d9142f46b75391662 GIT binary patch literal 26693 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 literal 0 HcmV?d00001 diff --git a/src/components/Home.vue b/src/components/Home.vue index 4c4152ee..378b2142 100644 --- a/src/components/Home.vue +++ b/src/components/Home.vue @@ -2,6 +2,7 @@

Hi {{user.infos.username}}!

Click on a list or namespace on the left to get started.

+ Import your data into Vikunja
diff --git a/src/components/migrator/migrate.vue b/src/components/migrator/migrate.vue new file mode 100644 index 00000000..f3b10288 --- /dev/null +++ b/src/components/migrator/migrate.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/components/migrator/wunderlist.vue b/src/components/migrator/wunderlist.vue new file mode 100644 index 00000000..3014e1d4 --- /dev/null +++ b/src/components/migrator/wunderlist.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/router/index.js b/src/router/index.js index c6c73f8b..cc1374e4 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -23,6 +23,9 @@ import EditTeamComponent from '@/components/teams/EditTeam' import NewTeamComponent from '@/components/teams/NewTeam' // Label Handling import ListLabelsComponent from '@/components/labels/ListLabels' +// Migration +import MigrationComponent from '../components/migrator/migrate' +import WunderlistMigrationComponent from '../components/migrator/wunderlist' Vue.use(Router) @@ -135,5 +138,15 @@ export default new Router({ name: 'linkShareAuth', component: LinkShareAuthComponent }, + { + path: '/migrate', + name: 'migrateStart', + component: MigrationComponent, + }, + { + path: '/migrate/wunderlist', + name: 'migrateWunderlist', + component: WunderlistMigrationComponent, + }, ] }) \ No newline at end of file diff --git a/src/services/migrator/abstractMigrationService.js b/src/services/migrator/abstractMigrationService.js new file mode 100644 index 00000000..0e17d1b6 --- /dev/null +++ b/src/services/migrator/abstractMigrationService.js @@ -0,0 +1,20 @@ +import AbstractService from '../abstractService' + +// This service builds on top of the abstract service and basically just hides away method names. +// It enables migration services to be created with minimal overhead and even better method names. +export default class AbstractMigrationService extends AbstractService { + constructor(serviceUrlKey) { + super({ + update: '/migration/'+serviceUrlKey+'/migrate', + get: '/migration/'+serviceUrlKey+'/auth', + }) + } + + getAuthUrl() { + return this.get({}) + } + + migrate(data) { + return this.update(data) + } +} \ No newline at end of file diff --git a/src/services/migrator/wunderlist.js b/src/services/migrator/wunderlist.js new file mode 100644 index 00000000..341989ec --- /dev/null +++ b/src/services/migrator/wunderlist.js @@ -0,0 +1,7 @@ +import AbstractMigrationService from './abstractMigrationService' + +export default class WunderlistMigrationService extends AbstractMigrationService { + constructor() { + super('wunderlist') + } +} diff --git a/src/styles/components/_all.scss b/src/styles/components/_all.scss index 007f6fb6..bf427a12 100644 --- a/src/styles/components/_all.scss +++ b/src/styles/components/_all.scss @@ -11,3 +11,4 @@ @import 'taskRelations'; @import 'tasks'; @import 'teams'; +@import 'migrator'; diff --git a/src/styles/components/migrator.scss b/src/styles/components/migrator.scss new file mode 100644 index 00000000..605dc3d6 --- /dev/null +++ b/src/styles/components/migrator.scss @@ -0,0 +1,69 @@ +.migration-services-overview { + text-align: center; + + a { + display: inline-block; + width: 100px; + + img { + display: block; + } + } +} + +.migration-in-progress-container { + max-width: 400px; + margin: 4em auto 0; + text-align: center; +} + +.migration-in-progress { + text-align: center; + display: flex; + max-width: 400px; + justify-content: space-between; + align-items: center; + margin-bottom: 2em; + + img { + display: block; + max-height: 100px; + } + + .progress-dots { + height: 40px; + width: 140px; + overflow: visible; + + span { + transition: all 500ms ease; + background: $grey; + height: 10px; + width: 10px; + display: inline-block; + border-radius: 10px; + animation: wave 2s ease infinite; + margin-right: 5px; + + &:nth-child(1){ animation-delay: 0; } + &:nth-child(2){ animation-delay: 100ms; } + &:nth-child(3){ animation-delay: 200ms; } + &:nth-child(4){ animation-delay: 300ms; } + &:nth-child(5){ animation-delay: 400ms; } + &:nth-child(6){ animation-delay: 500ms; } + &:nth-child(7){ animation-delay: 600ms; } + &:nth-child(8){ animation-delay: 700ms; } + } + } + + @keyframes wave{ + 0%, 40%, 100% { + transform: translate(0, 0); + background-color: $primary; + } + 10% { + transform: translate(0, -15px); + background-color: $primary-dark; + } + } +}