Skip to content

Commit 6896d03

Browse files
committed
feat(new tools): iCal Generator/Merger/Parser
iCal file generator, merger and parser
1 parent 1c35ac3 commit 6896d03

File tree

14 files changed

+610
-21
lines changed

14 files changed

+610
-21
lines changed

components.d.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ declare module '@vue/runtime-core' {
8989
HtmlWysiwygEditor: typeof import('./src/tools/html-wysiwyg-editor/html-wysiwyg-editor.vue')['default']
9090
HttpStatusCodes: typeof import('./src/tools/http-status-codes/http-status-codes.vue')['default']
9191
IbanValidatorAndParser: typeof import('./src/tools/iban-validator-and-parser/iban-validator-and-parser.vue')['default']
92+
IcalGenerator: typeof import('./src/tools/ical-generator/ical-generator.vue')['default']
93+
IcalMerger: typeof import('./src/tools/ical-merger/ical-merger.vue')['default']
94+
IcalParser: typeof import('./src/tools/ical-parser/ical-parser.vue')['default']
9295
'IconMdi:brushVariant': typeof import('~icons/mdi/brush-variant')['default']
9396
'IconMdi:kettleSteamOutline': typeof import('~icons/mdi/kettle-steam-outline')['default']
9497
IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default']
@@ -130,17 +133,28 @@ declare module '@vue/runtime-core' {
130133
MetaTagGenerator: typeof import('./src/tools/meta-tag-generator/meta-tag-generator.vue')['default']
131134
MimeTypes: typeof import('./src/tools/mime-types/mime-types.vue')['default']
132135
NavbarButtons: typeof import('./src/components/NavbarButtons.vue')['default']
136+
NButton: typeof import('naive-ui')['NButton']
133137
NCheckbox: typeof import('naive-ui')['NCheckbox']
138+
NCode: typeof import('naive-ui')['NCode']
134139
NCollapseTransition: typeof import('naive-ui')['NCollapseTransition']
135140
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
141+
NDatePicker: typeof import('naive-ui')['NDatePicker']
136142
NDivider: typeof import('naive-ui')['NDivider']
137143
NEllipsis: typeof import('naive-ui')['NEllipsis']
144+
NFormItem: typeof import('naive-ui')['NFormItem']
145+
NGi: typeof import('naive-ui')['NGi']
146+
NGrid: typeof import('naive-ui')['NGrid']
138147
NH1: typeof import('naive-ui')['NH1']
139148
NH3: typeof import('naive-ui')['NH3']
140149
NIcon: typeof import('naive-ui')['NIcon']
150+
NInput: typeof import('naive-ui')['NInput']
151+
NInputGroup: typeof import('naive-ui')['NInputGroup']
141152
NLayout: typeof import('naive-ui')['NLayout']
142153
NLayoutSider: typeof import('naive-ui')['NLayoutSider']
143154
NMenu: typeof import('naive-ui')['NMenu']
155+
NRadio: typeof import('naive-ui')['NRadio']
156+
NRadioGroup: typeof import('naive-ui')['NRadioGroup']
157+
NScrollbar: typeof import('naive-ui')['NScrollbar']
144158
NSpace: typeof import('naive-ui')['NSpace']
145159
NTable: typeof import('naive-ui')['NTable']
146160
NumeronymGenerator: typeof import('./src/tools/numeronym-generator/numeronym-generator.vue')['default']

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@
6868
"highlight.js": "^11.7.0",
6969
"iarna-toml-esm": "^3.0.5",
7070
"ibantools": "^4.3.3",
71+
"ical-generator": "^8.0.0",
72+
"ical.js": "^2.1.0",
7173
"js-base64": "^3.7.6",
7274
"json5": "^2.2.3",
7375
"jwt-decode": "^3.1.2",

pnpm-lock.yaml

Lines changed: 54 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/TextareaCopyable.vue

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,15 @@ import sqlHljs from 'highlight.js/lib/languages/sql';
77
import xmlHljs from 'highlight.js/lib/languages/xml';
88
import yamlHljs from 'highlight.js/lib/languages/yaml';
99
import iniHljs from 'highlight.js/lib/languages/ini';
10+
import bashHljs from 'highlight.js/lib/languages/bash';
1011
import markdownHljs from 'highlight.js/lib/languages/markdown';
12+
import jsHljs from 'highlight.js/lib/languages/javascript';
13+
import cssHljs from 'highlight.js/lib/languages/css';
14+
import goHljs from 'highlight.js/lib/languages/go';
15+
import csharpHljs from 'highlight.js/lib/languages/csharp';
16+
import { Base64 } from 'js-base64';
1117
import { useCopy } from '@/composable/copy';
18+
import { useDownloadFileFromBase64 } from '@/composable/downloadBase64';
1219
1320
const props = withDefaults(
1421
defineProps<{
@@ -17,12 +24,17 @@ const props = withDefaults(
1724
language?: string
1825
copyPlacement?: 'top-right' | 'bottom-right' | 'outside' | 'none'
1926
copyMessage?: string
27+
wordWrap?: boolean
28+
downloadFileName?: string
29+
downloadButtonText?: string
2030
}>(),
2131
{
2232
followHeightOf: null,
2333
language: 'txt',
2434
copyPlacement: 'top-right',
2535
copyMessage: 'Copy to clipboard',
36+
downloadFileName: '',
37+
downloadButtonText: 'Download',
2638
},
2739
);
2840
hljs.registerLanguage('sql', sqlHljs);
@@ -31,13 +43,25 @@ hljs.registerLanguage('html', xmlHljs);
3143
hljs.registerLanguage('xml', xmlHljs);
3244
hljs.registerLanguage('yaml', yamlHljs);
3345
hljs.registerLanguage('toml', iniHljs);
46+
hljs.registerLanguage('bash', bashHljs);
3447
hljs.registerLanguage('markdown', markdownHljs);
48+
hljs.registerLanguage('css', cssHljs);
49+
hljs.registerLanguage('javascript', jsHljs);
50+
hljs.registerLanguage('go', goHljs);
51+
hljs.registerLanguage('csharp', csharpHljs);
3552
36-
const { value, language, followHeightOf, copyPlacement, copyMessage } = toRefs(props);
53+
const { value, language, followHeightOf, copyPlacement, copyMessage, downloadFileName, downloadButtonText } = toRefs(props);
3754
const { height } = followHeightOf.value ? useElementSize(followHeightOf) : { height: ref(null) };
3855
3956
const { copy, isJustCopied } = useCopy({ source: value, createToast: false });
4057
const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : copyMessage.value);
58+
59+
const valueBase64 = computed(() => Base64.encode(value.value));
60+
const { download } = useDownloadFileFromBase64(
61+
{
62+
source: valueBase64,
63+
filename: downloadFileName,
64+
});
4165
</script>
4266

4367
<template>
@@ -49,11 +73,16 @@ const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : copyMessage.
4973
:style="height ? `min-height: ${height - 40 /* card padding */ + 10 /* negative margin compensation */}px` : ''"
5074
>
5175
<n-config-provider :hljs="hljs">
52-
<n-code :code="value" :language="language" :trim="false" data-test-id="area-content" />
76+
<n-code :code="value" :language="language" :word-wrap="wordWrap" :trim="false" data-test-id="area-content" />
5377
</n-config-provider>
5478
</n-scrollbar>
55-
<div absolute right-10px top-10px>
56-
<c-tooltip v-if="value" :tooltip="tooltipText" position="left">
79+
<div
80+
v-if="value && copyPlacement !== 'none'"
81+
absolute right-10px
82+
:top-10px="copyPlacement === 'top-right' ? '' : 'no'"
83+
:bottom-10px="copyPlacement === 'bottom-right' ? '' : 'no'"
84+
>
85+
<c-tooltip v-if="value && copyPlacement !== 'outside'" :tooltip="tooltipText" position="left">
5786
<c-button circle important:h-10 important:w-10 @click="copy()">
5887
<n-icon size="22" :component="Copy" />
5988
</c-button>
@@ -65,6 +94,11 @@ const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : copyMessage.
6594
{{ tooltipText }}
6695
</c-button>
6796
</div>
97+
<div v-if="downloadFileName !== '' && value !== ''" mt-5 flex justify-center>
98+
<c-button secondary @click="download">
99+
{{ downloadButtonText }}
100+
</c-button>
101+
</div>
68102
</div>
69103
</template>
70104

src/composable/downloadBase64.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { extension as getExtensionFromMimeType, extension as getMimeTypeFromExtension } from 'mime-types';
2-
import type { Ref } from 'vue';
2+
import type { MaybeRef, Ref } from 'vue';
33
import _ from 'lodash';
4+
import { get } from '@vueuse/core';
45

56
export {
67
getMimeTypeFromBase64,
@@ -75,21 +76,11 @@ function downloadFromBase64({ sourceValue, filename, extension, fileMimeType }:
7576
}
7677

7778
function useDownloadFileFromBase64(
78-
{ source, filename, extension, fileMimeType }:
79-
{ source: Ref<string>; filename?: string; extension?: string; fileMimeType?: string }) {
80-
return {
81-
download() {
82-
downloadFromBase64({ sourceValue: source.value, filename, extension, fileMimeType });
83-
},
84-
};
85-
}
86-
87-
function useDownloadFileFromBase64Refs(
8879
{ source, filename, extension }:
89-
{ source: Ref<string>; filename?: Ref<string>; extension?: Ref<string> }) {
80+
{ source: MaybeRef<string>; filename?: MaybeRef<string>; extension?: MaybeRef<string> }) {
9081
return {
9182
download() {
92-
downloadFromBase64({ sourceValue: source.value, filename: filename?.value, extension: extension?.value });
83+
downloadFromBase64({ sourceValue: get(source), filename: get(filename), extension: get(extension) });
9384
},
9485
};
9586
}
@@ -116,3 +107,13 @@ function previewImageFromBase64(base64String: string): HTMLImageElement {
116107

117108
return img;
118109
}
110+
111+
function useDownloadFileFromBase64Refs(
112+
{ source, filename, extension }:
113+
{ source: Ref<string>; filename?: Ref<string>; extension?: Ref<string> }) {
114+
return {
115+
download() {
116+
downloadFromBase64({ sourceValue: source.value, filename: filename?.value, extension: extension?.value });
117+
},
118+
};
119+
}

0 commit comments

Comments
 (0)