noranisa commited on
Commit
f7370ef
·
verified ·
1 Parent(s): dbebb9e

Update templates/index.html

Browse files
Files changed (1) hide show
  1. templates/index.html +113 -21
templates/index.html CHANGED
@@ -123,12 +123,39 @@ h1.ht .l3 { display: block; color: var(--muted2); }
123
  }
124
  .f-input::placeholder { color: var(--muted); }
125
  .f-input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(79,156,249,0.12); }
126
- select.f-input {
127
- appearance: none; cursor: pointer;
128
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%234a5568' stroke-width='2.5'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
129
- background-repeat: no-repeat; background-position: right 0.8rem center; padding-right: 2.2rem;
130
- background-color: var(--s2);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
  }
 
 
 
 
 
 
 
 
132
 
133
  .btn-go {
134
  align-self: flex-end;
@@ -354,21 +381,53 @@ footer {
354
  <button class="btn-go" onclick="go()">Analisis →</button>
355
  </div>
356
  <div class="f-group">
357
- <label for="source">Sumber Data</label>
358
- <select id="source" class="f-input">
359
- <option value="all">Semua Platform (YouTube + Reddit + Instagram + TikTok + News)</option>
360
- <option value="youtube">YouTube saja</option>
361
- <option value="reddit">Reddit saja</option>
362
- <option value="instagram">Instagram saja</option>
363
- <option value="tiktok">TikTok saja</option>
364
- <option value="news">Google News saja</option>
365
- <option value="youtube,tiktok">YouTube + TikTok</option>
366
- <option value="instagram,tiktok">Instagram + TikTok</option>
367
- <option value="tiktok,news">TikTok + Google News</option>
368
- <option value="youtube,news">YouTube + Google News</option>
369
- <option value="youtube,instagram">YouTube + Instagram</option>
370
- <option value="reddit,news">Reddit + Google News</option>
371
- </select>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
372
  </div>
373
  <p class="f-hint">Tekan <b>Enter</b> untuk mulai · Maks. <b>100 komentar</b> per sumber</p>
374
  </div>
@@ -481,9 +540,35 @@ function tick() {
481
  st = setTimeout(tick, 2000);
482
  }
483
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
484
  async function go() {
485
  const kw = document.getElementById('keyword').value.trim();
486
- const src = document.getElementById('source').value;
 
487
  if (!kw) {
488
  const inp = document.getElementById('keyword');
489
  inp.style.borderColor = '#ef4444';
@@ -491,9 +576,16 @@ async function go() {
491
  setTimeout(() => inp.style.borderColor = '', 1500);
492
  return;
493
  }
 
 
 
 
 
 
494
  document.getElementById('loading').classList.add('on');
495
  document.getElementById('ld-step').textContent = STEPS[0];
496
  st = setTimeout(tick, 2000);
 
497
  try {
498
  const r = await fetch('/analyze', {
499
  method: 'POST',
 
123
  }
124
  .f-input::placeholder { color: var(--muted); }
125
  .f-input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(79,156,249,0.12); }
126
+ .src-lbl { font-family: var(--mono); font-size: 0.58rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); margin-bottom: 0.5rem; display: flex; align-items: center; justify-content: space-between; }
127
+ .src-lbl b { color: var(--accent); cursor: pointer; font-weight: 400; transition: opacity .2s; }
128
+ .src-lbl b:hover { opacity: 0.7; }
129
+ .src-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 0.4rem; margin-bottom: 0.2rem; }
130
+ .src-item { position: relative; }
131
+ .src-item input[type="checkbox"] { position: absolute; opacity: 0; width: 0; height: 0; }
132
+ .src-item label {
133
+ display: flex; align-items: center; gap: 0.5rem;
134
+ background: var(--s2); border: 1px solid var(--b2); border-radius: 7px;
135
+ padding: 0.5rem 0.6rem; cursor: pointer;
136
+ transition: border-color .15s, background .15s;
137
+ user-select: none; min-height: 48px;
138
+ }
139
+ .src-item label:hover { filter: brightness(1.1); }
140
+ .src-item input:checked + label { border-color: var(--accent); background: rgba(79,156,249,0.1); }
141
+ .src-ico { font-size: 1rem; flex-shrink: 0; }
142
+ .src-info { display: flex; flex-direction: column; gap: 0.05rem; flex: 1; min-width: 0; }
143
+ .src-name { font-size: 0.7rem; font-weight: 700; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
144
+ .src-sub { font-family: var(--mono); font-size: 0.48rem; letter-spacing: 0.04em; color: var(--muted); }
145
+ .src-box {
146
+ width: 13px; height: 13px; border-radius: 3px;
147
+ border: 1px solid var(--b2); flex-shrink: 0;
148
+ display: flex; align-items: center; justify-content: center;
149
+ transition: background .15s, border-color .15s;
150
  }
151
+ .src-item input:checked + label .src-box { background: var(--accent); border-color: var(--accent); }
152
+ .src-item input:checked + label .src-box::after {
153
+ content: ''; display: block; width: 7px; height: 3.5px;
154
+ border-left: 1.5px solid #fff; border-bottom: 1.5px solid #fff;
155
+ transform: rotate(-45deg) translateY(-1px);
156
+ }
157
+ .src-warn { font-family: var(--mono); font-size: 0.55rem; color: #f59e0b; margin-top: 0.4rem; display: none; }
158
+ .src-warn.show { display: block; }
159
 
160
  .btn-go {
161
  align-self: flex-end;
 
381
  <button class="btn-go" onclick="go()">Analisis →</button>
382
  </div>
383
  <div class="f-group">
384
+ <div class="src-lbl">
385
+ <span>Sumber Data</span>
386
+ <b onclick="toggleAll()">Pilih Semua</b>
387
+ </div>
388
+ <div class="src-grid">
389
+ <div class="src-item">
390
+ <input type="checkbox" id="src-yt" value="youtube" checked>
391
+ <label for="src-yt">
392
+ <span class="src-ico"></span>
393
+ <span class="src-info"><span class="src-name">YouTube</span><span class="src-sub">Komentar video</span></span>
394
+ <span class="src-box"></span>
395
+ </label>
396
+ </div>
397
+ <div class="src-item">
398
+ <input type="checkbox" id="src-rd" value="reddit" checked>
399
+ <label for="src-rd">
400
+ <span class="src-ico">👾</span>
401
+ <span class="src-info"><span class="src-name">Reddit</span><span class="src-sub">Komentar thread</span></span>
402
+ <span class="src-box"></span>
403
+ </label>
404
+ </div>
405
+ <div class="src-item">
406
+ <input type="checkbox" id="src-ig" value="instagram">
407
+ <label for="src-ig">
408
+ <span class="src-ico">📸</span>
409
+ <span class="src-info"><span class="src-name">Instagram</span><span class="src-sub">via Apify</span></span>
410
+ <span class="src-box"></span>
411
+ </label>
412
+ </div>
413
+ <div class="src-item">
414
+ <input type="checkbox" id="src-tt" value="tiktok">
415
+ <label for="src-tt">
416
+ <span class="src-ico">🎵</span>
417
+ <span class="src-info"><span class="src-name">TikTok</span><span class="src-sub">via Apify</span></span>
418
+ <span class="src-box"></span>
419
+ </label>
420
+ </div>
421
+ <div class="src-item">
422
+ <input type="checkbox" id="src-nw" value="news">
423
+ <label for="src-nw">
424
+ <span class="src-ico">📰</span>
425
+ <span class="src-info"><span class="src-name">Google News</span><span class="src-sub">via SerpApi</span></span>
426
+ <span class="src-box"></span>
427
+ </label>
428
+ </div>
429
+ </div>
430
+ <p class="src-warn" id="src-warn">⚠ Pilih minimal satu sumber data</p>
431
  </div>
432
  <p class="f-hint">Tekan <b>Enter</b> untuk mulai · Maks. <b>100 komentar</b> per sumber</p>
433
  </div>
 
540
  st = setTimeout(tick, 2000);
541
  }
542
 
543
+ function getSelectedSources() {
544
+ const boxes = document.querySelectorAll('.src-item input[type="checkbox"]:checked');
545
+ const vals = Array.from(boxes).map(b => b.value);
546
+ if (vals.length === 0) return null;
547
+ if (vals.length === 5) return 'all';
548
+ return vals.join(',');
549
+ }
550
+
551
+ function toggleAll() {
552
+ const boxes = document.querySelectorAll('.src-item input[type="checkbox"]');
553
+ const anyUnchecked = Array.from(boxes).some(b => !b.checked);
554
+ boxes.forEach(b => { b.checked = anyUnchecked; });
555
+ const btn = document.querySelector('.src-lbl b');
556
+ btn.textContent = anyUnchecked ? 'Batal Semua' : 'Pilih Semua';
557
+ }
558
+
559
+ // sync toggle-all label
560
+ document.addEventListener('change', () => {
561
+ const boxes = document.querySelectorAll('.src-item input[type="checkbox"]');
562
+ const btn = document.querySelector('.src-lbl b');
563
+ const allOn = Array.from(boxes).every(b => b.checked);
564
+ btn.textContent = allOn ? 'Batal Semua' : 'Pilih Semua';
565
+ document.getElementById('src-warn').classList.remove('show');
566
+ });
567
+
568
  async function go() {
569
  const kw = document.getElementById('keyword').value.trim();
570
+ const src = getSelectedSources();
571
+
572
  if (!kw) {
573
  const inp = document.getElementById('keyword');
574
  inp.style.borderColor = '#ef4444';
 
576
  setTimeout(() => inp.style.borderColor = '', 1500);
577
  return;
578
  }
579
+
580
+ if (!src) {
581
+ document.getElementById('src-warn').classList.add('show');
582
+ return;
583
+ }
584
+
585
  document.getElementById('loading').classList.add('on');
586
  document.getElementById('ld-step').textContent = STEPS[0];
587
  st = setTimeout(tick, 2000);
588
+
589
  try {
590
  const r = await fetch('/analyze', {
591
  method: 'POST',