TDN-M commited on
Commit
79a3399
·
verified ·
1 Parent(s): 8614007

Update script.js

Browse files
Files changed (1) hide show
  1. script.js +82 -96
script.js CHANGED
@@ -1,85 +1,52 @@
1
- const PRODUCT_GROUPS = {
2
- Standard: {
3
- "Standard": {
4
- "C1012 Glacier White": "817687427545199895",
5
- "C1026 Polar": "819910519797326073",
6
- "C3269 Ash Grey": "821839484099264081",
7
- "C3168 Silver Wave": "821849044696643212",
8
- "C1005 Milky White": "821948258441171133",
9
- },
10
- "Deluxe": {
11
- "C2103 Onyx Carrara": "827090618489513527",
12
- "C2104 Massa": "822075428127644644",
13
- "C3105 Casla Cloudy": "828912225788997963",
14
- "C3146 Casla Nova": "828013009961087650",
15
- "C2240 Marquin": "828085015087780649",
16
- "C2262 Concrete (Honed)": "822211862058871636",
17
- "C3311 Calacatta Sky": "829984593223502930",
18
- "C3346 Massimo": "827938741386607132",
19
- },
20
- "Luxury": {
21
- "C4143 Mario": "829984593223502930",
22
- "C4145 Marina": "828132560375742058",
23
- "C4202 Calacatta Gold": "828167757632695310",
24
- "C1205 Casla Everest": "828296778450463190",
25
- "C4211 Calacatta Supreme": "828436321937882328",
26
- "C4204 Calacatta Classic": "828422973179466146",
27
- "C5240 Spring": "is coming",
28
- "C1102 Super White": "828545723344775887",
29
- "C4246 Casla Mystery": "828544778451950698",
30
- "C4345 Oro": "828891068780182635",
31
- "C4346 Luxe": "829436426547535131",
32
- "C4342 Casla Eternal": "829190256201829181",
33
- "C4221 Athena": "829644354504131520",
34
- "C4222 Lagoon": "is coming",
35
- "C5225 Amber": "is coming",
36
- },
37
- "Super Luxury": {
38
- "C4255 Calacatta Extra": "829659013227537217",
39
- },
40
- }
41
 
42
  function switchTab(tab) {
43
- document.querySelectorAll('.tab-content').forEach(el => el.style.display = 'none');
44
- document.querySelectorAll('.tabs button').forEach(el => el.classList.remove('active'));
45
  document.getElementById(tab).style.display = 'block';
46
  document.querySelector(`button[onclick="switchTab('${tab}')"]`).classList.add('active');
 
47
  }
48
 
49
- function renderProductGroups(containerId) {
50
  const container = document.getElementById(containerId);
51
- for (const [group, products] of Object.entries(PRODUCT_GROUPS)) {
52
- const div = document.createElement('div');
53
- div.className = 'product-group';
54
- div.style.backgroundColor = GROUP_COLORS[group];
55
- div.innerHTML = `<h3>${group}</h3>`;
56
- for (const code in products) {
57
- if (products[code] !== "is coming" && products[code] !== "is loading") {
58
- div.innerHTML += `
59
- <label>
60
- <input type="checkbox" name="${group}" value="${code}">
61
- ${code}
62
- </label>
63
- `;
64
- }
65
- }
66
- container.appendChild(div);
67
- }
68
  }
69
 
70
- async function generateText2Img() {
 
71
  const prompt = document.getElementById('prompt').value;
72
  const size = document.getElementById('size').value;
73
  const customSize = document.getElementById('custom-size').value;
74
- const productCheckboxes = document.querySelectorAll('#product-groups input:checked');
75
- const productCodes = Array.from(productCheckboxes).map(cb => cb.value);
76
 
77
- if (!prompt || !productCodes.length) {
78
- showError('Please enter a prompt and select at least one product.');
79
  return;
80
  }
81
 
82
- showProgress(true);
83
  try {
84
  const response = await fetch('https://YOUR_USERNAME-caslaquartz-backend.hf.space/api/text2img', {
85
  method: 'POST',
@@ -88,40 +55,39 @@ async function generateText2Img() {
88
  prompt,
89
  size,
90
  custom_size: size === 'Custom size' ? customSize : null,
91
- product_codes: productCodes
92
  })
93
  });
94
  const data = await response.json();
95
  if (data.error) throw new Error(data.error);
96
- document.getElementById('output-image').src = data.image_url;
97
- document.getElementById('output-image').style.display = 'block';
98
  } catch (err) {
99
  showError(err.message);
100
  } finally {
101
- showProgress(false);
102
  }
103
  }
104
 
