Skip to content

Commit 40aa3da

Browse files
committed
Migrate last of the SFC's to TS files
1 parent 5cb57af commit 40aa3da

File tree

9 files changed

+291
-251
lines changed

9 files changed

+291
-251
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import http from '@/api/http';
2+
// @ts-ignore
3+
import route from '../../../../../vendor/tightenco/ziggy/src/js/route';
4+
import {AxiosError} from "axios";
5+
import {ServerDatabase} from "@/api/server/types";
6+
7+
/**
8+
* Creates a new database on the system for the currently active server.
9+
*/
10+
export function createDatabase(server: string, database: string, remote: string): Promise<ServerDatabase> {
11+
return new Promise((resolve, reject) => {
12+
http.post(route('api.client.servers.databases', { server }), {database, remote})
13+
.then(response => {
14+
const copy: any = response.data.attributes;
15+
copy.password = copy.relationships.password.attributes.password;
16+
copy.showPassword = false;
17+
18+
delete copy.relationships;
19+
20+
resolve(copy);
21+
})
22+
.catch((err: AxiosError) => {
23+
if (err.response && err.response.data && Array.isArray(err.response.data.errors)) {
24+
return reject(err.response.data.errors[0].detail);
25+
}
26+
27+
return reject(err);
28+
});
29+
});
30+
}

