Gerald 9 лет назад
Родитель
Сommit
11ce901e9c

+ 7 - 1
.editorconfig

@@ -3,4 +3,10 @@ root = true
 [*]
 indent_style = space
 indent_size = 2
-end_of_line = lf
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false

+ 12 - 0
src/_locales/cs/messages.yml

@@ -412,3 +412,15 @@ labelSyncSettings:
 labelSyncScriptStatus:
   description: Label for option to sync script status.
   message: ''
+labelSyncDisabled:
+  description: Label for option to disable sync service.
+  message: ''
+labelSyncService:
+  description: Label for sync service select.
+  message: ''
+labelSyncAuthorize:
+  description: Label for button to authorize a service.
+  message: ''
+labelSyncRevoke:
+  description: Label for button to revoke authorization for a service.
+  message: ''

+ 12 - 0
src/_locales/de/messages.yml

@@ -408,3 +408,15 @@ labelSyncSettings:
 labelSyncScriptStatus:
   description: Label for option to sync script status.
   message: ''
+labelSyncDisabled:
+  description: Label for option to disable sync service.
+  message: ''
+labelSyncService:
+  description: Label for sync service select.
+  message: ''
+labelSyncAuthorize:
+  description: Label for button to authorize a service.
+  message: ''
+labelSyncRevoke:
+  description: Label for button to revoke authorization for a service.
+  message: ''

+ 12 - 0
src/_locales/en/messages.yml

@@ -410,3 +410,15 @@ labelSyncSettings:
 labelSyncScriptStatus:
   description: Label for option to sync script status.
   message: Sync script status
+labelSyncDisabled:
+  description: Label for option to disable sync service.
+  message: None
+labelSyncService:
+  description: Label for sync service select.
+  message: 'Sync to'
+labelSyncAuthorize:
+  description: Label for button to authorize a service.
+  message: Authorize
+labelSyncRevoke:
+  description: Label for button to revoke authorization for a service.
+  message: Revoke

+ 12 - 0
src/_locales/id/messages.yml

@@ -414,3 +414,15 @@ labelSyncSettings:
 labelSyncScriptStatus:
   description: Label for option to sync script status.
   message: ''
+labelSyncDisabled:
+  description: Label for option to disable sync service.
+  message: ''
+labelSyncService:
+  description: Label for sync service select.
+  message: ''
+labelSyncAuthorize:
+  description: Label for button to authorize a service.
+  message: ''
+labelSyncRevoke:
+  description: Label for button to revoke authorization for a service.
+  message: ''

+ 12 - 0
src/_locales/pl/messages.yml

@@ -410,3 +410,15 @@ labelSyncSettings:
 labelSyncScriptStatus:
   description: Label for option to sync script status.
   message: ''
+labelSyncDisabled:
+  description: Label for option to disable sync service.
+  message: ''
+labelSyncService:
+  description: Label for sync service select.
+  message: ''
+labelSyncAuthorize:
+  description: Label for button to authorize a service.
+  message: ''
+labelSyncRevoke:
+  description: Label for button to revoke authorization for a service.
+  message: ''

+ 12 - 0
src/_locales/ro/messages.yml

@@ -414,3 +414,15 @@ labelSyncSettings:
 labelSyncScriptStatus:
   description: Label for option to sync script status.
   message: ''
+labelSyncDisabled:
+  description: Label for option to disable sync service.
+  message: ''
+labelSyncService:
+  description: Label for sync service select.
+  message: ''
+labelSyncAuthorize:
+  description: Label for button to authorize a service.
+  message: ''
+labelSyncRevoke:
+  description: Label for button to revoke authorization for a service.
+  message: ''

+ 12 - 0
src/_locales/ru/messages.yml

@@ -410,3 +410,15 @@ labelSyncSettings:
 labelSyncScriptStatus:
   description: Label for option to sync script status.
   message: ''
+labelSyncDisabled:
+  description: Label for option to disable sync service.
+  message: ''
+labelSyncService:
+  description: Label for sync service select.
+  message: ''
+labelSyncAuthorize:
+  description: Label for button to authorize a service.
+  message: ''
+labelSyncRevoke:
+  description: Label for button to revoke authorization for a service.
+  message: ''

