@tager/admin-banners 0.3.6 → 1.0.1

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.
Files changed (74) hide show
  1. package/dist/constants/paths.d.ts +5 -10
  2. package/dist/constants/routes.d.ts +4 -4
  3. package/dist/dev/App.vue.d.ts +5 -0
  4. package/dist/dev/config.d.ts +2 -0
  5. package/dist/dev/env.d.ts +1 -0
  6. package/dist/dev/main.d.ts +3 -0
  7. package/dist/hooks/index.d.ts +2 -2
  8. package/dist/hooks/useFetchBanner.d.ts +7 -8
  9. package/dist/hooks/useFetchBanners.d.ts +3 -6
  10. package/dist/hooks/useFetchZoneFields.d.ts +7 -0
  11. package/dist/hooks/useFetchZones.d.ts +3 -6
  12. package/dist/index.mjs +1008 -0
  13. package/dist/locales/apply.d.ts +1 -0
  14. package/dist/locales/en.d.ts +41 -41
  15. package/dist/locales/ru.d.ts +2 -3
  16. package/dist/main.d.ts +3 -4
  17. package/dist/services/requests.d.ts +25 -24
  18. package/dist/style.css +1 -0
  19. package/dist/typings/banners.d.ts +47 -43
  20. package/dist/typings/common.d.ts +1 -1
  21. package/dist/typings/model.d.ts +104 -104
  22. package/dist/typings/zones.d.ts +9 -5
  23. package/dist/utils/common.d.ts +2 -2
  24. package/dist/utils/paths.d.ts +5 -0
  25. package/dist/views/Banners/BannerForm/BannerForm.helpers.d.ts +5 -5
  26. package/dist/views/Banners/BannerForm/BannerForm.vue.d.ts +2694 -83
  27. package/dist/views/Banners/BannerForm/index.d.ts +1 -1
  28. package/dist/views/Banners/BannerList/BannerList.helpers.d.ts +6 -6
  29. package/dist/views/Banners/BannerList/BannerList.vue.d.ts +25 -55
  30. package/dist/views/Banners/BannerList/hooks/index.d.ts +1 -1
  31. package/dist/views/Banners/BannerList/hooks/useAdvancedSearch.d.ts +22 -21
  32. package/dist/views/Banners/BannerList/index.d.ts +1 -1
  33. package/dist/views/Zones/ZoneList/ZoneList.helpers.d.ts +5 -5
  34. package/dist/views/Zones/ZoneList/ZoneList.vue.d.ts +11 -28
  35. package/dist/views/Zones/ZoneList/index.d.ts +1 -1
  36. package/package.json +51 -49
  37. package/src/constants/paths.ts +1 -15
  38. package/src/constants/routes.ts +7 -7
  39. package/src/dev/App.vue +46 -0
  40. package/src/dev/config.ts +23 -0
  41. package/src/dev/env.ts +17 -0
  42. package/src/dev/main.ts +47 -0
  43. package/src/hooks/useFetchBanner.ts +3 -6
  44. package/src/hooks/useFetchBanners.ts +2 -5
  45. package/src/hooks/useFetchZoneFields.ts +39 -0
  46. package/src/hooks/useFetchZones.ts +2 -5
  47. package/src/locales/apply.ts +9 -0
  48. package/src/locales/en.ts +1 -1
  49. package/src/locales/ru.ts +40 -42
  50. package/src/main.ts +3 -8
  51. package/src/services/requests.ts +7 -1
  52. package/src/typings/banners.ts +10 -1
  53. package/src/typings/zones.ts +6 -0
  54. package/src/utils/paths.ts +15 -0
  55. package/src/views/Banners/BannerForm/BannerForm.helpers.ts +7 -1
  56. package/src/views/Banners/BannerForm/BannerForm.vue +183 -137
  57. package/src/views/Banners/BannerList/BannerList.vue +64 -61
  58. package/src/views/Banners/BannerList/hooks/useAdvancedSearch.ts +36 -16
  59. package/src/views/Zones/ZoneList/ZoneList.helpers.ts +1 -1
  60. package/src/views/Zones/ZoneList/ZoneList.vue +18 -19
  61. package/CHANGELOG.md +0 -13
  62. package/dist/constants/menu.d.ts +0 -5
  63. package/dist/dev.d.ts +0 -1
  64. package/dist/index.esm.js +0 -3660
  65. package/dist/index.umd.js +0 -3679
  66. package/dist/router/index.d.ts +0 -4
  67. package/src/constants/menu.ts +0 -26
  68. package/src/dev.ts +0 -34
  69. package/src/router/index.ts +0 -38
  70. package/src/typings/sfc.d.ts +0 -12
  71. package/src/typings/shims-tsx.d.ts +0 -13
  72. package/src/typings/shims-vue.d.ts +0 -11
  73. package/src/views/App.vue +0 -22
  74. package/src/views/Home.vue +0 -37
