@tager/admin-blog 0.3.41 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants/paths.d.ts +6 -14
- package/dist/constants/routes.d.ts +5 -5
- package/dist/dev/App.vue.d.ts +5 -0
- package/dist/dev/config.d.ts +2 -0
- package/dist/dev/env.d.ts +1 -0
- package/dist/dev/main.d.ts +3 -0
- package/dist/hooks/index.d.ts +4 -4
- package/dist/hooks/useFetchCategories.d.ts +3 -6
- package/dist/hooks/useFetchCategory.d.ts +7 -8
- package/dist/hooks/useFetchModuleConfig.d.ts +3 -6
- package/dist/hooks/useFetchPosts.d.ts +3 -6
- package/dist/index.mjs +2363 -0
- package/dist/locales/apply.d.ts +1 -0
- package/dist/locales/en.d.ts +87 -80
- package/dist/locales/ru.d.ts +3 -3
- package/dist/main.d.ts +3 -4
- package/dist/services/requests.d.ts +59 -57
- package/dist/style.css +1 -0
- package/dist/typings/common.d.ts +1 -1
- package/dist/typings/model.d.ts +106 -104
- package/dist/utils/common.d.ts +2 -2
- package/dist/utils/paths.d.ts +8 -0
- package/dist/views/Categories/CategoryForm/CategoryForm.helpers.d.ts +7 -7
- package/dist/views/Categories/CategoryForm/CategoryForm.vue.d.ts +53 -116
- package/dist/views/Categories/CategoryForm/index.d.ts +1 -1
- package/dist/views/Categories/CategoryList/CategoryList.helpers.d.ts +7 -7
- package/dist/views/Categories/CategoryList/CategoryList.vue.d.ts +26 -57
- package/dist/views/Categories/CategoryList/hooks/index.d.ts +1 -1
- package/dist/views/Categories/CategoryList/hooks/useAdvancedSearch.d.ts +19 -16
- package/dist/views/Categories/CategoryList/index.d.ts +1 -1
- package/dist/views/Posts/PostForm/PostForm.helpers.d.ts +32 -30
- package/dist/views/Posts/PostForm/PostForm.vue.d.ts +2768 -9394
- package/dist/views/Posts/PostForm/components/TabList/TabList.types.d.ts +5 -5
- package/dist/views/Posts/PostForm/components/TabList/TabList.vue.d.ts +23 -0
- package/dist/views/Posts/PostForm/components/TabList/index.d.ts +2 -2
- package/dist/views/Posts/PostForm/index.d.ts +1 -1
- package/dist/views/Posts/PostList/PostList.helpers.d.ts +7 -7
- package/dist/views/Posts/PostList/PostList.vue.d.ts +38 -71
- package/dist/views/Posts/PostList/hooks/index.d.ts +1 -1
- package/dist/views/Posts/PostList/hooks/useAdvancedSearch.d.ts +27 -24
- package/dist/views/Posts/PostList/index.d.ts +1 -1
- package/package.json +51 -49
- package/src/constants/paths.ts +0 -22
- package/src/constants/routes.ts +9 -9
- package/src/dev/App.vue +56 -0
- package/src/dev/config.ts +23 -0
- package/src/dev/env.ts +17 -0
- package/src/dev/main.ts +49 -0
- package/src/hooks/useFetchCategories.ts +2 -7
- package/src/hooks/useFetchCategory.ts +3 -6
- package/src/hooks/useFetchModuleConfig.ts +2 -7
- package/src/hooks/useFetchPosts.ts +2 -5
- package/src/locales/apply.ts +9 -0
- package/src/locales/en.ts +10 -3
- package/src/locales/ru.ts +11 -2
- package/src/main.ts +3 -8
- package/src/services/requests.ts +2 -0
- package/src/typings/model.ts +2 -0
- package/src/utils/paths.ts +23 -0
- package/src/views/Categories/CategoryForm/CategoryForm.vue +81 -61
- package/src/views/Categories/CategoryList/CategoryList.helpers.ts +1 -1
- package/src/views/Categories/CategoryList/CategoryList.vue +86 -58
- package/src/views/Categories/CategoryList/hooks/useAdvancedSearch.ts +9 -12
- package/src/views/Posts/PostForm/PostForm.helpers.ts +15 -7
- package/src/views/Posts/PostForm/PostForm.vue +191 -112
- package/src/views/Posts/PostForm/components/TabList/TabList.vue +2 -2
- package/src/views/Posts/PostList/PostList.helpers.ts +9 -10
- package/src/views/Posts/PostList/PostList.vue +138 -105
- package/src/views/Posts/PostList/hooks/useAdvancedSearch.ts +22 -30
- package/CHANGELOG.md +0 -13
- package/dist/constants/menu.d.ts +0 -5
- package/dist/dev.d.ts +0 -1
- package/dist/index.esm.js +0 -5144
- package/dist/index.umd.js +0 -5171
- package/dist/router/index.d.ts +0 -4
- package/src/constants/menu.ts +0 -31
- package/src/dev.ts +0 -34
- package/src/router/index.ts +0 -40
- package/src/typings/sfc.d.ts +0 -12
- package/src/typings/shims-tsx.d.ts +0 -13
- package/src/typings/shims-vue.d.ts +0 -11
- package/src/typings/translate.d.ts +0 -10
- package/src/views/App.vue +0 -22
- package/src/views/Home.vue +0 -31
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
2
|
+
<Page
|
|
3
3
|
:title="pageTitle"
|
|
4
4
|
:header-buttons="[
|
|
5
5
|
{
|
|
6
|
-
text: $t('blog:newPost'),
|
|
6
|
+
text: $i18n.t('blog:newPost'),
|
|
7
7
|
href: getBlogPostFormUrl({ postId: 'create' }),
|
|
8
8
|
},
|
|
9
9
|
]"
|
|
10
10
|
>
|
|
11
|
-
<template
|
|
12
|
-
<
|
|
11
|
+
<template #content>
|
|
12
|
+
<DataTable
|
|
13
13
|
:column-defs="columnDefs"
|
|
14
14
|
:row-data="rowData"
|
|
15
15
|
:loading="isRowDataLoading"
|
|
@@ -24,113 +24,131 @@
|
|
|
24
24
|
data-table="blog-post"
|
|
25
25
|
@change="handleChange"
|
|
26
26
|
>
|
|
27
|
-
<template
|
|
28
|
-
<
|
|
27
|
+
<template #filters>
|
|
28
|
+
<AdvancedSearch :tags="tags" @click:tag="tagRemovalHandler">
|
|
29
29
|
<div class="filters">
|
|
30
|
-
<
|
|
31
|
-
v-model="categoryFilter"
|
|
30
|
+
<FormFieldMultiSelect
|
|
31
|
+
v-model:selected-options="categoryFilter"
|
|
32
32
|
:options="categoryOptionList"
|
|
33
33
|
name="categoryFilter"
|
|
34
34
|
:searchable="true"
|
|
35
|
-
:label="$t('blog:category')"
|
|
35
|
+
:label="$i18n.t('blog:category')"
|
|
36
36
|
class="filter"
|
|
37
37
|
/>
|
|
38
38
|
|
|
39
|
-
<
|
|
39
|
+
<FormFieldMultiSelect
|
|
40
40
|
v-if="isLangSpecific"
|
|
41
|
-
v-model="languageFilter"
|
|
41
|
+
v-model:selected-options="languageFilter"
|
|
42
42
|
:options="languageOptionList"
|
|
43
43
|
name="languageFilter"
|
|
44
44
|
:searchable="true"
|
|
45
|
-
:label="$t('blog:language')"
|
|
45
|
+
:label="$i18n.t('blog:language')"
|
|
46
46
|
class="filter"
|
|
47
47
|
/>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
<div class="date-label">
|
|
51
|
-
{{ $t('blog:dateOfPublication') }}
|
|
52
|
-
</div>
|
|
53
|
-
|
|
54
|
-
<div class="date-content">
|
|
55
|
-
<form-field
|
|
56
|
-
v-model="fromDateFilter"
|
|
57
|
-
:label="$t('blog:From')"
|
|
58
|
-
name="fromDateFilter"
|
|
59
|
-
type="date"
|
|
60
|
-
:max="toDateFilter"
|
|
61
|
-
/>
|
|
62
|
-
|
|
63
|
-
<form-field
|
|
64
|
-
v-model="toDateFilter"
|
|
65
|
-
:label="$t('blog:To')"
|
|
66
|
-
name="toDateFilter"
|
|
67
|
-
type="date"
|
|
68
|
-
:min="fromDateFilter"
|
|
69
|
-
/>
|
|
70
|
-
</div>
|
|
71
|
-
</div>
|
|
72
|
-
|
|
73
|
-
<form-field-multi-select
|
|
74
|
-
v-model="statusFilter"
|
|
48
|
+
<FormFieldMultiSelect
|
|
49
|
+
v-model:selected-options="statusFilter"
|
|
75
50
|
:options="statusOptionList"
|
|
76
51
|
name="statusFilter"
|
|
77
52
|
:searchable="true"
|
|
78
|
-
:label="$t('blog:status')"
|
|
53
|
+
:label="$i18n.t('blog:status')"
|
|
79
54
|
class="filter"
|
|
80
55
|
/>
|
|
81
56
|
</div>
|
|
82
|
-
|
|
57
|
+
|
|
58
|
+
<div class="filters">
|
|
59
|
+
<FormField
|
|
60
|
+
v-model:value="fromDateFilter"
|
|
61
|
+
:label="$i18n.t('blog:dateOfPublicationFrom')"
|
|
62
|
+
name="fromDateFilter"
|
|
63
|
+
type="date"
|
|
64
|
+
:max="toDateFilter"
|
|
65
|
+
/>
|
|
66
|
+
|
|
67
|
+
<FormField
|
|
68
|
+
v-model:value="toDateFilter"
|
|
69
|
+
:label="$i18n.t('blog:dateOfPublicationTo')"
|
|
70
|
+
name="toDateFilter"
|
|
71
|
+
type="date"
|
|
72
|
+
:min="fromDateFilter"
|
|
73
|
+
/>
|
|
74
|
+
</div>
|
|
75
|
+
</AdvancedSearch>
|
|
83
76
|
</template>
|
|
84
77
|
|
|
85
|
-
<template
|
|
86
|
-
<
|
|
78
|
+
<template #cell(status)="{ row }">
|
|
79
|
+
<div class="status">
|
|
80
|
+
<span>{{ getStatuses($i18n.t)[row.status] }}</span>
|
|
81
|
+
<span v-if="row.status === 'PUBLISHED' && row.archiveAt">
|
|
82
|
+
{{ $i18n.t('blog:archiveAtLabel') }}:
|
|
83
|
+
<i>{{ formatDateTime(new Date(row.archiveAt), true) }}</i>
|
|
84
|
+
</span>
|
|
85
|
+
<span v-if="row.status === 'DRAFT' && row.publishAt">
|
|
86
|
+
{{ $i18n.t('blog:publishAtLabel') }}:
|
|
87
|
+
<i>{{ formatDateTime(new Date(row.publishAt), true) }}</i>
|
|
88
|
+
</span>
|
|
89
|
+
</div>
|
|
90
|
+
</template>
|
|
91
|
+
|
|
92
|
+
<template #cell(actions)="{ row }">
|
|
93
|
+
<BaseButton
|
|
87
94
|
variant="icon"
|
|
88
|
-
:title="$t('blog:edit')"
|
|
95
|
+
:title="$i18n.t('blog:edit')"
|
|
89
96
|
:disabled="isBusy(row.id)"
|
|
90
97
|
:href="getBlogPostFormUrl({ postId: row.id })"
|
|
91
98
|
>
|
|
92
|
-
<
|
|
93
|
-
</
|
|
99
|
+
<EditIcon />
|
|
100
|
+
</BaseButton>
|
|
94
101
|
|
|
95
|
-
<
|
|
102
|
+
<BaseButton
|
|
96
103
|
variant="icon"
|
|
97
|
-
:title="$t('blog:clone')"
|
|
104
|
+
:title="$i18n.t('blog:clone')"
|
|
98
105
|
:disabled="isBusy(row.id)"
|
|
99
106
|
@click="handleResourceClone(row.id)"
|
|
100
107
|
>
|
|
101
|
-
<
|
|
102
|
-
</
|
|
108
|
+
<ContentCopyIcon />
|
|
109
|
+
</BaseButton>
|
|
103
110
|
|
|
104
|
-
<
|
|
111
|
+
<BaseButton
|
|
105
112
|
variant="icon"
|
|
106
|
-
:title="$t('blog:remove')"
|
|
113
|
+
:title="$i18n.t('blog:remove')"
|
|
107
114
|
:disabled="isBusy(row.id)"
|
|
108
115
|
@click="handleResourceDelete(row.id)"
|
|
109
116
|
>
|
|
110
|
-
<
|
|
111
|
-
</
|
|
117
|
+
<DeleteIcon />
|
|
118
|
+
</BaseButton>
|
|
112
119
|
</template>
|
|
113
|
-
</
|
|
120
|
+
</DataTable>
|
|
114
121
|
</template>
|
|
115
|
-
</
|
|
122
|
+
</Page>
|
|
116
123
|
</template>
|
|
117
124
|
|
|
118
125
|
<script lang="ts">
|
|
119
|
-
import { computed, defineComponent, watch } from '
|
|
126
|
+
import { computed, defineComponent, watch } from 'vue';
|
|
120
127
|
import isEqual from 'lodash.isequal';
|
|
121
128
|
import pick from 'lodash.pick';
|
|
129
|
+
import { useRoute, useRouter } from 'vue-router';
|
|
122
130
|
|
|
123
131
|
import {
|
|
124
132
|
ColumnDefinition,
|
|
125
133
|
OptionType,
|
|
126
134
|
useDataTable,
|
|
127
|
-
|
|
135
|
+
formatDateTime,
|
|
136
|
+
AdvancedSearch,
|
|
137
|
+
FormFieldMultiSelect,
|
|
138
|
+
FormField,
|
|
139
|
+
BaseButton,
|
|
140
|
+
EditIcon,
|
|
141
|
+
ContentCopyIcon,
|
|
142
|
+
DeleteIcon,
|
|
143
|
+
DataTable,
|
|
128
144
|
} from '@tager/admin-ui';
|
|
129
145
|
import {
|
|
130
146
|
Nullable,
|
|
147
|
+
useI18n,
|
|
131
148
|
useResourceClone,
|
|
132
149
|
useResourceDelete,
|
|
133
150
|
} from '@tager/admin-services';
|
|
151
|
+
import { Page } from '@tager/admin-layout';
|
|
134
152
|
|
|
135
153
|
import { useFetchModuleConfig, useFetchCategories } from '../../../hooks';
|
|
136
154
|
import {
|
|
@@ -138,7 +156,7 @@ import {
|
|
|
138
156
|
deleteBlogPost,
|
|
139
157
|
getPosts,
|
|
140
158
|
} from '../../../services/requests';
|
|
141
|
-
import { getBlogPostFormUrl } from '../../../
|
|
159
|
+
import { getBlogPostFormUrl } from '../../../utils/paths';
|
|
142
160
|
import {
|
|
143
161
|
Category,
|
|
144
162
|
Language,
|
|
@@ -147,28 +165,43 @@ import {
|
|
|
147
165
|
} from '../../../typings/model';
|
|
148
166
|
import { getStatusOptions } from '../PostForm/PostForm.helpers';
|
|
149
167
|
|
|
150
|
-
import {
|
|
168
|
+
import {
|
|
169
|
+
convertPostList,
|
|
170
|
+
getPostTableColumnDefs,
|
|
171
|
+
getStatuses,
|
|
172
|
+
} from './PostList.helpers';
|
|
151
173
|
import { useAdvancedSearch } from './hooks';
|
|
152
174
|
|
|
153
175
|
export default defineComponent({
|
|
154
|
-
name: '
|
|
155
|
-
|
|
156
|
-
|
|
176
|
+
name: 'PostList',
|
|
177
|
+
components: {
|
|
178
|
+
DeleteIcon,
|
|
179
|
+
ContentCopyIcon,
|
|
180
|
+
EditIcon,
|
|
181
|
+
BaseButton,
|
|
182
|
+
FormField,
|
|
183
|
+
FormFieldMultiSelect,
|
|
184
|
+
AdvancedSearch,
|
|
185
|
+
Page,
|
|
186
|
+
DataTable,
|
|
187
|
+
},
|
|
188
|
+
setup() {
|
|
189
|
+
const { t } = useI18n();
|
|
190
|
+
const route = useRoute();
|
|
191
|
+
const router = useRouter();
|
|
157
192
|
|
|
158
193
|
const categoryId = computed<string>(() => {
|
|
159
|
-
return Array.isArray(
|
|
160
|
-
?
|
|
161
|
-
:
|
|
194
|
+
return Array.isArray(route.query.category)
|
|
195
|
+
? (route.query.category[0] as string) ?? ''
|
|
196
|
+
: (route.query.category as string);
|
|
162
197
|
});
|
|
163
198
|
|
|
164
199
|
const statusOptionList = computed<OptionType[]>(() => getStatusOptions(t));
|
|
165
200
|
|
|
166
201
|
/** Fetch module config **/
|
|
167
202
|
|
|
168
|
-
const {
|
|
169
|
-
|
|
170
|
-
loading: isModuleConfigLoading,
|
|
171
|
-
} = useFetchModuleConfig({ context });
|
|
203
|
+
const { data: moduleConfig, loading: isModuleConfigLoading } =
|
|
204
|
+
useFetchModuleConfig();
|
|
172
205
|
|
|
173
206
|
const languageList = computed<Language[]>(
|
|
174
207
|
() => moduleConfig.value?.languages ?? []
|
|
@@ -176,10 +209,8 @@ export default defineComponent({
|
|
|
176
209
|
|
|
177
210
|
/** Fetch category list **/
|
|
178
211
|
|
|
179
|
-
const {
|
|
180
|
-
|
|
181
|
-
loading: isCategoryListLoading,
|
|
182
|
-
} = useFetchCategories({ context });
|
|
212
|
+
const { data: categoryList, loading: isCategoryListLoading } =
|
|
213
|
+
useFetchCategories();
|
|
183
214
|
|
|
184
215
|
const selectedCategory = computed<Nullable<Category>>(() =>
|
|
185
216
|
categoryId.value
|
|
@@ -191,12 +222,14 @@ export default defineComponent({
|
|
|
191
222
|
|
|
192
223
|
const pageTitle = computed<string>(() => {
|
|
193
224
|
return selectedCategory.value
|
|
194
|
-
? `${
|
|
195
|
-
|
|
196
|
-
}"`
|
|
197
|
-
: context.root.$t('blog:posts');
|
|
225
|
+
? `${t('blog:postsByCategory')} "${selectedCategory.value.name}"`
|
|
226
|
+
: t('blog:posts');
|
|
198
227
|
});
|
|
199
228
|
|
|
229
|
+
const isLangSpecific = computed<boolean>(
|
|
230
|
+
() => languageOptionList.value.length > 1
|
|
231
|
+
);
|
|
232
|
+
|
|
200
233
|
/** Advanced search **/
|
|
201
234
|
|
|
202
235
|
const {
|
|
@@ -211,16 +244,13 @@ export default defineComponent({
|
|
|
211
244
|
tagRemovalHandler,
|
|
212
245
|
statusFilter,
|
|
213
246
|
} = useAdvancedSearch({
|
|
214
|
-
|
|
247
|
+
t,
|
|
248
|
+
route,
|
|
215
249
|
categoryList,
|
|
216
250
|
languageList,
|
|
217
251
|
statusOptionList,
|
|
218
252
|
});
|
|
219
253
|
|
|
220
|
-
const isLangSpecific = computed<boolean>(
|
|
221
|
-
() => languageOptionList.value.length > 1
|
|
222
|
-
);
|
|
223
|
-
|
|
224
254
|
/** Fetch Post list **/
|
|
225
255
|
|
|
226
256
|
const {
|
|
@@ -242,7 +272,6 @@ export default defineComponent({
|
|
|
242
272
|
...filterParams.value,
|
|
243
273
|
}),
|
|
244
274
|
initialValue: [],
|
|
245
|
-
context,
|
|
246
275
|
resourceName: 'Blog post list',
|
|
247
276
|
pageSize: 100,
|
|
248
277
|
});
|
|
@@ -253,12 +282,12 @@ export default defineComponent({
|
|
|
253
282
|
}
|
|
254
283
|
|
|
255
284
|
const newQuery = {
|
|
256
|
-
...pick(
|
|
285
|
+
...pick(route.query, ['query', 'pageNumber']),
|
|
257
286
|
...filterParams.value,
|
|
258
287
|
};
|
|
259
288
|
|
|
260
|
-
if (!isEqual(
|
|
261
|
-
|
|
289
|
+
if (!isEqual(route.query, newQuery)) {
|
|
290
|
+
router.replace({ query: newQuery });
|
|
262
291
|
fetchPostList();
|
|
263
292
|
}
|
|
264
293
|
});
|
|
@@ -282,7 +311,6 @@ export default defineComponent({
|
|
|
282
311
|
deleteResource: deleteBlogPost,
|
|
283
312
|
resourceName: 'Post',
|
|
284
313
|
onSuccess: fetchPostList,
|
|
285
|
-
context,
|
|
286
314
|
});
|
|
287
315
|
|
|
288
316
|
const { isCloning, handleResourceClone } = useResourceClone({
|
|
@@ -291,7 +319,6 @@ export default defineComponent({
|
|
|
291
319
|
successMessage: t('blog:cloneSuccess'),
|
|
292
320
|
failureMessage: t('blog:cloneFailure'),
|
|
293
321
|
onSuccessRedirectTo: (data: PostFull) => `/blog/posts/${data.id}`,
|
|
294
|
-
context,
|
|
295
322
|
});
|
|
296
323
|
|
|
297
324
|
function isBusy(postId: number): boolean {
|
|
@@ -299,10 +326,12 @@ export default defineComponent({
|
|
|
299
326
|
}
|
|
300
327
|
|
|
301
328
|
const columnDefs = computed<ColumnDefinition<PostShort>[]>(() =>
|
|
302
|
-
getPostTableColumnDefs(moduleConfig.value,
|
|
329
|
+
getPostTableColumnDefs(moduleConfig.value, t)
|
|
303
330
|
);
|
|
304
331
|
|
|
305
332
|
return {
|
|
333
|
+
t,
|
|
334
|
+
formatDateTime,
|
|
306
335
|
columnDefs,
|
|
307
336
|
rowData: displayedPostList,
|
|
308
337
|
handleResourceDelete,
|
|
@@ -330,6 +359,7 @@ export default defineComponent({
|
|
|
330
359
|
statusOptionList,
|
|
331
360
|
tags,
|
|
332
361
|
tagRemovalHandler,
|
|
362
|
+
getStatuses,
|
|
333
363
|
|
|
334
364
|
// Clone
|
|
335
365
|
handleResourceClone,
|
|
@@ -341,27 +371,30 @@ export default defineComponent({
|
|
|
341
371
|
|
|
342
372
|
<style scoped lang="scss">
|
|
343
373
|
.filters {
|
|
344
|
-
|
|
345
|
-
|
|
374
|
+
margin-bottom: 1rem;
|
|
375
|
+
width: 100%;
|
|
376
|
+
display: grid;
|
|
377
|
+
gap: 1rem;
|
|
378
|
+
grid-template-columns: 1fr 1fr;
|
|
346
379
|
|
|
347
380
|
&:not(:first-child) {
|
|
348
|
-
margin-top:
|
|
381
|
+
margin-top: 1rem;
|
|
349
382
|
}
|
|
383
|
+
}
|
|
350
384
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
margin: 0;
|
|
385
|
+
.status {
|
|
386
|
+
span:first-child {
|
|
387
|
+
display: block;
|
|
355
388
|
}
|
|
356
|
-
}
|
|
357
389
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
390
|
+
span:nth-child(2) {
|
|
391
|
+
display: block;
|
|
392
|
+
margin-top: 5px;
|
|
393
|
+
font-size: 0.8rem;
|
|
361
394
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
395
|
+
i {
|
|
396
|
+
display: block;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
366
399
|
}
|
|
367
400
|
</style>
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
Ref,
|
|
5
|
-
ref,
|
|
6
|
-
SetupContext,
|
|
7
|
-
watch,
|
|
8
|
-
} from '@vue/composition-api';
|
|
1
|
+
import { computed, ComputedRef, Ref, ref, watch } from 'vue';
|
|
2
|
+
import { TFunction } from 'i18next';
|
|
3
|
+
import { RouteLocationNormalizedLoaded } from 'vue-router';
|
|
9
4
|
|
|
10
5
|
import {
|
|
11
6
|
FilterTagType,
|
|
@@ -20,10 +15,12 @@ import { Category, Language } from '../../../../typings/model';
|
|
|
20
15
|
import { getNameWithDepth } from '../../../../utils/common';
|
|
21
16
|
|
|
22
17
|
interface Params {
|
|
23
|
-
|
|
24
|
-
categoryList: ComputedRef<Category[]>;
|
|
18
|
+
categoryList: Ref<Category[]>;
|
|
25
19
|
languageList: ComputedRef<Language[]>;
|
|
26
20
|
statusOptionList: ComputedRef<OptionType[]>;
|
|
21
|
+
|
|
22
|
+
t: TFunction;
|
|
23
|
+
route: RouteLocationNormalizedLoaded;
|
|
27
24
|
}
|
|
28
25
|
|
|
29
26
|
interface State {
|
|
@@ -36,6 +33,7 @@ interface State {
|
|
|
36
33
|
statusFilter: Ref<OptionType[]>;
|
|
37
34
|
filterParams: ComputedRef<Record<string, string | string[]>>;
|
|
38
35
|
tags: ComputedRef<FilterTagType[]>;
|
|
36
|
+
|
|
39
37
|
tagRemovalHandler(event: FilterTagType): void;
|
|
40
38
|
}
|
|
41
39
|
|
|
@@ -50,7 +48,8 @@ enum FilterTypes {
|
|
|
50
48
|
export const dateFormat = (date: string) => date.split('-').reverse().join('.');
|
|
51
49
|
|
|
52
50
|
export function useAdvancedSearch({
|
|
53
|
-
|
|
51
|
+
t,
|
|
52
|
+
route,
|
|
54
53
|
categoryList,
|
|
55
54
|
languageList,
|
|
56
55
|
statusOptionList,
|
|
@@ -66,9 +65,10 @@ export function useAdvancedSearch({
|
|
|
66
65
|
|
|
67
66
|
const initialCategoryFilter = computed<OptionType[]>(() => {
|
|
68
67
|
const queryValue = getFilterParamAsStringArray(
|
|
69
|
-
|
|
68
|
+
route.query,
|
|
70
69
|
FilterTypes.CATEGORY
|
|
71
70
|
);
|
|
71
|
+
|
|
72
72
|
return categoryOptionList.value.filter(({ value }) =>
|
|
73
73
|
queryValue.some((selected) => selected === value)
|
|
74
74
|
);
|
|
@@ -88,7 +88,7 @@ export function useAdvancedSearch({
|
|
|
88
88
|
|
|
89
89
|
const initialLanguageFilter = computed<OptionType[]>(() => {
|
|
90
90
|
const queryValue = getFilterParamAsStringArray(
|
|
91
|
-
|
|
91
|
+
route.query,
|
|
92
92
|
FilterTypes.LANGUAGE
|
|
93
93
|
);
|
|
94
94
|
return languageOptionList.value.filter(({ value }) =>
|
|
@@ -105,11 +105,7 @@ export function useAdvancedSearch({
|
|
|
105
105
|
/** From date **/
|
|
106
106
|
|
|
107
107
|
const initialFromDateFilter = computed<string>(
|
|
108
|
-
() =>
|
|
109
|
-
getFilterParamAsString(
|
|
110
|
-
context.root.$route.query,
|
|
111
|
-
FilterTypes.FROM_DATE
|
|
112
|
-
) ?? ''
|
|
108
|
+
() => getFilterParamAsString(route.query, FilterTypes.FROM_DATE) ?? ''
|
|
113
109
|
);
|
|
114
110
|
|
|
115
111
|
const fromDateFilter = ref<string>(initialFromDateFilter.value);
|
|
@@ -121,9 +117,7 @@ export function useAdvancedSearch({
|
|
|
121
117
|
/** To date **/
|
|
122
118
|
|
|
123
119
|
const initialToDateFilter = computed<string>(
|
|
124
|
-
() =>
|
|
125
|
-
getFilterParamAsString(context.root.$route.query, FilterTypes.TO_DATE) ??
|
|
126
|
-
''
|
|
120
|
+
() => getFilterParamAsString(route.query, FilterTypes.TO_DATE) ?? ''
|
|
127
121
|
);
|
|
128
122
|
|
|
129
123
|
const toDateFilter = ref<string>(initialToDateFilter.value);
|
|
@@ -148,20 +142,18 @@ export function useAdvancedSearch({
|
|
|
148
142
|
}
|
|
149
143
|
|
|
150
144
|
if (fromDateFilter.value && !toDateFilter.value) {
|
|
151
|
-
label = `${
|
|
152
|
-
fromDateFilter.value
|
|
153
|
-
)}`;
|
|
145
|
+
label = `${t('blog:from')} ${dateFormat(fromDateFilter.value)}`;
|
|
154
146
|
}
|
|
155
147
|
|
|
156
148
|
if (!fromDateFilter.value && toDateFilter.value) {
|
|
157
|
-
label = `${
|
|
149
|
+
label = `${t('blog:to')} ${dateFormat(toDateFilter.value)}`;
|
|
158
150
|
}
|
|
159
151
|
|
|
160
152
|
return {
|
|
161
153
|
value: '',
|
|
162
154
|
label,
|
|
163
155
|
name: FilterTypes.FROM_DATE,
|
|
164
|
-
title:
|
|
156
|
+
title: t('blog:dateOfPublication'),
|
|
165
157
|
};
|
|
166
158
|
});
|
|
167
159
|
|
|
@@ -169,7 +161,7 @@ export function useAdvancedSearch({
|
|
|
169
161
|
|
|
170
162
|
const initialStatusFilter = computed<OptionType[]>(() => {
|
|
171
163
|
const queryValue = getFilterParamAsStringArray(
|
|
172
|
-
|
|
164
|
+
route.query,
|
|
173
165
|
FilterTypes.STATUS
|
|
174
166
|
);
|
|
175
167
|
return statusOptionList.value.filter(({ value }) =>
|
|
@@ -235,20 +227,20 @@ export function useAdvancedSearch({
|
|
|
235
227
|
value,
|
|
236
228
|
label,
|
|
237
229
|
name: FilterTypes.CATEGORY,
|
|
238
|
-
title:
|
|
230
|
+
title: t('blog:category'),
|
|
239
231
|
})),
|
|
240
232
|
...languageFilter.value.map(({ value, label }) => ({
|
|
241
233
|
value,
|
|
242
234
|
label,
|
|
243
235
|
name: FilterTypes.LANGUAGE,
|
|
244
|
-
title:
|
|
236
|
+
title: t('blog:language'),
|
|
245
237
|
})),
|
|
246
238
|
date.value,
|
|
247
239
|
...statusFilter.value.map(({ value, label }) => ({
|
|
248
240
|
value,
|
|
249
241
|
label,
|
|
250
242
|
name: FilterTypes.STATUS,
|
|
251
|
-
title:
|
|
243
|
+
title: t('blog:status'),
|
|
252
244
|
})),
|
|
253
245
|
].filter(isNotNullish)
|
|
254
246
|
);
|
package/CHANGELOG.md
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# [0.0.2] (2020-06-06)
|
|
2
|
-
|
|
3
|
-
### Features
|
|
4
|
-
|
|
5
|
-
* **services:** Use VUE_APP_API_ORIGIN env variable as initial api origin value in ApiService
|
|
6
|
-
|
|
7
|
-
# [0.0.3] (2020-06-06)
|
|
8
|
-
|
|
9
|
-
### Bug Fixes
|
|
10
|
-
|
|
11
|
-
* **services:** Use api origin from ApiService to configure url for file upload
|
|
12
|
-
|
|
13
|
-
|
package/dist/constants/menu.d.ts
DELETED
package/dist/dev.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import '@tager/admin-ui/dist/admin-ui.css';
|