{"version":3,"sources":["webpack:///./src/utils/imageHelper.js","webpack:///./src/providers/upload.js","webpack:///./src/components/Vouchers/ModalEditImage.vue?6d69","webpack:///./src/components/Vouchers/ModalEditImage.vue","webpack:///src/components/Vouchers/ModalEditImage.vue","webpack:///./src/components/Vouchers/ModalEditImage.vue?e84c","webpack:///./src/components/Vouchers/ModalEditImage.vue?a35c"],"names":["TRANSPARENCY_MIME_TYPES","mimeTypeCanHaveTransparency","mimeType","arguments","length","undefined","indexOf","String","toLowerCase","getMimeTypeFromDataUrl","dataUrl","match","exec","hasTransparentInteriorPixels","data","width","height","y","rowStart","x","canvasToUploadDataUrl","canvas","jpegQuality","canHaveTransparency","ctx","getContext","imageData","getImageData","toDataURL","globalCompositeOperation","fillStyle","fillRect","methods","postArticleImage","_postArticleImage","_asyncToGenerator","_regenerator","m","_callee","articleId","base64Image","w","_context","n","split","axios","post","concat","process","Base64Image","Type","ItemId","headers","apiToken","profileToken","store","getters","a","v","_x","_x2","apply","locationImage","locationId","_this","_callee2","img","response","_context2","resizeImage","Axios","locationHost","_this2","_callee3","_context3","locationLogo","_this3","_callee4","_context4","eventImage","eventId","_this4","_callee5","_context5","_arguments","_callee6","maxWidth","maxHeight","_context6","Promise","resolve","Image","onload","document","createElement","ratio","imageSmoothingEnabled","imageSmoothingQuality","drawImage","src","render","_vm","this","_c","_self","attrs","$t","isSaving","isSavingSuccess","isSavingError","disableSaveButton","onClickCancel","saveOptionImage","showModal","on","scopedSlots","_u","key","fn","staticClass","ref","val","newImageChosen","hasImageError","proxy","staticRenderFns","ImageCropper","components","props","type","Boolean","default","Function","required","voucherImage","croppedImageData","croppedImageBase64","mVoucher","Number","$route","params","computed","_objectSpread","mapState","created","JSON","parse","stringify","voucher","mapMutations","NEW_IMAGE","responseImageUpload","saveVoucherResponse","t","p","$refs","imageCropper","getCroppedCanvas","uploadProvider","status","LocationId","voucherProvider","saveVoucher","setVoucher","setTimeout","$emit","clearTimeout","component"],"mappings":"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","file":"js/chunk-4dfbf38d.js?id=c0812777b6301f0a1437","sourcesContent":["const TRANSPARENCY_MIME_TYPES = ['image/png', 'image/gif', 'image/webp']\n\n/**\n * Check if a MIME type is an image format that can contain transparency\n * @param {String} mimeType - e.g. 'image/png'\n * @returns {Boolean}\n */\nexport function mimeTypeCanHaveTransparency(mimeType = '') {\n  return TRANSPARENCY_MIME_TYPES.indexOf(String(mimeType || '').toLowerCase()) > -1\n}\n\n/**\n * Get the MIME type from a data URL prefix, e.g. 'data:image/png;base64,...' gives 'image/png'\n * @param {String} dataUrl\n * @returns {String}\n */\nexport function getMimeTypeFromDataUrl(dataUrl = '') {\n  const match = /^data:([^;,]+)[;,]/i.exec(dataUrl || '')\n\n  return match ? match[1].toLowerCase() : ''\n}\n\n/**\n * Check if image data contains at least one (semi-)transparent pixel\n * @param {Uint8ClampedArray} data - RGBA pixel data of an ImageData object\n * @returns {Boolean}\n */\nexport function hasTransparentPixels(data) {\n  for (let i = 3; i < data.length; i += 4) {\n    if (data[i] < 255) {\n      return true\n    }\n  }\n\n  return false\n}\n\n/**\n * Check if image data is really transparent, ignoring the outermost 1px border.\n * Cropping and resizing with sub-pixel boxes anti-aliases the edge pixels, which\n * makes the edge semi-transparent for an image that is opaque. Only a pixel that\n * is NOT in the outermost 1px border with an alpha below 255 counts as transparency.\n * @param {Uint8ClampedArray} data - RGBA pixel data of an ImageData object\n * @param {Number} width\n * @param {Number} height\n * @returns {Boolean}\n */\nexport function hasTransparentInteriorPixels(data, width, height) {\n  for (let y = 1; y < height - 1; y++) {\n    const rowStart = y * width * 4\n\n    for (let x = 1; x < width - 1; x++) {\n      if (data[rowStart + x * 4 + 3] < 255) {\n        return true\n      }\n    }\n  }\n\n  return false\n}\n\n/**\n * Export a canvas as a data URL that is suited for uploading.\n * Only when the source image can have transparency (PNG, GIF, WebP) the canvas is checked\n * and exported as PNG when it really is transparent, so the transparency is preserved.\n * Everything else (e.g. a JPEG photo) is exported as JPEG on a white background.\n * @param {HTMLCanvasElement} canvas\n * @param {Number} jpegQuality - JPEG quality between 0 and 1\n * @param {Boolean} canHaveTransparency - Source image is a format that can contain transparency\n * @returns {String}\n */\nexport function canvasToUploadDataUrl(canvas, jpegQuality = 0.92, canHaveTransparency = false) {\n  const ctx = canvas.getContext('2d')\n\n  if (canHaveTransparency) {\n    const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)\n\n    if (hasTransparentInteriorPixels(imageData.data, canvas.width, canvas.height)) {\n      return canvas.toDataURL('image/png')\n    }\n  }\n\n  // Paint a white background behind the image so the JPEG never gets black corners or edges\n  ctx.globalCompositeOperation = 'destination-over'\n  ctx.fillStyle = '#fff'\n  ctx.fillRect(0, 0, canvas.width, canvas.height)\n  ctx.globalCompositeOperation = 'source-over'\n\n  return canvas.toDataURL('image/jpeg', jpegQuality)\n}\n","import Axios from 'axios'\nimport axios from 'axios'\nimport store from '../store'\nimport { canvasToUploadDataUrl, getMimeTypeFromDataUrl, mimeTypeCanHaveTransparency } from '@/utils/imageHelper'\n\nexport default {\n  methods: {\n    postArticleImage: async (articleId, base64Image) => {\n      base64Image = base64Image.split(',')[1]\n\n      return await axios.post(`${process.env.VUE_APP_API_BASE_URL}/api/v1/upload/image`, {\n          Base64Image: base64Image,\n          Type: 'Article',\n          ItemId: articleId,\n      },\n        {\n          headers: {\n            'Content-type': 'application/json',\n            apiToken: process.env.VUE_APP_API_KEY,\n            profileToken: store.getters['profileStore/getProfileToken']\n          }\n        })\n    },\n\n    /**\n     * Upload location image\n     * @param {Number} locationId\n     * @param {String} base64Image\n     */\n    async locationImage(locationId, base64Image) {\n      let img = await this.resizeImage(base64Image)\n      base64Image = img.split(',')[1]\n      const response = Axios.post(\n        `${process.env.VUE_APP_API_BASE_URL}/api/v1/upload/image`,\n        {\n          Base64Image: base64Image,\n          Type: 'Location',\n          ItemId: locationId,\n        },\n        {\n          headers: {\n            'Content-type': 'application/json',\n            apiToken: process.env.VUE_APP_API_KEY,\n            profileToken: store.getters['profileStore/getProfileToken'],\n          },\n        }\n      )\n      return response\n    },\n\n    /**\n     * Upload location image\n     * @param {Number} locationId\n     * @param {String} base64Image\n     */\n    async locationHost(locationId, base64Image) {\n      let img = await this.resizeImage(base64Image)\n      base64Image = img.split(',')[1]\n      const response = Axios.post(\n        `${process.env.VUE_APP_API_BASE_URL}/api/v1/upload/image`,\n        {\n          Base64Image: base64Image,\n          Type: 'VirtualManager',\n          ItemId: locationId,\n        },\n        {\n          headers: {\n            'Content-type': 'application/json',\n            apiToken: process.env.VUE_APP_API_KEY,\n            profileToken: store.getters['profileStore/getProfileToken'],\n          },\n        }\n      )\n      return response\n    },\n\n    /**\n     * Upload location logo\n     * @param {Number} locationId\n     * @param {String} base64Image\n     */\n    async locationLogo(locationId, base64Image) {\n      let img = await this.resizeImage(base64Image)\n      base64Image = img.split(',')[1]\n      const response = Axios.post(\n        `${process.env.VUE_APP_API_BASE_URL}/api/v1/upload/image`,\n        {\n          Base64Image: base64Image,\n          Type: 'Logo',\n          ItemId: locationId,\n        },\n        {\n          headers: {\n            'Content-type': 'application/json',\n            apiToken: process.env.VUE_APP_API_KEY,\n            profileToken: store.getters['profileStore/getProfileToken'],\n          },\n        }\n      )\n      return response\n    },\n\n    /**\n     * Upload event image\n     * @param {Number} eventId\n     * @param {String} base64Image\n     */\n    async eventImage(eventId, base64Image) {\n      let img = await this.resizeImage(base64Image)\n      base64Image = img.split(',')[1]\n\n      const response = Axios.post(\n        `${process.env.VUE_APP_API_BASE_URL}/api/v1/upload/image`,\n        {\n          Base64Image: base64Image,\n          Type: 'Event',\n          ItemId: eventId,\n        },\n        {\n          headers: {\n            'Content-type': 'application/json',\n            apiToken: process.env.VUE_APP_API_KEY,\n            profileToken: store.getters['profileStore/getProfileToken'],\n          },\n        }\n      )\n      return response\n    },\n\n    /**\n     * Resize images when needed\n     * @param {String} dataUrl\n     * @param {Number} maxWidth\n     * @param {Number} maxHeight\n     */\n    async resizeImage(dataUrl, maxWidth = 1920, maxHeight = 1920) {\n      return new Promise((resolve) => {\n        let img = new Image()\n        img.onload = (response) => {\n          if (img.width < maxWidth || img.height < maxHeight) {\n            resolve(dataUrl)\n          } else {\n            // Do resize\n            let canvas = document.createElement('canvas')\n\n            // let maxWidth = 1920 // Max width for the image\n            // let maxHeight = 1920 // Max height for the image\n            let ratio = 0 // Used for aspect ratio\n            let width = img.width // Current image width\n            let height = img.height // Current image height\n\n            // Check if the current width is larger than the max\n            if (width > maxWidth) {\n              ratio = maxWidth / width // get ratio for scaling image\n              height = height * ratio // Reset height to match scaled image\n              width = width * ratio // Reset width to match scaled image\n            }\n\n            // Check if current height is larger than max\n            if (height > maxHeight) {\n              ratio = maxHeight / height // get ratio for scaling image\n              width = width * ratio // Reset width to match scaled image\n            }\n            canvas.width = width\n            canvas.height = height\n\n            const ctx = canvas.getContext('2d')\n            ctx.imageSmoothingEnabled = true\n            ctx.imageSmoothingQuality = 'high'\n            ctx.drawImage(img, 0, 0, width, height)\n            resolve(canvasToUploadDataUrl(canvas, 1, mimeTypeCanHaveTransparency(getMimeTypeFromDataUrl(dataUrl))))\n          }\n        }\n        img.src = dataUrl\n      })\n    },\n  },\n}\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--10-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--10-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModalEditImage.vue?vue&type=style&index=0&id=22af8d32&prod&lang=sass&scoped=true\"","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('ui-component-modal',{attrs:{\"modalTitle\":_vm.$t('Components.Vouchers.ModalEditImage.Main_Title'),\"isSaving\":_vm.isSaving,\"isSavingSuccess\":_vm.isSavingSuccess,\"isSavingError\":_vm.isSavingError,\"hideFooterButtons\":_vm.isSavingError || _vm.isSavingSuccess,\"disableSaveButton\":_vm.disableSaveButton,\"onClickCancel\":_vm.onClickCancel,\"onClickSave\":_vm.saveOptionImage,\"showModal\":_vm.showModal},on:{\"closeModal\":_vm.onClickCancel},scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('div',{staticClass:\"columns is-mobile is-multiline is-vcentered\"},[_c('div',{staticClass:\"column is-7\"},[_c('ImageCropper',{ref:\"imageCropper\",attrs:{\"aspectRatio\":4/3,\"guides\":false,\"viewMode\":3,\"previewContainer\":\".imagePreview\",\"aspectRatioCssClass\":\"is-4by3\"},on:{\"callbackImageChosen\":val => { _vm.newImageChosen = val },\"errorCallbackInvalid\":val => { _vm.hasImageError = val }}})],1),_c('div',{staticClass:\"column is-5\"},[_c('div',{staticClass:\"wrapper-previews\"},[_c('div',{staticClass:\"imagePreview has-background-grey-light\"})])])])]},proxy:true}])})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <ui-component-modal\n    :modalTitle=\"$t('Components.Vouchers.ModalEditImage.Main_Title')\"\n    :isSaving=\"isSaving\"\n    :isSavingSuccess=\"isSavingSuccess\"\n    :isSavingError=\"isSavingError\"\n    :hideFooterButtons=\"isSavingError || isSavingSuccess\"\n    :disableSaveButton=\"disableSaveButton\"\n    :onClickCancel=\"onClickCancel\"\n    :onClickSave=\"saveOptionImage\"\n    :showModal=\"showModal\"\n    @closeModal=\"onClickCancel\"\n  >\n    <template v-slot:content>\n      <div class=\"columns is-mobile is-multiline is-vcentered\">\n        <div class=\"column is-7\">\n          <ImageCropper\n            ref=\"imageCropper\"\n            :aspectRatio=\"4/3\"\n            :guides=\"false\"\n            :viewMode=\"3\"\n            previewContainer=\".imagePreview\"\n            @callbackImageChosen=\"val => { newImageChosen = val }\"\n            @errorCallbackInvalid=\"val => { hasImageError = val }\"\n            aspectRatioCssClass=\"is-4by3\"\n          />\n        </div>\n        <div class=\"column is-5\">\n          <div class=\"wrapper-previews\">\n            <div class=\"imagePreview has-background-grey-light\"></div>\n          </div>\n        </div>\n      </div>\n    </template>\n  </ui-component-modal>\n</template>\n\n<script>\nimport { mapState, mapMutations } from 'vuex'\nimport voucherProvider from '@/providers/voucher'\nimport uploadProvider from '@/providers/upload'\n\nconst ImageCropper = () => import('@/components/UI/ImageCropper')\n\nexport default {\n  components: {\n    ImageCropper\n  },\n\n  props: {\n    showModal: {\n      type: Boolean,\n      default: false\n    },\n\n    onClickCancel: {\n      type: Function,\n      required: true\n    }\n  },\n\n  data() {\n    return {\n      isSaving: false,\n      isSavingSuccess: false,\n      isSavingError: false,\n      voucherImage: '',\n      croppedImageData: {},\n      croppedImageBase64: '',\n      mVoucher: null,\n      locationId: Number(this.$route.params.locationId),\n      newImageChosen: false,\n      hasImageError: false\n    }\n  },\n\n  computed: {\n    ...mapState('voucherStore', ['voucher']),\n\n    disableSaveButton() {\n      return this.isSaving || !this.newImageChosen || this.hasImageError\n    },\n  },\n\n  created() {\n    this.mVoucher = JSON.parse(JSON.stringify(this.voucher))\n  },\n\n  methods: {\n    ...mapMutations('voucherStore', ['setVoucher']),\n\n    async saveOptionImage() {\n      if (this.disableSaveButton) { return }\n      this.isSaving = true\n\n      try {\n        const NEW_IMAGE = this.$refs.imageCropper.getCroppedCanvas()\n        let responseImageUpload = await uploadProvider.methods.locationImage(\n          this.locationId,\n          NEW_IMAGE\n        )\n        if (responseImageUpload.status === 200) {\n          this.mVoucher.Image = responseImageUpload.data\n          this.mVoucher.LocationId = this.locationId\n        }\n        let saveVoucherResponse = await voucherProvider.methods.saveVoucher(this.mVoucher)\n        this.isSavingSuccess = true\n        this.setVoucher(saveVoucherResponse.data)\n\n        let t = setTimeout(() => {\n          this.$emit('voucherEdited', saveVoucherResponse.data)\n          this.onClickCancel()\n          clearTimeout(t)\n        }, 1500)\n      }\n      catch {\n        this.isSaving = false\n        this.isSavingError = true\n      }\n    }\n  }\n}\n</script>\n\n<style lang=\"sass\" scoped>\n.wrapper-previews\n  display: flex\n  flex-grow: 1\n  .imagePreview\n    overflow: hidden\n    aspect-ratio: 4/3\n    &:nth-child(1)\n      max-width: 80%\n      width: 100%\n</style>","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModalEditImage.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModalEditImage.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./ModalEditImage.vue?vue&type=template&id=22af8d32&scoped=true\"\nimport script from \"./ModalEditImage.vue?vue&type=script&lang=js\"\nexport * from \"./ModalEditImage.vue?vue&type=script&lang=js\"\nimport style0 from \"./ModalEditImage.vue?vue&type=style&index=0&id=22af8d32&prod&lang=sass&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"22af8d32\",\n  null\n  \n)\n\nexport default component.exports"],"sourceRoot":""}