resources/assets/scripts/api/server/types.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,16 @@ export type DirectoryContents = {
33
directories: Array<string>,
44
editable: Array<string>
55
}
6+
7+
export type ServerDatabase = {
8+
id: string,
9+
name: string,
10+
connections_from: string,
11+
username: string,
12+
host: {
13+
address: string,
14+
port: number,
15+
},
16+
password: string,
17+
showPassword: boolean,
18+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import Vue from 'vue';
2+
import MessageBox from "@/components/MessageBox";
3+
import {createDatabase} from "@/api/server/createDatabase";
4+
5+
export default Vue.component('CreateDatabaseModal', {
6+
components: {MessageBox},
7+
8+
data: function () {
9+
return {
10+
loading: false,
11+
showSpinner: false,
12+
database: '',
13+
remote: '%',
14+
errorMessage: '',
15+
};
16+
},
17+
18+
computed: {
19+
canSubmit: function () {
20+
return this.database.length && this.remote.length;
21+
},
22+
},
23+
24+
methods: {
25+
submit: function () {
26+
this.showSpinner = true;
27+
this.errorMessage = '';
28+
this.loading = true;
29+
30+
createDatabase(this.$route.params.id, this.database, this.remote)
31+
.then((response) => {
32+
this.$emit('database', response);
33+
this.$emit('close');
34+
})
35+
.catch((err: Error | string): void => {
36+
if (typeof err === 'string') {
37+
this.errorMessage = err;
38+
return;
39+
}
40+
41+
console.error('A network error was encountered while processing this request.', { err });
42+
})
43+
.then(() => {
44+
this.loading = false;
45+
this.showSpinner = false;
46+
});
47+
}
48+
},
49+
50+
template: `
51+
<div>
52+
<message-box class="alert error mb-6" :message="errorMessage" v-show="errorMessage.length"/>
53+
<h2 class="font-medium text-neutral-900 mb-6">Create a new database</h2>
54+
<div class="mb-6">
55+
<label class="input-label" for="grid-database-name">Database name</label>
56+
<input id="grid-database-name" type="text" class="input" name="database_name" required
57+
v-model="database"
58+
v-validate="{ alpha_dash: true, max: 100 }"
59+
:class="{ error: errors.has('database_name') }"
60+
>
61+
<p class="input-help error" v-show="errors.has('database_name')">{{ errors.first('database_name') }}</p>
62+
</div>
63+
<div class="mb-6">
64+
<label class="input-label" for="grid-database-remote">Allow connections from</label>
65+
<input id="grid-database-remote" type="text" class="input" name="remote" required
66+
v-model="remote"
67+
v-validate="{ regex: /^[0-9%.]{1,15}$/ }"
68+
:class="{ error: errors.has('remote') }"
69+
>
70+
<p class="input-help error" v-show="errors.has('remote')">{{ errors.first('remote') }}</p>
71+
</div>
72+
<div class="text-right">
73+
<button class="btn btn-secondary btn-sm mr-2" v-on:click.once="$emit('close')">Cancel</button>
74+
<button class="btn btn-primary btn-sm"
75+
:disabled="errors.any() || !canSubmit || showSpinner"
76+
v-on:click="submit"
77+
>
78+
<span class="spinner white" v-bind:class="{ hidden: !showSpinner }">&nbsp;</span>
79+
<span :class="{ hidden: showSpinner }">
80+
Create
81+
</span>
82+
</button>
83+
</div>
84+
</div>
85+
`
86+
});

resources/assets/scripts/components/server/components/database/CreateDatabaseModal.vue

Lines changed: 0 additions & 89 deletions
This file was deleted.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import Vue from 'vue';
2+
import Icon from "@/components/core/Icon";
3+
import Modal from "@/components/core/Modal";
4+
import {ServerDatabase} from "@/api/server/types";
5+
import DeleteDatabaseModal from "@/components/server/components/database/DeleteDatabaseModal";
6+
7+
export default Vue.component('DatabaseRow', {
8+
components: {DeleteDatabaseModal, Modal, Icon},
9+
props: {
10+
database: {
11+
type: Object as () => ServerDatabase,
12+
required: true,
13+
}
14+
},
15+
16+
data: function () {
17+
return {
18+
showDeleteModal: false,
19+
};
20+
},
21+
22+
methods: {
23+
revealPassword: function () {
24+
this.database.showPassword = !this.database.showPassword;
25+
},
26+
},
27+
28+
template: `
29+
<div class="content-box mb-6 hover:border-neutral-200">
30+
<div class="flex items-center text-neutral-800">
31+
<icon name="database" class="flex-none text-green-500"></icon>
32+
<div class="flex-1 px-4">
33+
<p class="uppercase text-xs text-neutral-500 pb-1 select-none">Database Name</p>
34+
<p>{{database.name}}</p>
35+
</div>
36+
<div class="flex-1 px-4">
37+
<p class="uppercase text-xs text-neutral-500 pb-1 select-none">Username</p>
38+
<p>{{database.username}}</p>
39+
</div>
40+
<div class="flex-1 px-4">
41+
<p class="uppercase text-xs text-neutral-500 pb-1 select-none">Password</p>
42+
<p>
43+
<code class="text-sm cursor-pointer" v-on:click="revealPassword">
44+
<span class="select-none" v-if="!database.showPassword">
45+
<icon name="lock" class="h-3"/> &bull;&bull;&bull;&bull;&bull;&bull;
46+
</span>
47+
<span v-else>{{database.password}}</span>
48+
</code>
49+
</p>
50+
</div>
51+
<div class="flex-1 px-4">
52+
<p class="uppercase text-xs text-neutral-500 pb-1 select-none">Server</p>
53+
<p><code class="text-sm">{{database.host.address}}:{{database.host.port}}</code></p>
54+
</div>
55+
<div class="flex-none px-4">
56+
<button class="btn btn-xs btn-secondary btn-red" v-on:click="showDeleteModal = true">
57+
<icon name="trash-2" class="w-3 h-3 mx-1"/>
58+
</button>
59+
</div>
60+
</div>
61+
<modal :show="showDeleteModal" v-on:close="showDeleteModal = false">
62+
<DeleteDatabaseModal
63+
:database="database"
64+
v-on:close="showDeleteModal = false"
65+
v-if="showDeleteModal"
66+
/>
67+
</modal>
68+
</div>
69+
`,
70+
})

resources/assets/scripts/components/server/components/database/DatabaseRow.vue

Lines changed: 0 additions & 68 deletions
This file was deleted.

0 commit comments

Comments
 (0)