Refactor background.js and content.js for improved text selection and context menu handling; update Supabase URLs in multiple files; enhance UI elements in zzim.html; add new features for managing zzim operations and user settings.
This commit is contained in:
parent
62a95c6fcc
commit
b25d85099b
File diff suppressed because it is too large
Load Diff
|
|
@ -95,8 +95,8 @@ class BannedWordsManager {
|
|||
});
|
||||
|
||||
// 기본값 설정
|
||||
this.SUPABASE_URL = storageData.SUPABASE_URL || 'http://146.56.101.199:8000';
|
||||
this.SUPABASE_ANON_KEY = storageData.SUPABASE_ANON_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE';
|
||||
this.SUPABASE_URL = storageData.SUPABASE_URL || 'https://ko.wrmc.cc';
|
||||
this.SUPABASE_ANON_KEY = storageData.SUPABASE_ANON_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU';
|
||||
this.ACCESS_TOKEN = storageData.access_token;
|
||||
}
|
||||
|
||||
|
|
|
|||
1095
wrmc_ext/content.js
1095
wrmc_ext/content.js
File diff suppressed because it is too large
Load Diff
|
|
@ -11,11 +11,12 @@
|
|||
"notifications",
|
||||
"alarms",
|
||||
"tabs",
|
||||
"scripting"
|
||||
"scripting",
|
||||
"clipboardRead"
|
||||
],
|
||||
"host_permissions": [
|
||||
"*://markinfo.kr/*",
|
||||
"http://146.56.101.199:8000/*",
|
||||
"https://ko.wrmc.cc/*",
|
||||
"https://oci1ckh08045.duckdns.org:8000/*",
|
||||
"*://smartstore.naver.com/*",
|
||||
"*://translate.googleapis.com/*",
|
||||
|
|
@ -59,6 +60,12 @@
|
|||
"default": "Ctrl+Shift+Z"
|
||||
},
|
||||
"description": "한국어↔중국어 양방향 번역"
|
||||
},
|
||||
"direct-translate": {
|
||||
"suggested_key": {
|
||||
"default": "Ctrl+Shift+K"
|
||||
},
|
||||
"description": "직번역 (텍스트 바로 대체)"
|
||||
}
|
||||
},
|
||||
"web_accessible_resources": [
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@ async function getBackendConfig() {
|
|||
|
||||
// 폴백 설정
|
||||
const fallbackConfig = {
|
||||
SUPABASE_URL: "http://146.56.101.199:8000",
|
||||
SUPABASE_ANON_KEY: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE"
|
||||
SUPABASE_URL: "https://ko.wrmc.cc",
|
||||
SUPABASE_ANON_KEY: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU"
|
||||
};
|
||||
|
||||
console.log('[popup.js] 폴백 설정:', fallbackConfig);
|
||||
|
|
@ -34,8 +34,8 @@ async function getBackendConfig() {
|
|||
}
|
||||
|
||||
// 디버그 모드 플래그 (개발 시에만 true로 설정)
|
||||
// const DEBUG_MODE = true; // false로 설정하면 디버그 정보 숨김
|
||||
const DEBUG_MODE = false; // false로 설정하면 디버그 정보 숨김
|
||||
const DEBUG_MODE = true; // false로 설정하면 디버그 정보 숨김
|
||||
// const DEBUG_MODE = false; // false로 설정하면 디버그 정보 숨김
|
||||
|
||||
// 로그 레벨 정의
|
||||
const LOG_LEVELS = {
|
||||
|
|
|
|||
|
|
@ -93,8 +93,8 @@ class RestModal {
|
|||
throw new Error('Access token not found');
|
||||
}
|
||||
|
||||
const SUPABASE_URL = this.config.SUPABASE_URL || "http://146.56.101.199:8000";
|
||||
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE";
|
||||
const SUPABASE_URL = this.config.SUPABASE_URL || "https://ko.wrmc.cc";
|
||||
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU";
|
||||
|
||||
// public.events 테이블에서 event_type이 'rest_time'인 데이터 가져오기
|
||||
const apiUrl = `${SUPABASE_URL}/rest/v1/events?select=message&event_type=eq.rest_time&order=created_at.desc&limit=50`;
|
||||
|
|
@ -170,8 +170,8 @@ class RestModal {
|
|||
throw new Error('Access token not found');
|
||||
}
|
||||
|
||||
const SUPABASE_URL = this.config.SUPABASE_URL || "http://146.56.101.199:8000";
|
||||
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE";
|
||||
const SUPABASE_URL = this.config.SUPABASE_URL || "https://ko.wrmc.cc";
|
||||
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU";
|
||||
|
||||
// 최근 1달 이내의 승인된 어록 가져오기
|
||||
const oneMonthAgo = new Date();
|
||||
|
|
|
|||
|
|
@ -67,8 +67,8 @@ class SayingsManager {
|
|||
});
|
||||
|
||||
// 기본값 설정
|
||||
this.SUPABASE_URL = storageData.SUPABASE_URL || 'http://146.56.101.199:8000';
|
||||
this.SUPABASE_ANON_KEY = storageData.SUPABASE_ANON_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE';
|
||||
this.SUPABASE_URL = storageData.SUPABASE_URL || 'https://ko.wrmc.cc';
|
||||
this.SUPABASE_ANON_KEY = storageData.SUPABASE_ANON_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU';
|
||||
this.ACCESS_TOKEN = storageData.access_token;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -116,8 +116,8 @@ class SettingsManager {
|
|||
return;
|
||||
}
|
||||
|
||||
const SUPABASE_URL = this.config.SUPABASE_URL || "http://146.56.101.199:8000";
|
||||
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ey AgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE";
|
||||
const SUPABASE_URL = this.config.SUPABASE_URL || "https://ko.wrmc.cc";
|
||||
const SUPABASE_ANON_KEY = this.config.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzYyMzA2ODc5LCJleHAiOjIwNzc2NjY4Nzl9.aKF_nREC06KK81yOJKA1pOwz9gmgC0xsLwLWqqIVcsU";
|
||||
|
||||
console.log('Supabase URL:', SUPABASE_URL);
|
||||
console.log('토큰 존재 여부:', !!this.config.ACCESS_TOKEN);
|
||||
|
|
|
|||
|
|
@ -140,45 +140,162 @@
|
|||
}
|
||||
|
||||
.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-checkbox-input {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
accent-color: #667eea;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.market-checkbox-label {
|
||||
font-size: 14px;
|
||||
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 +339,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 +636,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 +702,78 @@
|
|||
<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-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>
|
||||
1794
wrmc_ext/zzim.js
1794
wrmc_ext/zzim.js
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue