Skip to content

Commit 5892c31

Browse files
committed
feat(dependencies): add packageBrowser option
1 parent ebf938f commit 5892c31

5 files changed

Lines changed: 33 additions & 5 deletions

File tree

src/components/input-select.vue

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,39 @@
22
<label class="input-select">
33
<div class="input-select__label">{{ label }}</div>
44
<select v-model="model" :name>
5-
<option value="">N/A</option>
5+
<option v-if="!mandatory" value="">N/A</option>
66
<option v-for="(item, index) in items" :key="index" :value="item[itemValue]">
77
{{ item[itemText] }}
88
</option>
99
</select>
1010
</label>
1111
</template>
1212
<script setup lang="ts">
13-
import type { SelectHTMLAttributes } from "vue";
13+
import { onBeforeMount, type SelectHTMLAttributes } from "vue";
1414
import { useVModel } from "@vueuse/core";
15+
import { isNullish } from "@/helpers/validate";
1516
1617
interface Props {
1718
modelValue: SelectHTMLAttributes["value"]
1819
name: SelectHTMLAttributes["name"]
1920
items: readonly Record<string, unknown>[]
21+
mandatory?: boolean
2022
itemValue?: string
2123
itemText?: string
2224
label?: string | null
2325
}
24-
const props = withDefaults(defineProps<Props>(), { label: null, itemValue: "value", itemText: "name" });
26+
const props = withDefaults(defineProps<Props>(), {
27+
mandatory: false,
28+
itemValue: "value",
29+
itemText: "name",
30+
label: null
31+
});
2532
const emit = defineEmits<{ "update:modelValue": [value: Props["modelValue"]] }>();
2633
const model = useVModel(props, "modelValue", emit, { defaultValue: "" });
34+
35+
onBeforeMount(() => {
36+
if (props.mandatory && isNullish(model.value)) model.value = props.items[0][props.itemValue];
37+
});
2738
</script>
2839
<style lang="scss">
2940
.input-select {

src/components/modals/settings-modal.vue

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
Display badges
2525
</label>
2626
</fieldset>
27+
<fieldset>
28+
<legend>NPM</legend>
29+
<input-select v-model="form.packageBrowser" :items="PACKAGE_BROWSERS" name="packageBrowser" mandatory />
30+
</fieldset>
2731
<fieldset>
2832
<legend>GitHub API</legend>
2933
<ol v-if="!form.authToken">
@@ -71,6 +75,7 @@ import { deepCopy } from "@/helpers/object";
7175
import { fetchCurrentUser, setAuthToken } from "@/service/octokit";
7276
import { useSettingsStore } from "@/store/settings";
7377
import ImportExport from "@/components/import-export.vue";
78+
import InputSelect from "@/components/input-select.vue";
7479
7580
const dialogRef = useTemplateRef("dialogElement");
7681
const { open, close } = useDialog(dialogRef);
@@ -90,6 +95,11 @@ watch(() => settings.value.theme, (theme) => {
9095
document.documentElement.setAttribute("data-theme", theme);
9196
}, { immediate: true });
9297
98+
const PACKAGE_BROWSERS = [
99+
{ value: "npmjs.org", name: "npmjs.org" },
100+
{ value: "npmx.dev", name: "npmx.dev" }
101+
] as const;
102+
93103
async function setUsername(): Promise<void> {
94104
const user = await fetchCurrentUser();
95105
if (user) form.username = user.login;

src/helpers/validate.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,7 @@ export function isValidJSON(payload: string): boolean {
1212
export function isRequestError(payload: unknown): payload is RequestError {
1313
return !!payload && typeof payload === "object" && "status" in payload;
1414
}
15+
16+
export function isNullish(value: unknown): value is null | undefined {
17+
return value === null || value === undefined;
18+
}

src/pages/dependencies.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@
3838
<icon-x />
3939
</button>
4040
<a
41-
:href="`https://npmjs.org/${dep}`"
41+
:href="`https://${settings.packageBrowser}/${dep}`"
4242
target="_blank"
4343
rel="noopener noreferrer"
44-
:title="`Go to ${dep} on npm`"
44+
:title="`Go to ${dep} on ${settings.packageBrowser}`"
4545
class="text-truncate"
4646
>
4747
{{ dep }}

src/store/settings.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { createGlobalState, useLocalStorage } from "@vueuse/core";
22
import { useRegisterSW } from "virtual:pwa-register/vue";
33

4+
export type PackageBrowser = "npmjs.org" | "npmx.dev";
45
type Theme = "github" | "aqua" | "cream" | "mint" | "rose" | "departure";
56
export interface SettingsStore {
67
authToken: string
78
username: string
89
displayOwner: boolean
910
displayBadges: boolean
11+
packageBrowser: PackageBrowser
1012
theme: Theme
1113
}
1214

@@ -15,6 +17,7 @@ const DEFAULT_STORE: SettingsStore = {
1517
username: "",
1618
displayOwner: true,
1719
displayBadges: true,
20+
packageBrowser: "npmjs.org",
1821
theme: "github"
1922
};
2023

0 commit comments

Comments
 (0)