diff --git a/package.json b/package.json index c5de318..013d8f1 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "devDependencies": { "@antfu/eslint-config": "^3.13.0", "@iconify-json/carbon": "^1.2.5", + "@iconify/json": "^2.2.304", "@intlify/unplugin-vue-i18n": "^6.0.3", "@shikijs/markdown-it": "^1.26.1", "@types/markdown-it-link-attributes": "^3.0.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d325e51..663d6fa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,6 +89,9 @@ importers: '@iconify-json/carbon': specifier: ^1.2.5 version: 1.2.5 + '@iconify/json': + specifier: ^2.2.304 + version: 2.2.304 '@intlify/unplugin-vue-i18n': specifier: ^6.0.3 version: 6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.18.0(jiti@2.4.0))(rollup@4.30.1)(typescript@5.7.3)(vue-i18n@11.0.1(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) @@ -1413,6 +1416,9 @@ packages: '@iconify-json/carbon@1.2.5': resolution: {integrity: sha512-aI3TEzOrUDGhs74zIT3ym/ZQBUEziyu8JifntX2Hb4siVzsP5sQ/QEfVdmcCUj37kQUYT3TYBSeAw2vTfCJx9w==} + '@iconify/json@2.2.304': + resolution: {integrity: sha512-8eO5m27lIfYLRFCxNgZQD/AMcDYw9NzPT6ViSYJDvX+Vevuj/smaQ/SfHVTNFzj5JcISDh5AV6n2nllQthceog==} + '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -7606,6 +7612,11 @@ snapshots: dependencies: '@iconify/types': 2.0.0 + '@iconify/json@2.2.304': + dependencies: + '@iconify/types': 2.0.0 + pathe: 1.1.2 + '@iconify/types@2.0.0': {} '@iconify/utils@2.2.1': diff --git a/src/components.d.ts b/src/components.d.ts index 1c2f1d9..072ffbc 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -34,11 +34,14 @@ declare module 'vue' { DrawerHeader: typeof import('./components/ui/drawer/DrawerHeader.vue')['default'] DrawerOverlay: typeof import('./components/ui/drawer/DrawerOverlay.vue')['default'] DrawerTitle: typeof import('./components/ui/drawer/DrawerTitle.vue')['default'] + InfoPan: typeof import('./components/InfoPan.vue')['default'] Input: typeof import('./components/ui/input/Input.vue')['default'] Label: typeof import('./components/ui/label/Label.vue')['default'] + OptForm: typeof import('./components/OptForm.vue')['default'] Popover: typeof import('./components/ui/popover/Popover.vue')['default'] PopoverContent: typeof import('./components/ui/popover/PopoverContent.vue')['default'] PopoverTrigger: typeof import('./components/ui/popover/PopoverTrigger.vue')['default'] + PosForm: typeof import('./components/PosForm.vue')['default'] README: typeof import('./components/README.md')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] @@ -53,6 +56,15 @@ declare module 'vue' { SelectSeparator: typeof import('./components/ui/select/SelectSeparator.vue')['default'] SelectTrigger: typeof import('./components/ui/select/SelectTrigger.vue')['default'] SelectValue: typeof import('./components/ui/select/SelectValue.vue')['default'] + Table: typeof import('./components/ui/table/Table.vue')['default'] + TableBody: typeof import('./components/ui/table/TableBody.vue')['default'] + TableCaption: typeof import('./components/ui/table/TableCaption.vue')['default'] + TableCell: typeof import('./components/ui/table/TableCell.vue')['default'] + TableEmpty: typeof import('./components/ui/table/TableEmpty.vue')['default'] + TableFooter: typeof import('./components/ui/table/TableFooter.vue')['default'] + TableHead: typeof import('./components/ui/table/TableHead.vue')['default'] + TableHeader: typeof import('./components/ui/table/TableHeader.vue')['default'] + TableRow: typeof import('./components/ui/table/TableRow.vue')['default'] Textarea: typeof import('./components/ui/textarea/Textarea.vue')['default'] TheCounter: typeof import('./components/TheCounter.vue')['default'] TheFooter: typeof import('./components/TheFooter.vue')['default'] diff --git a/src/components/InfoPan.vue b/src/components/InfoPan.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/components/OptForm.vue b/src/components/OptForm.vue new file mode 100644 index 0000000..bddee89 --- /dev/null +++ b/src/components/OptForm.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/src/components/PosForm.vue b/src/components/PosForm.vue new file mode 100644 index 0000000..49a7a32 --- /dev/null +++ b/src/components/PosForm.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/components/ui/table/Table.vue b/src/components/ui/table/Table.vue new file mode 100644 index 0000000..a423891 --- /dev/null +++ b/src/components/ui/table/Table.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/ui/table/TableBody.vue b/src/components/ui/table/TableBody.vue new file mode 100644 index 0000000..ab7a937 --- /dev/null +++ b/src/components/ui/table/TableBody.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/table/TableCaption.vue b/src/components/ui/table/TableCaption.vue new file mode 100644 index 0000000..3904c56 --- /dev/null +++ b/src/components/ui/table/TableCaption.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/table/TableCell.vue b/src/components/ui/table/TableCell.vue new file mode 100644 index 0000000..4a4da40 --- /dev/null +++ b/src/components/ui/table/TableCell.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/components/ui/table/TableEmpty.vue b/src/components/ui/table/TableEmpty.vue new file mode 100644 index 0000000..3f6e0ff --- /dev/null +++ b/src/components/ui/table/TableEmpty.vue @@ -0,0 +1,37 @@ + + + diff --git a/src/components/ui/table/TableFooter.vue b/src/components/ui/table/TableFooter.vue new file mode 100644 index 0000000..693a438 --- /dev/null +++ b/src/components/ui/table/TableFooter.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/table/TableHead.vue b/src/components/ui/table/TableHead.vue new file mode 100644 index 0000000..e882b60 --- /dev/null +++ b/src/components/ui/table/TableHead.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/table/TableHeader.vue b/src/components/ui/table/TableHeader.vue new file mode 100644 index 0000000..220352f --- /dev/null +++ b/src/components/ui/table/TableHeader.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/table/TableRow.vue b/src/components/ui/table/TableRow.vue new file mode 100644 index 0000000..5b9e874 --- /dev/null +++ b/src/components/ui/table/TableRow.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/table/index.ts b/src/components/ui/table/index.ts new file mode 100644 index 0000000..2b4ce39 --- /dev/null +++ b/src/components/ui/table/index.ts @@ -0,0 +1,9 @@ +export { default as Table } from './Table.vue' +export { default as TableBody } from './TableBody.vue' +export { default as TableCaption } from './TableCaption.vue' +export { default as TableCell } from './TableCell.vue' +export { default as TableEmpty } from './TableEmpty.vue' +export { default as TableFooter } from './TableFooter.vue' +export { default as TableHead } from './TableHead.vue' +export { default as TableHeader } from './TableHeader.vue' +export { default as TableRow } from './TableRow.vue' diff --git a/src/composables/dateOpt.ts b/src/composables/dateOpt.ts index 36fcd67..4ecfeb3 100644 --- a/src/composables/dateOpt.ts +++ b/src/composables/dateOpt.ts @@ -7,7 +7,25 @@ function _useOptions() { renderMode: 'heatmap' as 'heatmap' | 'image', isPlaying: false, mapping: {} as Record, + }) + const castBeginDate = ref() + const castTargetDate = ref() + + const currentTcLoc = ref(null) + type PosGetter = () => [number, number] + const currentFocus = ref(null) + + function getISOcastBeginDate() { + const castBeginDateStr = options.castBeginDate.toString() + if (castBeginDateStr.length !== 8) { + console.error(castBeginDateStr) + throw new Error('castBeginDate is invalid') + } + const newDateStr = `${castBeginDateStr.slice(0, 4)}-${castBeginDateStr.slice(4, 6)}-${castBeginDateStr.slice(6, 8)}` + const castBeginDate = parseDate(newDateStr) + return castBeginDate + } function setCastBeginDate(date: DateValue) { const datestr = date.toString() @@ -27,10 +45,40 @@ function _useOptions() { return dayNo } + async function refreshCurrentTcLoc() { + currentTcLoc.value = null + const q = new URLSearchParams() + q.set('day', options.castDayNo.toString()) + const path = options.mapping[options.castBeginDate] + q.set('path', path) + const base = import.meta.env.VITE_BACKEND_URL + + const url = `${base}/tc/metadata/centroids?${q}` + + const resp = await baseFetch(url).json() + + const data = resp.data.value! + currentTcLoc.value = data as [number, number][] + } + + watch([castBeginDate, castTargetDate], () => { + if (!castBeginDate.value || !castTargetDate.value) { + return + } + setCastBeginDate(castBeginDate.value) + setTargetDate(castTargetDate.value) + refreshCurrentTcLoc() + }) + return { options, setCastBeginDate, setTargetDate, + getISOcastBeginDate, + currentFocus, + castBeginDate, + castTargetDate, + currentTcLoc, } } diff --git a/src/layouts/map.vue b/src/layouts/map.vue index abc9654..7f32673 100644 --- a/src/layouts/map.vue +++ b/src/layouts/map.vue @@ -1,219 +1,24 @@