) => this.props.onPlaybackQualityChange?.(event);\n\n /**\n * Destroy the YouTube Player using its async API and store the promise so we\n * can await before re-creating it.\n */\n destroyPlayer = () => {\n if (this.internalPlayer) {\n this.destroyPlayerPromise = this.internalPlayer.destroy().then(() => (this.destroyPlayerPromise = undefined));\n return this.destroyPlayerPromise;\n }\n return Promise.resolve();\n };\n\n /**\n * Initialize the YouTube Player API on the container and attach event handlers\n */\n createPlayer = () => {\n // do not attempt to create a player server-side, it won't work\n if (typeof document === 'undefined') return;\n if (this.destroyPlayerPromise) {\n // We need to first await the existing player to be destroyed before\n // we can re-create it.\n this.destroyPlayerPromise.then(this.createPlayer);\n return;\n }\n // create player\n const playerOpts: Options = {\n ...this.props.opts,\n // preload the `videoId` video if one is already given\n videoId: this.props.videoId,\n };\n this.internalPlayer = youTubePlayer(this.container!, playerOpts);\n // attach event handlers\n this.internalPlayer.on('ready', this.onPlayerReady as any);\n this.internalPlayer.on('error', this.onPlayerError as any);\n this.internalPlayer.on('stateChange', this.onPlayerStateChange as any);\n this.internalPlayer.on('playbackRateChange', this.onPlayerPlaybackRateChange as any);\n this.internalPlayer.on('playbackQualityChange', this.onPlayerPlaybackQualityChange as any);\n if (this.props.title || this.props.loading) {\n this.internalPlayer.getIframe().then((iframe) => {\n if (this.props.title) iframe.setAttribute('title', this.props.title);\n if (this.props.loading) iframe.setAttribute('loading', this.props.loading);\n });\n }\n };\n\n /**\n * Shorthand for destroying and then re-creating the YouTube Player\n */\n resetPlayer = () => this.destroyPlayer().then(this.createPlayer);\n\n /**\n * Method to update the id and class of the YouTube Player iframe.\n * React should update this automatically but since the YouTube Player API\n * replaced the DIV that is mounted by React we need to do this manually.\n */\n updatePlayer = () => {\n this.internalPlayer?.getIframe().then((iframe) => {\n if (this.props.id) iframe.setAttribute('id', this.props.id);\n else iframe.removeAttribute('id');\n if (this.props.iframeClassName) iframe.setAttribute('class', this.props.iframeClassName);\n else iframe.removeAttribute('class');\n if (this.props.opts && this.props.opts.width) iframe.setAttribute('width', this.props.opts.width.toString());\n else iframe.removeAttribute('width');\n if (this.props.opts && this.props.opts.height) iframe.setAttribute('height', this.props.opts.height.toString());\n else iframe.removeAttribute('height');\n if (this.props.title) iframe.setAttribute('title', this.props.title);\n else iframe.setAttribute('title', 'YouTube video player');\n if (this.props.loading) iframe.setAttribute('loading', this.props.loading);\n else iframe.removeAttribute('loading');\n });\n };\n\n /**\n * Method to return the internalPlayer object.\n */\n getInternalPlayer = () => {\n return this.internalPlayer;\n };\n\n /**\n * Call YouTube Player API methods to update the currently playing video.\n * Depending on the `opts.playerVars.autoplay` this function uses one of two\n * YouTube Player API methods to update the video.\n */\n updateVideo = () => {\n if (typeof this.props.videoId === 'undefined' || this.props.videoId === null) {\n this.internalPlayer?.stopVideo();\n return;\n }\n\n // set queueing options\n let autoplay = false;\n const opts: YoutubePlayerCueVideoOptions = {\n videoId: this.props.videoId,\n };\n\n if (this.props.opts?.playerVars) {\n autoplay = this.props.opts.playerVars.autoplay === 1;\n if ('start' in this.props.opts.playerVars) {\n opts.startSeconds = this.props.opts.playerVars.start;\n }\n if ('end' in this.props.opts.playerVars) {\n opts.endSeconds = this.props.opts.playerVars.end;\n }\n }\n\n // if autoplay is enabled loadVideoById\n if (autoplay) {\n this.internalPlayer?.loadVideoById(opts);\n return;\n }\n // default behaviour just cues the video\n this.internalPlayer?.cueVideoById(opts);\n };\n\n refContainer = (container: HTMLDivElement) => {\n this.container = container;\n };\n\n render() {\n return (\n \n );\n }\n}\n\nexport default YouTube;\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport YouTube from 'react-youtube';\r\nimport printform from \"./Print.js\"\r\nimport $ from \"jquery\";\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const systemid = params.get(\"systemid\");\r\n const id = params.get(\"id\");\r\n\r\n const history = useHistory();\r\n\r\n const [videoData, setvideoData] = useState({\r\n videoLong: '',\r\n videodate:'',\r\n });\r\n\r\n const [uploaded, setUploaded] = useState([]);\r\n\r\n const [func, setFunc] = useState([]);\r\n\r\n const [warn, setWarn] = useState([]);\r\n\r\n const [formData, setFormData] = useState([]);\r\n\r\n const [key, setkey] = useState([]);\r\n\r\n const [WebImg, setWebImg] = useState([]);\r\n\r\n\r\n const funcData = useCallback(async (systemid) => {\r\n const response = await fetch('web/doc/getFunc/' + systemid);\r\n const data = await response.json();\r\n setFunc(data);\r\n }, []);\r\n\r\n const warnData = useCallback(async () => {\r\n const response = await fetch('web/doc/getWarn');\r\n const data = await response.json();\r\n setWarn(data);\r\n }, []);\r\n\r\n const Att = useCallback(async (systemid) => {\r\n const response = await fetch('web/doc/getCourseAtt/' + systemid);\r\n const data = await response.json();\r\n setUploaded(data);\r\n }, []);\r\n\r\n\r\n const Data = useCallback(async (id) => {\r\n fetch('web/doc/getCourseDetail/' + id)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n setFormData(data.doc);\r\n } else {\r\n alert(data.message);\r\n history.goBack();\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n \r\n }, [history]);\r\n\r\n const ytkey = useCallback(async () => {\r\n fetch('web/setting/GetYoutube' )\r\n .then((response) => response.text())\r\n .then((data) => {\r\n setkey(data);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }, []);\r\n\r\n\r\n\r\n\r\n const ytData = useCallback(async() => {\r\n const url = 'https://www.googleapis.com/youtube/v3/videos?id=' + formData.docVideoId + '&key=' + key + '&part=snippet,contentDetails,statistics,status';\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n\r\n const date = changeDate(data.items[0].snippet.publishedAt);\r\n const time = changeTime(data.items[0].contentDetails.duration);\r\n setvideoData({ \"videoLong\": time, \"videodate\": date });\r\n }, [formData.docVideoId, key]);\r\n\r\n\r\n useEffect(() => {\r\n funcData(systemid);\r\n warnData();\r\n Data(id);\r\n Att(id);\r\n ytkey();\r\n imgurl();\r\n }, [Att, Data, funcData, id, systemid, warnData, ytkey]);\r\n\r\n useEffect(() => {\r\n if (formData.docVideoId != null && key !==\"\") { \r\n ytData();\r\n }\r\n }, [formData.docVideoId, key, ytData]);\r\n\r\n useEffect(() => {\r\n $('.page-share > a').click(function () {\r\n $(this).next('.page-share-list').slideToggle()\r\n })\r\n }, []);\r\n\r\n\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n //history.push('/intranet/video/CourseList?systemid=' + systemid + '&page=1');\r\n history.goBack();\r\n }\r\n\r\n function handleFileDownload(event, id, name) {\r\n event.preventDefault();\r\n fetch('/web/doc/DownloadAtt/' + systemid + '/' + id + '/' + formData.docId,)\r\n .then((response) => response.blob())\r\n .then((blob) => { \r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = name;\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n\r\n }\r\n\r\n async function imgurl() {\r\n const response = await fetch('web/setting/GetWebImg');\r\n const data = await response.text();\r\n setWebImg(data);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n
{func.funcName}
\r\n \r\n\r\n
\r\n\r\n
\r\n \r\n
\r\n
{formData.docTitle }
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n >\r\n )\r\n\r\n function VideoPlayer(prop) {\r\n const videoId = prop.yt;\r\n const opts = {\r\n height: '390',\r\n width: '640',\r\n };\r\n return (\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n function closewarn(event) {\r\n event.preventDefault();\r\n $(\"#popup_warning\").addClass(\"hide\");\r\n }\r\n\r\n function changeDate(date) {\r\n\r\n const dateObject = new Date(date);\r\n const year = dateObject.getFullYear();\r\n const month = dateObject.getMonth() + 1;\r\n const day = dateObject.getDate();\r\n const formattedDate = `${year}/${month}/${day}`;\r\n return formattedDate;\r\n\r\n }\r\n\r\n function changeTime(time) {\r\n\r\n const durationRegex = /^PT(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?$/;\r\n const durationMatch = durationRegex.exec(time);\r\n const hours = parseInt(durationMatch[1] || '0');\r\n const minutes = parseInt(durationMatch[2] || '0');\r\n const seconds = parseInt(durationMatch[3] || '0');\r\n\r\n const duration = new Date();\r\n duration.setHours(hours, minutes, seconds);\r\n\r\n const hoursString = duration.getHours().toString().padStart(2, '0');\r\n const minutesString = duration.getMinutes().toString().padStart(2, '0');\r\n const secondsString = duration.getSeconds().toString().padStart(2, '0');\r\n\r\n const formattedDuration = `${hoursString}:${minutesString}:${secondsString}`;\r\n\r\n return formattedDuration ;\r\n \r\n }\r\n\r\n\r\n} export default From;\r\n\r\n//","/* eslint-disable no-unreachable */\r\n/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport printform from \"./Print.js\"\r\nimport $ from \"jquery\";\r\nimport ReactGA from \"react-ga4\";\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n useEffect(() => {\r\n Data();\r\n }, []);\r\n\r\n useEffect(() => {\r\n $('.page-share > a').click(function () {\r\n $(this).next('.page-share-list').slideToggle()\r\n })\r\n }, []);\r\n\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/index');\r\n }\r\n\r\n //GA\r\n const path = location.pathname + location.search;\r\n useEffect(() => {\r\n ReactGA.send({ hitType: \"pageview\", page: path, page_title: \"智慧財產權限說明\" });\r\n }, [path]);\r\n\r\n return (\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 async function Data() {\r\n const response = await fetch('web/footer/getIntellectual');\r\n const data = await response.text();\r\n setList(data);\r\n }\r\n}\r\nexport default From;","/* eslint-disable no-unreachable */\r\n/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation,Link } from 'react-router-dom';\r\nimport printform from \"./Print.js\"\r\nimport $ from \"jquery\";\r\nimport ReactGA from \"react-ga4\";\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n useEffect(() => {\r\n Data();\r\n }, []);\r\n\r\n useEffect(() => {\r\n $('.page-share > a').click(function () {\r\n $(this).next('.page-share-list').slideToggle()\r\n })\r\n }, []);\r\n\r\n //GA\r\n const path = location.pathname + location.search;\r\n useEffect(() => {\r\n ReactGA.send({ hitType: \"pageview\", page: path, page_title: \"網站導覽\" });\r\n }, [path]);\r\n\r\n return (\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 {/*
本網站依『無障礙網頁開發規範』設計原則而建置,遵循無障礙網站設計之規範,提供網頁導盲磚(:::)、網站導覽 (Site Navigator)、鍵盤快速鍵 (Access Key) 等設計方式。
*/}\r\n {/*
本網站的主要區塊內容及快速鍵(Accesskey)設定如下:
*/}\r\n {/*
*/}\r\n {/* - 上方導覽區(Alt+U)
*/}\r\n {/* 站內查詢區(Alt+Z):站內關鍵字查詢。 */}\r\n {/* - 左方功能區(Alt+L):此區塊列有單元的次要連結。
*/}\r\n {/* - 中央內容區(Alt+C):為本站主要內容區,點選任一連結之後,其所有內容都會呈現在本區。
*/}\r\n {/*
*/}\r\n {/*
各瀏覽器快速鍵操作說明:
*/}\r\n {/*
*/}\r\n {/* - Internet Explorer 請使用Alt加上快速鍵代碼操作。
*/}\r\n {/* - Firefox 請使用Alt+Shift加上快速鍵代碼操作。
*/}\r\n {/* - Google Chrome 若作業系統為Windows請使用Alt加上快速鍵代碼操作,若為Mac則使用Alt+Option加上快速鍵代碼操作。
*/}\r\n {/* - Opera 請使用Shift+Esc加上快速鍵代碼操作。
*/}\r\n {/* - Safari 若作業系統為Windows請使用Alt加上快速鍵代碼操作,若作業系統為Mac則使用Alt+Option加上快速鍵代碼操作。
*/}\r\n {/*
*/}\r\n {/*
常用鍵盤快速鍵說明:
*/}\r\n {/*
*/}\r\n {/* - ← → or ↑↓:頁面上下左右移動。
*/}\r\n {/* - Home or End:跳至頁面的最上方或最下方。
*/}\r\n {/* - 鍵盤Tab鍵:下一個選項。
*/}\r\n {/* - 鍵盤Tab鍵+Shift鍵:回上一個選項。
*/}\r\n {/* - Ctrl+P:列印網頁。
*/}\r\n {/* - Ctrl+\"加號鍵\"或Ctrl+\"減號鍵\":放大或縮小頁面字級。
*/}\r\n {/*
*/}\r\n {/*
*/}\r\n
\r\n
\r\n
\r\n \r\n
\r\n )\r\n\r\n async function Data() {\r\n const response = await fetch('web/index/getSitmap');\r\n const data = await response.text();\r\n setList(data);\r\n }\r\n\r\n}\r\nexport default From;","import React, { useState, useEffect, useCallback } from 'react';\r\nimport YouTube from 'react-youtube';\r\nimport printform from \"./Print.js\"\r\nimport $ from \"jquery\";\r\n\r\nfunction From() {\r\n\r\n const [lean, setLean] = useState([true]);\r\n const [company, setcompany] = useState([]);\r\n const [companyen, setcompanyen] = useState([]);\r\n\r\n useEffect(() => {\r\n $('.page-share > a').click(function () {\r\n $(this).next('.page-share-list').slideToggle()\r\n })\r\n }, []);\r\n\r\n const handleTw = (event) => {\r\n event.preventDefault();\r\n setLean(true);\r\n }\r\n const handleEn = (event) => {\r\n event.preventDefault();\r\n setLean(false);\r\n }\r\n\r\n\r\n\r\n //const profiletw = useCallback(async () => {\r\n // fetch('web/setting/GetCompanyProfileTw')\r\n // .then((response) => response.text())\r\n // .then((data) => {\r\n // setcompany(data);\r\n // console.log('data:' + data);\r\n // })\r\n // .catch((error) => {\r\n // console.log('Error:' + error);\r\n // });\r\n //}, [])\r\n\r\n //const profileen = useCallback(async () => {\r\n // fetch('web/setting/GetCompanyProfileEn')\r\n // .then((response) => response.text())\r\n // .then((data) => {\r\n // setcompanyen(data);\r\n // console.log('data:' + data);\r\n // })\r\n // .catch((error) => {\r\n // console.log('Error:' + error);\r\n // });\r\n //}, [])\r\n\r\n useEffect(() => {\r\n profiletw();\r\n profileen();\r\n }, []);\r\n async function profiletw() {\r\n const response = await fetch('web/setting/GetCompanyProfileTw/');\r\n const data = await response.text();\r\n setcompany(data);\r\n }\r\n\r\n async function profileen() {\r\n const response = await fetch('web/setting/GetCompanyProfileEn/');\r\n const data = await response.text();\r\n setcompanyen(data);\r\n }\r\n\r\n function VideoPlayer(prop) {\r\n\r\n const videoId = prop.yt;\r\n const opts = {\r\n height: '390',\r\n width: '640',\r\n };\r\n return (\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n function VideoPlayer2(prop) {\r\n\r\n const videoId = prop.yt;\r\n const opts = {\r\n height: '390',\r\n width: '640',\r\n };\r\n return (\r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n return (\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 {lean ? \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} export default From;\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport printform from \"./Print.js\"\r\nimport $ from \"jquery\";\r\nimport ReactGA from \"react-ga4\";\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n const [year, setYear] = useState([]);\r\n\r\n const [searchData, setsearchData] = useState(0);\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = list.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n const handleSearch = useCallback(async () => {\r\n let url = \"web/news/getPostSearch/\" + searchData;\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setList(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }, [searchData]);\r\n\r\n\r\n\r\n useEffect(() => {\r\n Data();\r\n }, []);\r\n\r\n useEffect(() => {\r\n $('.page-share > a').click(function () {\r\n $(this).next('.page-share-list').slideToggle()\r\n })\r\n }, []);\r\n\r\n useEffect(() => {\r\n handleSearch();\r\n }, [handleSearch]);\r\n\r\n //GA\r\n const path = location.pathname + location.search;\r\n useEffect(() => {\r\n ReactGA.send({\r\n hitType: \"pageview\", page: path, page_title: \"公告\" \r\n });\r\n }, [path]);\r\n\r\n async function Data() {\r\n const response = await fetch('/web/news/getPost');\r\n const data = await response.json();\r\n setList(data.data);\r\n setYear(data.date);\r\n }\r\n\r\n const ScrollToTop = () => {\r\n useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, []);\r\n\r\n return null;\r\n };\r\n\r\n const handleInputChange = (event) => {\r\n setsearchData( event.target.value )\r\n };\r\n\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n\r\n return (\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
結果共{list.length}筆\r\n {currentData.length > 0 ?\r\n <>\r\n {currentData.map((data, index) =>\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 function Pagination(props) {\r\n\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n\r\n}\r\nexport default From;\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport printform from \"./Print.js\"\r\nimport $ from \"jquery\";\r\nimport ReactGA from \"react-ga4\";\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n const [year, setYear] = useState([]);\r\n\r\n const [searchData, setsearchData] = useState(0);\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = list.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n const handleSearch = useCallback(async () => {\r\n let url = \"web/news/getNewsSearch/\" + searchData;\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setList(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }, [searchData]);\r\n\r\n\r\n\r\n useEffect(() => {\r\n Data();\r\n }, []);\r\n\r\n useEffect(() => {\r\n $('.page-share > a').click(function () {\r\n $(this).next('.page-share-list').slideToggle()\r\n })\r\n }, []);\r\n\r\n useEffect(() => {\r\n handleSearch();\r\n }, [handleSearch]);\r\n\r\n //GA\r\n const path = location.pathname + location.search;\r\n useEffect(() => {\r\n ReactGA.send({\r\n hitType: \"pageview\", page: path, page_title: \"新聞稿\"\r\n });\r\n }, [path]);\r\n\r\n async function Data() {\r\n const response = await fetch('/web/news/getNews');\r\n const data = await response.json();\r\n setList(data.data);\r\n setYear(data.date);\r\n }\r\n\r\n const ScrollToTop = () => {\r\n useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, []);\r\n\r\n return null;\r\n };\r\n\r\n const handleInputChange = (event) => {\r\n setsearchData(event.target.value)\r\n };\r\n\r\n\r\n\r\n return (\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
結果共{list.length}筆\r\n {currentData.length > 0 ?\r\n <>\r\n {currentData.map((data, index) =>\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 function Pagination(props) {\r\n\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n\r\n}\r\nexport default From;\r\n","import React, { useEffect } from 'react';\r\nimport { Route, Switch, Redirect } from 'react-router-dom';\r\n\r\nimport Header from './Header';\r\nimport Footer from './Footer';\r\nimport NavMenuRWD from './NavMenuRWD';\r\nimport { FooterScript } from './FooterScript';\r\n\r\nimport index from './index';\r\nimport CourseList from './CourseList'; \r\nimport SearchCourseList from './SearchCourseList'; \r\nimport SearchAllList from './SearchAllList'; \r\nimport CourseDetail from './CourseDetail'; \r\n\r\nimport Intellectual from './Intellectual'; \r\nimport Sitmap from './Sitmap'; \r\n\r\nimport CompanyProfile from './CompanyProfile'; \r\nimport Post from './Post'; \r\nimport News from './News'; \r\n\r\nfunction Home() {\r\n\r\n useEffect(() => {\r\n setTimeout(() => {\r\n document.querySelector('.wrapper').style.opacity = 1;\r\n }, 1000); // 1秒後顯現元素\r\n }, []);\r\n\r\n const ScrollToTop = () => {\r\n useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, []);\r\n\r\n return null;\r\n };\r\n\r\n\r\n return (\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} export default Home;","/* eslint-disable no-undef */\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { Helmet } from 'react-helmet';\r\n\r\n\r\nfunction FormLogin() {\r\n\r\n // 使用 state 管理 CAPTCHA 的狀態\r\n //期交所測試先關掉\r\n //const [isVerified, setIsVerified] = useState(false);\r\n const [isVerified, setIsVerified] = useState([]);\r\n const history = useHistory();\r\n\r\n const [formData, setFormData] = useState({\r\n acc_id: '',\r\n acc_pw: '',\r\n });\r\n\r\n const [Setting, setSetting] = useState({\r\n key : '',\r\n });\r\n\r\n useEffect(() => {\r\n GetCAPTCHA();\r\n\r\n const script = document.createElement('script');\r\n script.src = 'https://www.google.com/recaptcha/enterprise.js?render=' + Setting.key;\r\n script.async = true;\r\n document.head.appendChild(script);\r\n\r\n }, [Setting.key]);\r\n\r\n useEffect(() => {\r\n GetReCaptcha_open();\r\n }, []);\r\n\r\n async function GetCAPTCHA() {\r\n try {\r\n const response = await fetch('web/setting/GetCAPTCHA');\r\n const data = await response.text();\r\n setSetting({ key: data });\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n async function GetReCaptcha_open() {\r\n try {\r\n const response = await fetch('web/setting/GetReCaptcha_open');\r\n const data = await response.text();\r\n setIsVerified(data);\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n }\r\n\r\n const handleInputChange = (event) => {\r\n const { name, value } = event.target;\r\n setFormData({ ...formData, [name]: value });\r\n };\r\n\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n \r\n if (isVerified === \"true\") {\r\n\r\n grecaptcha.enterprise.ready(async () => {\r\n const token2 = await grecaptcha.enterprise.execute(Setting.key, { action: 'LOGIN' });\r\n const upload = new FormData();\r\n upload.append('token', token2);\r\n fetch('/admin/login/re', {\r\n method: 'POST',\r\n body: upload,\r\n\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n //alert(\"驗證成功\");\r\n setIsVerified(true);\r\n console.log(\"CAPTCHA verified\");\r\n // Do something with the form data\r\n fetch('/admin/login', {\r\n method: 'POST',\r\n body: JSON.stringify(formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n // 登入驗證成功,跳轉到首頁\r\n history.push('/intranet/GroupSelect');\r\n } else {\r\n // 登入驗證失敗,顯示錯誤訊息\r\n alert(data.message);\r\n console.log(data.message);\r\n history.go(0);\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('Error:', error);\r\n });\r\n } else {\r\n alert(\"驗證失敗\");\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('Error:', error);\r\n });\r\n });\r\n } else {\r\n \r\n // Do something with the form data\r\n fetch('/admin/login', {\r\n method: 'POST',\r\n body: JSON.stringify(formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n // 登入驗證成功,跳轉到首頁\r\n history.push('/intranet/index');\r\n } else {\r\n // 登入驗證失敗,顯示錯誤訊息\r\n alert(data.message);\r\n console.log(data.message);\r\n history.go(0);\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('Error:', error);\r\n });\r\n }\r\n }\r\n\r\n return (\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\nexport default FormLogin;\r\n\r\nclass IntranetLoginAcc {\r\n constructor(RoleId, RoleAcc, RoleDept, RoleName, RoleGroup) {\r\n this.RoleId = RoleId;\r\n this.RoleAcc = RoleAcc;\r\n this.RoleDept = RoleDept;\r\n this.RoleName = RoleName;\r\n this.RoleGroup = RoleGroup;\r\n }\r\n}","import React, { useState,useEffect } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nfunction FormLogin() {\r\n\r\n const [select, setSelect] = useState([]);\r\n\r\n const [formData, setFormData] = useState(\"\");\r\n\r\n const handleInputChange = (event) => {\r\n \r\n setFormData(event.target.value);\r\n };\r\n\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n function check() { \r\n fetch('admin/login/logininfo')\r\n .then(response => response.json())\r\n .then(data => {\r\n if (!data || !data.roleName) {\r\n history.push('/intranet/login');\r\n } else {\r\n }\r\n });\r\n }\r\n check();\r\n }, [history]);\r\n\r\n useEffect(() => {\r\n Data();\r\n }, [ ]);\r\n\r\n\r\n const handleSubmit = (event) => {\r\n console.log(JSON.stringify(formData))\r\n event.preventDefault();\r\n // Do something with the form data\r\n fetch('/admin/login/setGroup', {\r\n method: 'POST',\r\n body: JSON.stringify(formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n history.push('/intranet/Index');\r\n } else {\r\n // 登入驗證失敗,顯示錯誤訊息\r\n alert(data.message);\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('Error:', error);\r\n });\r\n }\r\n\r\n async function Data() {\r\n\r\n const response = await fetch('admin/login/groupInfo');\r\n const data = await response.json();\r\n setSelect(data);\r\n setFormData(data[0].groupId);\r\n }\r\n\r\n return (\r\n <>\r\n\r\n \r\n \r\n >\r\n )\r\n\r\n}\r\n\r\nexport default FormLogin;","import React, { useState, useEffect} from 'react';\r\nimport { Helmet } from 'react-helmet';\r\nimport { useHistory,Link } from 'react-router-dom';\r\nfunction Header() {\r\n\r\n const history = useHistory();\r\n const [intranetLoginAcc, setIntranetLoginAcc] = useState(null);\r\n const [loading, setLoading] = useState(true);\r\n\r\n useEffect(() => {\r\n fetch('admin/login/logininfo')\r\n .then(response => response.json())\r\n .then(data => {\r\n if (!data || !data.roleName) {\r\n history.push('/intranet/login');\r\n } else {\r\n setIntranetLoginAcc(data);\r\n setLoading(false);\r\n }\r\n });\r\n }, [history]);\r\n\r\n const handlego = (href) => {\r\n \r\n history.push(href);\r\n } \r\n\r\n const handlelogout = (event) => {\r\n event.preventDefault();\r\n\r\n fetch('admin/login/logout')\r\n .then(response => response.json())\r\n .then(data => { \r\n if(data.success)\r\n {\r\n alert(\"登出成功\")\r\n history.push('/intranet/login');\r\n }\r\n })\r\n \r\n } \r\n\r\n\r\n\r\n\r\n let contents = loading\r\n ? \r\n : intranetLoginAcc.roleName ;\r\n return (\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\nexport default Header;\r\n","import React, { useState, useEffect, useCallback } from 'react'; \r\nfunction Message() {\r\n\r\n const [course, setCourse] = useState([]);\r\n\r\n const getCourseNum = useCallback(async () => {\r\n const response = await fetch('admin/index/getCourseNum');\r\n const data = await response.json();\r\n setCourse(data);\r\n }, []);\r\n\r\n\r\n\r\n useEffect(() => {\r\n getCourseNum();\r\n }, [getCourseNum]);\r\n\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
新增期貨交易實務
\r\n
{course.trader}
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
新增宣導影片
\r\n
{course.advocateVideo}
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
新增活動與新聞
\r\n
{course.eventNews}
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
新增其他課程
\r\n
{course.otherCourses}
\r\n
\r\n
\r\n
\r\n )\r\n\r\n\r\n} export default Message;","/* eslint-disable no-undef */\r\n\r\nconst loadGoogleCharts = () => {\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = 'https://www.gstatic.com/charts/loader.js';\r\n script.onload = () => {\r\n google.charts.load('current', { packages: ['corechart'] });\r\n google.charts.setOnLoadCallback(resolve);\r\n };\r\n script.onerror = reject;\r\n document.head.appendChild(script);\r\n });\r\n};\r\n\r\nexport default loadGoogleCharts;\r\n","/* eslint-disable no-undef */\r\nimport React, {useEffect, useCallback,useRef } from 'react'; \r\nimport loadGoogleCharts from './googleCharts';\r\n\r\nfunction FuncCountMon() {\r\n const chartRef = useRef(null);\r\n\r\n const getCourseNum = useCallback(async () => {\r\n const response = await fetch('admin/index/getFuncCountMon');\r\n const data = await response.json();\r\n\r\n const chartData = [['label', '點閱率']];\r\n data.forEach(item => {\r\n chartData.push([item.label, item.count]);\r\n });\r\n\r\n const options = {\r\n\r\n chartArea: {\r\n width: '80%', // 设置图表区域宽度\r\n height: '80%', // 设置图表区域高度\r\n },\r\n legend: { position: 'none' },\r\n\r\n };\r\n\r\n try {\r\n\r\n await loadGoogleCharts();\r\n\r\n // 使用Google Charts库创建图表\r\n const chart = new google.visualization.ColumnChart(chartRef.current);\r\n chart.draw(google.visualization.arrayToDataTable(chartData), options);\r\n\r\n } catch (error) {\r\n console.error('Error loading Google Charts:', error);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n getCourseNum();\r\n }, [getCourseNum]);\r\n\r\n return (\r\n \r\n )\r\n\r\n} export default FuncCountMon;","/* eslint-disable no-undef */\r\nimport React, { useEffect, useCallback, useRef } from 'react';\r\nimport loadGoogleCharts from './googleCharts';\r\n\r\nfunction FuncCountYear() {\r\n const chartRef = useRef(null);\r\n\r\n const getCourseNum = useCallback(async () => {\r\n const response = await fetch('admin/index/getFuncCountYear');\r\n const data = await response.json();\r\n\r\n const chartData = [['Month', '交易人員課程', '從業人員課程', '宣導影片', '活動新聞', '其他課程']];\r\n\r\n data.forEach(item => {\r\n chartData.push(item.count);\r\n });\r\n\r\n\r\n const options = { \r\n hAxis: {\r\n ticks: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],\r\n gridlines: {\r\n color: 'transparent', // 设置网格线颜色为透明\r\n },\r\n },\r\n vAxis: {\r\n title: '點閱率',\r\n\r\n },\r\n chartArea: {\r\n width: '80%', // 设置图表区域宽度\r\n height: '80%', // 设置图表区域高度\r\n },\r\n legend: { position: 'top' },\r\n };\r\n\r\n\r\n try {\r\n await loadGoogleCharts();\r\n\r\n // 使用Google Charts库创建图表\r\n const dataTable = google.visualization.arrayToDataTable(chartData);\r\n const chart = new google.visualization.LineChart(chartRef.current);\r\n chart.draw(dataTable, options);\r\n\r\n } catch (error) {\r\n console.error('Error loading Google Charts:', error);\r\n }\r\n\r\n }, []);\r\n\r\n useEffect(() => {\r\n getCourseNum();\r\n }, [getCourseNum]);\r\n\r\n return (\r\n \r\n )\r\n\r\n} export default FuncCountYear;","/* eslint-disable no-undef */\r\nimport React, { useEffect, useCallback, useRef } from 'react';\r\nimport loadGoogleCharts from './googleCharts';\r\n\r\nfunction FuncCountNum() {\r\n const chartRef = useRef(null);\r\n\r\n const getFuncCountNum = useCallback(async () => {\r\n const response = await fetch('admin/index/getFuncCountNum');\r\n const data = await response.json();\r\n\r\n const chartData = [['label', 'count']];\r\n data.forEach(item => {\r\n chartData.push([item.label, item.count]);\r\n });\r\n\r\n const options = {\r\n chartArea: {\r\n width: '90%', // 设置图表区域宽度\r\n height: '90%', // 设置图表区域高度\r\n },\r\n sliceVisibilityThreshold: 0, \r\n };\r\n\r\n try {\r\n await loadGoogleCharts();\r\n\r\n // 使用Google Charts库创建图表\r\n const chart = new google.visualization.PieChart(chartRef.current);\r\n chart.draw(google.visualization.arrayToDataTable(chartData), options);\r\n\r\n } catch (error) {\r\n console.error('Error loading Google Charts:', error);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n getFuncCountNum();\r\n }, [getFuncCountNum]);\r\n\r\n return (\r\n \r\n )\r\n} export default FuncCountNum;","/* eslint-disable no-undef */\r\nimport React, {useEffect, useCallback,useRef } from 'react'; \r\nimport loadGoogleCharts from './googleCharts';\r\n\r\n\r\nfunction FuncCountMon() {\r\n const chartRef = useRef(null);\r\n\r\n const getCourseNum = useCallback(async () => {\r\n const response = await fetch('admin/index/getVideoCountNum');\r\n const data = await response.json();\r\n\r\n try {\r\n await loadGoogleCharts();\r\n\r\n const chartData = [['label', '點閱率']];\r\n data.forEach(item => {\r\n chartData.push([item.label, item.count]);\r\n });\r\n\r\n var table = google.visualization.arrayToDataTable(chartData);\r\n\r\n var view = new google.visualization.DataView(table);\r\n\r\n view.setColumns([0, 1,\r\n {\r\n calc: \"stringify\",\r\n sourceColumn: 1,\r\n type: \"string\",\r\n role: \"annotation\"\r\n }]);\r\n \r\n\r\n const options = {\r\n\r\n chartArea: {\r\n width: '65%', // 设置图表区域宽度\r\n height: '90%', // 设置图表区域高度\r\n },\r\n legend: { position: 'none' },\r\n bar: { groupWidth: \"50%\" }\r\n };\r\n\r\n \r\n\r\n \r\n\r\n // 使用Google Charts库创建图表\r\n const chart = new google.visualization.BarChart(chartRef.current);\r\n chart.draw(view, options);\r\n\r\n } catch (error) {\r\n console.error('Error loading Google Charts:', error);\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n getCourseNum();\r\n }, [getCourseNum]);\r\n\r\n return (\r\n \r\n )\r\n\r\n} export default FuncCountMon;","import React, { useState, useEffect } from \"react\";\r\nimport Message from './index/message';\r\nimport FuncCountMon from './index/FuncCountMon';\r\nimport FuncCountYear from './index/FuncCountYear';\r\nimport FuncCountNum from './index/FuncCountNum';\r\nimport VideoCountNum from './index/VideoCountNum';\r\nimport RoleFastSelect from './index/RoleFastSelect';\r\n\r\nfunction Index() {\r\n\r\n return (\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} export default Index;\r\n\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\n/* eslint-disable no-restricted-globals */\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useHistory, useLocation,Link } from 'react-router-dom';\r\n\r\n\r\nfunction FromGroupList() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [grouplist, setgrouplist] = useState([]);\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = grouplist.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n const [searchData, setsearchData] = useState({\r\n searchText: '',\r\n searchStatus: 99,\r\n });\r\n\r\n useEffect(() => {\r\n groupData();\r\n }, []);\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n async function groupData() {\r\n const response = await fetch('admin/group/GetGroupList');\r\n const data = await response.json();\r\n if (data.success) {\r\n setgrouplist(data.data);\r\n } else {\r\n setgrouplist(data.data);\r\n alert(\"出現錯誤,沒抓到資料\");\r\n }\r\n }\r\n\r\n\r\n function handleStatus(event, status, group) {\r\n event.preventDefault();\r\n let stat = \"\";\r\n let url = \"admin/group/EditGroupStatus/\" + status + \"/\" + group + \"/\" + systemid;\r\n if (status === \"on\") {\r\n stat = \"要將此群組啟用嗎?\";\r\n\r\n } else if (status === \"off\") {\r\n stat = \"要將此群組停用嗎?\";\r\n }\r\n if (confirm(stat)) {\r\n // Do something with the form data\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"修改成功\");\r\n groupData(page);\r\n } else {\r\n alert(\"修改失敗\");\r\n console.log('Error:' + data.message);\r\n groupData(page);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n }\r\n\r\n function handleDelete(event, group) {\r\n event.preventDefault();\r\n\r\n let url = \"admin/group/DeleteGroup/\" + group + \"/\" + systemid;\r\n\r\n if (confirm(\"要將此群組刪除嗎?\")) {\r\n // Do something with the form data\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"刪除成功\");\r\n groupData(page);\r\n } else {\r\n\r\n console.log(data.message);\r\n groupData(page);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n }\r\n\r\n function handleSearch(event) {\r\n event.preventDefault();\r\n let url = \"admin/role/SearchRole\";\r\n // Do something with the form data\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(searchData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setgrouplist(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n function Pagination(props) {\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
角色及權限管理
\r\n \r\n
\r\n
\r\n
\r\n
總計{grouplist.length}筆資料
\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 {currentData.map((group, index) =>\r\n \r\n {(currentPage * 10) + (index + 1)} | \r\n {group.groupName} | \r\n {group.groupStatus === 1 ? \"啟用\" : \"停用\" } | \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\nexport default FromGroupList;","import React, { useState } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\nfunction FromAddGroup() {\r\n\r\n const location = useLocation()\r\n const params = new URLSearchParams(location.search)\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [formData, setFormData] = useState({\r\n groupName: '',\r\n });\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n };\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n if (true) {\r\n // Do something with the form data\r\n fetch('admin/group/AddGroup/' + systemid, {\r\n method: 'POST',\r\n body: JSON.stringify(formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n\r\n alert(\"新增成功\");\r\n history.push('/intranet/admin/system/GroupList?systemid='+systemid+'&page=1');\r\n } else {\r\n\r\n console.log(data.message);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:'+ error);\r\n });\r\n } else {\r\n console.log(\"tete\");\r\n }\r\n }\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid +'&page=1');\r\n }\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n return (\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\nexport default FromAddGroup;","import React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\nfunction FromEditGroup() {\r\n\r\n const location = useLocation()\r\n const params = new URLSearchParams(location.search)\r\n const id = params.get(\"id\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [formData, setFormData] = useState({\r\n groupId: id,\r\n groupName: \"\" ,\r\n });\r\n\r\n const getdetail = useCallback(async () => {\r\n const url = ('admin/group/GetGroupdetail/' +id);\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n setFormData({ \"groupId\": id ,\"groupName\": data.groupName })\r\n }, [id]);\r\n\r\n //const detail = getdetail(params);\r\n useEffect(() => {\r\n getdetail();\r\n }, [getdetail]);\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n };\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n if (true) {\r\n // Do something with the form data\r\n fetch('admin/group/EditGroup/' + systemid, {\r\n method: 'POST',\r\n body: JSON.stringify(formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n\r\n alert(\"修改成功\");\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid +'&page=1');\r\n } else {\r\n alert(\"修改失敗\");\r\n history.go(0);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n } else {\r\n console.log(\"tete\");\r\n }\r\n }\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid +'&page=1');\r\n }\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n return (\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\nexport default FromEditGroup;\r\n\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\nfunction FromEditGroupFunc() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const group_id = params.get(\"id\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [funcData, setfuncData] = useState([]);\r\n const [formData, setFormData] = useState([]);\r\n\r\n async function getdetail() {\r\n const url = ('admin/group/getGroupFuncName');\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n var funcNamedata = [];\r\n for (let i = 0; i < data.length; i++) {\r\n funcNamedata.push(data[i]);\r\n }\r\n setfuncData(funcNamedata)\r\n }\r\n async function getCheck(id) {\r\n const url = ('admin/group/getGroupFuncCheck/' + id);\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n var checkdata = [];\r\n for (let i = 0; i < data.length; i++) {\r\n checkdata.push(\"\" + data[i].funcId);\r\n }\r\n setFormData(checkdata);\r\n }\r\n\r\n useEffect(() => {\r\n getdetail();\r\n getCheck(group_id);\r\n }, [group_id]);\r\n\r\n const handleInputChange = (event) => {\r\n const value = event.target.value;\r\n const data = formData.includes(value)\r\n ? formData.filter(item => item !== value)\r\n : [...formData, value];\r\n\r\n setFormData(data);\r\n };\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n if (true) {\r\n // Do something with the form data\r\n fetch('admin/group/EditGroupFunc/' + group_id + '/' + systemid , {\r\n method: 'POST',\r\n body: JSON.stringify( formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"修改成功\");\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid +'&page=1');\r\n } else {\r\n alert(\"修改失敗\");\r\n console.log(data.message);\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid + '&page=1');\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n } else {\r\n console.log(\"tete\");\r\n }\r\n }\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid + '&page=1');\r\n }\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n\r\n return (\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\nexport default FromEditGroupFunc;\r\n\r\n\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\nfunction FromEditGroupUser() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const group_id = params.get(\"id\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [userData, setuserData] = useState([]);\r\n const [formData, setFormData] = useState([]);\r\n\r\n\r\n useEffect(() => {\r\n getdetail();\r\n getCheck(group_id);\r\n }, [group_id]);\r\n\r\n useEffect(() => {\r\n\r\n }, [formData]);\r\n\r\n const handleInputChange = (event) => {\r\n const value = event.target.value;\r\n const data = formData.includes(value)\r\n ? formData.filter(item => item !== value)\r\n : [...formData, value];\r\n\r\n setFormData(data);\r\n };\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n if (true) {\r\n // Do something with the form data\r\n fetch('admin/group/EditGroupUser/' + group_id + '/' + systemid, {\r\n method: 'POST',\r\n body: JSON.stringify(formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n\r\n alert(\"修改成功\");\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid +'&page=1');\r\n } else {\r\n alert(\"修改失敗\");\r\n console.log(data.message);\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid + '&page=1');\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n } else {\r\n console.log(\"tete\");\r\n }\r\n }\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid +'&page=1');\r\n }\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n\r\n return (\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 async function getdetail() {\r\n const url = ('admin/group/getGroupUserName');\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n var userData = [];\r\n for (let i = 0; i < data.length; i++) {\r\n userData.push(data[i]);\r\n }\r\n setuserData(userData)\r\n }\r\n async function getCheck(id) {\r\n const url = ('admin/group/getGroupUserCheck/' + id);\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n var checkdata = [];\r\n for (let i = 0; i < data.length; i++) {\r\n checkdata.push(\"\" + data[i].roleId);\r\n }\r\n setFormData(checkdata);\r\n }\r\n\r\n\r\n}\r\nexport default FromEditGroupUser;","/* eslint-disable no-restricted-globals */\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useHistory, useLocation,Link } from 'react-router-dom';\r\n\r\n\r\nfunction FromRoleList() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [rolelist, setrolelist]= useState([]);\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = rolelist.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n const [searchData, setsearchData] = useState({\r\n searchText: '',\r\n searchStatus: 99 ,\r\n });\r\n\r\n useEffect(() => {\r\n RoleData(page);\r\n }, [page]);\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setsearchData({ ...searchData, [changeName]: event.target.value })\r\n };\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n } \r\n\r\n async function RoleData() {\r\n\r\n const response = await fetch('admin/role/GetRoleList');\r\n const data = await response.json();\r\n setrolelist(data);\r\n }\r\n\r\n function handleStatus(event, status, id) {\r\n event.preventDefault();\r\n let stat = \"\";\r\n let url = \"admin/role/EditRoleStatus/\" + status + \"/\" + id + '/' + systemid;\r\n if (status === \"on\") {\r\n stat = \"要將此群組啟用嗎?\";\r\n\r\n } else if (status === \"off\") {\r\n stat = \"要將此群組停用嗎?\";\r\n }\r\n if (confirm(stat)) {\r\n\r\n // Do something with the form data\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"修改成功\");\r\n RoleData();\r\n } else {\r\n\r\n console.log(data.message);\r\n RoleData();\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n }\r\n\r\n function handleDelete(event, id) {\r\n event.preventDefault();\r\n\r\n let url = \"admin/role/DeleteRole/\" + id + \"/\" + systemid;\r\n\r\n if (confirm(\"要將此帳號刪除嗎?\")) {\r\n // Do something with the form data\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"刪除成功\");\r\n RoleData();\r\n } else {\r\n console.log(data.message);\r\n RoleData();\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n }\r\n\r\n function handleSearch(event) {\r\n event.preventDefault();\r\n let url = \"admin/role/SearchRole\";\r\n // Do something with the form data\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(searchData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setrolelist(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n function Pagination(props) {\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n function handleClick(i) {\r\n setCurrentPage(i);\r\n window.scrollTo(0, 0);\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
使用者管理
\r\n \r\n
\r\n
\r\n
\r\n
總計{rolelist.length}筆資料
\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 {currentData.map((role, index) =>\r\n \r\n {(currentPage * 10) + (index + 1)} | \r\n {role.roleName} | \r\n {role.roleAcc} | \r\n {role.roleGroup} | \r\n {role.roleStatus === 1 ? \"啟用\" : \"停用\"} | \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\nexport default FromRoleList;\r\n\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\nfunction FromAddRole() {\r\n\r\n const location = useLocation()\r\n const params = new URLSearchParams(location.search)\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [deptlist, setdeptlist] = useState([]);\r\n const [formData, setFormData] = useState({\r\n roleAcc: '',\r\n roleName: '',\r\n roleEmail: '',\r\n roleEmpno: '',\r\n roleDept: '',\r\n roleStatus: 0,\r\n });\r\n\r\n const history = useHistory();\r\n\r\n useEffect(() => {\r\n deptData();\r\n }, []);\r\n\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n };\r\n\r\n const handleRadioChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: parseInt(event.target.value) })\r\n };\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n if (true) {\r\n // Do something with the form data\r\n fetch('/admin/role/AddRole/' + systemid, {\r\n method: 'POST',\r\n body: JSON.stringify(formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n\r\n alert(\"新增成功\");\r\n history.push('/intranet/admin/system/RoleList?systemid=' + systemid +'&page=1');\r\n } else {\r\n alert(\"新增失敗\");\r\n console.log(data.message);\r\n history.push('/intranet/admin/system/RoleList?systemid=' + systemid +'&page=1');\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('Error:', error);\r\n });\r\n } else {\r\n console.log(\"tete\");\r\n }\r\n }\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/admin/system/RoleList?systemid=' + systemid +'&page=1');\r\n }\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n\r\n async function deptData() {\r\n const response = await fetch('admin/role/GetDept');\r\n const data = await response.json();\r\n setdeptlist(data);\r\n }\r\n\r\n return (\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\nexport default FromAddRole;\r\n\r\n\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\nfunction FromEditRole() {\r\n\r\n const location = useLocation()\r\n const params = new URLSearchParams(location.search)\r\n const id = params.get(\"id\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [deptlist, setdeptlist] = useState([]);\r\n const [formData, setFormData] = useState({\r\n roleAcc: '',\r\n roleName: '',\r\n roleEmail: '',\r\n roleEmpno: '',\r\n roleDept: '',\r\n roleGroup: '',\r\n roleStatus: 0,\r\n });\r\n\r\n const history = useHistory();\r\n\r\n const roleData = useCallback(async (id) => {\r\n const response = await fetch('admin/role/GetRoleDetail/' + id);\r\n const data = await response.json();\r\n\r\n const roleAcc = data[0].roleAcc;\r\n const roleName = data[0].roleName;\r\n const roleEmail = data[0].roleEmail;\r\n const roleEmpno = data[0].roleEmpno;\r\n const roleDept = data[0].roleDept;\r\n const roleStatus = data[0].roleStatus;\r\n\r\n setFormData({\r\n \"roleAcc\": roleAcc, \"roleName\": roleName, \"roleEmail\": roleEmail, \"roleEmpno\": roleEmpno,\r\n \"roleDept\": roleDept, \"roleStatus\": roleStatus\r\n });\r\n }, []);\r\n\r\n\r\n useEffect(() => {\r\n roleData(id);\r\n deptData();\r\n }, [id, roleData]);\r\n\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n console.log(formData.roleStatus);\r\n };\r\n\r\n const handleRadioChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: parseInt(event.target.value) })\r\n };\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n if (true) {\r\n // Do something with the form data\r\n fetch('/admin/role/EditRole/' + id + '/' + systemid, {\r\n method: 'POST',\r\n body: JSON.stringify(formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n\r\n alert(\"修改成功\");\r\n history.push('/intranet/admin/system/RoleList?systemid=' + systemid +'&page=1');\r\n } else {\r\n alert(\"修改失敗\");\r\n console.log(data.message);\r\n history.push('/intranet/admin/system/RoleList?systemid=' + systemid +'&page=1');\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('Error:', error);\r\n });\r\n } else {\r\n console.log(\"tete\");\r\n }\r\n }\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/admin/system/RoleList?systemid=' + systemid +'&page=1');\r\n }\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n\r\n async function deptData() {\r\n const response = await fetch('admin/role/GetDept');\r\n const data = await response.json();\r\n setdeptlist(data);\r\n }\r\n\r\n return (\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\nexport default FromEditRole;\r\n\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n const [func, setFunc] = useState([]);\r\n\r\n\r\n const [searchData, setsearchData] = useState({\r\n\r\n searchName: '',\r\n searchSDate: '',\r\n searchShh: '00',\r\n searchSmm: '00',\r\n searchEDate: '',\r\n searchEhh: '00',\r\n searchEmm: '00',\r\n searchIp: '',\r\n searchText: '',\r\n });\r\n\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = list.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n\r\n useEffect(() => {\r\n Data();\r\n }, []);\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setsearchData({ ...searchData, [changeName]: event.target.value })\r\n };\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n return (\r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n
使用者操作紀錄
\r\n \r\n
\r\n
\r\n
\r\n
總計{list.length}筆資料
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n 項次 | \r\n 日期 | \r\n 使用者帳號 | \r\n 使用者姓名 | \r\n IP | \r\n 內容 | \r\n
\r\n {currentData.map((data,index)=> \r\n \r\n {(currentPage * 10) + (index + 1) } | \r\n {data.createDate } | \r\n {data.roleAcc} | \r\n {data.operatorName} | \r\n {data.ip} | \r\n {data.action} | \r\n
\r\n )}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n\r\n async function Data() {\r\n\r\n const response = await fetch('admin/log/getUserLog');\r\n const data = await response.json();\r\n setList(data);\r\n\r\n }\r\n\r\n function handleSearch(event) {\r\n event.preventDefault();\r\n let url = \"admin/log/getLogSearch/\" + systemid;\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(searchData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setList(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n\r\n }\r\n\r\n function Pagination(props) {\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\nexport default From;\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n const [func, setFunc] = useState([]);\r\n\r\n\r\n const [searchData, setsearchData] = useState({\r\n\r\n searchGroup: '',\r\n searchAcc: '',\r\n\r\n\r\n });\r\n\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = list.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n\r\n useEffect(() => {\r\n Data();\r\n }, []);\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setsearchData({ ...searchData, [changeName]: event.target.value })\r\n };\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n return (\r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n
權限報表列印作業
\r\n \r\n
\r\n
\r\n
\r\n
總計{list.length}筆資料
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n 序號 | \r\n 帳號 | \r\n 角色 | \r\n
\r\n {currentData.map((data,index)=>\r\n \r\n {(currentPage * 10) + (index + 1)} | \r\n {data.roleAcc } | \r\n {data.groupName } | \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 async function Data() {\r\n\r\n const response = await fetch('admin/roleGroup/getUserGroup');\r\n const data = await response.json();\r\n setList(data);\r\n\r\n }\r\n\r\n function handleSearch(event) {\r\n event.preventDefault();\r\n let url = \"admin/roleGroup/geUserSearch/\" + systemid;\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(searchData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setList(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n function handleExcel(event) {\r\n\r\n const now = new Date();\r\n const year = now.getFullYear().toString();\r\n const month = String(now.getMonth() + 1).padStart(2, '0').toString();\r\n const day = String(now.getDate()).padStart(2, '0').toString();\r\n const today = year + month + day;\r\n\r\n event.preventDefault();\r\n let url = \"admin/roleGroup/ExportToExcel\" ;\r\n fetch(url)\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = today + \"期交所影音權限報表列印\" ;\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n\r\n function Pagination(props) {\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\nexport default From;\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n const [func, setFunc] = useState([]);\r\n\r\n const [intranetLoginAcc, setIntranetLoginAcc] = useState(null);\r\n\r\n const [searchData, setsearchData] = useState({\r\n searchGroup: '',\r\n searchAcc: '',\r\n });\r\n\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = list.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n useEffect(() => {\r\n fetch('admin/login/logininfo')\r\n .then(response => response.json())\r\n .then(data => {\r\n if (!data || !data.roleName) {\r\n\r\n } else {\r\n setIntranetLoginAcc(data);\r\n console.log(data.roleId);\r\n Data(data.roleId);\r\n }\r\n });\r\n }, []);\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setsearchData({ ...searchData, [changeName]: event.target.value })\r\n };\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n return (\r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n
個人權限
\r\n \r\n
\r\n
總計{list.length}筆資料
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n\r\n async function Data(id) {\r\n\r\n const response = await fetch('admin/personRole/getPersonRole/'+id);\r\n const data = await response.json();\r\n setList(data);\r\n\r\n }\r\n\r\n function Pagination(props) {\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\nexport default From;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\nfunction FromEditGroupFunc() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const group_id = params.get(\"id\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [funcData, setfuncData] = useState([]);\r\n const [formData, setFormData] = useState([]);\r\n\r\n async function getdetail() {\r\n const url = ('admin/group/getGroupFuncName');\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n var funcNamedata = [];\r\n for (let i = 0; i < data.length; i++) {\r\n funcNamedata.push(data[i]);\r\n }\r\n setfuncData(funcNamedata)\r\n }\r\n async function getCheck(id) {\r\n const url = ('admin/group/getGroupFuncCheck/' + id);\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n var checkdata = [];\r\n for (let i = 0; i < data.length; i++) {\r\n checkdata.push(\"\" + data[i].funcId);\r\n }\r\n setFormData(checkdata);\r\n }\r\n\r\n useEffect(() => {\r\n getdetail();\r\n getCheck(group_id);\r\n }, [group_id]);\r\n\r\n const handleInputChange = (event) => {\r\n const value = event.target.value;\r\n const data = formData.includes(value)\r\n ? formData.filter(item => item !== value)\r\n : [...formData, value];\r\n\r\n setFormData(data);\r\n };\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n if (true) {\r\n // Do something with the form data\r\n fetch('admin/group/EditGroupFunc/' + group_id + '/' + systemid , {\r\n method: 'POST',\r\n body: JSON.stringify( formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"修改成功\");\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid +'&page=1');\r\n } else {\r\n alert(\"修改失敗\");\r\n console.log(data.message);\r\n history.push('/intranet/admin/system/GroupList?systemid=' + systemid + '&page=1');\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n } else {\r\n console.log(\"tete\");\r\n }\r\n }\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/admin/system/PersonRole?systemid=' + systemid + '&page=1');\r\n }\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n\r\n return (\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\nexport default FromEditGroupFunc;\r\n\r\n\r\n","/* eslint-disable no-restricted-globals */\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useLocation, useHistory } from 'react-router-dom';\r\n\r\n\r\nfunction FromBannerList() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n\r\n const [bannerlist, setbannerlist] = useState([]);\r\n const [searchData, setsearchData] = useState({\r\n searchText: '',\r\n });\r\n\r\n const [WebImg, setWebImg] = useState([]);\r\n\r\n const history = useHistory();\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = bannerlist.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n useEffect(() => {\r\n bannerData(page);\r\n imgurl();\r\n }, [page]);\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setsearchData({ ...searchData, [changeName]: event.target.value })\r\n };\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n\r\n async function imgurl() {\r\n const response = await fetch('web/setting/GetWebImg');\r\n const data = await response.text();\r\n setWebImg(data);\r\n }\r\n //onClick={(event) => handlego(event, )}\r\n return (\r\n \r\n\r\n
\r\n
\r\n
\r\n
Banner管理
\r\n \r\n
\r\n
\r\n
\r\n
總計{bannerlist.length}筆資料
\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 {currentData.map((banner, index) =>\r\n \r\n {(currentPage*10)+(index + 1)} | \r\n {banner.bannerTitle} | \r\n {banner.bannerImg != null ?\r\n  | \r\n :\r\n 無 | \r\n }\r\n {banner.bannerUrl} | \r\n {banner.bannerStatus === 1 ? \"使用中\" : \"停用\"} | \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 async function bannerData(page) {\r\n\r\n const response = await fetch('admin/banner/GetBannerList/' + page);\r\n const data = await response.json();\r\n setbannerlist(data);\r\n }\r\n\r\n\r\n function handleUp(event, id, sort) {\r\n\r\n let url = \"admin/banner/UpBannerSort/\" + id+\"/\"+sort;\r\n\r\n if (sort === 1) {\r\n alert(\"已經是最上面了\");\r\n }\r\n else { \r\n // Do something with the form data\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n bannerData(page);\r\n } else {\r\n alert(\"失敗了\");\r\n history.go(0);\r\n }\r\n })\r\n .catch((error) => {\r\n window.console.log('Error:' + error);\r\n });\r\n }\r\n\r\n }\r\n function handleDown(event, id, sort, count) {\r\n\r\n let url = \"admin/banner/DownBannerSort/\" + id + \"/\" + sort;\r\n\r\n if (sort === count) {\r\n alert(\"已經是最下面了\");\r\n }\r\n else {\r\n // Do something with the form data\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n bannerData(page);\r\n } else {\r\n window.history.go(0);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n }\r\n\r\n function handleDelete(event, id) {\r\n\r\n\r\n let url = \"admin/banner/DeleteBanner/\" + systemid + \"/\" + id ;\r\n\r\n if (confirm(\"要將此Banner刪除嗎?\")) {\r\n // Do something with the form data\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"刪除成功\");\r\n bannerData(page);\r\n } else {\r\n\r\n bannerData(page);\r\n alert(data.message);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n }\r\n\r\n function handleSearch(event) {\r\n\r\n let url = \"admin/banner/Search\";\r\n // Do something with the form data\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(searchData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setbannerlist(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n function Pagination(props) {\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n function handleClick(i) {\r\n setCurrentPage(i);\r\n window.scrollTo(0, 0);\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n}\r\nexport default FromBannerList;\r\n\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\n\r\nfunction FromAddBanner() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [file, setFile] = useState();\r\n\r\n const [formData, setFormData] = useState({\r\n bannerTitle: '',\r\n bannerUrl: '',\r\n bannerImg:'',\r\n bannerStatus: 0,\r\n bannerTarget: 1,\r\n bannerSDate: '',\r\n bannerEDate: '',\r\n bannerENever: 1,\r\n });\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n };\r\n\r\n const handleCheckChange = (event) => {\r\n let changeName = event.target.name\r\n if (formData.bannerENever===0) {\r\n setFormData({ ...formData, [changeName]: 1 })\r\n } else { \r\n setFormData({ ...formData, [changeName]: 0 })\r\n }\r\n };\r\n const handleUploadChange = (event) => {\r\n setFile(event.target.files[0])\r\n setFormData({ ...formData, \"bannerImg\": event.target.files[0].name })\r\n };\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n\r\n const upload = new FormData();\r\n upload.append('bannerTitle', formData.bannerTitle);\r\n upload.append('bannerUrl', formData.bannerUrl);\r\n upload.append('bannerImg', formData.bannerImg);\r\n upload.append('bannerStatus', formData.bannerStatus);\r\n upload.append('bannerTarget', formData.bannerTarget);\r\n upload.append('bannerSDate', formData.bannerSDate);\r\n upload.append('bannerEDate', formData.bannerEDate);\r\n upload.append('bannerENever', formData.bannerENever);\r\n upload.append('file', file);\r\n if (true) {\r\n fetch('/admin/banner/AddBanner/' + systemid, {\r\n method: 'POST',\r\n body: upload,\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"新增成功\");\r\n history.push('/intranet/banner/BannerList?systemid=3&page=1');\r\n }\r\n else {\r\n alert(\"新增失敗;\" + data.message);\r\n history.push('/intranet/banner/BannerList?systemid=3&page=1');\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n } else {\r\n console.log(\"tete\");\r\n }\r\n }\r\n\r\n\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/banner/BannerList?systemid=3&page=1');\r\n }\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n\r\n return (\r\n <>\r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n
Banner管理
\r\n \r\n
\r\n
\r\n
\r\n >\r\n )\r\n \r\n\r\n}\r\nexport default FromAddBanner;\r\n\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\n\r\nfunction FromEditBanner() {\r\n\r\n const location = useLocation()\r\n const params = new URLSearchParams(location.search)\r\n const id = params.get(\"id\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [file, setFile] = useState();\r\n\r\n const [formData, setFormData] = useState({\r\n bannerTitle: '',\r\n bannerUrl: '',\r\n bannerImg: ' ',\r\n bannerStatus: 0,\r\n bannerTarget: 0,\r\n bannerSDate: '',\r\n bannerEDate: '',\r\n bannerENever: 0 === 1 ? true : false ,\r\n });\r\n/* const [formData, setFormData] = useState([]);*/\r\n\r\n\r\n useEffect(() => {\r\n fetch('admin/banner/GetBannerDetail/' + id)\r\n .then((response) => response.json())\r\n .then((data) => \r\n setFormData({\r\n \"bannerTitle\": data.bannerTitle != null ? data.bannerTitle : \"\",\r\n \"bannerUrl\": data.bannerUrl != null ? data.bannerUrl : \"\",\r\n \"bannerImg\": data.bannerImg != null ? data.bannerImg : \"\",\r\n \"bannerStatus\": data.bannerStatus ,\r\n \"bannerTarget\": data.bannerTarget ,\r\n \"bannerSDate\": data.bannerSDate != null ? data.bannerSDate.substr(0, 10) : \"\" ,\r\n \"bannerEDate\": data.bannerEDate != null ? data.bannerEDate.substr(0, 10) : \"\",\r\n \"bannerENever\": data.bannerENever ,\r\n })\r\n );\r\n }, [id]);\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n };\r\n\r\n const handleCheckChange = (event) => {\r\n let changeName = event.target.name\r\n if (formData.bannerENever === 0) {\r\n setFormData({ ...formData, [changeName]: 1 })\r\n } else {\r\n setFormData({ ...formData, [changeName]: 0 })\r\n }\r\n };\r\n const handleUploadChange = (event) => {\r\n setFile(event.target.files[0])\r\n /*setFormData({ ...formData, \"bannerImg\": event.target.files[0].name })*/\r\n };\r\n\r\n const history = useHistory();\r\n\r\n\r\n const handleSubmit = (event) => {\r\n const upload = new FormData();\r\n upload.append('bannerTitle', formData.bannerTitle);\r\n upload.append('bannerUrl', formData.bannerUrl);\r\n upload.append('bannerImg', formData.bannerImg);\r\n upload.append('bannerStatus', formData.bannerStatus);\r\n upload.append('bannerTarget', formData.bannerTarget);\r\n upload.append('bannerSDate', formData.bannerSDate);\r\n upload.append('bannerEDate', formData.bannerEDate);\r\n upload.append('bannerENever', formData.bannerENever);\r\n upload.append('file', file);\r\n if (true) {\r\n fetch('/admin/banner/EditBanner/' + id + '/' + systemid, {\r\n method: 'POST',\r\n body: upload,\r\n\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"修改成功\");\r\n history.push('/intranet/banner/BannerList?systemid=3&page=1');\r\n } else {\r\n alert(\"修改失敗;\" + data.message);\r\n history.push('/intranet/banner/BannerList?systemid=3&page=1');\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n } else {\r\n console.log(\"tete\");\r\n }\r\n }\r\n\r\n\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/banner/BannerList?systemid=3&page=1');\r\n }\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n\r\n return (\r\n <>\r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n
Banner管理
\r\n \r\n
\r\n
\r\n
\r\n >\r\n )\r\n\r\n\r\n}\r\nexport default FromEditBanner;","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","import React, { useState } from 'react';\r\nimport Slider from 'react-slick';\r\nimport 'slick-carousel/slick/slick.css';\r\nimport 'slick-carousel/slick/slick-theme.css';\r\n\r\nfunction Banner() {\r\n\r\n const [demoImg] = useState(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16']);\r\n\r\n\r\n const settings = {\r\n infinite: true,\r\n speed: 500,\r\n slidesToShow: 3,\r\n slidesToScroll: 1,\r\n autoplay: true,\r\n autoplaySpeed: 5000,\r\n pauseOnHover: true,\r\n prevArrow:
,\r\n nextArrow:
,\r\n };\r\n\r\n return (\r\n \r\n
\r\n {demoImg.map((item, index) =>\r\n
\r\n )}\r\n \r\n
\r\n )\r\n\r\n} export default Banner;\r\n\r\n","/* eslint-disable jsx-a11y/anchor-has-content */\r\n/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport ImgSlider from './ImgSlider';\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const systemid = params.get(\"systemid\");\r\n\r\n const uu = uuidv4();\r\n\r\n const today = new Date();\r\n const formattedDate = `${today.getFullYear()}-${(today.getMonth() + 1).toString().padStart(2, '0')}-${today.getDate().toString().padStart(2, '0')}`;\r\n\r\n const [file, setFile] = useState([]);\r\n\r\n const [uploaded, setUploaded] = useState([]);\r\n\r\n const [img, setImg] = useState();\r\n\r\n const [func, setFunc] = useState([]);\r\n\r\n const [guid] = useState(uu);\r\n\r\n const [formData, setFormData] = useState({\r\n docTitle: '',\r\n docContent: '',\r\n docSDate: formattedDate,\r\n docEDate: '',\r\n docENever: 1,\r\n docTop: 0 ,\r\n docVideoUrl: '',\r\n docImgSize: 0,\r\n docImgRandom: 1,\r\n docStatus: 0,\r\n docSort: '',\r\n docRandomImg: Math.floor(Math.random() * 16) + 1,\r\n docWarn: (systemid === \"12\" || systemid === \"13\") ? 1 : 0,\r\n });\r\n\r\n const funcData = useCallback(async (systemid) => {\r\n const response = await fetch('admin/doc/getFunc/' + systemid);\r\n const data = await response.json();\r\n setFunc(data);\r\n }, []);\r\n\r\n useEffect(() => {\r\n funcData(systemid);\r\n }, [funcData, systemid]);\r\n\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n //console.log(file);\r\n };\r\n\r\n const handleRadioChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: parseInt(event.target.value) })\r\n };\r\n\r\n const handleCheckChange = (event) => {\r\n let changeName = event.target.name\r\n if (formData.docENever === 0) {\r\n setFormData({ ...formData, [changeName]: 1 })\r\n } else {\r\n setFormData({ ...formData, [changeName]: 0 })\r\n }\r\n };\r\n\r\n const handleUploadChange = (event) => {\r\n setImg(event.target.files[0])\r\n if (event.target.files[0]!=null) { \r\n setFormData({ ...formData, \"docImgSize\": event.target.files[0].size })\r\n }\r\n };\r\n\r\n const handleFileChange = (event) => {\r\n setFile(event.target.files[0])\r\n \r\n };\r\n\r\n const handleFileSubmit = (event) => {\r\n const upload = new FormData();\r\n upload.append('file', file);\r\n if (true) {\r\n fetch('/admin/doc/UploadAtt/' + systemid + '/' + guid , {\r\n method: 'POST',\r\n body: upload,\r\n\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n const tem = uploaded;\r\n tem.push(data.docAtt)\r\n setUploaded(tem);\r\n setFile(null);\r\n document.getElementById(\"docAtt\").value = \"\"\r\n }\r\n else {\r\n alert(\"新增檔案失敗\" + data.message);\r\n setFile(null);\r\n document.getElementById(\"docAtt\").value = \"\"\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n } else {\r\n //console.log(\"tete\");\r\n }\r\n };\r\n\r\n function handleFileDelete(event, id, index) {\r\n event.preventDefault();\r\n const upload = new FormData();\r\n upload.append('file', file);\r\n if (true) {\r\n fetch('/admin/doc/DeleteAtt/' + systemid + '/' + id, {\r\n method: 'POST',\r\n body: upload,\r\n\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(data.message);\r\n const tem = uploaded;\r\n tem.splice(index, 1);\r\n setUploaded([]);\r\n setUploaded(tem);\r\n }\r\n else {\r\n alert(\"刪除檔案失敗\" + data.message);\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n }\r\n };\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault();\r\n const upload = new FormData();\r\n upload.append('docTitle', formData.docTitle);\r\n upload.append('docContent', formData.docContent);\r\n upload.append('docSDate', formData.docSDate);\r\n upload.append('docEDate', formData.docEDate);\r\n upload.append('docENever', formData.docENever);\r\n upload.append('docTop', formData.docTop);\r\n upload.append('docVideoUrl', formData.docVideoUrl);\r\n upload.append('ImgRandom', formData.docImgRandom);\r\n upload.append('docStatus', formData.docStatus);\r\n upload.append('docSort', formData.docSort);\r\n upload.append('docRandomImg', formData.docRandomImg);\r\n upload.append('docWarn', formData.docWarn); \r\n upload.append('file', img);\r\n\r\n if (formData.docImgSize <= (1024 * 1024 * 5) || img.length<0) {\r\n fetch('/admin/doc/AddCourse/' + systemid + '/' + guid , {\r\n method: 'POST',\r\n body:upload,\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success ) {\r\n alert(\"新增成功\");\r\n history.push('/intranet/video/CourseList?systemid=' + systemid +'&page=1');\r\n }\r\n else {\r\n alert(\"新增失敗;\" + data.message);\r\n history.push('/intranet/video/CourseList?systemid=' + systemid + '&page=1');\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n } else {\r\n alert(\"圖片大小不可超過5MB\");\r\n }\r\n }\r\n\r\n function handleFileDownload(event, id, name) {\r\n event.preventDefault();\r\n\r\n fetch('/admin/doc/DownloadAtt/' + systemid + '/' + id,)\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = name ;\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n\r\n }\r\n\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/video/CourseList?systemid=' + systemid + '&page=1');\r\n }\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n\r\n return (\r\n <>\r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n
{func.funcName}
\r\n \r\n
\r\n
\r\n
\r\n >\r\n )\r\n\r\n\r\n}\r\nexport default From;","/* eslint-disable jsx-a11y/anchor-is-valid */\r\n/* eslint-disable jsx-a11y/anchor-has-content */\r\n/* eslint-disable no-restricted-globals */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n const [func, setFunc] = useState([]);\r\n\r\n const [searchData, setsearchData] = useState({\r\n searchText: '',\r\n searchStatus: 99,\r\n });\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = list.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n\r\n\r\n const funcData = useCallback(async () => {\r\n const response = await fetch('admin/doc/getFunc/' + systemid);\r\n const data = await response.json();\r\n setFunc(data);\r\n }, [systemid]);\r\n\r\n useEffect(() => {\r\n funcData();\r\n Data(systemid);\r\n setCurrentPage(0);\r\n }, [funcData, systemid]);\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setsearchData({ ...searchData, [changeName]: event.target.value })\r\n };\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n async function Data(systemid) {\r\n\r\n const response = await fetch('admin/doc/getCourse/' + systemid);\r\n const data = await response.json();\r\n setList(data);\r\n }\r\n\r\n\r\n function handleDelete(event, id) {\r\n\r\n let url = \"admin/doc/DeleteDoc/\" + systemid + \"/\" + id;\r\n\r\n if (confirm(\"要將此影片刪除嗎?\")) {\r\n // Do something with the form data\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"刪除成功\");\r\n Data(systemid);\r\n } else {\r\n\r\n console.log(data.message);\r\n }\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n }\r\n\r\n function handleSearch(event) {\r\n event.preventDefault();\r\n let url = \"admin/doc/SearchCourse/\" + systemid;\r\n // Do something with the form data\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(searchData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setList(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n function Pagination(props) {\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n function handleClick(i) {\r\n setCurrentPage(i);\r\n window.scrollTo(0, 0);\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n\r\n
\r\n
\r\n
{func.funcName}
\r\n \r\n
\r\n
\r\n
\r\n
總計{list.length}筆資料
\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 {currentData.map((data, index) =>\r\n \r\n {(currentPage * 10) + (index + 1)} | \r\n {data.docTitle} | \r\n {data.docContent} | \r\n {\r\n data.docEDate != null ? {data.docSDate.substring(0, 10)} ~ {data.docEDate.substring(0, 10)} | :\r\n {data.docSDate.substring(0, 10)} ~ 永不下架 | \r\n }\r\n {data.docStatus === 0 && \"不顯示\"}{data.docStatus === 1 && \"顯示\"}{data.docStatus === 2 && \"顯示Live\"}{data.docStatus === 3 && \"非公開\"} | \r\n \r\n handlego(event, \"./EditCourse?systemid=\" + systemid + \"&id=\" + data.docId)} >編輯\r\n handleDelete(event, data.docId)} >刪除\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\nexport default From;\r\n\r\n\r\n","/* eslint-disable jsx-a11y/anchor-has-content */\r\n/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport ImgSlider from './ImgSlider';\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const systemid = params.get(\"systemid\");\r\n const id = params.get(\"id\");\r\n\r\n const uu = uuidv4();\r\n\r\n const [file, setFile] = useState([]);\r\n\r\n const [uploaded, setUploaded] = useState([]);\r\n\r\n const [img, setImg] = useState();\r\n\r\n const [func, setFunc] = useState([]);\r\n\r\n const [guid] = useState(uu);\r\n\r\n\r\n\r\n const [formData, setFormData] = useState({\r\n docTitle: '',\r\n docContent: '',\r\n docSDate: '',\r\n docEDate: '',\r\n docENever: 0,\r\n docTop: 0 ,\r\n docVideoUrl: '',\r\n docImgSize: 0 ,\r\n docImgRandom: 1,\r\n docStatus: 0,\r\n docSort: 0,\r\n docImg: '',\r\n docRandomImg: '',\r\n docWarn: 0,\r\n });\r\n\r\n const funcData = useCallback(async (systemid) => {\r\n const response = await fetch('admin/doc/getFunc/' + systemid);\r\n const data = await response.json();\r\n setFunc(data);\r\n }, []);\r\n\r\n const Att = useCallback(async (systemid) => {\r\n const response = await fetch('admin/doc/getCourseAtt/' + systemid);\r\n const data = await response.json();\r\n setUploaded(data);\r\n }, []);\r\n\r\n const Data = useCallback(async (id) => {\r\n const response = await fetch('admin/doc/getCourseDetail/' + id);\r\n const data = await response.json();\r\n setFormData({\r\n \"docTitle\": data.docTitle,\r\n \"docContent\": data.docContent,\r\n \"docSDate\": data.docSDate != null ? data.docSDate.substr(0, 10) : \"\",\r\n \"docEDate\": data.docEDate != null ? data.docEDate.substr(0, 10) : \"\",\r\n \"docENever\": data.docENever,\r\n \"docTop\": data.docTop,\r\n \"docVideoUrl\": data.docVideoUrl,\r\n \"docImgRandom\": data.imgRandom,\r\n \"docStatus\": data.docStatus,\r\n \"docSort\": data.docSort,\r\n \"docImgSize\": 0,\r\n \"docImg\": data.docImg,\r\n \"docRandomImg\": data.docImg,\r\n \"docWarn\": data.docWarn,\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n funcData(systemid);\r\n Data(id);\r\n Att(id);\r\n }, [Att, Data, funcData, id, systemid]);\r\n\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n };\r\n\r\n const handleCheckChange = (event) => {\r\n let changeName = event.target.name\r\n if (formData.docENever === 0) {\r\n setFormData({ ...formData, [changeName]: 1 })\r\n } else {\r\n setFormData({ ...formData, [changeName]: 0 })\r\n }\r\n };\r\n\r\n const handleRadioChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: parseInt(event.target.value) })\r\n };\r\n\r\n const handleUploadChange = (event) => {\r\n setImg(event.target.files[0])\r\n if (event.target.files[0] != null) {\r\n setFormData({ ...formData, \"docImgSize\": event.target.files[0].size })\r\n }\r\n };\r\n\r\n const handleFileChange = (event) => {\r\n setFile(event.target.files[0])\r\n //console.log(file);\r\n };\r\n\r\n const handleFileSubmit = (event) => {\r\n const upload = new FormData();\r\n upload.append('file', file);\r\n if (true) {\r\n fetch('/admin/doc/UploadAtt/' + systemid + '/' + guid, {\r\n method: 'POST',\r\n body: upload,\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n const tem = uploaded;\r\n tem.push(data.docAtt)\r\n setUploaded(tem);\r\n setFile(null);\r\n document.getElementById(\"docAtt\").value = \"\"\r\n }\r\n else {\r\n alert(\"新增檔案失敗\" + data.message);\r\n setFile(null);\r\n document.getElementById(\"docAtt\").value = \"\"\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n } else {\r\n console.log(\"tete\");\r\n }\r\n };\r\n\r\n function handleFileDelete(event, id, index) {\r\n event.preventDefault();\r\n const upload = new FormData();\r\n upload.append('file', file);\r\n if (true) {\r\n fetch('/admin/doc/DeleteAtt/' + systemid + '/' + id, {\r\n method: 'POST',\r\n body: upload,\r\n\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n const tem = uploaded;\r\n tem.splice(index, 1);\r\n setUploaded([]);\r\n setUploaded(tem);\r\n }\r\n else {\r\n alert(\"刪除檔案失敗\" + data.message);\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n }\r\n };\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n const upload = new FormData();\r\n upload.append('docTitle', formData.docTitle);\r\n upload.append('docContent', formData.docContent);\r\n upload.append('docSDate', formData.docSDate);\r\n upload.append('docEDate', formData.docEDate);\r\n upload.append('docENever', formData.docENever);\r\n upload.append('docTop', formData.docTop);\r\n upload.append('docVideoUrl', formData.docVideoUrl);\r\n upload.append('ImgRandom', formData.docImgRandom);\r\n upload.append('docStatus', formData.docStatus);\r\n upload.append('docSort', formData.docSort); \r\n upload.append('docRandomImg', formData.docRandomImg); \r\n upload.append('docWarn', formData.docWarn); \r\n upload.append('file', img);\r\n\r\n\r\n if (formData.docImgSize <= (1024 * 1024 * 5) || img!=null) {\r\n fetch('/admin/doc/EditCourse/' + systemid + '/' + guid + '/' + id, {\r\n method: 'POST',\r\n body: upload,\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"修改成功\");\r\n history.push('/intranet/video/CourseList?systemid=' + systemid + '&page=1');\r\n }\r\n else {\r\n alert(\"修改失敗;\" + data.message);\r\n history.push('/intranet/video/CourseList?systemid=' + systemid + '&page=1');\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n } else {\r\n alert(\"圖片大小不可超過5MB\");\r\n }\r\n }\r\n\r\n function handleFileDownload(event, id, name) {\r\n event.preventDefault();\r\n\r\n fetch('/admin/doc/DownloadAtt/' + systemid + '/' + id,)\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = name;\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n\r\n }\r\n\r\n const handlecancel = (event) => {\r\n event.preventDefault();\r\n history.push('/intranet/video/CourseList?systemid=' + systemid + '&page=1');\r\n }\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n return (\r\n <>\r\n \r\n\r\n
\r\n
\r\n
\r\n
{func.funcName}
\r\n \r\n
\r\n
\r\n
\r\n >\r\n )\r\n\r\n\r\n}\r\nexport default From;","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [formData, setFormData] = useState({\r\n tfContent:\"\",\r\n });\r\n\r\n\r\n\r\n const Data = useCallback(async (systemid) => {\r\n const response = await fetch('admin/footer/GetFooter/' + systemid);\r\n const data = await response.json();\r\n setFormData(data);\r\n }, []);\r\n\r\n useEffect(() => {\r\n Data(systemid)\r\n }, [Data, systemid]);\r\n\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n console.log(event.target.value);\r\n };\r\n\r\n\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n\r\n fetch('/admin/footer/EditIntel/' + systemid , {\r\n method: 'POST',\r\n body: JSON.stringify(formData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"修改成功\");\r\n history.go(0);\r\n }\r\n else {\r\n alert(\"修改失敗;\" + data.message);\r\n history.go(0);\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n }\r\n\r\n\r\n const handleclean = (event) => {\r\n event.preventDefault();\r\n setFormData({ tfContent: \"\"})\r\n }\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n return (\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\r\n}\r\nexport default From;","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [formData, setFormData] = useState([]);\r\n\r\n const [img, setImg] = useState();\r\n\r\n const Data = useCallback(async (systemid) => {\r\n const response = await fetch('admin/footer/GetFooter/' + systemid);\r\n const data = await response.json();\r\n setFormData(data);\r\n }, []);\r\n\r\n useEffect(() => {\r\n Data(systemid)\r\n }, [Data, systemid]);\r\n\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n console.log(event.target.value);\r\n console.log(formData);\r\n };\r\n\r\n const handleUploadChange = (event) => {\r\n setImg(event.target.files[0])\r\n };\r\n\r\n\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n const upload = new FormData();\r\n upload.append('TfContent', formData.tfContent);\r\n upload.append('TfInfo', formData.tfInfo);\r\n upload.append('file', img);\r\n fetch('/admin/footer/EditContactInfo/' + systemid, {\r\n method: 'POST',\r\n body: upload,\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"修改成功\");\r\n history.go(0);\r\n }\r\n else {\r\n alert(\"修改失敗;\" + data.message);\r\n history.go(0);\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n }\r\n\r\n\r\n const handleclean = (event) => {\r\n event.preventDefault();\r\n setFormData({ tfContent: \"\" })\r\n }\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n\r\n return (\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\nexport default From;","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const systemid = params.get(\"systemid\");\r\n\r\n const [formData, setFormData] = useState([]);\r\n const [img, setImg] = useState();\r\n\r\n\r\n const Data = useCallback(async (systemid) => {\r\n const response = await fetch('admin/footer/GetFooter/' + systemid);\r\n const data = await response.json();\r\n setFormData(data);\r\n }, []);\r\n\r\n useEffect(() => {\r\n Data(systemid)\r\n }, [Data, systemid]);\r\n\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setFormData({ ...formData, [changeName]: event.target.value })\r\n console.log(event.target.value);\r\n console.log(formData);\r\n };\r\n\r\n const handleUploadChange = (event) => {\r\n setImg(event.target.files[0])\r\n };\r\n\r\n\r\n\r\n const history = useHistory();\r\n\r\n const handleSubmit = (event) => {\r\n const upload = new FormData();\r\n upload.append('TfContent', formData.tfContent);\r\n upload.append('TfInfo', formData.tfInfo);\r\n upload.append('file', img);\r\n fetch('/admin/footer/EditWarn/' + systemid, {\r\n method: 'POST',\r\n body: upload,\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n if (data.success) {\r\n alert(\"修改成功\");\r\n Data(systemid);\r\n history.go(0);\r\n }\r\n else {\r\n alert(\"修改失敗;\" + data.message);\r\n Data(systemid);\r\n history.go(0);\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error);\r\n });\r\n }\r\n\r\n\r\n const handleclean = (event) => {\r\n event.preventDefault();\r\n setFormData({ tfContent: \"\" })\r\n }\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n\r\n return (\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\nexport default From;","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n const [func, setFunc] = useState([]);\r\n \r\n\r\n const [searchData, setsearchData] = useState({\r\n searchText: '',\r\n searchSDate: '',\r\n searchEDate: '',\r\n searchCategory: 99,\r\n });\r\n\r\n const [searchTheme, setsearchTheme] = useState(\"doc\");\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = list.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n const funcData = useCallback(async () => {\r\n const response = await fetch('admin/count/getFuncSelect');\r\n const data = await response.json();\r\n setFunc(data);\r\n \r\n }, []);\r\n\r\n useEffect(() => {\r\n Data();\r\n funcData();\r\n }, [funcData]);\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setsearchData({ ...searchData, [changeName]: event.target.value })\r\n\r\n };\r\n\r\n const searchThemeChange = (event) => {\r\n \r\n setsearchTheme(event.target.value)\r\n\r\n let url = \"admin/count/getFileCount/\" + event.target.value ;\r\n // Do something with the form data\r\n fetch(url)\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setList(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n\r\n };\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n\r\n async function Data() {\r\n\r\n const response = await fetch('admin/count/getVideoCount');\r\n const data = await response.json();\r\n setList(data);\r\n\r\n }\r\n\r\n\r\n function handleSearch(event) {\r\n event.preventDefault();\r\n let url = \"admin/count/getVideoSearch/\" + systemid + \"/\" + searchTheme;\r\n let body = {\r\n searchText: searchData.searchText,\r\n searchCategory: searchData.searchCategory\r\n };\r\n\r\n if (searchData.searchSDate) {\r\n body.searchSDate = searchData.searchSDate;\r\n }\r\n\r\n if (searchData.searchEDate) {\r\n body.searchEDate = searchData.searchEDate;\r\n }\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(body),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setList(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n\r\n function handleExcel(event) {\r\n\r\n const now = new Date();\r\n const year = now.getFullYear().toString();\r\n const month = String(now.getMonth() + 1).padStart(2, '0').toString();\r\n const day = String(now.getDate()).padStart(2, '0').toString();\r\n const today = year + month + day;\r\n\r\n event.preventDefault();\r\n let url = \"admin/count/VideoCountExcel/\" + systemid + \"/\" + searchTheme;\r\n let body = {\r\n searchText: searchData.searchText,\r\n searchCategory: searchData.searchCategory\r\n };\r\n\r\n if (searchData.searchSDate) {\r\n body.searchSDate = searchData.searchSDate;\r\n }\r\n\r\n if (searchData.searchEDate) {\r\n body.searchEDate = searchData.searchEDate;\r\n }\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(body),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = today + \"期交所\" + searchTheme + \"列印\";\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n const ScrollToTop = () => {\r\n useEffect(() => {\r\n window.scrollTo(0, 500);\r\n }, []);\r\n\r\n return null;\r\n };\r\n\r\n function Pagination(props) {\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n function handleClick(i) {\r\n setCurrentPage(i);\r\n window.scrollTo(0, 0);\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n
各節目及課程影片點擊率
\r\n \r\n
\r\n
\r\n
\r\n
總計{list.length }筆資料
\r\n
\r\n
\r\n
\r\n
\r\n {\r\n searchTheme === \"doc\" && \r\n
\r\n \r\n \r\n 項次 | \r\n 主題類別 | \r\n 節目名稱 | \r\n 點閱次數 | \r\n
\r\n {currentData.map((data, index) =>\r\n \r\n {(currentPage * 10) + (index + 1) } | \r\n {data.funcName } | \r\n {data.docTitle} | \r\n {data.docVcounter } | \r\n
\r\n )}\r\n \r\n
\r\n }\r\n {\r\n searchTheme === \"att\" &&\r\n
\r\n \r\n \r\n 項次 | \r\n 主題類別 | \r\n 檔案名稱 | \r\n 點閱次數 | \r\n
\r\n {currentData.map((data, index) =>\r\n \r\n {index + 1} | \r\n {data.funcName} | \r\n {data.docTitle} | \r\n {data.docVcounter} | \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\nexport default From;\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n const [func, setFunc] = useState([]);\r\n\r\n\r\n const [searchData, setsearchData] = useState({\r\n searchText: '',\r\n searchSDate: '',\r\n searchEDate: '',\r\n searchCategory: 99,\r\n });\r\n\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = list.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n\r\n useEffect(() => {\r\n Data();\r\n }, []);\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setsearchData({ ...searchData, [changeName]: event.target.value })\r\n };\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n async function Data() {\r\n\r\n const response = await fetch('admin/count/getFuncCount');\r\n const data = await response.json();\r\n setList(data);\r\n\r\n }\r\n\r\n function handleSearch(event) {\r\n event.preventDefault();\r\n let url = \"admin/count/getFuncSearch/\" + systemid;\r\n let body = {};\r\n var flag = false;\r\n if (searchData.searchSDate && searchData.searchEDate) {\r\n body.searchSDate = searchData.searchSDate;\r\n body.searchEDate = searchData.searchEDate;\r\n flag = true;\r\n }\r\n if (flag) {\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(body),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setList(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n } else {\r\n alert(\"請輸入搜尋日期\")\r\n }\r\n }\r\n\r\n function handleExcel(event) {\r\n\r\n const now = new Date();\r\n const year = now.getFullYear().toString();\r\n const month = String(now.getMonth() + 1).padStart(2, '0').toString();\r\n const day = String(now.getDate()).padStart(2, '0').toString();\r\n const today = year + month + day;\r\n\r\n event.preventDefault();\r\n let url = \"admin/count/FuncCountExcel/\" + systemid;\r\n let body = {\r\n searchText: searchData.searchText,\r\n searchCategory: searchData.searchCategory\r\n };\r\n\r\n if (searchData.searchSDate) {\r\n body.searchSDate = searchData.searchSDate;\r\n }\r\n\r\n if (searchData.searchEDate) {\r\n body.searchEDate = searchData.searchEDate;\r\n }\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(body),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = today + \"期交所單元項目點閱率列印\";\r\n a.click();\r\n window.URL.revokeObjectURL(url);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n function Pagination(props) {\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n function handleClick(i) {\r\n setCurrentPage(i);\r\n window.scrollTo(0, 0);\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n\r\n
\r\n\r\n
\r\n
\r\n
單元項目進行點閱數累計
\r\n \r\n
\r\n
\r\n
\r\n
總計{list.length}筆資料
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n 項次 | \r\n 單元 | \r\n 瀏覽人次 | \r\n
\r\n {currentData.map((data,index)=>\r\n \r\n {(currentPage * 10) + (index + 1)} | \r\n {data.funcName } | \r\n {data.docVcounter } | \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\nexport default From;\r\n","/* eslint-disable jsx-a11y/anchor-is-valid */\r\n/* eslint-disable jsx-a11y/anchor-has-content */\r\n/* eslint-disable no-restricted-globals */\r\nimport React, { useState, useEffect, useCallback } from 'react';\r\nimport { useHistory, useLocation } from 'react-router-dom';\r\n\r\n\r\nfunction From() {\r\n\r\n const location = useLocation();\r\n const params = new URLSearchParams(location.search);\r\n const page = params.get(\"page\");\r\n const systemid = params.get(\"systemid\");\r\n\r\n const history = useHistory();\r\n\r\n const [list, setList] = useState([]);\r\n\r\n\r\n\r\n const [searchData, setsearchData] = useState({\r\n searchSDate: '',\r\n searchShh: '00',\r\n searchSmm: '00',\r\n searchEDate: '',\r\n searchEhh: '00',\r\n searchEmm: '00',\r\n searchText: '',\r\n });\r\n\r\n const [currentPage, setCurrentPage] = useState(0) // 目前頁數\r\n const [pageSize] = useState(10) // 每頁顯示的資料筆數\r\n\r\n const offset = currentPage * pageSize // 目前頁面要顯示的起始資料位置\r\n const currentData = list.slice(offset, offset + pageSize) // 目前頁面要顯示的資料\r\n\r\n useEffect(() => {\r\n Data(systemid);\r\n }, [systemid]);\r\n\r\n async function Data(systemid) {\r\n const response = await fetch('admin/news/getNews');\r\n const data = await response.json();\r\n setList(data);\r\n }\r\n\r\n //function handleDelete(event, id) {\r\n\r\n // let url = \"admin/doc/DeleteDoc/\" + systemid + \"/\" + id;\r\n\r\n // if (confirm(\"要將此影片刪除嗎?\")) {\r\n // // Do something with the form data\r\n // fetch(url)\r\n // .then((response) => response.json())\r\n // .then((data) => {\r\n // if (data.success) {\r\n // alert(\"刪除成功\");\r\n // Data(systemid);\r\n // } else {\r\n\r\n // console.log(data.message);\r\n // }\r\n // })\r\n // .catch((error) => {\r\n // console.log('Error:' + error);\r\n // });\r\n // }\r\n //}\r\n\r\n function handleSearch(event) {\r\n event.preventDefault();\r\n let url = \"admin/news/searchNews\";\r\n // Do something with the form data\r\n fetch(url, {\r\n method: 'POST',\r\n body: JSON.stringify(searchData),\r\n headers: { 'Content-Type': 'application/json' },\r\n })\r\n .then((response) => response.json())\r\n .then((data) => {\r\n setList(data);\r\n setCurrentPage(0);\r\n })\r\n .catch((error) => {\r\n console.log('Error:' + error);\r\n });\r\n }\r\n\r\n const handleInputChange = (event) => {\r\n let changeName = event.target.name\r\n setsearchData({ ...searchData, [changeName]: event.target.value })\r\n };\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n }\r\n //onClick={(event) => handlego(event,\"/intranet/index\")}\r\n\r\n return (\r\n <>\r\n \r\n
\r\n\r\n
\r\n
\r\n
新聞稿管理
\r\n \r\n
\r\n
\r\n
\r\n
總計{list.length}筆資料
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n 序號 | \r\n 標題 | \r\n 發佈時間 | \r\n {/*操作 | */}\r\n
\r\n {currentData.map((data, index) =>\r\n \r\n {(currentPage * 10) + (index + 1)} | \r\n {data.newsTitle} | \r\n {data.newsSDate} | \r\n {/**/}\r\n {/* handleDelete(event, data.docId)} >刪除*/}\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 function Pagination(props) {\r\n const num = Math.ceil(props.count / 10);\r\n // 計算左右兩邊需要顯示的標籤數量\r\n let leftRange = Math.max(currentPage - 2, 0);\r\n let rightRange = Math.min(currentPage + 2, num - 1);\r\n\r\n // 如果左邊不足兩個標籤,則右邊顯示多餘的標籤\r\n if (leftRange === 0 && rightRange < 4) {\r\n rightRange = Math.min(rightRange + (4 - rightRange), num - 1);\r\n }\r\n\r\n // 如果右邊不足兩個標籤,則左邊顯示多餘的標籤\r\n if (rightRange === num - 1 && leftRange > num - 5) {\r\n leftRange = Math.max(leftRange - ((num - 1 - rightRange)), 0);\r\n }\r\n\r\n function handleClick(i) {\r\n setCurrentPage(i);\r\n window.scrollTo(0, 0);\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\nexport default From;\r\n\r\n\r\n","import React from 'react';\r\nimport { Helmet } from 'react-helmet'\r\n\r\n\r\n\r\nfunction FooterScript() {\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n \r\n} export default FooterScript;","import React, { Component } from 'react';\r\n\r\nexport class Footer extends Component {\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}","/* eslint-disable jsx-a11y/anchor-is-valid */\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\n\r\nfunction NavMenu() {\r\n\r\n const history = useHistory();\r\n\r\n const handlego = (event, href) => {\r\n event.preventDefault();\r\n history.push(href);\r\n } \r\n\r\n const [menuItems, setMenuItems] = useState([]);\r\n\r\n useEffect(() => {\r\n func();\r\n }, []);\r\n\r\n function func() {\r\n fetch('admin/home/getfunc')\r\n .then((response)=>response.json())\r\n .then((data) =>\r\n setMenuItems(data)\r\n )\r\n .catch();\r\n }\r\n\r\n //onClick={(event) => handlego(event, )}\r\n\r\n const buildMenuTree = (Item) => {\r\n const children = menuItems.filter((item) => item.funcParent === Item.funcId);\r\n if (!children.length>0) {\r\n return (\r\n \r\n handlego(event, Item.funcIntraUrl)} className=\"clickable\">\r\n {Item.funcName}\r\n \r\n );\r\n }\r\n else\r\n { \r\n return (\r\n \r\n \r\n {Item.funcName}\r\n \r\n \r\n {\r\n children.map((child) => (\r\n buildMenuTree2(child)\r\n ))\r\n }\r\n
\r\n \r\n );\r\n }\r\n };\r\n\r\n const buildMenuTree2 = (Item) =>\r\n {\r\n const children = menuItems.filter((item) => item.funcParent === Item.funcId);\r\n\r\n if (!children.length > 0) {\r\n return (\r\n \r\n handlego(event, Item.funcIntraUrl)}>{Item.funcName}\r\n );\r\n } \r\n else {\r\n return (\r\n \r\n \r\n {Item.funcName}\r\n \r\n \r\n {\r\n children.map((child) => (\r\n buildMenuTree3(child)\r\n ))\r\n }\r\n
\r\n \r\n );\r\n }\r\n \r\n }\r\n\r\n const buildMenuTree3 = (Item) => {\r\n const children = menuItems.filter((item) => item.funcParent === Item.funcId);\r\n\r\n if (!children.length > 0) {\r\n return (\r\n \r\n handlego(event, Item.funcIntraUrl)} key={Item.funcId}>{Item.funcName}\r\n );\r\n }\r\n else {\r\n return (\r\n \r\n \r\n {Item.funcName}\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n return (\r\n <>\r\n \r\n \r\n \r\n >\r\n )\r\n\r\n};\r\n\r\nexport default NavMenu;\r\n","import React, { useEffect } from 'react';\r\nimport { Route, Switch, Redirect } from 'react-router-dom';\r\n\r\nimport Header from './Header';\r\nimport Index from './Index';\r\n\r\nimport GroupList from './admin/system/GroupList';\r\nimport AddGroup from './admin/system/AddGroup';\r\nimport EditGroup from './admin/system/EditGroup';\r\nimport EditGroupFunc from './admin/system/EditGroupFunc';\r\nimport EditGroupUser from './admin/system/EditGroupUser';\r\n\r\nimport RoleList from './admin/system/RoleList';\r\nimport AddRole from './admin/system/AddRole';\r\nimport EditRole from './admin/system/EditRole';\r\n\r\nimport UserLog from './admin/system/UserLog';\r\nimport UserGroup from './admin/system/UserGroup';\r\nimport PersonRole from './admin/system/PersonRole';\r\nimport PersonRoleFunc from './admin/system/PersonRoleFunc';\r\n\r\nimport BannerList from './banner/BannerList';\r\nimport AddBanner from './banner/AddBanner';\r\nimport EditBanner from './banner/EditBanner';\r\n\r\nimport AddCourse from './video/AddCourse';\r\nimport CourseList from './video/CourseList';\r\nimport EditCourse from './video/EditCourse';\r\n\r\n\r\nimport EditIntellectual from './footer/EditIntellectual';\r\nimport EditContactInfo from './footer/EditContactInfo';\r\nimport EditWarn from './footer/EditWarn';\r\n\r\nimport VideoCountList from './count/VideoCountList';\r\nimport FuncCount from './count/FuncCount';\r\n\r\nimport NewsList from './news/NewsList';\r\n\r\nimport FooterScript from './FooterScript';\r\nimport { Footer } from './Footer';\r\n\r\n\r\n\r\nimport NavMenu from './NavMenu';\r\n\r\n\r\nfunction Home() {\r\n\r\n useEffect(() => {\r\n //setTimeout(() => {\r\n // setPageLoaded(true);\r\n //}, 1000);\r\n setTimeout(() => {\r\n document.querySelector('.wrapper').style.opacity = 1;\r\n }, 500); // 1秒後顯現元素\r\n }, []);\r\n\r\n const ScrollToTop = () => {\r\n useEffect(() => {\r\n window.scrollTo(0, 0);\r\n }, []);\r\n\r\n return null;\r\n };\r\n return (\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 \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\nexport default Home;\r\n //\r\n //\r\n //\r\n //","import React, { Component } from 'react';\r\nimport { Helmet } from 'react-helmet'\r\n\r\nexport class Head extends Component {\r\n render() {\r\n return (\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 React, { Component } from 'react';\r\nimport { Helmet } from 'react-helmet'\r\n\r\nexport class Head extends Component {\r\n render() {\r\n return (\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 React from 'react';\r\nimport { Route, Redirect, Switch } from 'react-router-dom';\r\nimport ZhTWHome from './components/Home';\r\nimport Login from './components/intranet/Login';\r\nimport GroupSelect from './components/intranet/GroupSelect';\r\nimport IntraHome from './components/intranet/Home';\r\nimport { Head as ZhTWHead } from './components/Head';\r\nimport { Head as IntraHead } from './components/intranet/Head';\r\n\r\n\r\nfunction App() {\r\n\r\n\r\n return (\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\nexport default App;\r\n\r\n","import 'bootstrap/dist/css/bootstrap.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\nimport ReactGA from \"react-ga4\";\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\nGA();\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n rootElement);\r\n\r\nfunction GA() { \r\nfetch('web/setting/GetGA')\r\n .then(response => response.text())\r\n .then(data => {\r\n ReactGA.initialize(data)\r\n //console.log(data);\r\n })\r\n .catch(error => {\r\n console.error('Error:', error);\r\n });\r\n}"],"names":["hasOwn","hasOwnProperty","classNames","classes","i","arguments","length","arg","argType","push","Array","isArray","inner","apply","toString","Object","prototype","includes","key","call","join","module","exports","default","load","r","storage","debug","e","process","DEBUG","log","console","Function","formatArgs","args","useColors","this","namespace","humanize","diff","c","color","splice","index","lastC","replace","match","save","namespaces","removeItem","window","type","document","documentElement","style","WebkitAppearance","firebug","exception","table","navigator","userAgent","toLowerCase","parseInt","RegExp","$1","chrome","local","localStorage","localstorage","colors","formatters","j","v","JSON","stringify","err","message","enable","prevTime","createDebug","enabled","self","curr","Date","ms","prev","coerce","unshift","format","formatter","val","bind","hash","charCodeAt","Math","abs","selectColor","init","Error","stack","disable","names","skips","split","len","substr","name","test","QueryHandler","require","each","MediaQuery","query","isUnconditional","handlers","mql","matchMedia","listener","currentTarget","assess","addListener","constuctor","addHandler","handler","qh","matches","on","removeHandler","h","equals","destroy","clear","removeListener","action","Util","isFunction","MediaQueryDispatch","queries","browserIsIncapable","constructor","register","q","options","shouldDegrade","unregister","deferSetup","setup","initialised","off","unmatch","target","collection","fn","equal","a","b","keys","source","flags","valueOf","camel2hyphen","obj2mq","obj","mq","features","forEach","feature","value","isDimension","stdOnEnd","script","cb","onload","onerror","src","ieOnEnd","onreadystatechange","readyState","opts","head","getElementsByTagName","createElement","charset","async","attrs","attr","setAttribute","setAttributes","text","appendChild","FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","freeGlobal","global","freeSelf","root","objectToString","nativeMax","max","nativeMin","min","now","isObject","toNumber","isObjectLike","isSymbol","other","isBinary","slice","func","wait","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","thisArg","undefined","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","setTimeout","remainingWait","debounced","isInvoking","leadingEdge","cancel","clearTimeout","flush","s","m","d","y","plural","n","floor","ceil","str","String","exec","parseFloat","parse","isNaN","long","round","fmtShort","getOwnPropertySymbols","propIsEnumerable","propertyIsEnumerable","assign","test1","getOwnPropertyNames","test2","fromCharCode","map","test3","letter","shouldUseNative","from","symbols","to","toObject","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","props","propName","componentName","location","propFullName","secret","getShim","isRequired","ReactPropTypes","array","bigint","bool","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","hasElementType","Element","hasMap","Map","hasSet","Set","hasArrayBuffer","ArrayBuffer","isView","it","size","entries","next","done","has","get","$$typeof","error","warn","defineProperty","titleCase","redactingEmail","_str","trim","title","search","smallWords","charAt","toUpperCase","indexOf","mightBeEmail","redacted","redactEmail","GA4","_gtag","_interopRequireDefault","_format","_excluded","_excluded2","_excluded3","__esModule","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","sourceSymbolKeys","_typeof","Symbol","iterator","_toConsumableArray","arr","_arrayLikeToArray","_arrayWithoutHoles","iter","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","ownKeys","enumerableOnly","filter","sym","getOwnPropertyDescriptor","enumerable","_objectSpread","_defineProperty","getOwnPropertyDescriptors","defineProperties","_slicedToArray","_arrayWithHoles","_i","_s","_e","_x","_r","_arr","_n","_d","_iterableToArrayLimit","_nonIterableRest","o","minLen","arr2","_defineProperties","descriptor","configurable","writable","_toPropertyKey","input","hint","prim","toPrimitive","res","Number","_toPrimitive","_this","instance","Constructor","_classCallCheck","isInitialized","_testMode","_currentMeasurementId","_hasLoadedGA","_isQueuing","_queueGtag","_len","_key","GA_MEASUREMENT_ID","nonce","gtagUrl","concat","body","dataLayer","gtag","gaOptions","mapFields","cookieUpdate","cookieExpires","cookieDomain","cookieFlags","userId","clientId","anonymizeIp","contentGroup1","contentGroup2","contentGroup3","contentGroup4","contentGroup5","allowAdFeatures","allowAdPersonalizationSignals","nonInteraction","page","hitCallback","reduce","_ref","_ref2","initConfigs","trackingId","gtagOptions","_options$testMode","testMode","_loadGA","config","mergedGtagOptions","_toGtagOptions","queues","queue","shift","fieldsObject","_gaCommand","eventCategory","eventAction","eventLabel","eventValue","event_category","event_label","non_interaction","_len2","_key2","_gaCommandSendEvent","_args$","rest","hitType","timingCategory","timingVar","timingValue","timingLabel","_this$_toGtagOptions","page_path","page_title","page_location","_len3","_key3","_gaCommandSendPageview","_args$2","_len4","_key4","_gaCommandSendEventParameters","_gaCommandSendPageviewParameters","_gaCommandSendTiming","_len5","_key5","command","_len6","_key6","_gaCommandSend","_gaCommandSet","_len7","_key7","readyCallback","property","ga","optionsOrName","params","category","label","transport","fieldObject","reset","protoProps","staticProps","_default","_window","_ga","nodeInterop","cache","_getRequireWildcardCache","newObj","hasPropertyDescriptor","desc","set","_interopRequireWildcard","WeakMap","cacheBabelInterop","cacheNodeInterop","ex","React","React__default","canUseDOM","reducePropsToState","handleStateChangeOnClient","mapStateOnServer","WrappedComponent","state","mountedInstances","emitChange","SideEffect","_PureComponent","subClass","superClass","create","__proto__","peek","rewind","recordedState","_proto","UNSAFE_componentWillMount","componentDidUpdate","componentWillUnmount","render","PureComponent","displayName","getDisplayName","PrevArrow","NextArrow","_react","_classnames","_innerSliderUtils","_extends","_createClass","_inherits","_setPrototypeOf","p","setPrototypeOf","_createSuper","Derived","hasNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","_isNativeReflectConstruct","Super","_getPrototypeOf","NewTarget","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","getPrototypeOf","_React$PureComponent","_super","preventDefault","clickHandler","prevClasses","prevHandler","infinite","currentSlide","slideCount","slidesToShow","prevArrowProps","className","display","onClick","customProps","prevArrow","cloneElement","_React$PureComponent2","_super2","nextClasses","nextHandler","canGoNext","nextArrowProps","nextArrow","accessibility","adaptiveHeight","afterChange","appendDots","dots","arrows","autoplay","autoplaySpeed","beforeChange","centerMode","centerPadding","cssEase","customPaging","dotsClass","draggable","easing","edgeFriction","fade","focusOnSelect","initialSlide","lazyLoad","onEdge","onInit","onLazyLoadError","onReInit","pauseOnDotsHover","pauseOnFocus","pauseOnHover","responsive","rows","rtl","slide","slidesPerRow","slidesToScroll","speed","swipe","swipeEvent","swipeToSlide","touchMove","touchThreshold","useCSS","useTransform","variableWidth","vertical","waitForAnimate","Dots","spec","_this$props","onMouseEnter","onMouseOver","onMouseLeave","dotCount","mouseEvents","_rightBound","rightBound","clamp","_leftBound","leftBound","dotOptions","animating","autoplaying","currentDirection","currentLeft","direction","dragging","edgeDragged","initialized","lazyLoadedList","listHeight","listWidth","scrolling","slideHeight","slideWidth","swipeLeft","swiped","swiping","touchObject","startX","startY","curX","curY","trackStyle","trackWidth","targetSlide","InnerSlider","_initialState","_lodash","_track","_dots","_arrows","_resizeObserverPolyfill","_React$Component","ref","list","track","elem","querySelector","height","getHeight","slidesToLoad","getOnDemandLazySlides","setState","prevState","onLazyLoad","listRef","trackRef","updateState","adaptHeight","autoPlay","lazyLoadTimer","setInterval","progressiveLazyLoad","ro","onWindowResized","callbackTimers","observe","querySelectorAll","onfocus","onSlideFocus","onblur","onSlideBlur","addEventListener","attachEvent","animationEndCallback","clearInterval","timer","removeEventListener","detachEvent","autoplayTimer","disconnect","prevProps","checkImagesLoad","setTrackStyle","didPropsChange","Children","count","children","changeSlide","pause","debouncedResize","resizeWindow","callback","updatedState","initializedState","slideIndex","targetLeft","getTrackLeft","left","getTrackCSS","_trackWidth","_trackLeft","childrenWidths","preClones","getPreClones","postClones","getPostClones","child","width","_i2","_trackStyle","currentWidth","childrenCount","trackLeft","images","imagesCount","loadedCount","image","onclick","prevClickHandler","parentNode","focus","_index","dontAnimate","asNavFor","_slideHandler","slideHandler","nextState","asNavForIndex","innerSlider","firstBatch","nodes","clickable","stopPropagation","dir","keyHandler","ontouchmove","event","returnValue","verticalSwiping","disableBodyScroll","swipeStart","swipeMove","swipeEnd","triggerSlideHandler","enableBodyScroll","nextIndex","playType","play","pauseType","trackProps","extractObject","onTrackOver","onTrackLeave","selectHandler","dotProps","onDotsLeave","onDotsOver","arrowProps","verticalHeightStyle","centerPaddingStyle","padding","listStyle","listProps","onMouseDown","onMouseMove","onMouseUp","onTouchStart","onTouchMove","onTouchEnd","touchEnd","onTouchCancel","onKeyDown","innerSliderProps","unslick","listRefHandler","Track","trackRefHandler","ssrState","ssrInit","_i3","_Object$keys","Component","_innerSlider","_json2mq","_defaultProps","enquire","Slider","slickPrev","slickNext","slickGoTo","breakpoint","_responsiveMediaHandlers","_this2","breakpoints","breakpt","sort","x","bQuery","minWidth","maxWidth","media","settings","newProps","_this3","resp","toArray","newChildren","newSlide","row","k","tabIndex","innerSliderRefHandler","getSlideClasses","slickActive","slickCenter","slickCloned","centerOffset","getKey","fallbackKey","renderSlides","slides","preCloneSlides","postCloneSlides","startIndex","lazyStartIndex","endIndex","lazyEndIndex","childOnClickOptions","childStyle","position","top","opacity","transition","getSlideStyle","slideClass","slideClasses","outline","preCloneNo","reverse","handleRef","checkSpecKeys","checkNavigable","slidesOnRight","slidesOnLeft","siblingDirection","safePreventDefault","lazySlidesOnRight","lazySlidesOnLeft","getWidth","getTrackAnimateCSS","getTotalSlides","getSwipeDirection","getSlideCount","getRequiredLazySlides","getNavigableIndexes","lowerBound","upperBound","_reactName","onDemandSlides","requiredSlides","offsetWidth","offsetHeight","xDist","yDist","swipeAngle","atan2","PI","canGo","newObject","listNode","trackNode","centerPaddingAdj","finalSlide","animationLeft","finalLeft","animationSlide","indexOffset","previousInt","slideOffset","previousTargetSlide","tagName","keyCode","touches","pageX","clientX","pageY","clientY","curLeft","swipeLength","sqrt","pow","verticalSwipeLength","positionOffset","swipeDirection","touchSwipeLength","onSwipe","minSwipe","activeSlide","counter","indexes","navigables","prevNavigable","swipedSlide","slickList","every","offsetTop","offsetLeft","currentIndex","dataset","keysArray","trackHeight","trackChildren","WebkitTransition","WebkitTransform","transform","msTransform","marginTop","marginLeft","slidesToOffset","targetSlideIndex","trackElem","childNodes","right","l","for","t","u","w","z","B","isMounted","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","C","D","E","context","refs","updater","F","G","isReactComponent","forceUpdate","H","isPureReactComponent","I","J","K","current","L","__self","__source","M","g","f","defaultProps","_owner","O","P","Q","escape","R","N","A","S","T","_status","_result","then","U","V","W","ReactCurrentDispatcher","ReactCurrentBatchConfig","ReactCurrentOwner","only","Fragment","Profiler","StrictMode","Suspense","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","createContext","_currentValue","_currentValue2","_threadCount","Provider","Consumer","_defaultValue","_globalName","_context","createFactory","createRef","forwardRef","isValidElement","lazy","_payload","_init","memo","compare","startTransition","unstable_act","useCallback","useContext","useDebugValue","useDeferredValue","useEffect","useId","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useSyncExternalStore","useTransition","version","MapShim","getIndex","some","entry","class_1","__entries__","delete","ctx","_a","isBrowser","global$1","requestAnimationFrame$1","requestAnimationFrame","trailingTimeout","REFRESH_DELAY","transitionKeys","mutationObserverSupported","MutationObserver","ResizeObserverController","connected_","mutationEventsAdded_","mutationsObserver_","observers_","onTransitionEnd_","refresh","delay","leadingCall","trailingCall","resolvePending","proxy","timeoutCallback","timeStamp","throttle","addObserver","observer","connect_","removeObserver","observers","disconnect_","updateObservers_","activeObservers","gatherActive","hasActive","broadcastActive","attributes","childList","characterData","subtree","_b","propertyName","getInstance","instance_","defineConfigurable","getWindowOf","ownerDocument","defaultView","emptyRect","createRectInit","toFloat","getBordersSize","styles","positions","getHTMLElementContentRect","clientWidth","clientHeight","getComputedStyle","paddings","positions_1","getPaddings","horizPad","vertPad","bottom","boxSizing","isDocumentElement","vertScrollbar","horizScrollbar","isSVGGraphicsElement","SVGGraphicsElement","SVGElement","getBBox","getContentRect","bbox","getSVGContentRect","ResizeObservation","broadcastWidth","broadcastHeight","contentRect_","isActive","rect","broadcastRect","ResizeObserverEntry","rectInit","contentRect","Constr","DOMRectReadOnly","createReadOnlyRect","ResizeObserverSPI","controller","callbackCtx","activeObservations_","observations_","callback_","controller_","callbackCtx_","observations","unobserve","clearActive","observation","ResizeObserver","method","Sister","sister","events","trigger","data","listeners","_PlayerStates","_PlayerStates2","pauseVideo","acceptableStates","ENDED","PAUSED","stateChangeRequired","playVideo","PLAYING","seekTo","timeout","_debug2","_functionNames2","_eventNames2","_FunctionStateMap2","YouTubePlayer","emitter","_loop","eventName","onEventName","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","return","playerAPIReady","strictState","functions","_loop2","functionName","player","stateInfo","playerState","getPlayerState","Promise","resolve","onPlayerStateChange","playerStateAfterChange","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","BUFFERING","UNSTARTED","VIDEO_CUED","_sister2","_loadYouTubeIframeApi2","_YouTubePlayer2","youtubeIframeAPI","maybeElementId","getElementById","proxyEvents","YT","Player","playerApi","promisifyPlayer","_loadScript","_loadScript2","protocol","previous","onYouTubeIframeAPIReady","reactIs","REACT_STATICS","childContextTypes","contextType","contextTypes","getDefaultProps","getDerivedStateFromError","getDerivedStateFromProps","mixins","propTypes","KNOWN_STATICS","caller","callee","arity","MEMO_STATICS","TYPE_STATICS","getStatics","component","isMemo","ForwardRef","Memo","objectPrototype","hoistNonReactStatics","targetComponent","sourceComponent","blacklist","inheritedComponent","targetStatics","sourceStatics","factory","noGlobal","getProto","flat","class2type","fnToString","ObjectFunctionString","support","nodeType","item","isWindow","preservedScriptAttributes","noModule","DOMEval","code","doc","getAttribute","removeChild","toType","jQuery","selector","isArrayLike","jquery","num","pushStack","elems","ret","merge","prevObject","first","eq","last","even","grep","_elem","odd","end","extend","copy","copyIsArray","clone","deep","isPlainObject","expando","random","isReady","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","callbackExpect","guid","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","pop","pushNative","booleans","whitespace","identifier","pseudos","rwhitespace","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","nonHex","high","rcssescape","fcssescape","ch","asCodePoint","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","els","seed","nid","groups","newSelector","newContext","id","getElementsByClassName","qsa","testContext","scope","toSelector","cssSupportsSelector","CSS","supports","qsaError","removeAttribute","cacheLength","markFunction","assert","el","addHandle","attrHandle","siblingCheck","cur","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespaceURI","hasCompare","subWindow","createComment","getById","getElementsByName","attrId","find","getAttributeNode","tag","tmp","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","sortDetached","aup","ap","bp","expr","elements","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","what","_argument","simple","forward","ofType","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","setFilters","idx","matched","matcher","unmatched","lang","elemLang","activeElement","hasFocus","href","checked","selected","selectedIndex","_matchIndexes","radio","checkbox","file","password","submit","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","setMatchers","elementMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","matcherFromGroupMatchers","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","rneedsContext","needsContext","rsingleTag","winnow","qualifier","not","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","contents","sibling","targets","closest","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","rnothtmlwhite","Identity","Thrower","adoptValue","reject","noValue","promise","fail","Callbacks","_","flag","createOptions","firing","memory","fired","locked","firingIndex","fire","once","stopOnFalse","remove","empty","lock","fireWith","Deferred","tuples","always","deferred","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","notifyWith","resolveWith","exceptionHook","stackTrace","rejectWith","getStackHook","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","readyException","readyList","completed","catch","readyWait","doScroll","access","chainable","emptyGet","raw","bulk","rmsPrefix","rdashAlpha","fcamelCase","_all","camelCase","acceptData","owner","Data","uid","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","getData","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","defer","pnum","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","getDefaultDisplay","showHide","show","values","hide","toggle","rcheckableType","rtagName","rscriptType","div","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","safeActiveElement","types","one","origFn","leverageNative","notAsync","saved","isTrigger","delegateType","stopImmediatePropagation","Event","handleObjIn","eventHandle","handleObj","origType","elemData","handle","triggered","dispatch","bindType","delegateCount","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","button","addProp","hook","originalEvent","noBubble","click","beforeunload","isDefaultPrevented","defaultPrevented","relatedTarget","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","shiftKey","view","charCode","buttons","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","fixInput","domManip","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","rcustomProp","getStyles","opener","swap","old","rboxStyle","rtrimCSS","curCSS","computed","isCustomProp","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","pixelBoxStylesVal","boxSizingReliableVal","scrollboxSizeVal","measure","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","trChild","trStyle","borderTopWidth","borderBottomWidth","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","boxModelAdjustment","dimension","box","isBorderBox","computedVal","extra","delta","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","cssHooks","origName","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","margin","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","swing","cos","fxNow","inProgress","rfxtypes","rrun","schedule","hidden","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","complete","anim","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","opt","speeds","fadeTo","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","addClass","curValue","finalValue","removeClass","toggleClass","stateVal","isValidValue","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","processData","contentType","accepts","json","responseFields","converters","ajaxSetup","ajaxPrefilter","ajaxTransport","ajax","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","xhrSupported","cors","errorCallback","open","username","xhrFields","onabort","ontimeout","responseType","responseText","binary","scriptAttrs","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","animated","offset","setOffset","curPosition","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","holdReady","hold","parseJSON","isNumeric","_jQuery","_$","$","noConflict","aa","ca","da","ea","fa","ha","ia","ja","ka","la","ma","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","sanitizeURL","removeEmptyString","ra","sa","ta","pa","qa","oa","setAttributeNS","xlinkHref","ua","va","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","Ka","La","Ma","Na","Oa","prepareStackTrace","Pa","Qa","Ra","Sa","Ta","Va","_valueTracker","getValue","setValue","stopTracking","Ua","Wa","Xa","Ya","defaultChecked","_wrapperState","initialChecked","Za","initialValue","controlled","ab","bb","db","eb","fb","defaultSelected","gb","dangerouslySetInnerHTML","hb","ib","jb","kb","lb","mb","nb","MSApp","execUnsafeLocalFunction","ob","pb","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","lineClamp","lineHeight","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","qb","rb","sb","substring","tb","menuitem","area","br","embed","hr","img","keygen","link","meta","wbr","ub","vb","wb","xb","srcElement","correspondingUseElement","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","Nb","onError","Ob","Pb","Qb","Rb","Sb","Tb","Vb","alternate","Wb","memoizedState","dehydrated","Xb","Zb","Yb","$b","ac","unstable_scheduleCallback","bc","unstable_cancelCallback","cc","unstable_shouldYield","dc","unstable_requestPaint","unstable_now","ec","unstable_getCurrentPriorityLevel","fc","unstable_ImmediatePriority","gc","unstable_UserBlockingPriority","hc","unstable_NormalPriority","ic","unstable_LowPriority","jc","unstable_IdlePriority","kc","lc","oc","clz32","pc","qc","LN2","rc","sc","tc","uc","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","vc","xc","yc","zc","Ac","eventTimes","Cc","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Pc","Qc","Rc","Sc","Tc","blockedOn","domEventName","eventSystemFlags","targetContainers","Vc","Wc","priority","isDehydrated","containerInfo","Xc","Yc","dispatchEvent","Zc","$c","ad","bd","cd","dd","ed","fd","gd","hd","Uc","jd","kd","ld","md","nd","od","pd","qd","rd","_targetInst","cancelBubble","persist","isPersistent","wd","xd","yd","sd","isTrusted","ud","vd","Ad","getModifierState","zd","fromElement","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","clipboardData","Jd","Ld","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","repeat","locale","Rd","Td","pressure","tangentialPressure","tiltX","tiltY","twist","isPrimary","Vd","Xd","Yd","deltaX","wheelDeltaX","deltaY","wheelDeltaY","wheelDelta","deltaZ","deltaMode","Zd","$d","ae","be","documentMode","ce","de","ee","fe","ge","he","ie","le","date","datetime","email","month","range","tel","week","me","ne","oe","pe","qe","re","se","te","ue","ve","we","xe","ye","ze","oninput","Ae","Be","Ce","De","Ee","Fe","He","Ie","Je","Ke","Le","Me","HTMLIFrameElement","contentWindow","Ne","contentEditable","Oe","focusedElem","selectionRange","selectionStart","selectionEnd","getSelection","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","createRange","setStart","removeAllRanges","addRange","setEnd","Pe","Qe","Re","Se","Te","Ue","Ve","We","animationend","animationiteration","animationstart","transitionend","Xe","Ye","Ze","$e","af","bf","cf","df","ef","ff","gf","hf","lf","mf","nf","Ub","of","pf","qf","rf","sf","capture","passive","tf","uf","vf","wf","na","xa","$a","ba","je","char","ke","xf","yf","zf","Af","Bf","Cf","Df","Ef","__html","Ff","Gf","Hf","Jf","queueMicrotask","If","Kf","Lf","Mf","previousSibling","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","Vf","Wf","Xf","Yf","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Zf","$f","ag","bg","getChildContext","cg","__reactInternalMemoizedMergedChildContext","dg","eg","fg","gg","hg","jg","kg","lg","mg","ng","og","pg","qg","rg","sg","tg","ug","vg","wg","xg","yg","zg","Ag","Bg","deletions","Cg","pendingProps","treeContext","retryLane","Dg","mode","Eg","Fg","Gg","memoizedProps","Hg","Ig","Jg","Kg","Lg","Mg","Ng","Og","Pg","Qg","Rg","Sg","childLanes","Tg","dependencies","firstContext","lanes","Ug","Vg","memoizedValue","Wg","Xg","Yg","interleaved","Zg","$g","ah","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","bh","eventTime","lane","payload","dh","eh","fh","gh","hh","ih","jh","kh","nh","_reactInternals","lh","mh","oh","shouldComponentUpdate","ph","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","rh","getSnapshotBeforeUpdate","componentWillMount","componentDidMount","sh","_stringRef","uh","vh","wh","xh","yh","zh","Ah","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih","Jh","Kh","Lh","Mh","revealOrder","Nh","Oh","_workInProgressVersionPrimary","Ph","Qh","Rh","Sh","Th","Uh","Vh","Wh","Xh","Yh","Zh","$h","ai","bi","ci","baseQueue","di","ei","fi","lastRenderedReducer","hasEagerState","eagerState","lastRenderedState","gi","hi","ii","ji","ki","getSnapshot","li","mi","ni","lastEffect","stores","oi","pi","qi","ri","deps","si","ti","ui","vi","wi","xi","yi","zi","Ai","Bi","Ci","Di","Ei","Fi","Gi","Hi","Ii","Ji","readContext","useMutableSource","unstable_isNewReconciler","identifierPrefix","Ki","digest","Li","Mi","Ni","Oi","Pi","Qi","Ri","componentDidCatch","Si","componentStack","Ti","pingCache","Ui","Vi","Wi","Xi","Yi","Zi","$i","aj","bj","cj","dj","ej","baseLanes","cachePool","transitions","fj","gj","hj","ij","jj","UNSAFE_componentWillUpdate","componentWillUpdate","kj","lj","pendingContext","mj","Aj","Bj","Cj","Dj","nj","oj","pj","fallback","qj","rj","tj","dgst","uj","vj","_reactRetry","sj","subtreeFlags","wj","xj","isBackwards","rendering","renderingStartTime","tail","tailMode","yj","Ej","Fj","Gj","wasMultiple","multiple","suppressHydrationWarning","createElementNS","autoFocus","Hj","Ij","Jj","Kj","Lj","WeakSet","Mj","Nj","Oj","Qj","Rj","Sj","Tj","Uj","Vj","Wj","_reactRootContainer","Xj","X","Yj","Zj","ak","onCommitFiberUnmount","bk","ck","dk","ek","fk","isHidden","gk","hk","ik","jk","kk","lk","__reactInternalSnapshotBeforeUpdate","Wk","mk","nk","ok","pk","Y","Z","qk","rk","sk","tk","uk","Infinity","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","Ek","callbackNode","expirationTimes","expiredLanes","wc","callbackPriority","ig","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","Pk","finishedWork","finishedLanes","Qk","timeoutHandle","Rk","Sk","Tk","Uk","Vk","mutableReadLanes","Bc","Pj","onCommitFiberRoot","mc","onRecoverableError","Xk","onPostCommitFiberRoot","Yk","Zk","al","pendingChildren","bl","mutableSourceEagerHydrationData","cl","pendingSuspenseBoundaries","fl","gl","hl","il","jl","zj","$k","ll","reportError","ml","_internalRoot","nl","ol","pl","ql","sl","rl","unmount","unstable_scheduleHydration","form","tl","usingClientEntryPoint","Events","ul","findFiberByHostInstance","bundleType","rendererPackageName","vl","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","wl","supportsFiber","inject","createPortal","dl","createRoot","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","_source","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","checkDCE","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","Lazy","Portal","isAsyncMode","isConcurrentMode","isContextConsumer","isContextProvider","isElement","isForwardRef","isFragment","isLazy","isPortal","isProfiler","isStrictMode","isSuspense","isValidElementType","typeOf","isarray","pathToRegexp","tokensToFunction","tokensToRegExp","PATH_REGEXP","path","defaultDelimiter","delimiter","escaped","group","modifier","asterisk","partial","optional","escapeGroup","escapeString","encodeURIComponentPretty","encodeURI","encode","pretty","segment","attachKeys","sensitive","strict","route","endsWithDelimiter","regexpToRegexp","arrayToRegexp","stringToRegexp","jsx","jsxs","sortIndex","performance","setImmediate","expirationTime","priorityLevel","scheduling","isInputPending","MessageChannel","port2","port1","onmessage","postMessage","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","unstable_wrapCallback","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","globalThis","toStringTag","_inheritsLoose","isAbsolute","pathname","spliceOne","hasTrailingSlash","toParts","fromParts","isToAbs","isFromAbs","mustEndAbs","up","part","valueEqual","aValue","bValue","isProduction","invariant","condition","provided","addLeadingSlash","stripLeadingSlash","stripBasename","hasBasename","stripTrailingSlash","createPath","createLocation","currentLocation","hashIndex","searchIndex","parsePath","decodeURI","URIError","resolvePathname","createTransitionManager","prompt","setPrompt","nextPrompt","confirmTransitionTo","getUserConfirmation","appendListener","notifyListeners","getConfirmation","confirm","PopStateEvent","HashChangeEvent","getHistoryState","history","createBrowserHistory","globalHistory","canUseHistory","supportsHistory","needsHashChangeListener","_props","_props$forceRefresh","forceRefresh","_props$getUserConfirm","_props$keyLength","keyLength","basename","getDOMLocation","historyState","_window$location","createKey","transitionManager","handlePopState","isExtraneousPopstateEvent","handlePop","handleHashChange","forceNextPop","fromLocation","toLocation","toIndex","allKeys","fromIndex","go","revertPop","initialLocation","createHref","listenerCount","checkDOMListeners","isBlocked","pushState","prevIndex","nextKeys","replaceState","goBack","goForward","block","unblock","listen","unlisten","HashChangeEvent$1","HashPathCoders","hashbang","encodePath","decodePath","noslash","slash","stripHash","getHashPath","replaceHashPath","createHashHistory","_props$hashType","hashType","_HashPathCoders$hashT","ignorePath","encodedPath","prevLocation","allPaths","lastIndexOf","baseTag","pushHashPath","nextPaths","MAX_SIGNED_31_BIT_INT","commonjsGlobal","calculateChangedBits","contextProp","getUniqueId","newValue","changedBits","createEventEmitter","nextProps","oldValue","_Provider$childContex","_React$Component2","observedBits","onUpdate","_Consumer$contextType","createNamedContext","historyContext","Router","_isMounted","_pendingLocation","staticContext","computeRootMatch","isExact","Lifecycle","onMount","onUnmount","cacheLimit","cacheCount","generatePath","generator","compilePath","Redirect","computedMatch","_ref$push","cache$1","cacheLimit$1","cacheCount$1","matchPath","_options","_options$exact","_options$strict","_options$sensitive","cacheKey","pathCache","regexp","compilePath$1","_compilePath","Route","context$1","isEmptyChildren","createURL","staticHandler","methodName","Switch","useHistory","useLocation","BrowserRouter","resolveToLocation","normalizeToLocation","forwardRefShim","LinkAnchor","forwardedRef","innerRef","navigate","_onClick","isModifiedEvent","Link","_ref2$component","__RouterContext","isDuplicateNavigation","forwardRefShim$1","forwardRef$1","ariaCurrent","_ref$ariaCurrent","activeClassName","_ref$activeClassName","activeStyle","classNameProp","isActiveProp","locationProp","styleProp","escapedPath","classnames","joinClassnames","Op","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","define","innerFn","outerFn","tryLocsList","protoGenerator","Generator","Context","makeInvokeMethod","tryCatch","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","NativeIteratorPrototype","Gp","defineIteratorMethods","_invoke","AsyncIterator","PromiseImpl","invoke","record","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","doneResult","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","info","resultName","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iterable","iteratorMethod","isGeneratorFunction","genFun","ctor","mark","awrap","skipTempReset","rootRecord","rval","loc","caught","hasCatch","hasFinally","finallyEntry","thrown","delegateYield","asyncGeneratorStep","gen","_next","_throw","_useState2","Trader","setTrader","_useState4","Practitioners","setPractitioners","_useState6","AdvocateVideo","setAdvocateVideo","_useState8","EventNews","setEventNews","_useState10","OtherCourses","setOtherCourses","_useState12","TaifexLearn","setTaifexLearn","_asyncToGenerator","_regeneratorRuntime","_callee","fetch","funcCode","funcInterUrl","_jsx","_jsxs","rel","searchData","setsearchData","alt","handlego","NavMenu","onChange","Info","setInfo","Count","setCount","WebImg","setWebImg","_imgurl","_Data","_getIndexCount","getIndexCount","imgurl","tfContent","qrcode","qrcodeName","_callee2","_context2","tfFile","tfFileName","_callee3","_context3","_useState14","placeholder","ATTRIBUTE_NAMES","TAG_NAMES","BASE","BODY","HEAD","HTML","LINK","META","NOSCRIPT","SCRIPT","STYLE","TITLE","TAG_PROPERTIES","REACT_TAG_MAP","accesskey","class","contenteditable","contextmenu","itemprop","HELMET_PROPS","HTML_TAG_MAP","SELF_CLOSING_TAGS","HELMET_ATTRIBUTE","classCallCheck","createClass","objectWithoutProperties","possibleConstructorReturn","encodeSpecialCharacters","getTitleFromPropsList","propsList","innermostTitle","getInnermostProperty","innermostTemplate","innermostDefaultTitle","getOnChangeClientState","getAttributesFromPropsList","tagType","tagAttrs","getBaseTagFromPropsList","primaryAttributes","innermostBaseTag","lowerCaseAttributeKey","getTagsFromPropsList","approvedSeenTags","approvedTags","instanceTags","instanceSeenTags","primaryAttributeKey","attributeKey","tagUnion","objectAssign","rafPolyfill","clock","cafPolyfill","webkitRequestAnimationFrame","mozRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","_helmetCallback","commitTagChanges","newState","bodyAttributes","htmlAttributes","linkTags","metaTags","noscriptTags","onChangeClientState","scriptTags","styleTags","titleAttributes","updateAttributes","updateTitle","tagUpdates","updateTags","addedTags","removedTags","_tagUpdates$tagType","newTags","oldTags","flattenArray","possibleArray","elementTag","helmetAttributeString","helmetAttributes","attributesToRemove","attributeKeys","attribute","indexToSave","tags","headElement","tagNodes","indexToDelete","newElement","styleSheet","existingTag","isEqualNode","generateElementAttributesAsString","convertElementAttributestoReactProps","initProps","getMethodsForTag","toComponent","_initProps","generateTitleAsReactComponent","attributeString","flattenedTitle","generateTitleAsString","_mappedTag","mappedTag","mappedAttribute","generateTagsAsReactComponent","attributeHtml","tagContent","isSelfClosing","generateTagsAsString","_ref$title","noscript","HelmetExport","_class","_temp","HelmetWrapper","inherits","isEqual","mapNestedChildrenToProps","nestedChildren","flattenArrayTypeChildren","_babelHelpers$extends","arrayTypeChildren","newChildProps","mapObjectTypeChildren","_babelHelpers$extends2","_babelHelpers$extends3","mapArrayTypeChildrenToProps","newFlattenedProps","arrayChildName","_babelHelpers$extends4","warnOnInvalidChildren","mapChildrenToProps","_child$props","initAttributes","convertReactPropstoHtmlAttributes","defaultTitle","titleTemplate","mappedState","Helmet","withSideEffect","renderStatic","FooterScript","_Component","_objectSpread2","banner","setbanner","isMobile","setIsMobile","updateViewport","mobile","innerWidth","bannerUrl","bannerFile","bannerTitle","bannerTarget","_doCount","doCount","_Fragment","Banner","_doLearnCount","Orj","contentWidth","getTime","printContentObj","newWindow","write","close","handleClick","systemid","URLSearchParams","setList","setFunc","searchSDate","searchEDate","searchText","isSearch","setIsSearch","setsearch","currentPage","setCurrentPage","pageSize","currentData","_useState16","funcData","ReactGA","handleInputChange","changeName","description","printform","funcId","docId","docTop","docStatus","imgRandom","docImg","docSDate","docTitle","Pagination","leftRange","rightRange","handleChange","seach","gcse","allowArrayLike","normalCompletion","didErr","_e2","shouldUpdateVideo","videoId","prevVars","playerVars","vars","filterResetOptions","__spreadProps","__spreadValues","shouldResetPlayer","shouldUpdatePlayer","_c","iframeClassName","loading","onReady","onPlay","onPause","onEnd","onStateChange","onPlaybackRateChange","onPlaybackQualityChange","YouTube","_YouTube","destroyPlayerPromise","onPlayerReady","onPlayerError","_f","_g","_h","PlayerState","onPlayerPlaybackRateChange","onPlayerPlaybackQualityChange","destroyPlayer","internalPlayer","createPlayer","playerOpts","youTubePlayer","getIframe","iframe","resetPlayer","updatePlayer","getInternalPlayer","updateVideo","startSeconds","endSeconds","loadVideoById","cueVideoById","stopVideo","refContainer","CUED","YouTube_default","videoLong","videodate","videoData","setvideoData","uploaded","setUploaded","setWarn","formData","setFormData","setkey","warnData","Att","_ref3","_x2","_ref4","_callee4","_context4","alert","_x3","ytkey","_callee5","_context5","ytData","_callee6","_context6","docVideoId","changeDate","items","snippet","publishedAt","changeTime","contentDetails","handlecancel","_callee7","_context7","VideoPlayer","yt","upload","blob","URL","createObjectURL","download","revokeObjectURL","handleFileDownload","docAttId","docAttContentReal","docWarn","closewarn","tfFilename","dateObject","year","getFullYear","getMonth","day","getDate","durationMatch","hours","minutes","seconds","setHours","hoursString","getHours","padStart","minutesString","getMinutes","secondsString","getSeconds","lean","setLean","company","setcompany","companyen","setcompanyen","_profiletw","_profileen","VideoPlayer2","profiletw","profileen","setYear","handleSearch","ScrollToTop","newsSDate","newsLink","newsTitle","onSelect","Header","CourseList","SearchCourseList","SearchAllList","CourseDetail","Intellectual","Sitmap","CompanyProfile","Post","News","Footer","NavMenuRWD","isVerified","setIsVerified","acc_id","acc_pw","Setting","setSetting","_GetCAPTCHA","t0","_GetReCaptcha_open","GetCAPTCHA","GetReCaptcha_open","_event$target","handleSubmit","grecaptcha","enterprise","token2","execute","FormData","onSubmit","setSelect","roleName","groupId","groupName","intranetLoginAcc","setIntranetLoginAcc","setLoading","handlelogout","course","setCourse","getCourseNum","backgroundColor","trader","advocateVideo","eventNews","otherCourses","google","charts","packages","setOnLoadCallback","chartRef","chartData","chartArea","legend","loadGoogleCharts","visualization","ColumnChart","draw","arrayToDataTable","dataTable","hAxis","ticks","gridlines","vAxis","LineChart","getFuncCountNum","sliceVisibilityThreshold","PieChart","DataView","setColumns","calc","sourceColumn","role","bar","groupWidth","BarChart","Message","FuncCountMon","FuncCountYear","VideoCountNum","FuncCountNum","grouplist","setgrouplist","searchStatus","groupData","_groupData","handleStatus","stat","groupStatus","handleDelete","getdetail","group_id","setfuncData","_getdetail","funcNamedata","_getCheck","checkdata","getCheck","funcname","userData","setuserData","roleId","rolelist","setrolelist","RoleData","_RoleData","roleAcc","roleGroup","roleStatus","deptlist","setdeptlist","roleEmail","roleEmpno","roleDept","_deptData","deptData","handleRadioChange","dept","deptId","deptName","roleData","searchName","searchShh","searchSmm","searchEhh","searchEmm","searchIp","createDate","operatorName","ip","searchGroup","searchAcc","today","bannerlist","setbannerlist","bannerData","bannerImg","bannerStatus","bannerId","handleUp","bannerSort","handleDown","_bannerData","setFile","bannerSDate","bannerEDate","bannerENever","encType","files","accept","getRandomValues","rnds8","Uint8Array","rng","crypto","msCrypto","uuid","REGEX","byteToHex","validate","buf","rnds","demoImg","uu","uuidv4","formattedDate","setImg","docContent","docEDate","docENever","docVideoUrl","docImgSize","docImgRandom","docSort","docRandomImg","handleUploadChange","maxLength","ImgSlider","tem","docAtt","handleFileDelete","tfInfo","maxlength","searchCategory","searchTheme","setsearchTheme","docVcounter","newsId","menuItems","setMenuItems","buildMenuTree2","Item","funcParent","funcIntraUrl","buildMenuTree3","buildMenuTree","Index","GroupList","AddGroup","EditGroup","EditGroupFunc","EditGroupUser","RoleList","AddRole","EditRole","UserLog","UserGroup","PersonRole","PersonRoleFunc","BannerList","AddBanner","EditBanner","AddCourse","EditCourse","EditIntellectual","EditContactInfo","EditWarn","VideoCountList","FuncCount","NewsList","Head","IntraHead","ZhTWHead","Login","GroupSelect","IntraHome","ZhTWHome","baseUrl","rootElement","ReactDOM","App"],"sourceRoot":""}