package/dist/index.mjs ADDED
@@ -0,0 +1,1008 @@
1
+ import { i18n, request, useI18n, useResource, isNotNullish, useResourceDelete, createId, useToast, navigateBack, convertRequestErrorToMap } from "@tager/admin-services";
2
+ import { defineComponent, onMounted, computed, resolveComponent, openBlock, createBlock, withCtx, createVNode, createTextVNode, toDisplayString, ref, watch, createElementVNode, withModifiers, createElementBlock, Fragment, renderList } from "vue";
3
+ import { CountButton, DataTable, useDataTable, getFilterParamAsStringArray, getFilterParamAsString, getFilterParams, DeleteIcon, EditIcon, BaseButton, FormField, FormFieldMultiSelect, AdvancedSearch, FormFieldFileInput, FormFieldCheckbox, InputLabel, FormFieldSelect, FormFooter } from "@tager/admin-ui";
4
+ import { Page } from "@tager/admin-layout";
5
+ import { universalFieldUtils, DynamicField } from "@tager/admin-dynamic-field";
6
+ import "i18next";
7
+ import { compile } from "path-to-regexp";
8
+ import isEqual from "lodash.isequal";
9
+ import pick from "lodash.pick";
10
+ import { useRoute, useRouter } from "vue-router";
11
+ const EN = {
12
+ home: "Home",
13
+ zone: "Banner zone",
14
+ zones: "Banner zones",
15
+ banners: "Banners",
16
+ bannerForm: "Banner Form",
17
+ createBanner: "Create Banner",
18
+ updateBanner: "Update Banner",
19
+ link: "Link",
20
+ image: "Image",
21
+ openNewTab: "Open new tab",
22
+ period: "Period",
23
+ from: "From",
24
+ to: "To",
25
+ disabled: "Disabled",
26
+ comment: "Comment",
27
+ status: "Status",
28
+ bannerZoneIsDeleted: "Banner zone is deleted",
29
+ newTab: "New Tab",
30
+ yes: "Yes",
31
+ no: "No",
32
+ edit: "Edit",
33
+ remove: "Remove",
34
+ actions: "actions",
35
+ date: "Date",
36
+ name: "Name",
37
+ priority: "Priority",
38
+ success: "Success",
39
+ error: "Error",
40
+ statuses: {
41
+ waiting: "Waiting",
42
+ archived: "Archived",
43
+ active: "Active",
44
+ disabled: "Disabled"
45
+ },
46
+ bannerWasSuccessfullyCreated: "Banner was successfully created",
47
+ bannerWasSuccessfullyUpdated: "Banner was successfully updated",
48
+ bannerCreationWasFailed: "Banner creation was failed",
49
+ bannerUpdateWasFailed: "Banner update was failed"
50
+ };
51
+ const RU = {
52
+ home: "\u0413\u043B\u0430\u0432\u043D\u0430\u044F",
53
+ zone: "\u0411\u0430\u043D\u043D\u0435\u0440\u043D\u0430\u044F \u0437\u043E\u043D\u0430",
54
+ zones: "\u0411\u0430\u043D\u043D\u0435\u0440\u043D\u044B\u0435 \u0437\u043E\u043D\u044B",
55
+ banners: "\u0411\u0430\u043D\u043D\u0435\u0440\u044B",
56
+ bannerForm: "\u0424\u043E\u0440\u043C\u0430 \u0431\u0430\u043D\u043D\u0435\u0440\u0430",
57
+ createBanner: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0431\u0430\u043D\u043D\u0435\u0440",
58
+ updateBanner: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0431\u0430\u043D\u043D\u0435\u0440",
59
+ link: "\u0421\u0441\u044B\u043B\u043A\u0430",
60
+ image: "\u041A\u0430\u0440\u0442\u0438\u043D\u043A\u0430",
61
+ openNewTab: "\u041E\u0442\u043A\u0440\u044B\u0432\u0430\u0442\u044C \u0432 \u043D\u043E\u0432\u043E\u0439 \u0432\u043A\u043B\u0430\u0434\u043A\u0435",
62
+ period: "\u0421\u0440\u043E\u043A \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F",
63
+ from: "\u041E\u0442",
64
+ to: "\u0414\u043E",
65
+ disabled: "\u0412\u044B\u043A\u043B\u044E\u0447\u0435\u043D",
66
+ comment: "\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439",
67
+ status: "\u0421\u0442\u0430\u0442\u0443\u0441",
68
+ bannerZoneIsDeleted: "\u0411\u0430\u043D\u043D\u0435\u0440\u043D\u0430\u044F \u0437\u043E\u043D\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0430",
69
+ newTab: "\u041D\u043E\u0432\u0430\u044F \u0432\u043A\u043B\u0430\u0434\u043A\u0430",
70
+ yes: "\u0414\u0430",
71
+ no: "\u041D\u0435\u0442",
72
+ edit: "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C",
73
+ remove: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C",
74
+ actions: "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044F",
75
+ date: "\u0414\u0430\u0442\u0430",
76
+ name: "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435",
77
+ priority: "\u041F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442",
78
+ success: "\u0423\u0441\u043F\u0435\u0445",
79
+ error: "\u041E\u0448\u0438\u0431\u043A\u0430",
80
+ statuses: {
81
+ waiting: "\u0412 \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u0438",
82
+ archived: "\u0410\u0440\u0445\u0438\u0432\u043D\u044B\u0439",
83
+ active: "\u0410\u043A\u0442\u0438\u0432\u043D\u044B\u0439",
84
+ disabled: "\u041E\u0442\u043A\u043B\u044E\u0447\u0435\u043D"
85
+ },
86
+ bannerWasSuccessfullyCreated: "\u0411\u0430\u043D\u043D\u0435\u0440 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u043E\u0437\u0434\u0430\u043D",
87
+ bannerWasSuccessfullyUpdated: "\u0411\u0430\u043D\u043D\u0435\u0440 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D",
88
+ bannerCreationWasFailed: "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0431\u0430\u043D\u043D\u0435\u0440",
89
+ bannerUpdateWasFailed: "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0431\u0430\u043D\u043D\u0435\u0440"
90
+ };
91
+ function applyTranslations() {
92
+ i18n.addTranslations("en", "banners", EN);
93
+ i18n.addTranslations("ru", "banners", RU);
94
+ }
95
+ var Status = /* @__PURE__ */ ((Status2) => {
96
+ Status2["Waiting"] = "WAITING";
97
+ Status2["Archived"] = "ARCHIVED";
98
+ Status2["Active"] = "ACTIVE";
99
+ Status2["Disabled"] = "DISABLED";
100
+ return Status2;
101
+ })(Status || {});
102
+ function getZones(params) {
103
+ return request.get({ path: "/admin/adv/zones", params });
104
+ }
105
+ function getZoneFields(zoneId) {
106
+ return request.get({ path: `/admin/adv/zones/${zoneId}` });
107
+ }
108
+ function getBanners(params) {
109
+ return request.get({ path: "/admin/adv", params });
110
+ }
111
+ function getBanner(bannerId) {
112
+ return request.get({ path: `/admin/adv/${bannerId}` });
113
+ }
114
+ function createBanner(payload) {
115
+ return request.post({ path: "/admin/adv", body: payload });
116
+ }
117
+ function updateBanner(bannerId, payload) {
118
+ return request.put({
119
+ path: `/admin/adv/${bannerId}`,
120
+ body: payload
121
+ });
122
+ }
123
+ function deleteBanner(bannerId) {
124
+ return request.delete({ path: `/admin/adv/${bannerId}` });
125
+ }
126
+ function getBannerCount() {
127
+ return request.get({ path: "/admin/adv/count" });
128
+ }
129
+ const BANNERS_ROUTE_PATHS = {
130
+ ZONE_LIST: "/banners/zones",
131
+ BANNER_LIST: "/banners",
132
+ BANNER_FORM: "/banners/:bannerId"
133
+ };
134
+ function getBannersZoneListUrl() {
135
+ return BANNERS_ROUTE_PATHS.ZONE_LIST;
136
+ }
137
+ function getBannersBannerListUrl() {
138
+ return BANNERS_ROUTE_PATHS.BANNER_LIST;
139
+ }
140
+ function getBannersBannerFormUrl(params) {
141
+ return compile(BANNERS_ROUTE_PATHS.BANNER_FORM)(params);
142
+ }
143
+ function getColumnDefs$1(t) {
144
+ return [
145
+ {
146
+ id: 0,
147
+ name: "ID",
148
+ field: "id",
149
+ style: { width: "50px", textAlign: "center" },
150
+ headStyle: { width: "50px", textAlign: "center" }
151
+ },
152
+ {
153
+ id: 1,
154
+ name: t("banners:name"),
155
+ field: "name",
156
+ type: "name"
157
+ },
158
+ {
159
+ id: 2,
160
+ name: t("banners:banners"),
161
+ field: "bannersCount",
162
+ style: { whiteSpace: "nowrap", width: "130px" }
163
+ }
164
+ ];
165
+ }
166
+ function getLinkToBannersByZone(zoneId) {
167
+ return `${getBannersBannerListUrl()}?filter[zone]=${zoneId}`;
168
+ }
169
+ var _export_sfc = (sfc, props) => {
170
+ const target = sfc.__vccOpts || sfc;
171
+ for (const [key, val] of props) {
172
+ target[key] = val;
173
+ }
174
+ return target;
175
+ };
176
+ const _sfc_main$2 = defineComponent({
177
+ name: "ZoneList",
178
+ components: { CountButton, Page, DataTable },
179
+ setup() {
180
+ const i18n2 = useI18n();
181
+ const {
182
+ fetchEntityList: fetchZones,
183
+ isLoading: isZonesLoading,
184
+ rowData,
185
+ errorMessage,
186
+ handleChange
187
+ } = useDataTable({
188
+ fetchEntityList: getZones,
189
+ initialValue: [],
190
+ resourceName: "Banner Zones"
191
+ });
192
+ onMounted(() => {
193
+ fetchZones();
194
+ });
195
+ const columnDefs = computed(() => getColumnDefs$1(i18n2.t));
196
+ return {
197
+ columnDefs,
198
+ isRowDataLoading: isZonesLoading,
199
+ rowData,
200
+ errorMessage,
201
+ handleChange,
202
+ getLinkToBannersByZone
203
+ };
204
+ }
205
+ });
206
+ function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
207
+ const _component_CountButton = resolveComponent("CountButton");
208
+ const _component_DataTable = resolveComponent("DataTable");
209
+ const _component_Page = resolveComponent("Page");
210
+ return openBlock(), createBlock(_component_Page, {
211
+ title: _ctx.$i18n.t("banners:zones")
212
+ }, {
213
+ content: withCtx(() => [
214
+ createVNode(_component_DataTable, {
215
+ "column-defs": _ctx.columnDefs,
216
+ "row-data": _ctx.rowData,
217
+ loading: _ctx.isRowDataLoading,
218
+ "error-message": _ctx.errorMessage,
219
+ "data-table": "banners-zones",
220
+ "use-search": false,
221
+ "use-pagination": false,
222
+ onChange: _ctx.handleChange
223
+ }, {
224
+ "cell(banners-count)": withCtx(({ row }) => [
225
+ createVNode(_component_CountButton, {
226
+ href: _ctx.getLinkToBannersByZone(row.id),
227
+ variant: "outline-secondary",
228
+ count: row.bannersCount
229
+ }, {
230
+ default: withCtx(() => [
231
+ createTextVNode(toDisplayString(_ctx.$i18n.t("banners:banners")), 1)
232
+ ]),
233
+ _: 2
234
+ }, 1032, ["href", "count"])
235
+ ]),
236
+ _: 1
237
+ }, 8, ["column-defs", "row-data", "loading", "error-message", "onChange"])
238
+ ]),
239
+ _: 1
240
+ }, 8, ["title"]);
241
+ }
242
+ var ZoneList = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render$2]]);
243
+ function useFetchZones() {
244
+ const [fetchZones, resource] = useResource({
245
+ fetchResource: getZones,
246
+ initialValue: [],
247
+ resourceName: "Banner zones"
248
+ });
249
+ onMounted(() => {
250
+ fetchZones();
251
+ });
252
+ return resource;
253
+ }
254
+ function getStatus(type, t) {
255
+ switch (type) {
256
+ case Status.Waiting:
257
+ return t("banners:statuses.waiting");
258
+ case Status.Archived:
259
+ return t("banners:statuses.archived");
260
+ case Status.Active:
261
+ return t("banners:statuses.active");
262
+ case Status.Disabled:
263
+ return t("banners:statuses.disabled");
264
+ default:
265
+ return "";
266
+ }
267
+ }
268
+ function getColumnDefs(zoneList, t) {
269
+ return [
270
+ {
271
+ id: 0,
272
+ name: "#",
273
+ field: "id",
274
+ format: ({ rowIndex }) => String(rowIndex + 1),
275
+ style: { width: "50px", textAlign: "center" },
276
+ headStyle: { width: "50px", textAlign: "center" }
277
+ },
278
+ {
279
+ id: 1,
280
+ name: t("banners:zone"),
281
+ field: "bannerZone",
282
+ format: ({ row }) => {
283
+ const foundBannerZone = zoneList.find(
284
+ (zone) => zone.id === row.bannerZone
285
+ );
286
+ return foundBannerZone ? foundBannerZone.name : t("banners:bannerZoneIsDeleted");
287
+ }
288
+ },
289
+ {
290
+ id: 2,
291
+ name: t("banners:status"),
292
+ field: "status",
293
+ format: ({ row }) => getStatus(row.status, t),
294
+ style: { width: "120px" },
295
+ headStyle: { width: "120px" }
296
+ },
297
+ {
298
+ id: 3,
299
+ name: t("banners:priority"),
300
+ field: "priority",
301
+ style: { width: "100px", textAlign: "center" },
302
+ headStyle: { width: "100px", textAlign: "center" }
303
+ },
304
+ {
305
+ id: 4,
306
+ name: t("banners:period"),
307
+ field: "dateStart",
308
+ format: ({ row }) => `${row.dateStart ? `${t("banners:from")} ${row.dateStart}` : ""} ${row.dateEnd ? `${t("banners:to")} ${row.dateEnd}` : ""}`
309
+ },
310
+ {
311
+ id: 5,
312
+ name: t("banners:image"),
313
+ field: "image",
314
+ type: "image"
315
+ },
316
+ {
317
+ id: 6,
318
+ name: t("banners:link"),
319
+ field: "link",
320
+ type: "name",
321
+ format: ({ row }) => {
322
+ var _a, _b;
323
+ return {
324
+ adminLink: {
325
+ url: (_a = row.link) != null ? _a : "",
326
+ text: (_b = row.link) != null ? _b : ""
327
+ },
328
+ paramList: [
329
+ {
330
+ name: t("banners:newTab"),
331
+ value: row.openNewTab ? t("banners:yes") : t("banners:no")
332
+ }
333
+ ]
334
+ };
335
+ },
336
+ options: {
337
+ shouldOpenNewTab: true
338
+ }
339
+ },
340
+ {
341
+ id: 7,
342
+ name: t("banners:comment"),
343
+ field: "comment"
344
+ },
345
+ {
346
+ id: 8,
347
+ name: t("banners:actions"),
348
+ field: "actions",
349
+ style: { whiteSpace: "nowrap", width: "100px" },
350
+ headStyle: { whiteSpace: "nowrap", width: "100px" }
351
+ }
352
+ ];
353
+ }
354
+ function useAdvancedSearch({ t, zoneList, route }) {
355
+ const zonesOptionList = computed(
356
+ () => zoneList.value.map(({ id, name }) => ({
357
+ value: id,
358
+ label: name
359
+ }))
360
+ );
361
+ const initialZoneFilter = computed(() => {
362
+ const queryValue = getFilterParamAsStringArray(
363
+ route.query,
364
+ "zone"
365
+ );
366
+ return zonesOptionList.value.filter(
367
+ ({ value }) => queryValue.some((selected) => selected === value)
368
+ );
369
+ });
370
+ const zoneFilter = ref(initialZoneFilter.value);
371
+ watch(initialZoneFilter, () => {
372
+ zoneFilter.value = initialZoneFilter.value;
373
+ });
374
+ const initialDateFilter = computed(
375
+ () => {
376
+ var _a;
377
+ return (_a = getFilterParamAsString(route.query, "date")) != null ? _a : "";
378
+ }
379
+ );
380
+ const dateFilter = ref(initialDateFilter.value);
381
+ watch(initialDateFilter, () => {
382
+ dateFilter.value = initialDateFilter.value;
383
+ });
384
+ const statusesOptionList = computed(
385
+ () => Object.entries(Status).map(([_, value]) => ({
386
+ value,
387
+ label: getStatus(value, t)
388
+ }))
389
+ );
390
+ const initialStatusFilter = computed(() => {
391
+ const queryValue = getFilterParamAsStringArray(
392
+ route.query,
393
+ "status"
394
+ );
395
+ return statusesOptionList.value.filter(
396
+ ({ value }) => queryValue.some((selected) => selected === value)
397
+ );
398
+ });
399
+ const statusFilter = ref(initialStatusFilter.value);
400
+ watch(initialStatusFilter, () => {
401
+ statusFilter.value = initialStatusFilter.value;
402
+ });
403
+ const filterParams = computed(
404
+ () => getFilterParams({
405
+ ["zone"]: zoneFilter.value.map(({ value }) => value),
406
+ ["date"]: dateFilter.value || [],
407
+ ["status"]: statusFilter.value.map(({ value }) => value)
408
+ })
409
+ );
410
+ const tagRemovalHandler = (event) => {
411
+ if (event.name === "zone") {
412
+ zoneFilter.value = zoneFilter.value.filter(
413
+ ({ value }) => value !== event.value
414
+ );
415
+ }
416
+ if (event.name === "date") {
417
+ dateFilter.value = "";
418
+ }
419
+ if (event.name === "status") {
420
+ statusFilter.value = statusFilter.value.filter(
421
+ ({ value }) => value !== event.value
422
+ );
423
+ }
424
+ };
425
+ const tags = computed(
426
+ () => [
427
+ ...zoneFilter.value.map(({ value, label }) => ({
428
+ value,
429
+ label,
430
+ name: "zone",
431
+ title: t("banners:zone")
432
+ })),
433
+ ...statusFilter.value.map(({ value, label }) => ({
434
+ value,
435
+ label,
436
+ name: "status",
437
+ title: t("banners:status")
438
+ })),
439
+ dateFilter.value ? {
440
+ value: dateFilter.value,
441
+ label: dateFilter.value,
442
+ name: "date",
443
+ title: t("banners:date")
444
+ } : null
445
+ ].filter(isNotNullish)
446
+ );
447
+ return {
448
+ zoneFilter,
449
+ zonesOptionList,
450
+ dateFilter,
451
+ statusFilter,
452
+ statusesOptionList,
453
+ filterParams,
454
+ tags,
455
+ tagRemovalHandler
456
+ };
457
+ }
458
+ var BannerList_vue_vue_type_style_index_0_lang = "";
459
+ const _sfc_main$1 = defineComponent({
460
+ name: "BannerList",
461
+ components: {
462
+ DeleteIcon,
463
+ EditIcon,
464
+ BaseButton,
465
+ FormField,
466
+ FormFieldMultiSelect,
467
+ AdvancedSearch,
468
+ Page,
469
+ DataTable
470
+ },
471
+ setup() {
472
+ const route = useRoute();
473
+ const router = useRouter();
474
+ const { t } = useI18n();
475
+ const { loading: isZonesLoading, data: zoneList } = useFetchZones();
476
+ const {
477
+ zoneFilter,
478
+ zonesOptionList,
479
+ dateFilter,
480
+ statusFilter,
481
+ statusesOptionList,
482
+ filterParams,
483
+ tags,
484
+ tagRemovalHandler
485
+ } = useAdvancedSearch({
486
+ t,
487
+ zoneList,
488
+ route
489
+ });
490
+ const {
491
+ fetchEntityList: fetchBanners,
492
+ isLoading: isBannersLoading,
493
+ rowData,
494
+ errorMessage,
495
+ handleChange,
496
+ searchQuery,
497
+ pageNumber,
498
+ pageCount,
499
+ pageSize
500
+ } = useDataTable({
501
+ fetchEntityList: (params) => getBanners({
502
+ query: params.searchQuery,
503
+ pageNumber: params.pageNumber,
504
+ pageSize: params.pageSize,
505
+ ...filterParams.value
506
+ }),
507
+ initialValue: [],
508
+ resourceName: "Banners"
509
+ });
510
+ watch(filterParams, () => {
511
+ if (isZonesLoading.value) {
512
+ return;
513
+ }
514
+ const newQuery = {
515
+ ...pick(route.query, ["query", "pageNumber"]),
516
+ ...filterParams.value
517
+ };
518
+ if (!isEqual(route.query, newQuery)) {
519
+ router.replace({ query: newQuery });
520
+ fetchBanners();
521
+ }
522
+ });
523
+ const { isDeleting, handleResourceDelete } = useResourceDelete({
524
+ deleteResource: deleteBanner,
525
+ resourceName: "Banner",
526
+ onSuccess: fetchBanners
527
+ });
528
+ const isBusy = (bannerId) => {
529
+ return isDeleting(bannerId) || isBannersLoading.value;
530
+ };
531
+ const columnDefs = computed(
532
+ () => getColumnDefs(zoneList.value, t)
533
+ );
534
+ const isRowDataLoading = computed(
535
+ () => isBannersLoading.value || isZonesLoading.value
536
+ );
537
+ return {
538
+ columnDefs,
539
+ isRowDataLoading,
540
+ rowData,
541
+ errorMessage,
542
+ handleChange,
543
+ getBannersBannerFormUrl,
544
+ searchQuery,
545
+ pageNumber,
546
+ pageCount,
547
+ pageSize,
548
+ isBusy,
549
+ handleResourceDelete,
550
+ zoneFilter,
551
+ zonesOptionList,
552
+ dateFilter,
553
+ statusFilter,
554
+ statusesOptionList,
555
+ tags,
556
+ tagRemovalHandler
557
+ };
558
+ }
559
+ });
560
+ const _hoisted_1$1 = { class: "filters" };
561
+ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
562
+ const _component_FormFieldMultiSelect = resolveComponent("FormFieldMultiSelect");
563
+ const _component_FormField = resolveComponent("FormField");
564
+ const _component_AdvancedSearch = resolveComponent("AdvancedSearch");
565
+ const _component_EditIcon = resolveComponent("EditIcon");
566
+ const _component_BaseButton = resolveComponent("BaseButton");
567
+ const _component_DeleteIcon = resolveComponent("DeleteIcon");
568
+ const _component_DataTable = resolveComponent("DataTable");
569
+ const _component_Page = resolveComponent("Page");
570
+ return openBlock(), createBlock(_component_Page, {
571
+ title: _ctx.$i18n.t("banners:banners"),
572
+ "header-buttons": [
573
+ {
574
+ text: _ctx.$i18n.t("banners:createBanner"),
575
+ href: _ctx.getBannersBannerFormUrl({ bannerId: "create" })
576
+ }
577
+ ]
578
+ }, {
579
+ content: withCtx(() => [
580
+ createVNode(_component_DataTable, {
581
+ "column-defs": _ctx.columnDefs,
582
+ "row-data": _ctx.rowData,
583
+ loading: _ctx.isRowDataLoading,
584
+ "error-message": _ctx.errorMessage,
585
+ "data-table": "banners",
586
+ "use-search": true,
587
+ "use-pagination": true,
588
+ "search-query": _ctx.searchQuery,
589
+ pagination: {
590
+ pageNumber: _ctx.pageNumber,
591
+ pageCount: _ctx.pageCount,
592
+ pageSize: _ctx.pageSize,
593
+ disabled: _ctx.isRowDataLoading
594
+ },
595
+ onChange: _ctx.handleChange
596
+ }, {
597
+ filters: withCtx(() => [
598
+ createVNode(_component_AdvancedSearch, {
599
+ tags: _ctx.tags,
600
+ "onClick:tag": _ctx.tagRemovalHandler
601
+ }, {
602
+ default: withCtx(() => [
603
+ createElementVNode("div", _hoisted_1$1, [
604
+ createVNode(_component_FormFieldMultiSelect, {
605
+ "selected-options": _ctx.zoneFilter,
606
+ "onUpdate:selected-options": _cache[0] || (_cache[0] = ($event) => _ctx.zoneFilter = $event),
607
+ options: _ctx.zonesOptionList,
608
+ name: "zoneFilter",
609
+ searchable: true,
610
+ label: _ctx.$i18n.t("banners:zone"),
611
+ class: "filter"
612
+ }, null, 8, ["selected-options", "options", "label"]),
613
+ createVNode(_component_FormField, {
614
+ value: _ctx.dateFilter,
615
+ "onUpdate:value": _cache[1] || (_cache[1] = ($event) => _ctx.dateFilter = $event),
616
+ label: _ctx.$i18n.t("banners:date"),
617
+ name: "dateFilter",
618
+ type: "date",
619
+ class: "filter"
620
+ }, null, 8, ["value", "label"]),
621
+ createVNode(_component_FormFieldMultiSelect, {
622
+ "selected-options": _ctx.statusFilter,
623
+ "onUpdate:selected-options": _cache[2] || (_cache[2] = ($event) => _ctx.statusFilter = $event),
624
+ options: _ctx.statusesOptionList,
625
+ name: "statusFilter",
626
+ searchable: true,
627
+ label: _ctx.$i18n.t("banners:status"),
628
+ class: "filter"
629
+ }, null, 8, ["selected-options", "options", "label"])
630
+ ])
631
+ ]),
632
+ _: 1
633
+ }, 8, ["tags", "onClick:tag"])
634
+ ]),
635
+ "cell(actions)": withCtx(({ row }) => [
636
+ createVNode(_component_BaseButton, {
637
+ variant: "icon",
638
+ title: _ctx.$i18n.t("banners:edit"),
639
+ disabled: _ctx.isBusy(row.id),
640
+ href: _ctx.getBannersBannerFormUrl({ bannerId: row.id })
641
+ }, {
642
+ default: withCtx(() => [
643
+ createVNode(_component_EditIcon)
644
+ ]),
645
+ _: 2
646
+ }, 1032, ["title", "disabled", "href"]),
647
+ createVNode(_component_BaseButton, {
648
+ variant: "icon",
649
+ title: _ctx.$i18n.t("banners:remove"),
650
+ disabled: _ctx.isBusy(row.id),
651
+ onClick: ($event) => _ctx.handleResourceDelete(row.id)
652
+ }, {
653
+ default: withCtx(() => [
654
+ createVNode(_component_DeleteIcon)
655
+ ]),
656
+ _: 2
657
+ }, 1032, ["title", "disabled", "onClick"])
658
+ ]),
659
+ _: 1
660
+ }, 8, ["column-defs", "row-data", "loading", "error-message", "search-query", "pagination", "onChange"])
661
+ ]),
662
+ _: 1
663
+ }, 8, ["title", "header-buttons"]);
664
+ }
665
+ var BannerList = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render$1]]);
666
+ function useFetchBanner({
667
+ bannerId,
668
+ isCreation
669
+ }) {
670
+ const [fetchBanner, resource] = useResource({
671
+ fetchResource: () => getBanner(bannerId.value),
672
+ initialValue: null,
673
+ resourceName: "Banner"
674
+ });
675
+ onMounted(() => {
676
+ if (isCreation.value || !bannerId.value) {
677
+ return;
678
+ }
679
+ fetchBanner();
680
+ });
681
+ watch(bannerId, () => {
682
+ if (isCreation.value || !bannerId.value) {
683
+ return;
684
+ }
685
+ fetchBanner();
686
+ });
687
+ return resource;
688
+ }
689
+ function useFetchZoneFields({
690
+ values
691
+ }) {
692
+ const zoneId = computed(() => {
693
+ var _a, _b;
694
+ return (_b = (_a = values.value.bannerZone) == null ? void 0 : _a.value) != null ? _b : "";
695
+ });
696
+ const [fetchZoneFields, resource] = useResource({
697
+ fetchResource: () => getZoneFields(zoneId.value),
698
+ initialValue: null,
699
+ resourceName: "Zone Fields"
700
+ });
701
+ onMounted(() => {
702
+ if (!zoneId.value) {
703
+ return;
704
+ }
705
+ fetchZoneFields();
706
+ });
707
+ watch(zoneId, () => {
708
+ if (!zoneId.value) {
709
+ return;
710
+ }
711
+ fetchZoneFields();
712
+ });
713
+ return resource;
714
+ }
715
+ function convertBannerToFormValues(banner, zonesOptionList) {
716
+ var _a, _b, _c, _d, _e, _f, _g;
717
+ const foundZone = zonesOptionList.find(
718
+ ({ value }) => value === (banner == null ? void 0 : banner.bannerZone)
719
+ );
720
+ return {
721
+ priority: String((_a = banner == null ? void 0 : banner.priority) != null ? _a : 1),
722
+ link: (_b = banner == null ? void 0 : banner.link) != null ? _b : "",
723
+ image: (banner == null ? void 0 : banner.image) ? { id: createId(), file: banner.image } : null,
724
+ bannerZone: foundZone != null ? foundZone : null,
725
+ openNewTab: (_c = banner == null ? void 0 : banner.openNewTab) != null ? _c : false,
726
+ dateStart: (_d = banner == null ? void 0 : banner.dateStart) != null ? _d : "",
727
+ dateEnd: (_e = banner == null ? void 0 : banner.dateEnd) != null ? _e : "",
728
+ disabled: (_f = banner == null ? void 0 : banner.disabled) != null ? _f : false,
729
+ comment: (_g = banner == null ? void 0 : banner.comment) != null ? _g : "",
730
+ fields: []
731
+ };
732
+ }
733
+ function convertBannerFormValuesToPayload(values) {
734
+ var _a, _b, _c, _d;
735
+ return {
736
+ ...values,
737
+ priority: values.priority ? Number(values.priority) : 1,
738
+ dateStart: values.dateStart ? values.dateStart : null,
739
+ dateEnd: values.dateEnd ? values.dateEnd : null,
740
+ image: (_b = (_a = values.image) == null ? void 0 : _a.file.id) != null ? _b : null,
741
+ bannerZone: (_d = (_c = values.bannerZone) == null ? void 0 : _c.value) != null ? _d : "",
742
+ fields: values.fields.map((field) => ({
743
+ name: field.config.name,
744
+ value: universalFieldUtils.getOutgoingValue(field)
745
+ }))
746
+ };
747
+ }
748
+ var BannerForm_vue_vue_type_style_index_0_lang = "";
749
+ const _sfc_main = defineComponent({
750
+ name: "BannerForm",
751
+ components: {
752
+ FormFieldFileInput,
753
+ FormFieldCheckbox,
754
+ InputLabel,
755
+ FormField,
756
+ FormFieldSelect,
757
+ Page,
758
+ FormFooter,
759
+ DynamicField
760
+ },
761
+ setup() {
762
+ const route = useRoute();
763
+ const router = useRouter();
764
+ const toast = useToast();
765
+ const { t } = useI18n();
766
+ const bannerId = computed(() => route.params.bannerId);
767
+ const isCreation = computed(() => bannerId.value === "create");
768
+ const { data: zones, loading: isZonesLoading } = useFetchZones();
769
+ const zonesOptionList = computed(
770
+ () => zones.value.map((zone) => ({
771
+ value: zone.id,
772
+ label: zone.name
773
+ }))
774
+ );
775
+ const { data: banner, loading: isBannerLoading } = useFetchBanner({
776
+ bannerId,
777
+ isCreation
778
+ });
779
+ const isSubmitting = ref(false);
780
+ const values = ref(
781
+ convertBannerToFormValues(banner.value, zonesOptionList.value)
782
+ );
783
+ const errors = ref({});
784
+ watch([banner, zones], () => {
785
+ values.value = convertBannerToFormValues(
786
+ banner.value,
787
+ zonesOptionList.value
788
+ );
789
+ });
790
+ const { loading: isZoneFieldsLoading, data: zoneFields } = useFetchZoneFields({ values });
791
+ watch(zoneFields, () => {
792
+ var _a, _b;
793
+ values.value.fields = ((_b = (_a = zoneFields.value) == null ? void 0 : _a.fields) != null ? _b : []).map(
794
+ (fieldConfig, index) => {
795
+ var _a2;
796
+ return universalFieldUtils.createFormField(
797
+ fieldConfig,
798
+ banner.value ? (_a2 = banner.value.fields[index].value) != null ? _a2 : null : null
799
+ );
800
+ }
801
+ );
802
+ });
803
+ const submitForm = (event) => {
804
+ isSubmitting.value = true;
805
+ const body = convertBannerFormValuesToPayload(values.value);
806
+ const requestPromise = isCreation.value ? createBanner(body) : updateBanner(bannerId.value, body);
807
+ requestPromise.then(({ data }) => {
808
+ errors.value = {};
809
+ if (event.type === "create") {
810
+ router.push(getBannersBannerFormUrl({ bannerId: String(data.id) }));
811
+ } else if (event.type === "create_exit" || event.type === "save_exit") {
812
+ navigateBack(router, getBannersBannerListUrl());
813
+ } else if (event.type === "create_create-another") {
814
+ values.value = convertBannerToFormValues(
815
+ null,
816
+ zonesOptionList.value
817
+ );
818
+ }
819
+ toast.show({
820
+ variant: "success",
821
+ title: t("banners:success"),
822
+ body: isCreation.value ? t("banners:bannerWasSuccessfullyCreated") : t("banners:bannerWasSuccessfullyUpdated")
823
+ });
824
+ }).catch((error) => {
825
+ console.error(error);
826
+ errors.value = convertRequestErrorToMap(error);
827
+ toast.show({
828
+ variant: "danger",
829
+ title: t("banners:error"),
830
+ body: isCreation.value ? t("banners:bannerCreationWasFailed") : t("banners:bannerUpdateWasFailed")
831
+ });
832
+ }).finally(() => {
833
+ isSubmitting.value = false;
834
+ });
835
+ };
836
+ const isContentLoading = computed(
837
+ () => isBannerLoading.value || isZonesLoading.value || isZoneFieldsLoading.value
838
+ );
839
+ return {
840
+ isCreation,
841
+ isContentLoading,
842
+ isSubmitting,
843
+ values,
844
+ errors,
845
+ submitForm,
846
+ bannerListUrl: getBannersBannerListUrl(),
847
+ zonesOptionList
848
+ };
849
+ }
850
+ });
851
+ const _hoisted_1 = { class: "zone" };
852
+ const _hoisted_2 = { class: "date" };
853
+ const _hoisted_3 = { class: "link" };
854
+ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
855
+ const _component_FormFieldSelect = resolveComponent("FormFieldSelect");
856
+ const _component_FormField = resolveComponent("FormField");
857
+ const _component_InputLabel = resolveComponent("InputLabel");
858
+ const _component_FormFieldCheckbox = resolveComponent("FormFieldCheckbox");
859
+ const _component_FormFieldFileInput = resolveComponent("FormFieldFileInput");
860
+ const _component_DynamicField = resolveComponent("DynamicField");
861
+ const _component_FormFooter = resolveComponent("FormFooter");
862
+ const _component_Page = resolveComponent("Page");
863
+ return openBlock(), createBlock(_component_Page, {
864
+ title: _ctx.isCreation ? _ctx.$i18n.t("banners:createBanner") : _ctx.$i18n.t("banners:updateBanner"),
865
+ "is-content-loading": _ctx.isContentLoading
866
+ }, {
867
+ content: withCtx(() => [
868
+ createElementVNode("form", {
869
+ novalidate: "",
870
+ onSubmit: _cache[9] || (_cache[9] = withModifiers((...args) => _ctx.submitForm && _ctx.submitForm(...args), ["prevent"]))
871
+ }, [
872
+ createElementVNode("div", _hoisted_1, [
873
+ createVNode(_component_FormFieldSelect, {
874
+ value: _ctx.values.bannerZone,
875
+ "onUpdate:value": _cache[0] || (_cache[0] = ($event) => _ctx.values.bannerZone = $event),
876
+ name: "bannerZone",
877
+ label: _ctx.$i18n.t("banners:zone"),
878
+ options: _ctx.zonesOptionList,
879
+ error: _ctx.errors.bannerZone
880
+ }, null, 8, ["value", "label", "options", "error"]),
881
+ createVNode(_component_FormField, {
882
+ value: _ctx.values.priority,
883
+ "onUpdate:value": _cache[1] || (_cache[1] = ($event) => _ctx.values.priority = $event),
884
+ name: "priority",
885
+ label: _ctx.$i18n.t("banners:priority"),
886
+ error: _ctx.errors.priority
887
+ }, null, 8, ["value", "label", "error"])
888
+ ]),
889
+ createVNode(_component_InputLabel, null, {
890
+ default: withCtx(() => [
891
+ createTextVNode(toDisplayString(_ctx.$i18n.t("banners:period")), 1)
892
+ ]),
893
+ _: 1
894
+ }),
895
+ createElementVNode("div", _hoisted_2, [
896
+ createVNode(_component_FormField, {
897
+ value: _ctx.values.dateStart,
898
+ "onUpdate:value": _cache[2] || (_cache[2] = ($event) => _ctx.values.dateStart = $event),
899
+ label: _ctx.$i18n.t("banners:from"),
900
+ name: "dateStart",
901
+ type: "date",
902
+ max: _ctx.values.dateEnd
903
+ }, null, 8, ["value", "label", "max"]),
904
+ createVNode(_component_FormField, {
905
+ value: _ctx.values.dateEnd,
906
+ "onUpdate:value": _cache[3] || (_cache[3] = ($event) => _ctx.values.dateEnd = $event),
907
+ label: _ctx.$i18n.t("banners:to"),
908
+ name: "dateEnd",
909
+ type: "date",
910
+ min: _ctx.values.dateStart
911
+ }, null, 8, ["value", "label", "min"])
912
+ ]),
913
+ createVNode(_component_FormFieldCheckbox, {
914
+ checked: _ctx.values.disabled,
915
+ "onUpdate:checked": _cache[4] || (_cache[4] = ($event) => _ctx.values.disabled = $event),
916
+ name: "disabled",
917
+ label: _ctx.$i18n.t("banners:disabled"),
918
+ error: _ctx.errors.disabled
919
+ }, null, 8, ["checked", "label", "error"]),
920
+ createElementVNode("div", _hoisted_3, [
921
+ createVNode(_component_FormField, {
922
+ value: _ctx.values.link,
923
+ "onUpdate:value": _cache[5] || (_cache[5] = ($event) => _ctx.values.link = $event),
924
+ name: "link",
925
+ label: _ctx.$i18n.t("banners:link"),
926
+ error: _ctx.errors.name
927
+ }, null, 8, ["value", "label", "error"]),
928
+ createVNode(_component_FormFieldCheckbox, {
929
+ checked: _ctx.values.openNewTab,
930
+ "onUpdate:checked": _cache[6] || (_cache[6] = ($event) => _ctx.values.openNewTab = $event),
931
+ name: "openNewTab",
932
+ label: _ctx.$i18n.t("banners:openNewTab"),
933
+ error: _ctx.errors.openNewTab
934
+ }, null, 8, ["checked", "label", "error"])
935
+ ]),
936
+ createVNode(_component_FormFieldFileInput, {
937
+ value: _ctx.values.image,
938
+ "onUpdate:value": _cache[7] || (_cache[7] = ($event) => _ctx.values.image = $event),
939
+ name: "image",
940
+ "file-type": "image",
941
+ label: _ctx.$i18n.t("banners:image"),
942
+ error: _ctx.errors.file
943
+ }, null, 8, ["value", "label", "error"]),
944
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.values.fields, (field) => {
945
+ return openBlock(), createBlock(_component_DynamicField, {
946
+ key: field.name,
947
+ field
948
+ }, null, 8, ["field"]);
949
+ }), 128)),
950
+ createVNode(_component_FormField, {
951
+ value: _ctx.values.comment,
952
+ "onUpdate:value": _cache[8] || (_cache[8] = ($event) => _ctx.values.comment = $event),
953
+ name: "comment",
954
+ type: "textarea",
955
+ label: _ctx.$i18n.t("banners:comment"),
956
+ error: _ctx.errors.comment
957
+ }, null, 8, ["value", "label", "error"])
958
+ ], 32)
959
+ ]),
960
+ footer: withCtx(() => [
961
+ createVNode(_component_FormFooter, {
962
+ "back-href": _ctx.bannerListUrl,
963
+ "is-submitting": _ctx.isSubmitting,
964
+ "is-creation": _ctx.isCreation,
965
+ "can-create-another": _ctx.isCreation,
966
+ onSubmit: _ctx.submitForm
967
+ }, null, 8, ["back-href", "is-submitting", "is-creation", "can-create-another", "onSubmit"])
968
+ ]),
969
+ _: 1
970
+ }, 8, ["title", "is-content-loading"]);
971
+ }
972
+ var BannerForm = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
973
+ const BANNERS_ZONE_LIST_ROUTE = {
974
+ path: BANNERS_ROUTE_PATHS.ZONE_LIST,
975
+ component: ZoneList,
976
+ name: "Zones",
977
+ meta: {
978
+ getBreadcrumbs: (route, { t }) => [
979
+ { url: "/", text: t("banners:home") },
980
+ { url: BANNERS_ROUTE_PATHS.ZONE_LIST, text: t("banners:zones") }
981
+ ]
982
+ }
983
+ };
984
+ const BANNERS_BANNER_LIST_ROUTE = {
985
+ path: BANNERS_ROUTE_PATHS.BANNER_LIST,
986
+ component: BannerList,
987
+ name: "Banners",
988
+ meta: {
989
+ getBreadcrumbs: (route, { t }) => [
990
+ { url: "/", text: t("banners:home") },
991
+ { url: BANNERS_ROUTE_PATHS.BANNER_LIST, text: t("banners:banners") }
992
+ ]
993
+ }
994
+ };
995
+ const BANNERS_BANNER_FORM_ROUTE = {
996
+ path: BANNERS_ROUTE_PATHS.BANNER_FORM,
997
+ component: BannerForm,
998
+ name: "Banner Form",
999
+ meta: {
1000
+ getBreadcrumbs: (route, { t }) => [
1001
+ { url: "/", text: t("banners:home") },
1002
+ { url: BANNERS_ROUTE_PATHS.BANNER_LIST, text: t("banners:banners") },
1003
+ { url: route.path, text: t("banners:bannerForm") }
1004
+ ]
1005
+ }
1006
+ };
1007
+ applyTranslations();
1008
+ export { BANNERS_BANNER_FORM_ROUTE, BANNERS_BANNER_LIST_ROUTE, BANNERS_ZONE_LIST_ROUTE, createBanner, deleteBanner, getBanner, getBannerCount, getBanners, getBannersBannerFormUrl, getBannersBannerListUrl, getBannersZoneListUrl, getZoneFields, getZones, updateBanner };