{"version":3,"file":"PermissionSetting-DfnPKFt6.js","sources":["../../../app/javascript/components/templates/permisson/PermissionSetting.tsx"],"sourcesContent":["// @ts-nocheck\nimport React, { useEffect, useRef, useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport axios from \"axios\";\naxios.defaults.headers.common[\"X-Requested-With\"] = \"XMLHttpRequest\";\nimport DOMPurify from \"dompurify\";\nimport style from \"./PermissonSetting.module.scss\";\nimport { getImageUrl } from \"../../../commons/assets_path\";\nimport useLanguageChange from \"../../../hooks/useLanguageChange\";\n\nexport const PermissionSetting = (props) => {\n const { t } = useLanguageChange(props.locale);\n const [isSettingShow, setSettingShow] = useState(false);\n const [isPermissionListShow, setPermissonListShow] = useState(false);\n const [isSelectUserShow, setSelectUserShow] = useState(false);\n const [isInvitePermissonShow, setInvitePermissonShow] = useState(false);\n const [selectUserList, setSelectUserList] = useState([]);\n const [listLength, setListLength] = useState(false);\n const [permisson, setPermisson] = useState(null);\n const [inputFocus, setFocus] = useState(false);\n const [compositionFlag, setCompositionFlag] = useState(false);\n const [userList, setUserList] = useState([]);\n const [permissionIndex, setPermissionIndex] = useState(null);\n const [typeIndex, setTypeIndex] = useState(null);\n const [permissionGroups, setPermissionGroups] = useState([]);\n const [errMessage, setErrMessage] = useState(null);\n const [inputErrMessage, setInputErrMessage] = useState(null);\n const [validateErrMessage, setValidateErrMessage] = useState(null);\n const [validMessage, setValidMessage] = useState(\"\");\n const [changeMessage, setChangeMessage] = useState(\"\");\n const settingRef = useRef(null);\n const permissionListRef = useRef(null);\n const selectUserRef = useRef(null);\n const invitePermissonRef = useRef(null);\n const inputRef = useRef(null);\n const inviteTextRef = useRef(null);\n\n const instance = axios.create({\n baseURL: `${window.origin}/${props.client}`,\n });\n\n const getGroups = async () => {\n await instance\n .get(\"/resource_permission_groups\", {\n params: {\n resourceable_type: props.resourceableType,\n resourceable_id: props.resourceableId,\n },\n })\n .then((res) => {\n setPermissionGroups(res.data.resource_permission_groups);\n });\n };\n\n const getArraysDiff = (array1, array2) => {\n const array1NameArray = array1.map((itm) => {\n return itm.name;\n });\n const array2NameArray = array2.map((itm) => {\n return itm.name;\n });\n\n const arr1 = [...new Set(array1NameArray)];\n const arr2 = [...new Set(array2NameArray)];\n return [...arr1, ...arr2].filter((val) => {\n return !arr1.includes(val) || !arr2.includes(val);\n });\n };\n\n const getUserList = async (val = null) => {\n await instance\n .get(\"/resource_permission_groups/permission_groups\", {\n params: {\n query: val,\n resourceable_type: props.resourceableType,\n resourceable_id: props.resourceableId,\n },\n })\n .then((res) => {\n if (selectUserList.length === 0) {\n setUserList(res.data.permission_groups);\n } else {\n const diff = getArraysDiff(res.data.permission_groups, selectUserList);\n const userDiff = res.data.permission_groups.filter((item) => {\n return diff.includes(item.name);\n });\n setUserList(userDiff);\n }\n });\n };\n const updateRole = async (role, resourcePermissionGroup) => {\n const f = window.confirm(t(\"PermissionSetting.権限を変更します。実行してもいいですか?\"));\n if (f) {\n await instance\n .patch(`/resource_permission_groups/${resourcePermissionGroup.id}/update_role`, {\n resource_permission_group: {\n role: role,\n },\n })\n .then(() => {\n getGroups();\n setChangeMessage(t(\"PermissionSetting.権限が変更されました\"));\n setPermissonListShow(false);\n })\n .catch(({ response }) => {\n setValidMessage(response.data.role[0]);\n });\n }\n };\n\n const inviteUser = async (member, guest) => {\n const params = {\n resource_permission_groups: member,\n guest_resource_permission_groups: guest,\n message: inviteTextRef.current.value === \"\" ? inviteTextRef.current.placeholder : inviteTextRef.current.value,\n };\n await instance\n .post(\n props.resourceableType === \"DynamicDatabase\"\n ? `dynamic_databases/${props.databaseId}/create_authority`\n : `/resource_permission_groups/batch_create`,\n params,\n )\n .then(() => {\n getGroups();\n setSelectUserList([]);\n setChangeMessage(\n props.resourceableType === \"DynamicDatabase\"\n ? t(\"PermissionSetting.データベースに新たにメンバーを追加しました\")\n : t(\"PermissionSetting.権限が変更されプロジェクトに新たにメンバーを追加しましたました\"),\n );\n setFocus(false);\n })\n .catch(({ response }) => {\n setErrMessage(response.data.message);\n });\n };\n\n const preInviteUser = async () => {\n if (!selectUserList.length) return;\n const f = window.confirm(\n props.resourceableType === \"DynamicDatabase\"\n ? t(\"PermissionSetting.新しいメンバーをこのデータベースに招待します。実行しますか?\")\n : t(\"PermissionSetting.新しいメンバーをこのプロジェクトに招待します。実行しますか?\"),\n );\n if (f) {\n const paramMember = [];\n const paramGuest = [];\n const createGuestList = [];\n\n selectUserList.forEach((user) => {\n if (user.is_guest) {\n createGuestList.push(user.email);\n } else {\n paramMember.push({\n permission_group_id: user.id,\n resourceable_type: props.resourceableType,\n resourceable_id: props.resourceableId,\n role: permisson,\n });\n }\n });\n\n if (createGuestList.length && props.inviteGuests) {\n const submitGuest = {\n dynamic_database_id: props.resourceableId,\n email_list: createGuestList,\n };\n await instance\n .post(`/members/create_guests`, submitGuest)\n .then((response) => {\n response.data.permission_group_ids.forEach((id) => {\n paramGuest.push({\n permission_group_id: id,\n resourceable_type: props.resourceableType,\n resourceable_id: props.resourceableId,\n role: permisson,\n });\n });\n inviteUser(paramMember, paramGuest);\n })\n .catch(({ response }) => {\n setInputErrMessage(response.data.message);\n });\n } else {\n inviteUser(paramMember, paramGuest);\n }\n }\n };\n\n const deleteRole = async (resourcePermissionGroup) => {\n const f = window.confirm(t(\"PermissionSetting.権限を変更します。実行してもいいですか?\"));\n if (f) {\n await instance\n .delete(`/resource_permission_groups/${resourcePermissionGroup.id}`)\n .then(() => {\n getGroups();\n setChangeMessage(t(\"PermissionSetting.権限削除しました\"));\n })\n .catch(({ response }) => {\n setValidMessage(response.data.base[0]);\n });\n }\n };\n\n const memberPresence = async (inputValue, isInput) => {\n setInputErrMessage(null);\n if (inputValue === \"\") return;\n if (selectUserList.length >= 40) {\n setInputErrMessage(t(\"PermissionSetting.一度に招待できるのは40名までです\"));\n return;\n }\n const existUsers = permissionGroups.single_member;\n let inviteJudge = false;\n let inputClear = false;\n if (selectUserList.length) {\n for (let index = 0; index < selectUserList.length; index++) {\n const user = selectUserList[index];\n if (user.name === inputValue || user.email === inputValue) {\n inviteJudge = true;\n setInputErrMessage(user.name + t(\"PermissionSetting.さんはすでに選択されています\"));\n break;\n }\n }\n }\n if (userList.length && !inviteJudge) {\n const unSelectedUser = [];\n userList.forEach((user) => {\n if (user.name === inputValue || user.email === inputValue) {\n inviteJudge = true;\n inputClear = true;\n setSelectUserList([...selectUserList, { name: user.name, id: user.id, email: user.email, is_guest: false }]);\n } else {\n unSelectedUser.push(user);\n }\n });\n if (inviteJudge) {\n setUserList(unSelectedUser);\n }\n }\n if (isInput) {\n if (existUsers.length && !inviteJudge) {\n for (let index = 0; index < existUsers.length; index++) {\n const user = existUsers[index];\n if (user.name === inputValue || user.description === inputValue) {\n inviteJudge = true;\n setInputErrMessage(\n user.name +\n t(\"PermissionSetting.さんはすでに「\") +\n props.sectionName +\n t(\"PermissionSetting.」の権限が付与されています\"),\n );\n break;\n }\n }\n }\n if (!inviteJudge) {\n const isEmail = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i;\n if (props.inviteGuests) {\n if (isEmail.test(inputValue)) {\n await instance\n .post(`/client_members/validate_guest`, { email: inputValue })\n .then(() => {\n inviteJudge = true;\n inputClear = true;\n setSelectUserList([\n ...selectUserList,\n { name: inputValue, id: null, email: inputValue, is_guest: true },\n ]);\n })\n .catch(({ response }) => {\n setValidateErrMessage(response.data.message);\n });\n } else {\n setInputErrMessage(\n t(\"PermissionSetting.メンバーアカウントを選択するかメールアドレスを正しく入力してください\"),\n );\n }\n } else {\n setInputErrMessage(t(\"PermissionSetting.メンバーアカウントを選択してください\"));\n }\n }\n }\n if (inputClear) {\n inputRef.current.value = \"\";\n }\n };\n\n const arrowAction = (action, i, e) => {\n if (action === \"ArrowUp\" && document.getElementById(`userlist-${i + -1}`)) {\n document.getElementById(`userlist-${i + -1}`).focus();\n e.preventDefault();\n }\n if (action === \"ArrowDown\" && document.getElementById(`userlist-${i + 1}`)) {\n document.getElementById(`userlist-${i + 1}`).focus();\n e.preventDefault();\n }\n };\n useEffect(() => {\n getUserList();\n setPermissionGroups(props.resourcePermissionGroups);\n setPermisson(\"admin\");\n }, []);\n\n useEffect(() => {\n if (!settingRef?.current) return;\n const hundleClickOutside = (e) => {\n if (settingRef.current !== null && !settingRef.current.contains(e.target)) {\n setSettingShow(false);\n setPermissonListShow(false);\n setSelectUserShow(false);\n }\n };\n document.addEventListener(\"mouseup\", hundleClickOutside);\n }, [settingRef?.current]);\n useEffect(() => {\n if (!permissionListRef?.current) return;\n const hundleClickOutside = (e) => {\n if (permissionListRef.current !== null && !permissionListRef.current.contains(e.target)) {\n setPermissonListShow(false);\n }\n };\n document.addEventListener(\"mouseup\", hundleClickOutside);\n }, [permissionListRef?.current]);\n useEffect(() => {\n if (!selectUserRef?.current) return;\n const hundleClickOutside = (e) => {\n if (selectUserRef.current !== null && !selectUserRef.current.contains(e.target)) {\n setSelectUserShow(false);\n setInputErrMessage(null);\n }\n };\n document.addEventListener(\"mouseup\", hundleClickOutside);\n }, [isSelectUserShow, selectUserRef?.current]);\n useEffect(() => {\n if (!invitePermissonRef?.current) return;\n const hundleClickOutside = (e) => {\n if (invitePermissonRef.current !== null && !invitePermissonRef.current.contains(e.target)) {\n setInvitePermissonShow(false);\n }\n };\n document.addEventListener(\"mouseup\", hundleClickOutside);\n }, [isInvitePermissonShow, invitePermissonRef?.current]);\n useEffect(() => {\n if (selectUserList.length === 0) {\n setListLength(false);\n } else {\n setListLength(true);\n }\n getUserList();\n }, [selectUserList]);\n\n useEffect(() => {\n if (validMessage !== \"\") {\n setTimeout(() => {\n setValidMessage(\"\");\n }, 7000);\n }\n }, [validMessage]);\n useEffect(() => {\n if (changeMessage !== \"\") {\n setTimeout(() => {\n setChangeMessage(\"\");\n }, 7000);\n }\n }, [changeMessage]);\n useEffect(() => {\n setInvitePermissonShow(false);\n }, [permisson]);\n\n return (\n