Move all files to acquia/
This commit is contained in:
parent
50753a977f
commit
d6cde2407c
52 changed files with 0 additions and 0 deletions
3
acquia/.browserslistrc
Normal file
3
acquia/.browserslistrc
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
> 1%
|
||||
last 2 versions
|
||||
not ie <= 8
|
||||
5
acquia/.editorconfig
Normal file
5
acquia/.editorconfig
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[*.{js,jsx,ts,tsx,vue}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
1
acquia/.envrc
Normal file
1
acquia/.envrc
Normal file
|
|
@ -0,0 +1 @@
|
|||
use flake
|
||||
17
acquia/.eslintrc.js
Normal file
17
acquia/.eslintrc.js
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
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'
|
||||
}
|
||||
}
|
||||
20
acquia/.gitignore
vendored
Normal file
20
acquia/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
.DS_Store
|
||||
node_modules
|
||||
/dist
|
||||
|
||||
# local env files
|
||||
.env.local
|
||||
.env.*.local
|
||||
|
||||
# Log files
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
/.terraform.lock.hcl
|
||||
/.terraform/
|
||||
/terraform.tfstate
|
||||
/terraform.tfstate.*
|
||||
|
||||
# Nix
|
||||
/.direnv/
|
||||
37
acquia/README.md
Normal file
37
acquia/README.md
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
# Rebuilding Acquia
|
||||
|
||||
[](https://app.netlify.com/sites/rebuilding-acquia/deploys)
|
||||
|
||||
A clone of [Acquia](https://www.acquia.com)’s hosting dashboard, built with [Vue.js](https://vuejs.org) and [Tailwind CSS](https://tailwindcss.com).
|
||||
|
||||

|
||||
|
||||
[View the site live on Netlify →](https://rebuilding-acquia.oliverdavies.uk)
|
||||
|
||||
## Project setup
|
||||
```
|
||||
yarn install
|
||||
```
|
||||
|
||||
### Compiles and hot-reloads for development
|
||||
```
|
||||
yarn run serve
|
||||
```
|
||||
|
||||
### Compiles and minifies for production
|
||||
```
|
||||
yarn run build
|
||||
```
|
||||
|
||||
### Run your tests
|
||||
```
|
||||
yarn run test
|
||||
```
|
||||
|
||||
### Lints and fixes files
|
||||
```
|
||||
yarn run lint
|
||||
```
|
||||
|
||||
### Customize configuration
|
||||
See [Configuration Reference](https://cli.vuejs.org/config/).
|
||||
12
acquia/babel.config.js
Normal file
12
acquia/babel.config.js
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
module.exports = {
|
||||
presets: [
|
||||
[
|
||||
'@babel/preset-env',
|
||||
{
|
||||
targets: {
|
||||
node: 'current'
|
||||
}
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
27
acquia/flake.lock
generated
Normal file
27
acquia/flake.lock
generated
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1659446231,
|
||||
"narHash": "sha256-hekabNdTdgR/iLsgce5TGWmfIDZ86qjPhxDg/8TlzhE=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "eabc38219184cc3e04a974fe31857d8e0eac098d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-21.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
23
acquia/flake.nix
Normal file
23
acquia/flake.nix
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-21.11";
|
||||
|
||||
outputs =
|
||||
{ nixpkgs, ... }:
|
||||
let
|
||||
system = "x86_64-linux";
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
inherit (pkgs) mkShell nodejs;
|
||||
inherit (pkgs.nodePackages) yarn;
|
||||
in
|
||||
{
|
||||
devShells.${system}.default = mkShell {
|
||||
buildInputs = [
|
||||
nodejs
|
||||
yarn
|
||||
];
|
||||
};
|
||||
|
||||
formatter.${system} = pkgs.nixfmt-rfc-style;
|
||||
};
|
||||
}
|
||||
26
acquia/jest.config.js
Normal file
26
acquia/jest.config.js
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
module.exports = {
|
||||
moduleFileExtensions: [
|
||||
'js',
|
||||
'jsx',
|
||||
'json',
|
||||
'vue'
|
||||
],
|
||||
transform: {
|
||||
'^.+\\.vue$': 'vue-jest',
|
||||
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
|
||||
'^.+\\.jsx?$': 'babel-jest'
|
||||
},
|
||||
transformIgnorePatterns: [
|
||||
'/node_modules/'
|
||||
],
|
||||
moduleNameMapper: {
|
||||
'^@/(.*)$': '<rootDir>/src/$1'
|
||||
},
|
||||
snapshotSerializers: [
|
||||
'jest-serializer-vue'
|
||||
],
|
||||
testMatch: [
|
||||
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
|
||||
],
|
||||
testURL: 'http://localhost/'
|
||||
}
|
||||
111
acquia/main.tf
Normal file
111
acquia/main.tf
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
terraform {
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = "~> 4.0"
|
||||
}
|
||||
|
||||
cloudflare = {
|
||||
source = "cloudflare/cloudflare"
|
||||
version = "~> 3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
region = "eu-west-2"
|
||||
}
|
||||
|
||||
provider "aws" {
|
||||
alias = "us-east-1"
|
||||
region = "us-east-1"
|
||||
}
|
||||
|
||||
resource "aws_s3_bucket" "rebuilding-acquia" {
|
||||
bucket = "rebuilding-acquia"
|
||||
}
|
||||
|
||||
resource "aws_s3_bucket_acl" "rebuilding-acquia" {
|
||||
acl = "private"
|
||||
bucket = aws_s3_bucket.rebuilding-acquia.id
|
||||
}
|
||||
|
||||
locals {
|
||||
s3_origin_id = "rebuilding-acquia"
|
||||
zone_name = "oliverdavies.uk"
|
||||
}
|
||||
|
||||
resource "aws_cloudfront_origin_access_control" "rebuilding-acquia" {
|
||||
name = "rebuilding-acquia"
|
||||
description = "rebuilding-acquia"
|
||||
origin_access_control_origin_type = "s3"
|
||||
signing_behavior = "always"
|
||||
signing_protocol = "sigv4"
|
||||
}
|
||||
|
||||
data "cloudflare_zone" "rebuilding-acquia" {
|
||||
name = local.zone_name
|
||||
}
|
||||
|
||||
data "aws_acm_certificate" "rebuilding-acquia" {
|
||||
domain = local.zone_name
|
||||
provider = aws.us-east-1
|
||||
statuses = ["ISSUED"]
|
||||
}
|
||||
|
||||
resource "aws_cloudfront_distribution" "s3_distribution" {
|
||||
origin {
|
||||
domain_name = aws_s3_bucket.rebuilding-acquia.bucket_regional_domain_name
|
||||
origin_access_control_id = aws_cloudfront_origin_access_control.rebuilding-acquia.id
|
||||
origin_id = local.s3_origin_id
|
||||
}
|
||||
|
||||
comment = "Rebuilding Acquia - Tailwind CSS example"
|
||||
default_root_object = "index.html"
|
||||
enabled = true
|
||||
is_ipv6_enabled = true
|
||||
|
||||
aliases = ["rebuilding-acquia.${local.zone_name}"]
|
||||
|
||||
default_cache_behavior {
|
||||
allowed_methods = ["GET", "HEAD"]
|
||||
cached_methods = ["GET", "HEAD"]
|
||||
target_origin_id = local.s3_origin_id
|
||||
|
||||
forwarded_values {
|
||||
query_string = false
|
||||
|
||||
cookies {
|
||||
forward = "none"
|
||||
}
|
||||
}
|
||||
|
||||
default_ttl = 3600
|
||||
max_ttl = 86400
|
||||
min_ttl = 0
|
||||
viewer_protocol_policy = "allow-all"
|
||||
}
|
||||
|
||||
price_class = "PriceClass_100"
|
||||
|
||||
restrictions {
|
||||
geo_restriction {
|
||||
locations = []
|
||||
restriction_type = "none"
|
||||
}
|
||||
}
|
||||
|
||||
viewer_certificate {
|
||||
acm_certificate_arn = data.aws_acm_certificate.rebuilding-acquia.arn
|
||||
ssl_support_method = "sni-only"
|
||||
}
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "rebuilding-acquia" {
|
||||
name = "rebuilding-acquia"
|
||||
proxied = false
|
||||
ttl = 0
|
||||
type = "CNAME"
|
||||
value = aws_cloudfront_distribution.s3_distribution.domain_name
|
||||
zone_id = data.cloudflare_zone.rebuilding-acquia.id
|
||||
}
|
||||
8
acquia/netlify.toml
Normal file
8
acquia/netlify.toml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
[build]
|
||||
command = """\
|
||||
yarn lint
|
||||
yarn test:unit
|
||||
yarn build
|
||||
"""
|
||||
publish = "dist"
|
||||
environment = { NODE_VERSION = "v12.6.0", YARN_VERSION = "1.13.0" }
|
||||
40
acquia/package.json
Normal file
40
acquia/package.json
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
{
|
||||
"name": "rebuilding-acquia2",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build",
|
||||
"test": "jest",
|
||||
"lint": "vue-cli-service lint",
|
||||
"test:unit": "vue-cli-service test:unit"
|
||||
},
|
||||
"dependencies": {
|
||||
"postcss-nested": "^4.1.2",
|
||||
"sugarss": "^2.0.0",
|
||||
"tailwindcss": "^1.1.2",
|
||||
"tailwindcss-spaced-items": "^0.1.0",
|
||||
"tailwindcss-visuallyhidden": "^1.0.2",
|
||||
"vue": "^2.6.6",
|
||||
"vue-router": "^3.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.6.2",
|
||||
"@babel/preset-env": "^7.6.2",
|
||||
"@fullhuman/postcss-purgecss": "^1.3.0",
|
||||
"@vue/cli-plugin-babel": "^3.11.0",
|
||||
"@vue/cli-plugin-eslint": "^3.11.0",
|
||||
"@vue/cli-plugin-unit-jest": "^3.11.0",
|
||||
"@vue/cli-service": "^3.11.0",
|
||||
"@vue/eslint-config-standard": "^4.0.0",
|
||||
"@vue/test-utils": "1.0.0-beta.29",
|
||||
"babel-core": "7.0.0-bridge.0",
|
||||
"babel-eslint": "^10.0.3",
|
||||
"babel-jest": "^24.9.0",
|
||||
"eslint": "^5.8.0",
|
||||
"eslint-plugin-vue": "^5.0.0",
|
||||
"jest": "^24.9.0",
|
||||
"postcss-import": "^12.0.1",
|
||||
"vue-template-compiler": "^2.5.21"
|
||||
}
|
||||
}
|
||||
16
acquia/postcss.config.js
Normal file
16
acquia/postcss.config.js
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
module.exports = {
|
||||
parser: 'sugarss',
|
||||
plugins: [
|
||||
require('postcss-import'),
|
||||
require('tailwindcss'),
|
||||
require('postcss-nested'),
|
||||
require('autoprefixer'),
|
||||
process.env.NODE_ENV === 'production' && require('@fullhuman/postcss-purgecss')({
|
||||
content: [
|
||||
'./src/**/*.vue',
|
||||
'./public/index.html',
|
||||
],
|
||||
defaultExtractor: content => content.match(/[A-Za-z0-9-_:/]+/g) || []
|
||||
})
|
||||
]
|
||||
}
|
||||
1
acquia/public/_redirects
Normal file
1
acquia/public/_redirects
Normal file
|
|
@ -0,0 +1 @@
|
|||
https://rebuilding-acquia.netlify.com/* https://rebuilding-acquia.oliverdavies.uk/:splat 301!
|
||||
BIN
acquia/public/favicon.ico
Normal file
BIN
acquia/public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
1514
acquia/public/img/icons.symbol.svg
Normal file
1514
acquia/public/img/icons.symbol.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 327 KiB |
BIN
acquia/public/img/logo.png
Normal file
BIN
acquia/public/img/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
17
acquia/public/index.html
Normal file
17
acquia/public/index.html
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="h-full">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||
<title>Rebuilding Acquia</title>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>We're sorry but rebuilding-acquia doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<div id="app" class="flex flex-1 flex-col h-full"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
</html>
|
||||
BIN
acquia/screenshot.png
Normal file
BIN
acquia/screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 140 KiB |
22
acquia/src/App.vue
Normal file
22
acquia/src/App.vue
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<template>
|
||||
<div id="app" class="min-h-screen antialiased bg-gray-200 font-sans flex flex-col flex-1">
|
||||
<div class="flex flex-col flex-1">
|
||||
<router-view :applications="applications" :types="types" class="flex flex-col flex-1"/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style src="./assets/css/tailwind.css"/>
|
||||
|
||||
<script>
|
||||
import { applications, types } from '@/data'
|
||||
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
applications,
|
||||
types
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
9
acquia/src/assets/css/base.css
Normal file
9
acquia/src/assets/css/base.css
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
html
|
||||
line-height: 1.15
|
||||
|
||||
h1,
|
||||
h2
|
||||
@apply font-bold
|
||||
|
||||
h2
|
||||
@apply text-2xl
|
||||
1
acquia/src/assets/css/components.css
Normal file
1
acquia/src/assets/css/components.css
Normal file
|
|
@ -0,0 +1 @@
|
|||
@import 'components/button'
|
||||
13
acquia/src/assets/css/components/button.css
Normal file
13
acquia/src/assets/css/components/button.css
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
.btn
|
||||
@apply text-sm font-thin antialiased text-white px-4 py-3 no-underline rounded mx-1 bg-blue-300
|
||||
|
||||
&:hover,
|
||||
&:focus
|
||||
@apply bg-blue-400
|
||||
|
||||
.btn.is-secondary
|
||||
@apply bg-gray-500
|
||||
|
||||
&:hover,
|
||||
&:focus
|
||||
@apply bg-gray-600
|
||||
7
acquia/src/assets/css/tailwind.css
Normal file
7
acquia/src/assets/css/tailwind.css
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
@import 'tailwindcss/base'
|
||||
@import './base.css'
|
||||
|
||||
@import 'tailwindcss/components'
|
||||
@import './components.css'
|
||||
|
||||
@import 'tailwindcss/utilities'
|
||||
BIN
acquia/src/assets/logo.png
Normal file
BIN
acquia/src/assets/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.7 KiB |
75
acquia/src/components/AppBreadcrumb.vue
Normal file
75
acquia/src/components/AppBreadcrumb.vue
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
<template>
|
||||
<div class="py-1 overflow-y-scroll">
|
||||
<ul class="-ml-3 flex">
|
||||
<li class="ml-3 flex items-center">
|
||||
<div class="flex flex-col-reverse">
|
||||
<span class="text-gray-700 uppercase text-sm">Organization</span>
|
||||
<span v-if="!selectedOrganisation" class="mb-1 block font-bold">All</span>
|
||||
<router-link v-else :to="{ name: 'applications' }" class="mb-1 block font-bold whitespace-no-wrap hover:text-blue-400" v-text="selectedOrganisation"></router-link>
|
||||
</div>
|
||||
<svg class="ml-3" xmlns="http://www.w3.org/2000/svg" width="20" height="20"><path d="M5.94 19.73L15.6 10 5.94.27A.88.88 0 0 0 5.3 0a.89.89 0 0 0-.65 1.51L13.06 10l-8.41 8.49a.89.89 0 0 0 1.29 1.24z"/></svg>
|
||||
</li>
|
||||
|
||||
<li class="ml-3 flex items-center">
|
||||
<div class="flex flex-col-reverse">
|
||||
<span class="text-gray-700 uppercase text-sm">Application</span>
|
||||
<span v-if="!selectedApplication" class="mb-1 block font-bold">All</span>
|
||||
<span v-else-if="!selectedEnvironment" class="mb-1 block font-bold" v-text="selectedApplication"></span>
|
||||
<router-link v-else :to="{ name: 'environments' }" class="mb-1 block font-bold whitespace-no-wrap hover:text-blue-400" v-text="selectedApplication"></router-link>
|
||||
</div>
|
||||
<svg class="ml-3" xmlns="http://www.w3.org/2000/svg" width="20" height="20"><path d="M5.94 19.73L15.6 10 5.94.27A.88.88 0 0 0 5.3 0a.89.89 0 0 0-.65 1.51L13.06 10l-8.41 8.49a.89.89 0 0 0 1.29 1.24z"/></svg>
|
||||
</li>
|
||||
|
||||
<li class="ml-3 flex items-center">
|
||||
<div class="flex flex-col-reverse">
|
||||
<span class="text-gray-700 uppercase text-sm">Environment</span>
|
||||
<span v-if="!selectedApplication" class="mb-1 block font-bold">---</span>
|
||||
<span v-else-if="!selectedEnvironment" class="mb-1 block font-bold">All</span>
|
||||
<span v-else class="mb-1 block font-bold" v-text="selectedEnvironment"></span>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
application: Object,
|
||||
environment: {
|
||||
type: Object,
|
||||
required: false
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
selectedOrganisation: function () {
|
||||
if (!this.application) {
|
||||
return null
|
||||
}
|
||||
|
||||
return 'Rebuilding Acquia'
|
||||
},
|
||||
|
||||
selectedApplication: function () {
|
||||
if (!this.application) {
|
||||
return null
|
||||
}
|
||||
|
||||
return this.application.name
|
||||
},
|
||||
|
||||
selectedEnvironment: function () {
|
||||
if (!this.application) {
|
||||
return null
|
||||
}
|
||||
|
||||
if (!this.environment) {
|
||||
return null
|
||||
}
|
||||
|
||||
return this.environment.name
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
78
acquia/src/components/Application/ApplicationCard.vue
Normal file
78
acquia/src/components/Application/ApplicationCard.vue
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
<template>
|
||||
<div>
|
||||
<div v-if="display == 'grid'" class="bg-white p-4 border-gray-400 rounded-sm border flex-1 shadow">
|
||||
<div class="flex h-full">
|
||||
<div class="flex-1 w-5/6 flex flex-col justify-between">
|
||||
<div>
|
||||
<div>
|
||||
<router-link :to="{name: 'environments', params: {id: id}}" class="text-blue-300 no-underline hover:underline focus:underline focus:outline-none"><h2 class="mb-1">{{ application.name }}</h2></router-link>
|
||||
</div>
|
||||
|
||||
<div class="truncate text-blue-300">
|
||||
<a href="#0" class="text-inherit no-underline hover:underline focus:underline focus:outline-none" v-text="prodUrl"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<php-version class="mt-8" :application="application"></php-version>
|
||||
</div>
|
||||
|
||||
<div class="w-1/6 flex-none text-right">
|
||||
<star-toggle :application="application" :starred="starred" @toggle="starred = !starred"></star-toggle>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="display == 'list'" class="p-3 bg-white border-gray-400 border-b">
|
||||
<div class="-mx-2">
|
||||
<div class="flex flex-row-reverse items-center justify-between">
|
||||
<div class="-mx-2 flex flex-1 justify-between items-center">
|
||||
<div class="px-2 flex-1">
|
||||
<router-link :to="{name: 'environments', params: { id }}" class="text-blue-300 no-underline hover:underline focus:underline">
|
||||
<h2 class="mb-1 text-base font-normal">{{ application.name }}</h2>
|
||||
</router-link>
|
||||
</div>
|
||||
|
||||
<div class="px-2 w-2/5">
|
||||
<a href="#0" class="text-blue-300 no-underline hover:underline focus:underline" v-text="prodUrl"/>
|
||||
</div>
|
||||
|
||||
<div class="px-1 w-1/5">
|
||||
<php-version :application="application"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="px-2">
|
||||
<star-toggle :application="application" :starred="starred" @toggle="starred = !starred"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import PhpVersion from '@/components/Application/PhpVersion'
|
||||
import StarToggle from '@/components/Application/StarToggle'
|
||||
|
||||
export default {
|
||||
components: { PhpVersion, StarToggle },
|
||||
|
||||
props: {
|
||||
application: Object,
|
||||
display: String,
|
||||
id: String
|
||||
},
|
||||
|
||||
data () {
|
||||
return {
|
||||
starred: false
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
prodUrl () {
|
||||
return this.application.environments['prod'].url
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="bg-gray-100 rounded overflow-hidden">
|
||||
<button type="button" class="p-2 focus:outline-none focus:bg-blue-300 focus:text-white" :class="[mode == 'grid' ? 'bg-blue-100 text-white' : 'text-gray-700']" @click="$emit('display-changed', 'grid')">
|
||||
<svg class="h-5 w-5 fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__grid"></use></svg>
|
||||
<span class="visuallyhidden">Grid</span>
|
||||
</button>
|
||||
|
||||
<button type="button" class="p-2 focus:outline-none focus:bg-blue-300 focus:text-white" :class="[mode == 'list' ? 'bg-blue-100 text-white' : 'text-gray-700']" @click="$emit('display-changed', 'list')">
|
||||
<svg class="h-5 w-5 fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__list"></use></svg>
|
||||
<span class="visuallyhidden">List</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
mode: String
|
||||
}
|
||||
}
|
||||
</script>
|
||||
30
acquia/src/components/Application/ApplicationTags.vue
Normal file
30
acquia/src/components/Application/ApplicationTags.vue
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
<template>
|
||||
<div>
|
||||
<ul class="list-reset -ml-2 flex flex-wrap">
|
||||
<li class="ml-2 py-1 px-2 text-2xs rounded uppercase border" :class="typeClasses" v-text="applicationTypeName"/>
|
||||
<li class="ml-2 py-1 px-2 text-2xs rounded uppercase border border-gray-400 bg-white">{{ application.level }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
application: Object
|
||||
},
|
||||
|
||||
computed: {
|
||||
applicationTypeName () {
|
||||
return this.$attrs.types[this.application.type].name
|
||||
},
|
||||
|
||||
typeClasses () {
|
||||
return {
|
||||
'': 'bg-white border-gray-400',
|
||||
drupal: 'bg-blue-100 border-blue-100 text-white',
|
||||
nodejs: 'bg-green border-green text-white'
|
||||
}[this.application.type]
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
24
acquia/src/components/Application/PhpVersion.vue
Normal file
24
acquia/src/components/Application/PhpVersion.vue
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<template>
|
||||
<div class="flex items-center text-sm">
|
||||
<svg class="w-8 h-8" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M1.71 6.86h3.21A2.49 2.49 0 0 1 7 7.67a2.68 2.68 0 0 1 .42 2.19A4.1 4.1 0 0 1 7 11.1a3.55 3.55 0 0 1-.77 1.09A2.6 2.6 0 0 1 5 13a5.92 5.92 0 0 1-1.41.17H2.12l-.45 2.26H0l1.71-8.57m1.41 1.36L2.4 11.8h.31a6.55 6.55 0 0 0 1.91-.22c.52-.17.86-.75 1-1.75.14-.83 0-1.31-.44-1.44a5.52 5.52 0 0 0-1.59-.18zm11.15-1.36h3.21a2.52 2.52 0 0 1 2.05.81A2.75 2.75 0 0 1 20 9.86a4.12 4.12 0 0 1-.38 1.24 3.69 3.69 0 0 1-.76 1.09 2.65 2.65 0 0 1-1.28.79 6.07 6.07 0 0 1-1.42.17h-1.49l-.45 2.26h-1.67l1.72-8.55m1.4 1.36L15 11.8h.31a6.58 6.58 0 0 0 1.92-.22c.51-.17.85-.75 1-1.75.14-.83 0-1.31-.43-1.44a5.64 5.64 0 0 0-1.6-.18zm-7-3.63h1.65l-.44 2.27h1.49a3 3 0 0 1 1.82.51c.41.31.53.92.36 1.81l-.8 4h-1.68l.77-3.79a1.06 1.06 0 0 0-.08-.85c-.12-.17-.4-.25-.82-.25H9.61l-1 4.9H7l1.7-8.6" data-name="Layer 2"/></svg>
|
||||
<span class="ml-1">{{ phpVersion }}</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
application: Object
|
||||
},
|
||||
|
||||
computed: {
|
||||
phpVersion: function () {
|
||||
if (this.application.type !== 'drupal') {
|
||||
return null
|
||||
}
|
||||
|
||||
return this.application.environments['prod'].versions['php']
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
18
acquia/src/components/Application/StarToggle.vue
Normal file
18
acquia/src/components/Application/StarToggle.vue
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<template>
|
||||
<button type="button" @click="$emit('toggle')" class="focus:outline-none" :class="[starred ? 'text-orange-100 hover:text-orange-200 focus:text-orange-200' : 'text-gray-400 focus:text-orange-200 hover:text-orange-100']">
|
||||
<span class="visuallyhidden">{{ !starred ? 'Star' : 'Unstar' }} {{ application.name }}</span>
|
||||
<svg class="-mr-1 h-6 w-6 fill-current" role="presentation"><use :xlink:href="`/img/icons.symbol.svg#state__${starred ? 'starred' : 'unstarred'}`"></use></svg>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
application: Object,
|
||||
starred: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
44
acquia/src/components/Environment/ActionCard.vue
Normal file
44
acquia/src/components/Environment/ActionCard.vue
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
<template>
|
||||
<div class="border border-gray-400 rounded shadow bg-white overflow-hidden">
|
||||
<div class="border-t-4 border-teal">
|
||||
<div class="border-b border-gray-400">
|
||||
<div class="px-3 py-4">
|
||||
<div class="flex flex-row-reverse">
|
||||
<div class="flex-1">
|
||||
<h2 class="mb-1 text-gray-600 text-base">{{ title }}</h2>
|
||||
<div class="text-xs text-gray-600">{{ description }}</div>
|
||||
</div>
|
||||
|
||||
<div class="mr-3">
|
||||
<slot name="icon"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<slot name="buttons"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
description: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
svg
|
||||
@apply h-8 w-8 fill-current text-teal
|
||||
</style>
|
||||
19
acquia/src/components/Environment/ActionCardButton.vue
Normal file
19
acquia/src/components/Environment/ActionCardButton.vue
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<template>
|
||||
<button type="button" class="py-3 w-full flex flex-col items-center text-blue-300 text-xs font-bold no-underline hover:underline focus:underline hover:bg-gray-200 focus:bg-gray-200 focus:outline-none">
|
||||
<slot></slot>
|
||||
<span class="block" v-text="label"></span>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
label: { type: String }
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
svg
|
||||
@apply h-6 w-6 fill-current mb-2
|
||||
</style>
|
||||
97
acquia/src/components/Environment/ActionCards.vue
Normal file
97
acquia/src/components/Environment/ActionCards.vue
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
<template>
|
||||
<div>
|
||||
<ul class="flex flex-wrap md:hidden -mx-1 mb-5">
|
||||
<li class="px-1 w-1/3"><button type="button" class="py-3 w-full text-sm text-white rounded" :class="[ active == 'code' ? 'bg-blue-400' : 'bg-blue-300' ]" @click="active = 'code'">Code</button></li>
|
||||
<li class="px-1 w-1/3"><button type="button" class="py-3 w-full text-sm text-white rounded" :class="[ active == 'databases' ? 'bg-blue-400' : 'bg-blue-300' ]" @click="active = 'databases'">Databases</button></li>
|
||||
<li class="px-1 w-1/3"><button type="button" class="py-3 w-full text-sm text-white rounded" :class="[ active == 'files' ? 'bg-blue-400' : 'bg-blue-300' ]" @click="active = 'files'">Files</button></li>
|
||||
</ul>
|
||||
|
||||
<div class="-mx-4 flex flex-wrap">
|
||||
<div class="px-4 w-full md:w-1/3 md:block" :class="[ active == 'code' ? 'block' : 'hidden' ]">
|
||||
<action-card title="Code" :description="`${ environment.name }: ${environment.label}`">
|
||||
<svg slot="icon" role="presentation"><use xlink:href="/img/icons.symbol.svg#objects__code"></use></svg>
|
||||
|
||||
<ul slot="buttons" class="-ml-px flex">
|
||||
<li class="w-1/2 flex-1 text-center border-l border-gray-400">
|
||||
<action-card-button label="Deploy">
|
||||
<svg role="presentation"><use xlink:href="/img/icons.symbol.svg#objects__fork"></use></svg>
|
||||
</action-card-button>
|
||||
</li>
|
||||
|
||||
<li class="w-1/2 flex-1 text-center border-l border-gray-400">
|
||||
<action-card-button label="Switch">
|
||||
<svg role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__switch"></use></svg>
|
||||
</action-card-button>
|
||||
</li>
|
||||
</ul>
|
||||
</action-card>
|
||||
</div>
|
||||
|
||||
<div class="px-4 w-full md:block md:w-1/3" :class="[ active == 'databases' ? 'block' : 'hidden' ]">
|
||||
<action-card title="Databases" :description="environment.name">
|
||||
<svg slot="icon" role="presentation"><use xlink:href="/img/icons.symbol.svg#objects__database"></use></svg>
|
||||
|
||||
<ul slot="buttons" class="-ml-px flex">
|
||||
<li class="w-1/2 flex-1 text-center border-l border-gray-400">
|
||||
<action-card-button label="Copy">
|
||||
<svg role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__copy"></use></svg>
|
||||
</action-card-button>
|
||||
</li>
|
||||
|
||||
<li class="w-1/2 flex-1 text-center border-l border-gray-400">
|
||||
<action-card-button label="Back up">
|
||||
<svg role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__backup"></use></svg>
|
||||
</action-card-button>
|
||||
</li>
|
||||
|
||||
<li class="w-1/2 flex-1 text-center border-l border-gray-400">
|
||||
<action-card-button label="Restore" :disabled="isProduction" :class="{
|
||||
'text-blue-300': !isProduction,
|
||||
'text-gray-500 cursor-not-allowed': isProduction
|
||||
}">
|
||||
<svg role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__restore"></use></svg>
|
||||
</action-card-button>
|
||||
</li>
|
||||
</ul>
|
||||
</action-card>
|
||||
</div>
|
||||
|
||||
<div class="px-4 w-full md:block md:w-1/3" :class="[ active == 'files' ? 'block' : 'hidden' ]">
|
||||
<action-card title="Files" :description="environment.name">
|
||||
<svg slot="icon" class="h-8 w-8 fill-current text-teal" role="presentation"><use xlink:href="/img/icons.symbol.svg#objects__environment"></use></svg>
|
||||
|
||||
<ul slot="buttons" class="-ml-px flex">
|
||||
<li class="w-1/2 flex-1 text-center border-l border-gray-400">
|
||||
<action-card-button label="Copy">
|
||||
<svg role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__copy"></use></svg>
|
||||
</action-card-button>
|
||||
</li>
|
||||
</ul>
|
||||
</action-card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import ActionCard from '@/components/Environment/ActionCard'
|
||||
import ActionCardButton from '@/components/Environment/ActionCardButton'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ActionCard,
|
||||
ActionCardButton
|
||||
},
|
||||
|
||||
props: {
|
||||
environment: Object,
|
||||
isProduction: Boolean
|
||||
},
|
||||
|
||||
data () {
|
||||
return {
|
||||
active: 'code'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
56
acquia/src/components/Environment/EnvironmentCards.vue
Normal file
56
acquia/src/components/Environment/EnvironmentCards.vue
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
<template>
|
||||
<div class="grid gap-6 grid-cols-1 md:grid-cols-2 xl:grid-cols-3">
|
||||
<div v-for="(environment, key) in application.environments" :key="key">
|
||||
<div class="border border-gray-400 rounded overflow-hidden shadow">
|
||||
<div class="bg-white">
|
||||
<div class="border-t-4 border-teal p-3">
|
||||
<router-link :to="{ name: 'environment', params: { environmentName: key, id: id }}" class="flex items-baseline no-underline hover:underline focus:underline text-gray-600 hover:text-blue-300 focus:text-blue-300 focus:outline-none mb-1">
|
||||
<h2>{{ environment.name }}</h2>
|
||||
<svg class="w-4 h-4 fill-current text-inherit ml-2" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M12.95 10.707l.707-.707L8 4.343 6.586 5.757 10.828 10l-4.242 4.243L8 15.657l4.95-4.95z" fill-rule="evenodd"/></svg>
|
||||
</router-link>
|
||||
|
||||
<div class="mb-2">
|
||||
<a href="#0" class="no-underline hover:underline focus:underline text-gray-600 hover:text-blue-300 focus:text-blue-300 focus:outline-none">
|
||||
{{ environment.url }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="text-gray-600">{{ environment.label }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button type="button" class="flex items-center justify-between text-white pl-1 bg-blue-200 hover:bg-blue-400 focus:bg-blue-400 focus:outline-none focus:underline text-sm w-full text-left py-1">
|
||||
<svg class="h-6 w-5 text-white mr-2 fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#objects__grip-handle"></use></svg>
|
||||
<span class="flex-1">Code</span>
|
||||
<span class="border-l border-gray-400 p-2">
|
||||
<svg class="h-6 w-6 text-white fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__switch"></use></svg>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<button type="button" class="flex items-center justify-between text-white pl-1 bg-blue-200 hover:bg-blue-400 focus:bg-blue-400 focus:outline-none focus:underline text-sm w-full text-left py-1 border-t border-gray-400">
|
||||
<svg class="h-6 w-5 text-white mr-2 fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#objects__grip-handle"></use></svg>
|
||||
<span class="flex-1">Databases</span>
|
||||
<span class="border-l border-gray-400 p-2">
|
||||
<svg class="h-6 w-6 text-white fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__backup"></use></svg>
|
||||
</span>
|
||||
</button>
|
||||
|
||||
<button type="button" class="px-1 py-3 w-full flex items-center text-white bg-blue-200 text-sm text-left border-t border-gray-400 hover:bg-blue-400 focus:bg-blue-400 focus:outline-none focus:underline">
|
||||
<svg class="mr-2 h-6 w-5 text-white fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#objects__grip-handle"></use></svg>
|
||||
Files
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
application: Object,
|
||||
id: String
|
||||
}
|
||||
}
|
||||
</script>
|
||||
71
acquia/src/components/Environment/QuickHelp.vue
Normal file
71
acquia/src/components/Environment/QuickHelp.vue
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
<template>
|
||||
<div class="bg-white border-t-10 border-purple" :class="[hidden ? 'hidden' : 'block lg:flex']">
|
||||
<div class="flex-none py-3 pl-3 pr-8 border-b lg:border-r border-gray-200">
|
||||
<div class="flex items-center">
|
||||
<svg class="mr-1 h-6 w-6 text-purple fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__info"></use></svg>
|
||||
Quick help
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-4">
|
||||
<div class="-mb-5 block leading-normal lg:hidden">
|
||||
<div v-for="item in items" :key="item.subject">
|
||||
<p class="mb-3 text-sm font-bold">{{ item.subject }}</p>
|
||||
<p class="mb-5 text-sm">{{ item.text }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hidden lg:block">
|
||||
<div class="mb-6 w-full lg:w-auto lg:flex">
|
||||
<button
|
||||
v-for="(item, i) in items"
|
||||
:key="item.subject"
|
||||
type="button"
|
||||
class="hover:underline focus:underline mr-6 focus:outline-none"
|
||||
:class="[ i === selected ? 'text-gray-700' : 'text-blue-300' ]"
|
||||
@click="selected = i"
|
||||
>{{ item.subject }}</button>
|
||||
</div>
|
||||
|
||||
<div class="leading-normal">
|
||||
<p class="text-sm text-gray-600">
|
||||
{{ items[selected].text }}
|
||||
<a href="#0" class="text-blue-300 no-underline hover:underline focus:underline">Learn more</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
hidden: Boolean
|
||||
},
|
||||
|
||||
data () {
|
||||
return {
|
||||
selected: 0,
|
||||
items: [
|
||||
{
|
||||
subject: 'Deploying code',
|
||||
text: 'Drag a code element from one environment to another environment, which creates a new tag for the HEAD of that branch and then deploys the tag.'
|
||||
},
|
||||
{
|
||||
subject: 'Copying files',
|
||||
text: 'Drag a file element from one environment to another environment, which writes new files, overwrites existing files, and ignores files already in place.'
|
||||
},
|
||||
{
|
||||
subject: 'Copying database',
|
||||
text: 'Drag a database element from one environment to another environment, which overwrites the target database(s). Dragging database elements with more than one database displays a dialog box that allows you to select the databases to deploy'
|
||||
},
|
||||
{
|
||||
subject: 'Task Log',
|
||||
text: 'The Task Log is displayed below your Acquia Cloud environments and contains information on all of the actions taken against your application, including code deployments, configuration updates and environment specific changes.'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
37
acquia/src/components/Environment/TaskLog/TaskLog.vue
Normal file
37
acquia/src/components/Environment/TaskLog/TaskLog.vue
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="pb-4 pt-6 px-4 bg-gray-300">
|
||||
<h2 class="font-normal text-lg">Task Log</h2>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="list-reset bg-white">
|
||||
<li v-for="task in reversedTasks" :key="task.text">
|
||||
<task-log-item :task="task"></task-log-item>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import reverse from 'lodash/reverse'
|
||||
import TaskLogItem from '@/components/Environment/TaskLog/TaskLogItem'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
TaskLogItem
|
||||
},
|
||||
|
||||
props: {
|
||||
tasks: Array
|
||||
},
|
||||
|
||||
computed: {
|
||||
reversedTasks: function () {
|
||||
let tasks = this.tasks
|
||||
|
||||
return reverse(tasks)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
91
acquia/src/components/Environment/TaskLog/TaskLogItem.vue
Normal file
91
acquia/src/components/Environment/TaskLog/TaskLogItem.vue
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="px-3 py-4 border-b border-gray-300 flex" :class="{'bg-yellow-lightest': open}">
|
||||
<div class="flex-none mr-3">
|
||||
<svg v-if="task.loading" class="rotates h-5 w-5 text-gray-500 fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#feedback__loading"></use></svg>
|
||||
<svg v-if="!task.loading && task.success" class="h-5 w-5 text-green fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#feedback__success-circle"></use></svg>
|
||||
<svg v-if="!task.loading && !task.success" class="h-5 w-5 text-red fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#feedback__warning"></use></svg>
|
||||
</div>
|
||||
|
||||
<div class="flex-1">
|
||||
<div class="mb-2 text-sm font-bold">{{ task.text }}</div>
|
||||
<div class="text-gray-600 text-2xs">{{ task.times.display }}</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button type="button" @click="open = !open">
|
||||
<svg v-if="!open" class="h-5 w-5 text-gray-600 fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#alpha__chevron"></use></svg>
|
||||
<svg v-else class="h-5 w-5 text-gray-600 fill-current" style="transform: rotate(180deg)" role="presentation"><use xlink:href="/img/icons.symbol.svg#alpha__chevron"></use></svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-4 bg-gray-600 text-white antialiased" v-show="open">
|
||||
<div class="-mx-4 -mb-4 lg:flex lg:flex-wrap">
|
||||
<div class="px-4 mb-4">
|
||||
<div class="mb-1 text-xs uppercase">Task ID</div>
|
||||
<div class="text-sm font-bold">12345678</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 px-4 lg:w-1/6 lg:flex-none">
|
||||
<div class="mb-1 text-xs uppercase">User</div>
|
||||
<div class="truncate text-sm font-bold">{{ task.user }}</div>
|
||||
</div>
|
||||
|
||||
<div class="px-4 mb-4 lg:w-1/4 lg:flex-none">
|
||||
<div class="mb-1 text-xs uppercase">Started</div>
|
||||
<div class="truncate text-sm font-bold">{{ task.times.started }}</div>
|
||||
</div>
|
||||
|
||||
<div class="px-4 mb-4 lg:w-1/4 lg:flex-none">
|
||||
<div class="mb-1 text-xs uppercase">Completed</div>
|
||||
<div class="truncate text-sm font-bold">{{ task.times.completed }}</div>
|
||||
</div>
|
||||
|
||||
<div class="px-4 mb-4">
|
||||
<div class="mb-1 text-xs uppercase">Status</div>
|
||||
<div class="text-sm font-bold">{{ status }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
task: Object
|
||||
},
|
||||
|
||||
data () {
|
||||
return {
|
||||
open: false
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
status: function () {
|
||||
if (this.task.loading) {
|
||||
return 'In progress'
|
||||
}
|
||||
|
||||
if (!this.task.success) {
|
||||
return 'Failed'
|
||||
}
|
||||
|
||||
return 'Completed'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.rotates
|
||||
animation: rotation 1s infinite linear
|
||||
|
||||
@-webkit-keyframes rotation
|
||||
from
|
||||
-webkit-transform: rotate(0deg)
|
||||
to
|
||||
-webkit-transform: rotate(-359deg)
|
||||
</style>
|
||||
16
acquia/src/components/Environment/ToggleHelp.vue
Normal file
16
acquia/src/components/Environment/ToggleHelp.vue
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
<template>
|
||||
<div class="hidden lg:block">
|
||||
<button type="button" class="text-blue-300 text-sm font-hairline flex items-end hover:underline focus:underline focus:outline-none" @click="$emit('toggle')">
|
||||
<svg class="mr-1 h-5 w-5 text-blue-300 fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__info"></use></svg>
|
||||
{{ hidden ? 'Show quick help' : 'Hide quick help' }}
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
hidden: Boolean
|
||||
}
|
||||
}
|
||||
</script>
|
||||
38
acquia/src/components/HeaderButtons.vue
Normal file
38
acquia/src/components/HeaderButtons.vue
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<template>
|
||||
<div class="hidden lg:block">
|
||||
<ul class="list-reset flex">
|
||||
<li v-for="(link, i) in links" :key="link.title" :class="{ 'ml-6': i !== 0 }">
|
||||
<button
|
||||
type="button"
|
||||
class="text-xs no-underline hover:underline flex flex-col items-center justify-center"
|
||||
:class="{
|
||||
'text-gray-400 cursor-not-allowed': link.disabled,
|
||||
'text-blue-300': !link.disabled,
|
||||
}"
|
||||
:disabled="link.disabled"
|
||||
>
|
||||
<svg class="mb-2 h-6 w-6 fill-current" role="presentation"><use :xlink:href="`/img/icons.symbol.svg#${link.icon}`"></use></svg>
|
||||
{{ link.title }}
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { omitBy, _ } from 'lodash'
|
||||
|
||||
export default {
|
||||
props: {
|
||||
links: Array
|
||||
},
|
||||
|
||||
computed: {
|
||||
filteredLinks: function () {
|
||||
let links = this.links
|
||||
|
||||
return omitBy(links, _.isEmpty)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
31
acquia/src/components/Navbar.vue
Normal file
31
acquia/src/components/Navbar.vue
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
<template>
|
||||
<div class="bg-white">
|
||||
<div class="mx-1 px-4 lg:px-6 flex items-center leading-none justify-between">
|
||||
<div class="flex-none md:mr-24">
|
||||
<router-link to="/"><img src="/img/logo.png" alt="" class="h-10"></router-link>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col flex-1">
|
||||
<nav class="border-t-2 border-transparent flex justify-end md:justify-start">
|
||||
<a href="#0" class="mx-2 px-4 py-5 inline-block text-sm border-b-4 border-blue-300 text-blue-300 uppercase no-underline hover:underline focus:underline">Develop</a>
|
||||
<a href="#0" class="mx-2 px-4 py-5 inline-block text-sm border-b-4 border-transparent text-blue-300 uppercase no-underline hover:underline focus:underline">Manage</a>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<div class="hidden md:flex md:items-center">
|
||||
<div><a class="text-sm text-blue-300 no-underline hover:underline uppercase" href="#0">Help</a></div>
|
||||
<div class="ml-6"><button type="button">
|
||||
<span class="hidden">Menu</span>
|
||||
<svg class="fill-current text-blue-300" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20"><path id="select-product" class="cls-1" d="M.77,0h4A.76.76,0,0,1,5.5.77v4a.76.76,0,0,1-.77.77h-4A.76.76,0,0,1,0,4.73v-4A.76.76,0,0,1,.77,0ZM7.25.77v4A.76.76,0,0,0,8,5.5h4a.76.76,0,0,0,.77-.77v-4A.76.76,0,0,0,12,0H8A.76.76,0,0,0,7.25.77Zm7.25,0v4a.76.76,0,0,0,.77.77h4A.76.76,0,0,0,20,4.73v-4A.76.76,0,0,0,19.23,0h-4A.76.76,0,0,0,14.5.77ZM0,8v4a.76.76,0,0,0,.77.77h4A.76.76,0,0,0,5.5,12V8a.76.76,0,0,0-.77-.77h-4A.76.76,0,0,0,0,8ZM7.25,8v4a.76.76,0,0,0,.77.77h4a.76.76,0,0,0,.77-.77V8A.76.76,0,0,0,12,7.25H8A.76.76,0,0,0,7.25,8ZM14.5,8v4a.76.76,0,0,0,.77.77h4A.76.76,0,0,0,20,12V8a.76.76,0,0,0-.77-.77h-4A.76.76,0,0,0,14.5,8ZM0,15.27v4A.76.76,0,0,0,.77,20h4a.76.76,0,0,0,.77-.77v-4a.76.76,0,0,0-.77-.77h-4A.76.76,0,0,0,0,15.27Zm7.25,0v4A.76.76,0,0,0,8,20h4a.76.76,0,0,0,.77-.77v-4A.76.76,0,0,0,12,14.5H8A.76.76,0,0,0,7.25,15.27Zm7.25,0v4a.76.76,0,0,0,.77.77h4a.76.76,0,0,0,.77-.77v-4a.76.76,0,0,0-.77-.77h-4A.76.76,0,0,0,14.5,15.27Z"></path></svg>
|
||||
</button></div>
|
||||
<div class="ml-6"><button type="button">
|
||||
<span class="hidden">Activity</span>
|
||||
<svg class="h-6 w-6 text-blue-300 fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#objects__notification"></use></svg>
|
||||
</button></div>
|
||||
<div class="ml-6">
|
||||
<img class="w-5 h-5 rounded-full" src="https://avatars1.githubusercontent.com/u/339813?s=460&v=4" alt="">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
31
acquia/src/components/Sidebar.vue
Normal file
31
acquia/src/components/Sidebar.vue
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
<template>
|
||||
<div class="fixed left-0 h-full w-auto bg-gray-300 text-gray-400 overflow-y-scroll z-30 antialiased lg:w-56">
|
||||
<div>
|
||||
<ul class="list-reset">
|
||||
<li v-for="link in links" :key="link.title">
|
||||
<a
|
||||
href="#0"
|
||||
class="px-4 py-2 flex items-center no-underline text-sm focus:underline"
|
||||
:class="{
|
||||
'bg-gray-600 text-white hover:text-white': link.active,
|
||||
'border-transparent hover:bg-gray-400': !link.active,
|
||||
'text-gray-500 cursor-not-allowed': link.disabled,
|
||||
'text-gray-600 hover:text-blue-300': !link.disabled && !link.active,
|
||||
}"
|
||||
>
|
||||
<svg class="h-6 w-6 fill-current" role="presentation"><use :xlink:href="`/img/icons.symbol.svg#${link.icon}`"></use></svg>
|
||||
<span class="hidden lg:ml-4 lg:block">{{ link.title }}</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
links: Array
|
||||
}
|
||||
}
|
||||
</script>
|
||||
29
acquia/src/components/TitleBlock.vue
Normal file
29
acquia/src/components/TitleBlock.vue
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
<template>
|
||||
<div class="border-b-3 border-gray-300">
|
||||
<div class="px-4 py-5 flex justify-between items-center bg-white border-t border-gray-200 lg:px-6">
|
||||
<div class="w-full flex flex-col md:w-auto">
|
||||
<app-breadcrumb :application="application" :environment="environment"></app-breadcrumb>
|
||||
</div>
|
||||
|
||||
<slot name="right"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import AppBreadcrumb from '@/components/AppBreadcrumb'
|
||||
|
||||
export default {
|
||||
props: {
|
||||
application: Object,
|
||||
environment: {
|
||||
type: Object,
|
||||
required: false
|
||||
}
|
||||
},
|
||||
|
||||
components: {
|
||||
AppBreadcrumb
|
||||
}
|
||||
}
|
||||
</script>
|
||||
249
acquia/src/data.js
Normal file
249
acquia/src/data.js
Normal file
|
|
@ -0,0 +1,249 @@
|
|||
module.exports = {
|
||||
types: {
|
||||
drupal: {
|
||||
id: 'drupal',
|
||||
name: 'Drupal'
|
||||
},
|
||||
nodejs: {
|
||||
id: 'nodejs',
|
||||
name: 'Node.js'
|
||||
}
|
||||
},
|
||||
|
||||
applications: {
|
||||
1: {
|
||||
id: 1,
|
||||
name: 'Rebuilding Acquia',
|
||||
machineName: 'rebuildingacquia',
|
||||
type: 'drupal',
|
||||
level: 'Enterprise',
|
||||
environments: {
|
||||
dev: {
|
||||
name: 'Dev',
|
||||
url: 'dev.rebuilding-acquia.com',
|
||||
label: 'develop',
|
||||
versions: {
|
||||
php: '7.1'
|
||||
}
|
||||
},
|
||||
stage: {
|
||||
name: 'Stage',
|
||||
url: 'stg.rebuilding-acquia.com',
|
||||
label: 'master',
|
||||
versions: {
|
||||
php: '7.1'
|
||||
}
|
||||
},
|
||||
prod: {
|
||||
name: 'Prod',
|
||||
url: 'rebuilding-acquia.com',
|
||||
label: 'tags/2018-12-21',
|
||||
versions: {
|
||||
php: '7.1'
|
||||
}
|
||||
},
|
||||
ra: {
|
||||
name: 'RA',
|
||||
url: 'ra.rebuilding-acquia.com',
|
||||
label: 'tags/WELCOME',
|
||||
versions: {
|
||||
php: '7.2'
|
||||
}
|
||||
}
|
||||
},
|
||||
tasks: [
|
||||
{
|
||||
text: 'Commit: fdac923 Merge branch \'update-password-policy\' refs/heads/master',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 19, 2018 3:48:29 PM UTC +0000',
|
||||
started: 'Dec 19, 2018 3:48:29 PM UTC +0000',
|
||||
completed: 'Dec 19, 2018 3:48:29 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Commit: 9688c41 Update IP address refs/heads/master',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 19, 2018 3:50:31 PM UTC +0000',
|
||||
started: 'Dec 19, 2018 3:50:31 PM UTC +0000',
|
||||
completed: 'Dec 19, 2018 3:50:31 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Deploy code from test to prod',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 19, 2018 3:55:29 PM UTC +0000',
|
||||
started: 'Dec 19, 2018 3:55:29 PM UTC +0000',
|
||||
completed: 'Dec 19, 2018 3:55:29 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Deploy the code reference master to dev',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 20, 2018 10:13:48 PM UTC +0000',
|
||||
started: 'Dec 20, 2018 10:13:48 PM UTC +0000',
|
||||
completed: 'Dec 20, 2018 10:13:48 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Deploy the code reference tags/2018-12-19 to test',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 20, 2018 10:25:07 PM UTC +0000',
|
||||
started: 'Dec 20, 2018 10:25:07 PM UTC +0000',
|
||||
completed: 'Dec 20, 2018 10:25:07 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Commit: e75c4a3 Merge branch \'voucher-code-bug-34\' refs/heads/master',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 21, 2018 12:55:49 PM UTC +0000',
|
||||
started: 'Dec 21, 2018 12:55:49 PM UTC +0000',
|
||||
completed: 'Dec 21, 2018 12:55:49 PM UTC +0000'
|
||||
},
|
||||
status: 'Failed',
|
||||
loading: false,
|
||||
success: false
|
||||
},
|
||||
{
|
||||
text: 'Commit: 398945c Ensure stage_file_proxy is enabled refs/heads/master',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 21, 2018 1:09:19 PM UTC +0000',
|
||||
started: 'Dec 21, 2018 1:09:19 PM UTC +0000',
|
||||
completed: 'Dec 21, 2018 1:09:19 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Commit: 96ac151 Fix syntax refs/heads/master',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 21, 2018 1:23:43 PM UTC +0000',
|
||||
started: 'Dec 21, 2018 1:23:43 PM UTC +0000',
|
||||
completed: 'Dec 21, 2018 1:23:43 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Commit: 8056d51 Add production URLs as settings refs/heads/master',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 21, 2018 1:34:13 PM UTC +0000',
|
||||
started: 'Dec 21, 2018 1:34:13 PM UTC +0000',
|
||||
completed: 'Dec 21, 2018 1:34:13 PM UTC +0000'
|
||||
},
|
||||
status: 'In progress',
|
||||
loading: true,
|
||||
success: true
|
||||
}
|
||||
]
|
||||
},
|
||||
2: {
|
||||
id: 2,
|
||||
name: 'Oliver Davies',
|
||||
machineName: 'oliverdavies',
|
||||
type: 'drupal',
|
||||
level: 'Professional',
|
||||
environments: {
|
||||
dev: {
|
||||
name: 'Dev',
|
||||
url: 'dev.oliverdavies.uk',
|
||||
label: 'develop',
|
||||
versions: {
|
||||
php: '7.2'
|
||||
}
|
||||
},
|
||||
stage: {
|
||||
name: 'Stage',
|
||||
url: 'stg.oliverdavies.uk',
|
||||
label: 'master',
|
||||
versions: {
|
||||
php: '7.2'
|
||||
}
|
||||
},
|
||||
prod: {
|
||||
name: 'Prod',
|
||||
url: 'oliverdavies.uk',
|
||||
label: 'tags/2018-12-21',
|
||||
versions: {
|
||||
php: '7.2'
|
||||
}
|
||||
}
|
||||
},
|
||||
tasks: [
|
||||
{
|
||||
text: 'Create database opdaviestest in Dev.',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 23, 2018 11:26:48 PM UTC +0000',
|
||||
started: 'Dec 23, 2018 11:26:50 PM UTC +0000',
|
||||
completed: 'Dec 23, 2018 11:26:52 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Create database opdaviestest in Stage.',
|
||||
user: 'system',
|
||||
times: {
|
||||
display: 'Dec 23, 2018 11:26:48 PM UTC +0000',
|
||||
started: 'Dec 23, 2018 11:26:50 PM UTC +0000',
|
||||
completed: 'Dec 23, 2018 11:26:52 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Install Drupal 8 to Dev.',
|
||||
user: 'oliver@oliverdavies.uk (oliver@oliverdavies.uk)',
|
||||
times: {
|
||||
display: 'Dec 23, 2018 11:33:52 PM UTC +0000',
|
||||
started: 'Dec 23, 2018 11:33:53 PM UTC +0000',
|
||||
completed: 'Dec 23, 2018 11:37:21 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Commit: 9736ef5 Importing site archive refs/heads/master',
|
||||
user: 'vcs.commit',
|
||||
times: {
|
||||
display: 'Dec 23, 2018 11:36:29 PM UTC +0000',
|
||||
started: 'Dec 23, 2018 11:36:30 PM UTC +0000',
|
||||
completed: 'Dec 23, 2018 11:37:16 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
},
|
||||
{
|
||||
text: 'Commit: 0ab620f Initial commit to Acquia Git starter repo. refs/tags/pre-import-2018-12-23',
|
||||
user: 'vcs.commit',
|
||||
times: {
|
||||
display: 'Dec 23, 2018 11:36:30 PM UTC +0000',
|
||||
started: 'Dec 23, 2018 11:36:32 PM UTC +0000',
|
||||
completed: 'Dec 23, 2018 11:36:33 PM UTC +0000'
|
||||
},
|
||||
loading: false,
|
||||
success: true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
23
acquia/src/main.js
Normal file
23
acquia/src/main.js
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
import App from './App.vue'
|
||||
import HeaderButtons from '@/components/HeaderButtons'
|
||||
import Navbar from '@/components/Navbar'
|
||||
import routes from './routes'
|
||||
import Sidebar from '@/components/Sidebar'
|
||||
import TitleBlock from '@/components/TitleBlock'
|
||||
import Vue from 'vue'
|
||||
import VueRouter from 'vue-router'
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
Vue.component('header-buttons', HeaderButtons)
|
||||
Vue.component('navbar', Navbar)
|
||||
Vue.component('sidebar', Sidebar)
|
||||
Vue.component('title-block', TitleBlock)
|
||||
|
||||
Vue.use(VueRouter)
|
||||
|
||||
new Vue({
|
||||
render: h => h(App),
|
||||
|
||||
router: new VueRouter(routes)
|
||||
}).$mount('#app')
|
||||
25
acquia/src/routes.js
Normal file
25
acquia/src/routes.js
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import Applications from '@/views/Applications'
|
||||
import Environment from '@/views/Environment'
|
||||
import Environments from '@/views/Environments'
|
||||
|
||||
export default {
|
||||
routes: [
|
||||
{
|
||||
path: '/',
|
||||
name: 'applications',
|
||||
component: Applications
|
||||
},
|
||||
{
|
||||
path: '/:id/environments',
|
||||
name: 'environments',
|
||||
component: Environments,
|
||||
props: true
|
||||
},
|
||||
{
|
||||
path: '/:id/environments/:environmentName',
|
||||
name: 'environment',
|
||||
component: Environment,
|
||||
props: true
|
||||
}
|
||||
]
|
||||
}
|
||||
104
acquia/src/views/Applications.vue
Normal file
104
acquia/src/views/Applications.vue
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="w-full fixed top-0 z-30">
|
||||
<navbar></navbar>
|
||||
|
||||
<title-block>
|
||||
<template slot="right">
|
||||
<header-buttons :links="[
|
||||
{ title: 'Add Application', icon: 'alpha__new-app', disabled: false },
|
||||
]"></header-buttons>
|
||||
</template>
|
||||
</title-block>
|
||||
</div>
|
||||
|
||||
<div class="mt-48">
|
||||
<div class="-mt-3 h-full flex flex-row-reverse">
|
||||
<div class="ml-16 p-4 flex-1 overflow-x-hidden lg:ml-56 lg:p-12">
|
||||
<div class="mb-6">
|
||||
<div class="lg:flex lg:items-baseline mb-12">
|
||||
<div class="mr-16 mb-4 lg:mb-0">
|
||||
<h1 class="mb-2 text-4xl font-thin">Applications</h1>
|
||||
</div>
|
||||
|
||||
<application-display-switcher class="mr-3 hidden lg:flex-1 lg:flex lg:justify-end" :mode="display" @display-changed="handleDisplay"></application-display-switcher>
|
||||
|
||||
<div class="justify-between items-baseline lg:flex lg:flex-row-reverse">
|
||||
<div class="w-full">
|
||||
<form action="#">
|
||||
<label for="applications" class="visuallyhidden">Filter applications</label>
|
||||
<input id="applications" type="text" placeholder="Filter applications" class="py-2 px-3 w-full border border-gray-600 rounded">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="-mt-6 -mx-3 flex flex-wrap">
|
||||
<div
|
||||
v-for="application in sortedApplications"
|
||||
:key="application.id"
|
||||
class="px-3 w-full"
|
||||
:class="{ 'mt-6 flex flex-col md:w-1/2 lg:w-1/3 xl:w-1/4': display == 'grid' }"
|
||||
>
|
||||
<application-card
|
||||
:application="application"
|
||||
:display="display"
|
||||
:id="application.id"
|
||||
class="flex flex-col flex-1"
|
||||
></application-card>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<sidebar :links="[
|
||||
{ title: 'All', icon: 'alpha__grid', active: true, disabled: false },
|
||||
{ title: 'Starred', icon: 'state__starred', active: false, disabled: false },
|
||||
{ title: 'Recents', icon: 'objects__recent', active: false, disabled: false },
|
||||
]"></sidebar>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import sortBy from 'lodash/sortBy'
|
||||
import ApplicationCard from '@/components/Application/ApplicationCard'
|
||||
import ApplicationDisplaySwitcher from '@/components/Application/ApplicationDisplaySwitcher'
|
||||
|
||||
export default {
|
||||
props: {
|
||||
applications: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
types: {
|
||||
type: Object,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
|
||||
components: {
|
||||
ApplicationCard,
|
||||
ApplicationDisplaySwitcher
|
||||
},
|
||||
|
||||
data () {
|
||||
return {
|
||||
display: 'grid'
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
sortedApplications: function () {
|
||||
return sortBy(this.applications, [function (a) { return a.name }])
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
handleDisplay (mode) {
|
||||
this.display = mode
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
174
acquia/src/views/Environment.vue
Normal file
174
acquia/src/views/Environment.vue
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="fixed top-0 w-full z-30">
|
||||
<navbar></navbar>
|
||||
|
||||
<title-block :application="application" :environment="environment">
|
||||
<template slot="right">
|
||||
<header-buttons :links="[
|
||||
!isProduction ? { title: 'Install Drupal', icon: 'actions__upload', disabled: false } : {},
|
||||
{ title: 'Clear Varnish', icon: 'alpha__clear-cache', disabled: false },
|
||||
!isProduction ? { title: 'Live development', icon: 'actions__publish-settings', disabled: false } : { title: 'Production mode', icon: 'state__locked', disabled: false },
|
||||
{ title: 'Rename', icon: 'actions__edit', disabled: false },
|
||||
{ title: 'Configure', icon: 'actions__setting', disabled: false },
|
||||
]"></header-buttons>
|
||||
</template>
|
||||
</title-block>
|
||||
</div>
|
||||
|
||||
<div class="mt-48">
|
||||
<div class="-mt-3 flex flex-row-reverse h-full">
|
||||
<div class="ml-16 p-4 flex-1 overflow-x-hidden lg:ml-56 lg:p-12">
|
||||
<div>
|
||||
<div>
|
||||
<h1 class="mb-2 text-4xl font-thin">Overview</h1>
|
||||
|
||||
<application-tags :application="application" :types="$attrs.types"/>
|
||||
</div>
|
||||
|
||||
<div class="my-10">
|
||||
<a :href="environment.url" class="flex items-center text-sm text-blue-300 no-underline hover:underline focus:underline">
|
||||
<svg class="h-6 w-6 fill-current mr-1" role="presentation"><use xlink:href="/img/icons.symbol.svg#alpha__globe"></use></svg>
|
||||
{{ environment.url }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="spaced-y-10">
|
||||
<div>
|
||||
<action-cards :environment="environment" :is-production="isProduction"></action-cards>
|
||||
</div>
|
||||
|
||||
<div class="mt-8 shadow-md overflow-hidden">
|
||||
<div class="p-3 bg-white border-b-2 border-gray-300"><h2 class="text-lg">Site Health</h2></div>
|
||||
<div class="p-4 bg-white">
|
||||
<div>
|
||||
<p class="text-lg font-hairline text-gray-700">Uptime monitoring</p>
|
||||
</div>
|
||||
|
||||
<div class="mt-6 text-center leading-normal">
|
||||
<p class="text-gray-600">
|
||||
Acquia uses a specially tuned uptime monitoring solution to keep track<br class="hidden md:inline">
|
||||
of whether your Drupal site is really up and running.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="mt-5 flex justify-center">
|
||||
<button type="button" class="btn">Enable Uptime</button>
|
||||
<button type="button" class="btn is-secondary">Learn more</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="shadow-md overflow-hidden">
|
||||
<div class="p-3 bg-white border-b-2 border-gray-300"><h2 class="text-lg">Information</h2></div>
|
||||
<div class="px-4 py-6 bg-white">
|
||||
<div class="mb-6 relative">
|
||||
<div class="mb-1 text-xs">Git URL</div>
|
||||
<div class="p-3 border border-gray-500 rounded truncate">{{ gitUrl }}</div>
|
||||
<div class="absolute top-0 right-0">
|
||||
<button type="button" class="flex items-center text-xs text-blue-300 hover:underline focus:underline">
|
||||
<svg class="mr-1 h-3 w-3 fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__copy"></use></svg>
|
||||
Copy <span class="visuallyhidden">Git URL to your clipboard</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-6 relative">
|
||||
<div class="mb-1 text-xs">SSH URL</div>
|
||||
<div class="p-3 border border-gray-500 rounded truncate">{{ sshUrl }}</div>
|
||||
<div class="absolute top-0 right-0">
|
||||
<button type="button" class="flex items-center text-xs text-blue-300 hover:underline focus:underline">
|
||||
<svg class="mr-1 h-3 w-3 fill-current" role="presentation"><use xlink:href="/img/icons.symbol.svg#actions__copy"></use></svg>
|
||||
Copy <span class="visuallyhidden">SSH URL to your clipboard</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="-mx-4 -mb-4 flex flex-wrap lg:-mb-6">
|
||||
<div class="mb-4 px-4 w-full lg:w-1/2 lg:mb-6">
|
||||
<div class="mb-1 text-xs text-gray-600">IP Address</div>
|
||||
<div>1.2.3.4</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 px-4 w-full lg:w-1/2 lg:mb-6">
|
||||
<div class="mb-1 text-xs text-gray-600">Region</div>
|
||||
<div>eu-west-1</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 px-4 w-full lg:w-1/2 lg:mb-6">
|
||||
<div class="mb-1 text-xs text-gray-600">PHP version</div>
|
||||
<div v-text="phpVersion"></div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 px-4 w-full lg:w-1/2 lg:mb-6">
|
||||
<div class="mb-1 text-xs text-gray-600">Live development mode</div>
|
||||
<div>Off</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<sidebar :links="[
|
||||
{ title: 'Overview', icon: 'sections__applications', active: true, disabled: false },
|
||||
{ title: 'Stack Metrics', icon: 'sections__activity', active: false, disabled: false },
|
||||
{ title: 'Servers', icon: 'alpha__server', active: false, disabled: false },
|
||||
{ title: 'Databases', icon: 'alpha__database-38', active: false, disabled: false },
|
||||
{ title: 'Domains', icon: 'alpha__globe', active: false, disabled: false },
|
||||
{ title: 'Users & Keys', icon: 'locations__keys', active: false, disabled: false },
|
||||
{ title: 'SSL', icon: 'alpha__ssl', active: false, disabled: false },
|
||||
{ title: 'Logs', icon: 'alpha__page', active: false, disabled: false },
|
||||
{ title: 'Insight', icon: 'alpha__insight', active: false, disabled: false },
|
||||
{ title: 'Scheduled jobs', icon: 'alpha__recent', active: false, disabled: false },
|
||||
{ title: 'Uptime', icon: 'alpha__grid', active: false, disabled: false },
|
||||
{ title: 'Variables', icon: 'objects__variable', active: false, disabled: false },
|
||||
]"></sidebar>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import ActionCards from '@/components/Environment/ActionCards'
|
||||
import ApplicationTags from '@/components/Application/ApplicationTags'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ActionCards,
|
||||
ApplicationTags
|
||||
},
|
||||
|
||||
props: {
|
||||
id: String,
|
||||
environmentName: String
|
||||
},
|
||||
|
||||
computed: {
|
||||
application: function () {
|
||||
return this.$attrs.applications[this.id]
|
||||
},
|
||||
|
||||
environment: function () {
|
||||
return this.application.environments[this.environmentName]
|
||||
},
|
||||
|
||||
gitUrl: function () {
|
||||
return `${this.application.machineName}@svn-1234.prod.hosting.acquia.com:${this.application.machineName}.git`
|
||||
},
|
||||
|
||||
isProduction: function () {
|
||||
return this.environmentName === 'prod'
|
||||
},
|
||||
|
||||
sshUrl: function () {
|
||||
return `${this.application.machineName}.${this.environmentName}@staging-1234.prod.hosting.acquia.com`
|
||||
},
|
||||
|
||||
phpVersion: function () {
|
||||
return this.environment.versions.php
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
105
acquia/src/views/Environments.vue
Normal file
105
acquia/src/views/Environments.vue
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
<template>
|
||||
<div>
|
||||
<div class="w-full fixed top-0 z-30">
|
||||
<navbar></navbar>
|
||||
|
||||
<title-block :application="application">
|
||||
<template slot="right">
|
||||
<div class="flex items-center">
|
||||
<div class="hidden md:block">
|
||||
<button type="button" class="py-2 px-6 text-sm font-bold text-blue-300 uppercase border border-blue-300 hover:text-blue-400 hover:border-blue-400 focus:border-blue-400">
|
||||
Steps to launch
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<header-buttons class="ml-5" :links="[
|
||||
{ title: 'Add database', icon: 'actions__new-database', disabled: false },
|
||||
{ title: 'Git Info', icon: 'actions__info', disabled: false },
|
||||
{ title: 'Rename', icon: 'actions__edit', disabled: false },
|
||||
{ title: 'Cancel', icon: 'actions__remove--circle', disabled: false },
|
||||
]"></header-buttons>
|
||||
</div>
|
||||
</template>
|
||||
</title-block>
|
||||
</div>
|
||||
|
||||
<div class="mt-48">
|
||||
<div class="-mt-3 h-full flex flex-row-reverse">
|
||||
<div class="ml-16 p-4 flex-1 overflow-x-hidden lg:p-12 lg:ml-56">
|
||||
<div class="mb-6">
|
||||
<div class="mb-2 lg:flex lg:items-baseline">
|
||||
<div class="mr-16 mb-4 lg:mb-0">
|
||||
<h1 class="mb-2 text-4xl font-thin">Environments</h1>
|
||||
|
||||
<application-tags :application="application" :types="$attrs.types"/>
|
||||
</div>
|
||||
|
||||
<div class="flex-1 justify-between items-baseline lg:flex lg:flex-row-reverse">
|
||||
<div class="w-full lg:w-1/2 xl:w-1/3">
|
||||
<form action="#">
|
||||
<input type="text" placeholder="Filter environments" class="py-2 px-3 w-full border border-gray-600 rounded">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="flex-1">
|
||||
<toggle-help @toggle="help.hidden = !help.hidden"></toggle-help>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="spaced-y-6">
|
||||
<quick-help :hidden="help.hidden"></quick-help>
|
||||
|
||||
<environment-cards :application="application" :id="id"/>
|
||||
|
||||
<task-log :tasks="application.tasks" v-if="application.tasks[0]"></task-log>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<sidebar :links="[
|
||||
{ title: 'Environments', icon: 'alpha__grid', active: true, disabled: false },
|
||||
{ title: 'Product Keys', icon: 'locations__keys', active: false, disabled: true },
|
||||
{ title: 'Security', icon: 'alpha__security', active: false, disabled: true },
|
||||
{ title: 'Acquia Search', icon: 'actions__search', active: false, disabled: false },
|
||||
]"></sidebar>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import ApplicationTags from '@/components/Application/ApplicationTags'
|
||||
import EnvironmentCards from '@/components/Environment/EnvironmentCards'
|
||||
import QuickHelp from '@/components/Environment/QuickHelp'
|
||||
import TaskLog from '@/components/Environment/TaskLog/TaskLog'
|
||||
import ToggleHelp from '@/components/Environment/ToggleHelp'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ApplicationTags,
|
||||
EnvironmentCards,
|
||||
QuickHelp,
|
||||
TaskLog,
|
||||
ToggleHelp
|
||||
},
|
||||
|
||||
props: {
|
||||
id: String
|
||||
},
|
||||
|
||||
data () {
|
||||
return {
|
||||
help: {
|
||||
hidden: false
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
application () {
|
||||
return this.$attrs.applications[this.id]
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
65
acquia/tailwind.config.js
Normal file
65
acquia/tailwind.config.js
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
const { fontFamily, spacing } = require('tailwindcss/defaultTheme')
|
||||
|
||||
module.exports = {
|
||||
theme: {
|
||||
colors: {
|
||||
inherit: 'inherit',
|
||||
black: '#22292f',
|
||||
blue: {
|
||||
100: '#29aae1',
|
||||
200: '#018dc7',
|
||||
300: '#0e68a7',
|
||||
400: '#004f86'
|
||||
},
|
||||
green: '#398002',
|
||||
gray: {
|
||||
100: '#f8fafc', // lightest
|
||||
200: '#eee', // lighter
|
||||
300: '#ddd', // light
|
||||
400: '#bbb', // default
|
||||
500: '#888', // dark
|
||||
600: '#555', // darker
|
||||
700: '#333' // darkest
|
||||
},
|
||||
orange: {
|
||||
100: '#fa9903',
|
||||
200: '#ffb401'
|
||||
},
|
||||
purple: '#991faf',
|
||||
red: '#cc1f1a',
|
||||
teal: '#3f7b8f',
|
||||
transparent: 'transparent',
|
||||
white: '#fff',
|
||||
yellow: '#faf8df'
|
||||
},
|
||||
extend: {
|
||||
borderWidth: {
|
||||
3: '3px',
|
||||
6: '6px',
|
||||
10: '10px'
|
||||
},
|
||||
boxShadow: {
|
||||
md: '0 0 10px 0 rgba(0,0,0,0.1)'
|
||||
},
|
||||
fontFamily: {
|
||||
sans: ['Proxima Nova', ...fontFamily.sans]
|
||||
},
|
||||
fontSize: {
|
||||
'2xs': '.625rem' // 10px
|
||||
},
|
||||
spacing: {
|
||||
'2px': '2px',
|
||||
48: '10rem',
|
||||
56: '14rem',
|
||||
64: '16rem'
|
||||
},
|
||||
width: {
|
||||
56: '14rem'
|
||||
}
|
||||
}
|
||||
},
|
||||
plugins: [
|
||||
require('tailwindcss-spaced-items')({ values: spacing }),
|
||||
require('tailwindcss-visuallyhidden')()
|
||||
]
|
||||
}
|
||||
11975
acquia/yarn.lock
Normal file
11975
acquia/yarn.lock
Normal file
File diff suppressed because it is too large
Load diff
Reference in a new issue