설치 안내 및 브라우저 관련 메시지 수정, 텍스트 선택 감지 기능 개선, 사용자 찜 설정 초기화 및 버튼 상태 관리 기능 추가, UI 개선 및 새로운 모달 추가
This commit is contained in:
parent
62a95c6fcc
commit
9f81e5fb9e
8
main.py
8
main.py
|
|
@ -131,9 +131,9 @@ class ExtensionInstaller(QWidget):
|
|||
|
||||
guide = QLabel(
|
||||
"<b>설치 안내:</b><br>"
|
||||
"<span style='color:#e1ffbb;'>1. main.py와 같은 경로의 <b>wrmc_ext</b> 폴더가 자동 복사됩니다.<br>"
|
||||
"2. 설치할 브라우저를 모두 체크 후 <b>설치 시작</b>을 누르세요.<br>"
|
||||
"3. 설치 후 브라우저별 단계별 안내를 참고하세요.</span>")
|
||||
# "<span style='color:#e1ffbb;'>1. main.py와 같은 경로의 <b>wrmc_ext</b> 폴더가 자동 복사됩니다.<br>"
|
||||
"1. 설치할 브라우저를 모두 체크 후 <b>설치 시작</b>을 누르세요.<br>"
|
||||
"2. 설치 후 브라우저별 단계별 안내를 참고하세요.</span>")
|
||||
guide.setWordWrap(True)
|
||||
guide.setStyleSheet("margin-bottom:12px;")
|
||||
layout.addWidget(guide)
|
||||
|
|
@ -256,7 +256,7 @@ class ExtensionInstaller(QWidget):
|
|||
row2.setTextFormat(Qt.RichText)
|
||||
row2.setWordWrap(True)
|
||||
# 3번 압축해제된 확장프로그램 로드
|
||||
row3 = QLabel("③ <b>[압축해제된 확장 프로그램 로드]</b> 버튼 클릭")
|
||||
row3 = QLabel("③ <b>[압축해제된 확장 프로그램 로드] 또는 [압축해제된 확장앱 설치]</b> 버튼 클릭")
|
||||
row3.setTextFormat(Qt.RichText)
|
||||
row3.setWordWrap(True)
|
||||
# 4번 폴더 선택 및 복사
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
2152
wrmc_ext/content.js
2152
wrmc_ext/content.js
File diff suppressed because it is too large
Load Diff
|
|
@ -11,15 +11,16 @@
|
|||
"notifications",
|
||||
"alarms",
|
||||
"tabs",
|
||||
"scripting"
|
||||
"scripting",
|
||||
"clipboardRead"
|
||||
],
|
||||
"host_permissions": [
|
||||
"*://markinfo.kr/*",
|
||||
"http://146.56.101.199:8000/*",
|
||||
"https://oci1ckh08045.duckdns.org:8000/*",
|
||||
"*://smartstore.naver.com/*",
|
||||
"*://translate.googleapis.com/*",
|
||||
"*://api.mymemory.translated.net/*",
|
||||
"https://market.m.taobao.com/*",
|
||||
"*://openapi.naver.com/*",
|
||||
"*://api-free.deepl.com/*",
|
||||
"*://api.deepl.com/*",
|
||||
|
|
@ -33,6 +34,7 @@
|
|||
{
|
||||
"matches": ["<all_urls>"],
|
||||
"js": ["content.js"],
|
||||
"all_frames": true,
|
||||
"run_at": "document_end"
|
||||
}
|
||||
],
|
||||
|
|
@ -59,6 +61,12 @@
|
|||
"default": "Ctrl+Shift+Z"
|
||||
},
|
||||
"description": "한국어↔중국어 양방향 번역"
|
||||
},
|
||||
"direct-translate": {
|
||||
"suggested_key": {
|
||||
"default": "Ctrl+Shift+K"
|
||||
},
|
||||
"description": "직번역 (텍스트 바로 대체)"
|
||||
}
|
||||
},
|
||||
"web_accessible_resources": [
|
||||
|
|
|
|||
|
|
@ -330,7 +330,7 @@
|
|||
<ul class="feature-list">
|
||||
<li>번역할 문장이나 단어를 드래그 후 단축키(컨트롤+쉬프트+Z) 입력</li>
|
||||
<li>웹페이지에서 바로 한글과 중국어를 빠르게 번역</li>
|
||||
<li>위챗등의 대화에서 한글 입력 후 선택 및 단축키로 바로 번역</li>
|
||||
<li>위챗등의 대화에서 한글 입력 후 선택 및 단축키로 바로 번역[현재 위챗의 특수성으로 적용되지않음]</li>
|
||||
<li>웹페이지에서 중국어를 드래그 후 단축키로 바로 번역 결과 확인</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
@ -343,6 +343,7 @@
|
|||
<li>휴식시간 추천 활동</li>
|
||||
<li>실시간 타이머 알림</li>
|
||||
<li>개인화된 시간 설정</li>
|
||||
<li></li>[포모도로 타이머가 활성화 되면 35분/5분으로 기본설정되며 4사이클 총180분(3시간) 휴식시간 추천 활동 제공]</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -427,7 +427,8 @@
|
|||
<button class="btn management-btn" id="settings-btn">⚙️ 설정</button>
|
||||
<button class="btn management-btn" id="banned-words-btn">🚫 금지어 관리</button>
|
||||
<button class="btn management-btn" id="sayings-btn">💬 타냐대장경</button>
|
||||
<button class="btn management-btn" id="zzim-btn" disabled>💝 찜관리</button>
|
||||
<!-- <button class="btn management-btn" id="zzim-btn" disabled>💝 찜관리</button> -->
|
||||
<button class="btn management-btn" id="zzim-btn">💝 찜관리</button>
|
||||
<button class="btn management-btn" id="manual-btn">📚 매뉴얼</button>
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -542,21 +542,29 @@
|
|||
<div class="toggle-switch" id="timeAlarmToggle"></div>
|
||||
<span>알람 활성화/비활성화</span>
|
||||
</div>
|
||||
|
||||
<!-- 포모도로 토글 -->
|
||||
<div class="time-input-group">
|
||||
<label>포모도로:</label>
|
||||
<div class="toggle-switch" id="pomodoroToggle"></div>
|
||||
<span>35분 작업 / 5분 휴식 (4회) 고정</span>
|
||||
</div>
|
||||
|
||||
<div class="time-input-group">
|
||||
<label>작업 시간:</label>
|
||||
<input type="number" id="workTimeInput" min="1" max="480" value="60">
|
||||
<input type="number" id="workTimeInput" min="60" max="480" value="60">
|
||||
<span>분 (작업 후 휴식 알림)</span>
|
||||
</div>
|
||||
|
||||
<div class="time-input-group">
|
||||
<label>휴식 시간:</label>
|
||||
<input type="number" id="restTimeInput" min="1" max="60" value="5">
|
||||
<input type="number" id="restTimeInput" min="1" max="15" value="5">
|
||||
<span>분 (휴식 시간 길이)</span>
|
||||
</div>
|
||||
|
||||
<div class="checkbox-group">
|
||||
<input type="checkbox" id="autoZzimCheckbox" disabled>
|
||||
<!-- <input type="checkbox" id="autoZzimCheckbox" disabled> -->
|
||||
<input type="checkbox" id="autoZzimCheckbox">
|
||||
<label for="autoZzimCheckbox">휴식 중 자동 찜 기능 활성화</label>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -236,7 +236,9 @@ class SettingsManager {
|
|||
enabled: true,
|
||||
workTime: 60, // 분
|
||||
restTime: 5, // 분
|
||||
autoZzim: false
|
||||
autoZzim: false,
|
||||
pomodoro: false,
|
||||
cycle: 0
|
||||
};
|
||||
console.log('시간 알람 설정 로드 완료:', this.timeAlarmSettings);
|
||||
} catch (error) {
|
||||
|
|
@ -245,7 +247,9 @@ class SettingsManager {
|
|||
enabled: true,
|
||||
workTime: 60,
|
||||
restTime: 5,
|
||||
autoZzim: false
|
||||
autoZzim: false,
|
||||
pomodoro: false,
|
||||
cycle: 0
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -321,6 +325,7 @@ class SettingsManager {
|
|||
const workTimeInput = document.getElementById('workTimeInput');
|
||||
const restTimeInput = document.getElementById('restTimeInput');
|
||||
const autoZzimCheckbox = document.getElementById('autoZzimCheckbox');
|
||||
const pomodoroToggle = document.getElementById('pomodoroToggle');
|
||||
|
||||
if (workTimeInput) {
|
||||
workTimeInput.addEventListener('change', (e) => {
|
||||
|
|
@ -339,6 +344,18 @@ class SettingsManager {
|
|||
this.timeAlarmSettings.autoZzim = e.target.checked;
|
||||
});
|
||||
}
|
||||
|
||||
if (pomodoroToggle) {
|
||||
pomodoroToggle.addEventListener('click', () => {
|
||||
this.timeAlarmSettings.pomodoro = !this.timeAlarmSettings.pomodoro;
|
||||
// 포모도로가 활성화되면 고정 값 적용
|
||||
if (this.timeAlarmSettings.pomodoro) {
|
||||
this.timeAlarmSettings.workTime = 35;
|
||||
this.timeAlarmSettings.restTime = 5;
|
||||
}
|
||||
this.updateTimeAlarmUI();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
updateUI() {
|
||||
|
|
@ -388,12 +405,23 @@ class SettingsManager {
|
|||
}
|
||||
}
|
||||
|
||||
const pomodoroToggle = document.getElementById('pomodoroToggle');
|
||||
if (pomodoroToggle) {
|
||||
if (this.timeAlarmSettings.pomodoro) {
|
||||
pomodoroToggle.classList.add('active');
|
||||
} else {
|
||||
pomodoroToggle.classList.remove('active');
|
||||
}
|
||||
}
|
||||
|
||||
if (workTimeInput) {
|
||||
workTimeInput.value = this.timeAlarmSettings.workTime;
|
||||
workTimeInput.disabled = this.timeAlarmSettings.pomodoro;
|
||||
}
|
||||
|
||||
if (restTimeInput) {
|
||||
restTimeInput.value = this.timeAlarmSettings.restTime;
|
||||
restTimeInput.disabled = this.timeAlarmSettings.pomodoro;
|
||||
}
|
||||
|
||||
if (autoZzimCheckbox) {
|
||||
|
|
@ -412,6 +440,12 @@ class SettingsManager {
|
|||
this.showLoading(true);
|
||||
|
||||
// 시간 알람 설정 업데이트
|
||||
if (this.timeAlarmSettings.pomodoro) {
|
||||
// 강제 고정 값
|
||||
this.timeAlarmSettings.workTime = 35;
|
||||
this.timeAlarmSettings.restTime = 5;
|
||||
}
|
||||
|
||||
const workTimeInput = document.getElementById('workTimeInput');
|
||||
const restTimeInput = document.getElementById('restTimeInput');
|
||||
const autoZzimCheckbox = document.getElementById('autoZzimCheckbox');
|
||||
|
|
@ -484,10 +518,12 @@ class SettingsManager {
|
|||
|
||||
// 시간 알람 설정 초기화
|
||||
this.timeAlarmSettings = {
|
||||
enabled: false,
|
||||
enabled: true,
|
||||
workTime: 60,
|
||||
restTime: 5,
|
||||
autoZzim: false
|
||||
autoZzim: false,
|
||||
pomodoro: false,
|
||||
cycle: 0
|
||||
};
|
||||
|
||||
// 저장소에서 시간 알람 설정 제거
|
||||
|
|
|
|||
|
|
@ -140,45 +140,168 @@
|
|||
}
|
||||
|
||||
.market-item {
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 6px;
|
||||
padding: 15px;
|
||||
margin-bottom: 10px;
|
||||
background: #f9f9f9;
|
||||
border: 1px solid #e1e8ed;
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
margin-bottom: 15px;
|
||||
background: white;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
transition: all 0.3s ease;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.market-item:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
|
||||
border-color: #667eea;
|
||||
}
|
||||
|
||||
.market-item::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 4px;
|
||||
background: linear-gradient(90deg, #667eea, #764ba2);
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
.market-item:hover::before {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.market-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: flex-start;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.market-checkbox {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.market-checkboxes {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.market-checkbox-input {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
accent-color: #667eea;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.market-checkbox-label {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: #2c3e50;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.market-info {
|
||||
flex: 1;
|
||||
margin: 0 15px;
|
||||
}
|
||||
|
||||
.market-name {
|
||||
font-weight: bold;
|
||||
color: #2c3e50;
|
||||
margin-bottom: 5px;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.market-nickname {
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
margin-bottom: 5px;
|
||||
font-size: 14px;
|
||||
margin-bottom: 8px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.market-url {
|
||||
color: #888;
|
||||
font-size: 12px;
|
||||
word-break: break-all;
|
||||
background: #f8f9fa;
|
||||
padding: 6px 10px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #e1e8ed;
|
||||
margin-bottom: 10px;
|
||||
font-family: 'Courier New', monospace;
|
||||
}
|
||||
|
||||
.market-stats {
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.zzim-count {
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
background: #e8f4f8;
|
||||
padding: 4px 8px;
|
||||
border-radius: 12px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.visibility-status {
|
||||
font-size: 12px;
|
||||
padding: 4px 10px;
|
||||
border-radius: 12px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.visibility-status.visible {
|
||||
background: #d4edda;
|
||||
color: #155724;
|
||||
border: 1px solid #c3e6cb;
|
||||
}
|
||||
|
||||
.visibility-status.hidden {
|
||||
background: #f8d7da;
|
||||
color: #721c24;
|
||||
border: 1px solid #f5c6cb;
|
||||
}
|
||||
|
||||
.created-date {
|
||||
font-size: 12px;
|
||||
color: #888;
|
||||
background: #f8f9fa;
|
||||
padding: 4px 8px;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.market-actions {
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
gap: 8px;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.market-actions .btn {
|
||||
padding: 8px 12px;
|
||||
font-size: 12px;
|
||||
border-radius: 6px;
|
||||
min-width: 70px;
|
||||
font-weight: 600;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.market-actions .btn:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.action-buttons {
|
||||
|
|
@ -222,6 +345,257 @@
|
|||
border-radius: 0 4px 4px 0 !important;
|
||||
border-left: none !important;
|
||||
}
|
||||
|
||||
/* 모달 스타일 */
|
||||
.modal {
|
||||
display: none;
|
||||
position: fixed;
|
||||
z-index: 1000;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
backdrop-filter: blur(3px);
|
||||
animation: fadeIn 0.3s ease;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
background-color: white;
|
||||
margin: 5% auto;
|
||||
padding: 0;
|
||||
border: none;
|
||||
border-radius: 12px;
|
||||
width: 90%;
|
||||
max-width: 500px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
||||
animation: slideIn 0.3s ease;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
color: white;
|
||||
padding: 20px 25px;
|
||||
border-bottom: none;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.modal-title {
|
||||
margin: 0;
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.modal-close {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
background: none;
|
||||
border: none;
|
||||
color: white;
|
||||
font-size: 24px;
|
||||
cursor: pointer;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.modal-close:hover {
|
||||
background-color: rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
padding: 25px;
|
||||
}
|
||||
|
||||
.form-group {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
display: block;
|
||||
margin-bottom: 8px;
|
||||
font-weight: 600;
|
||||
color: #2c3e50;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.form-input {
|
||||
width: 100%;
|
||||
padding: 12px 15px;
|
||||
border: 2px solid #e1e8ed;
|
||||
border-radius: 8px;
|
||||
font-size: 14px;
|
||||
transition: all 0.3s ease;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.form-input:focus {
|
||||
outline: none;
|
||||
border-color: #667eea;
|
||||
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
|
||||
}
|
||||
|
||||
.form-textarea {
|
||||
min-height: 80px;
|
||||
resize: vertical;
|
||||
font-family: inherit;
|
||||
}
|
||||
|
||||
.modal-footer {
|
||||
padding: 20px 25px;
|
||||
border-top: 1px solid #e1e8ed;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.btn-modal {
|
||||
padding: 10px 20px;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
min-width: 80px;
|
||||
}
|
||||
|
||||
.btn-modal-cancel {
|
||||
background-color: #6c757d;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-modal-cancel:hover {
|
||||
background-color: #5a6268;
|
||||
}
|
||||
|
||||
.btn-modal-save {
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-modal-save:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
|
||||
}
|
||||
|
||||
.btn-modal-save:disabled {
|
||||
background: #cccccc;
|
||||
cursor: not-allowed;
|
||||
transform: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; }
|
||||
to { opacity: 1; }
|
||||
}
|
||||
|
||||
@keyframes slideIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(-50px) scale(0.9);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0) scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* 체크박스 스타일링 */
|
||||
.checkbox-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin-top: 15px;
|
||||
padding: 15px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
border: 2px solid #e1e8ed;
|
||||
transition: border-color 0.3s ease;
|
||||
}
|
||||
|
||||
.checkbox-container:hover {
|
||||
border-color: #667eea;
|
||||
}
|
||||
|
||||
.custom-checkbox {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.custom-checkbox input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.checkbox-checkmark {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
background-color: white;
|
||||
border: 2px solid #ddd;
|
||||
border-radius: 4px;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.custom-checkbox:hover input ~ .checkbox-checkmark {
|
||||
border-color: #667eea;
|
||||
}
|
||||
|
||||
.custom-checkbox input:checked ~ .checkbox-checkmark {
|
||||
background-color: #667eea;
|
||||
border-color: #667eea;
|
||||
}
|
||||
|
||||
.checkbox-checkmark:after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.custom-checkbox input:checked ~ .checkbox-checkmark:after {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.custom-checkbox .checkbox-checkmark:after {
|
||||
left: 6px;
|
||||
top: 2px;
|
||||
width: 6px;
|
||||
height: 10px;
|
||||
border: solid white;
|
||||
border-width: 0 2px 2px 0;
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
.checkbox-label {
|
||||
font-weight: 600;
|
||||
color: #2c3e50;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.checkbox-description {
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
margin-top: 5px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
|
@ -268,8 +642,65 @@
|
|||
|
||||
<div class="section">
|
||||
<div class="section-title">
|
||||
🎯 찜하기 작업
|
||||
💝 찜하기 작업
|
||||
</div>
|
||||
|
||||
<!-- 백그라운드 실행 옵션 추가 -->
|
||||
<div style="margin-bottom: 20px; padding: 15px; background: #f8f9fa; border-radius: 6px;">
|
||||
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
|
||||
<input type="checkbox" id="background-mode" style="transform: scale(1.2);">
|
||||
<span style="font-weight: bold; color: #2c3e50;">🔄 백그라운드 모드</span>
|
||||
</label>
|
||||
<div style="font-size: 12px; color: #666; margin-top: 5px; margin-left: 25px;">
|
||||
체크하면 새 탭에서 백그라운드로 찜하기를 실행합니다.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 찜하기 옵션 설정 -->
|
||||
<div style="margin-bottom: 20px; padding: 20px; background: #f8f9fa; border-radius: 8px; border: 2px solid #e1e8ed;">
|
||||
<h4 style="margin: 0 0 15px 0; color: #2c3e50; font-size: 16px;">⚙️ 찜하기 옵션</h4>
|
||||
|
||||
<!-- 찜하기 속도 설정 -->
|
||||
<div style="margin-bottom: 15px;">
|
||||
<label style="display: block; margin-bottom: 8px; font-weight: 600; color: #2c3e50; font-size: 14px;">
|
||||
⏱️ 찜하기 속도 (찜 간격)
|
||||
</label>
|
||||
<div style="display: flex; align-items: center; gap: 10px; flex-wrap: wrap;">
|
||||
<div style="display: flex; align-items: center; gap: 5px;">
|
||||
<span style="font-size: 12px; color: #666;">기본 간격:</span>
|
||||
<input type="number" id="base-delay" value="1000" min="1000" max="5000" step="100"
|
||||
style="width: 80px; padding: 4px 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 12px;"
|
||||
disabled>
|
||||
<span style="font-size: 12px; color: #666;">ms</span>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; gap: 5px;">
|
||||
<span style="font-size: 12px; color: #666;">+ 추가 간격:</span>
|
||||
<input type="number" id="user-delay" value="0" min="0" max="9000" step="100"
|
||||
style="width: 80px; padding: 4px 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 12px;">
|
||||
<span style="font-size: 12px; color: #666;">ms</span>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; gap: 5px;">
|
||||
<span style="font-size: 12px; color: #666;">= 총 간격:</span>
|
||||
<span id="total-delay" style="font-weight: bold; color: #667eea;">1000ms</span>
|
||||
</div>
|
||||
</div>
|
||||
<div style="font-size: 11px; color: #888; margin-top: 5px;">
|
||||
💡 찜과 찜 사이의 대기 시간을 설정합니다. (1초~10초)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 최신상품 우선 찜하기 옵션 -->
|
||||
<div style="margin-bottom: 10px;">
|
||||
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
|
||||
<input type="checkbox" id="latest-first" style="transform: scale(1.2);">
|
||||
<span style="font-weight: 600; color: #2c3e50;">🆕 최신상품 우선 찜하기</span>
|
||||
</label>
|
||||
<div style="font-size: 12px; color: #666; margin-top: 5px; margin-left: 25px;">
|
||||
체크하면 전체상품(/category/ALL) 대신 최신상품(/best)부터 찜합니다.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="action-buttons">
|
||||
<button class="btn btn-success btn-large" id="my-market-zzim-btn">
|
||||
💝 내 마켓 찜하기
|
||||
|
|
@ -277,12 +708,89 @@
|
|||
<button class="btn btn-warning btn-large" id="mutual-zzim-btn">
|
||||
🤝 품앗이 찜하기
|
||||
</button>
|
||||
<button class="btn btn-danger btn-large" id="stop-zzim-btn" style="display: none;">
|
||||
⏹️ 찜하기 중단
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- 진행률 표시 -->
|
||||
<div id="zzim-progress" style="display: none; margin: 20px 0;">
|
||||
<div style="display: flex; justify-content: space-between; margin-bottom: 5px;">
|
||||
<span id="progress-text">진행 중...</span>
|
||||
<span id="progress-percent">0%</span>
|
||||
</div>
|
||||
<div style="width: 100%; height: 8px; background: #e0e0e0; border-radius: 4px; overflow: hidden;">
|
||||
<div id="progress-bar" style="height: 100%; background: #3498db; width: 0%; transition: width 0.3s ease;"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="zzim-status" class="loading" style="display: none;"></div>
|
||||
<div id="zzim-error" class="error" style="display: none;"></div>
|
||||
<div id="zzim-success" class="success" style="display: none;"></div>
|
||||
</div>
|
||||
|
||||
<script src="zzim.js"></script>
|
||||
|
||||
<!-- 마켓 수정 모달 -->
|
||||
<div id="edit-market-modal" class="modal">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h3 class="modal-title">
|
||||
✏️ 마켓 정보 수정
|
||||
</h3>
|
||||
<button class="modal-close" id="modal-close-btn">×</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label class="form-label">마켓 URL</label>
|
||||
<input type="text" id="edit-market-url" class="form-input" placeholder="https://smartstore.naver.com/your-store">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">마켓 이름</label>
|
||||
<input type="text" id="edit-market-name" class="form-input" placeholder="마켓 이름을 입력하세요">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">마켓 별명</label>
|
||||
<input type="text" id="edit-market-nickname" class="form-input" placeholder="마켓 별명을 입력하세요">
|
||||
</div>
|
||||
<div class="checkbox-container">
|
||||
<label class="custom-checkbox">
|
||||
<input type="checkbox" id="edit-market-for-zzim">
|
||||
<span class="checkbox-checkmark"></span>
|
||||
</label>
|
||||
<div>
|
||||
<label class="checkbox-label" for="edit-market-for-zzim">내가 찜하기 할 때 포함</label>
|
||||
<div class="checkbox-description">체크하면 내 마켓 찜하기 작업 시 이 마켓이 포함됩니다.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="checkbox-container">
|
||||
<label class="custom-checkbox">
|
||||
<input type="checkbox" id="edit-market-for-mutual-zzim">
|
||||
<span class="checkbox-checkmark"></span>
|
||||
</label>
|
||||
<div>
|
||||
<label class="checkbox-label" for="edit-market-for-mutual-zzim">품앗이 대상으로 포함</label>
|
||||
<div class="checkbox-description">체크하면 다른 사람들이 이 마켓에 품앗이 찜을 할 수 있습니다.</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="checkbox-container">
|
||||
<label class="custom-checkbox">
|
||||
<input type="checkbox" id="edit-market-visible">
|
||||
<span class="checkbox-checkmark"></span>
|
||||
</label>
|
||||
<div>
|
||||
<label class="checkbox-label" for="edit-market-visible">다른 사람에게 노출</label>
|
||||
<div class="checkbox-description">체크하면 품앗이 찜하기에서 다른 사람들이 이 마켓을 찜할 수 있습니다.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button class="btn-modal btn-modal-cancel" id="modal-cancel-btn">취소</button>
|
||||
<button class="btn-modal btn-modal-save" id="modal-save-btn">저장</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
2173
wrmc_ext/zzim.js
2173
wrmc_ext/zzim.js
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue