Skip to content

Commit 151c54a

Browse files
authored
Add tab with Laravel packages (#35)
* Add list of Laravel Packages
1 parent 494c828 commit 151c54a

File tree

12 files changed

+375
-38
lines changed

12 files changed

+375
-38
lines changed

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ All notable changes to `cybercog/laravel-paket` will be documented in this file.
44

55
## [Unreleased]
66

7+
## [1.3.0]
8+
9+
### Added
10+
11+
- ([#35]) Tab with Laravel Packages
12+
713
## [1.2.0]
814

915
### Changed
@@ -32,10 +38,12 @@ All notable changes to `cybercog/laravel-paket` will be documented in this file.
3238

3339
- Initial release
3440

35-
[Unreleased]: https://github.com/cybercog/laravel-paket/compare/1.2.0...master
41+
[Unreleased]: https://github.com/cybercog/laravel-paket/compare/1.3.0...master
42+
[1.3.0]: https://github.com/cybercog/laravel-paket/compare/1.2.0...1.3.0
3643
[1.2.0]: https://github.com/cybercog/laravel-paket/compare/1.1.0...1.2.0
3744
[1.1.0]: https://github.com/cybercog/laravel-paket/compare/1.0.0...1.1.0
3845

46+
[#35]: https://github.com/cybercog/laravel-paket/pull/35
3947
[#33]: https://github.com/cybercog/laravel-paket/pull/33
4048
[#32]: https://github.com/cybercog/laravel-paket/pull/32
4149
[#28]: https://github.com/cybercog/laravel-paket/pull/28

public/app.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/mix-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"/app.js": "/app.js?id=2297f20a440bb65e7fa4",
2+
"/app.js": "/app.js?id=97f94e2dfb815ca2dba3",
33
"/app.css": "/app.css?id=0363aa441deba08d8863"
44
}

resources/js/components/Paket.vue

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
<template>
2+
<div class="flex align-top">
3+
<img
4+
class="w-10 h-10 rounded mr-4 bg-gray-700 p-1"
5+
:style="`background-color: ${this.iconBg}`"
6+
:src="this.icon"
7+
alt=""
8+
/>
9+
<div>
10+
<h4 class="text-gray-900 font-mono" v-text="title"></h4>
11+
<div class="text-gray-600 font-mono text-xs" v-text="description"></div>
12+
</div>
13+
14+
<div class="ml-auto text-right">
15+
<div v-if="isInstalled()">
16+
<uninstall-button
17+
:requirement="{name: this.name, isDevelopment: this.isDevelopment}"
18+
></uninstall-button>
19+
<div class="mt-2">
20+
<span class="bg-gray-200 border-b-2 border-gray-400 px-2 py-1 text-sm font-semibold font-mono tracking-wide text-gray-700" v-text="getVersion()"></span>
21+
</div>
22+
</div>
23+
<div v-if="!isInstalled()">
24+
<install-button
25+
:requirement="{name: this.name, isDevelopment: this.isDevelopment}"
26+
></install-button>
27+
</div>
28+
</div>
29+
</div>
30+
</template>
31+
32+
<script>
33+
import InstallButton from './Requirement/InstallButton';
34+
import UninstallButton from './Requirement/UninstallButton';
35+
36+
export default {
37+
components: {
38+
InstallButton,
39+
UninstallButton,
40+
},
41+
42+
props: {
43+
name: {
44+
type: String,
45+
required: true,
46+
},
47+
title: {
48+
type: String,
49+
required: false,
50+
},
51+
description: {
52+
type: String,
53+
required: false,
54+
},
55+
icon: {
56+
type: String,
57+
required: false,
58+
},
59+
iconBg: {
60+
type: String,
61+
required: false,
62+
default: '#4a5568',
63+
},
64+
isDevelopment: {
65+
type: Boolean,
66+
required: false,
67+
default: false,
68+
},
69+
},
70+
71+
mounted() {
72+
this.fetchData();
73+
},
74+
75+
methods: {
76+
async fetchData() {
77+
await this.$store.dispatch('collectRequirements');
78+
},
79+
80+
isInstalled() {
81+
return this.getVersion() !== null;
82+
},
83+
84+
getVersion() {
85+
let version;
86+
87+
version = this.findRequirementVersion(this.getRequirements('roots', 'essential'), this.name);
88+
if (version !== null) {
89+
return version;
90+
}
91+
92+
version = this.findRequirementVersion(this.getRequirements('roots', 'dev'), this.name);
93+
if (version !== null) {
94+
return version;
95+
}
96+
97+
version = this.findRequirementVersion(this.getRequirements('dependencies', 'essential'), this.name);
98+
if (version !== null) {
99+
return version;
100+
}
101+
102+
version = this.findRequirementVersion(this.getRequirements('dependencies', 'dev'), this.name);
103+
if (version !== null) {
104+
return version;
105+
}
106+
107+
return null;
108+
},
109+
110+
getRequirements(level, environment) {
111+
const requirements = this.$store.state.requirements;
112+
113+
if (typeof requirements[level] === 'undefined') {
114+
return [];
115+
}
116+
117+
if (typeof requirements[level][environment] === 'undefined') {
118+
return [];
119+
}
120+
121+
return requirements[level][environment];
122+
},
123+
124+
findRequirementVersion(requirements, name) {
125+
const results = requirements.filter(requirement => requirement.name === name);
126+
127+
if (results.length === 0) {
128+
return null;
129+
}
130+
131+
const version = results[0].version;
132+
133+
if (version.substr(0, 1) === 'v') {
134+
return version;
135+
}
136+
137+
return `v${version}`;
138+
},
139+
},
140+
}
141+
</script>

resources/js/components/Requirement/InstallButton.vue

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<button
33
type="button"
4-
class="bg-indigo-600 hover:bg-indigo-800 text-indigo-100 hover:text-white font-semibold px-2 py-1 text-xs rounded focus:outline-none focus:shadow-outline uppercase"
4+
:class="getClasses()"
55
:disabled="isFormDisabled()"
66
v-text="buttonText"
77
v-on:click="install()"
@@ -20,6 +20,7 @@
2020
data() {
2121
return {
2222
buttonText: 'Install',
23+
isInvoker: false,
2324
};
2425
},
2526
@@ -48,17 +49,31 @@
4849
this.enableForm();
4950
},
5051
52+
getClasses() {
53+
const activeClasses = 'bg-indigo-600 hover:bg-indigo-800 text-indigo-100 hover:text-white';
54+
const invokerClasses = 'bg-indigo-800 text-white';
55+
const othersClasses = 'bg-gray-400 text-black';
56+
57+
const inactiveClasses = this.isInvoker ? invokerClasses : othersClasses;
58+
59+
const classes = 'font-semibold px-2 py-1 text-xs rounded focus:outline-none focus:shadow-outline uppercase';
60+
61+
return `${classes} ${this.isFormDisabled() ? inactiveClasses : activeClasses}`;
62+
},
63+
5164
isFormDisabled() {
5265
return this.$store.state.isComposerBusy;
5366
},
5467
5568
disableForm() {
5669
this.buttonText = 'Installing';
70+
this.isInvoker = true;
5771
this.$store.commit('runComposer');
5872
},
5973
6074
enableForm() {
6175
this.buttonText = 'Install';
76+
this.isInvoker = false;
6277
this.$store.commit('stopComposer');
6378
},
6479
},

resources/js/components/Requirement/InstallForm.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
:readonly="isFormDisabled()"
77
v-model="command"
88
v-on:keyup.enter="install()"
9-
placeholder="Type vendor/package OR composer require vendor/package"
9+
placeholder="Type in vendor/package OR composer require vendor/package"
1010
/>
1111
<button
1212
type="submit"

resources/js/components/Requirement/Requirement.vue

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
<template>
2-
<div>
3-
<div class="flex">
4-
<div>
5-
<h4 class="text-gray-700 font-mono" v-text="requirement.name"></h4>
6-
<div class="mt-2">
7-
<span class="bg-gray-200 border-b-2 border-gray-400 px-2 py-1 text-sm font-semibold font-mono tracking-wide text-gray-700 mr-2" v-text="requirement.version"></span>
8-
<span class="bg-gray-200 border-b-2 border-gray-400 px-2 py-1 text-sm font-semibold font-mono tracking-wide text-gray-700 mr-2" v-if="getLicense(requirement)" v-text="getLicense(requirement)"></span>
9-
</div>
10-
</div>
11-
<div class="ml-auto">
12-
<uninstall-button
13-
:requirement="requirement"
14-
v-if="isUninstallable()"
15-
></uninstall-button>
2+
<div class="flex">
3+
<div>
4+
<h4 class="text-gray-700 font-mono" v-text="requirement.name"></h4>
5+
<div class="mt-2">
6+
<span class="bg-gray-200 border-b-2 border-gray-400 px-2 py-1 text-sm font-semibold font-mono tracking-wide text-gray-700 mr-2" v-text="requirement.version"></span>
7+
<span class="bg-gray-200 border-b-2 border-gray-400 px-2 py-1 text-sm font-semibold font-mono tracking-wide text-gray-700 mr-2" v-if="getLicense(requirement)" v-text="getLicense(requirement)"></span>
168
</div>
179
</div>
10+
<div class="ml-auto">
11+
<uninstall-button
12+
:requirement="requirement"
13+
v-if="isUninstallable()"
14+
></uninstall-button>
15+
</div>
1816
</div>
1917
</template>
2018

resources/js/components/Requirement/UninstallButton.vue

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<button
33
type="button"
4-
class="bg-red-600 hover:bg-red-800 text-red-100 hover:text-white font-semibold px-2 py-1 text-xs rounded focus:outline-none focus:shadow-outline uppercase"
4+
:class="getClasses()"
55
:disabled="isFormDisabled()"
66
v-text="buttonText"
77
v-on:click="uninstall()"
@@ -20,6 +20,7 @@
2020
data() {
2121
return {
2222
buttonText: 'Uninstall',
23+
isInvoker: false,
2324
};
2425
},
2526
@@ -48,17 +49,31 @@
4849
this.enableForm();
4950
},
5051
52+
getClasses() {
53+
const activeClasses = 'bg-red-600 hover:bg-red-800 text-red-100 hover:text-white';
54+
const invokerClasses = 'bg-red-800 text-white';
55+
const othersClasses = 'bg-gray-400 text-black';
56+
57+
const inactiveClasses = this.isInvoker ? invokerClasses : othersClasses;
58+
59+
const classes = 'font-semibold px-2 py-1 text-xs rounded focus:outline-none focus:shadow-outline uppercase';
60+
61+
return `${classes} ${this.isFormDisabled() ? inactiveClasses : activeClasses}`;
62+
},
63+
5164
isFormDisabled() {
5265
return this.$store.state.isComposerBusy;
5366
},
5467
5568
disableForm() {
5669
this.buttonText = 'Uninstalling';
70+
this.isInvoker = true;
5771
this.$store.commit('runComposer');
5872
},
5973
6074
enableForm() {
6175
this.buttonText = 'Uninstall';
76+
this.isInvoker = false;
6277
this.$store.commit('stopComposer');
6378
},
6479
},

resources/js/routes.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ export default [
1010
component: require('./screens/dashboard/index').default,
1111
},
1212

13+
{
14+
path: '/laravel',
15+
name: 'laravel',
16+
component: require('./screens/laravel/index').default,
17+
},
18+
1319
{
1420
path: '/requirements',
1521
name: 'requirements',

resources/js/screens/dashboard/index.vue

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
<div class="text-lg flex items-center">
1010
<img
1111
class="w-10 h-10 rounded mr-4"
12-
src="https://avatars.githubusercontent.com/u/958072?s=200&v=4"
12+
src="https://avatars.githubusercontent.com/u/5887416?s=250&v=4"
1313
alt=""
1414
/>
15-
Laravel
15+
Paket
1616
<span
17-
class="px-2 py-1 text-xl text-indigo-900 font-semibold"
18-
v-text="getRequirementVersion('laravel/framework')"
17+
class="px-2 py-1 text-xl font-semibold text-indigo-900"
18+
v-text="getRequirementVersion('cybercog/laravel-paket')"
1919
></span>
2020
</div>
2121
</div>
@@ -27,13 +27,13 @@
2727
<div class="text-lg flex items-center">
2828
<img
2929
class="w-10 h-10 rounded mr-4"
30-
src="https://avatars.githubusercontent.com/u/5887416?s=250&v=4"
30+
src="https://avatars.githubusercontent.com/u/958072?s=200&v=4"
3131
alt=""
3232
/>
33-
Paket
33+
Laravel
3434
<span
35-
class="px-2 py-1 text-xl font-semibold text-indigo-900"
36-
v-text="getRequirementVersion('cybercog/laravel-paket')"
35+
class="px-2 py-1 text-xl text-indigo-900 font-semibold"
36+
v-text="getRequirementVersion('laravel/framework')"
3737
></span>
3838
</div>
3939
</div>
@@ -76,16 +76,6 @@
7676
</div>
7777
</div>
7878
</div>
79-
80-
81-
<ul class="list-group list-group-flush mt-4">
82-
<li class="list-group-item">
83-
84-
</li>
85-
<li class="list-group-item">
86-
87-
</li>
88-
</ul>
8979
</div>
9080
</template>
9181

0 commit comments

Comments
 (0)