+ 12 - 0
src/_locales/sr/messages.yml

@@ -412,3 +412,15 @@ labelSyncSettings:
 labelSyncScriptStatus:
   description: Label for option to sync script status.
   message: ''
+labelSyncDisabled:
+  description: Label for option to disable sync service.
+  message: ''
+labelSyncService:
+  description: Label for sync service select.
+  message: ''
+labelSyncAuthorize:
+  description: Label for button to authorize a service.
+  message: ''
+labelSyncRevoke:
+  description: Label for button to revoke authorization for a service.
+  message: ''

+ 12 - 0
src/_locales/vi/messages.yml

@@ -410,3 +410,15 @@ labelSyncSettings:
 labelSyncScriptStatus:
   description: Label for option to sync script status.
   message: ''
+labelSyncDisabled:
+  description: Label for option to disable sync service.
+  message: ''
+labelSyncService:
+  description: Label for sync service select.
+  message: ''
+labelSyncAuthorize:
+  description: Label for button to authorize a service.
+  message: ''
+labelSyncRevoke:
+  description: Label for button to revoke authorization for a service.
+  message: ''

+ 12 - 0
src/_locales/zh/messages.yml

@@ -410,3 +410,15 @@ labelSyncSettings:
 labelSyncScriptStatus:
   description: Label for option to sync script status.
   message: 同步脚本状态
+labelSyncDisabled:
+  description: Label for option to disable sync service.
+  message: ''
+labelSyncService:
+  description: Label for sync service select.
+  message: ''
+labelSyncAuthorize:
+  description: Label for button to authorize a service.
+  message: ''
+labelSyncRevoke:
+  description: Label for button to revoke authorization for a service.
+  message: ''

+ 26 - 17
src/background/sync/base.js

