From b9c5979da4a0956e53034bc6a000174ac0b5984b Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Thu, 20 Sep 2018 10:51:32 +0200 Subject: [PATCH 01/89] feat: basic fonctionality, welcome and kill port widgets --- .../@vue/cli-ui-addon-widgets/.browserslistrc | 3 + .../@vue/cli-ui-addon-widgets/.eslintrc.js | 22 ++ packages/@vue/cli-ui-addon-widgets/.gitignore | 21 ++ packages/@vue/cli-ui-addon-widgets/README.md | 21 ++ .../@vue/cli-ui-addon-widgets/babel.config.js | 5 + .../@vue/cli-ui-addon-widgets/package.json | 26 ++ .../cli-ui-addon-widgets/postcss.config.js | 5 + .../cli-ui-addon-widgets/public/favicon.ico | Bin 0 -> 1150 bytes .../cli-ui-addon-widgets/public/index.html | 17 + .../src/components/DependencyUpdates.vue | 5 + .../src/components/KillPort.vue | 134 +++++++ .../src/components/PluginUpdates.vue | 30 ++ .../src/components/StatusWidget.vue | 63 ++++ .../src/components/Welcome.vue | 96 +++++ .../@vue/cli-ui-addon-widgets/src/main.js | 9 + .../cli-ui-addon-widgets/src/util/icons.js | 5 + .../@vue/cli-ui-addon-widgets/vue.config.js | 8 + .../cli-ui/apollo-server/api/PluginApi.js | 28 +- .../@vue/cli-ui/apollo-server/api/widget.js | 32 ++ .../apollo-server/connectors/plugins.js | 18 +- .../apollo-server/connectors/projects.js | 2 +- .../cli-ui/apollo-server/connectors/tasks.js | 15 +- .../cli-ui/apollo-server/connectors/views.js | 8 +- .../apollo-server/connectors/widgets.js | 274 ++++++++++++++ .../cli-ui/apollo-server/schema/project.js | 1 + .../cli-ui/apollo-server/schema/widget.js | 79 ++++ packages/@vue/cli-ui/locales/en.json | 59 ++- packages/@vue/cli-ui/package.json | 1 + .../@vue/cli-ui/src/components/ItemLogo.vue | 4 +- .../@vue/cli-ui/src/components/Widget.vue | 347 ++++++++++++++++++ .../cli-ui/src/components/WidgetAddItem.vue | 110 ++++++ .../cli-ui/src/components/WidgetAddPane.vue | 86 +++++ .../@vue/cli-ui/src/graphql/widgetAdd.gql | 7 + .../src/graphql/widgetDefinitionFragment.gql | 10 + .../cli-ui/src/graphql/widgetDefinitions.gql | 7 + .../cli-ui/src/graphql/widgetFragment.gql | 16 + .../@vue/cli-ui/src/graphql/widgetMove.gql | 7 + .../@vue/cli-ui/src/graphql/widgetRemove.gql | 7 + packages/@vue/cli-ui/src/graphql/widgets.gql | 7 + packages/@vue/cli-ui/src/router.js | 8 +- .../cli-ui/src/views/ProjectDashboard.vue | 95 +++++ .../@vue/cli-ui/src/views/ProjectSelect.vue | 14 +- packages/@vue/cli-ui/ui-defaults/index.js | 1 + packages/@vue/cli-ui/ui-defaults/widgets.js | 85 +++++ packages/@vue/cli-ui/ui-public/vue-logo.png | Bin 0 -> 3451 bytes yarn.lock | 144 +++++++- 46 files changed, 1915 insertions(+), 27 deletions(-) create mode 100644 packages/@vue/cli-ui-addon-widgets/.browserslistrc create mode 100644 packages/@vue/cli-ui-addon-widgets/.eslintrc.js create mode 100644 packages/@vue/cli-ui-addon-widgets/.gitignore create mode 100644 packages/@vue/cli-ui-addon-widgets/README.md create mode 100644 packages/@vue/cli-ui-addon-widgets/babel.config.js create mode 100644 packages/@vue/cli-ui-addon-widgets/package.json create mode 100644 packages/@vue/cli-ui-addon-widgets/postcss.config.js create mode 100644 packages/@vue/cli-ui-addon-widgets/public/favicon.ico create mode 100644 packages/@vue/cli-ui-addon-widgets/public/index.html create mode 100644 packages/@vue/cli-ui-addon-widgets/src/components/DependencyUpdates.vue create mode 100644 packages/@vue/cli-ui-addon-widgets/src/components/KillPort.vue create mode 100644 packages/@vue/cli-ui-addon-widgets/src/components/PluginUpdates.vue create mode 100644 packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue create mode 100644 packages/@vue/cli-ui-addon-widgets/src/components/Welcome.vue create mode 100644 packages/@vue/cli-ui-addon-widgets/src/main.js create mode 100644 packages/@vue/cli-ui-addon-widgets/src/util/icons.js create mode 100644 packages/@vue/cli-ui-addon-widgets/vue.config.js create mode 100644 packages/@vue/cli-ui/apollo-server/api/widget.js create mode 100644 packages/@vue/cli-ui/apollo-server/connectors/widgets.js create mode 100644 packages/@vue/cli-ui/apollo-server/schema/widget.js create mode 100644 packages/@vue/cli-ui/src/components/Widget.vue create mode 100644 packages/@vue/cli-ui/src/components/WidgetAddItem.vue create mode 100644 packages/@vue/cli-ui/src/components/WidgetAddPane.vue create mode 100644 packages/@vue/cli-ui/src/graphql/widgetAdd.gql create mode 100644 packages/@vue/cli-ui/src/graphql/widgetDefinitionFragment.gql create mode 100644 packages/@vue/cli-ui/src/graphql/widgetDefinitions.gql create mode 100644 packages/@vue/cli-ui/src/graphql/widgetFragment.gql create mode 100644 packages/@vue/cli-ui/src/graphql/widgetMove.gql create mode 100644 packages/@vue/cli-ui/src/graphql/widgetRemove.gql create mode 100644 packages/@vue/cli-ui/src/graphql/widgets.gql create mode 100644 packages/@vue/cli-ui/src/views/ProjectDashboard.vue create mode 100644 packages/@vue/cli-ui/ui-defaults/widgets.js create mode 100644 packages/@vue/cli-ui/ui-public/vue-logo.png diff --git a/packages/@vue/cli-ui-addon-widgets/.browserslistrc b/packages/@vue/cli-ui-addon-widgets/.browserslistrc new file mode 100644 index 0000000000..9dee646463 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/.browserslistrc @@ -0,0 +1,3 @@ +> 1% +last 2 versions +not ie <= 8 diff --git a/packages/@vue/cli-ui-addon-widgets/.eslintrc.js b/packages/@vue/cli-ui-addon-widgets/.eslintrc.js new file mode 100644 index 0000000000..e8d0172ee2 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/.eslintrc.js @@ -0,0 +1,22 @@ +module.exports = { + root: true, + env: { + node: true + }, + 'extends': [ + 'plugin:vue/essential', + '@vue/standard' + ], + rules: { + 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' + }, + parserOptions: { + parser: 'babel-eslint' + }, + globals: { + ClientAddonApi: false, + mapSharedData: false, + Vue: false + } +} diff --git a/packages/@vue/cli-ui-addon-widgets/.gitignore b/packages/@vue/cli-ui-addon-widgets/.gitignore new file mode 100644 index 0000000000..185e663192 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/.gitignore @@ -0,0 +1,21 @@ +.DS_Store +node_modules +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw* diff --git a/packages/@vue/cli-ui-addon-widgets/README.md b/packages/@vue/cli-ui-addon-widgets/README.md new file mode 100644 index 0000000000..571def4fc0 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/README.md @@ -0,0 +1,21 @@ +# cli-ui-addon-widgets + +## Project setup +``` +yarn install +``` + +### Compiles and hot-reloads for development +``` +yarn run serve +``` + +### Compiles and minifies for production +``` +yarn run build +``` + +### Lints and fixes files +``` +yarn run lint +``` diff --git a/packages/@vue/cli-ui-addon-widgets/babel.config.js b/packages/@vue/cli-ui-addon-widgets/babel.config.js new file mode 100644 index 0000000000..ba179669a1 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/app' + ] +} diff --git a/packages/@vue/cli-ui-addon-widgets/package.json b/packages/@vue/cli-ui-addon-widgets/package.json new file mode 100644 index 0000000000..fd2f5a651b --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/package.json @@ -0,0 +1,26 @@ +{ + "name": "cli-ui-addon-widgets", + "version": "3.0.3", + "files": [ + "dist", + "src" + ], + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint", + "prepublishOnly": "yarn run lint --no-fix && yarn run build" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "^3.0.3", + "@vue/cli-plugin-eslint": "^3.0.3", + "@vue/cli-service": "^3.0.3", + "@vue/eslint-config-standard": "^3.0.3", + "stylus": "^0.54.5", + "stylus-loader": "^3.0.2", + "vue-template-compiler": "^2.5.17" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/@vue/cli-ui-addon-widgets/postcss.config.js b/packages/@vue/cli-ui-addon-widgets/postcss.config.js new file mode 100644 index 0000000000..961986e2b1 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +} diff --git a/packages/@vue/cli-ui-addon-widgets/public/favicon.ico b/packages/@vue/cli-ui-addon-widgets/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c7b9a43c8cd16d0b434adaf513fcacb340809a11 GIT binary patch literal 1150 zcmchVOGsN$5QZm2NTI$erQpKHrdQX(jn+pVxKN`Ng)RzW5+8_2Xb@Y)Dkd6tq9V8u z3WAh^C@KZ1kA;tohzs}b3NC_*QmUXr$oP*rH(2mdT{z*(KX=aj=bX$9kqMvFRKj;Q zwI&d~A);J>5-PDega~WT5us%#Dc(Y}C4WpP?+fS;FaZ*z_CFzgiW=w{I02=q_TUz( z?=^H2uwoIK1n%|Ay21~QgjV1emYtWttJdz^L#=DjJ@Ex*9UPc*7<=rZo*_NAh4PxA zqkso~Ioa1y$e+3kIkXi29YNLi&lW}vY6C}ut4{8ou(7w=$_=$v{yJ$h?y!&bJfq*( zL_NQRF37$6e>%9erGV?p^lRFD?|5J_eupXaS;QluyrOmBT>PJhirMYb*i?(4Tf=j~?VvnUlY_ zDCVuuk3E&T9aP~Cr-0i-MaKUjf_|U!=R&t}_CfD=d${p~HH`BPaqb9aXT}UI$iGRg z>0^GlZ`vM4?;$*LhfI(RG|XK4GF+@-W*W}YJT5&2N_ZyZuaM_Ry=%PWx>r0P(Rc?> jRc4}SfGA>*agjwN{7E7DEm(*)%rSx{B0<6wBoglxJAy|R literal 0 HcmV?d00001 diff --git a/packages/@vue/cli-ui-addon-widgets/public/index.html b/packages/@vue/cli-ui-addon-widgets/public/index.html new file mode 100644 index 0000000000..14f7d37974 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + cli-ui-addon-widgets + + + +
+ + + diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/DependencyUpdates.vue b/packages/@vue/cli-ui-addon-widgets/src/components/DependencyUpdates.vue new file mode 100644 index 0000000000..f66703567b --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/src/components/DependencyUpdates.vue @@ -0,0 +1,5 @@ + diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/KillPort.vue b/packages/@vue/cli-ui-addon-widgets/src/components/KillPort.vue new file mode 100644 index 0000000000..b6893a3e61 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/src/components/KillPort.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/PluginUpdates.vue b/packages/@vue/cli-ui-addon-widgets/src/components/PluginUpdates.vue new file mode 100644 index 0000000000..5f9821e46d --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/src/components/PluginUpdates.vue @@ -0,0 +1,30 @@ + + + diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue b/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue new file mode 100644 index 0000000000..dc1de06cac --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/Welcome.vue b/packages/@vue/cli-ui-addon-widgets/src/components/Welcome.vue new file mode 100644 index 0000000000..ccb7118a64 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/src/components/Welcome.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/packages/@vue/cli-ui-addon-widgets/src/main.js b/packages/@vue/cli-ui-addon-widgets/src/main.js new file mode 100644 index 0000000000..c80d0de8ae --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/src/main.js @@ -0,0 +1,9 @@ +import Welcome from './components/Welcome.vue' +import KillPort from './components/KillPort.vue' +import PluginUpdates from './components/PluginUpdates.vue' +import DependencyUpdates from './components/DependencyUpdates.vue' + +ClientAddonApi.component('org.vue.widgets.components.welcome', Welcome) +ClientAddonApi.component('org.vue.widgets.components.kill-port', KillPort) +ClientAddonApi.component('org.vue.widgets.components.plugin-updates', PluginUpdates) +ClientAddonApi.component('org.vue.widgets.components.dependency-updates', DependencyUpdates) diff --git a/packages/@vue/cli-ui-addon-widgets/src/util/icons.js b/packages/@vue/cli-ui-addon-widgets/src/util/icons.js new file mode 100644 index 0000000000..c4ec5c61a3 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/src/util/icons.js @@ -0,0 +1,5 @@ +export const UPDATES_ICONS = { + 'no-update': 'check_circle', + 'loading': 'hourglass_full', + 'updates-available': 'error' +} diff --git a/packages/@vue/cli-ui-addon-widgets/vue.config.js b/packages/@vue/cli-ui-addon-widgets/vue.config.js new file mode 100644 index 0000000000..569e77456d --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/vue.config.js @@ -0,0 +1,8 @@ +const { clientAddonConfig } = require('@vue/cli-ui') + +module.exports = { + ...clientAddonConfig({ + id: 'org.vue.webpack.client-addon', + port: 8097 + }) +} diff --git a/packages/@vue/cli-ui/apollo-server/api/PluginApi.js b/packages/@vue/cli-ui/apollo-server/api/PluginApi.js index 523c86da90..dfa4152111 100644 --- a/packages/@vue/cli-ui/apollo-server/api/PluginApi.js +++ b/packages/@vue/cli-ui/apollo-server/api/PluginApi.js @@ -19,6 +19,7 @@ const { validateView, validateBadge } = require('./view') const { validateNotify } = require('./notify') const { validateSuggestion } = require('./suggestion') const { validateProgress } = require('./progress') +const { validateWidget } = require('./widget') class PluginApi { constructor ({ plugins, file, project, lightMode = false }, context) { @@ -48,6 +49,7 @@ class PluginApi { this.views = [] this.actions = new Map() this.ipcHandlers = [] + this.widgetDefs = [] } /** @@ -575,6 +577,26 @@ class PluginApi { suggestions.remove(id, this.context) } + /** + * Register a widget for project dashboard + * + * @param {object} def Widget definition + */ + registerWidget (def) { + if (this.lightMode) return + try { + validateWidget(def) + this.widgetDefs.push(def) + } catch (e) { + logs.add({ + type: 'error', + tag: 'PluginApi', + message: `(${this.pluginId || 'unknown plugin'}) 'registerWidget' widget definition is invalid\n${e.message}` + }, this.context) + console.error(new Error(`Invalid definition: ${e.message}`)) + } + } + /** * Create a namespaced version of: * - getSharedData @@ -600,7 +622,11 @@ class PluginApi { options.id = namespace + options.id return this.addSuggestion(options) }, - removeSuggestion: (id) => this.removeSuggestion(namespace + id) + removeSuggestion: (id) => this.removeSuggestion(namespace + id), + registerWidget: (def) => { + def.id = namespace + def.id + return this.registerWidget(def) + } } } } diff --git a/packages/@vue/cli-ui/apollo-server/api/widget.js b/packages/@vue/cli-ui/apollo-server/api/widget.js new file mode 100644 index 0000000000..1eadc4fa46 --- /dev/null +++ b/packages/@vue/cli-ui/apollo-server/api/widget.js @@ -0,0 +1,32 @@ +const { createSchema, validateSync } = require('@vue/cli-shared-utils') + +const schema = createSchema(joi => ({ + id: joi.string().required(), + title: joi.string().required(), + description: joi.string(), + icon: joi.string(), + screenshot: joi.string(), + link: joi.string(), + component: joi.string().required(), + // Maximum number of instances + maxCount: joi.number(), + // Size + minWidth: joi.number().required(), + minHeight: joi.number().required(), + maxWidth: joi.number().required(), + maxHeight: joi.number().required(), + defaultWidth: joi.number(), + defaultHeight: joi.number(), + // Config + configPrompts: joi.func(), + defaultConfig: joi.func(), + needsUserConfig: joi.boolean(), + // Hooks + onAdded: joi.func(), + onRemoved: joi.func(), + onConfigChanged: joi.func() +})) + +exports.validateWidget = (options) => { + validateSync(options, schema) +} diff --git a/packages/@vue/cli-ui/apollo-server/connectors/plugins.js b/packages/@vue/cli-ui/apollo-server/connectors/plugins.js index 8f95b9f5b3..cec00af93b 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/plugins.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/plugins.js @@ -128,6 +128,8 @@ function resetPluginApi ({ file, lightApi }, context) { return new Promise((resolve, reject) => { log('Plugin API reloading...', chalk.grey(file)) + const widgets = require('./widgets') + let pluginApi = pluginApiInstances.get(file) let projectId @@ -141,6 +143,7 @@ function resetPluginApi ({ file, lightApi }, context) { if (projectId) sharedData.unWatchAll({ projectId }, context) clientAddons.clear(context) suggestions.clear(context) + widgets.reset(context) } // Cyclic dependency with projects connector @@ -182,9 +185,17 @@ function resetPluginApi ({ file, lightApi }, context) { } } // Add client addons - pluginApi.clientAddons.forEach(options => clientAddons.add(options, context)) + pluginApi.clientAddons.forEach(options => { + clientAddons.add(options, context) + }) // Add views - pluginApi.views.forEach(view => views.add(view, context)) + pluginApi.views.forEach(view => { + views.add(view, context) + }) + // Register widgets + pluginApi.widgetDefs.forEach(definition => { + widgets.registerDefinition({ definition }, context) + }) if (lightApi) { resolve(true) @@ -209,6 +220,9 @@ function resetPluginApi ({ file, lightApi }, context) { if (currentView) views.open(currentView.id) } + // Load widgets for current project + widgets.load(context) + resolve(true) }) }) diff --git a/packages/@vue/cli-ui/apollo-server/connectors/projects.js b/packages/@vue/cli-ui/apollo-server/connectors/projects.js index 0a0c2b630f..ba0fa2cf40 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/projects.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/projects.js @@ -345,7 +345,7 @@ async function create (input, context) { } async function importProject (input, context) { - if (!fs.existsSync(path.join(input.path, 'node_modules'))) { + if (!input.force && !fs.existsSync(path.join(input.path, 'node_modules'))) { throw new Error('NO_MODULES') } diff --git a/packages/@vue/cli-ui/apollo-server/connectors/tasks.js b/packages/@vue/cli-ui/apollo-server/connectors/tasks.js index 1eaa3fa4ce..532e7c8fd4 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/tasks.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/tasks.js @@ -1,5 +1,6 @@ +const util = require('util') const execa = require('execa') -const terminate = require('terminate') +const terminate = util.promisify(require('terminate')) const chalk = require('chalk') // Subs const channels = require('../channels') @@ -462,19 +463,19 @@ async function run (id, context) { return task } -function stop (id, context) { +async function stop (id, context) { const task = findOne(id, context) if (task && task.status === 'running' && task.child) { task._terminating = true try { - terminate(task.child.pid) + await terminate(task.child.pid) } catch (e) { console.error(e) - updateOne({ - id: task.id, - status: 'terminated' - }, context) } + updateOne({ + id: task.id, + status: 'terminated' + }, context) } return task } diff --git a/packages/@vue/cli-ui/apollo-server/connectors/views.js b/packages/@vue/cli-ui/apollo-server/connectors/views.js index 9afe77c5dd..420391135f 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/views.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/views.js @@ -8,6 +8,12 @@ let currentView function createViewsSet () { // Builtin views return [ + { + id: 'vue-project-dashboard', + name: 'project-dashboard', + icon: 'dashboard', + tooltip: 'org.vue.components.project-nav.tooltips.dashboard' + }, { id: 'vue-project-plugins', name: 'project-plugins', @@ -17,7 +23,7 @@ function createViewsSet () { { id: 'vue-project-dependencies', name: 'project-dependencies', - icon: 'widgets', + icon: 'collections_bookmark', tooltip: 'org.vue.components.project-nav.tooltips.dependencies', projectTypes: ['vue', 'unknown'] }, diff --git a/packages/@vue/cli-ui/apollo-server/connectors/widgets.js b/packages/@vue/cli-ui/apollo-server/connectors/widgets.js new file mode 100644 index 0000000000..f94ffca039 --- /dev/null +++ b/packages/@vue/cli-ui/apollo-server/connectors/widgets.js @@ -0,0 +1,274 @@ +const shortid = require('shortid') +// Utils +const { log } = require('../util/logger') + +function getDefaultWidgets () { + return [ + { + id: shortid(), + definitionId: 'org.vue.widgets.welcome', + x: 0, + y: 0, + width: 3, + height: 4, + configured: true, + config: null + }, + { + id: shortid(), + definitionId: 'org.vue.widgets.kill-port', + x: 3, + y: 0, + width: 2, + height: 1, + configured: true, + config: null + } + ] +} + +let widgetDefs = new Map() +let widgetCount = new Map() +let widgets = [] + +let loadPromise, loadResolve + +function reset (context) { + widgetDefs = new Map() + widgetCount = new Map() + widgets = [] + loadPromise = new Promise((resolve) => { + loadResolve = () => { + loadPromise = null + resolve() + log('Load Promise resolved') + } + }) +} + +function registerDefinition ({ definition }, context) { + widgetDefs.set(definition.id, definition) +} + +function listDefinitions (context) { + return widgetDefs.values() +} + +function findDefinition ({ definitionId }, context) { + const def = widgetDefs.get(definitionId) + if (!def) { + throw new Error(`Widget definition ${definitionId} not found`) + } + return def +} + +async function list (context) { + log('loadPromise', loadPromise) + if (loadPromise) { + await loadPromise + } + log('widgets', widgets) + return widgets +} + +function load (context) { + const projects = require('./projects') + const id = projects.getCurrent(context).id + const project = context.db.get('projects').find({ id }).value() + widgets = project.widgets + + if (!widgets) { + widgets = getDefaultWidgets() + } + + widgets.forEach(widget => { + updateCount(widget.definitionId, 1) + }) + + log('Widgets loaded', widgets.length) + + loadResolve() +} + +function save (context) { + const projects = require('./projects') + const id = projects.getCurrent(context).id + context.db.get('projects').find({ id }).assign({ + widgets + }).write() +} + +function canAddMore (definition, context) { + if (definition.maxCount) { + return getCount(definition.id) < definition.maxCount + } + return true +} + +function add ({ definitionId }, context) { + const definition = findDefinition({ definitionId }, context) + + // Find next available space + const width = definition.defaultWidth || definition.minWidth + const height = definition.defaultHeight || definition.minHeight + // Mark occupied positions on the grid + const grid = new Map() + for (const widget of widgets) { + for (let x = widget.x; x < widget.x + widget.width; x++) { + for (let y = widget.y; y < widget.y + widget.height; y++) { + grid.set(`${x}:${y}`, true) + } + } + } + // Go through the possible positions + let x = 0 + let y = 0 + while (true) { + // Virtual "line brak" + if (x !== 0 && x + width >= 7) { + x = 0 + y++ + } + if (grid.get(`${x}:${y}`)) { + x++ + continue + } + const { result, testX } = hasEnoughSpace(grid, x, y, width, height) + if (!result) { + x = testX + 1 + continue + } + // Found! :) + break + } + + const widget = { + id: shortid(), + definitionId, + x, + y, + width, + height, + config: null, + configured: !definition.needsUserConfig + } + + // Default config + if (definition.defaultConfig) { + widget.config = definition.defaultConfig() + } + + updateCount(definitionId, 1) + widgets.push(widget) + save(context) + + if (definition.onAdded) { + definition.onAdded({ widget, definition }) + } + + return widget +} + +function getCount (definitionId) { + if (widgetCount.has(definitionId)) { + return widgetCount.get(definitionId) + } else { + return 0 + } +} + +function updateCount (definitionId, mod) { + widgetCount.set(definitionId, getCount(definitionId) + mod) +} + +function hasEnoughSpace (grid, x, y, width, height) { + // Test if enough horizontal available space + for (let testX = x; testX < x + width; testX++) { + // Test if enough vertical available space + for (let testY = y + 1; testY < y + height; testY++) { + if (grid.get(`${testX}:${testY}`)) { + x = testX + 1 + return { result: false, testX } + } + } + } + return { result: true } +} + +function findById ({ id }, context) { + return widgets.find(w => w.id === id) +} + +function remove ({ id }, context) { + const index = widgets.findIndex(w => w.id === id) + if (index !== -1) { + const widget = widgets[index] + updateCount(widget.definitionId, -1) + widgets.splice(index, 1) + save(context) + + const definition = findDefinition(widget, context) + if (definition.onAdded) { + definition.onAdded({ widget, definition }) + } + + return widget + } +} + +function move (input, context) { + const widget = findById(input, context) + if (widget) { + widget.x = input.x + widget.y = input.y + const definition = findDefinition(widget, context) + widget.width = input.width + if (widget.width < definition.minWidth) widget.width = definition.minWidth + if (widget.width > definition.maxWidth) widget.width = definition.maxWidth + if (widget.height < definition.minHeight) widget.height = definition.minHeight + if (widget.height > definition.maxHeight) widget.height = definition.maxHeight + // TODO push overlapping widgets + save(context) + } + return widgets +} + +function openConfig ({ id }, context) { + // const widget = findById({ id }, context) + // TODO +} + +function getConfigPrompts ({ id }, context) { + // const widget = findById({ id }, context) + // TODO +} + +function saveConfig ({ id }, context) { + // const widget = findById({ id }, context) + // TODO + save(context) +} + +function resetConfig ({ id }, context) { + // const widget = findById({ id }, context) + // TODO + save(context) +} + +module.exports = { + reset, + registerDefinition, + listDefinitions, + findDefinition, + list, + load, + save, + canAddMore, + add, + remove, + move, + openConfig, + getConfigPrompts, + saveConfig, + resetConfig +} diff --git a/packages/@vue/cli-ui/apollo-server/schema/project.js b/packages/@vue/cli-ui/apollo-server/schema/project.js index 0a6af58c28..301f395bc2 100644 --- a/packages/@vue/cli-ui/apollo-server/schema/project.js +++ b/packages/@vue/cli-ui/apollo-server/schema/project.js @@ -55,6 +55,7 @@ input ProjectCreateInput { input ProjectImportInput { path: String! + force: Boolean } type Preset implements DescribedEntity { diff --git a/packages/@vue/cli-ui/apollo-server/schema/widget.js b/packages/@vue/cli-ui/apollo-server/schema/widget.js new file mode 100644 index 0000000000..0f278dba32 --- /dev/null +++ b/packages/@vue/cli-ui/apollo-server/schema/widget.js @@ -0,0 +1,79 @@ +const gql = require('graphql-tag') +// Connectors +const widgets = require('../connectors/widgets') + +exports.types = gql` +extend type Query { + widgetDefinitions: [WidgetDefinition] + widgets: [Widget] +} + +extend type Mutation { + widgetAdd (input: WidgetAddInput!): Widget! + widgetRemove (id: ID!): Widget + widgetMove (input: WidgetMoveInput!): [Widget]! + widgetConfigOpen (id: ID!): Widget! + widgetConfigSave (id: ID!): Widget! + widgetConfigReset (id: ID!): Widget! +} + +type WidgetDefinition { + id: ID! + title: String! + description: String + link: String + icon: String + screenshot: String + component: String! + canAddMore: Boolean! +} + +type Widget { + id: ID! + definition: WidgetDefinition! + x: Int! + y: Int! + width: Int! + height: Int! + prompts: [Prompt] + config: JSON + configured: Boolean! +} + +input WidgetAddInput { + definitionId: ID! +} + +input WidgetMoveInput { + id: ID! + x: Int + y: Int + width: Int + height: Int +} +` + +exports.resolvers = { + WidgetDefinition: { + canAddMore: (definition, args, context) => widgets.canAddMore(definition, context) + }, + + Widget: { + definition: (widget, args, context) => widgets.findDefinition(widget, context), + prompts: (widget, args, context) => widgets.getConfigPrompts(widget, context) + }, + + Query: { + widgetDefinitions: (root, args, context) => widgets.listDefinitions(context), + widgets: (root, args, context) => widgets.list(context) + }, + + Mutation: { + widgetAdd: (root, { input }, context) => widgets.add(input, context), + widgetRemove: (root, { id }, context) => widgets.remove({ id }, context), + widgetMove: (root, { input }, context) => widgets.move(input, context), + widgetConfigOpen: (root, { id }, context) => widgets.openConfig({ id }, context), + widgetConfigSave: (root, { id }, context) => widgets.saveConfig({ id }, context), + widgetConfigReset: (root, { id }, context) => widgets.resetConfig({ id }, context) + } +} diff --git a/packages/@vue/cli-ui/locales/en.json b/packages/@vue/cli-ui/locales/en.json index c25cc9a585..820cd3b45a 100644 --- a/packages/@vue/cli-ui/locales/en.json +++ b/packages/@vue/cli-ui/locales/en.json @@ -1,6 +1,9 @@ { "org": { "vue": { + "common": { + "close": "Close" + }, "components": { "connection-status": { "disconnected": "Disconnected from UI server", @@ -78,6 +81,7 @@ }, "project-nav": { "tooltips": { + "dashboard": "Dashboard", "plugins": "Plugins", "dependencies": "Dependencies", "configuration": "Configuration", @@ -174,6 +178,18 @@ "done": "Done status" } } + }, + "widget": { + "remove": "Remove widget" + }, + "widget-add-pane": { + "title": "Add widgets" + }, + "widget-add-item": { + "add": "Add widget", + "details": { + "title": "Widget details" + } } }, "mixins": { @@ -225,7 +241,8 @@ "title": "Missing modules", "message": "It seems the project is missing the 'node_modules' folder. Please check you installed the dependencies before importing.", "close": "Got it" - } + }, + "force": "Import anyway" } }, "project-create": { @@ -421,6 +438,11 @@ "uninstall": "Uninstall {id}" } }, + "project-dashboard": { + "title": "Project dashboard", + "cutomize": "Customize", + "done": "Done" + }, "about": { "title": "About", "description": "@vue/cli-ui is a built-in package of vue-cli which opens a full-blown UI.", @@ -696,6 +718,41 @@ "watch": "Watch files for changes and rerun tests related to changed files" } } + }, + "widgets": { + "welcome": { + "title": "Welcome tips", + "description": "Some tips to help you get started", + "content": { + "title": "Welcome to your new project!", + "tip1": "You are looking at the project dashboard where your can put widgets. Use the 'Customize' button to add more! Everything is automatically saved.", + "tip2": "On the left are the different available pages. 'Plugins' let you add new Vue CLI plugins, 'Dependencies' for managing the packages, 'Configuration' to configure the tools and 'Tasks' to run scripts (for example webpack).", + "tip3": "Return to the project manager with the dropdown at the top left of the screen or the home button in the status bar at the bottom.", + "ok": "Understood" + } + }, + "kill-port": { + "title": "Kill port", + "description": "Kill processes using a specific network port", + "input": { + "placeholder": "Enter a network port, ex. 8080" + }, + "kill": "Kill", + "status": { + "idle": "Ready to kill", + "killing": "Killing procress...", + "killed": "Killed successfully!", + "error": "Couldn't kill process" + } + }, + "plugin-updates": { + "title": "Plugin updates", + "description": "Monitor plugin updates" + }, + "dependency-updates": { + "title": "Dependency updates", + "description": "Monitor dependencies updates" + } } } } diff --git a/packages/@vue/cli-ui/package.json b/packages/@vue/cli-ui/package.json index 7636c7f8df..ad79e14f7c 100644 --- a/packages/@vue/cli-ui/package.json +++ b/packages/@vue/cli-ui/package.json @@ -34,6 +34,7 @@ "deepmerge": "^2.1.1", "execa": "^0.10.0", "express-history-api-fallback": "^2.2.1", + "fkill": "^5.3.0", "fs-extra": "^6.0.1", "globby": "^8.0.1", "graphql": "^0.13.2", diff --git a/packages/@vue/cli-ui/src/components/ItemLogo.vue b/packages/@vue/cli-ui/src/components/ItemLogo.vue index de16ebb3d5..57493ff3d7 100644 --- a/packages/@vue/cli-ui/src/components/ItemLogo.vue +++ b/packages/@vue/cli-ui/src/components/ItemLogo.vue @@ -103,10 +103,12 @@ export default { .item-logo margin-right $padding-item position relative + width 42px + height @width .wrapper h-box() box-center() - width 42px + width 100% height @width background rgba(black, .03) border-radius 50% diff --git a/packages/@vue/cli-ui/src/components/Widget.vue b/packages/@vue/cli-ui/src/components/Widget.vue new file mode 100644 index 0000000000..fe9504d29d --- /dev/null +++ b/packages/@vue/cli-ui/src/components/Widget.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/packages/@vue/cli-ui/src/components/WidgetAddItem.vue b/packages/@vue/cli-ui/src/components/WidgetAddItem.vue new file mode 100644 index 0000000000..836befb315 --- /dev/null +++ b/packages/@vue/cli-ui/src/components/WidgetAddItem.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/packages/@vue/cli-ui/src/components/WidgetAddPane.vue b/packages/@vue/cli-ui/src/components/WidgetAddPane.vue new file mode 100644 index 0000000000..d19a72cc15 --- /dev/null +++ b/packages/@vue/cli-ui/src/components/WidgetAddPane.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/packages/@vue/cli-ui/src/graphql/widgetAdd.gql b/packages/@vue/cli-ui/src/graphql/widgetAdd.gql new file mode 100644 index 0000000000..2df4d84244 --- /dev/null +++ b/packages/@vue/cli-ui/src/graphql/widgetAdd.gql @@ -0,0 +1,7 @@ +#import "./widgetFragment.gql" + +mutation widgetAdd ($input: WidgetAddInput!) { + widgetAdd (input: $input) { + ...widget + } +} diff --git a/packages/@vue/cli-ui/src/graphql/widgetDefinitionFragment.gql b/packages/@vue/cli-ui/src/graphql/widgetDefinitionFragment.gql new file mode 100644 index 0000000000..bce74fc425 --- /dev/null +++ b/packages/@vue/cli-ui/src/graphql/widgetDefinitionFragment.gql @@ -0,0 +1,10 @@ +fragment widgetDefinition on WidgetDefinition { + id + title + description + link + icon + screenshot + component + canAddMore +} \ No newline at end of file diff --git a/packages/@vue/cli-ui/src/graphql/widgetDefinitions.gql b/packages/@vue/cli-ui/src/graphql/widgetDefinitions.gql new file mode 100644 index 0000000000..1bc022267f --- /dev/null +++ b/packages/@vue/cli-ui/src/graphql/widgetDefinitions.gql @@ -0,0 +1,7 @@ +#import "./widgetDefinitionFragment.gql" + +query widgetDefinitions { + widgetDefinitions { + ...widgetDefinition + } +} diff --git a/packages/@vue/cli-ui/src/graphql/widgetFragment.gql b/packages/@vue/cli-ui/src/graphql/widgetFragment.gql new file mode 100644 index 0000000000..4861d309a8 --- /dev/null +++ b/packages/@vue/cli-ui/src/graphql/widgetFragment.gql @@ -0,0 +1,16 @@ +fragment widget on Widget { + id + definition { + id + title + icon + component + canAddMore + } + x + y + width + height + config + configured +} \ No newline at end of file diff --git a/packages/@vue/cli-ui/src/graphql/widgetMove.gql b/packages/@vue/cli-ui/src/graphql/widgetMove.gql new file mode 100644 index 0000000000..64145cceb2 --- /dev/null +++ b/packages/@vue/cli-ui/src/graphql/widgetMove.gql @@ -0,0 +1,7 @@ +#import "./widgetFragment.gql" + +mutation widgetMove ($input: WidgetMoveInput!) { + widgetMove (input: $input) { + ...widget + } +} diff --git a/packages/@vue/cli-ui/src/graphql/widgetRemove.gql b/packages/@vue/cli-ui/src/graphql/widgetRemove.gql new file mode 100644 index 0000000000..3982607be7 --- /dev/null +++ b/packages/@vue/cli-ui/src/graphql/widgetRemove.gql @@ -0,0 +1,7 @@ +#import "./widgetFragment.gql" + +mutation widgetRemove ($id: ID!) { + widgetRemove(id: $id) { + ...widget + } +} diff --git a/packages/@vue/cli-ui/src/graphql/widgets.gql b/packages/@vue/cli-ui/src/graphql/widgets.gql new file mode 100644 index 0000000000..e85822ba97 --- /dev/null +++ b/packages/@vue/cli-ui/src/graphql/widgets.gql @@ -0,0 +1,7 @@ +#import "./widgetFragment.gql" + +query widgets { + widgets { + ...widget + } +} diff --git a/packages/@vue/cli-ui/src/router.js b/packages/@vue/cli-ui/src/router.js index 7785a5b0c3..8637ae1fd9 100644 --- a/packages/@vue/cli-ui/src/router.js +++ b/packages/@vue/cli-ui/src/router.js @@ -4,6 +4,7 @@ import { apolloClient } from './vue-apollo' import ProjectHome from './views/ProjectHome.vue' +import ProjectDashboard from './views/ProjectDashboard.vue' import ProjectPlugins from './views/ProjectPlugins.vue' import ProjectPluginsAdd from './views/ProjectPluginsAdd.vue' import ProjectConfigurations from './views/ProjectConfigurations.vue' @@ -39,7 +40,12 @@ const router = new Router({ { path: '', name: 'project-home', - redirect: { name: 'project-plugins' } + redirect: { name: 'project-dashboard' } + }, + { + path: 'dashboard', + name: 'project-dashboard', + component: ProjectDashboard }, { path: 'plugins', diff --git a/packages/@vue/cli-ui/src/views/ProjectDashboard.vue b/packages/@vue/cli-ui/src/views/ProjectDashboard.vue new file mode 100644 index 0000000000..c520a5c57c --- /dev/null +++ b/packages/@vue/cli-ui/src/views/ProjectDashboard.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/packages/@vue/cli-ui/src/views/ProjectSelect.vue b/packages/@vue/cli-ui/src/views/ProjectSelect.vue index 2511fd7b15..3b76f8936d 100644 --- a/packages/@vue/cli-ui/src/views/ProjectSelect.vue +++ b/packages/@vue/cli-ui/src/views/ProjectSelect.vue @@ -88,9 +88,13 @@ -
+
+ @@ -145,7 +149,8 @@ export default { this.$router.push({ name: 'project-create' }) }, - async importProject () { + async importProject (force = false) { + this.showNoModulesModal = false this.busy = true await this.$nextTick() try { @@ -153,7 +158,8 @@ export default { mutation: PROJECT_IMPORT, variables: { input: { - path: this.folderCurrent.path + path: this.folderCurrent.path, + force } } }) diff --git a/packages/@vue/cli-ui/ui-defaults/index.js b/packages/@vue/cli-ui/ui-defaults/index.js index a68f8189aa..61bec7eea1 100644 --- a/packages/@vue/cli-ui/ui-defaults/index.js +++ b/packages/@vue/cli-ui/ui-defaults/index.js @@ -2,4 +2,5 @@ module.exports = api => { require('./tasks')(api) require('./suggestions')(api) require('./config')(api) + require('./widgets')(api) } diff --git a/packages/@vue/cli-ui/ui-defaults/widgets.js b/packages/@vue/cli-ui/ui-defaults/widgets.js new file mode 100644 index 0000000000..4417abc9ca --- /dev/null +++ b/packages/@vue/cli-ui/ui-defaults/widgets.js @@ -0,0 +1,85 @@ +module.exports = api => { + const { registerWidget, onAction, setSharedData } = api.namespace('org.vue.widgets.') + + if (process.env.VUE_APP_CLI_UI_DEV) { + api.addClientAddon({ + id: 'org.vue.widgets.client-addon.dev', + url: 'http://localhost:8097/index.js' + }) + } else { + api.addClientAddon({ + id: 'org.vue.widgets.client-addon', + path: '@vue/cli-ui-addon-widgets/dist' + }) + } + + // Welcome widget + + registerWidget({ + id: 'welcome', + title: 'org.vue.widgets.welcome.title', + description: 'org.vue.widgets.welcome.description', + component: 'org.vue.widgets.components.welcome', + minWidth: 3, + minHeight: 4, + maxWidth: 3, + maxHeight: 4, + maxCount: 1 + }) + + // Kill port widget + + registerWidget({ + id: 'kill-port', + title: 'org.vue.widgets.kill-port.title', + description: 'org.vue.widgets.kill-port.description', + component: 'org.vue.widgets.components.kill-port', + minWidth: 2, + minHeight: 1, + maxWidth: 2, + maxHeight: 1, + maxCount: 1 + }) + + setSharedData('kill-port.status', 'idle') + onAction('actions.kill-port', async params => { + const fkill = require('fkill') + setSharedData('kill-port.status', 'killing') + try { + await fkill(`:${params.port}`) + setSharedData('kill-port.status', 'killed') + } catch (e) { + console.log(e) + setSharedData('kill-port.status', 'error') + } + }) + + // Plugin updates + + setSharedData('plugin-updates.status', { status: 'no-update' }) + registerWidget({ + id: 'plugin-updates', + title: 'org.vue.widgets.plugin-updates.title', + description: 'org.vue.widgets.plugin-updates.description', + component: 'org.vue.widgets.components.plugin-updates', + minWidth: 2, + minHeight: 1, + maxWidth: 2, + maxHeight: 1, + maxCount: 1 + }) + + // Depdency updates + + registerWidget({ + id: 'dependency-updates', + title: 'org.vue.widgets.dependency-updates.title', + description: 'org.vue.widgets.dependency-updates.description', + component: 'org.vue.widgets.components.dependency-updates', + minWidth: 2, + minHeight: 1, + maxWidth: 2, + maxHeight: 1, + maxCount: 3 + }) +} diff --git a/packages/@vue/cli-ui/ui-public/vue-logo.png b/packages/@vue/cli-ui/ui-public/vue-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..60e17006ad07cd313788585e2f5e528fbb7cf821 GIT binary patch literal 3451 zcmai0dpOj27oUg~BfU14)f(-t-WBEYW{4Ss7DZ)^+{4Vcgc&pLGr}m;*wj!$A+bA4 zlFL|`ap|367Oi5-Ws)(rQYx2GtESCtdVk-U;c44vpV#wqp3gbo&-tA5J?Hz!obdA8 zt*LIH4uioo-S@b7!(eMpgMT$;D8eQ5F2i6-=3e`JT=&H!IJf0MA3813@nVJ?%iUEg z4?=_wBdEhGiK`$LM9?x9of;3Y+|mFB?g{{yx)NLgsFamRa-4!M1L##ZNfAdSQse|w z0syE4MO=mzM*zo>kjdz%h7Xbpu{dlB%DAFSoxi=KK z4+pt6-{Nhs1e*h4w!Yy|?#_dekg^><3MvORV1I~cA4Rl}CPHmPH-c`5il?BH;!xCh zRBAl5EObVqLuL{>E6E`z*@2PbaDs|CNyD6?VG2?)XAWbE(j3pFIhLkl%G05}J66#h zS#+nGOy}B6r@AA~^+%i=k2*IU-PL^5xh2b)lf8?Z4K*n}PmP8i(6MB1&jYYEN=nLW zKT%WD&|JSkTU$q0&%glj#g|)5OwG1gSnaU3-D!_;baHWZ+p~AS*8xBOppek8utQNX zd%^yor>7Vc3Eid1C`tPq{F!fY-7iXW;@wu)ns5uzFN_xO3 zViZ96-%Weuo2pP!hYGfhLl(-ugFC2$9CCW7D5mpl^_f?1u5+y})};)ZTJH(6C@u|+ zQQi8dxHg4Izl&`eh9?F@PP3hdLQykeq?nQxihg8X|ILl8iFm;__t)#~X1*zL9u)YL z)*cpY4mA2arS_sRGg+X_s`n}lAQVXl4K7#u+@Gn9JFMD1;`XSuJ>vAWxcu=TSI60h z^-taIfANy4|D?So?V11Hir0=TxGsf_&8ukjxgJ9u$Hon7Ce|0?i}OD-e%HYAv>jfk zv7ar$9@4N8ns6^5eUH?({)Vkgf+zCMcrgbz8B1GOl6ymy@I=8^tk@0294x|)bb7h| zk=t(iE!#bAQCap;`o{0eSvGznxa4HPUe?^F(UsUx`zx&FL%fzogUG9vEN0?p;NokV zW&vu3UgPZPtM}v5)|?0)ZR90mDYtpBgH+U$z0IaSB#Jre=qr3)+tjZ53(?eNcw5fn z%!H9a;*uWy!s`(e;jytpMVAI=SVvlW16@_!XU&{`v(DLQM`A9A%qHched;%$$q`;8 zHE7>Hl{vr+<5pZQ9LXYycQ;N8eDh`!MUt;3$g{OB{G5jNE5$#Ix*dK{|IjqB4Qbm_ z;XP!&V}#OKo#%0P`&e1$!L9cVW4ZHn-rExdku12cI>X?}Pc0?2$@?FaNzM72zpgWh z@%7X&svkeM>^F;Q^$(u5n=QlkZe2HZ zDsdoiabqQ8x3azo40%q>35@4DjC&;*Ox34n47{`Gn0JU`Vz1RP4kjHmao*lWk?M#! zzB=5=!L;6c6VGVENsk+*Q96rA?zK*GbBmwpzqa!m+KY>hdIWRn$~0k#$Iav@k##?O z3!Z_c*poW64?L}6VIns@&IsvgFt^40@whf8rKpO~C75W<6OQ9M=PkF?^_Sp3Q8(Op zX?<6|7RSf0yJP39>)U%1BDcd2>&-p7zl;j8>R0QDJce!DNjg(__i@Bk5~WQfiTHF& zWMPX~KQikPd-E6th5hAna~~F$$SxE5SRs2l$b)*j=P!S6{F){RXT|#MD`);b7Wl5X z?E#5m(R0V_F{S(}r)zS+(1c4VSEUJ0l8dwL20JK4>r6-2vVv)X&#QmvIukuPa6H|B z_G6a!fBFO8Fn`)t9iSV_HLM=-5v{*BfzF9&^*#|4`I)hnm?OMm>goVJ2UP!*wYan; z%{1~BRlc;-%Zb2nC^CD3Vrw2W)7xx-wWmlF$sQ- z&6)Ux^_EImN+x**uoiLG2Bj|wH*Z*bS3LeR|E=f<_hsr+t^C}#WA}CzTL;Gd7FB^fKFa~X=x-ao1P+IB(1mm_!)Dg(gKiRZKQ=#mIm4O@u{T70{Z?B zc>^+D`3esRV}S6mOqe4RmM4tMh2;rlvIH9=(8-N5;W(KN`jE)z^K$(spbzBDK7PO) z>ADbc3Uq>5q6|Ve|0kswS?RyuNnRS+FYEQRtn_ACX=e;VH5}&zLrmj=RV93k8R0nE zfaV-W`~UFd`TwNy_xRr<^4c}wxSR}h?42pweERVh>>cbTZ3IH?w_dhX$^KA!g~ zl?bRh{8cJU>l=1c=k%mV0LCRx|EP{q>iLuMHq05TZRjE-?}tAWUUEnsOJ6Vj{Uuvp z0xc6ccdL&dHg>Kcca&{mq;-;j!yx?l(531b^tY)2a6p8bR6|G}h2z$sw;hF|=NWVn z@{O2-K}Z((3hl@jY#7jMk_i(3Dk$iN1n2Je^8Q>FE9zRU);0W&uJVHYwUN~0qbtL; z_{|pAk@E3Cb0mV{^nf{erxFNbQ+-CYAQFe}yi_;<1l`1q1kgd%K-g>rWwfnqoBl@){jyn{jS;s=eLvmuV@q3e&+ zpMR?_{b_ofto+|R0?xjXfP2B#l~h+7NK}B%l5Q_=V!)26@oKF^homRb>4herRYSlL z!1SLf&zT8S=FCoknKg9ry1``c#EtpuYvs^Y($-1yQq-jCQ_zi_G(i8VQuS9Vl2IJA ztIt4w^d^PiGGCF48uPE;G3Kua9^ m1dnUL@Oj4Wg@5@pTTmBFG|pCC&p82pXS%z3x-{;>Xa5hJTdMB> literal 0 HcmV?d00001 diff --git a/yarn.lock b/yarn.lock index fca973a33f..b81b4c64a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -976,7 +976,7 @@ version "5.2.5" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073" -"@types/node@*", "@types/node@^10.1.0", "@types/node@^10.5.2": +"@types/node@*", "@types/node@^10.1.0": version "10.5.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.3.tgz#5bcfaf088ad17894232012877669634c06b20cc5" @@ -1014,6 +1014,10 @@ version "0.0.30" resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" +"@types/webpack-env@^1.13.6": + version "1.13.6" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.13.6.tgz#128d1685a7c34d31ed17010fc87d6a12c1de6976" + "@types/ws@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.2.tgz#f02d3b1cd46db7686734f3ce83bdf46c49decd64" @@ -1325,6 +1329,13 @@ agentkeepalive@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-2.2.0.tgz#c5d1bd4b129008f1163f236f86e5faea2026e2ef" +aggregate-error@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-1.0.0.tgz#888344dad0220a72e3af50906117f48771925fac" + dependencies: + clean-stack "^1.0.0" + indent-string "^3.0.0" + ajv-errors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" @@ -2743,6 +2754,10 @@ clean-css@4.1.x: dependencies: source-map "0.5.x" +clean-stack@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -3442,6 +3457,13 @@ cross-fetch@2.0.0: node-fetch "2.0.0" whatwg-fetch "2.0.3" +cross-spawn-async@^2.1.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" + dependencies: + lru-cache "^4.0.0" + which "^1.2.8" + cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -3722,6 +3744,18 @@ cssstyle@^1.0.0: dependencies: cssom "0.3.x" +csv-parser@^1.6.0: + version "1.12.1" + resolved "http://registry.npmjs.org/csv-parser/-/csv-parser-1.12.1.tgz#391e1ef961b1f9dcb4c7c0f82eb450a1bd916158" + dependencies: + buffer-alloc "^1.1.0" + buffer-from "^1.0.0" + generate-function "^1.0.1" + generate-object-property "^1.0.0" + inherits "^2.0.1" + minimist "^1.2.0" + ndjson "^1.4.0" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -4776,6 +4810,14 @@ execa@0.10.0, execa@^0.10.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.1.1.tgz#b09c2a9309bc0ef0501479472db3180f8d4c3edd" + dependencies: + cross-spawn-async "^2.1.1" + object-assign "^4.0.1" + strip-eof "^1.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -5227,6 +5269,17 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +fkill@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/fkill/-/fkill-5.3.0.tgz#317248aa3efdb1b26b9bf5dc3a198ac3ed27b860" + dependencies: + aggregate-error "^1.0.0" + arrify "^1.0.0" + execa "^0.10.0" + pid-from-port "^1.0.0" + process-exists "^3.1.0" + taskkill "^2.0.0" + flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" @@ -5320,7 +5373,7 @@ friendly-errors-webpack-plugin@^1.7.0: error-stack-parser "^2.0.0" string-width "^2.0.0" -from2@^2.1.0: +from2@^2.1.0, from2@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" dependencies: @@ -5443,6 +5496,16 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +generate-function@^1.0.1: + version "1.1.0" + resolved "http://registry.npmjs.org/generate-function/-/generate-function-1.1.0.tgz#54c21b080192b16d9877779c5bb81666e772365f" + +generate-object-property@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -5483,7 +5546,7 @@ get-stdin@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" -get-stream@^2.2.0: +get-stream@^2.1.0, get-stream@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" dependencies: @@ -6323,6 +6386,12 @@ interpret@^1.0.0, interpret@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" +into-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-2.0.1.tgz#db9b003694453eae091d8a5c84cc11507b781d31" + dependencies: + from2 "^2.1.1" + invariant@^2.2.0, invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -6608,6 +6677,10 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" @@ -8120,7 +8193,7 @@ lru-cache@^3.2.0: dependencies: pseudomap "^1.0.1" -lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: +lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" dependencies: @@ -8721,6 +8794,23 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" +ndjson@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-1.5.0.tgz#ae603b36b134bcec347b452422b0bf98d5832ec8" + dependencies: + json-stringify-safe "^5.0.1" + minimist "^1.2.0" + split2 "^2.1.0" + through2 "^2.0.3" + +neat-csv@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/neat-csv/-/neat-csv-2.1.0.tgz#06f58360c4c3b955bd467ddc85ae4511a3907a4c" + dependencies: + csv-parser "^1.6.0" + get-stream "^2.1.0" + into-stream "^2.0.0" + needle@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" @@ -9448,6 +9538,12 @@ performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" +pid-from-port@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pid-from-port/-/pid-from-port-1.1.3.tgz#313a1d056ee71319cff0940ed0ff027dad39ca69" + dependencies: + execa "^0.9.0" + pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -10077,6 +10173,12 @@ private@^0.1.6, private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" +process-exists@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/process-exists/-/process-exists-3.1.0.tgz#86cae049e1e7b51382690ec9fd8dfd74ff7a17c8" + dependencies: + ps-list "^4.0.0" + process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -10158,6 +10260,13 @@ prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" +ps-list@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ps-list/-/ps-list-4.1.0.tgz#8ffd6434add37f9dd1a9f19ab1beb42c9db60dae" + dependencies: + pify "^3.0.0" + tasklist "^3.1.0" + ps-tree@1.1.0, ps-tree@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" @@ -10880,6 +10989,10 @@ schema-utils@^0.4.0, schema-utils@^0.4.2, schema-utils@^0.4.4, schema-utils@^0.4 ajv "^6.1.0" ajv-keywords "^3.1.0" +sec@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sec/-/sec-1.0.0.tgz#033d60a3ad20ecf2e00940d14f97823465774335" + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -11262,7 +11375,7 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split2@^2.0.0: +split2@^2.0.0, split2@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" dependencies: @@ -11716,6 +11829,21 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" +taskkill@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/taskkill/-/taskkill-2.0.0.tgz#a354305702a964357033027aa949eaed5331b784" + dependencies: + arrify "^1.0.0" + execa "^0.1.1" + +tasklist@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/tasklist/-/tasklist-3.1.1.tgz#84cb49f8359b9ed0451dd1d9b6111da18107dbd5" + dependencies: + neat-csv "^2.1.0" + pify "^2.2.0" + sec "^1.0.0" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -11800,7 +11928,7 @@ throttleit@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" -through2@^2.0.0, through2@^2.0.2: +through2@^2.0.0, through2@^2.0.2, through2@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: @@ -12548,7 +12676,7 @@ vue-jest@^2.6.0: tsconfig "^7.0.0" vue-template-es2015-compiler "^1.6.0" -vue-loader@15.3.0, vue-loader@^15.2.4, vue-loader@^15.3.0: +vue-loader@15.3.0, vue-loader@^15.2.4, vue-loader@^15.4.2: version "15.3.0" resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.3.0.tgz#b474d10a4e93d934a78c147fc3e314b370e9fc54" dependencies: @@ -12991,7 +13119,7 @@ which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@^1.2.10, which@^1.2.12, which@^1.2.9, which@^1.3.0: +which@^1.2.10, which@^1.2.12, which@^1.2.8, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" dependencies: From 763e4e74252004d4a7cc87255090542b8a12de60 Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Thu, 20 Sep 2018 14:18:51 +0200 Subject: [PATCH 02/89] fix: contrast improvements --- packages/@vue/cli-ui/src/components/ItemLogo.vue | 4 +++- packages/@vue/cli-ui/src/style/mixins.styl | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/@vue/cli-ui/src/components/ItemLogo.vue b/packages/@vue/cli-ui/src/components/ItemLogo.vue index 57493ff3d7..ed5880797a 100644 --- a/packages/@vue/cli-ui/src/components/ItemLogo.vue +++ b/packages/@vue/cli-ui/src/components/ItemLogo.vue @@ -113,6 +113,8 @@ export default { background rgba(black, .03) border-radius 50% overflow hidden + .vue-ui-dark-mode & + background rgba(white, .07) .image width 100% height @width @@ -122,7 +124,7 @@ export default { width 24px height @width >>> svg - fill rgba($color-text-light, .3) + fill $color-text-light .color-bullet position absolute diff --git a/packages/@vue/cli-ui/src/style/mixins.styl b/packages/@vue/cli-ui/src/style/mixins.styl index ccfdc56c95..b026f9c03d 100644 --- a/packages/@vue/cli-ui/src/style/mixins.styl +++ b/packages/@vue/cli-ui/src/style/mixins.styl @@ -3,10 +3,10 @@ list-item() cursor pointer &.selected - background rgba($vue-ui-color-primary, .05) + background rgba($vue-ui-color-primary, .08) &:hover - background rgba($vue-ui-color-primary, .03) + background rgba($vue-ui-color-primary, .05) ansi-colors($name, $color) From f67c89fcf012cca7b1975e8708dd5572cf71a12c Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Thu, 20 Sep 2018 14:19:24 +0200 Subject: [PATCH 03/89] feat: plugin/dep/vulnerability widgets design --- .../src/components/DependencyUpdates.vue | 46 +++++++- .../src/components/KillPort.vue | 26 +++-- .../src/components/PluginUpdates.vue | 23 +++- .../src/components/StatusWidget.vue | 102 ++++++++++++++---- .../src/components/Vulnerability.vue | 47 ++++++++ .../@vue/cli-ui-addon-widgets/src/main.js | 2 + .../cli-ui-addon-widgets/src/util/consts.js | 11 ++ .../cli-ui-addon-widgets/src/util/icons.js | 5 - packages/@vue/cli-ui/locales/en.json | 34 +++++- packages/@vue/cli-ui/package.json | 1 + .../@vue/cli-ui/src/components/Widget.vue | 7 +- packages/@vue/cli-ui/src/i18n.js | 15 +++ packages/@vue/cli-ui/ui-defaults/widgets.js | 25 ++++- yarn.lock | 8 +- 14 files changed, 302 insertions(+), 50 deletions(-) create mode 100644 packages/@vue/cli-ui-addon-widgets/src/components/Vulnerability.vue create mode 100644 packages/@vue/cli-ui-addon-widgets/src/util/consts.js delete mode 100644 packages/@vue/cli-ui-addon-widgets/src/util/icons.js diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/DependencyUpdates.vue b/packages/@vue/cli-ui-addon-widgets/src/components/DependencyUpdates.vue index f66703567b..2a4da2dc05 100644 --- a/packages/@vue/cli-ui-addon-widgets/src/components/DependencyUpdates.vue +++ b/packages/@vue/cli-ui-addon-widgets/src/components/DependencyUpdates.vue @@ -1,5 +1,49 @@ + + diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/KillPort.vue b/packages/@vue/cli-ui-addon-widgets/src/components/KillPort.vue index b6893a3e61..fc342ee9ac 100644 --- a/packages/@vue/cli-ui-addon-widgets/src/components/KillPort.vue +++ b/packages/@vue/cli-ui-addon-widgets/src/components/KillPort.vue @@ -11,9 +11,9 @@ v-if="status === 'killing'" class="icon" /> -
@@ -106,24 +106,28 @@ export default { justify-content space-between .status - color $vue-ui-color-primary + h-box() + align-items center .icon - position relative - left (-($padding-item * 2)) - margin-right (-($padding-item * 2) + 4px) - >>> svg - fill @color + width 48px + height @width + >>> .vue-ui-icon + width 32px + height @width .info font-size 24px font-weight lighter +.status-killed + .status + .icon >>> svg + fill $vue-ui-color-success !important + .status-error .status - color $vue-ui-color-danger .icon >>> svg - fill @color + fill $vue-ui-color-danger !important -.status, .actions h-box() box-center() diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/PluginUpdates.vue b/packages/@vue/cli-ui-addon-widgets/src/components/PluginUpdates.vue index 5f9821e46d..d3d1b76f75 100644 --- a/packages/@vue/cli-ui-addon-widgets/src/components/PluginUpdates.vue +++ b/packages/@vue/cli-ui-addon-widgets/src/components/PluginUpdates.vue @@ -3,12 +3,24 @@ + :icon-class="iconClasses[status.status]" + :title="$t(`org.vue.widgets.plugin-updates.messages.${status.status}`)" + :status="status" + @check="checkForUpdates()" + > + +
diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue b/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue index dc1de06cac..4e965866c8 100644 --- a/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue +++ b/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue @@ -1,27 +1,58 @@ diff --git a/packages/@vue/cli-ui-addon-widgets/src/main.js b/packages/@vue/cli-ui-addon-widgets/src/main.js index c80d0de8ae..e5dcf8ce65 100644 --- a/packages/@vue/cli-ui-addon-widgets/src/main.js +++ b/packages/@vue/cli-ui-addon-widgets/src/main.js @@ -2,8 +2,10 @@ import Welcome from './components/Welcome.vue' import KillPort from './components/KillPort.vue' import PluginUpdates from './components/PluginUpdates.vue' import DependencyUpdates from './components/DependencyUpdates.vue' +import Vulnerability from './components/Vulnerability.vue' ClientAddonApi.component('org.vue.widgets.components.welcome', Welcome) ClientAddonApi.component('org.vue.widgets.components.kill-port', KillPort) ClientAddonApi.component('org.vue.widgets.components.plugin-updates', PluginUpdates) ClientAddonApi.component('org.vue.widgets.components.dependency-updates', DependencyUpdates) +ClientAddonApi.component('org.vue.widgets.components.vulnerability', Vulnerability) diff --git a/packages/@vue/cli-ui-addon-widgets/src/util/consts.js b/packages/@vue/cli-ui-addon-widgets/src/util/consts.js new file mode 100644 index 0000000000..74fc3a4b35 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/src/util/consts.js @@ -0,0 +1,11 @@ +export const UPDATES_ICONS = { + 'ok': 'check_circle', + 'loading': 'hourglass_full', + 'attention': 'error' +} + +export const UPDATES_ICON_CLASSES = { + 'ok': 'success', + 'loading': '', + 'attention': 'warning' +} diff --git a/packages/@vue/cli-ui-addon-widgets/src/util/icons.js b/packages/@vue/cli-ui-addon-widgets/src/util/icons.js deleted file mode 100644 index c4ec5c61a3..0000000000 --- a/packages/@vue/cli-ui-addon-widgets/src/util/icons.js +++ /dev/null @@ -1,5 +0,0 @@ -export const UPDATES_ICONS = { - 'no-update': 'check_circle', - 'loading': 'hourglass_full', - 'updates-available': 'error' -} diff --git a/packages/@vue/cli-ui/locales/en.json b/packages/@vue/cli-ui/locales/en.json index 820cd3b45a..f0ef371f7e 100644 --- a/packages/@vue/cli-ui/locales/en.json +++ b/packages/@vue/cli-ui/locales/en.json @@ -439,7 +439,7 @@ } }, "project-dashboard": { - "title": "Project dashboard", + "title": "Project dashboard (WIP)", "cutomize": "Customize", "done": "Done" }, @@ -735,7 +735,7 @@ "title": "Kill port", "description": "Kill processes using a specific network port", "input": { - "placeholder": "Enter a network port, ex. 8080" + "placeholder": "Enter a network port" }, "kill": "Kill", "status": { @@ -745,13 +745,39 @@ "error": "Couldn't kill process" } }, + "status-widget": { + "last-updated": "Updated", + "check": "Check for updates", + "more-info": "Details" + }, "plugin-updates": { "title": "Plugin updates", - "description": "Monitor plugin updates" + "description": "Monitor plugin updates", + "messages": { + "ok": "All plugins up-to-date", + "loading": "Checking for updates...", + "attention": "{n} plugin updates available" + }, + "page": "Go to Plugins" }, "dependency-updates": { "title": "Dependency updates", - "description": "Monitor dependencies updates" + "description": "Monitor dependencies updates", + "messages": { + "ok": "All dependencies up-to-date", + "loading": "Checking for updates...", + "attention": "{n} dependency updates available" + }, + "page": "Go to Dependencies" + }, + "vulnerability": { + "title": "Vulnerability check", + "description": "Check for known vulnerabilities in your project dependencies", + "messages": { + "ok": "No vulnerability found", + "loading": "Checking security reports...", + "attention": "{n} vulnerabilities found" + } } } } diff --git a/packages/@vue/cli-ui/package.json b/packages/@vue/cli-ui/package.json index ad79e14f7c..bd66dfcaca 100644 --- a/packages/@vue/cli-ui/package.json +++ b/packages/@vue/cli-ui/package.json @@ -83,6 +83,7 @@ "vue-observe-visibility": "^0.4.1", "vue-router": "^3.0.1", "vue-template-compiler": "^2.5.17", + "vue-timeago": "^5.0.0", "xterm": "^3.2.0" }, "browserslist": [ diff --git a/packages/@vue/cli-ui/src/components/Widget.vue b/packages/@vue/cli-ui/src/components/Widget.vue index fe9504d29d..d376de9657 100644 --- a/packages/@vue/cli-ui/src/components/Widget.vue +++ b/packages/@vue/cli-ui/src/components/Widget.vue @@ -72,6 +72,7 @@ export default { return { widget: { data: this.widget, + openDetails: this.openDetails, remove: this.remove } } @@ -136,6 +137,10 @@ export default { } }, + openDetails () { + // TODO + }, + remove () { this.$apollo.mutate({ mutation: WIDGET_REMOVE, @@ -296,7 +301,7 @@ export default { .icon margin-right ($padding-item / 2) >>> svg - fill rgba(@color, .75) + fill @color .remove-button position absolute diff --git a/packages/@vue/cli-ui/src/i18n.js b/packages/@vue/cli-ui/src/i18n.js index cae26bc5de..811d2c9108 100644 --- a/packages/@vue/cli-ui/src/i18n.js +++ b/packages/@vue/cli-ui/src/i18n.js @@ -1,9 +1,15 @@ import Vue from 'vue' import VueI18n from 'vue-i18n' import deepmerge from 'deepmerge' +import VueTimeago from 'vue-timeago' Vue.use(VueI18n) +Vue.use(VueTimeago, { + name: 'VueTimeago', + locale: 'en' +}) + function detectLanguage () { try { const lang = (window.navigator.languages && window.navigator.languages[0]) || @@ -47,6 +53,15 @@ async function autoDetect () { if (!ok) { console.log(`[UI] No locale package was found for your locale ${codes[0]}.`) } + + const dateFnsLocale = i18n.locale.toLowerCase().replace(/-/g, '_') + Vue.component('VueTimeago', VueTimeago.createTimeago({ + name: 'VueTimeago', + locale: i18n.locale, + locales: { + [i18n.locale]: require(`date-fns/locale/${dateFnsLocale}`) + } + })) } } diff --git a/packages/@vue/cli-ui/ui-defaults/widgets.js b/packages/@vue/cli-ui/ui-defaults/widgets.js index 4417abc9ca..ae00fb4427 100644 --- a/packages/@vue/cli-ui/ui-defaults/widgets.js +++ b/packages/@vue/cli-ui/ui-defaults/widgets.js @@ -19,6 +19,7 @@ module.exports = api => { id: 'welcome', title: 'org.vue.widgets.welcome.title', description: 'org.vue.widgets.welcome.description', + icon: 'mood', component: 'org.vue.widgets.components.welcome', minWidth: 3, minHeight: 4, @@ -33,6 +34,7 @@ module.exports = api => { id: 'kill-port', title: 'org.vue.widgets.kill-port.title', description: 'org.vue.widgets.kill-port.description', + icon: 'flash_on', component: 'org.vue.widgets.components.kill-port', minWidth: 2, minHeight: 1, @@ -56,11 +58,12 @@ module.exports = api => { // Plugin updates - setSharedData('plugin-updates.status', { status: 'no-update' }) + setSharedData('plugin-updates.status', { status: 'ok', lastUpdate: Date.now() }) registerWidget({ id: 'plugin-updates', title: 'org.vue.widgets.plugin-updates.title', description: 'org.vue.widgets.plugin-updates.description', + icon: 'extension', component: 'org.vue.widgets.components.plugin-updates', minWidth: 2, minHeight: 1, @@ -71,15 +74,33 @@ module.exports = api => { // Depdency updates + setSharedData('dependency-updates.status', { status: 'ok', lastUpdate: Date.now() }) registerWidget({ id: 'dependency-updates', title: 'org.vue.widgets.dependency-updates.title', description: 'org.vue.widgets.dependency-updates.description', + icon: 'collections_bookmark', component: 'org.vue.widgets.components.dependency-updates', minWidth: 2, minHeight: 1, maxWidth: 2, maxHeight: 1, - maxCount: 3 + maxCount: 1 + }) + + // Vulnerability check + + setSharedData('vulnerability.status', { status: 'ok', lastUpdate: Date.now() }) + registerWidget({ + id: 'vulnerability', + title: 'org.vue.widgets.vulnerability.title', + description: 'org.vue.widgets.vulnerability.description', + icon: 'verified_user', + component: 'org.vue.widgets.components.vulnerability', + minWidth: 2, + minHeight: 1, + maxWidth: 2, + maxHeight: 1, + maxCount: 1 }) } diff --git a/yarn.lock b/yarn.lock index b81b4c64a7..f1f35d229e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3841,7 +3841,7 @@ data-urls@^1.0.0: whatwg-mimetype "^2.0.0" whatwg-url "^6.4.0" -date-fns@^1.27.2: +date-fns@^1.27.2, date-fns@^1.29.0: version "1.29.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" @@ -12747,6 +12747,12 @@ vue-template-es2015-compiler@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" +vue-timeago@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/vue-timeago/-/vue-timeago-5.0.0.tgz#e9633c28f923b380518f91305a6477e2712f1c0a" + dependencies: + date-fns "^1.29.0" + vue@2.5.17, vue@^2.5.16, vue@^2.5.17: version "2.5.17" resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.17.tgz#0f8789ad718be68ca1872629832ed533589c6ada" From 57cf9740be3d9d75a83c71ff13bdd4a581e24b3c Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Thu, 20 Sep 2018 14:23:42 +0200 Subject: [PATCH 04/89] fix: widget add/remove animation --- packages/@vue/cli-ui/src/components/Widget.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@vue/cli-ui/src/components/Widget.vue b/packages/@vue/cli-ui/src/components/Widget.vue index d376de9657..0b1a159048 100644 --- a/packages/@vue/cli-ui/src/components/Widget.vue +++ b/packages/@vue/cli-ui/src/components/Widget.vue @@ -1,5 +1,5 @@ + + + + diff --git a/packages/@vue/cli-ui-addon-widgets/src/main.js b/packages/@vue/cli-ui-addon-widgets/src/main.js index e5dcf8ce65..587eae36b2 100644 --- a/packages/@vue/cli-ui-addon-widgets/src/main.js +++ b/packages/@vue/cli-ui-addon-widgets/src/main.js @@ -3,9 +3,11 @@ import KillPort from './components/KillPort.vue' import PluginUpdates from './components/PluginUpdates.vue' import DependencyUpdates from './components/DependencyUpdates.vue' import Vulnerability from './components/Vulnerability.vue' +import RunTask from './components/RunTask.vue' ClientAddonApi.component('org.vue.widgets.components.welcome', Welcome) ClientAddonApi.component('org.vue.widgets.components.kill-port', KillPort) ClientAddonApi.component('org.vue.widgets.components.plugin-updates', PluginUpdates) ClientAddonApi.component('org.vue.widgets.components.dependency-updates', DependencyUpdates) ClientAddonApi.component('org.vue.widgets.components.vulnerability', Vulnerability) +ClientAddonApi.component('org.vue.widgets.components.run-task', RunTask) diff --git a/packages/@vue/cli-ui/apollo-server/api/widget.js b/packages/@vue/cli-ui/apollo-server/api/widget.js index 1eadc4fa46..6f764e123d 100644 --- a/packages/@vue/cli-ui/apollo-server/api/widget.js +++ b/packages/@vue/cli-ui/apollo-server/api/widget.js @@ -18,12 +18,12 @@ const schema = createSchema(joi => ({ defaultWidth: joi.number(), defaultHeight: joi.number(), // Config - configPrompts: joi.func(), defaultConfig: joi.func(), needsUserConfig: joi.boolean(), // Hooks onAdded: joi.func(), onRemoved: joi.func(), + onConfigOpen: joi.func(), onConfigChanged: joi.func() })) diff --git a/packages/@vue/cli-ui/apollo-server/connectors/prompts.js b/packages/@vue/cli-ui/apollo-server/connectors/prompts.js index 5ec9d14751..ef2d602ed3 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/prompts.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/prompts.js @@ -162,9 +162,9 @@ function getAnswer (id) { return get(answers, id) } -async function reset () { +async function reset (answers = {}) { prompts = [] - await setAnswers({}) + await setAnswers(answers) } function list () { diff --git a/packages/@vue/cli-ui/apollo-server/connectors/widgets.js b/packages/@vue/cli-ui/apollo-server/connectors/widgets.js index f94ffca039..f80a45840a 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/widgets.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/widgets.js @@ -1,4 +1,6 @@ const shortid = require('shortid') +// Conncetors +const prompts = require('./prompts') // Utils const { log } = require('../util/logger') @@ -30,6 +32,7 @@ function getDefaultWidgets () { let widgetDefs = new Map() let widgetCount = new Map() let widgets = [] +let currentWidget let loadPromise, loadResolve @@ -47,6 +50,7 @@ function reset (context) { } function registerDefinition ({ definition }, context) { + definition.hasConfigPrompts = !!definition.onConfigOpen widgetDefs.set(definition.id, definition) } @@ -233,20 +237,37 @@ function move (input, context) { return widgets } -function openConfig ({ id }, context) { - // const widget = findById({ id }, context) - // TODO +async function openConfig ({ id }, context) { + const widget = findById({ id }, context) + const definition = findDefinition(widget, context) + console.log('openConfig', widget, definition) + if (definition.onConfigOpen) { + const result = await definition.onConfigOpen({ + widget, + definition, + context + }) + console.log(result) + await prompts.reset(widget.config || {}) + result.prompts.forEach(prompts.add) + await prompts.start() + currentWidget = widget + } + console.log(widget, prompts.list()) + return widget } function getConfigPrompts ({ id }, context) { - // const widget = findById({ id }, context) - // TODO + return currentWidget && currentWidget.id === id ? prompts.list() : [] } function saveConfig ({ id }, context) { - // const widget = findById({ id }, context) - // TODO + const widget = findById({ id }, context) + widget.config = prompts.getAnswers() + widget.configured = true save(context) + currentWidget = null + return widget } function resetConfig ({ id }, context) { diff --git a/packages/@vue/cli-ui/apollo-server/schema/widget.js b/packages/@vue/cli-ui/apollo-server/schema/widget.js index 0f278dba32..06e66f37b3 100644 --- a/packages/@vue/cli-ui/apollo-server/schema/widget.js +++ b/packages/@vue/cli-ui/apollo-server/schema/widget.js @@ -26,6 +26,7 @@ type WidgetDefinition { screenshot: String component: String! canAddMore: Boolean! + hasConfigPrompts: Boolean! } type Widget { diff --git a/packages/@vue/cli-ui/index.js b/packages/@vue/cli-ui/index.js index d3b65e1314..318c5ec955 100644 --- a/packages/@vue/cli-ui/index.js +++ b/packages/@vue/cli-ui/index.js @@ -18,6 +18,13 @@ exports.clientAddonConfig = function ({ id, port = 8042 }) { config.plugins.delete('html') config.plugins.delete('optimize-css') config.optimization.splitChunks(false) + + config.module + .rule('gql') + .test(/\.(gql|graphql)$/) + .use('gql-loader') + .loader('graphql-tag/loader') + .end() }, devServer: { headers: { diff --git a/packages/@vue/cli-ui/locales/en.json b/packages/@vue/cli-ui/locales/en.json index f0ef371f7e..773a1faa6b 100644 --- a/packages/@vue/cli-ui/locales/en.json +++ b/packages/@vue/cli-ui/locales/en.json @@ -180,7 +180,9 @@ } }, "widget": { - "remove": "Remove widget" + "remove": "Remove widget", + "configure": "Configure", + "save": "Save" }, "widget-add-pane": { "title": "Add widgets" @@ -778,6 +780,14 @@ "loading": "Checking security reports...", "attention": "{n} vulnerabilities found" } + }, + "run-task": { + "title": "Run task", + "description": "Shortcut to run a task", + "prompts": { + "task": "Select a task" + }, + "page": "Go to Task" } } } diff --git a/packages/@vue/cli-ui/src/components/Widget.vue b/packages/@vue/cli-ui/src/components/Widget.vue index 0b1a159048..bd3d557bef 100644 --- a/packages/@vue/cli-ui/src/components/Widget.vue +++ b/packages/@vue/cli-ui/src/components/Widget.vue @@ -15,13 +15,32 @@
{{ $t(widget.definition.title) }}
+
-
+ +
+ +
+ + +
+ + +
+ +
+ +
+ +
+
+ + diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/NewsItem.vue b/packages/@vue/cli-ui-addon-widgets/src/components/NewsItem.vue new file mode 100644 index 0000000000..e6c2d9a1f7 --- /dev/null +++ b/packages/@vue/cli-ui-addon-widgets/src/components/NewsItem.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/packages/@vue/cli-ui-addon-widgets/src/main.js b/packages/@vue/cli-ui-addon-widgets/src/main.js index 587eae36b2..965108d23f 100644 --- a/packages/@vue/cli-ui-addon-widgets/src/main.js +++ b/packages/@vue/cli-ui-addon-widgets/src/main.js @@ -4,6 +4,8 @@ import PluginUpdates from './components/PluginUpdates.vue' import DependencyUpdates from './components/DependencyUpdates.vue' import Vulnerability from './components/Vulnerability.vue' import RunTask from './components/RunTask.vue' +import News from './components/News.vue' +import Nuxt from './components/Nuxt.vue' ClientAddonApi.component('org.vue.widgets.components.welcome', Welcome) ClientAddonApi.component('org.vue.widgets.components.kill-port', KillPort) @@ -11,3 +13,5 @@ ClientAddonApi.component('org.vue.widgets.components.plugin-updates', PluginUpda ClientAddonApi.component('org.vue.widgets.components.dependency-updates', DependencyUpdates) ClientAddonApi.component('org.vue.widgets.components.vulnerability', Vulnerability) ClientAddonApi.component('org.vue.widgets.components.run-task', RunTask) +ClientAddonApi.component('org.vue.widgets.components.news', News) +ClientAddonApi.component('org.vue.widgets.components.nuxt', Nuxt) diff --git a/packages/@vue/cli-ui/apollo-server/connectors/widgets.js b/packages/@vue/cli-ui/apollo-server/connectors/widgets.js index f80a45840a..b63fd9ca51 100644 --- a/packages/@vue/cli-ui/apollo-server/connectors/widgets.js +++ b/packages/@vue/cli-ui/apollo-server/connectors/widgets.js @@ -159,7 +159,9 @@ function add ({ definitionId }, context) { // Default config if (definition.defaultConfig) { - widget.config = definition.defaultConfig() + widget.config = definition.defaultConfig({ + definition + }) } updateCount(definitionId, 1) @@ -227,6 +229,7 @@ function move (input, context) { widget.y = input.y const definition = findDefinition(widget, context) widget.width = input.width + widget.height = input.height if (widget.width < definition.minWidth) widget.width = definition.minWidth if (widget.width > definition.maxWidth) widget.width = definition.maxWidth if (widget.height < definition.minHeight) widget.height = definition.minHeight diff --git a/packages/@vue/cli-ui/apollo-server/schema/widget.js b/packages/@vue/cli-ui/apollo-server/schema/widget.js index 06e66f37b3..522265e16f 100644 --- a/packages/@vue/cli-ui/apollo-server/schema/widget.js +++ b/packages/@vue/cli-ui/apollo-server/schema/widget.js @@ -27,6 +27,10 @@ type WidgetDefinition { component: String! canAddMore: Boolean! hasConfigPrompts: Boolean! + minWidth: Int! + minHeight: Int! + maxWidth: Int! + maxHeight: Int! } type Widget { diff --git a/packages/@vue/cli-ui/locales/en.json b/packages/@vue/cli-ui/locales/en.json index 773a1faa6b..bcf52a877c 100644 --- a/packages/@vue/cli-ui/locales/en.json +++ b/packages/@vue/cli-ui/locales/en.json @@ -788,6 +788,13 @@ "task": "Select a task" }, "page": "Go to Task" + }, + "news": { + "title": "News", + "description": "Read news feed", + "prompts": { + "url": "RSS feed URL" + } } } } diff --git a/packages/@vue/cli-ui/src/components/Widget.vue b/packages/@vue/cli-ui/src/components/Widget.vue index bd3d557bef..93fa4e59be 100644 --- a/packages/@vue/cli-ui/src/components/Widget.vue +++ b/packages/@vue/cli-ui/src/components/Widget.vue @@ -4,7 +4,9 @@ class="widget" :class="{ customizing: customizeMode, - moving: moveState + moving: moveState, + resizing: resizeState, + selected: isSelected }" >
+ +
@@ -75,6 +90,14 @@
+
+
+
+ + + From 347ce25f01d84a761d4c96416f417af634e20c42 Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Sat, 22 Sep 2018 14:53:00 +0200 Subject: [PATCH 08/89] chore: removed widget example --- .../src/components/Nuxt.vue | 41 ------------------- .../@vue/cli-ui-addon-widgets/src/main.js | 2 - packages/@vue/cli-ui/ui-defaults/widgets.js | 28 ------------- 3 files changed, 71 deletions(-) delete mode 100644 packages/@vue/cli-ui-addon-widgets/src/components/Nuxt.vue diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/Nuxt.vue b/packages/@vue/cli-ui-addon-widgets/src/components/Nuxt.vue deleted file mode 100644 index 9929c69cd5..0000000000 --- a/packages/@vue/cli-ui-addon-widgets/src/components/Nuxt.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/packages/@vue/cli-ui-addon-widgets/src/main.js b/packages/@vue/cli-ui-addon-widgets/src/main.js index 965108d23f..7208ac82c7 100644 --- a/packages/@vue/cli-ui-addon-widgets/src/main.js +++ b/packages/@vue/cli-ui-addon-widgets/src/main.js @@ -5,7 +5,6 @@ import DependencyUpdates from './components/DependencyUpdates.vue' import Vulnerability from './components/Vulnerability.vue' import RunTask from './components/RunTask.vue' import News from './components/News.vue' -import Nuxt from './components/Nuxt.vue' ClientAddonApi.component('org.vue.widgets.components.welcome', Welcome) ClientAddonApi.component('org.vue.widgets.components.kill-port', KillPort) @@ -14,4 +13,3 @@ ClientAddonApi.component('org.vue.widgets.components.dependency-updates', Depend ClientAddonApi.component('org.vue.widgets.components.vulnerability', Vulnerability) ClientAddonApi.component('org.vue.widgets.components.run-task', RunTask) ClientAddonApi.component('org.vue.widgets.components.news', News) -ClientAddonApi.component('org.vue.widgets.components.nuxt', Nuxt) diff --git a/packages/@vue/cli-ui/ui-defaults/widgets.js b/packages/@vue/cli-ui/ui-defaults/widgets.js index 0208dbdcbe..0c08dceec3 100644 --- a/packages/@vue/cli-ui/ui-defaults/widgets.js +++ b/packages/@vue/cli-ui/ui-defaults/widgets.js @@ -163,32 +163,4 @@ module.exports = api => { } } }) - - // Nuxt - - registerWidget({ - id: 'nuxt', - title: 'Nuxt status', - description: 'Is the next version of nuxt released yet?', - icon: 'https://avatars2.githubusercontent.com/u/23360933?s=200&v=4', - component: 'org.vue.widgets.components.nuxt', - minWidth: 2, - minHeight: 1, - maxWidth: 2, - maxHeight: 1, - defaultConfig: () => ({ - released: false - }), - onConfigOpen: async ({ context }) => { - return { - prompts: [ - { - name: 'released', - type: 'confirm', - message: 'For real?' - } - ] - } - } - }) } From a13ad26ee888f0d02bde93688b155d374c089d7f Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Sat, 22 Sep 2018 17:08:53 +0200 Subject: [PATCH 09/89] fix: visual polish for widget transform --- packages/@vue/cli-ui/src/components/Widget.vue | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/@vue/cli-ui/src/components/Widget.vue b/packages/@vue/cli-ui/src/components/Widget.vue index 93fa4e59be..a89f5ecf05 100644 --- a/packages/@vue/cli-ui/src/components/Widget.vue +++ b/packages/@vue/cli-ui/src/components/Widget.vue @@ -64,7 +64,7 @@ icon-left="close" v-tooltip="$t('org.vue.components.widget.remove')" @mousedown.native.stop - @click="remove()" + @click.stop="remove()" /> @@ -50,13 +57,22 @@ export default { data () { return { - search: '' // TODO + search: '' } }, methods: { close () { this.$emit('close') + }, + + filterDefinition (def) { + if (!this.search) return true + + const reg = new RegExp(this.search.replace(/\s+/g, '|'), 'i') + return def.title.match(reg) || + (def.description && def.description.match(reg)) || + (def.longDescription && def.longDescription.match(reg)) } } } From 4367b1446ca875ff737a148c43b2d161d224c97e Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Wed, 24 Oct 2018 23:52:52 +0200 Subject: [PATCH 60/89] feat(widget): tease upcoming widgets --- .../src/components/StatusWidget.vue | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue b/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue index 3ccdbd6389..a36bd14455 100644 --- a/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue +++ b/packages/@vue/cli-ui-addon-widgets/src/components/StatusWidget.vue @@ -1,5 +1,5 @@ @@ -129,4 +132,18 @@ export default { /deep/ > * &:not(:last-child) margin-right ($padding-item / 2) + +.soon + display flex + box-center() + height 100% + + .text + background $vue-ui-color-primary + color $vue-ui-color-light + padding 4px 14px + border-radius 13px + text-transform lowercase + font-family monospace + opacity .5 From 9d438abd51265204b92076ce19be3b807f79f085 Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Thu, 25 Oct 2018 00:06:52 +0200 Subject: [PATCH 61/89] chore: fix merge dev --- packages/@vue/cli-ui/src/components/app/NotFound.vue | 2 -- .../@vue/cli-ui/src/components/app/ProjectQuickDropdown.vue | 2 -- packages/@vue/cli-ui/src/components/app/TopBar.vue | 2 -- .../@vue/cli-ui/src/components/dashboard/ProjectDashboard.vue | 2 -- packages/@vue/cli-ui/src/components/dashboard/Widget.vue | 2 -- packages/@vue/cli-ui/src/components/dashboard/WidgetAddItem.vue | 2 -- packages/@vue/cli-ui/src/components/dashboard/WidgetAddPane.vue | 2 -- .../@vue/cli-ui/src/components/dashboard/WidgetDetailsView.vue | 2 -- .../@vue/cli-ui/src/components/plugin/ProjectPluginAddLocal.vue | 2 -- 9 files changed, 18 deletions(-) diff --git a/packages/@vue/cli-ui/src/components/app/NotFound.vue b/packages/@vue/cli-ui/src/components/app/NotFound.vue index 9d1ceeffab..6dbf278ff3 100644 --- a/packages/@vue/cli-ui/src/components/app/NotFound.vue +++ b/packages/@vue/cli-ui/src/components/app/NotFound.vue @@ -46,8 +46,6 @@ export default { From 539ce625b8c546ff76221d0bfdce6f23db5097a9 Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Fri, 26 Oct 2018 00:38:30 +0200 Subject: [PATCH 72/89] feat(suggestion): ping animation to improve discoverability --- .../components/suggestion/SuggestionBar.vue | 10 ++----- .../suggestion/SuggestionBarItem.vue | 28 +++++++++++++++++++ .../suggestion/SuggestionBarList.vue | 22 +++++++++++++++ 3 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 packages/@vue/cli-ui/src/components/suggestion/SuggestionBarList.vue diff --git a/packages/@vue/cli-ui/src/components/suggestion/SuggestionBar.vue b/packages/@vue/cli-ui/src/components/suggestion/SuggestionBar.vue index 09997f2697..01296f7ec1 100644 --- a/packages/@vue/cli-ui/src/components/suggestion/SuggestionBar.vue +++ b/packages/@vue/cli-ui/src/components/suggestion/SuggestionBar.vue @@ -38,13 +38,9 @@ /> diff --git a/packages/@vue/cli-ui/src/components/suggestion/SuggestionBarItem.vue b/packages/@vue/cli-ui/src/components/suggestion/SuggestionBarItem.vue index 489b896da9..de160787cc 100644 --- a/packages/@vue/cli-ui/src/components/suggestion/SuggestionBarItem.vue +++ b/packages/@vue/cli-ui/src/components/suggestion/SuggestionBarItem.vue @@ -1,6 +1,12 @@