105
- async function generateImg2Img() {
 
106
  const fileInput = document.getElementById('image-upload');
107
  const position = document.getElementById('position').value;
108
  const size = document.getElementById('size-img2img').value;
109
  const customSize = document.getElementById('custom-size-img2img').value;
110
- const productCheckboxes = document.querySelectorAll('#product-groups-img2img input:checked');
111
- const productCodes = Array.from(productCheckboxes).map(cb => cb.value);
112
 
113
- if (!fileInput.files[0] || !productCodes.length) {
114
- showError('Please upload an image and select at least one product.');
115
  return;
116
  }
117
 
118
- showProgress(true);
119
  const formData = new FormData();
120
  formData.append('file', fileInput.files[0]);
121
  formData.append('position', position);
122
  formData.append('size', size);
123
  if (size === 'Custom size') formData.append('custom_size', customSize);
124
- productCodes.forEach(code => formData.append('product_codes', code));
125
 
126
  try {
127
  const response = await fetch('https://YOUR_USERNAME-caslaquartz-backend.hf.space/api/img2img', {
@@ -130,29 +96,16 @@ async function generateImg2Img() {
130
  });
131
  const data = await response.json();
132
  if (data.error) throw new Error(data.error);
133
- document.getElementById('output-image').src = data.image_url;
134
- document.getElementById('output-image').style.display = 'block';
135
  } catch (err) {
136
  showError(err.message);
137
  } finally {
138
- showProgress(false);
139
  }
140
  }
141
 
142
- function showProgress(show) {
143
- const progress = document.getElementById('progress');
144
- const bar = progress.querySelector('.progress-bar');
145
- progress.style.display = show ? 'block' : 'none';
146
- if (show) {
147
- let width = 0;
148
- const interval = setInterval(() => {
149
- if (width >= 100) clearInterval(interval);
150
- width += 10;
151
- bar.style.width = `${width}%`;
152
- }, 500);
153
- } else {
154
- bar.style.width = '0%';
155
- }
156
  }
157
 
158
  function showError(message) {
@@ -162,6 +115,39 @@ function showError(message) {
162
  setTimeout(() => error.style.display = 'none', 5000);
163
  }
164
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  // Khởi tạo
166
  document.getElementById('size').addEventListener('change', (e) => {
167
  document.getElementById('custom-size').style.display = e.target.value === 'Custom size' ? 'block' : 'none';
@@ -169,5 +155,5 @@ document.getElementById('size').addEventListener('change', (e) => {
169
  document.getElementById('size-img2img').addEventListener('change', (e) => {
170
  document.getElementById('custom-size-img2img').style.display = e.target.value === 'Custom size' ? 'block' : 'none';
171
  });
172
- renderProductGroups('product-groups');
173
- renderProductGroups('product-groups-img2img');
 
1
+ const PRODUCTS = [
2
+ "C1012 Glacier White", "C1026 Polar", "C3269 Ash Grey", "C3168 Silver Wave", "C1005 Milky White",
3
+ "C2103 Onyx Carrara", "C2104 Massa", "C3105 Casla Cloudy", "C3146 Casla Nova", "C2240 Marquin",
4
+ "C2262 Concrete (Honed)", "C3311 Calacatta Sky", "C3346 Massimo", "C4143 Mario", "C4145 Marina",
5
+ "C4202 Calacatta Gold", "C1205 Casla Everest", "C4211 Calacatta Supreme", "C4204 Calacatta Classic",
6
+ "C1102 Super White", "C4246 Casla Mystery", "C4345 Oro", "C4346 Luxe", "C4342 Casla Eternal",
7
+ "C4221 Athena", "C4255 Calacatta Extra"
8
+ ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
  function switchTab(tab) {
11
+ document.querySelectorAll('.section').forEach(el => el.style.display = 'none');
12
+ document.querySelectorAll('.tab-button').forEach(el => el.classList.remove('active'));
13
  document.getElementById(tab).style.display = 'block';
14
  document.querySelector(`button[onclick="switchTab('${tab}')"]`).classList.add('active');
15
+ resetOutput();
16
  }
17
 
18
+ function renderProducts(containerId) {
19
  const container = document.getElementById(containerId);
20
+ PRODUCTS.forEach(product => {
21
+ const button = document.createElement('button');
22
+ button.type = 'button';
23
+ button.className = 'product-button';
24
+ button.textContent = product;
25
+ button.onclick = () => button.classList.toggle('selected');
26
+ container.appendChild(button);
27
+ });
28
+ }
29
+
30
+ function resetOutput() {
31
+ document.getElementById('loading').style.display = 'none';
32
+ document.getElementById('error').style.display = 'none';
33
+ document.getElementById('generated-image').style.display = 'none';
34
+ document.getElementById('download-link').style.display = 'none';
 
 
35
  }
36
 
37
+ async function generateText2Img(event) {
38
+ event.preventDefault();
39
  const prompt = document.getElementById('prompt').value;
40
  const size = document.getElementById('size').value;
41
  const customSize = document.getElementById('custom-size').value;
42
+ const selectedProducts = Array.from(document.querySelectorAll('#text2img-products .product-button.selected')).map(btn => btn.textContent);
 
43
 
44
+ if (!prompt || !selectedProducts.length) {
45
+ showError('Vui lòng nhập tả chọn ít nhất một sản phẩm.');
46
  return;
47
  }
48
 
49
+ showLoading(true);
50
  try {
51
  const response = await fetch('https://YOUR_USERNAME-caslaquartz-backend.hf.space/api/text2img', {
52
  method: 'POST',
 
55
  prompt,
56
  size,
57
  custom_size: size === 'Custom size' ? customSize : null,
58
+ product_codes: selectedProducts
59
  })
60
  });
61
  const data = await response.json();
62
  if (data.error) throw new Error(data.error);
63
+ showImage(data.image_url);
 
64
  } catch (err) {
65
  showError(err.message);
66
  } finally {
67
+ showLoading(false);
68
  }
69
  }
70
 
71
+ async function generateImg2Img(event) {
72
+ event.preventDefault();
73
  const fileInput = document.getElementById('image-upload');
74
  const position = document.getElementById('position').value;
75
  const size = document.getElementById('size-img2img').value;
76
  const customSize = document.getElementById('custom-size-img2img').value;
77
+ const selectedProducts = Array.from(document.querySelectorAll('#img2img-products .product-button.selected')).map(btn => btn.textContent);
 
78
 
79
+ if (!fileInput.files[0] || !selectedProducts.length) {
80
+ showError('Vui lòng tải ảnh chọn ít nhất một sản phẩm.');
81
  return;
82
  }
83
 
84
+ showLoading(true);
85
  const formData = new FormData();
86
  formData.append('file', fileInput.files[0]);
87
  formData.append('position', position);
88
  formData.append('size', size);
89
  if (size === 'Custom size') formData.append('custom_size', customSize);
90
+ selectedProducts.forEach(code => formData.append('product_codes', code));
91
 
92
  try {
93
  const response = await fetch('https://YOUR_USERNAME-caslaquartz-backend.hf.space/api/img2img', {
 
96
  });
97
  const data = await response.json();
98
  if (data.error) throw new Error(data.error);
99
+ showImage(data.image_url);
 
100
  } catch (err) {
101
  showError(err.message);
102
  } finally {
103
+ showLoading(false);
104
  }
105
  }
106
 
107
+ function showLoading(show) {
108
+ document.getElementById('loading').style.display = show ? 'block' : 'none';
 
 
 
 
 
 
 
 
 
 
 
 
109
  }
110
 
111
  function showError(message) {
 
115
  setTimeout(() => error.style.display = 'none', 5000);
116
  }
117
 
118
+ function showImage(url) {
119
+ const img = document.getElementById('generated-image');
120
+ const link = document.getElementById('download-link');
121
+ img.src = url;
122
+ img.style.display = 'block';
123
+ link.href = url;
124
+ link.style.display = 'inline-block';
125
+ }
126
+
127
+ // Dropzone handlers
128
+ function dropHandler(event) {
129
+ event.preventDefault();
130
+ const file = event.dataTransfer.files[0];
131
+ if (file) {
132
+ document.getElementById('image-upload').files = event.dataTransfer.files;
133
+ previewImage(file);
134
+ }
135
+ }
136
+
137
+ function dragOverHandler(event) {
138
+ event.preventDefault();
139
+ }
140
+
141
+ document.getElementById('image-upload').addEventListener('change', (e) => {
142
+ if (e.target.files[0]) previewImage(e.target.files[0]);
143
+ });
144
+
145
+ function previewImage(file) {
146
+ const preview = document.getElementById('preview-image');
147
+ preview.src = URL.createObjectURL(file);
148
+ preview.style.display = 'block';
149
+ }
150
+
151
  // Khởi tạo
152
  document.getElementById('size').addEventListener('change', (e) => {
153
  document.getElementById('custom-size').style.display = e.target.value === 'Custom size' ? 'block' : 'none';
 
155
  document.getElementById('size-img2img').addEventListener('change', (e) => {
156
  document.getElementById('custom-size-img2img').style.display = e.target.value === 'Custom size' ? 'block' : 'none';
157
  });
158
+ renderProducts('text2img-products');
159
+ renderProducts('img2img-products');