Merge pull request 'dev' (#58) from dev into dev-deploy

Reviewed-on: #58
This commit is contained in:
ysCha 2025-05-26 16:56:30 +09:00
commit a5a1370135
10 changed files with 173 additions and 132 deletions

View File

@ -195,9 +195,7 @@ export default function Qna() {
))
) : (
<tr>
<td colSpan={4} className="al-c">
{getMessage('common.message.no.data')}
</td>
<td className="al-c no-data" colSpan={5}>{getMessage('common.message.no.data')}</td>
</tr>
)}
</tbody>

View File

@ -27,6 +27,7 @@ export default function QnaRegModal({ setOpen, setReload, searchValue, selectPag
const qnaTypeLgCodeRef = useRef(null)
const qnaTypeMdCodeRef = useRef(null)
const qnaTypeSmCodeRef = useRef(null)
const qstMail = useRef(null);
const regUserNmRef = useRef(null)
const regUserTelNoRef = useRef(null)
const titleRef = useRef(null)
@ -65,6 +66,7 @@ let fileCheck = false;
const initQnaReg = async () => {
qstMail.current.value = ''
regUserNmRef.current.value = ''
regUserTelNoRef.current.value = ''
qnaTypeLgCodeRef.current.setValue();
@ -148,7 +150,7 @@ let fileCheck = false;
if(!fileCheck) return;
fileUploadProps.uploadFiles.forEach((file) => {
console.log("file::::::::",file)
//console.log("file::::::::",file)
formData.push(file)
})
@ -156,6 +158,16 @@ let fileCheck = false;
fileCheck = false;
}
const isValidEmail = (email) => {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
};
const isEmpty = (value) => {
return value === null || value === undefined || value.trim() === "";
};
const handleQnaSubmit = async () => {
//
@ -164,13 +176,22 @@ let fileCheck = false;
let regUserNm = qnaData?.regUserNm??'';
if (regUserNm.trim().length === 0) {
if (!isValidEmail(qnaData.qstMail)) {
qstMail.current.focus();
swalFire({
title: getMessage('qna.reg.alert.require.qstMail'),
icon: 'warning',
});
return;
}
regUserNmRef.current.value = '';
if (isEmpty(regUserNm)) {
regUserNmRef.current.value = '';
regUserNmRef.current.focus()
swalFire({
text: getMessage('qna.reg.alert.require.regUserNm'),
type: 'alert',
title: getMessage('qna.reg.alert.require.regUserNm'),
icon: 'warning',
})
return false
}
@ -178,35 +199,35 @@ let fileCheck = false;
let qnaClsLrgCd = qnaData?.qnaClsLrgCd??'';
let qnaClsMidCd = qnaData?.qnaClsMidCd??'';
if (qnaClsLrgCd.trim().length === 0 || qnaClsMidCd.trim().length === 0 ) {
(qnaClsLrgCd.trim().length === 0)?qnaTypeLgCodeRef.current.focus():qnaTypeMdCodeRef.current.focus()
if (isEmpty(qnaClsLrgCd) || isEmpty(qnaClsMidCd) ) {
(isEmpty(qnaClsLrgCd))?qnaTypeLgCodeRef.current.focus():qnaTypeMdCodeRef.current.focus()
swalFire({
text: getMessage('qna.reg.alert.select.type'),
type: 'alert',
title: getMessage('qna.reg.alert.select.type'),
icon: 'warning',
})
return false
}
let title = qnaData?.title??'';
if (title.trim().length === 0) {
if (isEmpty(title)) {
titleRef.current.value = '';
titleRef.current.focus()
swalFire({
text: getMessage('qna.reg.alert.require.title'),
type: 'alert',
title: getMessage('qna.reg.alert.require.title'),
icon: 'warning',
})
return false
}
//console.log("5::::",qnaData)
let contents = qnaData?.contents??'';
if (contents.trim().length === 0) {
if (isEmpty(contents)) {
contentsRef.current.value = '';
contentsRef.current.focus()
swalFire({
text: getMessage('qna.reg.alert.require.contents'),
type: 'alert',
title: getMessage('qna.reg.alert.require.contents'),
icon: 'warning',
})
return false
}
@ -310,7 +331,13 @@ let fileCheck = false;
<th>{getMessage('qna.list.header.regNm')}</th>
<td><input type="text" className="input-light" value={sessionState?.userNm || ''} readOnly /></td>
<th>E-Mail<span className="red">*</span></th>
<td ><input type="text" className="input-light" value={sessionState?.email || ''} readOnly /></td>
<td ><input type="text" className="input-light" required
ref={qstMail}
value={qnaData?.qstMail || ''}
onChange={(e) => setQnaData({...qnaData, qstMail: e.target.value })}
onBlur={(e) => setQnaData({ ...qnaData, qstMail: e.target.value })} />
</td>
<th>{getMessage('qna.reg.header.regDt')}</th>
<td>{dayjs(new Date()).format('YYYY-MM-DD')}</td>
</tr>

View File

@ -32,61 +32,53 @@ export default function FlowLine({ FLOW_LINE_REF }) {
<>
<div className="outline-wrap">
<div className="guide">{getMessage('modal.movement.flow.line.info')}</div>
<div className="eaves-keraba-table">
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">
<div className="d-check-radio pop">
<input
type="radio"
name="radio01"
id="ra01"
defaultChecked={true}
ref={FLOW_LINE_REF.DOWN_LEFT_RADIO_REF}
onChange={() => {
setType(FLOW_LINE_TYPE.DOWN_LEFT)
}}
/>
<label htmlFor="ra01">{getMessage('modal.movement.flow.line.bottom.left')}</label>
</div>
<div className="outline-form">
<span>{getMessage('modal.movement.flow.line.position')}</span>
<div className="input-grid mr5">
<input type="text" className="input-origin block" defaultValue={100} readOnly={true} ref={FLOW_LINE_REF.POINTER_INPUT_REF} />
</div>
</div>
<div className="moving-tab-content">
<div className="moving-tab-radio-wrap">
<div className="d-check-radio pop">
<input
type="radio"
name="radio01"
id="ra01"
ref={FLOW_LINE_REF.DOWN_LEFT_RADIO_REF}
onChange={() => {
setType(FLOW_LINE_TYPE.DOWN_LEFT)
}}
/>
<label htmlFor="ra01">{getMessage('modal.movement.flow.line.bottom.left')}</label>
</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '100px' }}>
{<input type="text" className="input-origin block" readOnly={true} ref={FLOW_LINE_REF.POINTER_INPUT_REF} />}
</div>
</div>
<div className="d-check-radio pop">
<input
type="radio"
name="radio01"
id="ra02"
ref={FLOW_LINE_REF.UP_RIGHT_RADIO_REF}
onChange={() => {
setType(FLOW_LINE_TYPE.UP_RIGHT)
}}
/>
<label htmlFor="ra02">{getMessage('modal.movement.flow.line.top.right')}</label>
</div>
</div>
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">
<div className="d-check-radio pop">
<input
type="radio"
name="radio01"
id="ra02"
ref={FLOW_LINE_REF.UP_RIGHT_RADIO_REF}
onChange={() => {
setType(FLOW_LINE_TYPE.UP_RIGHT)
}}
/>
<label htmlFor="ra02">{getMessage('modal.movement.flow.line.top.right')}</label>
</div>
</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '100px' }}>
<input
type="text"
className="input-origin block"
ref={FLOW_LINE_REF.FILLED_INPUT_REF}
value={filledInput}
onFocus={handleFocus}
onChange={handleInput}
/>
</div>
<span className="thin">mm</span>
</div>
<div className="outline-form">
<span>{getMessage('modal.movement.flow.line.movement')}</span>
<div className="input-grid mr5">
<input
type="text"
className="input-origin block"
defaultValue={100}
ref={FLOW_LINE_REF.FILLED_INPUT_REF}
value={filledInput}
onFocus={handleFocus}
onChange={handleInput}
/>
</div>
<span className="thin">mm</span>
</div>
</div>
</div>

View File

@ -29,61 +29,54 @@ export default function Updown({ UP_DOWN_REF }) {
<>
<div className="outline-wrap">
<div className="guide">{getMessage('modal.movement.flow.line.updown.info')}</div>
<div className="eaves-keraba-table">
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">
<div className="d-check-radio pop">
<input
type="radio"
name="radio01"
id="ra01"
ref={UP_DOWN_REF.UP_RADIO_REF}
defaultChecked={true}
onChange={() => {
setType(UP_DOWN_TYPE.UP)
}}
/>
<label htmlFor="ra01">{getMessage('modal.movement.flow.line.updown.up')}</label>
</div>
<div className="outline-form">
<span>{getMessage('modal.movement.flow.line.position')}</span>
<div className="input-grid mr5">
<input type="text" className="input-origin block" defaultValue={100} readOnly={true} ref={UP_DOWN_REF.POINTER_INPUT_REF} />
</div>
</div>
<div className="moving-tab-content">
<div className="moving-tab-radio-wrap">
<div className="d-check-radio pop">
<input
type="radio"
name="radio01"
id="ra01"
ref={UP_DOWN_REF.UP_RADIO_REF}
defaultChecked={true}
onChange={() => {
setType(UP_DOWN_TYPE.UP)
}}
/>
<label htmlFor="ra01">{getMessage('modal.movement.flow.line.updown.up')}</label>
</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '100px' }}>
{<input type="text" className="input-origin block" readOnly={true} ref={UP_DOWN_REF.POINTER_INPUT_REF} />}
</div>
</div>
<div className="d-check-radio pop">
<input
type="radio"
name="radio01"
id="ra02"
ref={UP_DOWN_REF.DOWN_RADIO_REF}
onChange={() => {
setType(UP_DOWN_TYPE.DOWN)
}}
/>
<label htmlFor="ra02">{getMessage('modal.movement.flow.line.updown.down')}</label>
</div>
</div>
<div className="eaves-keraba-item">
<div className="eaves-keraba-th">
<div className="d-check-radio pop">
<input
type="radio"
name="radio01"
id="ra02"
ref={UP_DOWN_REF.DOWN_RADIO_REF}
onChange={() => {
setType(UP_DOWN_TYPE.DOWN)
}}
/>
<label htmlFor="ra02">{getMessage('modal.movement.flow.line.updown.down')}</label>
</div>
</div>
<div className="eaves-keraba-td">
<div className="outline-form">
<div className="input-grid mr5" style={{ width: '100px' }}>
<input
type="text"
className="input-origin block"
ref={UP_DOWN_REF.FILLED_INPUT_REF}
value={filledInput}
onFocus={handleFocus}
onChange={handleInput}
/>
</div>
<span className="thin">mm</span>
</div>
<div className="outline-form">
<span>{getMessage('modal.movement.flow.line.movement')}</span>
<div className="input-grid mr5">
<input
type="text"
className="input-origin block"
defaultValue={100}
ref={UP_DOWN_REF.FILLED_INPUT_REF}
value={filledInput}
onFocus={handleFocus}
onChange={handleInput}
/>
</div>
<span className="thin">mm</span>
</div>
</div>
</div>

View File

@ -199,7 +199,11 @@ export function useCanvasSetting(executeEffect = true) {
if (!executeEffect) {
return
}
if (roofMaterials.length === 0) {
return
}
const selectedRoofMaterial = roofMaterials[0]
console.log('selectedRoofMaterial', selectedRoofMaterial)
if (addedRoofs.length === 0) {
const newAddedRoofs = []

View File

@ -43,14 +43,16 @@
"plan.menu.roof.cover.roof.shape.setting": "屋根形状の設定",
"plan.menu.roof.cover.roof.shape.passivity.setting": "屋根形状の手動設定",
"plan.menu.roof.cover.eaves.kerava.edit": "軒・ケラバ変更",
"plan.menu.roof.cover.movement.shape.updown": "軒線移動・桁上げ下り",
"modal.movement.flow.line.move": "軒線の移動",
"plan.menu.roof.cover.movement.shape.updown": "棟線移動・桁上げ下げ",
"modal.movement.flow.line.move": "棟線移動",
"modal.movement.flow.line.move.alert": "移動する数ない。",
"modal.movement.flow.line.updown": "桁上げ・下",
"modal.movement.flow.line.updown.info": "桁の異なる辺を選択し、幅を指定します。",
"modal.movement.flow.line.updown": "桁上げ・下",
"modal.movement.flow.line.updown.info": "桁高の違う辺を選択し、 幅を指定してください",
"modal.movement.flow.line.updown.up": "桁を上げる",
"modal.movement.flow.line.updown.down": "桁数を下げる",
"modal.movement.flow.line.info": "軒線を選択して移動幅を指定します",
"modal.movement.flow.line.info": "棟線を選択し、 移動幅を指定してください。",
"modal.movement.flow.line.position": "位置値",
"modal.movement.flow.line.movement": "動き値",
"modal.movement.flow.line.bottom.left": "高さ変更:下、左",
"modal.movement.flow.line.top.right": "高さ変更:上、右",
"plan.menu.roof.cover.outline.edit.offset": "外壁の編集とオフセット",
@ -610,6 +612,7 @@
"qna.reg.header.contents": "お問い合わせ内容",
"qna.reg.header.fileList": "ファイル添付",
"qna.reg.header.save": "保存",
"qna.reg.alert.require.qstMail": "無効なメール形式です。",
"qna.reg.alert.require.regUserNm": "名前を入力してください。",
"qna.reg.alert.select.type": "お問い合わせ区分を選択してください。",
"qna.reg.alert.require.title": "タイトルを入力してください。",

View File

@ -51,6 +51,8 @@
"modal.movement.flow.line.updown.up": "자릿수를 올리다",
"modal.movement.flow.line.updown.down": "자릿수를 낮추다",
"modal.movement.flow.line.info": "동선을 선택하고 이동 폭을 지정하십시오",
"modal.movement.flow.line.position": "위치값",
"modal.movement.flow.line.movement": "이동 수치",
"modal.movement.flow.line.bottom.left": "높이변경 : 아래, 왼쪽",
"modal.movement.flow.line.top.right": "높이변경 : 위, 오른쪽",
"plan.menu.roof.cover.outline.edit.offset": "외벽선 편집 및 오프셋",
@ -610,6 +612,7 @@
"qna.reg.header.contents": "문의정보",
"qna.reg.header.fileList": "파일첨부",
"qna.reg.header.save": "저장",
"qna.reg.alert.require.qstMail": "올바르지 않은 이메일 형식입니다.",
"qna.reg.alert.require.regUserNm": "이름을 입력하세요.",
"qna.reg.alert.select.type": "문의구분을 선택하세요.",
"qna.reg.alert.require.title": "제목을 입력하세요.",

View File

@ -2436,4 +2436,24 @@ $alert-color: #101010;
}
}
}
}
}
// 2025-05-26 동선이동 올림 내림
.moving-tab-radio-wrap{
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 10px;
}
.moving-tab-content{
padding: 10px;
border: 1px solid #3D3D3D;
margin-top: 15px;
.outline-form{
span{
width: auto;
margin-right: 23px;
}
}
}

View File

@ -374,10 +374,7 @@
// 1:1문의
.one-on-one{
.select-wrap{
width: 250px;
}
.input-wrap{
flex: 1 1 auto;
flex: 1;
}
&.btn-area{
padding-bottom: 0;
@ -388,7 +385,7 @@
border: 1px solid #eee;
.drag-file-area{
margin-top: 0;
.file-list {
.file-list{
overflow-y: auto;
max-height: 100px;
}

View File

@ -400,6 +400,10 @@ table{
font-weight: 400;
}
}
&.no-data{
padding: 70px 0;
font-size: 14px;
}
}
tr{
background-color: transparent;