@tager/admin-banners 0.3.5 → 0.3.6

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/index.esm.js CHANGED
@@ -29,6 +29,7 @@ const EN = {
29
29
  actions: 'actions',
30
30
  date: 'Date',
31
31
  name: 'Name',
32
+ priority: 'Priority',
32
33
  success: 'Success',
33
34
  error: 'Error',
34
35
  statuses: {
@@ -69,6 +70,7 @@ const RU = {
69
70
  actions: 'Действия',
70
71
  date: 'Дата',
71
72
  name: 'Название',
73
+ priority: 'Приоритет',
72
74
  success: 'Успех',
73
75
  error: 'Ошибка',
74
76
  statuses: {
@@ -2781,18 +2783,25 @@ function getColumnDefs$1(zoneList, t) {
2781
2783
  },
2782
2784
  {
2783
2785
  id: 3,
2786
+ name: t('banners:priority'),
2787
+ field: 'priority',
2788
+ style: { width: '100px', textAlign: 'center' },
2789
+ headStyle: { width: '100px', textAlign: 'center' },
2790
+ },
2791
+ {
2792
+ id: 4,
2784
2793
  name: t('banners:period'),
2785
2794
  field: 'dateStart',
2786
2795
  format: ({ row }) => `${row.dateStart ? `${t('banners:from')} ${row.dateStart}` : ''} ${row.dateEnd ? `${t('banners:to')} ${row.dateEnd}` : ''}`,
2787
2796
  },
2788
2797
  {
2789
- id: 4,
2798
+ id: 5,
2790
2799
  name: t('banners:image'),
2791
2800
  field: 'image',
2792
2801
  type: 'image',
2793
2802
  },
2794
2803
  {
2795
- id: 5,
2804
+ id: 6,
2796
2805
  name: t('banners:link'),
2797
2806
  field: 'link',
2798
2807
  type: 'name',
@@ -2816,12 +2825,12 @@ function getColumnDefs$1(zoneList, t) {
2816
2825
  },
2817
2826
  },
2818
2827
  {
2819
- id: 6,
2828
+ id: 7,
2820
2829
  name: t('banners:comment'),
2821
2830
  field: 'comment',
2822
2831
  },
2823
2832
  {
2824
- id: 7,
2833
+ id: 8,
2825
2834
  name: t('banners:actions'),
2826
2835
  field: 'actions',
2827
2836
  style: { whiteSpace: 'nowrap', width: '100px' },
@@ -3240,22 +3249,23 @@ function useFetchBanner({ context, bannerId, isCreation, }) {
3240
3249
  }
3241
3250
 
3242
3251
  function convertBannerToFormValues(banner, zonesOptionList) {
3243
- var _a, _b, _c, _d, _e, _f;
3252
+ var _a, _b, _c, _d, _e, _f, _g;
3244
3253
  const foundZone = zonesOptionList.find(({ value }) => value === (banner === null || banner === void 0 ? void 0 : banner.bannerZone));
3245
3254
  return {
3246
- link: (_a = banner === null || banner === void 0 ? void 0 : banner.link) !== null && _a !== void 0 ? _a : '',
3255
+ priority: (_a = banner === null || banner === void 0 ? void 0 : banner.priority) !== null && _a !== void 0 ? _a : 1,
3256
+ link: (_b = banner === null || banner === void 0 ? void 0 : banner.link) !== null && _b !== void 0 ? _b : '',
3247
3257
  image: (banner === null || banner === void 0 ? void 0 : banner.image) ? { id: createId(), file: banner.image } : null,
3248
3258
  bannerZone: foundZone !== null && foundZone !== void 0 ? foundZone : null,
3249
- openNewTab: (_b = banner === null || banner === void 0 ? void 0 : banner.openNewTab) !== null && _b !== void 0 ? _b : false,
3250
- dateStart: (_c = banner === null || banner === void 0 ? void 0 : banner.dateStart) !== null && _c !== void 0 ? _c : '',
3251
- dateEnd: (_d = banner === null || banner === void 0 ? void 0 : banner.dateEnd) !== null && _d !== void 0 ? _d : '',
3252
- disabled: (_e = banner === null || banner === void 0 ? void 0 : banner.disabled) !== null && _e !== void 0 ? _e : false,
3253
- comment: (_f = banner === null || banner === void 0 ? void 0 : banner.comment) !== null && _f !== void 0 ? _f : '',
3259
+ openNewTab: (_c = banner === null || banner === void 0 ? void 0 : banner.openNewTab) !== null && _c !== void 0 ? _c : false,
3260
+ dateStart: (_d = banner === null || banner === void 0 ? void 0 : banner.dateStart) !== null && _d !== void 0 ? _d : '',
3261
+ dateEnd: (_e = banner === null || banner === void 0 ? void 0 : banner.dateEnd) !== null && _e !== void 0 ? _e : '',
3262
+ disabled: (_f = banner === null || banner === void 0 ? void 0 : banner.disabled) !== null && _f !== void 0 ? _f : false,
3263
+ comment: (_g = banner === null || banner === void 0 ? void 0 : banner.comment) !== null && _g !== void 0 ? _g : '',
3254
3264
  };
3255
3265
  }
3256
3266
  function convertBannerFormValuesToPayload(values) {
3257
3267
  var _a, _b, _c, _d;
3258
- return Object.assign(Object.assign({}, values), { image: (_b = (_a = values.image) === null || _a === void 0 ? void 0 : _a.file.id) !== null && _b !== void 0 ? _b : null, bannerZone: (_d = (_c = values.bannerZone) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '' });
3268
+ return Object.assign(Object.assign({}, values), { priority: values.priority ? Number(values.priority) : 1, dateStart: values.dateStart ? values.dateStart : null, dateEnd: values.dateEnd ? values.dateEnd : null, image: (_b = (_a = values.image) === null || _a === void 0 ? void 0 : _a.file.id) !== null && _b !== void 0 ? _b : null, bannerZone: (_d = (_c = values.bannerZone) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '' });
3259
3269
  }
3260
3270
 
3261
3271
  var script$2 = defineComponent({
@@ -3370,67 +3380,43 @@ var __vue_render__$2 = function () {
3370
3380
  },
3371
3381
  },
3372
3382
  [
3373
- _c("form-field-select", {
3374
- attrs: {
3375
- name: "bannerZone",
3376
- label: _vm.$t("banners:zone"),
3377
- options: _vm.zonesOptionList,
3378
- error: _vm.errors.bannerZone,
3379
- },
3380
- model: {
3381
- value: _vm.values.bannerZone,
3382
- callback: function ($$v) {
3383
- _vm.$set(_vm.values, "bannerZone", $$v);
3384
- },
3385
- expression: "values.bannerZone",
3386
- },
3387
- }),
3388
- _vm._v(" "),
3389
- _c("form-field-file-input", {
3390
- attrs: {
3391
- name: "image",
3392
- "file-type": "image",
3393
- label: _vm.$t("banners:image"),
3394
- error: _vm.errors.file,
3395
- },
3396
- model: {
3397
- value: _vm.values.image,
3398
- callback: function ($$v) {
3399
- _vm.$set(_vm.values, "image", $$v);
3400
- },
3401
- expression: "values.image",
3402
- },
3403
- }),
3404
- _vm._v(" "),
3405
- _c("form-field", {
3406
- attrs: {
3407
- name: "link",
3408
- label: _vm.$t("banners:link"),
3409
- error: _vm.errors.name,
3410
- },
3411
- model: {
3412
- value: _vm.values.link,
3413
- callback: function ($$v) {
3414
- _vm.$set(_vm.values, "link", $$v);
3415
- },
3416
- expression: "values.link",
3417
- },
3418
- }),
3419
- _vm._v(" "),
3420
- _c("form-field-checkbox", {
3421
- attrs: {
3422
- name: "openNewTab",
3423
- label: _vm.$t("banners:openNewTab"),
3424
- error: _vm.errors.openNewTab,
3425
- },
3426
- model: {
3427
- value: _vm.values.openNewTab,
3428
- callback: function ($$v) {
3429
- _vm.$set(_vm.values, "openNewTab", $$v);
3430
- },
3431
- expression: "values.openNewTab",
3432
- },
3433
- }),
3383
+ _c(
3384
+ "div",
3385
+ { staticClass: "zone" },
3386
+ [
3387
+ _c("form-field-select", {
3388
+ attrs: {
3389
+ name: "bannerZone",
3390
+ label: _vm.$t("banners:zone"),
3391
+ options: _vm.zonesOptionList,
3392
+ error: _vm.errors.bannerZone,
3393
+ },
3394
+ model: {
3395
+ value: _vm.values.bannerZone,
3396
+ callback: function ($$v) {
3397
+ _vm.$set(_vm.values, "bannerZone", $$v);
3398
+ },
3399
+ expression: "values.bannerZone",
3400
+ },
3401
+ }),
3402
+ _vm._v(" "),
3403
+ _c("form-field", {
3404
+ attrs: {
3405
+ name: "priority",
3406
+ label: _vm.$t("banners:priority"),
3407
+ error: _vm.errors.priority,
3408
+ },
3409
+ model: {
3410
+ value: _vm.values.priority,
3411
+ callback: function ($$v) {
3412
+ _vm.$set(_vm.values, "priority", $$v);
3413
+ },
3414
+ expression: "values.priority",
3415
+ },
3416
+ }),
3417
+ ],
3418
+ 1
3419
+ ),
3434
3420
  _vm._v(" "),
3435
3421
  _c("input-label", [_vm._v(_vm._s(_vm.$t("banners:period")))]),
3436
3422
  _vm._v(" "),
@@ -3488,6 +3474,59 @@ var __vue_render__$2 = function () {
3488
3474
  },
3489
3475
  }),
3490
3476
  _vm._v(" "),
3477
+ _c(
3478
+ "div",
3479
+ { staticClass: "link" },
3480
+ [
3481
+ _c("form-field", {
3482
+ attrs: {
3483
+ name: "link",
3484
+ label: _vm.$t("banners:link"),
3485
+ error: _vm.errors.name,
3486
+ },
3487
+ model: {
3488
+ value: _vm.values.link,
3489
+ callback: function ($$v) {
3490
+ _vm.$set(_vm.values, "link", $$v);
3491
+ },
3492
+ expression: "values.link",
3493
+ },
3494
+ }),
3495
+ _vm._v(" "),
3496
+ _c("form-field-checkbox", {
3497
+ attrs: {
3498
+ name: "openNewTab",
3499
+ label: _vm.$t("banners:openNewTab"),
3500
+ error: _vm.errors.openNewTab,
3501
+ },
3502
+ model: {
3503
+ value: _vm.values.openNewTab,
3504
+ callback: function ($$v) {
3505
+ _vm.$set(_vm.values, "openNewTab", $$v);
3506
+ },
3507
+ expression: "values.openNewTab",
3508
+ },
3509
+ }),
3510
+ ],
3511
+ 1
3512
+ ),
3513
+ _vm._v(" "),
3514
+ _c("form-field-file-input", {
3515
+ attrs: {
3516
+ name: "image",
3517
+ "file-type": "image",
3518
+ label: _vm.$t("banners:image"),
3519
+ error: _vm.errors.file,
3520
+ },
3521
+ model: {
3522
+ value: _vm.values.image,
3523
+ callback: function ($$v) {
3524
+ _vm.$set(_vm.values, "image", $$v);
3525
+ },
3526
+ expression: "values.image",
3527
+ },
3528
+ }),
3529
+ _vm._v(" "),
3491
3530
  _c("form-field", {
3492
3531
  attrs: {
3493
3532
  name: "comment",
@@ -3536,7 +3575,7 @@ __vue_render__$2._withStripped = true;
3536
3575
  /* style */
3537
3576
  const __vue_inject_styles__$2 = function (inject) {
3538
3577
  if (!inject) return
3539
- inject("data-v-60ad1218_0", { source: ".date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n\n/*# sourceMappingURL=BannerForm.vue.map */", map: {"version":3,"sources":["/home/runner/work/tager-admin-banners/tager-admin-banners/src/views/Banners/BannerForm/BannerForm.vue","BannerForm.vue"],"names":[],"mappings":"AAsOA;EACA,aAAA;EACA,qCAAA;EACA,gBAAA;ACrOA;;AAEA,yCAAyC","file":"BannerForm.vue","sourcesContent":["<template>\n <page\n :title=\"\n isCreation ? $t('banners:createBanner') : $t('banners:updateBanner')\n \"\n :is-content-loading=\"isContentLoading\"\n >\n <template v-slot:content>\n <form novalidate @submit.prevent=\"submitForm\">\n <form-field-select\n v-model=\"values.bannerZone\"\n name=\"bannerZone\"\n :label=\"$t('banners:zone')\"\n :options=\"zonesOptionList\"\n :error=\"errors.bannerZone\"\n />\n\n <form-field-file-input\n v-model=\"values.image\"\n name=\"image\"\n file-type=\"image\"\n :label=\"$t('banners:image')\"\n :error=\"errors.file\"\n />\n\n <form-field\n v-model=\"values.link\"\n name=\"link\"\n :label=\"$t('banners:link')\"\n :error=\"errors.name\"\n />\n\n <form-field-checkbox\n v-model=\"values.openNewTab\"\n name=\"openNewTab\"\n :label=\"$t('banners:openNewTab')\"\n :error=\"errors.openNewTab\"\n />\n\n <input-label>{{ $t('banners:period') }}</input-label>\n\n <div class=\"date\">\n <form-field\n v-model=\"values.dateStart\"\n :label=\"$t('banners:from')\"\n name=\"dateStart\"\n type=\"date\"\n :max=\"values.dateEnd\"\n />\n\n <form-field\n v-model=\"values.dateEnd\"\n :label=\"$t('banners:to')\"\n name=\"dateEnd\"\n type=\"date\"\n :min=\"values.dateStart\"\n />\n </div>\n\n <form-field-checkbox\n v-model=\"values.disabled\"\n name=\"disabled\"\n :label=\"$t('banners:disabled')\"\n :error=\"errors.disabled\"\n />\n\n <form-field\n v-model=\"values.comment\"\n name=\"comment\"\n type=\"textarea\"\n :label=\"$t('banners:comment')\"\n :error=\"errors.comment\"\n />\n </form>\n </template>\n\n <template v-slot:footer>\n <FormFooter\n :back-href=\"bannerListUrl\"\n :on-submit=\"submitForm\"\n :is-submitting=\"isSubmitting\"\n :is-creation=\"isCreation\"\n :can-create-another=\"isCreation\"\n />\n </template>\n </page>\n</template>\n\n<script lang=\"ts\">\nimport {\n computed,\n defineComponent,\n ref,\n SetupContext,\n watch,\n} from '@vue/composition-api';\n\nimport { FormFooter, OptionType, TagerFormSubmitEvent } from '@tager/admin-ui';\nimport { convertRequestErrorToMap } from '@tager/admin-services';\n\nimport { useFetchZones } from '../../../hooks';\nimport { BannerFormValues } from '../../../typings/banners';\nimport { useFetchBanner } from '../../../hooks/useFetchBanner';\nimport {\n getBannersBannerFormUrl,\n getBannersBannerListUrl,\n} from '../../../constants/paths';\nimport { createBanner, updateBanner } from '../../../services/requests';\n\nimport {\n convertBannerFormValuesToPayload,\n convertBannerToFormValues,\n} from './BannerForm.helpers';\n\nexport default defineComponent({\n name: 'BannerForm',\n components: { FormFooter },\n setup(props, context: SetupContext) {\n const bannerId = computed<string>(\n () => context.root.$route.params.bannerId\n );\n const isCreation = computed<boolean>(() => bannerId.value === 'create');\n\n /** Zones **/\n\n const { data: zones, loading: isZonesLoading } = useFetchZones({ context });\n\n const zonesOptionList = computed<OptionType[]>(() =>\n zones.value.map<OptionType>((zone) => ({\n value: zone.id,\n label: zone.name,\n }))\n );\n\n /** Banner **/\n\n const { data: banner, loading: isBannerLoading } = useFetchBanner({\n context,\n bannerId,\n isCreation,\n });\n\n /** Form State **/\n\n const isSubmitting = ref<boolean>(false);\n const values = ref<BannerFormValues>(\n convertBannerToFormValues(banner.value, zonesOptionList.value)\n );\n const errors = ref<Record<string, string>>({});\n\n watch([banner, zones], () => {\n values.value = convertBannerToFormValues(\n banner.value,\n zonesOptionList.value\n );\n });\n\n const submitForm = (event: TagerFormSubmitEvent) => {\n isSubmitting.value = true;\n\n const body = convertBannerFormValuesToPayload(values.value);\n\n const requestPromise = isCreation.value\n ? createBanner(body)\n : updateBanner(bannerId.value, body);\n\n requestPromise\n .then(({ data }) => {\n errors.value = {};\n\n if (event.type === 'create') {\n context.root.$router.push(\n getBannersBannerFormUrl({ bannerId: String(data.id) })\n );\n }\n\n if (event.type === 'create_exit' || event.type === 'save_exit') {\n context.root.$router.push(getBannersBannerListUrl());\n }\n\n if (event.type === 'create_create-another') {\n values.value = convertBannerToFormValues(\n null,\n zonesOptionList.value\n );\n }\n\n context.root.$toast({\n variant: 'success',\n title: context.root.$t('banners:success'),\n body: isCreation.value\n ? context.root.$t('banners:bannerWasSuccessfullyCreated')\n : context.root.$t('banners:bannerWasSuccessfullyUpdated'),\n });\n })\n .catch((error) => {\n console.error(error);\n errors.value = convertRequestErrorToMap(error);\n context.root.$toast({\n variant: 'danger',\n title: context.root.$t('banners:error'),\n body: isCreation.value\n ? context.root.$t('banners:bannerCreationWasFailed')\n : context.root.$t('banners:bannerUpdateWasFailed'),\n });\n })\n .finally(() => {\n isSubmitting.value = false;\n });\n };\n\n const isContentLoading = computed<boolean>(\n () => isBannerLoading.value || isZonesLoading.value\n );\n\n return {\n isCreation,\n isContentLoading,\n isSubmitting,\n values,\n errors,\n submitForm,\n bannerListUrl: getBannersBannerListUrl(),\n zonesOptionList,\n };\n },\n});\n</script>\n\n<style lang=\"scss\">\n.date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n</style>\n",".date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n\n/*# sourceMappingURL=BannerForm.vue.map */"]}, media: undefined });
3578
+ inject("data-v-6400fd96_0", { source: ".date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n.zone {\n display: flex;\n}\n.zone > *:first-child {\n flex: 1 1 1px;\n}\n.zone > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n}\n.link {\n display: flex;\n align-items: flex-end;\n}\n.link > *:first-child {\n flex: 1 1 1px;\n}\n.link > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n padding-bottom: 8px;\n}\n\n/*# sourceMappingURL=BannerForm.vue.map */", map: {"version":3,"sources":["/home/runner/work/tager-admin-banners/tager-admin-banners/src/views/Banners/BannerForm/BannerForm.vue","BannerForm.vue"],"names":[],"mappings":"AAiPA;EACA,aAAA;EACA,qCAAA;EACA,gBAAA;AChPA;ADmPA;EACA,aAAA;AChPA;ADkPA;EACA,aAAA;AChPA;ADmPA;EACA,eAAA;EACA,iBAAA;ACjPA;ADqPA;EACA,aAAA;EACA,qBAAA;AClPA;ADoPA;EACA,aAAA;AClPA;ADqPA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;ACnPA;;AAEA,yCAAyC","file":"BannerForm.vue","sourcesContent":["<template>\n <page\n :title=\"\n isCreation ? $t('banners:createBanner') : $t('banners:updateBanner')\n \"\n :is-content-loading=\"isContentLoading\"\n >\n <template v-slot:content>\n <form novalidate @submit.prevent=\"submitForm\">\n <div class=\"zone\">\n <form-field-select\n v-model=\"values.bannerZone\"\n name=\"bannerZone\"\n :label=\"$t('banners:zone')\"\n :options=\"zonesOptionList\"\n :error=\"errors.bannerZone\"\n />\n\n <form-field\n v-model=\"values.priority\"\n name=\"priority\"\n :label=\"$t('banners:priority')\"\n :error=\"errors.priority\"\n />\n </div>\n\n <input-label>{{ $t('banners:period') }}</input-label>\n\n <div class=\"date\">\n <form-field\n v-model=\"values.dateStart\"\n :label=\"$t('banners:from')\"\n name=\"dateStart\"\n type=\"date\"\n :max=\"values.dateEnd\"\n />\n\n <form-field\n v-model=\"values.dateEnd\"\n :label=\"$t('banners:to')\"\n name=\"dateEnd\"\n type=\"date\"\n :min=\"values.dateStart\"\n />\n </div>\n\n <form-field-checkbox\n v-model=\"values.disabled\"\n name=\"disabled\"\n :label=\"$t('banners:disabled')\"\n :error=\"errors.disabled\"\n />\n\n <div class=\"link\">\n <form-field\n v-model=\"values.link\"\n name=\"link\"\n :label=\"$t('banners:link')\"\n :error=\"errors.name\"\n />\n\n <form-field-checkbox\n v-model=\"values.openNewTab\"\n name=\"openNewTab\"\n :label=\"$t('banners:openNewTab')\"\n :error=\"errors.openNewTab\"\n />\n </div>\n\n <form-field-file-input\n v-model=\"values.image\"\n name=\"image\"\n file-type=\"image\"\n :label=\"$t('banners:image')\"\n :error=\"errors.file\"\n />\n\n <form-field\n v-model=\"values.comment\"\n name=\"comment\"\n type=\"textarea\"\n :label=\"$t('banners:comment')\"\n :error=\"errors.comment\"\n />\n </form>\n </template>\n\n <template v-slot:footer>\n <FormFooter\n :back-href=\"bannerListUrl\"\n :on-submit=\"submitForm\"\n :is-submitting=\"isSubmitting\"\n :is-creation=\"isCreation\"\n :can-create-another=\"isCreation\"\n />\n </template>\n </page>\n</template>\n\n<script lang=\"ts\">\nimport {\n computed,\n defineComponent,\n ref,\n SetupContext,\n watch,\n} from '@vue/composition-api';\n\nimport {FormFooter, OptionType, TagerFormSubmitEvent} from '@tager/admin-ui';\nimport {convertRequestErrorToMap} from '@tager/admin-services';\n\nimport {useFetchZones} from '../../../hooks';\nimport {BannerFormValues} from '../../../typings/banners';\nimport {useFetchBanner} from '../../../hooks/useFetchBanner';\nimport {\n getBannersBannerFormUrl,\n getBannersBannerListUrl,\n} from '../../../constants/paths';\nimport {createBanner, updateBanner} from '../../../services/requests';\n\nimport {\n convertBannerFormValuesToPayload,\n convertBannerToFormValues,\n} from './BannerForm.helpers';\n\nexport default defineComponent({\n name: 'BannerForm',\n components: {FormFooter},\n setup(props, context: SetupContext) {\n const bannerId = computed<string>(\n () => context.root.$route.params.bannerId\n );\n const isCreation = computed<boolean>(() => bannerId.value === 'create');\n\n /** Zones **/\n\n const {data: zones, loading: isZonesLoading} = useFetchZones({context});\n\n const zonesOptionList = computed<OptionType[]>(() =>\n zones.value.map<OptionType>((zone) => ({\n value: zone.id,\n label: zone.name,\n }))\n );\n\n /** Banner **/\n\n const {data: banner, loading: isBannerLoading} = useFetchBanner({\n context,\n bannerId,\n isCreation,\n });\n\n /** Form State **/\n\n const isSubmitting = ref<boolean>(false);\n const values = ref<BannerFormValues>(\n convertBannerToFormValues(banner.value, zonesOptionList.value)\n );\n const errors = ref<Record<string, string>>({});\n\n watch([banner, zones], () => {\n values.value = convertBannerToFormValues(\n banner.value,\n zonesOptionList.value\n );\n });\n\n const submitForm = (event: TagerFormSubmitEvent) => {\n isSubmitting.value = true;\n\n const body = convertBannerFormValuesToPayload(values.value);\n\n const requestPromise = isCreation.value\n ? createBanner(body)\n : updateBanner(bannerId.value, body);\n\n requestPromise\n .then(({data}) => {\n errors.value = {};\n\n if (event.type === 'create') {\n context.root.$router.push(\n getBannersBannerFormUrl({bannerId: String(data.id)})\n );\n }\n\n if (event.type === 'create_exit' || event.type === 'save_exit') {\n context.root.$router.push(getBannersBannerListUrl());\n }\n\n if (event.type === 'create_create-another') {\n values.value = convertBannerToFormValues(\n null,\n zonesOptionList.value\n );\n }\n\n context.root.$toast({\n variant: 'success',\n title: context.root.$t('banners:success'),\n body: isCreation.value\n ? context.root.$t('banners:bannerWasSuccessfullyCreated')\n : context.root.$t('banners:bannerWasSuccessfullyUpdated'),\n });\n })\n .catch((error) => {\n console.error(error);\n errors.value = convertRequestErrorToMap(error);\n context.root.$toast({\n variant: 'danger',\n title: context.root.$t('banners:error'),\n body: isCreation.value\n ? context.root.$t('banners:bannerCreationWasFailed')\n : context.root.$t('banners:bannerUpdateWasFailed'),\n });\n })\n .finally(() => {\n isSubmitting.value = false;\n });\n };\n\n const isContentLoading = computed<boolean>(\n () => isBannerLoading.value || isZonesLoading.value\n );\n\n return {\n isCreation,\n isContentLoading,\n isSubmitting,\n values,\n errors,\n submitForm,\n bannerListUrl: getBannersBannerListUrl(),\n zonesOptionList,\n };\n },\n});\n</script>\n\n<style lang=\"scss\">\n.date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n\n.zone {\n display: flex;\n\n > *:first-child {\n flex: 1 1 1px;\n }\n\n > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n }\n}\n\n.link {\n display: flex;\n align-items: flex-end;\n\n > *:first-child {\n flex: 1 1 1px;\n }\n\n > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n padding-bottom: 8px;\n }\n}\n</style>\n",".date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n\n.zone {\n display: flex;\n}\n.zone > *:first-child {\n flex: 1 1 1px;\n}\n.zone > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n}\n\n.link {\n display: flex;\n align-items: flex-end;\n}\n.link > *:first-child {\n flex: 1 1 1px;\n}\n.link > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n padding-bottom: 8px;\n}\n\n/*# sourceMappingURL=BannerForm.vue.map */"]}, media: undefined });
3540
3579
 
3541
3580
  };
3542
3581
  /* scoped */
package/dist/index.umd.js CHANGED
@@ -30,6 +30,7 @@
30
30
  actions: 'actions',
31
31
  date: 'Date',
32
32
  name: 'Name',
33
+ priority: 'Priority',
33
34
  success: 'Success',
34
35
  error: 'Error',
35
36
  statuses: {
@@ -70,6 +71,7 @@
70
71
  actions: 'Действия',
71
72
  date: 'Дата',
72
73
  name: 'Название',
74
+ priority: 'Приоритет',
73
75
  success: 'Успех',
74
76
  error: 'Ошибка',
75
77
  statuses: {
@@ -2782,18 +2784,25 @@
2782
2784
  },
2783
2785
  {
2784
2786
  id: 3,
2787
+ name: t('banners:priority'),
2788
+ field: 'priority',
2789
+ style: { width: '100px', textAlign: 'center' },
2790
+ headStyle: { width: '100px', textAlign: 'center' },
2791
+ },
2792
+ {
2793
+ id: 4,
2785
2794
  name: t('banners:period'),
2786
2795
  field: 'dateStart',
2787
2796
  format: ({ row }) => `${row.dateStart ? `${t('banners:from')} ${row.dateStart}` : ''} ${row.dateEnd ? `${t('banners:to')} ${row.dateEnd}` : ''}`,
2788
2797
  },
2789
2798
  {
2790
- id: 4,
2799
+ id: 5,
2791
2800
  name: t('banners:image'),
2792
2801
  field: 'image',
2793
2802
  type: 'image',
2794
2803
  },
2795
2804
  {
2796
- id: 5,
2805
+ id: 6,
2797
2806
  name: t('banners:link'),
2798
2807
  field: 'link',
2799
2808
  type: 'name',
@@ -2817,12 +2826,12 @@
2817
2826
  },
2818
2827
  },
2819
2828
  {
2820
- id: 6,
2829
+ id: 7,
2821
2830
  name: t('banners:comment'),
2822
2831
  field: 'comment',
2823
2832
  },
2824
2833
  {
2825
- id: 7,
2834
+ id: 8,
2826
2835
  name: t('banners:actions'),
2827
2836
  field: 'actions',
2828
2837
  style: { whiteSpace: 'nowrap', width: '100px' },
@@ -3241,22 +3250,23 @@
3241
3250
  }
3242
3251
 
3243
3252
  function convertBannerToFormValues(banner, zonesOptionList) {
3244
- var _a, _b, _c, _d, _e, _f;
3253
+ var _a, _b, _c, _d, _e, _f, _g;
3245
3254
  const foundZone = zonesOptionList.find(({ value }) => value === (banner === null || banner === void 0 ? void 0 : banner.bannerZone));
3246
3255
  return {
3247
- link: (_a = banner === null || banner === void 0 ? void 0 : banner.link) !== null && _a !== void 0 ? _a : '',
3256
+ priority: (_a = banner === null || banner === void 0 ? void 0 : banner.priority) !== null && _a !== void 0 ? _a : 1,
3257
+ link: (_b = banner === null || banner === void 0 ? void 0 : banner.link) !== null && _b !== void 0 ? _b : '',
3248
3258
  image: (banner === null || banner === void 0 ? void 0 : banner.image) ? { id: adminServices.createId(), file: banner.image } : null,
3249
3259
  bannerZone: foundZone !== null && foundZone !== void 0 ? foundZone : null,
3250
- openNewTab: (_b = banner === null || banner === void 0 ? void 0 : banner.openNewTab) !== null && _b !== void 0 ? _b : false,
3251
- dateStart: (_c = banner === null || banner === void 0 ? void 0 : banner.dateStart) !== null && _c !== void 0 ? _c : '',
3252
- dateEnd: (_d = banner === null || banner === void 0 ? void 0 : banner.dateEnd) !== null && _d !== void 0 ? _d : '',
3253
- disabled: (_e = banner === null || banner === void 0 ? void 0 : banner.disabled) !== null && _e !== void 0 ? _e : false,
3254
- comment: (_f = banner === null || banner === void 0 ? void 0 : banner.comment) !== null && _f !== void 0 ? _f : '',
3260
+ openNewTab: (_c = banner === null || banner === void 0 ? void 0 : banner.openNewTab) !== null && _c !== void 0 ? _c : false,
3261
+ dateStart: (_d = banner === null || banner === void 0 ? void 0 : banner.dateStart) !== null && _d !== void 0 ? _d : '',
3262
+ dateEnd: (_e = banner === null || banner === void 0 ? void 0 : banner.dateEnd) !== null && _e !== void 0 ? _e : '',
3263
+ disabled: (_f = banner === null || banner === void 0 ? void 0 : banner.disabled) !== null && _f !== void 0 ? _f : false,
3264
+ comment: (_g = banner === null || banner === void 0 ? void 0 : banner.comment) !== null && _g !== void 0 ? _g : '',
3255
3265
  };
3256
3266
  }
3257
3267
  function convertBannerFormValuesToPayload(values) {
3258
3268
  var _a, _b, _c, _d;
3259
- return Object.assign(Object.assign({}, values), { image: (_b = (_a = values.image) === null || _a === void 0 ? void 0 : _a.file.id) !== null && _b !== void 0 ? _b : null, bannerZone: (_d = (_c = values.bannerZone) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '' });
3269
+ return Object.assign(Object.assign({}, values), { priority: values.priority ? Number(values.priority) : 1, dateStart: values.dateStart ? values.dateStart : null, dateEnd: values.dateEnd ? values.dateEnd : null, image: (_b = (_a = values.image) === null || _a === void 0 ? void 0 : _a.file.id) !== null && _b !== void 0 ? _b : null, bannerZone: (_d = (_c = values.bannerZone) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '' });
3260
3270
  }
3261
3271
 
3262
3272
  var script$2 = compositionApi.defineComponent({
@@ -3371,67 +3381,43 @@
3371
3381
  },
3372
3382
  },
3373
3383
  [
3374
- _c("form-field-select", {
3375
- attrs: {
3376
- name: "bannerZone",
3377
- label: _vm.$t("banners:zone"),
3378
- options: _vm.zonesOptionList,
3379
- error: _vm.errors.bannerZone,
3380
- },
3381
- model: {
3382
- value: _vm.values.bannerZone,
3383
- callback: function ($$v) {
3384
- _vm.$set(_vm.values, "bannerZone", $$v);
3385
- },
3386
- expression: "values.bannerZone",
3387
- },
3388
- }),
3389
- _vm._v(" "),
3390
- _c("form-field-file-input", {
3391
- attrs: {
3392
- name: "image",
3393
- "file-type": "image",
3394
- label: _vm.$t("banners:image"),
3395
- error: _vm.errors.file,
3396
- },
3397
- model: {
3398
- value: _vm.values.image,
3399
- callback: function ($$v) {
3400
- _vm.$set(_vm.values, "image", $$v);
3401
- },
3402
- expression: "values.image",
3403
- },
3404
- }),
3405
- _vm._v(" "),
3406
- _c("form-field", {
3407
- attrs: {
3408
- name: "link",
3409
- label: _vm.$t("banners:link"),
3410
- error: _vm.errors.name,
3411
- },
3412
- model: {
3413
- value: _vm.values.link,
3414
- callback: function ($$v) {
3415
- _vm.$set(_vm.values, "link", $$v);
3416
- },
3417
- expression: "values.link",
3418
- },
3419
- }),
3420
- _vm._v(" "),
3421
- _c("form-field-checkbox", {
3422
- attrs: {
3423
- name: "openNewTab",
3424
- label: _vm.$t("banners:openNewTab"),
3425
- error: _vm.errors.openNewTab,
3426
- },
3427
- model: {
3428
- value: _vm.values.openNewTab,
3429
- callback: function ($$v) {
3430
- _vm.$set(_vm.values, "openNewTab", $$v);
3431
- },
3432
- expression: "values.openNewTab",
3433
- },
3434
- }),
3384
+ _c(
3385
+ "div",
3386
+ { staticClass: "zone" },
3387
+ [
3388
+ _c("form-field-select", {
3389
+ attrs: {
3390
+ name: "bannerZone",
3391
+ label: _vm.$t("banners:zone"),
3392
+ options: _vm.zonesOptionList,
3393
+ error: _vm.errors.bannerZone,
3394
+ },
3395
+ model: {
3396
+ value: _vm.values.bannerZone,
3397
+ callback: function ($$v) {
3398
+ _vm.$set(_vm.values, "bannerZone", $$v);
3399
+ },
3400
+ expression: "values.bannerZone",
3401
+ },
3402
+ }),
3403
+ _vm._v(" "),
3404
+ _c("form-field", {
3405
+ attrs: {
3406
+ name: "priority",
3407
+ label: _vm.$t("banners:priority"),
3408
+ error: _vm.errors.priority,
3409
+ },
3410
+ model: {
3411
+ value: _vm.values.priority,
3412
+ callback: function ($$v) {
3413
+ _vm.$set(_vm.values, "priority", $$v);
3414
+ },
3415
+ expression: "values.priority",
3416
+ },
3417
+ }),
3418
+ ],
3419
+ 1
3420
+ ),
3435
3421
  _vm._v(" "),
3436
3422
  _c("input-label", [_vm._v(_vm._s(_vm.$t("banners:period")))]),
3437
3423
  _vm._v(" "),
@@ -3489,6 +3475,59 @@
3489
3475
  },
3490
3476
  }),
3491
3477
  _vm._v(" "),
3478
+ _c(
3479
+ "div",
3480
+ { staticClass: "link" },
3481
+ [
3482
+ _c("form-field", {
3483
+ attrs: {
3484
+ name: "link",
3485
+ label: _vm.$t("banners:link"),
3486
+ error: _vm.errors.name,
3487
+ },
3488
+ model: {
3489
+ value: _vm.values.link,
3490
+ callback: function ($$v) {
3491
+ _vm.$set(_vm.values, "link", $$v);
3492
+ },
3493
+ expression: "values.link",
3494
+ },
3495
+ }),
3496
+ _vm._v(" "),
3497
+ _c("form-field-checkbox", {
3498
+ attrs: {
3499
+ name: "openNewTab",
3500
+ label: _vm.$t("banners:openNewTab"),
3501
+ error: _vm.errors.openNewTab,
3502
+ },
3503
+ model: {
3504
+ value: _vm.values.openNewTab,
3505
+ callback: function ($$v) {
3506
+ _vm.$set(_vm.values, "openNewTab", $$v);
3507
+ },
3508
+ expression: "values.openNewTab",
3509
+ },
3510
+ }),
3511
+ ],
3512
+ 1
3513
+ ),
3514
+ _vm._v(" "),
3515
+ _c("form-field-file-input", {
3516
+ attrs: {
3517
+ name: "image",
3518
+ "file-type": "image",
3519
+ label: _vm.$t("banners:image"),
3520
+ error: _vm.errors.file,
3521
+ },
3522
+ model: {
3523
+ value: _vm.values.image,
3524
+ callback: function ($$v) {
3525
+ _vm.$set(_vm.values, "image", $$v);
3526
+ },
3527
+ expression: "values.image",
3528
+ },
3529
+ }),
3530
+ _vm._v(" "),
3492
3531
  _c("form-field", {
3493
3532
  attrs: {
3494
3533
  name: "comment",
@@ -3537,7 +3576,7 @@
3537
3576
  /* style */
3538
3577
  const __vue_inject_styles__$2 = function (inject) {
3539
3578
  if (!inject) return
3540
- inject("data-v-60ad1218_0", { source: ".date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n\n/*# sourceMappingURL=BannerForm.vue.map */", map: {"version":3,"sources":["/home/runner/work/tager-admin-banners/tager-admin-banners/src/views/Banners/BannerForm/BannerForm.vue","BannerForm.vue"],"names":[],"mappings":"AAsOA;EACA,aAAA;EACA,qCAAA;EACA,gBAAA;ACrOA;;AAEA,yCAAyC","file":"BannerForm.vue","sourcesContent":["<template>\n <page\n :title=\"\n isCreation ? $t('banners:createBanner') : $t('banners:updateBanner')\n \"\n :is-content-loading=\"isContentLoading\"\n >\n <template v-slot:content>\n <form novalidate @submit.prevent=\"submitForm\">\n <form-field-select\n v-model=\"values.bannerZone\"\n name=\"bannerZone\"\n :label=\"$t('banners:zone')\"\n :options=\"zonesOptionList\"\n :error=\"errors.bannerZone\"\n />\n\n <form-field-file-input\n v-model=\"values.image\"\n name=\"image\"\n file-type=\"image\"\n :label=\"$t('banners:image')\"\n :error=\"errors.file\"\n />\n\n <form-field\n v-model=\"values.link\"\n name=\"link\"\n :label=\"$t('banners:link')\"\n :error=\"errors.name\"\n />\n\n <form-field-checkbox\n v-model=\"values.openNewTab\"\n name=\"openNewTab\"\n :label=\"$t('banners:openNewTab')\"\n :error=\"errors.openNewTab\"\n />\n\n <input-label>{{ $t('banners:period') }}</input-label>\n\n <div class=\"date\">\n <form-field\n v-model=\"values.dateStart\"\n :label=\"$t('banners:from')\"\n name=\"dateStart\"\n type=\"date\"\n :max=\"values.dateEnd\"\n />\n\n <form-field\n v-model=\"values.dateEnd\"\n :label=\"$t('banners:to')\"\n name=\"dateEnd\"\n type=\"date\"\n :min=\"values.dateStart\"\n />\n </div>\n\n <form-field-checkbox\n v-model=\"values.disabled\"\n name=\"disabled\"\n :label=\"$t('banners:disabled')\"\n :error=\"errors.disabled\"\n />\n\n <form-field\n v-model=\"values.comment\"\n name=\"comment\"\n type=\"textarea\"\n :label=\"$t('banners:comment')\"\n :error=\"errors.comment\"\n />\n </form>\n </template>\n\n <template v-slot:footer>\n <FormFooter\n :back-href=\"bannerListUrl\"\n :on-submit=\"submitForm\"\n :is-submitting=\"isSubmitting\"\n :is-creation=\"isCreation\"\n :can-create-another=\"isCreation\"\n />\n </template>\n </page>\n</template>\n\n<script lang=\"ts\">\nimport {\n computed,\n defineComponent,\n ref,\n SetupContext,\n watch,\n} from '@vue/composition-api';\n\nimport { FormFooter, OptionType, TagerFormSubmitEvent } from '@tager/admin-ui';\nimport { convertRequestErrorToMap } from '@tager/admin-services';\n\nimport { useFetchZones } from '../../../hooks';\nimport { BannerFormValues } from '../../../typings/banners';\nimport { useFetchBanner } from '../../../hooks/useFetchBanner';\nimport {\n getBannersBannerFormUrl,\n getBannersBannerListUrl,\n} from '../../../constants/paths';\nimport { createBanner, updateBanner } from '../../../services/requests';\n\nimport {\n convertBannerFormValuesToPayload,\n convertBannerToFormValues,\n} from './BannerForm.helpers';\n\nexport default defineComponent({\n name: 'BannerForm',\n components: { FormFooter },\n setup(props, context: SetupContext) {\n const bannerId = computed<string>(\n () => context.root.$route.params.bannerId\n );\n const isCreation = computed<boolean>(() => bannerId.value === 'create');\n\n /** Zones **/\n\n const { data: zones, loading: isZonesLoading } = useFetchZones({ context });\n\n const zonesOptionList = computed<OptionType[]>(() =>\n zones.value.map<OptionType>((zone) => ({\n value: zone.id,\n label: zone.name,\n }))\n );\n\n /** Banner **/\n\n const { data: banner, loading: isBannerLoading } = useFetchBanner({\n context,\n bannerId,\n isCreation,\n });\n\n /** Form State **/\n\n const isSubmitting = ref<boolean>(false);\n const values = ref<BannerFormValues>(\n convertBannerToFormValues(banner.value, zonesOptionList.value)\n );\n const errors = ref<Record<string, string>>({});\n\n watch([banner, zones], () => {\n values.value = convertBannerToFormValues(\n banner.value,\n zonesOptionList.value\n );\n });\n\n const submitForm = (event: TagerFormSubmitEvent) => {\n isSubmitting.value = true;\n\n const body = convertBannerFormValuesToPayload(values.value);\n\n const requestPromise = isCreation.value\n ? createBanner(body)\n : updateBanner(bannerId.value, body);\n\n requestPromise\n .then(({ data }) => {\n errors.value = {};\n\n if (event.type === 'create') {\n context.root.$router.push(\n getBannersBannerFormUrl({ bannerId: String(data.id) })\n );\n }\n\n if (event.type === 'create_exit' || event.type === 'save_exit') {\n context.root.$router.push(getBannersBannerListUrl());\n }\n\n if (event.type === 'create_create-another') {\n values.value = convertBannerToFormValues(\n null,\n zonesOptionList.value\n );\n }\n\n context.root.$toast({\n variant: 'success',\n title: context.root.$t('banners:success'),\n body: isCreation.value\n ? context.root.$t('banners:bannerWasSuccessfullyCreated')\n : context.root.$t('banners:bannerWasSuccessfullyUpdated'),\n });\n })\n .catch((error) => {\n console.error(error);\n errors.value = convertRequestErrorToMap(error);\n context.root.$toast({\n variant: 'danger',\n title: context.root.$t('banners:error'),\n body: isCreation.value\n ? context.root.$t('banners:bannerCreationWasFailed')\n : context.root.$t('banners:bannerUpdateWasFailed'),\n });\n })\n .finally(() => {\n isSubmitting.value = false;\n });\n };\n\n const isContentLoading = computed<boolean>(\n () => isBannerLoading.value || isZonesLoading.value\n );\n\n return {\n isCreation,\n isContentLoading,\n isSubmitting,\n values,\n errors,\n submitForm,\n bannerListUrl: getBannersBannerListUrl(),\n zonesOptionList,\n };\n },\n});\n</script>\n\n<style lang=\"scss\">\n.date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n</style>\n",".date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n\n/*# sourceMappingURL=BannerForm.vue.map */"]}, media: undefined });
3579
+ inject("data-v-6400fd96_0", { source: ".date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n.zone {\n display: flex;\n}\n.zone > *:first-child {\n flex: 1 1 1px;\n}\n.zone > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n}\n.link {\n display: flex;\n align-items: flex-end;\n}\n.link > *:first-child {\n flex: 1 1 1px;\n}\n.link > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n padding-bottom: 8px;\n}\n\n/*# sourceMappingURL=BannerForm.vue.map */", map: {"version":3,"sources":["/home/runner/work/tager-admin-banners/tager-admin-banners/src/views/Banners/BannerForm/BannerForm.vue","BannerForm.vue"],"names":[],"mappings":"AAiPA;EACA,aAAA;EACA,qCAAA;EACA,gBAAA;AChPA;ADmPA;EACA,aAAA;AChPA;ADkPA;EACA,aAAA;AChPA;ADmPA;EACA,eAAA;EACA,iBAAA;ACjPA;ADqPA;EACA,aAAA;EACA,qBAAA;AClPA;ADoPA;EACA,aAAA;AClPA;ADqPA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;ACnPA;;AAEA,yCAAyC","file":"BannerForm.vue","sourcesContent":["<template>\n <page\n :title=\"\n isCreation ? $t('banners:createBanner') : $t('banners:updateBanner')\n \"\n :is-content-loading=\"isContentLoading\"\n >\n <template v-slot:content>\n <form novalidate @submit.prevent=\"submitForm\">\n <div class=\"zone\">\n <form-field-select\n v-model=\"values.bannerZone\"\n name=\"bannerZone\"\n :label=\"$t('banners:zone')\"\n :options=\"zonesOptionList\"\n :error=\"errors.bannerZone\"\n />\n\n <form-field\n v-model=\"values.priority\"\n name=\"priority\"\n :label=\"$t('banners:priority')\"\n :error=\"errors.priority\"\n />\n </div>\n\n <input-label>{{ $t('banners:period') }}</input-label>\n\n <div class=\"date\">\n <form-field\n v-model=\"values.dateStart\"\n :label=\"$t('banners:from')\"\n name=\"dateStart\"\n type=\"date\"\n :max=\"values.dateEnd\"\n />\n\n <form-field\n v-model=\"values.dateEnd\"\n :label=\"$t('banners:to')\"\n name=\"dateEnd\"\n type=\"date\"\n :min=\"values.dateStart\"\n />\n </div>\n\n <form-field-checkbox\n v-model=\"values.disabled\"\n name=\"disabled\"\n :label=\"$t('banners:disabled')\"\n :error=\"errors.disabled\"\n />\n\n <div class=\"link\">\n <form-field\n v-model=\"values.link\"\n name=\"link\"\n :label=\"$t('banners:link')\"\n :error=\"errors.name\"\n />\n\n <form-field-checkbox\n v-model=\"values.openNewTab\"\n name=\"openNewTab\"\n :label=\"$t('banners:openNewTab')\"\n :error=\"errors.openNewTab\"\n />\n </div>\n\n <form-field-file-input\n v-model=\"values.image\"\n name=\"image\"\n file-type=\"image\"\n :label=\"$t('banners:image')\"\n :error=\"errors.file\"\n />\n\n <form-field\n v-model=\"values.comment\"\n name=\"comment\"\n type=\"textarea\"\n :label=\"$t('banners:comment')\"\n :error=\"errors.comment\"\n />\n </form>\n </template>\n\n <template v-slot:footer>\n <FormFooter\n :back-href=\"bannerListUrl\"\n :on-submit=\"submitForm\"\n :is-submitting=\"isSubmitting\"\n :is-creation=\"isCreation\"\n :can-create-another=\"isCreation\"\n />\n </template>\n </page>\n</template>\n\n<script lang=\"ts\">\nimport {\n computed,\n defineComponent,\n ref,\n SetupContext,\n watch,\n} from '@vue/composition-api';\n\nimport {FormFooter, OptionType, TagerFormSubmitEvent} from '@tager/admin-ui';\nimport {convertRequestErrorToMap} from '@tager/admin-services';\n\nimport {useFetchZones} from '../../../hooks';\nimport {BannerFormValues} from '../../../typings/banners';\nimport {useFetchBanner} from '../../../hooks/useFetchBanner';\nimport {\n getBannersBannerFormUrl,\n getBannersBannerListUrl,\n} from '../../../constants/paths';\nimport {createBanner, updateBanner} from '../../../services/requests';\n\nimport {\n convertBannerFormValuesToPayload,\n convertBannerToFormValues,\n} from './BannerForm.helpers';\n\nexport default defineComponent({\n name: 'BannerForm',\n components: {FormFooter},\n setup(props, context: SetupContext) {\n const bannerId = computed<string>(\n () => context.root.$route.params.bannerId\n );\n const isCreation = computed<boolean>(() => bannerId.value === 'create');\n\n /** Zones **/\n\n const {data: zones, loading: isZonesLoading} = useFetchZones({context});\n\n const zonesOptionList = computed<OptionType[]>(() =>\n zones.value.map<OptionType>((zone) => ({\n value: zone.id,\n label: zone.name,\n }))\n );\n\n /** Banner **/\n\n const {data: banner, loading: isBannerLoading} = useFetchBanner({\n context,\n bannerId,\n isCreation,\n });\n\n /** Form State **/\n\n const isSubmitting = ref<boolean>(false);\n const values = ref<BannerFormValues>(\n convertBannerToFormValues(banner.value, zonesOptionList.value)\n );\n const errors = ref<Record<string, string>>({});\n\n watch([banner, zones], () => {\n values.value = convertBannerToFormValues(\n banner.value,\n zonesOptionList.value\n );\n });\n\n const submitForm = (event: TagerFormSubmitEvent) => {\n isSubmitting.value = true;\n\n const body = convertBannerFormValuesToPayload(values.value);\n\n const requestPromise = isCreation.value\n ? createBanner(body)\n : updateBanner(bannerId.value, body);\n\n requestPromise\n .then(({data}) => {\n errors.value = {};\n\n if (event.type === 'create') {\n context.root.$router.push(\n getBannersBannerFormUrl({bannerId: String(data.id)})\n );\n }\n\n if (event.type === 'create_exit' || event.type === 'save_exit') {\n context.root.$router.push(getBannersBannerListUrl());\n }\n\n if (event.type === 'create_create-another') {\n values.value = convertBannerToFormValues(\n null,\n zonesOptionList.value\n );\n }\n\n context.root.$toast({\n variant: 'success',\n title: context.root.$t('banners:success'),\n body: isCreation.value\n ? context.root.$t('banners:bannerWasSuccessfullyCreated')\n : context.root.$t('banners:bannerWasSuccessfullyUpdated'),\n });\n })\n .catch((error) => {\n console.error(error);\n errors.value = convertRequestErrorToMap(error);\n context.root.$toast({\n variant: 'danger',\n title: context.root.$t('banners:error'),\n body: isCreation.value\n ? context.root.$t('banners:bannerCreationWasFailed')\n : context.root.$t('banners:bannerUpdateWasFailed'),\n });\n })\n .finally(() => {\n isSubmitting.value = false;\n });\n };\n\n const isContentLoading = computed<boolean>(\n () => isBannerLoading.value || isZonesLoading.value\n );\n\n return {\n isCreation,\n isContentLoading,\n isSubmitting,\n values,\n errors,\n submitForm,\n bannerListUrl: getBannersBannerListUrl(),\n zonesOptionList,\n };\n },\n});\n</script>\n\n<style lang=\"scss\">\n.date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n\n.zone {\n display: flex;\n\n > *:first-child {\n flex: 1 1 1px;\n }\n\n > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n }\n}\n\n.link {\n display: flex;\n align-items: flex-end;\n\n > *:first-child {\n flex: 1 1 1px;\n }\n\n > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n padding-bottom: 8px;\n }\n}\n</style>\n",".date {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n column-gap: 10px;\n}\n\n.zone {\n display: flex;\n}\n.zone > *:first-child {\n flex: 1 1 1px;\n}\n.zone > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n}\n\n.link {\n display: flex;\n align-items: flex-end;\n}\n.link > *:first-child {\n flex: 1 1 1px;\n}\n.link > *:last-child {\n flex-basis: 30%;\n margin-left: 20px;\n padding-bottom: 8px;\n}\n\n/*# sourceMappingURL=BannerForm.vue.map */"]}, media: undefined });
3541
3580
 
3542
3581
  };
3543
3582
  /* scoped */
@@ -24,6 +24,7 @@ declare const EN: {
24
24
  actions: string;
25
25
  date: string;
26
26
  name: string;
27
+ priority: string;
27
28
  success: string;
28
29
  error: string;
29
30
  statuses: {
@@ -9,6 +9,7 @@ export declare enum Status {
9
9
  export interface Banner {
10
10
  id: number;
11
11
  status: Status;
12
+ priority: number;
12
13
  link: Nullable<string>;
13
14
  image: Nullable<FileType>;
14
15
  bannerZone: Nullable<string>;
@@ -22,6 +23,7 @@ export interface BannerFormValues {
22
23
  link: Nullable<string>;
23
24
  image: Nullable<SingleFileInputValueType>;
24
25
  bannerZone: Nullable<OptionType>;
26
+ priority: number;
25
27
  openNewTab: boolean;
26
28
  dateStart: string;
27
29
  dateEnd: string;
@@ -31,10 +33,11 @@ export interface BannerFormValues {
31
33
  export interface BannerPayload {
32
34
  link: Nullable<string>;
33
35
  image: Nullable<string>;
36
+ priority: number;
34
37
  bannerZone: string;
35
38
  openNewTab: boolean;
36
- dateStart: string;
37
- dateEnd: string;
39
+ dateStart: Nullable<string>;
40
+ dateEnd: Nullable<string>;
38
41
  disabled: boolean;
39
42
  comment: string;
40
43
  }
@@ -21,6 +21,7 @@ declare const _default: import("vue").ComponentOptions<import("vue").default, im
21
21
  label: string;
22
22
  disabled?: boolean | undefined;
23
23
  } | null;
24
+ priority: number;
24
25
  openNewTab: boolean;
25
26
  dateStart: string;
26
27
  dateEnd: string;
@@ -61,6 +62,7 @@ declare const _default: import("vue").ComponentOptions<import("vue").default, im
61
62
  label: string;
62
63
  disabled?: boolean | undefined;
63
64
  } | null;
65
+ priority: number;
64
66
  openNewTab: boolean;
65
67
  dateStart: string;
66
68
  dateEnd: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tager/admin-banners",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.umd.js",
6
6
  "module": "dist/index.esm.js",
package/src/locales/en.ts CHANGED
@@ -24,6 +24,7 @@ const EN = {
24
24
  actions: 'actions',
25
25
  date: 'Date',
26
26
  name: 'Name',
27
+ priority: 'Priority',
27
28
 
28
29
  success: 'Success',
29
30
  error: 'Error',
package/src/locales/ru.ts CHANGED
@@ -26,6 +26,7 @@ const RU: typeof EN = {
26
26
  actions: 'Действия',
27
27
  date: 'Дата',
28
28
  name: 'Название',
29
+ priority: 'Приоритет',
29
30
 
30
31
  success: 'Успех',
31
32
  error: 'Ошибка',
@@ -11,6 +11,7 @@ export enum Status {
11
11
  export interface Banner {
12
12
  id: number;
13
13
  status: Status;
14
+ priority: number;
14
15
  link: Nullable<string>;
15
16
  image: Nullable<FileType>;
16
17
  bannerZone: Nullable<string>;
@@ -25,6 +26,7 @@ export interface BannerFormValues {
25
26
  link: Nullable<string>;
26
27
  image: Nullable<SingleFileInputValueType>;
27
28
  bannerZone: Nullable<OptionType>;
29
+ priority: number;
28
30
  openNewTab: boolean;
29
31
  dateStart: string;
30
32
  dateEnd: string;
@@ -35,10 +37,11 @@ export interface BannerFormValues {
35
37
  export interface BannerPayload {
36
38
  link: Nullable<string>;
37
39
  image: Nullable<string>;
40
+ priority: number;
38
41
  bannerZone: string;
39
42
  openNewTab: boolean;
40
- dateStart: string;
41
- dateEnd: string;
43
+ dateStart: Nullable<string>;
44
+ dateEnd: Nullable<string>;
42
45
  disabled: boolean;
43
46
  comment: string;
44
47
  }
@@ -16,6 +16,7 @@ export function convertBannerToFormValues(
16
16
  );
17
17
 
18
18
  return {
19
+ priority: banner?.priority ?? 1,
19
20
  link: banner?.link ?? '',
20
21
  image: banner?.image ? { id: createId(), file: banner.image } : null,
21
22
  bannerZone: foundZone ?? null,
@@ -32,6 +33,9 @@ export function convertBannerFormValuesToPayload(
32
33
  ): BannerPayload {
33
34
  return {
34
35
  ...values,
36
+ priority: values.priority ? Number(values.priority) : 1,
37
+ dateStart: values.dateStart ? values.dateStart : null,
38
+ dateEnd: values.dateEnd ? values.dateEnd : null,
35
39
  image: values.image?.file.id ?? null,
36
40
  bannerZone: values.bannerZone?.value ?? '',
37
41
  };
@@ -1,86 +1,97 @@
1
1
  <template>
2
2
  <page
3
- :title="
3
+ :title="
4
4
  isCreation ? $t('banners:createBanner') : $t('banners:updateBanner')
5
5
  "
6
- :is-content-loading="isContentLoading"
6
+ :is-content-loading="isContentLoading"
7
7
  >
8
8
  <template v-slot:content>
9
9
  <form novalidate @submit.prevent="submitForm">
10
- <form-field-select
11
- v-model="values.bannerZone"
12
- name="bannerZone"
13
- :label="$t('banners:zone')"
14
- :options="zonesOptionList"
15
- :error="errors.bannerZone"
16
- />
17
-
18
- <form-field-file-input
19
- v-model="values.image"
20
- name="image"
21
- file-type="image"
22
- :label="$t('banners:image')"
23
- :error="errors.file"
24
- />
25
-
26
- <form-field
27
- v-model="values.link"
28
- name="link"
29
- :label="$t('banners:link')"
30
- :error="errors.name"
31
- />
10
+ <div class="zone">
11
+ <form-field-select
12
+ v-model="values.bannerZone"
13
+ name="bannerZone"
14
+ :label="$t('banners:zone')"
15
+ :options="zonesOptionList"
16
+ :error="errors.bannerZone"
17
+ />
32
18
 
33
- <form-field-checkbox
34
- v-model="values.openNewTab"
35
- name="openNewTab"
36
- :label="$t('banners:openNewTab')"
37
- :error="errors.openNewTab"
38
- />
19
+ <form-field
20
+ v-model="values.priority"
21
+ name="priority"
22
+ :label="$t('banners:priority')"
23
+ :error="errors.priority"
24
+ />
25
+ </div>
39
26
 
40
27
  <input-label>{{ $t('banners:period') }}</input-label>
41
28
 
42
29
  <div class="date">
43
30
  <form-field
44
- v-model="values.dateStart"
45
- :label="$t('banners:from')"
46
- name="dateStart"
47
- type="date"
48
- :max="values.dateEnd"
31
+ v-model="values.dateStart"
32
+ :label="$t('banners:from')"
33
+ name="dateStart"
34
+ type="date"
35
+ :max="values.dateEnd"
49
36
  />
50
37
 
51
38
  <form-field
52
- v-model="values.dateEnd"
53
- :label="$t('banners:to')"
54
- name="dateEnd"
55
- type="date"
56
- :min="values.dateStart"
39
+ v-model="values.dateEnd"
40
+ :label="$t('banners:to')"
41
+ name="dateEnd"
42
+ type="date"
43
+ :min="values.dateStart"
57
44
  />
58
45
  </div>
59
46
 
60
47
  <form-field-checkbox
61
- v-model="values.disabled"
62
- name="disabled"
63
- :label="$t('banners:disabled')"
64
- :error="errors.disabled"
48
+ v-model="values.disabled"
49
+ name="disabled"
50
+ :label="$t('banners:disabled')"
51
+ :error="errors.disabled"
52
+ />
53
+
54
+ <div class="link">
55
+ <form-field
56
+ v-model="values.link"
57
+ name="link"
58
+ :label="$t('banners:link')"
59
+ :error="errors.name"
60
+ />
61
+
62
+ <form-field-checkbox
63
+ v-model="values.openNewTab"
64
+ name="openNewTab"
65
+ :label="$t('banners:openNewTab')"
66
+ :error="errors.openNewTab"
67
+ />
68
+ </div>
69
+
70
+ <form-field-file-input
71
+ v-model="values.image"
72
+ name="image"
73
+ file-type="image"
74
+ :label="$t('banners:image')"
75
+ :error="errors.file"
65
76
  />
66
77
 
67
78
  <form-field
68
- v-model="values.comment"
69
- name="comment"
70
- type="textarea"
71
- :label="$t('banners:comment')"
72
- :error="errors.comment"
79
+ v-model="values.comment"
80
+ name="comment"
81
+ type="textarea"
82
+ :label="$t('banners:comment')"
83
+ :error="errors.comment"
73
84
  />
74
85
  </form>
75
86
  </template>
76
87
 
77
88
  <template v-slot:footer>
78
89
  <FormFooter
79
- :back-href="bannerListUrl"
80
- :on-submit="submitForm"
81
- :is-submitting="isSubmitting"
82
- :is-creation="isCreation"
83
- :can-create-another="isCreation"
90
+ :back-href="bannerListUrl"
91
+ :on-submit="submitForm"
92
+ :is-submitting="isSubmitting"
93
+ :is-creation="isCreation"
94
+ :can-create-another="isCreation"
84
95
  />
85
96
  </template>
86
97
  </page>
@@ -95,17 +106,17 @@ import {
95
106
  watch,
96
107
  } from '@vue/composition-api';
97
108
 
98
- import { FormFooter, OptionType, TagerFormSubmitEvent } from '@tager/admin-ui';
99
- import { convertRequestErrorToMap } from '@tager/admin-services';
109
+ import {FormFooter, OptionType, TagerFormSubmitEvent} from '@tager/admin-ui';
110
+ import {convertRequestErrorToMap} from '@tager/admin-services';
100
111
 
101
- import { useFetchZones } from '../../../hooks';
102
- import { BannerFormValues } from '../../../typings/banners';
103
- import { useFetchBanner } from '../../../hooks/useFetchBanner';
112
+ import {useFetchZones} from '../../../hooks';
113
+ import {BannerFormValues} from '../../../typings/banners';
114
+ import {useFetchBanner} from '../../../hooks/useFetchBanner';
104
115
  import {
105
116
  getBannersBannerFormUrl,
106
117
  getBannersBannerListUrl,
107
118
  } from '../../../constants/paths';
108
- import { createBanner, updateBanner } from '../../../services/requests';
119
+ import {createBanner, updateBanner} from '../../../services/requests';
109
120
 
110
121
  import {
111
122
  convertBannerFormValuesToPayload,
@@ -114,27 +125,27 @@ import {
114
125
 
115
126
  export default defineComponent({
116
127
  name: 'BannerForm',
117
- components: { FormFooter },
128
+ components: {FormFooter},
118
129
  setup(props, context: SetupContext) {
119
130
  const bannerId = computed<string>(
120
- () => context.root.$route.params.bannerId
131
+ () => context.root.$route.params.bannerId
121
132
  );
122
133
  const isCreation = computed<boolean>(() => bannerId.value === 'create');
123
134
 
124
135
  /** Zones **/
125
136
 
126
- const { data: zones, loading: isZonesLoading } = useFetchZones({ context });
137
+ const {data: zones, loading: isZonesLoading} = useFetchZones({context});
127
138
 
128
139
  const zonesOptionList = computed<OptionType[]>(() =>
129
- zones.value.map<OptionType>((zone) => ({
130
- value: zone.id,
131
- label: zone.name,
132
- }))
140
+ zones.value.map<OptionType>((zone) => ({
141
+ value: zone.id,
142
+ label: zone.name,
143
+ }))
133
144
  );
134
145
 
135
146
  /** Banner **/
136
147
 
137
- const { data: banner, loading: isBannerLoading } = useFetchBanner({
148
+ const {data: banner, loading: isBannerLoading} = useFetchBanner({
138
149
  context,
139
150
  bannerId,
140
151
  isCreation,
@@ -144,14 +155,14 @@ export default defineComponent({
144
155
 
145
156
  const isSubmitting = ref<boolean>(false);
146
157
  const values = ref<BannerFormValues>(
147
- convertBannerToFormValues(banner.value, zonesOptionList.value)
158
+ convertBannerToFormValues(banner.value, zonesOptionList.value)
148
159
  );
149
160
  const errors = ref<Record<string, string>>({});
150
161
 
151
162
  watch([banner, zones], () => {
152
163
  values.value = convertBannerToFormValues(
153
- banner.value,
154
- zonesOptionList.value
164
+ banner.value,
165
+ zonesOptionList.value
155
166
  );
156
167
  });
157
168
 
@@ -161,56 +172,56 @@ export default defineComponent({
161
172
  const body = convertBannerFormValuesToPayload(values.value);
162
173
 
163
174
  const requestPromise = isCreation.value
164
- ? createBanner(body)
165
- : updateBanner(bannerId.value, body);
175
+ ? createBanner(body)
176
+ : updateBanner(bannerId.value, body);
166
177
 
167
178
  requestPromise
168
- .then(({ data }) => {
169
- errors.value = {};
170
-
171
- if (event.type === 'create') {
172
- context.root.$router.push(
173
- getBannersBannerFormUrl({ bannerId: String(data.id) })
174
- );
175
- }
176
-
177
- if (event.type === 'create_exit' || event.type === 'save_exit') {
178
- context.root.$router.push(getBannersBannerListUrl());
179
- }
180
-
181
- if (event.type === 'create_create-another') {
182
- values.value = convertBannerToFormValues(
183
- null,
184
- zonesOptionList.value
185
- );
186
- }
187
-
188
- context.root.$toast({
189
- variant: 'success',
190
- title: context.root.$t('banners:success'),
191
- body: isCreation.value
192
- ? context.root.$t('banners:bannerWasSuccessfullyCreated')
193
- : context.root.$t('banners:bannerWasSuccessfullyUpdated'),
179
+ .then(({data}) => {
180
+ errors.value = {};
181
+
182
+ if (event.type === 'create') {
183
+ context.root.$router.push(
184
+ getBannersBannerFormUrl({bannerId: String(data.id)})
185
+ );
186
+ }
187
+
188
+ if (event.type === 'create_exit' || event.type === 'save_exit') {
189
+ context.root.$router.push(getBannersBannerListUrl());
190
+ }
191
+
192
+ if (event.type === 'create_create-another') {
193
+ values.value = convertBannerToFormValues(
194
+ null,
195
+ zonesOptionList.value
196
+ );
197
+ }
198
+
199
+ context.root.$toast({
200
+ variant: 'success',
201
+ title: context.root.$t('banners:success'),
202
+ body: isCreation.value
203
+ ? context.root.$t('banners:bannerWasSuccessfullyCreated')
204
+ : context.root.$t('banners:bannerWasSuccessfullyUpdated'),
205
+ });
206
+ })
207
+ .catch((error) => {
208
+ console.error(error);
209
+ errors.value = convertRequestErrorToMap(error);
210
+ context.root.$toast({
211
+ variant: 'danger',
212
+ title: context.root.$t('banners:error'),
213
+ body: isCreation.value
214
+ ? context.root.$t('banners:bannerCreationWasFailed')
215
+ : context.root.$t('banners:bannerUpdateWasFailed'),
216
+ });
217
+ })
218
+ .finally(() => {
219
+ isSubmitting.value = false;
194
220
  });
195
- })
196
- .catch((error) => {
197
- console.error(error);
198
- errors.value = convertRequestErrorToMap(error);
199
- context.root.$toast({
200
- variant: 'danger',
201
- title: context.root.$t('banners:error'),
202
- body: isCreation.value
203
- ? context.root.$t('banners:bannerCreationWasFailed')
204
- : context.root.$t('banners:bannerUpdateWasFailed'),
205
- });
206
- })
207
- .finally(() => {
208
- isSubmitting.value = false;
209
- });
210
221
  };
211
222
 
212
223
  const isContentLoading = computed<boolean>(
213
- () => isBannerLoading.value || isZonesLoading.value
224
+ () => isBannerLoading.value || isZonesLoading.value
214
225
  );
215
226
 
216
227
  return {
@@ -233,4 +244,32 @@ export default defineComponent({
233
244
  grid-template-columns: repeat(2, 1fr);
234
245
  column-gap: 10px;
235
246
  }
247
+
248
+ .zone {
249
+ display: flex;
250
+
251
+ > *:first-child {
252
+ flex: 1 1 1px;
253
+ }
254
+
255
+ > *:last-child {
256
+ flex-basis: 30%;
257
+ margin-left: 20px;
258
+ }
259
+ }
260
+
261
+ .link {
262
+ display: flex;
263
+ align-items: flex-end;
264
+
265
+ > *:first-child {
266
+ flex: 1 1 1px;
267
+ }
268
+
269
+ > *:last-child {
270
+ flex-basis: 30%;
271
+ margin-left: 20px;
272
+ padding-bottom: 8px;
273
+ }
274
+ }
236
275
  </style>
@@ -57,6 +57,13 @@ export function getColumnDefs(
57
57
  },
58
58
  {
59
59
  id: 3,
60
+ name: t('banners:priority'),
61
+ field: 'priority',
62
+ style: { width: '100px', textAlign: 'center' },
63
+ headStyle: { width: '100px', textAlign: 'center' },
64
+ },
65
+ {
66
+ id: 4,
60
67
  name: t('banners:period'),
61
68
  field: 'dateStart',
62
69
  format: ({ row }) =>
@@ -65,13 +72,13 @@ export function getColumnDefs(
65
72
  }`,
66
73
  },
67
74
  {
68
- id: 4,
75
+ id: 5,
69
76
  name: t('banners:image'),
70
77
  field: 'image',
71
78
  type: 'image',
72
79
  },
73
80
  {
74
- id: 5,
81
+ id: 6,
75
82
  name: t('banners:link'),
76
83
  field: 'link',
77
84
  type: 'name',
@@ -92,12 +99,12 @@ export function getColumnDefs(
92
99
  },
93
100
  },
94
101
  {
95
- id: 6,
102
+ id: 7,
96
103
  name: t('banners:comment'),
97
104
  field: 'comment',
98
105
  },
99
106
  {
100
- id: 7,
107
+ id: 8,
101
108
  name: t('banners:actions'),
102
109
  field: 'actions',
103
110
  style: { whiteSpace: 'nowrap', width: '100px' },