diff --git a/src/api/zeroPrices.js b/src/api/zeroPrices.js new file mode 100644 index 0000000..a7db41a --- /dev/null +++ b/src/api/zeroPrices.js @@ -0,0 +1,40 @@ +import { apiClient } from '@/services/apiClient.js' + +export const useZeroPrices = () => { + const getZeroPrices = async () => { + try { + return await apiClient.get('/merch/zeroprices') + } catch (error) { + console.log('Get zero prices error: ', error) + throw error + } + } + + const deleteZeroPrices = async (list) => { + try { + await apiClient.delete('/merch/zeroprices', list) + } + catch (error) { + console.log('Delete target zero prices error: ', error) + throw error + } + } + + const deleteZeroPricesPeriod = async (start, end) => { + const params = new URLSearchParams({ start, end }).toString() + const url = `/merch/zeroprices/period${params ? `?${params}` : ''}` + const response = await apiClient.delete(url) + + if (response.status === 200) { + return response + } else { + console.log('Delete period select zero prices error: ', response) + } + } + + return { + getZeroPrices, + deleteZeroPrices, + deleteZeroPricesPeriod, + } +} diff --git a/src/components/ChartBlock.vue b/src/components/ChartBlock.vue index 96a5243..11bd874 100644 --- a/src/components/ChartBlock.vue +++ b/src/components/ChartBlock.vue @@ -13,6 +13,7 @@ import { } from 'chart.js' import { Line } from 'vue-chartjs' import 'chartjs-adapter-date-fns' +import { originColors } from '@/services/colors.js' ChartJS.register( Title, @@ -33,11 +34,6 @@ const props = defineProps({ }, }) -const originColors = { - surugaya: '#2d3081', - mandarake: '#924646', -} - const chartData = ref({ datasets: [], }) diff --git a/src/components/Navbar/NavBar.vue b/src/components/Navbar/NavBar.vue index c2fcb65..a05c67c 100644 --- a/src/components/Navbar/NavBar.vue +++ b/src/components/Navbar/NavBar.vue @@ -17,6 +17,7 @@ const mainMenu = computed(() => { { label: 'Collection', key: 'collection' }, { label: 'Charts', key: 'charts' }, { label: 'Parsers', key: 'parsers' }, + { label: 'Zero prices', key: 'zeroprices' }, ] }) diff --git a/src/router/index.js b/src/router/index.js index 1a83844..0a0ff85 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -8,6 +8,7 @@ import PersonalView from '@/views/PersonalView.vue' import AddMerchView from '@/views/AddMerchView.vue' import DetailsView from '@/views/DetailsView.vue' import LabelsView from '@/views/LabelsView.vue' +import ZeroPricesView from '@/views/ZeroPricesView.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -58,6 +59,11 @@ const router = createRouter({ name: 'labels', component: LabelsView, }, + { + path: '/zeroprices', + name: 'zeroprices', + component: ZeroPricesView, + }, ], }) diff --git a/src/services/apiClient.js b/src/services/apiClient.js index 7bc1f10..639fb84 100644 --- a/src/services/apiClient.js +++ b/src/services/apiClient.js @@ -7,8 +7,10 @@ let refreshPromise = null function createConfig(options = {}) { const token = localStorage.getItem('accessToken'); + const isFormData = options.body instanceof FormData; + const headers = { - 'Content-Type': 'application/json', + ...(isFormData ? {} : { 'Content-Type': 'application/json' }), ...options.headers, }; @@ -138,12 +140,14 @@ export const apiClient = { return request(url, { method: 'POST', body: isFormData ? data : JSON.stringify(data), - // headers: isFormData ? {} : { 'Content-Type': 'application/json' } }) }, put: (url, data) => request(url, { method: 'PUT', body: JSON.stringify(data), }), - delete: (url) => request(url, { method: 'DELETE' }), + delete: (url, data) => request(url, { + method: 'DELETE', + body: data ? JSON.stringify(data) : undefined, + }), } diff --git a/src/services/colors.js b/src/services/colors.js new file mode 100644 index 0000000..c337f2a --- /dev/null +++ b/src/services/colors.js @@ -0,0 +1,4 @@ +export const originColors = { + surugaya: '#2d3081', + mandarake: '#924646', +}; diff --git a/src/styles/styles.css b/src/styles/styles.css index 67d9708..815f71a 100644 --- a/src/styles/styles.css +++ b/src/styles/styles.css @@ -197,3 +197,8 @@ body, justify-content: center; margin-bottom: 20px; } + +.padding-lr-30 { + padding-left: 30px; + padding-right: 30px; +} diff --git a/src/views/CollectionView/CollectionToolbar.vue b/src/views/CollectionView/CollectionToolbar.vue index 67e7e84..ebe8bc0 100644 --- a/src/views/CollectionView/CollectionToolbar.vue +++ b/src/views/CollectionView/CollectionToolbar.vue @@ -1,5 +1,5 @@ + + + + diff --git a/src/views/ZeroPricesView/PeriodSelectTab.vue b/src/views/ZeroPricesView/PeriodSelectTab.vue new file mode 100644 index 0000000..4239f15 --- /dev/null +++ b/src/views/ZeroPricesView/PeriodSelectTab.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/views/ZeroPricesView/TargetZeroesTab.vue b/src/views/ZeroPricesView/TargetZeroesTab.vue new file mode 100644 index 0000000..ba71ba5 --- /dev/null +++ b/src/views/ZeroPricesView/TargetZeroesTab.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/views/ZeroPricesView/ZeroPriceCard.vue b/src/views/ZeroPricesView/ZeroPriceCard.vue new file mode 100644 index 0000000..32bd31f --- /dev/null +++ b/src/views/ZeroPricesView/ZeroPriceCard.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/views/ZeroPricesView/ZeroPricesToolbar.vue b/src/views/ZeroPricesView/ZeroPricesToolbar.vue new file mode 100644 index 0000000..abe01cb --- /dev/null +++ b/src/views/ZeroPricesView/ZeroPricesToolbar.vue @@ -0,0 +1,56 @@ + + + + +