@@ -24,27 +24,32 @@ function getURI(name) {
 
 function initConfig() {
   function get(key, def) {
-    return _.object.get(config, key, def);
+    var keys = _.normalizeKeys(key);
+    keys.unshift('sync');
+    return options.get(keys, def);
   }
   function set(key, value) {
-    if (key) {
-      _.object.set(config, key, value);
-    }
-    options.set('sync', config);
+    var keys = _.normalizeKeys(key);
+    keys.unshift('sync');
+    options.set(keys, value);
   }
-  var config = options.get('sync');
-  if (!config || !config.services) {
-    config = {
-      services: {},
-    };
-    // XXX Migrate from old data
-    ['dropbox', 'onedrive']
-    .forEach(function (key) {
-      config.services[key] = options.get(key);
-    });
-    set();
+  function init() {
+    var sync = options.get('sync');
+    if (!sync || !sync.services) {
+      sync = {
+        services: {},
+      };
+
+      // XXX Migrate from old data
+      ['dropbox', 'onedrive']
+      .forEach(function (key) {
+        sync.services[key] = options.get(key);
+      });
+
+      set([], sync);
+    }
   }
-  console.log(config);
+  init();
   return {get: get, set: set};
 }
 
@@ -503,6 +508,10 @@ function authenticate() {
   service && service.authenticate && service.authenticate();
 }
 
+options.hook(function (data) {
+  ('sync.current' in data) && initialize();
+});
+
 exports.utils = {
   getFilename: getFilename,
   isScriptFile: isScriptFile,

+ 1 - 1
src/common.js

@@ -111,7 +111,7 @@ _.initOptions = function () {
   var ready = _.sendMessage({cmd: 'GetAllOptions'})
   .then(function (data) {
     options = data;
-    hooks.fire(data);
+    data && hooks.fire(data);
   });
 
   function getOption(key, def) {

+ 10 - 2
src/options/views/tab-settings/vm-sync/index.html

@@ -2,9 +2,17 @@
   <h3>
     <span class="feature-text" v-text="i18n('labelSync')"></span>
   </h3>
-  <div class="sync-services mb-2">
-    <sync-service v-for="service in store.sync" :service="service" @service-checked="onEnableService"></sync-service>
+  <div>
+    <span v-text="i18n('labelSyncService')"></span>
+    <select :value="syncConfig.current" @change="onSyncChange">
+      <option v-for="service in syncServices" v-text="service.displayName" :value="service.name"></option>
+    </select>
+    <button v-text="labelAuthorize" :disabled="!canAuthorize" v-if="service.name"></button>
+    <button :disabled="!canSync" v-if="service.name">
+      <svg class="icon"><use xlink:href="#refresh" /></svg>
+    </button>
   </div>
+  <p class="mt-1" v-text="message"></p>
   <h4 v-text="i18n('labelSyncSettings')"></h4>
   <div class="mt-1">
     <label>

+ 77 - 0
src/options/views/tab-settings/vm-sync/index.js

@@ -4,6 +4,16 @@ var utils = require('src/options/utils');
 var store = utils.store;
 var SyncService = require('./service');
 
+var SYNC_CURRENT = 'sync.current';
+var syncConfig = {
+  current: '',
+};
+_.options.hook(function (data) {
+  if (SYNC_CURRENT in data) {
+    syncConfig.current = data[SYNC_CURRENT] || '';
+  }
+});
+
 module.exports = {
   template: cache.get('./index.html'),
   components: {
@@ -11,9 +21,72 @@ module.exports = {
   },
   data: function () {
     return {
+      syncConfig: syncConfig,
       store: store,
     };
   },
+  computed: {
+    syncServices: function () {
+      var services = [{
+        displayName: _.i18n('labelSyncDisabled'),
+        name: '',
+      }];
+      var states = this.store.sync;
+      if (states && states.length) {
+        services = services.concat(states);
+        this.$nextTick(function () {
+          // Set `current` after options are ready
+          syncConfig.current = _.options.get(SYNC_CURRENT);
+        });
+      }
+      return services;
+    },
+    service: function () {
+      var current = this.syncConfig.current;
+      var service = this.syncServices.find(function (item) {
+        return item.name === current;
+      });
+      if (!service) {
+        console.warn('Invalid current service:', current);
+        service = this.syncServices[0];
+      }
+      return service;
+    },
+    message: function () {
+      var service = this.service;
+      if (service.authState === 'initializing') return _.i18n('msgSyncInit');
+      if (service.authState === 'error') return _.i18n('msgSyncInitError');
+      if (service.syncState === 'error') return _.i18n('msgSyncError');
+      if (service.syncState === 'ready') return _.i18n('msgSyncReady');
+      if (service.syncState === 'syncing') {
+        var progress = '';
+        if (service.progress && service.progress.total) {
+          progress = ' (' + service.progress.finished + '/' + service.progress.total + ')';
+        }
+        return _.i18n('msgSyncing') + progress;
+      }
+      if (service.lastSync) {
+        var lastSync = new Date(service.lastSync).toLocaleString();
+        return _.i18n('lastSync', lastSync);
+      }
+    },
+    labelAuthorize: function () {
+      var service = this.service;
+      if (service.authState === 'authorizing') return _.i18n('labelSyncAuthorizing');
+      if (service.authState === 'authorized') return _.i18n('labelSyncRevoke');
+      if (service.authState === 'error') return _.i18n('labelSyncAuthError');
+      return _.i18n('labelSyncAuthorize');
+    },
+    canAuthorize: function () {
+      var service = this.service;
+      return ~['unauthorized', 'error', 'authorized'].indexOf(service.authState)
+      && ~['idle', 'error'].indexOf(service.syncState);
+    },
+    canSync: function () {
+      var service = this.service;
+      return this.canAuthorize && service.authState === 'authorized';
+    },
+  },
   methods: {
     onEnableService: function (name) {
       store.sync.forEach(function (service) {
@@ -27,5 +100,9 @@ module.exports = {
       });
       _.sendMessage({cmd: 'SyncStart'});
     },
+    onSyncChange: function (e) {
+      var value = e.target.value;
+      _.options.set(SYNC_CURRENT, value);
+    },
   },
 };