ToolkitEditor.svelte 3.1 KB
Newer Older
Timothy J. Baek's avatar
Timothy J. Baek committed
1
<script>
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
2
	import { getContext, createEventDispatcher } from 'svelte';
Timothy J. Baek's avatar
Timothy J. Baek committed
3
4
5
6
7
8

	const i18n = getContext('i18n');

	import CodeEditor from './CodeEditor.svelte';
	import { goto } from '$app/navigation';

Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
9
10
	const dispatch = createEventDispatcher();

Timothy J. Baek's avatar
Timothy J. Baek committed
11
12
13
14
15
16
17
18
	let loading = false;

	let id = '';
	let name = '';
	let meta = {
		description: ''
	};

Timothy J. Baek's avatar
Timothy J. Baek committed
19
	let content = '';
Timothy J. Baek's avatar
Timothy J. Baek committed
20
21
22
23
24
25
26
27
28

	$: if (name) {
		id = name.replace(/\s+/g, '_').toLowerCase();
	}

	let codeEditor;

	const saveHandler = async () => {
		loading = true;
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
29
30
31
32
33
34
		dispatch('save', {
			id,
			name,
			meta,
			content
		});
Timothy J. Baek's avatar
Timothy J. Baek committed
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
	};

	const submitHandler = async () => {
		if (codeEditor) {
			const res = await codeEditor.formatHandler();

			if (res) {
				console.log('Code formatted successfully');
				saveHandler();
			}
		}
	};
</script>

<div class=" flex flex-col justify-between w-full overflow-y-auto h-full">
	<div class="mx-auto w-full md:px-0 h-full">
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
51
52
53
54
55
56
		<form
			class=" flex flex-col max-h-[100dvh] h-full"
			on:submit|preventDefault={() => {
				submitHandler();
			}}
		>
Timothy J. Baek's avatar
Timothy J. Baek committed
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
			<div class="mb-2.5">
				<button
					class="flex space-x-1"
					on:click={() => {
						goto('/workspace/tools');
					}}
				>
					<div class=" self-center">
						<svg
							xmlns="http://www.w3.org/2000/svg"
							viewBox="0 0 20 20"
							fill="currentColor"
							class="w-4 h-4"
						>
							<path
								fill-rule="evenodd"
								d="M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z"
								clip-rule="evenodd"
							/>
						</svg>
					</div>
					<div class=" self-center font-medium text-sm">{$i18n.t('Back')}</div>
				</button>
			</div>

			<div class="flex flex-col flex-1 overflow-auto h-0 rounded-lg">
				<div class="w-full mb-2 flex flex-col gap-1.5">
					<div class="flex gap-2 w-full">
						<input
							class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
							type="text"
							placeholder="Toolkit Name (e.g. My ToolKit)"
							bind:value={name}
							required
						/>

						<input
							class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
							type="text"
							placeholder="Toolkit ID (e.g. my_toolkit)"
							bind:value={id}
							required
						/>
					</div>
					<input
						class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
						type="text"
						placeholder="Toolkit Description (e.g. A toolkit for performing various operations)"
						bind:value={meta.description}
						required
					/>
				</div>

				<div class="mb-2 flex-1 overflow-auto h-0 rounded-lg">
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
111
112
113
114
115
116
117
118
					<CodeEditor
						bind:value={content}
						bind:this={codeEditor}
						on:save={() => {
							// submit form
							submitHandler();
						}}
					/>
Timothy J. Baek's avatar
Timothy J. Baek committed
119
120
121
122
123
124
125
126
127
128
				</div>

				<div class="pb-3 flex justify-end">
					<button
						class="px-3 py-1.5 text-sm font-medium bg-emerald-600 hover:bg-emerald-700 text-gray-50 transition rounded-lg"
					>
						{$i18n.t('Save')}
					</button>
				</div>
			</div>
Timothy J. Baek's avatar
refac  
Timothy J. Baek committed
129
		</form>
Timothy J. Baek's avatar
Timothy J. Baek committed
130
131
	</div>
</div>