{"version":3,"sources":["webpack://fht-cms-web-client/./src/common/assert.ts","webpack://fht-cms-web-client/./src/common/env.ts","webpack://fht-cms-web-client/./src/common/exceptionless.ts","webpack://fht-cms-web-client/./src/common/jqueryDataUtil.ts","webpack://fht-cms-web-client/./src/pages/base/utils.ts","webpack://fht-cms-web-client/./src/pages/modules/imagePhotoswipe/photoswipeHtml.ts","webpack://fht-cms-web-client/./src/pages/modules/imagePhotoswipe/index.ts","webpack://fht-cms-web-client/./src/pages/base/imageUtils.ts"],"names":["assert","condition","message","tag","Error","err","exceptionless","LOG_ERROR_ENABLED","ex","tags","cmsGlobal","push","setManualStackingKey","addTags","submit","IS_DEV","DEBUG_LOG_ERROR","window","process","ExceptionlessClient","apiKey","serverUrl","submissionBatchSize","_optionalVal","$el","key","val","data","jqueryDataUtil","optionalString","requiredString","optionalNumber","n","Number","isNaN","requiredNumber","optionalBoolean","requiredBoolean","i","$","$pswp","length","appendTo","document","body","selector","attrs","pswpElement","get","CONTENT_IMG_SELECTOR","parseThumbnailElements","$contentImgElement","items","find","each","_index","img","$img","photoswipeUrl","largeImageSize","url","urlRegex","result","match","tokens","split","nums","map","t","parseInt","width","height","parseSizeFromImageUrl","msrc","attr","src","thumbnail","w","h","index","el","element","thisSrc","exec","addClass","attributeValue","undefined","on","e","$target","target","$clickedContentImg","closest","contentImgElement","PhotoSwipe","PhotoSwipeUI_Default","getThumbBoundsFn","idx","scrollTop","rect","getBoundingClientRect","x","left","y","top","init","openPhotoSwipe"],"mappings":"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","file":"js/imagePhotoswipe.588017e1.js","sourcesContent":["import { IS_DEV } from \"./env\";\r\nimport { exceptionless } from \"./exceptionless\";\r\nimport { cmsGlobal, DEBUG_LOG_ERROR, LOG_ERROR_ENABLED } from \"./fhtGlobalEnv\";\r\n\r\nexport function assert(condition: unknown, message?: string, tag?: string): asserts condition {\r\n\tif (!condition) {\r\n\t\ttry {\r\n\t\t\tconst errorMessage = message || \"assert \" + condition + \" failed\";\r\n\t\t\tthrow new Error(errorMessage);\r\n\t\t} catch (err) {\r\n\t\t\tif (exceptionless && LOG_ERROR_ENABLED) {\r\n\t\t\t\tlet ex = exceptionless.createException(err as Error);\r\n\t\t\t\tconst tags = [\"assert\", cmsGlobal.Env.AppEnv!];\r\n\t\t\t\tif (tag) {\r\n\t\t\t\t\ttags.push(tag);\r\n\t\t\t\t\tex = ex.setManualStackingKey(tag);\r\n\t\t\t\t}\r\n\t\t\t\tex.addTags(...tags);\r\n\t\t\t\tex.submit();\r\n\t\t\t}\r\n\t\t\tif (IS_DEV) {\r\n\t\t\t\tthrow err;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nif (DEBUG_LOG_ERROR) {\r\n\t//@ts-ignore\r\n\twindow.assert = assert;\r\n}","export const IS_DEV = process.env.NODE_ENV === \"development\";\r\n","import { DEBUG_LOG_ERROR } from \"./fhtGlobalEnv\";\r\n\r\nconst ex = window.exceptionless;\r\nif (!ex) throw new Error(\"window.exceptionless falsy\");\r\n//see https://www.npmjs.com/package/exceptionless\r\nconst serverUrl = \"https://exceptionless.fht360.cn\";\r\nconst apiKey = '9CKhcMFiJiQm6ZRRJxa6ZaehOZlll8oAzyscgAGc';\r\n\r\nconst client = new ex.ExceptionlessClient({\r\n\tapiKey,\r\n\tserverUrl,\r\n\tsubmissionBatchSize: DEBUG_LOG_ERROR ? 1 : 100\r\n});\r\n\r\nexport const exceptionless = client;\r\n\r\n","import { assert } from \"@/common/assert\";\r\n\r\ntype DataValueType = string | number | boolean;\r\n\r\nfunction _optionalVal($el: JQuery, key: string): DataValueType | undefined {\r\n assert($el, \"$el is null\");\r\n const val = $el.data(key) as DataValueType;\r\n if (typeof val === \"undefined\") return;\r\n return val;\r\n}\r\n\r\nconst jqueryDataUtil = {\r\n optionalString($el: JQuery, key: string): string | undefined {\r\n const val = _optionalVal($el, key);\r\n if (typeof val === \"undefined\") return;\r\n assert(typeof val === \"string\", `val not string, key: ${key}, type: ${typeof key}`);\r\n return val;\r\n },\r\n\r\n requiredString($el: JQuery, key: string): string {\r\n const val = jqueryDataUtil.optionalString($el, key);\r\n assert(val, `${key} is required`);\r\n return val;\r\n },\r\n optionalNumber($el: JQuery, key: string): number | undefined {\r\n const val = _optionalVal($el, key);\r\n if (typeof val === \"undefined\") return;\r\n const n = Number(val);\r\n assert(typeof n === \"number\" && !isNaN(n), `${key} is not a valid number`);\r\n return n;\r\n },\r\n requiredNumber($el: JQuery, key: string): number {\r\n const val = jqueryDataUtil.optionalNumber($el, key);\r\n assert(typeof val === \"number\", `${key} is a required number`);\r\n return val;\r\n },\r\n optionalBoolean($el: JQuery, key: string): boolean | undefined {\r\n const val = _optionalVal($el, key);\r\n if (typeof val === \"undefined\") return;\r\n assert(typeof val === \"boolean\", `${key} is required to be \"true\" or \"false\", but is ${val}`);\r\n return val;\r\n },\r\n requiredBoolean($el: JQuery, key: string): boolean {\r\n const val = jqueryDataUtil.optionalBoolean($el, key);\r\n assert(typeof val === \"boolean\", `${key} is required`);\r\n return val;\r\n },\r\n};\r\n\r\nexport default jqueryDataUtil;\r\n","import { cmsGlobal } from \"@/common/fhtGlobalEnv\";\r\nimport { assert } from \"@/common/assert\";\r\n\r\nexport function warn(message: string) {\r\n if (cmsGlobal.Env.DEBUG) {\r\n // eslint-disable-next-line no-alert\r\n alert(message);\r\n } else {\r\n console.error(message);\r\n }\r\n}\r\n\r\nexport function IsBoolean(value: T) {\r\n return typeof value === \"boolean\";\r\n}\r\nexport function IsString(value: T) {\r\n return typeof value === \"string\";\r\n}\r\nexport function IsNumber(value: T) {\r\n return typeof value === \"number\";\r\n}\r\n\r\nexport function IsArray(value: T) {\r\n return Object.prototype.toString.call(value) === \"[object Array]\";\r\n}\r\n\r\nexport function IsObject(value: T) {\r\n return typeof value === \"object\";\r\n}\r\nexport function IsObjectOrArray(value: T) {\r\n return IsObject(value) || IsArray(value);\r\n}\r\n\r\nexport function unique(array: T[]) {\r\n return $.grep(array, function (el, index) {\r\n return index === $.inArray(el, array);\r\n });\r\n}\r\n\r\nexport function stripHTML(dangerousText: string): string {\r\n const container = document.createElement(\"div\");\r\n const text = document.createTextNode(dangerousText);\r\n container.appendChild(text);\r\n return container.innerHTML; // innerHTML will be a xss safe string\r\n}\r\n\r\nexport function ensureAttributesForSelector(selector: string, attrs: string[]) {\r\n $(selector).each(function (_index, el) {\r\n for (const attr of attrs) {\r\n const attributeValue = $(el).attr(attr);\r\n assert(attributeValue !== undefined, attr + \" must exist for selector \" + selector);\r\n }\r\n });\r\n}\r\n\r\nexport function getUrlParam(name: string): string | null {\r\n const reg = new RegExp(\"(^|&)\" + name + \"=([^&]*)(&|$)\");\r\n const r = window.location.search.substr(1).match(reg);\r\n if (r !== null) return decodeURIComponent(r[2]);\r\n return null;\r\n}\r\n\r\nexport async function loadScript(src: string): Promise {\r\n const s = document.createElement(\"script\");\r\n s.type = \"text/javascript\";\r\n s.src = src;\r\n document.body.appendChild(s);\r\n return new Promise((res, rej) => {\r\n s.onload = (e) => res(e);\r\n s.onerror = rej;\r\n });\r\n}\r\n\r\nexport function GetRandomNum(min:number, max:number):number {\r\n let range = max - min;\r\n let rand = Math.random();\r\n return (min + Math.round(rand * range));\r\n}","export const photoSwipeHtml = `\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n`;\r\n","import { assert } from \"@/common/assert\";\r\nimport PhotoSwipe from \"photoswipe\";\r\nimport PhotoSwipeUI_Default from \"photoswipe/dist/photoswipe-ui-default\";\r\nimport { ensureAttributesForSelector } from \"@/pages/base/utils\";\r\nimport \"./vendor.photoswipe.scss\";\r\nimport \"./index.scss\";\r\nimport jqueryDataUtil from \"@/common/jqueryDataUtil\";\r\nimport { parseSizeFromImageUrl } from \"@/pages/base/imageUtils\";\r\nimport { photoSwipeHtml } from \"./photoswipeHtml\";\r\n\r\n//插件使用方法 需要三个条件 两个class 一个data-photoswipe-full-url属性标记;\r\n// 1 图片列表容器上标class js-photoswipe-container;\r\n// 2 每个预览的图片上标class image-photoswipe;\r\n// 3 每个预览的图片上标data-photoswipe-full-url属性,值为大图src;\r\n\r\n//see https://photoswipe.com/documentation/getting-started.html\r\ninterface PhotoSwipeElement {\r\n title?: string;\r\n /**\r\n * path to image\r\n */\r\n src: string;\r\n /**\r\n * path to small image placeholder, large image will be loaded on top\r\n */\r\n msrc: string;\r\n thumbnail: HTMLImageElement;\r\n w: number;\r\n h: number;\r\n}\r\n\r\n//产品或帖子正文中的photoswipe查看大图\r\n$(function () {\r\n let $pswp = $(\".pswp\");\r\n if (!$pswp.length) {\r\n $pswp = $(photoSwipeHtml).appendTo(document.body);\r\n }\r\n const pswpElement = $pswp.get(0);\r\n const CONTENT_IMG_SELECTOR = \".js-photoswipe-container\";\r\n\r\n $(CONTENT_IMG_SELECTOR).each(function (index, el) {\r\n $(el)\r\n .find('img:not(\".image-photoswipe\")')\r\n .each(function (_index, element) {\r\n const $el = $(element);\r\n const thisSrc = $el.attr(\"src\");\r\n if (/\\.gif$/.exec(thisSrc)) return;\r\n assert(\r\n !$el.attr(\"data-photoswipe-full-url\"),\r\n \"should not have data-photoswipe-full-url before initialization\",\r\n );\r\n $el.addClass(\"image-photoswipe\").attr(\"data-photoswipe-full-url\", thisSrc);\r\n });\r\n });\r\n\r\n ensureAttributesForSelector(\".image-photoswipe\", [\"data-photoswipe-full-url\"]);\r\n function parseThumbnailElements($contentImgElement: JQuery) {\r\n const items: PhotoSwipeElement[] = [];\r\n $contentImgElement.find(\".image-photoswipe\").each((_index, img) => {\r\n const $img = $(img);\r\n const photoswipeUrl = jqueryDataUtil.requiredString($img, \"photoswipe-full-url\");\r\n const largeImageSize = parseSizeFromImageUrl(photoswipeUrl) || {\r\n width: 500,\r\n height: 500,\r\n };\r\n const msrc = $img.attr(\"src\") as string;\r\n assert(msrc, \"msrc falsy\");\r\n items.push({\r\n src: photoswipeUrl,\r\n msrc: msrc,\r\n thumbnail: img as HTMLImageElement,\r\n w: largeImageSize.width,\r\n h: largeImageSize.height,\r\n });\r\n });\r\n return items;\r\n }\r\n\r\n const openPhotoSwipe = function (index: number, contentImgElement: JQuery) {\r\n const items = parseThumbnailElements(contentImgElement);\r\n const contentImgs = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, {\r\n index: index,\r\n getThumbBoundsFn: function (idx) {\r\n const thumbnail = items[idx].thumbnail;\r\n const scrollTop = $(document).scrollTop();\r\n const rect = thumbnail.getBoundingClientRect();\r\n return {\r\n x: rect.left,\r\n y: rect.top + scrollTop,\r\n w: rect.width,\r\n };\r\n },\r\n });\r\n contentImgs.init();\r\n };\r\n\r\n $(document).on(\"click\", \".image-photoswipe\", function (e) {\r\n const $target = $(e.target);\r\n const $clickedContentImg = $target.closest(CONTENT_IMG_SELECTOR);\r\n assert($clickedContentImg.length, \"image-photoswipe must be within a js-photoswipe-container\");\r\n const $allImageItems = $clickedContentImg.find(\".image-photoswipe\");\r\n const index = $allImageItems.index($target);\r\n assert(index > -1, \"failed to find clicked content image\");\r\n openPhotoSwipe(index, $clickedContentImg);\r\n return false;\r\n });\r\n});\r\n","import { assert } from \"@/common/assert\";\r\n\r\nexport interface ImageSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport function getImageSize(url: string): Promise {\r\n assert(url, \"url is falsy\");\r\n return new Promise((resolve, reject) => {\r\n const img = document.createElement(\"img\");\r\n img.onload = (_) => {\r\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\r\n };\r\n img.onerror = (error) => {\r\n const e = new Error(\"failed with error: \" + error);\r\n console.error(\"get image size of \", url, \"failed with error\", error);\r\n reject(e);\r\n };\r\n img.src = url;\r\n });\r\n}\r\n\r\nexport function parseSizeFromImageUrl(url: string): ImageSize | undefined {\r\n const urlRegex = /(\\d+x\\d+)/g;\r\n const result = url.match(urlRegex);\r\n if (result && result.length) {\r\n /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */\r\n const tokens = url.match(urlRegex)![0].split(\"x\");\r\n assert(tokens.length === 2, \"parse image width & height failed: \" + url);\r\n const nums = tokens.map((t) => parseInt(t, 10));\r\n return { width: nums[0], height: nums[1] };\r\n }\r\n return;\r\n}\r\n"],"sourceRoot":""}