vhobjects-admin 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2015/vhobjects-admin.js +607 -104
- package/fesm2015/vhobjects-admin.js.map +1 -1
- package/lib/frames/frame-repeat/admin/frame-repeat-admin/frame-repeat-admin.component.d.ts +58 -7
- package/lib/objects/basic/image/admin-config/image-admin-config/image-admin-config.component.d.ts +18 -2
- package/package.json +1 -1
|
@@ -30,6 +30,7 @@ import * as i17 from 'ng-zorro-antd/core/wave';
|
|
|
30
30
|
import * as i16 from 'ng-zorro-antd/popover';
|
|
31
31
|
import * as i12$2 from '@ngx-translate/core';
|
|
32
32
|
import { TranslateModule } from '@ngx-translate/core';
|
|
33
|
+
import { __awaiter } from 'tslib';
|
|
33
34
|
import * as i2$1 from 'vhobjects-service/src/services';
|
|
34
35
|
import { LanguageService } from 'vhobjects-service/src/services';
|
|
35
36
|
import * as i3$2 from '@angular/platform-browser';
|
|
@@ -37,10 +38,10 @@ import * as i12$3 from '@angular/material/icon';
|
|
|
37
38
|
import * as i5$1 from '@angular/material/form-field';
|
|
38
39
|
import * as i16$1 from 'ng-zorro-antd/date-picker';
|
|
39
40
|
import * as i5$2 from 'ng-zorro-antd/radio';
|
|
40
|
-
import * as
|
|
41
|
+
import * as i21 from 'ng-zorro-antd/tooltip';
|
|
42
|
+
import * as i24 from 'ng-zorro-antd/popconfirm';
|
|
41
43
|
import * as i5$3 from 'ng-zorro-antd/image';
|
|
42
44
|
import * as i15 from '@angular/material/input';
|
|
43
|
-
import * as i21 from 'ng-zorro-antd/tooltip';
|
|
44
45
|
import * as i16$2 from 'ngx-color-picker';
|
|
45
46
|
import { ColorPickerModule } from 'ngx-color-picker';
|
|
46
47
|
import * as i5$4 from '@ckeditor/ckeditor5-angular';
|
|
@@ -51,7 +52,6 @@ import * as i9$1 from 'ng-zorro-antd/checkbox';
|
|
|
51
52
|
import * as i19 from 'ng-zorro-antd/grid';
|
|
52
53
|
import * as i3$3 from '@angular/material/button';
|
|
53
54
|
import * as i6$2 from 'ng-zorro-antd/input-number';
|
|
54
|
-
import { __awaiter } from 'tslib';
|
|
55
55
|
import { FlatTreeControl } from '@angular/cdk/tree';
|
|
56
56
|
import * as i6$3 from '@angular/material/tree';
|
|
57
57
|
import { MatTreeFlattener, MatTreeFlatDataSource } from '@angular/material/tree';
|
|
@@ -4436,6 +4436,17 @@ class AtwFrameRepeatAdmin {
|
|
|
4436
4436
|
}
|
|
4437
4437
|
];
|
|
4438
4438
|
this.blocks_of_page = [];
|
|
4439
|
+
this.listOfData = [];
|
|
4440
|
+
this.popupHovers = [];
|
|
4441
|
+
this.hoverBlanks = [];
|
|
4442
|
+
/** Dùng cho hình ảnh cần nén cho các thiết bị khác nhau tối ưu SEO */
|
|
4443
|
+
this.deviceTemp = 'desktop';
|
|
4444
|
+
/** Kích thước hình ảnh có phù hợp với kích thước thực tế hay chưa? */
|
|
4445
|
+
this.isDesignImageSizeValid = true;
|
|
4446
|
+
/** Có hiển thị chỗ chọn thiết bị hay không? */
|
|
4447
|
+
this.showChooseDevice = false;
|
|
4448
|
+
/** Chứa các kích thước thiết kế vật thể image của các thiết bị */
|
|
4449
|
+
this.imageSizeOfDevices = {};
|
|
4439
4450
|
/**
|
|
4440
4451
|
* Các component con trong frame repeat này, nếu là component khác thì không add
|
|
4441
4452
|
*/
|
|
@@ -4454,10 +4465,7 @@ class AtwFrameRepeatAdmin {
|
|
|
4454
4465
|
'button-repeat': 'button',
|
|
4455
4466
|
'popup-repeat': 'popup',
|
|
4456
4467
|
};
|
|
4457
|
-
this.
|
|
4458
|
-
this.popupHovers = [];
|
|
4459
|
-
this.hoverBlanks = [];
|
|
4460
|
-
this.path = '/images';
|
|
4468
|
+
this.path = ''; // Nên để rỗng vì ban đâu sẽ đi vào thư mục /images/design/objects
|
|
4461
4469
|
}
|
|
4462
4470
|
ngOnInit() {
|
|
4463
4471
|
this.getBlockPopupHovers();
|
|
@@ -4508,33 +4516,51 @@ class AtwFrameRepeatAdmin {
|
|
|
4508
4516
|
});
|
|
4509
4517
|
}
|
|
4510
4518
|
ngOnChanges(changes) {
|
|
4511
|
-
|
|
4512
|
-
|
|
4513
|
-
|
|
4519
|
+
var _a;
|
|
4520
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
4521
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
4522
|
+
if (changes === null || changes === void 0 ? void 0 : changes.data) {
|
|
4523
|
+
this.getData();
|
|
4524
|
+
}
|
|
4525
|
+
if (((_a = this.itemEdit) === null || _a === void 0 ? void 0 : _a.type) == 'image-repeat' && this.isOpenModal) {
|
|
4526
|
+
this.isDesignImageSizeValid = yield this.checkDesignImageSize();
|
|
4527
|
+
}
|
|
4514
4528
|
}
|
|
4515
|
-
}
|
|
4529
|
+
});
|
|
4516
4530
|
}
|
|
4517
4531
|
handleAddData() {
|
|
4532
|
+
// Kiểm tra cờ loading để ngăn người dùng click nhiều lần liên tiếp khi đang xử lý
|
|
4518
4533
|
if (this.loading)
|
|
4519
4534
|
return;
|
|
4520
4535
|
this.loading = true;
|
|
4536
|
+
// Lọc ra các đối tượng con (children) hợp lệ dựa trên danh sách component được phép (childrenComp)
|
|
4521
4537
|
const childrenObject = this.data.objects.filter(o => this.childrenComp.includes(o.component));
|
|
4538
|
+
// Nếu không tìm thấy đối tượng con nào phù hợp, báo lỗi và dừng lại
|
|
4522
4539
|
if (!childrenObject.length) {
|
|
4523
4540
|
this.functionService.createMessage('error', 'khong_co_du_lieu_de_them');
|
|
4524
4541
|
this.loading = false;
|
|
4525
4542
|
return;
|
|
4526
4543
|
}
|
|
4544
|
+
// TRƯỜNG HỢP 1: Đã có dữ liệu trong danh sách (Thêm dòng tiếp theo)
|
|
4527
4545
|
if (this.listOfData.length > 0) {
|
|
4546
|
+
// Sao chép (clone) phần tử cuối cùng trong danh sách để làm mẫu
|
|
4528
4547
|
const itemAdd = Object.assign({}, this.listOfData[this.listOfData.length - 1]);
|
|
4548
|
+
// Tăng chỉ số index (ví dụ: từ "abc_1" thành "abc_2")
|
|
4529
4549
|
itemAdd.index = itemAdd.index.split('_')[0] + '_' + (Number(itemAdd.index.split('_')[1]) + 1);
|
|
4550
|
+
// Tính số thứ tự (ordinal) mới
|
|
4530
4551
|
let ordinal = itemAdd.ordinal + 1;
|
|
4552
|
+
// Xóa _id cũ và ordinal cũ để tránh trùng lặp khi tạo mới
|
|
4531
4553
|
delete itemAdd._id;
|
|
4532
4554
|
delete itemAdd.ordinal;
|
|
4555
|
+
// Tăng thứ tự sắp xếp (sort)
|
|
4533
4556
|
itemAdd.sort++;
|
|
4557
|
+
// Duyệt qua các đối tượng con để khởi tạo dữ liệu mặc định cho item mới
|
|
4534
4558
|
const dataObject = childrenObject.reduce((obj, item, index) => {
|
|
4535
|
-
//
|
|
4559
|
+
// Xử lý cho các loại: text, button, date, popup
|
|
4536
4560
|
if (['text-repeat', 'button-repeat', 'date-repeat', 'popup-repeat'].includes(item.type)) {
|
|
4561
|
+
// Tạo key theo định dạng: id_ordinal
|
|
4537
4562
|
obj[item._id + '_' + ordinal] = {
|
|
4563
|
+
// Nếu là text/button/popup thì lấy theo ngôn ngữ, ngược lại lấy value gốc
|
|
4538
4564
|
[(item.type == 'text-repeat' || item.type == 'button-repeat' || item.type == 'popup-repeat') ? 'value_' + this.functionService.selectedLanguageCode : 'value']: (item.type == 'date-repeat' ? new Date(item.staticdata.value) : item.staticdata.value),
|
|
4539
4565
|
type: item.type,
|
|
4540
4566
|
type_link: 'none',
|
|
@@ -4544,6 +4570,7 @@ class AtwFrameRepeatAdmin {
|
|
|
4544
4570
|
index: index + 1
|
|
4545
4571
|
};
|
|
4546
4572
|
}
|
|
4573
|
+
// Xử lý cho loại: image
|
|
4547
4574
|
if (item.type == 'image-repeat') {
|
|
4548
4575
|
obj[item._id + '_' + ordinal] = {
|
|
4549
4576
|
value: item.staticdata.value,
|
|
@@ -4555,6 +4582,7 @@ class AtwFrameRepeatAdmin {
|
|
|
4555
4582
|
index: index + 1
|
|
4556
4583
|
};
|
|
4557
4584
|
}
|
|
4585
|
+
// Xử lý cho loại: video
|
|
4558
4586
|
if (item.type == 'video-repeat') {
|
|
4559
4587
|
obj[item._id + '_' + ordinal] = {
|
|
4560
4588
|
value: item.staticdata.value,
|
|
@@ -4567,6 +4595,7 @@ class AtwFrameRepeatAdmin {
|
|
|
4567
4595
|
index: index + 1
|
|
4568
4596
|
};
|
|
4569
4597
|
}
|
|
4598
|
+
// Xử lý cho loại: map (bản đồ)
|
|
4570
4599
|
if (item.type == 'map-repeat') {
|
|
4571
4600
|
obj[item._id + '_' + ordinal] = {
|
|
4572
4601
|
value: item.staticdata.src,
|
|
@@ -4579,29 +4608,39 @@ class AtwFrameRepeatAdmin {
|
|
|
4579
4608
|
}
|
|
4580
4609
|
return obj;
|
|
4581
4610
|
}, {});
|
|
4582
|
-
// Gán object
|
|
4611
|
+
// Gán object dữ liệu vừa tạo vào itemAdd
|
|
4583
4612
|
itemAdd.data = dataObject;
|
|
4584
|
-
|
|
4613
|
+
// Tạo _id ngẫu nhiên mới (hex string 4 ký tự)
|
|
4614
|
+
itemAdd._id = (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
|
|
4615
|
+
// Cập nhật danh sách data_list trong staticdata
|
|
4585
4616
|
this.data.staticdata.data_list = [...this.data.staticdata.data_list, itemAdd];
|
|
4617
|
+
// Gọi API cập nhật đối tượng vào cơ sở dữ liệu
|
|
4586
4618
|
this.vhQueryAutoWeb.updateObject(this.data._id, {
|
|
4587
4619
|
staticdata: this.data.staticdata
|
|
4588
4620
|
}).then((res) => {
|
|
4621
|
+
// Cập nhật thành công: Thêm vào mảng dữ liệu gốc
|
|
4589
4622
|
this.listPureData.push(itemAdd);
|
|
4623
|
+
// Xử lý hiển thị: clone item và convert data object sang array để render
|
|
4590
4624
|
let newData = Object.assign({}, itemAdd);
|
|
4591
4625
|
let dataConvert = this.convertObjectToArray(newData.data);
|
|
4592
4626
|
newData.data = dataConvert;
|
|
4593
4627
|
newData.ordinal = ordinal;
|
|
4628
|
+
// Cập nhật danh sách hiển thị trên UI
|
|
4594
4629
|
this.listOfData = [...this.listOfData, newData];
|
|
4630
|
+
// Hiển thị thông báo thành công nếu đang ở trang admin
|
|
4595
4631
|
if (this.functionService.getTypeConfig() == 'admin')
|
|
4596
4632
|
this.functionService.createMessage('success', 'cap_nhat_du_lieu_thanh_cong');
|
|
4633
|
+
// Tắt cờ loading
|
|
4597
4634
|
this.loading = false;
|
|
4598
4635
|
});
|
|
4599
4636
|
}
|
|
4600
4637
|
else {
|
|
4638
|
+
// TRƯỜNG HỢP 2: Chưa có dữ liệu nào (Tạo dòng đầu tiên)
|
|
4601
4639
|
let dataObject = {};
|
|
4602
|
-
//
|
|
4640
|
+
// Duyệt qua childrenObject để tạo dữ liệu khởi tạo (logic tương tự như trên nhưng ordinal mặc định là 1)
|
|
4603
4641
|
if (Array.isArray(childrenObject)) {
|
|
4604
4642
|
dataObject = childrenObject.reduce((obj, item, index) => {
|
|
4643
|
+
// Xử lý text, button, date, popup
|
|
4605
4644
|
if (['text-repeat', 'button-repeat', 'date-repeat', 'popup-repeat'].includes(item.type)) {
|
|
4606
4645
|
obj[item._id + '_' + 1] = {
|
|
4607
4646
|
[(item.type == 'text-repeat' || item.type == 'button-repeat' || item.type == 'popup-repeat') ? 'value_' + this.functionService.selectedLanguageCode : 'value']: (item.type == 'date-repeat' ? new Date(item.staticdata.value) : item.staticdata.value),
|
|
@@ -4612,6 +4651,7 @@ class AtwFrameRepeatAdmin {
|
|
|
4612
4651
|
is_scroll: true,
|
|
4613
4652
|
};
|
|
4614
4653
|
}
|
|
4654
|
+
// Xử lý image
|
|
4615
4655
|
if (item.type == 'image-repeat') {
|
|
4616
4656
|
obj[item._id + '_' + 1] = {
|
|
4617
4657
|
value: item.staticdata.value,
|
|
@@ -4623,6 +4663,7 @@ class AtwFrameRepeatAdmin {
|
|
|
4623
4663
|
index: index + 1
|
|
4624
4664
|
};
|
|
4625
4665
|
}
|
|
4666
|
+
// Xử lý video
|
|
4626
4667
|
if (item.type == 'video-repeat') {
|
|
4627
4668
|
obj[item._id + '_' + 1] = {
|
|
4628
4669
|
value: item.staticdata.value,
|
|
@@ -4634,6 +4675,7 @@ class AtwFrameRepeatAdmin {
|
|
|
4634
4675
|
type: item.type,
|
|
4635
4676
|
};
|
|
4636
4677
|
}
|
|
4678
|
+
// Xử lý map
|
|
4637
4679
|
if (item.type == 'map-repeat') {
|
|
4638
4680
|
obj[item._id + '_' + 1] = {
|
|
4639
4681
|
value: item.staticdata.src,
|
|
@@ -4646,25 +4688,33 @@ class AtwFrameRepeatAdmin {
|
|
|
4646
4688
|
return obj;
|
|
4647
4689
|
}, {});
|
|
4648
4690
|
}
|
|
4691
|
+
// Tạo item mới hoàn toàn với index khởi đầu là id_1
|
|
4649
4692
|
const itemAdd = {
|
|
4650
4693
|
index: this.data._id + '_' + 1,
|
|
4651
4694
|
data: dataObject,
|
|
4652
4695
|
sort: 1,
|
|
4653
|
-
_id: (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1) // tạo _id ngẫu nhiêu
|
|
4696
|
+
_id: (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1) // tạo _id ngẫu nhiêu
|
|
4654
4697
|
};
|
|
4698
|
+
// Khởi tạo mảng data_list nếu chưa có và thêm item mới vào
|
|
4655
4699
|
this.data.staticdata.data_list = this.data.staticdata.data_list || [];
|
|
4656
4700
|
this.data.staticdata.data_list = [...this.data.staticdata.data_list, itemAdd];
|
|
4701
|
+
// Gọi API cập nhật vào DB
|
|
4657
4702
|
this.vhQueryAutoWeb.updateObject(this.data._id, {
|
|
4658
4703
|
staticdata: this.data.staticdata
|
|
4659
4704
|
}).then((res) => {
|
|
4705
|
+
// Cập nhật thành công: Thêm vào list dữ liệu gốc
|
|
4660
4706
|
this.listPureData.push(itemAdd);
|
|
4707
|
+
// Xử lý hiển thị
|
|
4661
4708
|
let newData = Object.assign({}, itemAdd);
|
|
4662
4709
|
let dataConvert = this.convertObjectToArray(newData.data);
|
|
4663
4710
|
newData.data = dataConvert;
|
|
4664
|
-
newData.ordinal = 1;
|
|
4711
|
+
newData.ordinal = 1; // Mặc định ordinal là 1
|
|
4712
|
+
// Cập nhật UI
|
|
4665
4713
|
this.listOfData = [...this.listOfData, newData];
|
|
4714
|
+
// Thông báo thành công
|
|
4666
4715
|
if (this.functionService.getTypeConfig() == 'admin')
|
|
4667
4716
|
this.functionService.createMessage('success', 'cap_nhat_du_lieu_thanh_cong');
|
|
4717
|
+
// Tắt loading
|
|
4668
4718
|
this.loading = false;
|
|
4669
4719
|
});
|
|
4670
4720
|
}
|
|
@@ -4674,22 +4724,38 @@ class AtwFrameRepeatAdmin {
|
|
|
4674
4724
|
return Object.assign({ id_ordinal: key }, value);
|
|
4675
4725
|
});
|
|
4676
4726
|
}
|
|
4727
|
+
/**
|
|
4728
|
+
* Hàm chuyển đổi cấu trúc dữ liệu đầu vào.
|
|
4729
|
+
* Mục đích: Duyệt qua danh sách dữ liệu (rows) và ánh xạ với cấu hình đối tượng (columns)
|
|
4730
|
+
* để tạo ra cấu trúc dữ liệu chuẩn cho việc hiển thị (bao gồm cả dữ liệu đã lưu và dữ liệu mặc định).
|
|
4731
|
+
* @param data Mảng dữ liệu đầu vào cần chuyển đổi
|
|
4732
|
+
*/
|
|
4677
4733
|
convertData(data) {
|
|
4734
|
+
// Duyệt qua từng dòng dữ liệu (item) trong mảng đầu vào
|
|
4678
4735
|
return data.map((item) => {
|
|
4736
|
+
// Lọc lấy các đối tượng cấu hình con (objects) hợp lệ dựa trên danh sách component cho phép
|
|
4737
|
+
// Sau đó map qua từng đối tượng cấu hình này để tạo dữ liệu cho từng ô (cell)
|
|
4679
4738
|
let dataConvert = this.data.objects.filter(o => this.childrenComp.includes(o.component)).map((ele, index) => {
|
|
4739
|
+
// Tạo key định danh duy nhất cho ô dữ liệu: ID_cấu_hình + Số_thứ_tự_dòng
|
|
4740
|
+
// Ví dụ: text123_1, image456_2
|
|
4680
4741
|
const itemIndex = ele._id + '_' + item.index.split('_')[1];
|
|
4742
|
+
// TRƯỜNG HỢP 1: Dữ liệu cho ô này đã tồn tại trong DB
|
|
4681
4743
|
if (item.data.hasOwnProperty(itemIndex)) {
|
|
4682
|
-
return Object.assign({ id_ordinal: itemIndex }, item.data[itemIndex]
|
|
4744
|
+
return Object.assign({ id_ordinal: itemIndex }, item.data[itemIndex] // Spread toàn bộ dữ liệu đã lưu
|
|
4745
|
+
);
|
|
4683
4746
|
}
|
|
4684
4747
|
else {
|
|
4685
|
-
//
|
|
4748
|
+
// TRƯỜNG HỢP 2: Dữ liệu chưa tồn tại (mới thêm hoặc lỗi), cần tạo dữ liệu mặc định từ staticdata
|
|
4749
|
+
// Lấy tất cả các trường bắt đầu bằng 'value' từ staticdata (hỗ trợ đa ngôn ngữ value_vi, value_en...)
|
|
4686
4750
|
const valueFields = {};
|
|
4687
4751
|
Object.keys(ele.staticdata).forEach(key => {
|
|
4688
4752
|
if (key.startsWith('value')) {
|
|
4689
4753
|
valueFields[key] = ele.staticdata[key];
|
|
4690
4754
|
}
|
|
4691
4755
|
});
|
|
4756
|
+
// Khởi tạo object dữ liệu mặc định
|
|
4692
4757
|
let valueReturn = Object.assign(Object.assign({ id_ordinal: itemIndex }, valueFields), { type: ele.type, index: index + 1, type_link: 'none', link: '', hyper_link: '', is_scroll: true });
|
|
4758
|
+
// Xử lý mặc định riêng cho loại Video
|
|
4693
4759
|
if (ele.type == 'video-repeat') {
|
|
4694
4760
|
valueReturn = {
|
|
4695
4761
|
id_ordinal: itemIndex,
|
|
@@ -4703,6 +4769,7 @@ class AtwFrameRepeatAdmin {
|
|
|
4703
4769
|
index: index + 1
|
|
4704
4770
|
};
|
|
4705
4771
|
}
|
|
4772
|
+
// Xử lý mặc định riêng cho loại Map (Bản đồ)
|
|
4706
4773
|
if (item.type == 'map-repeat') {
|
|
4707
4774
|
valueReturn = {
|
|
4708
4775
|
value: item.staticdata.src,
|
|
@@ -4716,19 +4783,27 @@ class AtwFrameRepeatAdmin {
|
|
|
4716
4783
|
return valueReturn;
|
|
4717
4784
|
}
|
|
4718
4785
|
});
|
|
4719
|
-
|
|
4786
|
+
// Trả về item đã được tái cấu trúc
|
|
4787
|
+
return Object.assign(Object.assign({}, item), {
|
|
4788
|
+
// Tách lấy số thứ tự dòng từ index (ví dụ: "block_1" -> 1)
|
|
4789
|
+
ordinal: Number(item.index.split('_')[1]),
|
|
4790
|
+
// Gán mảng dữ liệu chi tiết đã convert vào trường data
|
|
4791
|
+
data: dataConvert });
|
|
4720
4792
|
});
|
|
4721
4793
|
}
|
|
4722
4794
|
getData() {
|
|
4723
4795
|
if (this.loading = false)
|
|
4724
4796
|
return;
|
|
4725
4797
|
this.id_subproject = this.vhQueryAutoWeb.getlocalSubProject_Working()._id;
|
|
4798
|
+
this.subproject = this.vhQueryAutoWeb.getlocalSubProject(this.id_subproject);
|
|
4726
4799
|
this.loading = true;
|
|
4727
4800
|
if (typeof this.data.staticdata.data_list != 'object') {
|
|
4728
4801
|
this.data.staticdata.data_list = [];
|
|
4729
4802
|
}
|
|
4730
4803
|
this.listPureData = this.data.staticdata.data_list || [];
|
|
4731
4804
|
this.listOfData = this.convertData(this.listPureData);
|
|
4805
|
+
// Kiểm tra xem có image-repeat để hiển thị chỗ chọn device
|
|
4806
|
+
this.showChooseDevice = this.listOfData[0].data.some(i => i.type === 'image-repeat');
|
|
4732
4807
|
this.vhAlgorithm.sortNumberbyASC(this.listOfData, 'sort');
|
|
4733
4808
|
this.loading = false;
|
|
4734
4809
|
this.getLinkAllPages();
|
|
@@ -4825,7 +4900,10 @@ class AtwFrameRepeatAdmin {
|
|
|
4825
4900
|
if (file) {
|
|
4826
4901
|
let compressType = this.compressType;
|
|
4827
4902
|
let resolution = {};
|
|
4828
|
-
if (compressType == '
|
|
4903
|
+
if (compressType == 'compress-frame') {
|
|
4904
|
+
resolution = this.imageSizeOfDevices[this.deviceTemp];
|
|
4905
|
+
}
|
|
4906
|
+
else if (compressType == 'custom') {
|
|
4829
4907
|
resolution = {
|
|
4830
4908
|
width: +this.compressWidth,
|
|
4831
4909
|
height: +this.compressHeight,
|
|
@@ -4840,7 +4918,10 @@ class AtwFrameRepeatAdmin {
|
|
|
4840
4918
|
.then((rsp) => {
|
|
4841
4919
|
console.log('rsp', rsp);
|
|
4842
4920
|
if (rsp.vcode === 0) {
|
|
4843
|
-
this.itemEdit.
|
|
4921
|
+
this.itemEdit[this.deviceTemp + '_value'] = rsp.data;
|
|
4922
|
+
if (this.deviceTemp == 'desktop') {
|
|
4923
|
+
this.itemEdit.value = rsp.data;
|
|
4924
|
+
}
|
|
4844
4925
|
this.updateData(dataRow);
|
|
4845
4926
|
}
|
|
4846
4927
|
else {
|
|
@@ -4862,14 +4943,17 @@ class AtwFrameRepeatAdmin {
|
|
|
4862
4943
|
width: '85%',
|
|
4863
4944
|
maxWidth: '100%',
|
|
4864
4945
|
data: {
|
|
4865
|
-
startPath: this.path
|
|
4946
|
+
startPath: this.path || '/images/design/objects',
|
|
4866
4947
|
scopeData: '/images',
|
|
4867
4948
|
},
|
|
4868
4949
|
disableClose: true,
|
|
4869
4950
|
});
|
|
4870
4951
|
dialogRef.afterClosed().subscribe((data) => {
|
|
4871
4952
|
if (data.href) {
|
|
4872
|
-
this.itemEdit.
|
|
4953
|
+
this.itemEdit[this.deviceTemp + '_value'] = data.href;
|
|
4954
|
+
if (this.deviceTemp == 'desktop') {
|
|
4955
|
+
this.itemEdit.value = data.href;
|
|
4956
|
+
}
|
|
4873
4957
|
this.updateData(dataRow);
|
|
4874
4958
|
}
|
|
4875
4959
|
this.path = data.path;
|
|
@@ -4883,20 +4967,37 @@ class AtwFrameRepeatAdmin {
|
|
|
4883
4967
|
});
|
|
4884
4968
|
dialogRef.afterClosed().subscribe((result) => {
|
|
4885
4969
|
if (result) {
|
|
4886
|
-
this.itemEdit.
|
|
4970
|
+
this.itemEdit[this.deviceTemp + '_value'] = result;
|
|
4971
|
+
if (this.deviceTemp == 'desktop') {
|
|
4972
|
+
this.itemEdit.value = result;
|
|
4973
|
+
}
|
|
4887
4974
|
this.updateData(dataRow);
|
|
4888
4975
|
}
|
|
4889
4976
|
});
|
|
4890
4977
|
}
|
|
4891
4978
|
chooseItemEdit(item, dataRow) {
|
|
4892
|
-
this
|
|
4893
|
-
|
|
4894
|
-
|
|
4895
|
-
|
|
4896
|
-
|
|
4897
|
-
|
|
4898
|
-
|
|
4899
|
-
|
|
4979
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
4980
|
+
this.itemEdit = item;
|
|
4981
|
+
this.itemEdit.scroll_distance = this.itemEdit.scroll_distance || 0;
|
|
4982
|
+
this.dataRow = dataRow;
|
|
4983
|
+
this.isOpenModal = true;
|
|
4984
|
+
if (item.type == 'image-repeat') {
|
|
4985
|
+
// Lấy ra kích thước thiết kế để dùng cho các hàm
|
|
4986
|
+
this.getDesignDimensionsOfDevices(item);
|
|
4987
|
+
// Khởi tạo device + value nếu chưa có
|
|
4988
|
+
this.functionService.devices.forEach((d) => {
|
|
4989
|
+
var _a;
|
|
4990
|
+
var _b, _c;
|
|
4991
|
+
(_a = (_b = this.itemEdit)[_c = `${d.value}_value`]) !== null && _a !== void 0 ? _a : (_b[_c] = this.itemEdit.value);
|
|
4992
|
+
});
|
|
4993
|
+
// Kiểm tra nút cập nhật size ảnh theo size thiết kế có cần hiển thị hay không
|
|
4994
|
+
this.isDesignImageSizeValid = yield this.checkDesignImageSize();
|
|
4995
|
+
}
|
|
4996
|
+
if (item.type == 'map-repeat') {
|
|
4997
|
+
this.radioValue = item.local != '' ? 'location' : 'iframe';
|
|
4998
|
+
}
|
|
4999
|
+
this.getBlocksbyPage();
|
|
5000
|
+
});
|
|
4900
5001
|
}
|
|
4901
5002
|
openUploadToServer() {
|
|
4902
5003
|
this.isShowUploadToServer = true;
|
|
@@ -4971,7 +5072,10 @@ class AtwFrameRepeatAdmin {
|
|
|
4971
5072
|
this.uploadToServerLoading = true;
|
|
4972
5073
|
let compressType = this.compressType;
|
|
4973
5074
|
let resolution = {};
|
|
4974
|
-
if (compressType == '
|
|
5075
|
+
if (compressType == 'compress-frame') {
|
|
5076
|
+
resolution = this.imageSizeOfDevices[this.deviceTemp];
|
|
5077
|
+
}
|
|
5078
|
+
else if (compressType == 'custom') {
|
|
4975
5079
|
resolution = {
|
|
4976
5080
|
width: +this.compressWidth,
|
|
4977
5081
|
height: +this.compressHeight,
|
|
@@ -4979,23 +5083,21 @@ class AtwFrameRepeatAdmin {
|
|
|
4979
5083
|
compressType = 'compress-frame';
|
|
4980
5084
|
}
|
|
4981
5085
|
this.vhImage
|
|
4982
|
-
.getImageFromURL_Autoweb(itemEdit.value, 'images/design/objects', {
|
|
5086
|
+
.getImageFromURL_Autoweb(itemEdit[`${this.deviceTemp}_value`] || itemEdit.value, 'images/design/objects', {
|
|
4983
5087
|
compress_type: compressType,
|
|
4984
5088
|
resolution: resolution,
|
|
4985
5089
|
})
|
|
4986
5090
|
.then((res) => {
|
|
4987
|
-
// console.log('res', res);
|
|
4988
|
-
// res = {
|
|
4989
|
-
// "vcode": 0,
|
|
4990
|
-
// "msg": "success",
|
|
4991
|
-
// "data": "https://115.78.228.208:20350/autowebapp/66b0479062f72fd82ca62d80/images/design/objects/tw3tnkn4.jpeg"
|
|
4992
|
-
// }
|
|
4993
5091
|
if (res.vcode != 0) {
|
|
4994
5092
|
console.error(res.msg);
|
|
4995
|
-
this.functionService.createMessage('error', res.msg);
|
|
5093
|
+
this.functionService.createMessage('error', res.msg, 5000);
|
|
5094
|
+
this.isShowUploadToServer = false;
|
|
4996
5095
|
return;
|
|
4997
5096
|
}
|
|
4998
|
-
itemEdit.
|
|
5097
|
+
itemEdit[`${this.deviceTemp}_value`] = res.data;
|
|
5098
|
+
if (this.deviceTemp == 'desktop') {
|
|
5099
|
+
itemEdit.value = res.data;
|
|
5100
|
+
}
|
|
4999
5101
|
this.updateData(this.dataRow);
|
|
5000
5102
|
this.isShowUploadToServer = false;
|
|
5001
5103
|
})
|
|
@@ -5124,9 +5226,227 @@ class AtwFrameRepeatAdmin {
|
|
|
5124
5226
|
return true;
|
|
5125
5227
|
return true;
|
|
5126
5228
|
}
|
|
5229
|
+
/**
|
|
5230
|
+
* Hàm lấy kích thước thiết kế của hình ảnh trong khung lưới
|
|
5231
|
+
* @param item
|
|
5232
|
+
*/
|
|
5233
|
+
getDesignDimensionsOfDevices(item) {
|
|
5234
|
+
const idObj = item.id_ordinal.split('_')[0];
|
|
5235
|
+
const obj = this.data.objects.find(object => object._id === idObj);
|
|
5236
|
+
this.functionService.devices.forEach((d) => {
|
|
5237
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
5238
|
+
// Trường hợp dimension đã có dữ liệu
|
|
5239
|
+
if (((_b = (_a = obj === null || obj === void 0 ? void 0 : obj[`${d.value}_config`]) === null || _a === void 0 ? void 0 : _a.dimension) === null || _b === void 0 ? void 0 : _b.width) &&
|
|
5240
|
+
((_d = (_c = obj === null || obj === void 0 ? void 0 : obj[`${d.value}_config`]) === null || _c === void 0 ? void 0 : _c.dimension) === null || _d === void 0 ? void 0 : _d.height)) {
|
|
5241
|
+
this.imageSizeOfDevices[d.value] = obj[`${d.value}_config`].dimension;
|
|
5242
|
+
}
|
|
5243
|
+
// Trường hợp chưa có dimension thì dùng của class image
|
|
5244
|
+
else if (((_f = (_e = obj[`${d.value}_class`]) === null || _e === void 0 ? void 0 : _e.image) === null || _f === void 0 ? void 0 : _f.width) &&
|
|
5245
|
+
((_h = (_g = obj[`${d.value}_class`]) === null || _g === void 0 ? void 0 : _g.image) === null || _h === void 0 ? void 0 : _h.height)) {
|
|
5246
|
+
const container = obj[`${d.value}_class`].image;
|
|
5247
|
+
this.imageSizeOfDevices[d.value] = {
|
|
5248
|
+
width: parseFloat(container.width),
|
|
5249
|
+
height: parseFloat(container.height)
|
|
5250
|
+
};
|
|
5251
|
+
}
|
|
5252
|
+
});
|
|
5253
|
+
}
|
|
5254
|
+
/**
|
|
5255
|
+
* Lấy ra tên file và đuôi file
|
|
5256
|
+
* @param url Đường dẫn ảnh
|
|
5257
|
+
* @example const { fileName, fileExtension } = getFileInfo("https://115.78.228.208:20350/autowebapp/67c1b593b1344364462b082b/images/design/objects/3-1-768x768%20(3).png");
|
|
5258
|
+
*/
|
|
5259
|
+
getFileInfo(url) {
|
|
5260
|
+
const decodedUrl = decodeURIComponent(url);
|
|
5261
|
+
const parts = decodedUrl.split('/');
|
|
5262
|
+
// Lấy tên file (phần cuối)
|
|
5263
|
+
const fullFileName = parts.pop() || '';
|
|
5264
|
+
const dotIndex = fullFileName.lastIndexOf('.');
|
|
5265
|
+
// Tìm và lấy phần giữa (ví dụ: "images/design/objects")
|
|
5266
|
+
const indexImages = parts.indexOf('images');
|
|
5267
|
+
const folderPath = indexImages !== -1 ? parts.slice(indexImages).join('/') : '';
|
|
5268
|
+
return {
|
|
5269
|
+
fullFileName,
|
|
5270
|
+
fileName: fullFileName.substring(0, dotIndex),
|
|
5271
|
+
fileExtension: fullFileName.substring(dotIndex + 1),
|
|
5272
|
+
folderPath, // "images/design/objects"
|
|
5273
|
+
};
|
|
5274
|
+
}
|
|
5275
|
+
/** Hàm kiểm tra có cần phải hiển thị nút cập nhật không */
|
|
5276
|
+
checkDesignImageSize() {
|
|
5277
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
5278
|
+
// chạy song song cho nhanh
|
|
5279
|
+
const results = yield Promise.all(this.functionService.devices.map((d) => __awaiter(this, void 0, void 0, function* () {
|
|
5280
|
+
var _a, _b;
|
|
5281
|
+
var _c, _d;
|
|
5282
|
+
// Trường hợp itemEdit device value chưa có thì gán tạm
|
|
5283
|
+
(_a = (_c = this.itemEdit)[_d = `${d.value}_value`]) !== null && _a !== void 0 ? _a : (_c[_d] = this.itemEdit.value);
|
|
5284
|
+
// Nếu giao diện thiết kế đã ẩn thiết bị thì không cần check
|
|
5285
|
+
if (!((_b = this.subproject) === null || _b === void 0 ? void 0 : _b[`${d.value}_template_display`])) {
|
|
5286
|
+
return false;
|
|
5287
|
+
}
|
|
5288
|
+
// Ảnh gốc
|
|
5289
|
+
const url = this.itemEdit[`${d.value}_value`];
|
|
5290
|
+
const imgSize = yield this.functionService.getImageSize(url);
|
|
5291
|
+
// Container thiết kế
|
|
5292
|
+
const containerSize = this.imageSizeOfDevices[d.value];
|
|
5293
|
+
return this.checkRatioDesignImgSize(imgSize, containerSize);
|
|
5294
|
+
})));
|
|
5295
|
+
// chỉ cần 1 device trả về true → return true
|
|
5296
|
+
return results.some(v => v === true);
|
|
5297
|
+
});
|
|
5298
|
+
}
|
|
5299
|
+
/**
|
|
5300
|
+
* Hàm kiểm tra
|
|
5301
|
+
* - Ratio có bị lệch nhiều hay không hoặc
|
|
5302
|
+
* - Kích thước có lớn hơn nhiều so với kích thước hiển thị hay không?
|
|
5303
|
+
* @param imgSize Kích thước của file ảnh gốc
|
|
5304
|
+
* @param containerSize Kích thước thực tế người dùng thấy
|
|
5305
|
+
*/
|
|
5306
|
+
checkRatioDesignImgSize(imgSize, containerSize) {
|
|
5307
|
+
// Ratio
|
|
5308
|
+
const imgRatio = imgSize.width / imgSize.height;
|
|
5309
|
+
const containerRatio = containerSize.width / containerSize.height;
|
|
5310
|
+
// Ratio lệch trên 10% → ảnh bị méo → return true
|
|
5311
|
+
const ratioDiff = Math.abs(imgRatio - containerRatio) / containerRatio;
|
|
5312
|
+
if (ratioDiff > 0.1) {
|
|
5313
|
+
return true;
|
|
5314
|
+
}
|
|
5315
|
+
// Tại đây: ratio giống nhau hoặc lệch ít → xét về kích thước
|
|
5316
|
+
const widthFactor = imgSize.width / containerSize.width;
|
|
5317
|
+
const heightFactor = imgSize.height / containerSize.height;
|
|
5318
|
+
// Ảnh lớn hơn container nhiều → ảnh nặng → giảm PageSpeed → return true
|
|
5319
|
+
if (widthFactor > 1.5
|
|
5320
|
+
|| heightFactor > 1.5) {
|
|
5321
|
+
return true;
|
|
5322
|
+
}
|
|
5323
|
+
// Ảnh lớn hơn chút nhưng không ảnh hưởng PageSpeed → return false
|
|
5324
|
+
return false;
|
|
5325
|
+
}
|
|
5326
|
+
/**
|
|
5327
|
+
* Hàm update kích thước ảnh phù hợp cho từng kích thước thiết kế của từng thiết bị
|
|
5328
|
+
* @param itemEdit
|
|
5329
|
+
* @param dataRow
|
|
5330
|
+
*/
|
|
5331
|
+
updateDesignImageSize(itemEdit, dataRow) {
|
|
5332
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
5333
|
+
const messages = [];
|
|
5334
|
+
// ⭐ Show Loading 1 lần duy nhất
|
|
5335
|
+
yield this.functionService.showLoading("", "current-loading", null, 0, false);
|
|
5336
|
+
yield Promise.all(this.functionService.devices.map((d) => __awaiter(this, void 0, void 0, function* () {
|
|
5337
|
+
var _a, _b;
|
|
5338
|
+
var _c, _d;
|
|
5339
|
+
// Trường hợp itemEdit device value chưa có thì gán tạm
|
|
5340
|
+
(_a = (_c = this.itemEdit)[_d = `${d}_value`]) !== null && _a !== void 0 ? _a : (_c[_d] = this.itemEdit.value);
|
|
5341
|
+
// Nếu giao diện thiết kế đã ẩn thiết bị thì không cần check
|
|
5342
|
+
if (!this.subproject[`${d.value}_template_display`])
|
|
5343
|
+
return;
|
|
5344
|
+
/** Khai báo tin nhắn thông báo cho từng thiết bị */
|
|
5345
|
+
const msgDevices = `(${this.languageService.translate('thiet_bi')} ${this.languageService.translate(d.label)}) ${this.findObjectName(itemEdit)}: `;
|
|
5346
|
+
// Ảnh gốc
|
|
5347
|
+
const url = itemEdit[`${d.value}_value`];
|
|
5348
|
+
const imgSize = yield this.functionService.getImageSize(url);
|
|
5349
|
+
// Container thiết kế
|
|
5350
|
+
const containerSize = this.imageSizeOfDevices[d.value];
|
|
5351
|
+
// Trường hợp nếu ảnh này đã phù hợp thì trả về thông báo chứ không update nữa
|
|
5352
|
+
if (!this.checkRatioDesignImgSize(imgSize, containerSize)) {
|
|
5353
|
+
messages.push({
|
|
5354
|
+
type: 'warning',
|
|
5355
|
+
msg: msgDevices + this.languageService.translate('anh_nay_da_phu_hop_khong_can_cap_nhat_nua')
|
|
5356
|
+
});
|
|
5357
|
+
return;
|
|
5358
|
+
}
|
|
5359
|
+
const msgSolution = this.functionService.getTypeConfig() == 'admin'
|
|
5360
|
+
? 'vui_long_chuan_bi_mot_hinh_khac_phu_hop'
|
|
5361
|
+
: 'vui_long_sua_thiet_ke_hoac_chuan_bi_mot_hinh_khac_phu_hop';
|
|
5362
|
+
// Trường hợp đã cập nhật hoặc width là bằng sẵn rồi nhưng height thiết kế không phù hợp
|
|
5363
|
+
// Thì trả về thông báo chứ không cho update nữa vì gây tăng dung lượng lưu ảnh không cần thiết
|
|
5364
|
+
if (imgSize.width == containerSize.width &&
|
|
5365
|
+
imgSize.height != containerSize.height) {
|
|
5366
|
+
const mTmp = containerSize.height > imgSize.height
|
|
5367
|
+
? 'chieu_cao_thiet_ke_lon_hon_chieu_cao_anh'
|
|
5368
|
+
: 'chieu_cao_thiet_ke_nho_hon_chieu_cao_anh';
|
|
5369
|
+
const m = this.languageService.translate(mTmp) + '. ' + this.languageService.translate(msgSolution);
|
|
5370
|
+
messages.push({
|
|
5371
|
+
type: 'error',
|
|
5372
|
+
msg: msgDevices + m + '!!!',
|
|
5373
|
+
duration: 8000
|
|
5374
|
+
});
|
|
5375
|
+
return;
|
|
5376
|
+
}
|
|
5377
|
+
// Trường hợp nếu ảnh này bé hơn kích thước thiết kế thì báo cho người dùng và không cập nhật
|
|
5378
|
+
if (imgSize.width < containerSize.width) {
|
|
5379
|
+
const mTmp = 'chieu_dai_anh_nho_hon_chieu_dai_thiet_ke_lam_cho_viec_nen_anh_theo_khung_hien_thi_hinh_anh_khong_hoat_dong';
|
|
5380
|
+
const m = this.languageService.translate(mTmp) + '. ' + this.languageService.translate(msgSolution);
|
|
5381
|
+
messages.push({
|
|
5382
|
+
type: 'error',
|
|
5383
|
+
msg: msgDevices + m + '!!!',
|
|
5384
|
+
duration: 8000
|
|
5385
|
+
});
|
|
5386
|
+
return;
|
|
5387
|
+
}
|
|
5388
|
+
// Cập nhật ảnh cho từng thiết bị
|
|
5389
|
+
try {
|
|
5390
|
+
const rsp = yield this.vhImage.getImageFromURL_Autoweb(url, 'images/design/objects', {
|
|
5391
|
+
compress_type: 'compress-frame',
|
|
5392
|
+
resolution: containerSize,
|
|
5393
|
+
});
|
|
5394
|
+
if (rsp.vcode == 0) {
|
|
5395
|
+
itemEdit[`${d.value}_value`] = rsp.data;
|
|
5396
|
+
if (d.value == 'desktop') {
|
|
5397
|
+
itemEdit.value = rsp.data;
|
|
5398
|
+
}
|
|
5399
|
+
messages.push({
|
|
5400
|
+
type: 'success',
|
|
5401
|
+
msg: msgDevices + this.languageService.translate('tai_anh_thanh_cong')
|
|
5402
|
+
});
|
|
5403
|
+
}
|
|
5404
|
+
else {
|
|
5405
|
+
messages.push({
|
|
5406
|
+
type: 'error',
|
|
5407
|
+
msg: msgDevices + this.languageService.translate('tai_anh_that_bai_ly_do') + rsp.msg
|
|
5408
|
+
});
|
|
5409
|
+
}
|
|
5410
|
+
}
|
|
5411
|
+
catch (error) {
|
|
5412
|
+
if ((_b = error.message) === null || _b === void 0 ? void 0 : _b.includes('413')) {
|
|
5413
|
+
messages.push({
|
|
5414
|
+
type: 'error',
|
|
5415
|
+
msg: msgDevices + this.languageService.translate('file_anh_qua_lon_vui_chon_file_anh_co_dung_luong_nho_hon_1mb')
|
|
5416
|
+
});
|
|
5417
|
+
}
|
|
5418
|
+
}
|
|
5419
|
+
})));
|
|
5420
|
+
// CHỈ CHẠY SAU KHI HOÀN TẤT TẤT CẢ DEVICE
|
|
5421
|
+
this.updateData(dataRow);
|
|
5422
|
+
// ⭐ Hide loading (delay 200ms để tránh flick)
|
|
5423
|
+
yield this.functionService.hideLoading(200);
|
|
5424
|
+
// Show toàn bộ message sau cùng
|
|
5425
|
+
messages.forEach(m => {
|
|
5426
|
+
var _a;
|
|
5427
|
+
this.functionService.createMessage(m.type, m.msg, (_a = m.duration) !== null && _a !== void 0 ? _a : 5000);
|
|
5428
|
+
});
|
|
5429
|
+
});
|
|
5430
|
+
}
|
|
5431
|
+
/**
|
|
5432
|
+
* Sao chép đường dẫn hình ảnh vào bộ nhớ tạm
|
|
5433
|
+
*/
|
|
5434
|
+
copyLinkImg(text) {
|
|
5435
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
5436
|
+
const textCopy = text || this.itemEdit[this.deviceTemp + '_value'];
|
|
5437
|
+
navigator.clipboard.writeText(textCopy)
|
|
5438
|
+
.then(() => {
|
|
5439
|
+
this.functionService.createMessage('success', 'da_sao_chep_vao_bo_nho_tam', 2000);
|
|
5440
|
+
})
|
|
5441
|
+
.catch(err => {
|
|
5442
|
+
this.functionService.createMessage('error', 'loi_khi_sao_chep', 2000);
|
|
5443
|
+
console.error('❌ Lỗi khi copy:', err);
|
|
5444
|
+
});
|
|
5445
|
+
}
|
|
5446
|
+
}
|
|
5127
5447
|
}
|
|
5128
5448
|
AtwFrameRepeatAdmin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AtwFrameRepeatAdmin, deps: [{ token: i1.VhAlgorithm }, { token: i1.VhQueryAutoWeb }, { token: i1.VhImage }, { token: i3$1.FunctionService }, { token: i2.MatDialog }, { token: PLATFORM_ID }, { token: i4$1.NzModalRef, optional: true }, { token: i2.MatDialog }, { token: i2$1.LanguageService }, { token: i3$2.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
5129
|
-
AtwFrameRepeatAdmin.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AtwFrameRepeatAdmin, selector: "atw-frame-repeat-admin", inputs: { data: "data", type: "type" }, usesOnChanges: true, ngImport: i0, template: "<!-- TABLE \u1EDE TRANG ADMIN -->\r\n<nz-layout id=\"purchase-invoice-today\">\r\n <!-- Ph\u1EA7n header -->\r\n <div class=\"purchase-invoice-today-header\">\r\n <div class=\"row p-0 m-0\">\r\n <div class=\"col-6 p-0 m-0 d-flex align-items-center\">\r\n \r\n </div>\r\n <!-- N\u00FAt th\u00EAm s\u1EA3n ph\u1EA9m v\u00E0o frame -->\r\n <div class=\"col-6 p-0 m-0 d-flex align-items-center justify-content-end\">\r\n <!-- Ch\u1ECDn ng\u00F4n ng\u1EEF -->\r\n <div class=\"mr-2\">\r\n <app-select-language-config [isAdmin]=\"true\"></app-select-language-config>\r\n </div>\r\n <button nzType=\"primary\" class=\"_btn _btn_add d-flex align-items-center right-all-content mr-2\" nz-button\r\n (click)=\"handleAddData()\">\r\n {{\r\n 'them_du_lieu' | translate\r\n }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Ph\u1EA7n table -->\r\n <div style=\"margin-top: 16px; height: 500px\">\r\n <nz-table #editRowTable nzBordered [nzData]=\"listOfData\" [nzLoading]=\"loading\" [nzTotal]=\"total\" nzShowSizeChanger\r\n [nzPageSizeOptions]=\"[5, 10, 20, 50]\" [nzPageSize]=\"pageSize\" [nzPageIndex]=\"pageIndex\" [nzScroll]=\"{ y: '400px' }\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"10%\">{{'STT' | translate}}</th>\r\n <th nzWidth=\"80%\">{{'doi_tuong' | translate}}</th>\r\n <th nzWidth=\"10%\">{{'thao_tac'| translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let dataRow of editRowTable.data\">\r\n <td>\r\n <div class=\"editable-cell\" [hidden]=\"itemEdit?._id === dataRow._id\" (click)=\"itemEdit = dataRow;\">\r\n {{ dataRow.sort }}\r\n </div>\r\n <input [hidden]=\"itemEdit?._id !== dataRow._id\" type=\"text\" nz-input [(ngModel)]=\"dataRow.sort\"\r\n (blur)=\"updateOrdinal(dataRow)\" />\r\n </td>\r\n\r\n <td>\r\n <ng-container *ngFor=\"let item of dataRow.data\">\r\n <ng-container *ngIf=\"item.type == 'image-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>:\r\n <img width=\"100px\" height=\"100px\" [src]=\"item.value\" alt=\"image-repeat\" class=\"mb-2\" />\r\n <!-- M\u00F4 t\u1EA3 n\u1ED9i dung c\u1EE7a \u1EA3nh -->\r\n <strong class=\"item-name ml-4\">{{ 'mo_ta' | translate }}</strong>\r\n : {{ item['accessibility_alt_' + functionService.languageTempCode] || '\u1EA2nh' }}\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'text-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>: {{ item['value_' +\r\n functionService.languageTempCode] | vhLanguage : 'value' : data.component }}\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'button-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>\r\n : {{ item['value_' + functionService.languageTempCode] | vhLanguage : 'button' : data.component }}\r\n <ng-container *ngIf=\"\r\n (item['value_' + functionService.languageTempCode] != undefined) && \r\n !item['value_' + functionService.languageTempCode]?.trim()\r\n \">\r\n <strong class=\"item-name ml-4\">{{ 'nhan' | translate }}</strong>\r\n : {{ item['accessibility_aria_label_' + functionService.languageTempCode] || 'N\u00FAt \u0111i\u1EC1u h\u01B0\u1EDBng' }}\r\n </ng-container>\r\n <ng-container *ngIf=\"item.icon_enable\">\r\n <strong class=\"item-name ml-4\">{{ 'bieu_tuong' | translate }}</strong>\r\n : <mat-icon *ngIf=\"item.icon_name\">{{ item.icon_name }}</mat-icon>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'popup-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>\r\n : {{ item['value_' + functionService.languageTempCode] | vhLanguage : 'popup' : data.component }}\r\n <ng-container *ngIf=\"\r\n (item['value_' + functionService.languageTempCode] != undefined) && \r\n !item['value_' + functionService.languageTempCode]?.trim()\r\n \">\r\n <strong class=\"item-name ml-4\">{{ 'nhan' | translate }}</strong>\r\n : {{ item['accessibility_aria_label_' + functionService.languageTempCode] || 'N\u00FAt g\u1ECDi h\u1ED9p tho\u1EA1i' }}\r\n </ng-container>\r\n <ng-container *ngIf=\"item.icon_enable\">\r\n <strong class=\"item-name ml-4\">{{ 'bieu_tuong' | translate }}</strong>\r\n : <mat-icon *ngIf=\"item.icon_name\">{{ item.icon_name }}</mat-icon>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'date-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>: {{ item.value | date: 'dd-MM-yyyy HH:mm:ss ' }}\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'video-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\"> \r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>:\r\n <iframe width=\"150px\" height=\"100px\" [src]=\"sanitizer.bypassSecurityTrustResourceUrl(item.value)\" alt=\"image-repeat\" class=\"mb-2\">\r\n </iframe>\r\n <!-- M\u00F4 t\u1EA3 n\u1ED9i dung c\u1EE7a video -->\r\n <strong class=\"item-name ml-4\">{{ 'mo_ta' | translate }}</strong>\r\n : {{ item['accessibility_title_' + functionService.languageTempCode] || 'Video youtube' }}\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'map-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>: \r\n <iframe width=\"200px\" height=\"100px\" scrolling=\"no\" loading=\"lazy\"\r\n [src]=\"sanitizer.bypassSecurityTrustResourceUrl(item.value)\"\r\n referrerpolicy=\"no-referrer-when-downgrade\" alt=\"map-repeat\"\r\n class=\"mb-2\" style=\"pointer-events: none;\" allow=\"geolocation 'none'\">\r\n </iframe>\r\n <!-- M\u00F4 t\u1EA3 n\u1ED9i dung c\u1EE7a b\u1EA3n \u0111\u1ED3 -->\r\n <strong class=\"item-name ml-4\">{{ 'mo_ta' | translate }}</strong>\r\n : {{ item['accessibility_title_' + functionService.languageTempCode] || 'B\u1EA3n \u0111\u1ED3' }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n <td>\r\n <a nz-popconfirm [nzPopconfirmTitle]=\"'ban_co_chac_chan_muon_xoa' | translate\"\r\n (nzOnConfirm)=\"deleteRow(dataRow._id)\"><span nz-icon nzType=\"delete\" class=\"btn-delete\"\r\n nzTheme=\"outline\"></span></a>\r\n </td>\r\n </tr>\r\n\r\n <!-- MODAL EDIT -->\r\n <nz-modal [(nzVisible)]=\"isOpenModal\" (nzOnCancel)=\"isOpenModal = false\" [nzFooter]=\"null\">\r\n <ng-container *nzModalContent>\r\n <ng-container *ngIf=\"itemEdit.type == 'image-repeat'\">\r\n <div class=\"image-container\">\r\n <img nz-image width=\"100px\" height=\"100px\" [nzSrc]=\"itemEdit.value\" alt=\"L\u1ED7i h\u00ECnh \u1EA3nh\"\r\n class=\"mb-2 mr-2\" />\r\n <div class=\"image-right\">\r\n <div style=\"margin-bottom: 10px; display:flex; align-items: center; gap: 1rem;\">\r\n <button class=\"_icon_connect _icon_connect_active\">\r\n <!-- icon upload t\u1EEB thi\u1EBFt b\u1ECB -->\r\n <label for=\"upload\" nz-icon nzType=\"upload\" nzTheme=\"outline\" *ngIf=\"source == 'device'\"\r\n (click)=\"startEdit(itemEdit)\"></label>\r\n <input type=\"file\" id=\"upload\" hidden (change)=\"onUpload($event, dataRow)\">\r\n <!-- icon upload t\u1EEB th\u01B0 vi\u1EC7n -->\r\n <span nz-icon nzType=\"picture\" nzTheme=\"outline\" *ngIf=\"source == 'library'\"\r\n (click)=\"startEdit(itemEdit); openLibrary(dataRow)\"></span>\r\n <!-- icon \u1EA3nh mi\u1EC5n ph\u00ED -->\r\n <span nz-icon nzType=\"cloud-upload\" nzTheme=\"outline\" *ngIf=\"source == 'free_img'\"\r\n (click)=\"startEdit(itemEdit); openFreeImage(dataRow)\"></span>\r\n <!-- icon \u0111\u01B0\u1EDDng d\u1EABn \u1EA3nh -->\r\n <span nz-popover nzPopoverTitle=\"{{'duong_dan_anh' | translate}}\" nzPopoverTrigger=\"click\"\r\n [nzPopoverContent]=\"contentTemplate\" nz-icon nzType=\"disconnect\" nzTheme=\"outline\"\r\n *ngIf=\"source == 'url'\">\r\n </span>\r\n <ng-template #contentTemplate>\r\n <input style=\"width: 260px;\" class=\"input mr-1\" type=\"text\" [(ngModel)]=\"itemEdit.value\"\r\n [value]=\"itemEdit.value\" placeholder=\"{{'nhap_duong_dan_lien_ket' | translate}}\">\r\n <span role=\"button\" class=\"text-success\" (click)=\"updateData(dataRow)\">{{'ap_dung' |\r\n translate}}</span>\r\n </ng-template>\r\n\r\n\r\n </button>\r\n\r\n <button *ngIf=\"!itemEdit.value.includes(id_subproject)\" nz-button nzType=\"primary\"\r\n (click)=\"openUploadToServer()\">{{'chuyen_anh_len_server' | translate}}</button>\r\n </div>\r\n <div style=\"margin-bottom: 10px;\">\r\n <nz-select [(ngModel)]=\"source\">\r\n <nz-option *ngFor=\"let source of sources\" [nzValue]=\"source.value\"\r\n [nzLabel]=\"source.label | translate\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <div *ngIf=\"source == 'device'\">\r\n <p class=\"m-0\">{{'nen_anh_tai_len' | translate}}</p>\r\n <nz-select style=\"margin-bottom: 15px\" [(ngModel)]=\"compressType\"\r\n nzPlaceHolder=\"{{'nen_anh_tai_len' | translate}}\" nzAllowClear>\r\n <nz-option [nzValue]=\"'no-compress'\"\r\n nzLabel=\"{{'khong_nen_anh_sau_khi_tai_len' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'custom'\"\r\n nzLabel=\"{{'nen_anh_theo_kich_thuoc_tu_chon' | translate}}\"></nz-option>\r\n </nz-select>\r\n\r\n <div style=\"display:flex; align-items:center; gap: 8px\">\r\n <mat-form-field *ngIf=\"compressType == 'custom'\">\r\n <mat-label>{{'chieu_rong' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_rong' | translate}}\" [(ngModel)]=\"compressWidth\">\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"compressType == 'custom'\">\r\n <mat-label>{{'chieu_cao' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_cao' | translate}}\" [(ngModel)]=\"compressHeight\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- C\u1EADp nh\u1EADt m\u00F4 t\u1EA3 n\u1ED9i dung \u1EA3nh -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\">\r\n <p class=\"title\">{{'cap_nhat_mo_ta_noi_dung' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'noi_dung' | translate}}...\"\r\n [ngModel]=\"itemEdit['accessibility_alt_' + functionService.languageTempCode] || '\u1EA2nh'\"\r\n (ngModelChange)=\"itemEdit['accessibility_alt_' + functionService.languageTempCode] = $event\"\r\n (blur)=\"updateData(dataRow)\" [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\"\r\n nz-tooltip [nzTooltipTitle]=\"'*_giai_thich_aria_label' | translate\"\r\n nzOverlayClassName=\"aria-label-tooltip\">\r\n </textarea>\r\n </div>\r\n\r\n <!-- C\u1EADp nh\u1EADt li\u00EAn k\u1EBFt -->\r\n <div class=\"config-font\">\r\n <!-- type-link -->\r\n <div class=\"type-link\">\r\n <p class=\"type-link__title\">{{'cap_nhat_duong_dan_lien_ket' | translate}}</p>\r\n <nz-select class=\"type-link__select\" [(ngModel)]=\"itemEdit.type_link\"\r\n (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\" nzPlaceHolder=\"{{'chon_kieu_lien_ket' | translate}}\"\r\n allowClear>\r\n <nz-option *ngFor=\"let item of type_link\" [nzValue]=\"item.value\" nzLabel=\"{{item.label | translate}}\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN TRANG -->\r\n <div class=\"connect-page\" *ngIf=\"itemEdit.type_link == 'page_link'\">\r\n <nz-select [(ngModel)]=\"itemEdit.link\" (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\"\r\n nzPlaceHolder=\"{{'chon_trang_lien_ket' | translate}}\" allowClear>\r\n <nz-option *ngFor=\"let page of arr_link_page\" [nzValue]=\"page.link\" \r\n [nzLabel]=\"page['name_' + functionService.selectedLanguageCode] || page.name\">\r\n </nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- LI\u00CAN K\u1EBET \u0110I\u1EC0U H\u01AF\u1EDANG -->\r\n <div class=\"navigation-link\" *ngIf=\"itemEdit.type_link == 'navigation_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"/ten-trang-chi-tiet-san-pham/ten-san-pham\"\r\n [(ngModel)]=\"itemEdit.link\" (blur)=\"getBlocksbyPage();updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('link')\"></span>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN MAIL -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'mailto'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto }) ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"viethas.info@gmail.com\" [(ngModel)]=\"itemEdit.mailto\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('mailto')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto })\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'email_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN S\u1ED0 \u0110I\u1EC6N THO\u1EA0I -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'tel'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.tel ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"0909925354\" [(ngModel)]=\"itemEdit.tel\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('tel')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.tel\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'so_dien_thoai_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- H\u00E0nh \u0111\u1ED9ng khi nh\u1EA5n -->\r\n <div *ngIf=\"itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link'\" class=\"mt-3\">\r\n <label for=\"scroll-select\">{{'hanh_dong_khi_nhan'| translate}}:</label>\r\n <br />\r\n <nz-select id=\"scroll-select\" [(ngModel)]=\"itemEdit.is_scroll\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let item of clickActionOptions\" [nzValue]=\"item.value\" [nzLabel]=\"item.label | translate\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- CU\u1ED8N \u0110\u1EBEN BLOCK -->\r\n <ng-container style=\"width: 100%\" *ngIf=\"(itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link') && itemEdit.is_scroll == 'scroll_to_block'\">\r\n <nz-select style=\"margin: 8px 0\" [nzPlaceHolder]=\"'chon_khoi' | translate\" [(ngModel)]=\"itemEdit.scroll_block_id\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let block of blocks_of_page\" [nzValue]=\"block._id\" [nzLabel]=\"block.name | translate\"></nz-option>\r\n </nz-select>\r\n\r\n <div class=\"form-group\">\r\n <label for=\"scrollDistance\">{{'khoang_cach_chua_ra_de_tranh_menu_co_dinh' | translate }}</label>\r\n <input type=\"number\" nz-input class=\"field-fill\" \r\n [(ngModel)]=\"itemEdit.scroll_distance\"\r\n (input)=\"updateData(dataRow)\" />\r\n </div>\r\n </ng-container>\r\n\r\n \r\n <!-- LI\u00CAN K\u1EBET TRANG KH\u00C1C (URL) -->\r\n <div class=\"connect-link\" *ngIf=\"itemEdit.type_link == 'hyper_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"https://viethas.com/\" [(ngModel)]=\"itemEdit.hyper_link\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('hyper_link')\"></span>\r\n </ng-template>\r\n </div>\r\n\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemEdit.type == 'text-repeat' || itemEdit.type == 'button-repeat' || itemEdit.type == 'popup-repeat'\">\r\n <!-- Ch\u1ECDn ng\u00F4n ng\u1EEF -->\r\n <div class=\"mb-3\">\r\n <app-select-language-config [displayLabel]=\"true\" [isAdmin]=\"true\"></app-select-language-config>\r\n </div>\r\n <!-- C\u1EADp nh\u1EADt ch\u1EEF -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\">\r\n <p class=\"title\">{{'cap_nhat_noi_dung_hien_thi' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'noi_dung' | translate}}...\"\r\n [ngModel]=\"itemEdit['value_' + functionService.languageTempCode] | vhLanguage : mapType[itemEdit.type] : data.component\"\r\n (ngModelChange)=\"itemEdit['value_' + functionService.languageTempCode] = $event\"\r\n (blur)=\"updateData(dataRow)\" [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\"></textarea>\r\n </div>\r\n <ng-container *ngIf=\"itemEdit.type == 'button-repeat' || itemEdit.type == 'popup-repeat'\">\r\n <!-- C\u1EADp nh\u1EADt nh\u00E3n -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\"\r\n *ngIf=\"\r\n (itemEdit['value_' + functionService.languageTempCode] != undefined) && \r\n !itemEdit['value_' + functionService.languageTempCode]?.trim()\r\n \">\r\n <p class=\"title\">{{'cap_nhat_nhan' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'nhan' | translate}}...\"\r\n [ngModel]=\"itemEdit['accessibility_aria_label_' + functionService.languageTempCode] || 'N\u00FAt \u0111i\u1EC1u h\u01B0\u1EDBng'\"\r\n (ngModelChange)=\"itemEdit['accessibility_aria_label_' + functionService.languageTempCode] = $event\"\r\n (blur)=\"updateData(dataRow)\" [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\"\r\n nz-tooltip [nzTooltipTitle]=\"'*_giai_thich_aria_label' | translate\"\r\n nzOverlayClassName=\"aria-label-tooltip\">\r\n </textarea>\r\n </div>\r\n <!-- Bi\u1EC3u t\u01B0\u1EE3ng -->\r\n <div class=\"d-flex justify-content-between mt-1 mb-3 align-items-center\">\r\n <p class=\"title\" style=\"line-height: 1.5; margin: 0\">{{'su_dung_bieu_tuong' | translate}}</p>\r\n <nz-switch [(ngModel)]=\"itemEdit.icon_enable\"></nz-switch>\r\n <div class=\"d-flex justify-content-between\">\r\n <mat-icon>{{ itemEdit.icon_name }}</mat-icon>\r\n <button nz-button nzType=\"default\" (click)=\"openDialogChooseIcon()\"\r\n style=\"border-radius: 6px; border: 2px solid #333\"\r\n [disabled]=\"!itemEdit.icon_enable\">\r\n {{'thay_doi' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- C\u1EADp nh\u1EADt li\u00EAn k\u1EBFt -->\r\n <div class=\"config-font\">\r\n <!-- type-link -->\r\n <div class=\"type-link\">\r\n <p class=\"type-link__title\">{{'cap_nhat_duong_dan_lien_ket' | translate}}</p>\r\n <nz-select class=\"type-link__select\" [(ngModel)]=\"itemEdit.type_link\"\r\n (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\" nzPlaceHolder=\"{{'chon_kieu_lien_ket' | translate}}\"\r\n allowClear>\r\n <nz-option *ngFor=\"let item of type_link\" [nzValue]=\"item.value\" nzLabel=\"{{item.label | translate}}\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN TRANG -->\r\n <div class=\"connect-page\" *ngIf=\"itemEdit.type_link == 'page_link'\">\r\n <nz-select [(ngModel)]=\"itemEdit.link\" (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\"\r\n nzPlaceHolder=\"{{'chon_trang_lien_ket' | translate}}\" allowClear>\r\n <nz-option *ngFor=\"let page of arr_link_page\" [nzValue]=\"page.link || ''\"\r\n [nzLabel]=\"page['name_' + functionService.selectedLanguageCode] || page.name\">\r\n </nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- LI\u00CAN K\u1EBET \u0110I\u1EC0U H\u01AF\u1EDANG -->\r\n <div class=\"navigation-link\" *ngIf=\"itemEdit.type_link == 'navigation_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"/ten-trang-chi-tiet-san-pham/ten-san-pham\"\r\n [(ngModel)]=\"itemEdit.link\" (blur)=\"getBlocksbyPage();updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('link')\"></span>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN MAIL -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'mailto'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto }) ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"viethas.info@gmail.com\" [(ngModel)]=\"itemEdit.mailto\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('mailto')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto })\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'email_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN S\u1ED0 \u0110I\u1EC6N THO\u1EA0I -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'tel'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.tel ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"0909925354\" [(ngModel)]=\"itemEdit.tel\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('tel')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.tel\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'so_dien_thoai_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- H\u00E0nh \u0111\u1ED9ng khi nh\u1EA5n -->\r\n <div *ngIf=\"itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link'\" class=\"mt-3\">\r\n <label for=\"scroll-select\">{{'hanh_dong_khi_nhan'| translate}}:</label>\r\n <br />\r\n <nz-select id=\"scroll-select\" [(ngModel)]=\"itemEdit.is_scroll\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let item of clickActionOptions\" [nzValue]=\"item.value\" [nzLabel]=\"item.label | translate\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- CU\u1ED8N \u0110\u1EBEN BLOCK -->\r\n <ng-container style=\"width: 100%\" *ngIf=\"(itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link') && itemEdit.is_scroll == 'scroll_to_block'\">\r\n <nz-select style=\"margin: 8px 0\" [nzPlaceHolder]=\"'chon_khoi' | translate\" [(ngModel)]=\"itemEdit.scroll_block_id\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let block of blocks_of_page\" [nzValue]=\"block._id\" [nzLabel]=\"block.name | translate\"></nz-option>\r\n </nz-select>\r\n\r\n <div class=\"form-group\">\r\n <label for=\"scrollDistance\">{{'khoang_cach_chua_ra_de_tranh_menu_co_dinh' | translate }}</label>\r\n <input type=\"number\" nz-input class=\"field-fill\" \r\n [(ngModel)]=\"itemEdit.scroll_distance\"\r\n (input)=\"updateData(dataRow)\" />\r\n </div>\r\n </ng-container>\r\n\r\n <!-- LI\u00CAN K\u1EBET TRANG KH\u00C1C (URL) -->\r\n <div class=\"connect-link\" *ngIf=\"itemEdit.type_link == 'hyper_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"https://viethas.com/\" [(ngModel)]=\"itemEdit.hyper_link\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('hyper_link')\"></span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- G\u1ECDi h\u1ED9p tho\u1EA1i -->\r\n <ng-container *ngIf=\"itemEdit.type == 'popup-repeat'\">\r\n <!-- type-link -->\r\n <div class=\"type-link\">\r\n <p class=\"type-link__title\">{{'goi_hop_thoai' | translate}}</p>\r\n <nz-select class=\"type-link__select\" [(ngModel)]=\"itemEdit.id_freeblock\"\r\n (ngModelChange)=\"updateData(dataRow)\" nzPlaceHolder=\"{{'goi_hop_thoai' | translate}}\"\r\n nzAllowClear>\r\n <nz-option *ngFor=\"let block of popupHovers\" [nzValue]=\"block._id\" nzLabel=\"{{block.name | translate}}\"></nz-option>\r\n </nz-select>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemEdit.type == 'date-repeat'\">\r\n <!-- Ch\u1ECDn ng\u00E0y v\u00E0 gi\u1EDD -->\r\n <nz-date-picker\r\n nzShowTime\r\n nzFormat=\"dd-MM-yyyy HH:mm:ss\"\r\n [(ngModel)]=\"itemEdit.value\"\r\n (ngModelChange)=\"onDateTimeChange($event, itemEdit)\"\r\n (nzOnOk)=\"onDateTimeOk($event, dataRow)\"\r\n ></nz-date-picker>\r\n <!-- C\u1EADp nh\u1EADt li\u00EAn k\u1EBFt -->\r\n <div class=\"config-font\">\r\n <!-- type-link -->\r\n <div class=\"type-link\">\r\n <p class=\"type-link__title\">{{'cap_nhat_duong_dan_lien_ket' | translate}}</p>\r\n <nz-select class=\"type-link__select\" [(ngModel)]=\"itemEdit.type_link\"\r\n (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\" nzPlaceHolder=\"{{'chon_kieu_lien_ket' | translate}}\"\r\n allowClear>\r\n <nz-option *ngFor=\"let item of type_link\" [nzValue]=\"item.value\" nzLabel=\"{{item.label | translate}}\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN TRANG -->\r\n <div class=\"connect-page\" *ngIf=\"itemEdit.type_link == 'page_link'\">\r\n <nz-select [(ngModel)]=\"itemEdit.link\" (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\"\r\n nzPlaceHolder=\"{{'chon_trang_lien_ket' | translate}}\" allowClear>\r\n <nz-option *ngFor=\"let page of arr_link_page\" [nzValue]=\"page.link || ''\"\r\n [nzLabel]=\"page['name_' + functionService.selectedLanguageCode] || page.name\">\r\n </nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- LI\u00CAN K\u1EBET \u0110I\u1EC0U H\u01AF\u1EDANG -->\r\n <div class=\"navigation-link\" *ngIf=\"itemEdit.type_link == 'navigation_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"/ten-trang-chi-tiet-san-pham/ten-san-pham\"\r\n [(ngModel)]=\"itemEdit.link\" (blur)=\"getBlocksbyPage();updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('link')\"></span>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN MAIL -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'mailto'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto }) ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"viethas.info@gmail.com\" [(ngModel)]=\"itemEdit.mailto\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('mailto')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto })\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'email_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN S\u1ED0 \u0110I\u1EC6N THO\u1EA0I -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'tel'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.tel ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"0909925354\" [(ngModel)]=\"itemEdit.tel\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('tel')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.tel\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'so_dien_thoai_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- H\u00E0nh \u0111\u1ED9ng khi nh\u1EA5n -->\r\n <div *ngIf=\"itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link'\" class=\"mt-3\">\r\n <label for=\"scroll-select\">{{'hanh_dong_khi_nhan'| translate}}:</label>\r\n <br />\r\n <nz-select id=\"scroll-select\" [(ngModel)]=\"itemEdit.is_scroll\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let item of clickActionOptions\" [nzValue]=\"item.value\" [nzLabel]=\"item.label | translate\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- CU\u1ED8N \u0110\u1EBEN BLOCK -->\r\n <ng-container style=\"width: 100%\" *ngIf=\"(itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link') && itemEdit.is_scroll == 'scroll_to_block'\">\r\n <nz-select style=\"margin: 8px 0\" [nzPlaceHolder]=\"'chon_khoi' | translate\" [(ngModel)]=\"itemEdit.scroll_block_id\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let block of blocks_of_page\" [nzValue]=\"block._id\" [nzLabel]=\"block.name | translate\"></nz-option>\r\n </nz-select>\r\n\r\n <div class=\"form-group\">\r\n <label for=\"scrollDistance\">{{'khoang_cach_chua_ra_de_tranh_menu_co_dinh' | translate }}</label>\r\n <input type=\"number\" nz-input class=\"field-fill\" \r\n [(ngModel)]=\"itemEdit.scroll_distance\"\r\n (input)=\"updateData(dataRow)\" />\r\n </div>\r\n </ng-container>\r\n\r\n <!-- LI\u00CAN K\u1EBET TRANG KH\u00C1C (URL) -->\r\n <div class=\"connect-link\" *ngIf=\"itemEdit.type_link == 'hyper_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"https://viethas.com/\" [(ngModel)]=\"itemEdit.hyper_link\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('hyper_link')\"></span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemEdit.type == 'video-repeat'\">\r\n <!-- text-area url -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\">\r\n <p class=\"title\">{{'cap_nhat_noi_dung_hien_thi' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'noi_dung' | translate}}...\"\r\n [(ngModel)]=\"itemEdit['iframe']\"\r\n (blur)=\"updateVideoRepeat('is_mute', $event);updateData(dataRow)\"\r\n [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\">\r\n </textarea>\r\n\r\n <button nzType=\"primary\" nz-button (click)=\"isOpenGuideVideo = true\"\r\n class=\"_btn _btn_add d-flex align-items-center right-all-content mr-2 my-2\">\r\n {{'huong_dan_khach_hang_chen_video_youtube' | translate}}\r\n </button>\r\n\r\n <!-- \u00C2M THANH -->\r\n <div class=\"border-type mt-4\">\r\n <h4>{{'am_thanh' | translate}}</h4>\r\n <nz-switch [(ngModel)]=\"itemEdit.is_mute\" (ngModelChange)=\"updateVideoRepeat('is_mute', $event);updateData(dataRow)\"></nz-switch>\r\n </div>\r\n \r\n <!-- T\u1EF0 \u0110\u1ED8NG L\u1EB6P -->\r\n <div class=\"border-type\">\r\n <h4>{{'tu_dong_lap' | translate}}</h4>\r\n <nz-switch [(ngModel)]=\"itemEdit.loop\" (ngModelChange)=\"updateVideoRepeat('loop', $event);updateData(dataRow)\"></nz-switch>\r\n </div>\r\n \r\n <!-- TH\u00C0NH C\u00D4NG C\u1EE4 -->\r\n <div class=\"border-type\">\r\n <h4>{{'thanh_cong_cu' | translate}}</h4>\r\n <nz-switch [(ngModel)]=\"itemEdit.controls\"\r\n (ngModelChange)=\"updateVideoRepeat('controls', $event);updateData(dataRow)\"></nz-switch>\r\n </div>\r\n \r\n <!-- T\u1EF0 \u0110\u1ED8NG PH\u00C1T -->\r\n <!-- autoplay ph\u1EA3i \u0111i v\u1EDBi mute, n\u00EAn n\u1EBFu kh\u00F4ng mute th\u00EC autoplay s\u1EBD t\u1EF1 \u0111\u1ED9ng set false (Xem t\u1EA1i https://developer.chrome.com/blog/autoplay/) -->\r\n <div *ngIf=\"!itemEdit.is_mute\" class=\"border-type\">\r\n <h4>{{'tu_dong_phat' | translate}}</h4>\r\n <nz-switch [(ngModel)]=\"itemEdit.autoplay\"\r\n (ngModelChange)=\"updateVideoRepeat('autoplay', $event);updateData(dataRow)\"></nz-switch>\r\n </div>\r\n\r\n <!-- C\u1EACP NH\u1EACT M\u00D4 T\u1EA2 N\u1ED8I DUNG C\u1EE6A VIDEO -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\">\r\n <p class=\"title\">{{'cap_nhat_mo_ta_noi_dung' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'noi_dung' | translate}}...\"\r\n [ngModel]=\"itemEdit['accessibility_title_' + functionService.languageTempCode] || 'Video youtube'\"\r\n (ngModelChange)=\"itemEdit['accessibility_title_' + functionService.languageTempCode] = $event\"\r\n (blur)=\"updateData(dataRow)\" [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\"\r\n nz-tooltip [nzTooltipTitle]=\"'*_giai_thich_aria_label' | translate\"\r\n nzOverlayClassName=\"aria-label-tooltip\">\r\n </textarea>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemEdit.type == 'map-repeat'\">\r\n <nz-radio-group [(ngModel)]=\"radioValue\">\r\n <label nz-radio nzValue=\"location\">{{ 'nhap_dia_chi' | translate }}</label>\r\n <label nz-radio nzValue=\"iframe\">{{ 'dung_the_nhung' | translate }}</label>\r\n </nz-radio-group>\r\n <!-- Th\u00EAm \u0111\u1ECBa ch\u1EC9 b\u1EB1ng c\u00E1ch nh\u1EADp -->\r\n <div class=\"container-font\" *ngIf=\"radioValue == 'location'\">\r\n <div class=\"config-text\" style=\"width:100%\">\r\n <mat-form-field style=\"width:100%\">\r\n <mat-label>{{ 'nhap_dia_chi' | translate }} </mat-label>\r\n <textarea matInput [(ngModel)]=\"itemEdit.local\" (blur)=\"getLocal_atwMapRepeat(itemEdit, dataRow)\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <!-- Th\u00EAm \u0111\u1ECBa ch\u1EC9 b\u1EB1ng iframe -->\r\n <div *ngIf=\"radioValue == 'iframe'\" class=\"map__item--change-link\">\r\n <div>\r\n <input #myInput nz-input \r\n placeholder=\"<iframe src='https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3919.3565404084443!2d106' width='600' height='450' style='border:0;' allowfullscreen='' loading='lazy' referrerpolicy='no-referrer-when-downgrade'></iframe>\"\r\n class=\"input_iframe form-group\" nzSize=\"large\" [(ngModel)]=\"itemEdit.iframe\" />\r\n </div>\r\n <div class=\"map__item--change-link--button d-flex flex-column\">\r\n <button nz-button nzType=\"primary\" (click)=\"getLink_atwMapRepeat(itemEdit, dataRow)\">{{'cap_nhat' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <button nzType=\"primary\" nz-button (click)=\"isOpenGuideMap = true\"\r\n class=\"_btn _btn_add d-flex align-items-center right-all-content mr-2 my-2\">\r\n {{ 'huong_dan_khach_hang_chen_ban_do' | translate }}\r\n </button>\r\n\r\n <!-- C\u1EACP NH\u1EACT M\u00D4 T\u1EA2 N\u1ED8I DUNG C\u1EE6A B\u1EA2N \u0110\u1ED2 -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\">\r\n <p class=\"title\">{{'cap_nhat_mo_ta_noi_dung' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'noi_dung' | translate}}...\"\r\n [ngModel]=\"itemEdit['accessibility_title_' + functionService.languageTempCode] || 'B\u1EA3n \u0111\u1ED3'\"\r\n (ngModelChange)=\"itemEdit['accessibility_title_' + functionService.languageTempCode] = $event\"\r\n (blur)=\"updateData(dataRow)\" [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\"\r\n nz-tooltip [nzTooltipTitle]=\"'*_giai_thich_aria_label' | translate\"\r\n nzOverlayClassName=\"aria-label-tooltip\">\r\n </textarea>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </nz-modal>\r\n\r\n <!-- Modal Chuy\u1EC3n \u1EA3nh l\u00EAn server -->\r\n <nz-modal nzTitle=\"{{ 'chuyen_anh_len_server' | translate}}\" [(nzVisible)]=\"isShowUploadToServer\"\r\n (nzOnCancel)=\"cancelUploadToServer()\" [nzContent]=\"modalContent\" [nzFooter]=\"modalFooter\">\r\n <ng-template #modalContent>\r\n <p>{{'nen_anh_tai_len' | translate}}</p>\r\n <nz-select style=\"margin-bottom: 15px\" [(ngModel)]=\"compressType\"\r\n nzPlaceHolder=\"{{'nen_anh_tai_len' | translate}}\" nzAllowClear>\r\n <nz-option [nzValue]=\"'no-compress'\"\r\n nzLabel=\"{{'khong_nen_anh_sau_khi_tai_len' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'custom'\" nzLabel=\"{{'nen_anh_theo_kich_thuoc_tu_chon' | translate}}\"></nz-option>\r\n </nz-select>\r\n\r\n <mat-form-field *ngIf=\"compressType == 'custom'\" class=\"mr-4\">\r\n <mat-label>{{'chieu_rong' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_rong' | translate}}\" [(ngModel)]=\"compressWidth\">\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"compressType == 'custom'\">\r\n <mat-label>{{'chieu_cao' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_cao' | translate}}\" [(ngModel)]=\"compressHeight\">\r\n </mat-form-field>\r\n </ng-template>\r\n <ng-template #modalFooter>\r\n <button nz-button nzType=\"default\" (click)=\"cancelUploadToServer()\">{{'khong' | translate}}</button>\r\n <button nz-button nzType=\"primary\" (click)=\"okUploadToServer(itemEdit)\"\r\n [nzLoading]=\"uploadToServerLoading\">{{'dong_y' | translate}}</button>\r\n </ng-template>\r\n </nz-modal>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</nz-layout>\r\n\r\n<!-- ------------------------------------------------- H\u1ED8P THO\u1EA0I H\u01AF\u1EDANG D\u1EAAN CH\u00C8N MAP -------------------------------------------------- -->\r\n<nz-modal [(nzVisible)]=\"isOpenGuideMap\" (nzOnCancel)=\"isOpenGuideMap = false\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{ height: '80vh', top: '32px', overflowY : 'scroll'}\" [nzWidth]=\"'70%'\">\r\n <ng-container *nzModalContent>\r\n <div class=\"modal-success\">\r\n <h4 class=\"title\">\r\n {{ 'huong_dan_khach_hang_chen_ban_do_vao_trang_web' | translate }}\r\n </h4>\r\n <span>\r\n <i class=\"bi bi-x-lg\"></i>\r\n </span>\r\n <div class=\"list-image\">\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/map_b1.jpg\" alt=\"image 1\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 1: {{ 'truy_cap_vao_duong_dan' | translate }} <a href=\"https://www.google.com/maps\"\r\n target=\"_blank\">https://www.google.com/maps</a>\r\n </div>\r\n </div>\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/map_b1b2.jpg\" alt=\"image 2\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 2: {{ 'nhap_dia_chi_ban_muon_chia_se_hoac_chen' | translate }}. {{ 'sau_khi_ban_do_da_chon_chinh_xac_vi_tri_ma_dia_chi_vua_nhap' | translate }},\r\n <span style=\"color:#00a859\"> {{ 'nhan_vao' | translate }} <span style=\"font-weight: bold\">{{ 'nut_chia_se' | translate }}.</span></span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"list-image pt-3\">\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/map_b1b3.jpg\" alt=\"image 3\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 3: {{ 'nhan_vao' | translate }} <span style=\"color: black\">{{ 'tab_nhung_ban_do' | translate }}</span> \r\n <span style=\"color:#00a859; font-weight: bold;\"> & {{ 'nhan_nut_sao_chep_html' | translate }}.</span>\r\n </div>\r\n </div>\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/map_b1b4.jpg\" alt=\"image 4\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 4: <span style=\"color:#00a859\"> {{ 'dan_ma_nhung_vao_o_duong_dan_sau_do_nhan' | translate }} \r\n <span style=\"font-weight: bold;\">{{ 'nut_cap_nhat' | translate }}</span> </span> {{ 'de_he_thong_lay_ban_do_ve' | translate }}.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<!-- ------------------------------------------------- H\u1ED8P THO\u1EA0I H\u01AF\u1EDANG D\u1EAAN CH\u00C8N VIDEO -------------------------------------------------- -->\r\n<nz-modal [(nzVisible)]=\"isOpenGuideVideo\" (nzOnCancel)=\"isOpenGuideVideo = false\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{ height: '500px', top: ' 10px' }\" [nzWidth]=\"'70%'\">\r\n <ng-container *nzModalContent>\r\n <div class=\"modal-success\">\r\n <h4 class=\"title\">\r\n {{'huong_dan_khach_hang_chen_video_youtube_vao_trang_web' | translate}}\r\n </h4>\r\n <span>\r\n <i class=\"bi bi-x-lg\"></i>\r\n </span>\r\n <div class=\"list-image\">\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/video_B1.jpg\" alt=\"image 1\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 1: {{ 'truy_cap_vao_video_tren_youtube_muon_chen_sau_do' | translate }}\r\n <span style=\"color:#00a859\"> {{ 'nhan_vao' | translate }}\r\n <span style=\"font-weight: bold;\"> {{ 'nut' | translate}} Share</span>\r\n </span> {{ 'o_duoi_video' | translate }}.\r\n </div>\r\n </div>\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/video_b2.jpg\" alt=\"image_2\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 2: \r\n <span style=\"color:#00a859\">{{ 'nhan_vao' | translate }} <span style=\"font-weight: bold;\">{{ 'nut' | translate}} Embed</span></span>\r\n {{ 'de_lay_ma_nhung' | translate }}.\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"list-image pt-2\">\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/video_b3.jpg\" alt=\"image 3\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 3: \r\n <span style=\"color:#00a859\">{{ 'nhan_vao' | translate }} <span style=\"font-weight: bold;\">{{ 'nut' | translate}} Copy</span></span>,\r\n {{ 'he_thong_tu_dong_sao_chep_ma_nhung_cua_video' | translate }}.\r\n </div>\r\n </div>\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/video_b4.jpg\" alt=\"image 3\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 4: \r\n <span style=\"color:#00a859\">{{ 'dan_ma_nhung_vao_o_duong_dan_sau_do_nhan' | translate }} \r\n <span style=\"font-weight: bold;\">{{ 'nut_cap_nhat' | translate }}</span> \r\n </span> {{ 'de_he_thong_lay_video_tu_youtube_ve' | translate }}.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</nz-modal>", styles: ["nz-layout{background:#ffffff 0% 0% no-repeat padding-box;padding:16px;height:100%}nz-layout .title{color:var(--ion-color-vh-green);font-size:1.1rem}nz-layout ._btn{border-radius:18px!important;font-size:.9rem}nz-layout ._btn_add{color:#fff;background:#008848 0% 0% no-repeat padding-box;border:1px solid #008848}nz-layout ._btn_add span{color:#fff}nz-layout ._btn_soft{color:#373737;background:#ffffff 0% 0% no-repeat padding-box;border:1px solid #c8c7cc}nz-layout ._btn_soft span{color:#373737}nz-layout ._btn_delete{color:#fff;background:#ff000a 0% 0% no-repeat padding-box;border:1px solid #ff000a}nz-layout ._btn_delete span{color:#fff}nz-layout .search{justify-content:flex-end;display:flex;position:relative}nz-layout .search nz-input-group{border-radius:18px}nz-layout .search input{width:20rem}nz-layout nz-table{font-size:14px!important}nz-layout nz-table th.ant-table-cell{background-color:#529bfc;color:#fff}nz-layout nz-table tbody .icon-action span{font-size:18px;cursor:pointer}nz-layout nz-table tbody .icon-action span:first-child{color:var(--ion-color-vh-green);margin-right:8px}nz-layout nz-table tbody .icon-action span:nth-child(2){color:var(--ion-color-vh-red)}nz-layout nz-table ._select{color:#373737;font-weight:500;text-align:left;display:inline-flex;align-items:center;font-size:14px}nz-layout nz-table ._select ._option{color:#373737;background-color:#fff;font-weight:500;border-radius:5px;text-align:left;margin:8px!important;padding:8px!important;font-size:14px}nz-layout nz-table ._select ._option:hover{color:#fff;background-color:#00a859;cursor:pointer}nz-layout nz-table ._select:focus{outline:none;box-shadow:0 0 0 1px #cbcbcb}nz-layout nz-table ::ng-deep .ant-table-header.nz-table-hide-scrollbar{display:contents}nz-layout nz-table ::ng-deep .ant-select:not(.ant-select-customize-input) .ant-select-selector{border-radius:18px!important}nz-layout .input-container{display:flex;background-color:var(--ion-color-vh-green);color:#fff}nz-layout .goto-page{padding:6px 18px;display:flex;align-items:center;justify-content:center;cursor:pointer}.pagiItem.active{background-color:var(--ion-color-vh-green);color:#fff!important}.ant-input-affix-wrapper{border:1px solid #c8c7cc;border-radius:5px}.pagination{display:flex;align-items:center;justify-content:center}.pagiItem{padding:8px 16px;cursor:pointer;color:var(--ion-color-vh-green);border-top:1px solid #ddd;border-bottom:1px solid #ddd;border-right:1px solid #ddd}.pagiItem:nth-child(1){border-left:1px solid #ddd}.page-go{background-color:#a54f4e;color:#fff}.pagination-list-button{display:flex}.ant-btn{border:none!important}:host ::ng-deep .nz-table .custom-tbody{min-height:350px}.editable-cell{position:relative;padding:5px 12px;cursor:pointer;margin-bottom:10px;display:flex}.editable-cell:hover{outline:1px solid #d9d9d9;border-radius:4px}.image-container{display:flex}.type-link__title,.type-link{margin-bottom:5px}.btn-upload,.btn-add{color:#fff;background-color:#008848;padding:4px 14px;text-align:center}.btn-delete{color:red}label{margin:0}.item-name{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:-moz-fit-content;width:fit-content;display:inline-block}.title-admin{font-size:18px;font-weight:bold;color:#008848;text-align:center;margin:15px 15px 15px 0}._icon_connect{display:flex;justify-content:center;align-items:center;align-self:center;color:#008848;width:25px;height:25px;padding:0;border:1px solid #c8c7cc;border-radius:50%;background-color:#fff;line-height:normal;margin-bottom:-4px}._icon_connect:hover{border-color:#008848}._icon_connect_active{border-color:#008848!important}.image-right{width:100%}.modal-success .title{display:flex;color:var(--ion-color-vh-green);font-weight:bold;justify-content:center;align-items:center;font-size:18px;margin-bottom:20px}.modal-success .list-image{display:flex;justify-content:space-around}.modal-success .list-image .item-image{width:40%;align-items:center}.modal-success .list-image .item-image .note-content{padding:10px 0;text-align:center}.aria-label-tooltip .ant-tooltip-inner{text-align:justify!important;white-space:pre-line!important}.border-type{display:flex;justify-content:space-between}.config-font .title{margin-bottom:4px;margin-top:8px}\n"], components: [{ type: i4.NzLayoutComponent, selector: "nz-layout", exportAs: ["nzLayout"] }, { type: SelectLanguageConfigComponent, selector: "app-select-language-config", inputs: ["isAdmin", "displayLabel", "isSetLanguageCode", "languages"], outputs: ["handleChangeMultiLanguage"] }, { type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { type: i7.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange"], exportAs: ["nzTable"] }, { type: i7.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { type: i7.NzTbodyComponent, selector: "tbody" }, { type: i12$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4$1.NzModalComponent, selector: "nz-modal", inputs: ["nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzZIndex", "nzWidth", "nzCloseIcon", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel", "nzTitle", "nzFooter", "nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzContent", "nzComponentParams", "nzWrapClassName", "nzClassName", "nzStyle", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { type: i6$1.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { type: i6$1.NzOptionComponent, selector: "nz-option", inputs: ["nzLabel", "nzValue", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i5.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzSize", "nzSearch", "nzCompact", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzSuffix"], exportAs: ["nzInputGroup"] }, { type: i10.NzSwitchComponent, selector: "nz-switch", inputs: ["nzLoading", "nzDisabled", "nzControl", "nzCheckedChildren", "nzUnCheckedChildren", "nzSize"], exportAs: ["nzSwitch"] }, { type: i16$1.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzPlaceHolder", "nzPopupStyle", "nzSize", "nzShowToday", "nzMode", "nzShowNow", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzShowTime", "nzFormat", "nzLocale", "nzOpen", "nzDisabledDate", "nzDropdownClassName", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzRanges"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { type: i5$2.NzRadioGroupComponent, selector: "nz-radio-group", inputs: ["nzDisabled", "nzButtonStyle", "nzSize", "nzName"], exportAs: ["nzRadioGroup"] }, { type: i5$2.NzRadioComponent, selector: "[nz-radio],[nz-radio-button]", inputs: ["nzValue", "nzDisabled", "nzAutoFocus"], exportAs: ["nzRadio"] }], directives: [{ type: i17.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i7.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { type: i7.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { type: i7.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { type: i12$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "disabled"], exportAs: ["nzInput"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i12$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i22.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus", "nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nz-popconfirm", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDanger", "nzCancelText", "nzIcon"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { type: i18.NzIconDirective, selector: "[nz-icon]", inputs: ["nzRotate", "nzSpin", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i4$1.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { type: i5$3.NzImageDirective, selector: "img[nz-image]", inputs: ["nzSrc", "nzSrcset", "nzDisablePreview", "nzFallback", "nzPlaceholder"], exportAs: ["nzImage"] }, { type: i16.NzPopoverDirective, selector: "[nz-popover]", inputs: ["nzPopoverTrigger", "nzPopoverPlacement", "nzPopoverBackdrop", "nzPopoverArrowPointAtCenter", "nzPopoverTitle", "nzPopoverContent", "nz-popover", "nzPopoverOrigin", "nzPopoverVisible", "nzPopoverMouseEnterDelay", "nzPopoverMouseLeaveDelay", "nzPopoverOverlayClassName", "nzPopoverOverlayStyle"], outputs: ["nzPopoverVisibleChange"], exportAs: ["nzPopover"] }, { type: i5$1.MatLabel, selector: "mat-label" }, { type: i15.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i5.NzAutosizeDirective, selector: "textarea[nzAutosize]", inputs: ["nzAutosize"], exportAs: ["nzAutosize"] }, { type: i21.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitleContext", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipTitle", "nz-tooltip", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { type: i5.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { type: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }], pipes: { "translate": i12$2.TranslatePipe, "vhLanguage": VhLanguagePipe, "date": i12$1.DatePipe } });
|
|
5449
|
+
AtwFrameRepeatAdmin.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AtwFrameRepeatAdmin, selector: "atw-frame-repeat-admin", inputs: { data: "data", type: "type" }, usesOnChanges: true, ngImport: i0, template: "<!-- TABLE \u1EDE TRANG ADMIN -->\r\n<nz-layout id=\"purchase-invoice-today\">\r\n <!-- Ph\u1EA7n header -->\r\n <div class=\"purchase-invoice-today-header\">\r\n <div class=\"row p-0 m-0\">\r\n <div class=\"col-4 p-0 m-0 d-flex align-items-center\">\r\n \r\n </div>\r\n <div class=\"col-4 p-0 m-0 d-flex align-items-center justify-content-center\">\r\n <!-- Ch\u1ECDn thi\u1EBFt b\u1ECB -->\r\n <div *ngIf=\"showChooseDevice\" class=\"device\">\r\n <div *ngIf=\"subproject.desktop_template_display\" class=\"icon-field p-2\" role=\"button\"\r\n [class.active]=\"deviceTemp == 'desktop'\" (click)=\"deviceTemp = 'desktop'\">\r\n <span nz-icon [nzType]=\"'desktop'\" nzTheme=\"outline\" data-toggle=\"tooltip\" [title]=\"'desktop'\"\r\n nz-tooltip nzTooltipTitle=\"{{'may_tinh' | translate}}\" nzTooltipPlacement=\"bottom\"></span>\r\n </div>\r\n <div *ngIf=\"subproject.tablet_landscape_template_display\" class=\"icon-field p-2\" role=\"button\"\r\n [class.active]=\"deviceTemp == 'tablet_landscape'\" (click)=\"deviceTemp = 'tablet_landscape'\">\r\n <span nz-icon style=\"transform: rotate(90deg); scale: 1.2\" [nzType]=\"'tablet'\" nzTheme=\"outline\"\r\n data-toggle=\"tooltip\" [title]=\"'tablet'\" nz-tooltip\r\n nzTooltipTitle=\"{{'may_tinh_bang_ngang' | translate}}\" nzTooltipPlacement=\"bottom\"></span>\r\n </div>\r\n <div *ngIf=\"subproject.tablet_portrait_template_display\" class=\"icon-field p-2\" role=\"button\"\r\n [class.active]=\"deviceTemp == 'tablet_portrait'\" (click)=\"deviceTemp = 'tablet_portrait'\">\r\n <span nz-icon style=\"scale: 1.2\" [nzType]=\"'tablet'\" nzTheme=\"outline\" data-toggle=\"tooltip\"\r\n [title]=\"'tablet'\" nz-tooltip nzTooltipTitle=\"{{'may_tinh_bang_doc' | translate}}\"\r\n nzTooltipPlacement=\"bottom\"></span>\r\n </div>\r\n <div *ngIf=\"subproject.mobile_landscape_template_display\" class=\"icon-field p-2\" role=\"button\"\r\n [class.active]=\"deviceTemp == 'mobile_landscape'\" (click)=\"deviceTemp = 'mobile_landscape'\">\r\n <span nz-icon style=\"transform: rotate(90deg)\" [nzType]=\"'mobile'\" nzTheme=\"outline\"\r\n data-toggle=\"tooltip\" [title]=\"'mobile'\" nz-tooltip\r\n nzTooltipTitle=\"{{'dien_thoai_ngang' | translate}}\" nzTooltipPlacement=\"bottom\"></span>\r\n </div>\r\n <div *ngIf=\"subproject.mobile_portrait_template_display\" class=\"icon-field p-2\" role=\"button\"\r\n [class.active]=\"deviceTemp == 'mobile_portrait'\" (click)=\"deviceTemp = 'mobile_portrait'\">\r\n <span nz-icon [nzType]=\"'mobile'\" nzTheme=\"outline\" data-toggle=\"tooltip\" [title]=\"'mobile'\" nz-tooltip\r\n nzTooltipTitle=\"{{'dien_thoai_doc' | translate}}\" nzTooltipPlacement=\"bottom\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- N\u00FAt th\u00EAm s\u1EA3n ph\u1EA9m v\u00E0o frame -->\r\n <div class=\"col-4 p-0 m-0 d-flex align-items-center justify-content-end\">\r\n <!-- Ch\u1ECDn ng\u00F4n ng\u1EEF -->\r\n <div class=\"mr-2\">\r\n <app-select-language-config [isAdmin]=\"true\"></app-select-language-config>\r\n </div>\r\n <button nzType=\"primary\" class=\"_btn _btn_add d-flex align-items-center right-all-content mr-2\" nz-button\r\n (click)=\"handleAddData()\">\r\n {{\r\n 'them_du_lieu' | translate\r\n }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Ph\u1EA7n table -->\r\n <div style=\"margin-top: 16px; height: 500px\">\r\n <nz-table #editRowTable nzBordered [nzData]=\"listOfData\" [nzLoading]=\"loading\" [nzTotal]=\"total\" nzShowSizeChanger\r\n [nzPageSizeOptions]=\"[5, 10, 20, 50]\" [nzPageSize]=\"pageSize\" [nzPageIndex]=\"pageIndex\" [nzScroll]=\"{ y: '400px' }\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"10%\">{{'STT' | translate}}</th>\r\n <th nzWidth=\"80%\">{{'doi_tuong' | translate}}</th>\r\n <th nzWidth=\"10%\">{{'thao_tac'| translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let dataRow of editRowTable.data\">\r\n <td>\r\n <div class=\"editable-cell\" [hidden]=\"itemEdit?._id === dataRow._id\" (click)=\"itemEdit = dataRow;\">\r\n {{ dataRow.sort }}\r\n </div>\r\n <input [hidden]=\"itemEdit?._id !== dataRow._id\" type=\"text\" nz-input [(ngModel)]=\"dataRow.sort\"\r\n (blur)=\"updateOrdinal(dataRow)\" />\r\n </td>\r\n\r\n <td>\r\n <ng-container *ngFor=\"let item of dataRow.data\">\r\n <ng-container *ngIf=\"item.type == 'image-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>:\r\n <img\r\n width=\"100px\" height=\"100px\"\r\n [src]=\"item[deviceTemp + '_value'] || item.value\"\r\n alt=\"image-repeat\" class=\"mb-2 item-img\"\r\n />\r\n <!-- M\u00F4 t\u1EA3 n\u1ED9i dung c\u1EE7a \u1EA3nh -->\r\n <strong class=\"item-name ml-4\">{{ 'mo_ta' | translate }}</strong>\r\n : {{ item['accessibility_alt_' + functionService.languageTempCode] || '\u1EA2nh' }}\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'text-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>: {{ item['value_' +\r\n functionService.languageTempCode] | vhLanguage : 'value' : data.component }}\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'button-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>\r\n : {{ item['value_' + functionService.languageTempCode] | vhLanguage : 'button' : data.component }}\r\n <ng-container *ngIf=\"\r\n (item['value_' + functionService.languageTempCode] != undefined) && \r\n !item['value_' + functionService.languageTempCode]?.trim()\r\n \">\r\n <strong class=\"item-name ml-4\">{{ 'nhan' | translate }}</strong>\r\n : {{ item['accessibility_aria_label_' + functionService.languageTempCode] || 'N\u00FAt \u0111i\u1EC1u h\u01B0\u1EDBng' }}\r\n </ng-container>\r\n <ng-container *ngIf=\"item.icon_enable\">\r\n <strong class=\"item-name ml-4\">{{ 'bieu_tuong' | translate }}</strong>\r\n : <mat-icon *ngIf=\"item.icon_name\">{{ item.icon_name }}</mat-icon>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'popup-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>\r\n : {{ item['value_' + functionService.languageTempCode] | vhLanguage : 'popup' : data.component }}\r\n <ng-container *ngIf=\"\r\n (item['value_' + functionService.languageTempCode] != undefined) && \r\n !item['value_' + functionService.languageTempCode]?.trim()\r\n \">\r\n <strong class=\"item-name ml-4\">{{ 'nhan' | translate }}</strong>\r\n : {{ item['accessibility_aria_label_' + functionService.languageTempCode] || 'N\u00FAt g\u1ECDi h\u1ED9p tho\u1EA1i' }}\r\n </ng-container>\r\n <ng-container *ngIf=\"item.icon_enable\">\r\n <strong class=\"item-name ml-4\">{{ 'bieu_tuong' | translate }}</strong>\r\n : <mat-icon *ngIf=\"item.icon_name\">{{ item.icon_name }}</mat-icon>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'date-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>: {{ item.value | date: 'dd-MM-yyyy HH:mm:ss ' }}\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'video-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\"> \r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>:\r\n <iframe width=\"150px\" height=\"100px\" [src]=\"sanitizer.bypassSecurityTrustResourceUrl(item.value)\" alt=\"video-repeat\" class=\"mb-2\">\r\n </iframe>\r\n <!-- M\u00F4 t\u1EA3 n\u1ED9i dung c\u1EE7a video -->\r\n <strong class=\"item-name ml-4\">{{ 'mo_ta' | translate }}</strong>\r\n : {{ item['accessibility_title_' + functionService.languageTempCode] || 'Video youtube' }}\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"item.type == 'map-repeat'\">\r\n <div class=\"editable-cell\" (click)=\"chooseItemEdit(item, dataRow)\">\r\n <strong class=\"item-name\">{{ findObjectName(item) }}</strong>: \r\n <iframe width=\"200px\" height=\"100px\" scrolling=\"no\" loading=\"lazy\"\r\n [src]=\"sanitizer.bypassSecurityTrustResourceUrl(item.value)\"\r\n referrerpolicy=\"no-referrer-when-downgrade\" alt=\"map-repeat\"\r\n class=\"mb-2\" style=\"pointer-events: none;\" allow=\"geolocation 'none'\">\r\n </iframe>\r\n <!-- M\u00F4 t\u1EA3 n\u1ED9i dung c\u1EE7a b\u1EA3n \u0111\u1ED3 -->\r\n <strong class=\"item-name ml-4\">{{ 'mo_ta' | translate }}</strong>\r\n : {{ item['accessibility_title_' + functionService.languageTempCode] || 'B\u1EA3n \u0111\u1ED3' }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n <td>\r\n <a nz-popconfirm [nzPopconfirmTitle]=\"'ban_co_chac_chan_muon_xoa' | translate\"\r\n (nzOnConfirm)=\"deleteRow(dataRow._id)\"><span nz-icon nzType=\"delete\" class=\"btn-delete\"\r\n nzTheme=\"outline\"></span></a>\r\n </td>\r\n </tr>\r\n\r\n <!-- MODAL EDIT -->\r\n <nz-modal [(nzVisible)]=\"isOpenModal\" (nzOnCancel)=\"isOpenModal = false\" [nzFooter]=\"null\">\r\n <ng-container *nzModalContent>\r\n <ng-container *ngIf=\"itemEdit.type == 'image-repeat'\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-4 mb-2\">\r\n <span>{{'chon_thiet_bi' | translate}}: </span>\r\n <nz-select style=\"width: 80%\" [ngModel]=\"deviceTemp\" (ngModelChange)=\"deviceTemp = $event\"\r\n nzPlaceHolder=\"{{'chon_thiet_bi' | translate}}\" nzAllowClear>\r\n <ng-container *ngFor=\"let d of functionService.devices\">\r\n <nz-option *ngIf=\"subproject?.[d.value + '_template_display']\"\r\n [nzValue]=\"d.value\" nzLabel=\"{{d.label | translate}}\"\r\n ></nz-option>\r\n </ng-container>\r\n </nz-select>\r\n </div>\r\n <div class=\"image-container\">\r\n <img \r\n nz-image width=\"100px\" height=\"100px\" alt=\"L\u1ED7i h\u00ECnh \u1EA3nh\" class=\"mb-2 mr-2\"\r\n [nzSrc]=\"itemEdit[deviceTemp + '_value'] || itemEdit.value\"\r\n nz-tooltip nzTooltipPlacement=\"left\"\r\n [nzTooltipTitle]=\"itemEdit[deviceTemp + '_value']?.includes(id_subproject) ? tooltipImgInfo : null\"\r\n />\r\n <div class=\"image-right\">\r\n <div style=\"margin-bottom: 10px; display:flex; align-items: center; gap: 1rem;\">\r\n <button class=\"_icon_connect _icon_connect_active\">\r\n <!-- icon upload t\u1EEB thi\u1EBFt b\u1ECB -->\r\n <label for=\"upload\" nz-icon nzType=\"upload\" nzTheme=\"outline\" *ngIf=\"source == 'device'\"\r\n (click)=\"startEdit(itemEdit)\"></label>\r\n <input type=\"file\" id=\"upload\" hidden (change)=\"onUpload($event, dataRow)\">\r\n <!-- icon upload t\u1EEB th\u01B0 vi\u1EC7n -->\r\n <span nz-icon nzType=\"picture\" nzTheme=\"outline\" *ngIf=\"source == 'library'\"\r\n (click)=\"startEdit(itemEdit); openLibrary(dataRow)\"></span>\r\n <!-- icon \u1EA3nh mi\u1EC5n ph\u00ED -->\r\n <span nz-icon nzType=\"cloud-upload\" nzTheme=\"outline\" *ngIf=\"source == 'free_img'\"\r\n (click)=\"startEdit(itemEdit); openFreeImage(dataRow)\"></span>\r\n <!-- icon \u0111\u01B0\u1EDDng d\u1EABn \u1EA3nh -->\r\n <span nz-popover nzPopoverTitle=\"{{'duong_dan_anh' | translate}}\" nzPopoverTrigger=\"click\"\r\n [nzPopoverContent]=\"contentTemplate\" nz-icon nzType=\"disconnect\" nzTheme=\"outline\"\r\n *ngIf=\"source == 'url'\">\r\n </span>\r\n <ng-template #contentTemplate>\r\n <input style=\"width: 260px;\" class=\"input mr-1\" type=\"text\" [(ngModel)]=\"itemEdit.value\"\r\n [value]=\"itemEdit.value\" placeholder=\"{{'nhap_duong_dan_lien_ket' | translate}}\">\r\n <span role=\"button\" class=\"text-success\" (click)=\"updateData(dataRow)\">{{'ap_dung' |\r\n translate}}</span>\r\n </ng-template>\r\n </button>\r\n\r\n <button nz-button nzType=\"primary\" (click)=\"openUploadToServer()\"\r\n *ngIf=\"!(itemEdit[deviceTemp + '_value'] || itemEdit.value)?.includes(id_subproject)\">\r\n {{'chuyen_anh_len_server' | translate}}\r\n </button>\r\n </div>\r\n <div style=\"margin-bottom: 10px;\">\r\n <nz-select [(ngModel)]=\"source\">\r\n <nz-option *ngFor=\"let source of sources\" [nzValue]=\"source.value\"\r\n [nzLabel]=\"source.label | translate\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <div *ngIf=\"source == 'device'\">\r\n <p class=\"m-0\">{{'nen_anh_tai_len' | translate}}</p>\r\n <nz-select style=\"margin-bottom: 15px\" [(ngModel)]=\"compressType\"\r\n nzPlaceHolder=\"{{'nen_anh_tai_len' | translate}}\" nzAllowClear>\r\n <nz-option [nzValue]=\"'no-compress'\" nzLabel=\"{{'khong_nen_anh_sau_khi_tai_len' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'compress-frame'\" nzLabel=\"{{'nen_anh_theo_ti_le_khung_hien_thi_anh' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'custom'\" nzLabel=\"{{'nen_anh_theo_kich_thuoc_tu_chon' | translate}}\"></nz-option>\r\n </nz-select>\r\n\r\n <div style=\"display:flex; align-items:center; gap: 8px\">\r\n <mat-form-field *ngIf=\"compressType == 'custom'\">\r\n <mat-label>{{'chieu_rong' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_rong' | translate}}\" [(ngModel)]=\"compressWidth\">\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"compressType == 'custom'\">\r\n <mat-label>{{'chieu_cao' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_cao' | translate}}\" [(ngModel)]=\"compressHeight\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <button *ngIf=\"isDesignImageSizeValid\" nz-tooltip class=\"w-100\" nz-button nzType=\"primary\"\r\n [nzTooltipTitle]=\"'chi_dung_cap_nhat_kich_thuoc_anh_cho_nhung_hinh_anh_dung_yen_khong_co_hieu_ung_truot' | translate\"\r\n (click)=\"updateDesignImageSize(itemEdit, dataRow)\">\r\n {{'cap_nhat_kich_thuoc_anh_theo_kich_thuoc_thiet_ke' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- C\u1EADp nh\u1EADt m\u00F4 t\u1EA3 n\u1ED9i dung \u1EA3nh -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\">\r\n <p class=\"title\">{{'cap_nhat_mo_ta_noi_dung' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'noi_dung' | translate}}...\"\r\n [ngModel]=\"itemEdit['accessibility_alt_' + functionService.languageTempCode] || '\u1EA2nh'\"\r\n (ngModelChange)=\"itemEdit['accessibility_alt_' + functionService.languageTempCode] = $event\"\r\n (blur)=\"updateData(dataRow)\" [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\"\r\n nz-tooltip [nzTooltipTitle]=\"'*_giai_thich_aria_label' | translate\"\r\n nzOverlayClassName=\"aria-label-tooltip\">\r\n </textarea>\r\n </div>\r\n\r\n <!-- C\u1EADp nh\u1EADt li\u00EAn k\u1EBFt -->\r\n <div class=\"config-font\">\r\n <!-- type-link -->\r\n <div class=\"type-link\">\r\n <p class=\"type-link__title\">{{'cap_nhat_duong_dan_lien_ket' | translate}}</p>\r\n <nz-select class=\"type-link__select\" [(ngModel)]=\"itemEdit.type_link\"\r\n (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\" nzPlaceHolder=\"{{'chon_kieu_lien_ket' | translate}}\"\r\n allowClear>\r\n <nz-option *ngFor=\"let item of type_link\" [nzValue]=\"item.value\" nzLabel=\"{{item.label | translate}}\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN TRANG -->\r\n <div class=\"connect-page\" *ngIf=\"itemEdit.type_link == 'page_link'\">\r\n <nz-select [(ngModel)]=\"itemEdit.link\" (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\"\r\n nzPlaceHolder=\"{{'chon_trang_lien_ket' | translate}}\" allowClear>\r\n <nz-option *ngFor=\"let page of arr_link_page\" [nzValue]=\"page.link\" \r\n [nzLabel]=\"page['name_' + functionService.selectedLanguageCode] || page.name\">\r\n </nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- LI\u00CAN K\u1EBET \u0110I\u1EC0U H\u01AF\u1EDANG -->\r\n <div class=\"navigation-link\" *ngIf=\"itemEdit.type_link == 'navigation_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"/ten-trang-chi-tiet-san-pham/ten-san-pham\"\r\n [(ngModel)]=\"itemEdit.link\" (blur)=\"getBlocksbyPage();updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('link')\"></span>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN MAIL -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'mailto'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto }) ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"viethas.info@gmail.com\" [(ngModel)]=\"itemEdit.mailto\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('mailto')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto })\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'email_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN S\u1ED0 \u0110I\u1EC6N THO\u1EA0I -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'tel'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.tel ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"0909925354\" [(ngModel)]=\"itemEdit.tel\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('tel')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.tel\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'so_dien_thoai_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- H\u00E0nh \u0111\u1ED9ng khi nh\u1EA5n -->\r\n <div *ngIf=\"itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link'\" class=\"mt-3\">\r\n <label for=\"scroll-select\">{{'hanh_dong_khi_nhan'| translate}}:</label>\r\n <br />\r\n <nz-select id=\"scroll-select\" [(ngModel)]=\"itemEdit.is_scroll\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let item of clickActionOptions\" [nzValue]=\"item.value\" [nzLabel]=\"item.label | translate\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- CU\u1ED8N \u0110\u1EBEN BLOCK -->\r\n <ng-container style=\"width: 100%\" *ngIf=\"(itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link') && itemEdit.is_scroll == 'scroll_to_block'\">\r\n <nz-select style=\"margin: 8px 0\" [nzPlaceHolder]=\"'chon_khoi' | translate\" [(ngModel)]=\"itemEdit.scroll_block_id\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let block of blocks_of_page\" [nzValue]=\"block._id\" [nzLabel]=\"block.name | translate\"></nz-option>\r\n </nz-select>\r\n\r\n <div class=\"form-group\">\r\n <label for=\"scrollDistance\">{{'khoang_cach_chua_ra_de_tranh_menu_co_dinh' | translate }}</label>\r\n <input type=\"number\" nz-input class=\"field-fill\" \r\n [(ngModel)]=\"itemEdit.scroll_distance\"\r\n (input)=\"updateData(dataRow)\" />\r\n </div>\r\n </ng-container>\r\n\r\n \r\n <!-- LI\u00CAN K\u1EBET TRANG KH\u00C1C (URL) -->\r\n <div class=\"connect-link\" *ngIf=\"itemEdit.type_link == 'hyper_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"https://viethas.com/\" [(ngModel)]=\"itemEdit.hyper_link\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('hyper_link')\"></span>\r\n </ng-template>\r\n </div>\r\n\r\n\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemEdit.type == 'text-repeat' || itemEdit.type == 'button-repeat' || itemEdit.type == 'popup-repeat'\">\r\n <!-- Ch\u1ECDn ng\u00F4n ng\u1EEF -->\r\n <div class=\"mb-3\">\r\n <app-select-language-config [displayLabel]=\"true\" [isAdmin]=\"true\"></app-select-language-config>\r\n </div>\r\n <!-- C\u1EADp nh\u1EADt ch\u1EEF -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\">\r\n <p class=\"title\">{{'cap_nhat_noi_dung_hien_thi' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'noi_dung' | translate}}...\"\r\n [ngModel]=\"itemEdit['value_' + functionService.languageTempCode] | vhLanguage : mapType[itemEdit.type] : data.component\"\r\n (ngModelChange)=\"itemEdit['value_' + functionService.languageTempCode] = $event\"\r\n (blur)=\"updateData(dataRow)\" [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\"></textarea>\r\n </div>\r\n <ng-container *ngIf=\"itemEdit.type == 'button-repeat' || itemEdit.type == 'popup-repeat'\">\r\n <!-- C\u1EADp nh\u1EADt nh\u00E3n -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\"\r\n *ngIf=\"\r\n (itemEdit['value_' + functionService.languageTempCode] != undefined) && \r\n !itemEdit['value_' + functionService.languageTempCode]?.trim()\r\n \">\r\n <p class=\"title\">{{'cap_nhat_nhan' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'nhan' | translate}}...\"\r\n [ngModel]=\"itemEdit['accessibility_aria_label_' + functionService.languageTempCode] || 'N\u00FAt \u0111i\u1EC1u h\u01B0\u1EDBng'\"\r\n (ngModelChange)=\"itemEdit['accessibility_aria_label_' + functionService.languageTempCode] = $event\"\r\n (blur)=\"updateData(dataRow)\" [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\"\r\n nz-tooltip [nzTooltipTitle]=\"'*_giai_thich_aria_label' | translate\"\r\n nzOverlayClassName=\"aria-label-tooltip\">\r\n </textarea>\r\n </div>\r\n <!-- Bi\u1EC3u t\u01B0\u1EE3ng -->\r\n <div class=\"d-flex justify-content-between mt-1 mb-3 align-items-center\">\r\n <p class=\"title\" style=\"line-height: 1.5; margin: 0\">{{'su_dung_bieu_tuong' | translate}}</p>\r\n <nz-switch [(ngModel)]=\"itemEdit.icon_enable\"></nz-switch>\r\n <div class=\"d-flex justify-content-between\">\r\n <mat-icon>{{ itemEdit.icon_name }}</mat-icon>\r\n <button nz-button nzType=\"default\" (click)=\"openDialogChooseIcon()\"\r\n style=\"border-radius: 6px; border: 2px solid #333\"\r\n [disabled]=\"!itemEdit.icon_enable\">\r\n {{'thay_doi' | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- C\u1EADp nh\u1EADt li\u00EAn k\u1EBFt -->\r\n <div class=\"config-font\">\r\n <!-- type-link -->\r\n <div class=\"type-link\">\r\n <p class=\"type-link__title\">{{'cap_nhat_duong_dan_lien_ket' | translate}}</p>\r\n <nz-select class=\"type-link__select\" [(ngModel)]=\"itemEdit.type_link\"\r\n (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\" nzPlaceHolder=\"{{'chon_kieu_lien_ket' | translate}}\"\r\n allowClear>\r\n <nz-option *ngFor=\"let item of type_link\" [nzValue]=\"item.value\" nzLabel=\"{{item.label | translate}}\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN TRANG -->\r\n <div class=\"connect-page\" *ngIf=\"itemEdit.type_link == 'page_link'\">\r\n <nz-select [(ngModel)]=\"itemEdit.link\" (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\"\r\n nzPlaceHolder=\"{{'chon_trang_lien_ket' | translate}}\" allowClear>\r\n <nz-option *ngFor=\"let page of arr_link_page\" [nzValue]=\"page.link || ''\"\r\n [nzLabel]=\"page['name_' + functionService.selectedLanguageCode] || page.name\">\r\n </nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- LI\u00CAN K\u1EBET \u0110I\u1EC0U H\u01AF\u1EDANG -->\r\n <div class=\"navigation-link\" *ngIf=\"itemEdit.type_link == 'navigation_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"/ten-trang-chi-tiet-san-pham/ten-san-pham\"\r\n [(ngModel)]=\"itemEdit.link\" (blur)=\"getBlocksbyPage();updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('link')\"></span>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN MAIL -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'mailto'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto }) ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"viethas.info@gmail.com\" [(ngModel)]=\"itemEdit.mailto\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('mailto')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto })\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'email_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN S\u1ED0 \u0110I\u1EC6N THO\u1EA0I -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'tel'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.tel ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"0909925354\" [(ngModel)]=\"itemEdit.tel\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('tel')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.tel\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'so_dien_thoai_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- H\u00E0nh \u0111\u1ED9ng khi nh\u1EA5n -->\r\n <div *ngIf=\"itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link'\" class=\"mt-3\">\r\n <label for=\"scroll-select\">{{'hanh_dong_khi_nhan'| translate}}:</label>\r\n <br />\r\n <nz-select id=\"scroll-select\" [(ngModel)]=\"itemEdit.is_scroll\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let item of clickActionOptions\" [nzValue]=\"item.value\" [nzLabel]=\"item.label | translate\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- CU\u1ED8N \u0110\u1EBEN BLOCK -->\r\n <ng-container style=\"width: 100%\" *ngIf=\"(itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link') && itemEdit.is_scroll == 'scroll_to_block'\">\r\n <nz-select style=\"margin: 8px 0\" [nzPlaceHolder]=\"'chon_khoi' | translate\" [(ngModel)]=\"itemEdit.scroll_block_id\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let block of blocks_of_page\" [nzValue]=\"block._id\" [nzLabel]=\"block.name | translate\"></nz-option>\r\n </nz-select>\r\n\r\n <div class=\"form-group\">\r\n <label for=\"scrollDistance\">{{'khoang_cach_chua_ra_de_tranh_menu_co_dinh' | translate }}</label>\r\n <input type=\"number\" nz-input class=\"field-fill\" \r\n [(ngModel)]=\"itemEdit.scroll_distance\"\r\n (input)=\"updateData(dataRow)\" />\r\n </div>\r\n </ng-container>\r\n\r\n <!-- LI\u00CAN K\u1EBET TRANG KH\u00C1C (URL) -->\r\n <div class=\"connect-link\" *ngIf=\"itemEdit.type_link == 'hyper_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"https://viethas.com/\" [(ngModel)]=\"itemEdit.hyper_link\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('hyper_link')\"></span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n\r\n <!-- G\u1ECDi h\u1ED9p tho\u1EA1i -->\r\n <ng-container *ngIf=\"itemEdit.type == 'popup-repeat'\">\r\n <!-- type-link -->\r\n <div class=\"type-link\">\r\n <p class=\"type-link__title\">{{'goi_hop_thoai' | translate}}</p>\r\n <nz-select class=\"type-link__select\" [(ngModel)]=\"itemEdit.id_freeblock\"\r\n (ngModelChange)=\"updateData(dataRow)\" nzPlaceHolder=\"{{'goi_hop_thoai' | translate}}\"\r\n nzAllowClear>\r\n <nz-option *ngFor=\"let block of popupHovers\" [nzValue]=\"block._id\" nzLabel=\"{{block.name | translate}}\"></nz-option>\r\n </nz-select>\r\n </div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemEdit.type == 'date-repeat'\">\r\n <!-- Ch\u1ECDn ng\u00E0y v\u00E0 gi\u1EDD -->\r\n <nz-date-picker\r\n nzShowTime\r\n nzFormat=\"dd-MM-yyyy HH:mm:ss\"\r\n [(ngModel)]=\"itemEdit.value\"\r\n (ngModelChange)=\"onDateTimeChange($event, itemEdit)\"\r\n (nzOnOk)=\"onDateTimeOk($event, dataRow)\"\r\n ></nz-date-picker>\r\n <!-- C\u1EADp nh\u1EADt li\u00EAn k\u1EBFt -->\r\n <div class=\"config-font\">\r\n <!-- type-link -->\r\n <div class=\"type-link\">\r\n <p class=\"type-link__title\">{{'cap_nhat_duong_dan_lien_ket' | translate}}</p>\r\n <nz-select class=\"type-link__select\" [(ngModel)]=\"itemEdit.type_link\"\r\n (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\" nzPlaceHolder=\"{{'chon_kieu_lien_ket' | translate}}\"\r\n allowClear>\r\n <nz-option *ngFor=\"let item of type_link\" [nzValue]=\"item.value\" nzLabel=\"{{item.label | translate}}\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN TRANG -->\r\n <div class=\"connect-page\" *ngIf=\"itemEdit.type_link == 'page_link'\">\r\n <nz-select [(ngModel)]=\"itemEdit.link\" (ngModelChange)=\"getBlocksbyPage();updateData(dataRow)\"\r\n nzPlaceHolder=\"{{'chon_trang_lien_ket' | translate}}\" allowClear>\r\n <nz-option *ngFor=\"let page of arr_link_page\" [nzValue]=\"page.link || ''\"\r\n [nzLabel]=\"page['name_' + functionService.selectedLanguageCode] || page.name\">\r\n </nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- LI\u00CAN K\u1EBET \u0110I\u1EC0U H\u01AF\u1EDANG -->\r\n <div class=\"navigation-link\" *ngIf=\"itemEdit.type_link == 'navigation_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"/ten-trang-chi-tiet-san-pham/ten-san-pham\"\r\n [(ngModel)]=\"itemEdit.link\" (blur)=\"getBlocksbyPage();updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('link')\"></span>\r\n </ng-template>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN MAIL -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'mailto'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto }) ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"viethas.info@gmail.com\" [(ngModel)]=\"itemEdit.mailto\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('mailto')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.mailto && !isValidValue({ mailto: itemEdit.mailto })\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'email_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- \u0110\u1EBEN S\u1ED0 \u0110I\u1EC6N THO\u1EA0I -->\r\n <div class=\"mail-link\" *ngIf=\"itemEdit.type_link == 'tel'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\"\r\n [style.border-color]=\"itemEdit.tel ? 'red' : '#d9d9d9'\">\r\n <input type=\"text\" nz-input placeholder=\"0909925354\" [(ngModel)]=\"itemEdit.tel\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('tel')\"></span>\r\n </ng-template>\r\n <p *ngIf=\"itemEdit.tel\" class=\"text-danger mt-1 pl-2 lh-base\">\r\n {{'so_dien_thoai_khong_hop_le' | translate}}\r\n </p>\r\n </div>\r\n\r\n <!-- H\u00E0nh \u0111\u1ED9ng khi nh\u1EA5n -->\r\n <div *ngIf=\"itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link'\" class=\"mt-3\">\r\n <label for=\"scroll-select\">{{'hanh_dong_khi_nhan'| translate}}:</label>\r\n <br />\r\n <nz-select id=\"scroll-select\" [(ngModel)]=\"itemEdit.is_scroll\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let item of clickActionOptions\" [nzValue]=\"item.value\" [nzLabel]=\"item.label | translate\"></nz-option>\r\n </nz-select>\r\n </div>\r\n\r\n <!-- CU\u1ED8N \u0110\u1EBEN BLOCK -->\r\n <ng-container style=\"width: 100%\" *ngIf=\"(itemEdit.type_link == 'page_link' || itemEdit.type_link == 'navigation_link') && itemEdit.is_scroll == 'scroll_to_block'\">\r\n <nz-select style=\"margin: 8px 0\" [nzPlaceHolder]=\"'chon_khoi' | translate\" [(ngModel)]=\"itemEdit.scroll_block_id\" (ngModelChange)=\"updateData(dataRow)\">\r\n <nz-option *ngFor=\"let block of blocks_of_page\" [nzValue]=\"block._id\" [nzLabel]=\"block.name | translate\"></nz-option>\r\n </nz-select>\r\n\r\n <div class=\"form-group\">\r\n <label for=\"scrollDistance\">{{'khoang_cach_chua_ra_de_tranh_menu_co_dinh' | translate }}</label>\r\n <input type=\"number\" nz-input class=\"field-fill\" \r\n [(ngModel)]=\"itemEdit.scroll_distance\"\r\n (input)=\"updateData(dataRow)\" />\r\n </div>\r\n </ng-container>\r\n\r\n <!-- LI\u00CAN K\u1EBET TRANG KH\u00C1C (URL) -->\r\n <div class=\"connect-link\" *ngIf=\"itemEdit.type_link == 'hyper_link'\">\r\n <nz-input-group [nzSuffix]=\"suffixIconClose\">\r\n <input type=\"text\" nz-input placeholder=\"https://viethas.com/\" [(ngModel)]=\"itemEdit.hyper_link\"\r\n (blur)=\"updateData(dataRow)\" />\r\n </nz-input-group>\r\n <ng-template #suffixIconClose>\r\n <span nz-icon nzType=\"close-circle\" class=\"icon-close\" (click)=\"removeLink('hyper_link')\"></span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemEdit.type == 'video-repeat'\">\r\n <!-- text-area url -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\">\r\n <p class=\"title\">{{'cap_nhat_noi_dung_hien_thi' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'noi_dung' | translate}}...\"\r\n [(ngModel)]=\"itemEdit['iframe']\"\r\n (blur)=\"updateVideoRepeat('is_mute', $event);updateData(dataRow)\"\r\n [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\">\r\n </textarea>\r\n\r\n <button nzType=\"primary\" nz-button (click)=\"isOpenGuideVideo = true\"\r\n class=\"_btn _btn_add d-flex align-items-center right-all-content mr-2 my-2\">\r\n {{'huong_dan_khach_hang_chen_video_youtube' | translate}}\r\n </button>\r\n\r\n <!-- \u00C2M THANH -->\r\n <div class=\"border-type mt-4\">\r\n <h4>{{'am_thanh' | translate}}</h4>\r\n <nz-switch [(ngModel)]=\"itemEdit.is_mute\" (ngModelChange)=\"updateVideoRepeat('is_mute', $event);updateData(dataRow)\"></nz-switch>\r\n </div>\r\n \r\n <!-- T\u1EF0 \u0110\u1ED8NG L\u1EB6P -->\r\n <div class=\"border-type\">\r\n <h4>{{'tu_dong_lap' | translate}}</h4>\r\n <nz-switch [(ngModel)]=\"itemEdit.loop\" (ngModelChange)=\"updateVideoRepeat('loop', $event);updateData(dataRow)\"></nz-switch>\r\n </div>\r\n \r\n <!-- TH\u00C0NH C\u00D4NG C\u1EE4 -->\r\n <div class=\"border-type\">\r\n <h4>{{'thanh_cong_cu' | translate}}</h4>\r\n <nz-switch [(ngModel)]=\"itemEdit.controls\"\r\n (ngModelChange)=\"updateVideoRepeat('controls', $event);updateData(dataRow)\"></nz-switch>\r\n </div>\r\n \r\n <!-- T\u1EF0 \u0110\u1ED8NG PH\u00C1T -->\r\n <!-- autoplay ph\u1EA3i \u0111i v\u1EDBi mute, n\u00EAn n\u1EBFu kh\u00F4ng mute th\u00EC autoplay s\u1EBD t\u1EF1 \u0111\u1ED9ng set false (Xem t\u1EA1i https://developer.chrome.com/blog/autoplay/) -->\r\n <div *ngIf=\"!itemEdit.is_mute\" class=\"border-type\">\r\n <h4>{{'tu_dong_phat' | translate}}</h4>\r\n <nz-switch [(ngModel)]=\"itemEdit.autoplay\"\r\n (ngModelChange)=\"updateVideoRepeat('autoplay', $event);updateData(dataRow)\"></nz-switch>\r\n </div>\r\n\r\n <!-- C\u1EACP NH\u1EACT M\u00D4 T\u1EA2 N\u1ED8I DUNG C\u1EE6A VIDEO -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\">\r\n <p class=\"title\">{{'cap_nhat_mo_ta_noi_dung' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'noi_dung' | translate}}...\"\r\n [ngModel]=\"itemEdit['accessibility_title_' + functionService.languageTempCode] || 'Video youtube'\"\r\n (ngModelChange)=\"itemEdit['accessibility_title_' + functionService.languageTempCode] = $event\"\r\n (blur)=\"updateData(dataRow)\" [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\"\r\n nz-tooltip [nzTooltipTitle]=\"'*_giai_thich_aria_label' | translate\"\r\n nzOverlayClassName=\"aria-label-tooltip\">\r\n </textarea>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"itemEdit.type == 'map-repeat'\">\r\n <nz-radio-group [(ngModel)]=\"radioValue\">\r\n <label nz-radio nzValue=\"location\">{{ 'nhap_dia_chi' | translate }}</label>\r\n <label nz-radio nzValue=\"iframe\">{{ 'dung_the_nhung' | translate }}</label>\r\n </nz-radio-group>\r\n <!-- Th\u00EAm \u0111\u1ECBa ch\u1EC9 b\u1EB1ng c\u00E1ch nh\u1EADp -->\r\n <div class=\"container-font\" *ngIf=\"radioValue == 'location'\">\r\n <div class=\"config-text\" style=\"width:100%\">\r\n <mat-form-field style=\"width:100%\">\r\n <mat-label>{{ 'nhap_dia_chi' | translate }} </mat-label>\r\n <textarea matInput [(ngModel)]=\"itemEdit.local\" (blur)=\"getLocal_atwMapRepeat(itemEdit, dataRow)\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <!-- Th\u00EAm \u0111\u1ECBa ch\u1EC9 b\u1EB1ng iframe -->\r\n <div *ngIf=\"radioValue == 'iframe'\" class=\"map__item--change-link\">\r\n <div>\r\n <input #myInput nz-input \r\n placeholder=\"<iframe src='https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3919.3565404084443!2d106' width='600' height='450' style='border:0;' allowfullscreen='' loading='lazy' referrerpolicy='no-referrer-when-downgrade'></iframe>\"\r\n class=\"input_iframe form-group\" nzSize=\"large\" [(ngModel)]=\"itemEdit.iframe\" />\r\n </div>\r\n <div class=\"map__item--change-link--button d-flex flex-column\">\r\n <button nz-button nzType=\"primary\" (click)=\"getLink_atwMapRepeat(itemEdit, dataRow)\">{{'cap_nhat' | translate}}</button>\r\n </div>\r\n </div>\r\n\r\n <button nzType=\"primary\" nz-button (click)=\"isOpenGuideMap = true\"\r\n class=\"_btn _btn_add d-flex align-items-center right-all-content mr-2 my-2\">\r\n {{ 'huong_dan_khach_hang_chen_ban_do' | translate }}\r\n </button>\r\n\r\n <!-- C\u1EACP NH\u1EACT M\u00D4 T\u1EA2 N\u1ED8I DUNG C\u1EE6A B\u1EA2N \u0110\u1ED2 -->\r\n <div class=\"config-font\" style=\"margin-bottom: 20px;\">\r\n <p class=\"title\">{{'cap_nhat_mo_ta_noi_dung' | translate}}</p>\r\n <textarea nz-input class=\"content\" placeholder=\"{{'noi_dung' | translate}}...\"\r\n [ngModel]=\"itemEdit['accessibility_title_' + functionService.languageTempCode] || 'B\u1EA3n \u0111\u1ED3'\"\r\n (ngModelChange)=\"itemEdit['accessibility_title_' + functionService.languageTempCode] = $event\"\r\n (blur)=\"updateData(dataRow)\" [nzAutosize]=\"{ minRows: 3, maxRows: 15 }\"\r\n nz-tooltip [nzTooltipTitle]=\"'*_giai_thich_aria_label' | translate\"\r\n nzOverlayClassName=\"aria-label-tooltip\">\r\n </textarea>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </nz-modal>\r\n\r\n <!-- Modal Chuy\u1EC3n \u1EA3nh l\u00EAn server -->\r\n <nz-modal nzTitle=\"{{ 'chuyen_anh_len_server' | translate}}\" [(nzVisible)]=\"isShowUploadToServer\"\r\n (nzOnCancel)=\"cancelUploadToServer()\" [nzContent]=\"modalContent\" [nzFooter]=\"modalFooter\">\r\n <ng-template #modalContent>\r\n <p>{{'nen_anh_tai_len' | translate}}</p>\r\n <nz-select style=\"margin-bottom: 15px\" [(ngModel)]=\"compressType\"\r\n nzPlaceHolder=\"{{'nen_anh_tai_len' | translate}}\" nzAllowClear>\r\n <nz-option [nzValue]=\"'no-compress'\" nzLabel=\"{{'khong_nen_anh_sau_khi_tai_len' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'compress-frame'\" nzLabel=\"{{'nen_anh_theo_ti_le_khung_hien_thi_anh' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'custom'\" nzLabel=\"{{'nen_anh_theo_kich_thuoc_tu_chon' | translate}}\"></nz-option>\r\n </nz-select>\r\n\r\n <mat-form-field *ngIf=\"compressType == 'custom'\" class=\"mr-4\">\r\n <mat-label>{{'chieu_rong' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_rong' | translate}}\" [(ngModel)]=\"compressWidth\">\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"compressType == 'custom'\">\r\n <mat-label>{{'chieu_cao' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_cao' | translate}}\" [(ngModel)]=\"compressHeight\">\r\n </mat-form-field>\r\n </ng-template>\r\n <ng-template #modalFooter>\r\n <button nz-button nzType=\"default\" (click)=\"cancelUploadToServer()\">{{'khong' | translate}}</button>\r\n <button nz-button nzType=\"primary\" (click)=\"okUploadToServer(itemEdit)\"\r\n [nzLoading]=\"uploadToServerLoading\">{{'dong_y' | translate}}</button>\r\n </ng-template>\r\n </nz-modal>\r\n </tbody>\r\n </nz-table>\r\n </div>\r\n</nz-layout>\r\n\r\n<!-- ------------------------------------------------- H\u1ED8P THO\u1EA0I H\u01AF\u1EDANG D\u1EAAN CH\u00C8N MAP -------------------------------------------------- -->\r\n<nz-modal [(nzVisible)]=\"isOpenGuideMap\" (nzOnCancel)=\"isOpenGuideMap = false\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{ height: '80vh', top: '32px', overflowY : 'scroll'}\" [nzWidth]=\"'70%'\">\r\n <ng-container *nzModalContent>\r\n <div class=\"modal-success\">\r\n <h4 class=\"title\">\r\n {{ 'huong_dan_khach_hang_chen_ban_do_vao_trang_web' | translate }}\r\n </h4>\r\n <span>\r\n <i class=\"bi bi-x-lg\"></i>\r\n </span>\r\n <div class=\"list-image\">\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/map_b1.jpg\" alt=\"image 1\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 1: {{ 'truy_cap_vao_duong_dan' | translate }} <a href=\"https://www.google.com/maps\"\r\n target=\"_blank\">https://www.google.com/maps</a>\r\n </div>\r\n </div>\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/map_b1b2.jpg\" alt=\"image 2\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 2: {{ 'nhap_dia_chi_ban_muon_chia_se_hoac_chen' | translate }}. {{ 'sau_khi_ban_do_da_chon_chinh_xac_vi_tri_ma_dia_chi_vua_nhap' | translate }},\r\n <span style=\"color:#00a859\"> {{ 'nhan_vao' | translate }} <span style=\"font-weight: bold\">{{ 'nut_chia_se' | translate }}.</span></span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"list-image pt-3\">\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/map_b1b3.jpg\" alt=\"image 3\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 3: {{ 'nhan_vao' | translate }} <span style=\"color: black\">{{ 'tab_nhung_ban_do' | translate }}</span> \r\n <span style=\"color:#00a859; font-weight: bold;\"> & {{ 'nhan_nut_sao_chep_html' | translate }}.</span>\r\n </div>\r\n </div>\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/map_b1b4.jpg\" alt=\"image 4\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 4: <span style=\"color:#00a859\"> {{ 'dan_ma_nhung_vao_o_duong_dan_sau_do_nhan' | translate }} \r\n <span style=\"font-weight: bold;\">{{ 'nut_cap_nhat' | translate }}</span> </span> {{ 'de_he_thong_lay_ban_do_ve' | translate }}.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<!-- ------------------------------------------------- H\u1ED8P THO\u1EA0I H\u01AF\u1EDANG D\u1EAAN CH\u00C8N VIDEO -------------------------------------------------- -->\r\n<nz-modal [(nzVisible)]=\"isOpenGuideVideo\" (nzOnCancel)=\"isOpenGuideVideo = false\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{ height: '500px', top: ' 10px' }\" [nzWidth]=\"'70%'\">\r\n <ng-container *nzModalContent>\r\n <div class=\"modal-success\">\r\n <h4 class=\"title\">\r\n {{'huong_dan_khach_hang_chen_video_youtube_vao_trang_web' | translate}}\r\n </h4>\r\n <span>\r\n <i class=\"bi bi-x-lg\"></i>\r\n </span>\r\n <div class=\"list-image\">\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/video_B1.jpg\" alt=\"image 1\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 1: {{ 'truy_cap_vao_video_tren_youtube_muon_chen_sau_do' | translate }}\r\n <span style=\"color:#00a859\"> {{ 'nhan_vao' | translate }}\r\n <span style=\"font-weight: bold;\"> {{ 'nut' | translate}} Share</span>\r\n </span> {{ 'o_duoi_video' | translate }}.\r\n </div>\r\n </div>\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/video_b2.jpg\" alt=\"image_2\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 2: \r\n <span style=\"color:#00a859\">{{ 'nhan_vao' | translate }} <span style=\"font-weight: bold;\">{{ 'nut' | translate}} Embed</span></span>\r\n {{ 'de_lay_ma_nhung' | translate }}.\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"list-image pt-2\">\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/video_b3.jpg\" alt=\"image 3\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 3: \r\n <span style=\"color:#00a859\">{{ 'nhan_vao' | translate }} <span style=\"font-weight: bold;\">{{ 'nut' | translate}} Copy</span></span>,\r\n {{ 'he_thong_tu_dong_sao_chep_ma_nhung_cua_video' | translate }}.\r\n </div>\r\n </div>\r\n <div class=\"item-image\">\r\n <img src=\"/assets/root/images/system/imgs/video_b4.jpg\" alt=\"image 3\">\r\n <div class=\"note-content\">\r\n {{ 'buoc' | translate }} 4: \r\n <span style=\"color:#00a859\">{{ 'dan_ma_nhung_vao_o_duong_dan_sau_do_nhan' | translate }} \r\n <span style=\"font-weight: bold;\">{{ 'nut_cap_nhat' | translate }}</span> \r\n </span> {{ 'de_he_thong_lay_video_tu_youtube_ve' | translate }}.\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n</nz-modal>\r\n\r\n<ng-template #tooltipImgInfo>\r\n <div class=\"my-1 img-info\">\r\n <p class=\"img-info__text\">\r\n {{ 'thu_muc_chua_tep_hinh_anh' | translate }}: \r\n </p>\r\n <p class=\"img-info__text highlight ml-2\">\r\n {{ getFileInfo(itemEdit[deviceTemp + '_value']).folderPath }}\r\n </p>\r\n <p class=\"img-info__text mt-1\">\r\n {{ 'ten_tep_hinh_anh' | translate }}: \r\n </p>\r\n <p class=\"img-info__text highlight ml-2\">\r\n {{ getFileInfo(itemEdit[deviceTemp + '_value']).fullFileName }}\r\n </p>\r\n </div>\r\n <button class=\"w-100 my-1\" nz-button nzType=\"default\" style=\"padding: 4px 6px;\"\r\n (click)=\"copyLinkImg(itemEdit[deviceTemp + '_value'])\">\r\n {{'nhan_de_sao_chep_duong_dan_anh' | translate}}\r\n </button>\r\n</ng-template>", styles: ["nz-layout{background:#ffffff 0% 0% no-repeat padding-box;padding:16px;height:100%}nz-layout .title{color:var(--ion-color-vh-green);font-size:1.1rem}nz-layout ._btn{border-radius:18px!important;font-size:.9rem}nz-layout ._btn_add{color:#fff;background:#008848 0% 0% no-repeat padding-box;border:1px solid #008848}nz-layout ._btn_add span{color:#fff}nz-layout ._btn_soft{color:#373737;background:#ffffff 0% 0% no-repeat padding-box;border:1px solid #c8c7cc}nz-layout ._btn_soft span{color:#373737}nz-layout ._btn_delete{color:#fff;background:#ff000a 0% 0% no-repeat padding-box;border:1px solid #ff000a}nz-layout ._btn_delete span{color:#fff}nz-layout .search{justify-content:flex-end;display:flex;position:relative}nz-layout .search nz-input-group{border-radius:18px}nz-layout .search input{width:20rem}nz-layout nz-table{font-size:14px!important}nz-layout nz-table th.ant-table-cell{background-color:#529bfc;color:#fff}nz-layout nz-table tbody .icon-action span{font-size:18px;cursor:pointer}nz-layout nz-table tbody .icon-action span:first-child{color:var(--ion-color-vh-green);margin-right:8px}nz-layout nz-table tbody .icon-action span:nth-child(2){color:var(--ion-color-vh-red)}nz-layout nz-table ._select{color:#373737;font-weight:500;text-align:left;display:inline-flex;align-items:center;font-size:14px}nz-layout nz-table ._select ._option{color:#373737;background-color:#fff;font-weight:500;border-radius:5px;text-align:left;margin:8px!important;padding:8px!important;font-size:14px}nz-layout nz-table ._select ._option:hover{color:#fff;background-color:#00a859;cursor:pointer}nz-layout nz-table ._select:focus{outline:none;box-shadow:0 0 0 1px #cbcbcb}nz-layout nz-table ::ng-deep .ant-table-header.nz-table-hide-scrollbar{display:contents}nz-layout nz-table ::ng-deep .ant-select:not(.ant-select-customize-input) .ant-select-selector{border-radius:18px!important}nz-layout .input-container{display:flex;background-color:var(--ion-color-vh-green);color:#fff}nz-layout .goto-page{padding:6px 18px;display:flex;align-items:center;justify-content:center;cursor:pointer}.pagiItem.active{background-color:var(--ion-color-vh-green);color:#fff!important}.ant-input-affix-wrapper{border:1px solid #c8c7cc;border-radius:5px}.pagination{display:flex;align-items:center;justify-content:center}.pagiItem{padding:8px 16px;cursor:pointer;color:var(--ion-color-vh-green);border-top:1px solid #ddd;border-bottom:1px solid #ddd;border-right:1px solid #ddd}.pagiItem:nth-child(1){border-left:1px solid #ddd}.page-go{background-color:#a54f4e;color:#fff}.pagination-list-button{display:flex}.ant-btn{border:none!important}:host ::ng-deep .nz-table .custom-tbody{min-height:350px}.editable-cell{position:relative;padding:5px 12px;cursor:pointer;margin-bottom:10px;display:flex}.editable-cell .item-img{background-color:#fff;background-image:linear-gradient(45deg,#eee 25%,transparent 25%),linear-gradient(-45deg,#eee 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#eee 75%),linear-gradient(-45deg,transparent 75%,#eee 75%);background-size:20px 20px;background-position:0 0,0 10px,10px -10px,-10px 0px}.editable-cell:hover{outline:1px solid #d9d9d9;border-radius:4px}.image-container{display:flex}.type-link__title,.type-link{margin-bottom:5px}.btn-upload,.btn-add{color:#fff;background-color:#008848;padding:4px 14px;text-align:center}.btn-delete{color:red}label{margin:0}.item-name{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:-moz-fit-content;width:fit-content;display:inline-block}.title-admin{font-size:18px;font-weight:bold;color:#008848;text-align:center;margin:15px 15px 15px 0}._icon_connect{display:flex;justify-content:center;align-items:center;align-self:center;color:#008848;width:25px;height:25px;padding:0;border:1px solid #c8c7cc;border-radius:50%;background-color:#fff;line-height:normal;margin-bottom:-4px}._icon_connect:hover{border-color:#008848}._icon_connect_active{border-color:#008848!important}.image-right{width:100%}.modal-success .title{display:flex;color:var(--ion-color-vh-green);font-weight:bold;justify-content:center;align-items:center;font-size:18px;margin-bottom:20px}.modal-success .list-image{display:flex;justify-content:space-around}.modal-success .list-image .item-image{width:40%;align-items:center}.modal-success .list-image .item-image .note-content{padding:10px 0;text-align:center}.aria-label-tooltip .ant-tooltip-inner{text-align:justify!important;white-space:pre-line!important}.border-type{display:flex;justify-content:space-between}.config-font .title{margin-bottom:4px;margin-top:8px}.device{display:flex;justify-content:space-evenly;align-items:center}.device .icon-field{padding:0 4px}.device .icon-field span{font-size:18px}.device .icon-field:hover{color:#00a859}.device .active{color:#00a859}.img-info__text{line-height:1.4;margin-bottom:6px}.img-info__text.highlight{color:#00a859;font-weight:500;font-size:16px}\n"], components: [{ type: i4.NzLayoutComponent, selector: "nz-layout", exportAs: ["nzLayout"] }, { type: SelectLanguageConfigComponent, selector: "app-select-language-config", inputs: ["isAdmin", "displayLabel", "isSetLanguageCode", "languages"], outputs: ["handleChangeMultiLanguage"] }, { type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { type: i7.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange"], exportAs: ["nzTable"] }, { type: i7.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { type: i7.NzTbodyComponent, selector: "tbody" }, { type: i12$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4$1.NzModalComponent, selector: "nz-modal", inputs: ["nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzZIndex", "nzWidth", "nzCloseIcon", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel", "nzTitle", "nzFooter", "nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzContent", "nzComponentParams", "nzWrapClassName", "nzClassName", "nzStyle", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { type: i6$1.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { type: i6$1.NzOptionComponent, selector: "nz-option", inputs: ["nzLabel", "nzValue", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i5.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzSize", "nzSearch", "nzCompact", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzSuffix"], exportAs: ["nzInputGroup"] }, { type: i10.NzSwitchComponent, selector: "nz-switch", inputs: ["nzLoading", "nzDisabled", "nzControl", "nzCheckedChildren", "nzUnCheckedChildren", "nzSize"], exportAs: ["nzSwitch"] }, { type: i16$1.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzPlaceHolder", "nzPopupStyle", "nzSize", "nzShowToday", "nzMode", "nzShowNow", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzShowTime", "nzFormat", "nzLocale", "nzOpen", "nzDisabledDate", "nzDropdownClassName", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzRanges"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { type: i5$2.NzRadioGroupComponent, selector: "nz-radio-group", inputs: ["nzDisabled", "nzButtonStyle", "nzSize", "nzName"], exportAs: ["nzRadioGroup"] }, { type: i5$2.NzRadioComponent, selector: "[nz-radio],[nz-radio-button]", inputs: ["nzValue", "nzDisabled", "nzAutoFocus"], exportAs: ["nzRadio"] }], directives: [{ type: i12$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i18.NzIconDirective, selector: "[nz-icon]", inputs: ["nzRotate", "nzSpin", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i21.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitleContext", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipTitle", "nz-tooltip", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { type: i17.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { type: i7.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { type: i7.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { type: i7.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { type: i12$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "disabled"], exportAs: ["nzInput"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i24.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus", "nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nz-popconfirm", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDanger", "nzCancelText", "nzIcon"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { type: i4$1.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { type: i5$3.NzImageDirective, selector: "img[nz-image]", inputs: ["nzSrc", "nzSrcset", "nzDisablePreview", "nzFallback", "nzPlaceholder"], exportAs: ["nzImage"] }, { type: i16.NzPopoverDirective, selector: "[nz-popover]", inputs: ["nzPopoverTrigger", "nzPopoverPlacement", "nzPopoverBackdrop", "nzPopoverArrowPointAtCenter", "nzPopoverTitle", "nzPopoverContent", "nz-popover", "nzPopoverOrigin", "nzPopoverVisible", "nzPopoverMouseEnterDelay", "nzPopoverMouseLeaveDelay", "nzPopoverOverlayClassName", "nzPopoverOverlayStyle"], outputs: ["nzPopoverVisibleChange"], exportAs: ["nzPopover"] }, { type: i5$1.MatLabel, selector: "mat-label" }, { type: i15.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i5.NzAutosizeDirective, selector: "textarea[nzAutosize]", inputs: ["nzAutosize"], exportAs: ["nzAutosize"] }, { type: i5.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { type: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }], pipes: { "translate": i12$2.TranslatePipe, "vhLanguage": VhLanguagePipe, "date": i12$1.DatePipe } });
|
|
5130
5450
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AtwFrameRepeatAdmin, decorators: [{
|
|
5131
5451
|
type: Component,
|
|
5132
5452
|
args: [{
|
|
@@ -7582,7 +7902,7 @@ class AtwMenuHorizontalAdmin {
|
|
|
7582
7902
|
}
|
|
7583
7903
|
}
|
|
7584
7904
|
AtwMenuHorizontalAdmin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AtwMenuHorizontalAdmin, deps: [{ token: i1.VhQueryAutoWeb }, { token: i0.ChangeDetectorRef }, { token: i3$1.FunctionService }, { token: i1.VhEventMediator }, { token: PLATFORM_ID }, { token: i4$1.NzModalService }, { token: i3$1.LanguageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
7585
|
-
AtwMenuHorizontalAdmin.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AtwMenuHorizontalAdmin, selector: "atw-menu-horizontal-admin", inputs: { data: "data", type: "type" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"wrapper\">\r\n <!-- <div style=\"display: flex; justify-content: space-between; align-items: center; padding: 0 40px\">\r\n <h1 mat-dialog-title class=\"title-admin\">{{'chinh_sua_noi_dung' | translate}}</h1>\r\n <div mat-button mat-dialog-close class=\"close\" nz-icon nzType=\"close-circle\"></div>\r\n </div> -->\r\n <div style=\"display: flex; justify-content: center; align-items: center; gap: 12px; padding: 0 40px 0 40px;\">\r\n <!-- ch\u1ECDn ng\u00F4n ng\u1EEF \u0111a ng\u00F4n ng\u1EEF -->\r\n <app-select-language-config [displayLabel]=\"true\"></app-select-language-config>\r\n </div>\r\n\r\n <!-- Danh s\u00E1ch menu -->\r\n <div class=\"widget-row-elementor\">\r\n <div class=\"list-menu\" style=\"height: 100%\">\r\n <!-- Ti\u00EAu \u0111\u1EC1 -->\r\n <div class=\"heading-menu\">\r\n <h3 class=\"m-0 menu-title\" style=\"font-weight:500;\">{{'cau_truc_menu' | translate}}</h3>\r\n <div class=\"nav-header\">\r\n <button nz-button style=\"border:1px solid #008848; color:#008848; margin-right:15px;\"\r\n (click)=\"openAddMenuItem()\">{{'them_menu' | translate}}</button>\r\n </div>\r\n </div>\r\n <!-- Danh s\u00E1ch menu -->\r\n <div class=\"elementor-custom\" style=\"overflow-y: scroll;min-height: 500px;max-height: 300px; height: calc(100% - 100px);\">\r\n <mat-tree cdkDropList (cdkDropListDropped)=\"cdkDropListDropped($event)\"\r\n [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" [trackBy]=\"trackById\">\r\n <mat-tree-node [id]=\"node._id\" [attr.group]=\"node.group\" [attr.data-level]=\"node.level\" cdkDrag *matTreeNodeDef=\"let node\" matTreeNodePadding>\r\n <div class=\"w-100 tree_node\">\r\n <div style=\"display: flex; align-items: center\">\r\n <div style=\"padding: 0 10px; display: inline-block; cursor: move\">\r\n <i nz-icon nzType=\"menu\" nzTheme=\"outline\"></i>\r\n </div>\r\n <!-- C\u00F3 menu con th\u00EC th\u00EAm icon expand_more ph\u00EDa tr\u01B0\u1EDBc -->\r\n <button mat-icon-button *ngIf=\"node.expandable\" matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node['name_' + functionService.selectedLanguageCode] | vhLanguage : 'name' : 'AtwMenu'\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}\r\n </mat-icon>\r\n </button>\r\n <!-- Kh\u00F4ng c\u00F3 menu con th\u00EC th\u00EAm button disabled \u0111\u1EC3 c\u00F3 padding ph\u00EDa tr\u01B0\u1EDBc -->\r\n <button *ngIf=\"!node.expandable\" mat-icon-button disabled></button>\r\n <!-- Icon c\u1EE7a menu -->\r\n <span *ngIf=\"node.icon\">\r\n <mat-icon class=\"mr-2\">{{node.icon}}</mat-icon>\r\n </span>\r\n <!-- N\u1ED9i dung menu -->\r\n {{node['name_' + functionService.selectedLanguageCode] | vhLanguage : 'name' : 'AtwMenu'}}\r\n </div>\r\n <!-- Danh s\u00E1ch c\u00E1c n\u00FAt thao t\u00E1c -->\r\n <div class=\"btn-foundation\">\r\n <!-- Th\u00EAm icon -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'them_icon' | translate}}\"\r\n (click)=\"addIconToParent(node)\">\r\n <i class=\"bi bi-star\"></i>\r\n </button>\r\n <!-- Xo\u00E1 icon -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'xoa_icon' | translate}}\"\r\n (click)=\"deleteIcon(node)\">\r\n <i class=\"bi bi-slash-circle-fill\"></i>\r\n </button>\r\n <!-- Th\u00EAm menu con -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'them_menu_con' | translate}}\"\r\n *ngIf=\"node.group != 'category' && !node.id_freeblock\"\r\n (click)=\"openAddSubMenuItem(node)\">\r\n <i class=\"bi bi-plus\"></i>\r\n </button>\r\n <!-- G\u1ECDi c\u00E2y danh m\u1EE5c -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'goi_cay_danh_muc' | translate}}\"\r\n *ngIf=\"(node.group == 'category' || node.group == 'pop-up-subcategory') && node.level == 0\"\r\n (click)=\"openAddSubMenuItem(node)\">\r\n <i class=\"bi bi-text-center\"></i>\r\n </button>\r\n <!-- Ch\u1EC9nh s\u1EEDa menu -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'chinh_sua_menu' | translate}}\"\r\n *ngIf=\"node.group != 'category' || (node.group == 'category' && node.level == 0)\"\r\n (click)=\"openEdit(node)\">\r\n <i class=\"bi bi-pencil\"></i>\r\n </button>\r\n <!-- X\u00F3a -->\r\n <button \r\n nz-popconfirm\r\n nzPopconfirmTitle=\"{{'ban_co_chac_chan_muon_xoa_menu_nay' | translate}}\"\r\n nzPopconfirmPlacement=\"bottom\"\r\n nz-button \r\n nzShape=\"circle\" \r\n nz-tooltip \r\n nzTooltipTitle=\"{{'xoa' | translate}}\"\r\n *ngIf=\"node.group != 'category' || (node.group == 'category' && node.level == 0)\"\r\n (nzOnConfirm)=\"removeMenuItem(node)\"\r\n \r\n >\r\n <i class=\"bi bi-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<!-- MODAL TH\u00CAM MENU -->\r\n<nz-modal [(nzVisible)]=\"isOpenAddMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '60vw', top: '5%',position: 'relative'}\" nzCloseIcon \r\n [nzTitle]=\"titleAddMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-add-menu-header-admin\r\n (isAddMenu)=\"isCancelFormAddMenu($event)\"\r\n [data]=\"dataAddMenu\"\r\n [type]=\"data.type\"\r\n (valueData)=\"getDataFormAdd($event)\">\r\n </app-add-menu-header-admin>\r\n </ng-container>\r\n <ng-template #titleAddMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'them_menu' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL S\u1EECA MENU -->\r\n<nz-modal [(nzVisible)]=\"isOpenEditMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '60vw', top: '5%',position: 'relative'}\" nzCloseIcon\r\n [nzTitle]=\"titleEditMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-edit-menu-header-admin \r\n (isEditMenu)=\"isCancleFormEditMenu($event)\"\r\n [data]=\"dataEditMenu\"\r\n [type]=\"data.type\"\r\n (valueDataEdited)=\"getValueFormEditMenu($event)\">\r\n </app-edit-menu-header-admin>\r\n </ng-container>\r\n <ng-template #titleEditMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'chinh_sua_menu' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL TH\u00CAM MENU PH\u1EE4 -->\r\n<nz-modal [(nzVisible)]=\"isOpenAddFormSubMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: checkExistIdCategory ? '30vw' : '50vw'}\" nzCloseIcon\r\n [nzTitle]=\"titleAddSubMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-add-sub-menu-header-admin \r\n [data]=\"dataAddSubMenu\"\r\n (isCancelFormAddSub)=\"isCancelFormAddSub($event)\"\r\n (valueDataAdd)=\"getValueFormAddSub($event)\"\r\n (getDataCategoryAgain)=\"getDataCategoryAgain($event)\">\r\n </app-add-sub-menu-header-admin>\r\n </ng-container>\r\n <ng-template #titleAddSubMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'them_menu_con' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL CH\u1EC8NH S\u1EECA MENU PH\u1EE4 -->\r\n<nz-modal [(nzVisible)]=\"isOpenEditFormSubMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '50vw'}\" nzCloseIcon\r\n [nzTitle]=\"titleEditSubMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-edit-sub-menu-header-admin (isCancelFormEditSub)=\"isCancleFormEditSub($event)\"\r\n [data]=\"dataEditSubMenu\"\r\n (valueDataEdit)=\"getValueFormEditSub($event)\">\r\n </app-edit-sub-menu-header-admin>\r\n </ng-container>\r\n <ng-template #titleEditSubMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'chinh_sua_menu_con' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>", styles: [".wrapper .widget-row-elementor{display:grid;width:100%;height:100%;grid-column-gap:10px;column-gap:10px;padding:0 40px}.sub-item .sub-content .btn-foundation{display:flex;grid-gap:10px;gap:10px;opacity:0}.wrapper{width:100%;height:100%;background-color:#f1f0f0}.wrapper .widget-row-elementor{display:grid;width:100%;grid-column-gap:10px;column-gap:10px;padding:20px 40px}.wrapper .widget-row-elementor .elementor-custom{height:100%;background-color:#fff;box-shadow:#e3e3e333 0 2px 8px}.wrapper .widget-row-elementor .heading-menu{display:flex;align-items:center;justify-content:space-between;padding:10px;background:white;margin-bottom:10px}.example-list{width:100%;max-width:100%;height:100%;display:block;padding:20px 10px}.example-list::-webkit-scrollbar{width:5px;background-color:#f5f5f5}.example-list::-webkit-scrollbar-thumb{background-color:#bab9b9;border:2px solid #bab9b9;border-radius:5px}.example-box{position:relative;color:#000000de;box-sizing:border-box;list-style-type:none;cursor:move;font-size:14px;width:70%;margin:10px 10px 10px 50px}.example-box .content{position:relative;display:flex;align-items:center;justify-content:space-between;border:1px solid #b6dbff;padding:8px;border-radius:3px;background:#f8f5f5}.example-box .content .icon .item-icon{position:relative}.example-box .content .icon .close-icon{position:absolute;top:-3px;left:0;color:red;font-size:12px;cursor:pointer}.example-box .content .btn-foundation{display:flex;grid-gap:10px;gap:10px;opacity:0}.example-box .content .collapes-sub{position:absolute;top:25%;left:-20px;cursor:pointer}.example-box:hover>.content .btn-foundation{opacity:1}.sub-item{position:relative;border:1px solid #b6dbff;border-radius:3px;margin-bottom:10px;list-style-type:none}.sub-item .sub-content{display:flex;align-items:center;justify-content:space-between;background-color:#f8f5f5}.sub-item .text{padding:10px 0}.sub-item:hover>.sub-content .btn-foundation{opacity:1}.sub-item:first-child:before{height:70%}.tree_node{display:flex;align-items:center;justify-content:space-between}.tree_node:hover{background-color:#f7f7f7}.btn-foundation{display:flex;justify-content:flex-end;grid-gap:10px;gap:10px;padding-right:16px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.example-box:last-child{border:none}.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.elementor-custom::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px #d2d2d2;background-color:#fff}.elementor-custom::-webkit-scrollbar{width:5px;background-color:#55c4f8}.elementor-custom::-webkit-scrollbar-thumb{border-radius:5px;background-color:#55c4f8}.title-admin{font-weight:bold;color:#008848;text-align:center;margin:15px 0}\n"], components: [{ type: SelectLanguageConfigComponent, selector: "app-select-language-config", inputs: ["isAdmin", "displayLabel", "isSetLanguageCode", "languages"], outputs: ["handleChangeMultiLanguage"] }, { type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { type: i6$3.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { type: i3$3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i12$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4$1.NzModalComponent, selector: "nz-modal", inputs: ["nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzZIndex", "nzWidth", "nzCloseIcon", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel", "nzTitle", "nzFooter", "nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzContent", "nzComponentParams", "nzWrapClassName", "nzClassName", "nzStyle", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { type: AddMenuHeaderAdminComponent, selector: "app-add-menu-header-admin", inputs: ["data", "type"], outputs: ["isAddMenu", "valueData"] }, { type: EditMenuHeaderAdminComponent, selector: "app-edit-menu-header-admin", inputs: ["data", "type"], outputs: ["isEditMenu", "valueDataEdited"] }, { type: AddSubMenuHeaderAdminComponent, selector: "app-add-sub-menu-header-admin", inputs: ["data"], outputs: ["isCancelFormAddSub", "valueDataAdd", "getDataCategoryAgain"] }, { type: EditSubMenuHeaderAdminComponent, selector: "app-edit-sub-menu-header-admin", inputs: ["data"], outputs: ["isCancelFormEditSub", "valueDataEdit"] }], directives: [{ type: i17.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i19$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "id", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListAutoScrollDisabled", "cdkDropListOrientation", "cdkDropListLockAxis", "cdkDropListData", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i6$3.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { type: i6$3.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { type: i19$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragPreviewContainer", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i6$3.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { type: i18.NzIconDirective, selector: "[nz-icon]", inputs: ["nzRotate", "nzSpin", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i12$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6$3.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { type: i21.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitleContext", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipTitle", "nz-tooltip", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { type: i22.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus", "nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nz-popconfirm", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDanger", "nzCancelText", "nzIcon"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { type: i4$1.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }], pipes: { "translate": i12$2.TranslatePipe, "vhLanguage": VhLanguagePipe } });
|
|
7905
|
+
AtwMenuHorizontalAdmin.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AtwMenuHorizontalAdmin, selector: "atw-menu-horizontal-admin", inputs: { data: "data", type: "type" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"wrapper\">\r\n <!-- <div style=\"display: flex; justify-content: space-between; align-items: center; padding: 0 40px\">\r\n <h1 mat-dialog-title class=\"title-admin\">{{'chinh_sua_noi_dung' | translate}}</h1>\r\n <div mat-button mat-dialog-close class=\"close\" nz-icon nzType=\"close-circle\"></div>\r\n </div> -->\r\n <div style=\"display: flex; justify-content: center; align-items: center; gap: 12px; padding: 0 40px 0 40px;\">\r\n <!-- ch\u1ECDn ng\u00F4n ng\u1EEF \u0111a ng\u00F4n ng\u1EEF -->\r\n <app-select-language-config [displayLabel]=\"true\"></app-select-language-config>\r\n </div>\r\n\r\n <!-- Danh s\u00E1ch menu -->\r\n <div class=\"widget-row-elementor\">\r\n <div class=\"list-menu\" style=\"height: 100%\">\r\n <!-- Ti\u00EAu \u0111\u1EC1 -->\r\n <div class=\"heading-menu\">\r\n <h3 class=\"m-0 menu-title\" style=\"font-weight:500;\">{{'cau_truc_menu' | translate}}</h3>\r\n <div class=\"nav-header\">\r\n <button nz-button style=\"border:1px solid #008848; color:#008848; margin-right:15px;\"\r\n (click)=\"openAddMenuItem()\">{{'them_menu' | translate}}</button>\r\n </div>\r\n </div>\r\n <!-- Danh s\u00E1ch menu -->\r\n <div class=\"elementor-custom\" style=\"overflow-y: scroll;min-height: 500px;max-height: 300px; height: calc(100% - 100px);\">\r\n <mat-tree cdkDropList (cdkDropListDropped)=\"cdkDropListDropped($event)\"\r\n [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" [trackBy]=\"trackById\">\r\n <mat-tree-node [id]=\"node._id\" [attr.group]=\"node.group\" [attr.data-level]=\"node.level\" cdkDrag *matTreeNodeDef=\"let node\" matTreeNodePadding>\r\n <div class=\"w-100 tree_node\">\r\n <div style=\"display: flex; align-items: center\">\r\n <div style=\"padding: 0 10px; display: inline-block; cursor: move\">\r\n <i nz-icon nzType=\"menu\" nzTheme=\"outline\"></i>\r\n </div>\r\n <!-- C\u00F3 menu con th\u00EC th\u00EAm icon expand_more ph\u00EDa tr\u01B0\u1EDBc -->\r\n <button mat-icon-button *ngIf=\"node.expandable\" matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node['name_' + functionService.selectedLanguageCode] | vhLanguage : 'name' : 'AtwMenu'\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}\r\n </mat-icon>\r\n </button>\r\n <!-- Kh\u00F4ng c\u00F3 menu con th\u00EC th\u00EAm button disabled \u0111\u1EC3 c\u00F3 padding ph\u00EDa tr\u01B0\u1EDBc -->\r\n <button *ngIf=\"!node.expandable\" mat-icon-button disabled></button>\r\n <!-- Icon c\u1EE7a menu -->\r\n <span *ngIf=\"node.icon\">\r\n <mat-icon class=\"mr-2\">{{node.icon}}</mat-icon>\r\n </span>\r\n <!-- N\u1ED9i dung menu -->\r\n {{node['name_' + functionService.selectedLanguageCode] | vhLanguage : 'name' : 'AtwMenu'}}\r\n </div>\r\n <!-- Danh s\u00E1ch c\u00E1c n\u00FAt thao t\u00E1c -->\r\n <div class=\"btn-foundation\">\r\n <!-- Th\u00EAm icon -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'them_icon' | translate}}\"\r\n (click)=\"addIconToParent(node)\">\r\n <i class=\"bi bi-star\"></i>\r\n </button>\r\n <!-- Xo\u00E1 icon -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'xoa_icon' | translate}}\"\r\n (click)=\"deleteIcon(node)\">\r\n <i class=\"bi bi-slash-circle-fill\"></i>\r\n </button>\r\n <!-- Th\u00EAm menu con -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'them_menu_con' | translate}}\"\r\n *ngIf=\"node.group != 'category' && !node.id_freeblock\"\r\n (click)=\"openAddSubMenuItem(node)\">\r\n <i class=\"bi bi-plus\"></i>\r\n </button>\r\n <!-- G\u1ECDi c\u00E2y danh m\u1EE5c -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'goi_cay_danh_muc' | translate}}\"\r\n *ngIf=\"(node.group == 'category' || node.group == 'pop-up-subcategory') && node.level == 0\"\r\n (click)=\"openAddSubMenuItem(node)\">\r\n <i class=\"bi bi-text-center\"></i>\r\n </button>\r\n <!-- Ch\u1EC9nh s\u1EEDa menu -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'chinh_sua_menu' | translate}}\"\r\n *ngIf=\"node.group != 'category' || (node.group == 'category' && node.level == 0)\"\r\n (click)=\"openEdit(node)\">\r\n <i class=\"bi bi-pencil\"></i>\r\n </button>\r\n <!-- X\u00F3a -->\r\n <button \r\n nz-popconfirm\r\n nzPopconfirmTitle=\"{{'ban_co_chac_chan_muon_xoa_menu_nay' | translate}}\"\r\n nzPopconfirmPlacement=\"bottom\"\r\n nz-button \r\n nzShape=\"circle\" \r\n nz-tooltip \r\n nzTooltipTitle=\"{{'xoa' | translate}}\"\r\n *ngIf=\"node.group != 'category' || (node.group == 'category' && node.level == 0)\"\r\n (nzOnConfirm)=\"removeMenuItem(node)\"\r\n \r\n >\r\n <i class=\"bi bi-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<!-- MODAL TH\u00CAM MENU -->\r\n<nz-modal [(nzVisible)]=\"isOpenAddMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '60vw', top: '5%',position: 'relative'}\" nzCloseIcon \r\n [nzTitle]=\"titleAddMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-add-menu-header-admin\r\n (isAddMenu)=\"isCancelFormAddMenu($event)\"\r\n [data]=\"dataAddMenu\"\r\n [type]=\"data.type\"\r\n (valueData)=\"getDataFormAdd($event)\">\r\n </app-add-menu-header-admin>\r\n </ng-container>\r\n <ng-template #titleAddMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'them_menu' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL S\u1EECA MENU -->\r\n<nz-modal [(nzVisible)]=\"isOpenEditMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '60vw', top: '5%',position: 'relative'}\" nzCloseIcon\r\n [nzTitle]=\"titleEditMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-edit-menu-header-admin \r\n (isEditMenu)=\"isCancleFormEditMenu($event)\"\r\n [data]=\"dataEditMenu\"\r\n [type]=\"data.type\"\r\n (valueDataEdited)=\"getValueFormEditMenu($event)\">\r\n </app-edit-menu-header-admin>\r\n </ng-container>\r\n <ng-template #titleEditMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'chinh_sua_menu' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL TH\u00CAM MENU PH\u1EE4 -->\r\n<nz-modal [(nzVisible)]=\"isOpenAddFormSubMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: checkExistIdCategory ? '30vw' : '50vw'}\" nzCloseIcon\r\n [nzTitle]=\"titleAddSubMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-add-sub-menu-header-admin \r\n [data]=\"dataAddSubMenu\"\r\n (isCancelFormAddSub)=\"isCancelFormAddSub($event)\"\r\n (valueDataAdd)=\"getValueFormAddSub($event)\"\r\n (getDataCategoryAgain)=\"getDataCategoryAgain($event)\">\r\n </app-add-sub-menu-header-admin>\r\n </ng-container>\r\n <ng-template #titleAddSubMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'them_menu_con' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL CH\u1EC8NH S\u1EECA MENU PH\u1EE4 -->\r\n<nz-modal [(nzVisible)]=\"isOpenEditFormSubMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '50vw'}\" nzCloseIcon\r\n [nzTitle]=\"titleEditSubMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-edit-sub-menu-header-admin (isCancelFormEditSub)=\"isCancleFormEditSub($event)\"\r\n [data]=\"dataEditSubMenu\"\r\n (valueDataEdit)=\"getValueFormEditSub($event)\">\r\n </app-edit-sub-menu-header-admin>\r\n </ng-container>\r\n <ng-template #titleEditSubMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'chinh_sua_menu_con' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>", styles: [".wrapper .widget-row-elementor{display:grid;width:100%;height:100%;grid-column-gap:10px;column-gap:10px;padding:0 40px}.sub-item .sub-content .btn-foundation{display:flex;grid-gap:10px;gap:10px;opacity:0}.wrapper{width:100%;height:100%;background-color:#f1f0f0}.wrapper .widget-row-elementor{display:grid;width:100%;grid-column-gap:10px;column-gap:10px;padding:20px 40px}.wrapper .widget-row-elementor .elementor-custom{height:100%;background-color:#fff;box-shadow:#e3e3e333 0 2px 8px}.wrapper .widget-row-elementor .heading-menu{display:flex;align-items:center;justify-content:space-between;padding:10px;background:white;margin-bottom:10px}.example-list{width:100%;max-width:100%;height:100%;display:block;padding:20px 10px}.example-list::-webkit-scrollbar{width:5px;background-color:#f5f5f5}.example-list::-webkit-scrollbar-thumb{background-color:#bab9b9;border:2px solid #bab9b9;border-radius:5px}.example-box{position:relative;color:#000000de;box-sizing:border-box;list-style-type:none;cursor:move;font-size:14px;width:70%;margin:10px 10px 10px 50px}.example-box .content{position:relative;display:flex;align-items:center;justify-content:space-between;border:1px solid #b6dbff;padding:8px;border-radius:3px;background:#f8f5f5}.example-box .content .icon .item-icon{position:relative}.example-box .content .icon .close-icon{position:absolute;top:-3px;left:0;color:red;font-size:12px;cursor:pointer}.example-box .content .btn-foundation{display:flex;grid-gap:10px;gap:10px;opacity:0}.example-box .content .collapes-sub{position:absolute;top:25%;left:-20px;cursor:pointer}.example-box:hover>.content .btn-foundation{opacity:1}.sub-item{position:relative;border:1px solid #b6dbff;border-radius:3px;margin-bottom:10px;list-style-type:none}.sub-item .sub-content{display:flex;align-items:center;justify-content:space-between;background-color:#f8f5f5}.sub-item .text{padding:10px 0}.sub-item:hover>.sub-content .btn-foundation{opacity:1}.sub-item:first-child:before{height:70%}.tree_node{display:flex;align-items:center;justify-content:space-between}.tree_node:hover{background-color:#f7f7f7}.btn-foundation{display:flex;justify-content:flex-end;grid-gap:10px;gap:10px;padding-right:16px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.example-box:last-child{border:none}.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.elementor-custom::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px #d2d2d2;background-color:#fff}.elementor-custom::-webkit-scrollbar{width:5px;background-color:#55c4f8}.elementor-custom::-webkit-scrollbar-thumb{border-radius:5px;background-color:#55c4f8}.title-admin{font-weight:bold;color:#008848;text-align:center;margin:15px 0}\n"], components: [{ type: SelectLanguageConfigComponent, selector: "app-select-language-config", inputs: ["isAdmin", "displayLabel", "isSetLanguageCode", "languages"], outputs: ["handleChangeMultiLanguage"] }, { type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { type: i6$3.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { type: i3$3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i12$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4$1.NzModalComponent, selector: "nz-modal", inputs: ["nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzZIndex", "nzWidth", "nzCloseIcon", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel", "nzTitle", "nzFooter", "nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzContent", "nzComponentParams", "nzWrapClassName", "nzClassName", "nzStyle", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { type: AddMenuHeaderAdminComponent, selector: "app-add-menu-header-admin", inputs: ["data", "type"], outputs: ["isAddMenu", "valueData"] }, { type: EditMenuHeaderAdminComponent, selector: "app-edit-menu-header-admin", inputs: ["data", "type"], outputs: ["isEditMenu", "valueDataEdited"] }, { type: AddSubMenuHeaderAdminComponent, selector: "app-add-sub-menu-header-admin", inputs: ["data"], outputs: ["isCancelFormAddSub", "valueDataAdd", "getDataCategoryAgain"] }, { type: EditSubMenuHeaderAdminComponent, selector: "app-edit-sub-menu-header-admin", inputs: ["data"], outputs: ["isCancelFormEditSub", "valueDataEdit"] }], directives: [{ type: i17.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i19$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "id", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListAutoScrollDisabled", "cdkDropListOrientation", "cdkDropListLockAxis", "cdkDropListData", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i6$3.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { type: i6$3.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { type: i19$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragPreviewContainer", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i6$3.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { type: i18.NzIconDirective, selector: "[nz-icon]", inputs: ["nzRotate", "nzSpin", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i12$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6$3.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { type: i21.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitleContext", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipTitle", "nz-tooltip", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { type: i24.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus", "nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nz-popconfirm", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDanger", "nzCancelText", "nzIcon"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { type: i4$1.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }], pipes: { "translate": i12$2.TranslatePipe, "vhLanguage": VhLanguagePipe } });
|
|
7586
7906
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AtwMenuHorizontalAdmin, decorators: [{
|
|
7587
7907
|
type: Component,
|
|
7588
7908
|
args: [{
|
|
@@ -8830,7 +9150,7 @@ class AtwMenuVerticalAdmin {
|
|
|
8830
9150
|
}
|
|
8831
9151
|
}
|
|
8832
9152
|
AtwMenuVerticalAdmin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AtwMenuVerticalAdmin, deps: [{ token: i3$1.FunctionService }, { token: i1.VhQueryAutoWeb }, { token: i2.MatDialog }, { token: i0.ChangeDetectorRef }, { token: i4$1.NzModalRef, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
8833
|
-
AtwMenuVerticalAdmin.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AtwMenuVerticalAdmin, selector: "atw-menu-vertical-admin", inputs: { data: "data", type: "type" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"wrapper\">\r\n <!-- Ch\u1ECDn ng\u00F4n ng\u1EEF -->\r\n <div class=\"mb-3\" style=\"padding: 20px 40px 0 40px;\">\r\n <app-select-language-config [isAdmin]=\"true\"></app-select-language-config>\r\n </div>\r\n <!-- Danh s\u00E1ch menu -->\r\n <div class=\"widget-row-elementor\">\r\n <div class=\"list-menu\" style=\"height: calc(100% - 70px)\">\r\n <!-- Ti\u00EAu \u0111\u1EC1 -->\r\n <div class=\"heading-menu\">\r\n <h3 class=\"m-0 menu-title\" style=\"font-weight:500;\">{{'cau_truc_menu' | translate}}</h3>\r\n <div class=\"nav-header\">\r\n <button nz-button style=\"border:1px solid #008848; color:#008848; margin-right:15px;\"\r\n (click)=\"openAddMenuItem()\">{{'them_menu' | translate}}</button>\r\n </div>\r\n </div>\r\n <!-- Danh s\u00E1ch menu -->\r\n <div class=\"elementor-custom\" style=\"overflow-y: scroll;min-height: 600px; height: calc(100% - 100px);\">\r\n <!-- <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\"> -->\r\n <mat-tree cdkDropList (cdkDropListDropped)=\"cdkDropListDropped($event)\"\r\n [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\r\n <mat-tree-node cdkDrag [cdkDragDisabled]=\"node.level != 0\" *matTreeNodeDef=\"let node\" matTreeNodePadding>\r\n <div class=\"w-100 tree_node\">\r\n <div style=\"display: flex; align-items: center\">\r\n <div style=\"padding: 0 10px; display: inline-block\">\r\n <i nz-icon nzType=\"menu\" nzTheme=\"outline\" *ngIf=\"node.level == 0\"></i>\r\n </div>\r\n <!-- C\u00F3 menu con th\u00EC th\u00EAm icon expand_more ph\u00EDa tr\u01B0\u1EDBc -->\r\n <button mat-icon-button *ngIf=\"node.expandable\" matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node['name_' + functionService.selectedLanguageCode] | vhLanguage : 'name' : 'AtwMenu'\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}\r\n </mat-icon>\r\n </button>\r\n <!-- Kh\u00F4ng c\u00F3 menu con th\u00EC th\u00EAm button disabled \u0111\u1EC3 c\u00F3 padding ph\u00EDa tr\u01B0\u1EDBc -->\r\n <button *ngIf=\"!node.expandable\" mat-icon-button disabled></button>\r\n <!-- Icon c\u1EE7a menu -->\r\n <span *ngIf=\"node.icon\">\r\n <mat-icon class=\"mr-2\">{{node.icon}}</mat-icon>\r\n </span>\r\n <!-- N\u1ED9i dung menu -->\r\n {{node['name_' + functionService.selectedLanguageCode] | vhLanguage : 'name' : 'AtwMenu'}}\r\n </div>\r\n <!-- Danh s\u00E1ch c\u00E1c n\u00FAt thao t\u00E1c -->\r\n <div class=\"btn-foundation\">\r\n <!-- Th\u00EAm icon -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'them_icon' | translate}}\"\r\n (click)=\"addIconToParent(node)\">\r\n <i class=\"bi bi-star\"></i>\r\n </button>\r\n <!-- Xo\u00E1 icon -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'xoa_icon' | translate}}\"\r\n (click)=\"deleteIcon(node)\">\r\n <i class=\"bi bi-slash-circle-fill\"></i>\r\n </button>\r\n <!-- Th\u00EAm menu con -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'them_menu_con' | translate}}\"\r\n *ngIf=\"node.group != 'category' && !node.id_freeblock\"\r\n (click)=\"openAddSubMenuItem(node)\">\r\n <i class=\"bi bi-plus\"></i>\r\n </button>\r\n <!-- G\u1ECDi c\u00E2y danh m\u1EE5c -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'goi_cay_danh_muc' | translate}}\"\r\n *ngIf=\"node.group == 'category' && node.level == 0\"\r\n (click)=\"openAddSubMenuItem(node)\">\r\n <i class=\"bi bi-text-center\"></i>\r\n </button>\r\n <!-- Ch\u1EC9nh s\u1EEDa menu -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'chinh_sua_menu' | translate}}\"\r\n *ngIf=\"node.group != 'category' || (node.group == 'category' && node.level == 0)\"\r\n (click)=\"openEdit(node)\">\r\n <i class=\"bi bi-pencil\"></i>\r\n </button>\r\n <!-- X\u00F3a -->\r\n <button \r\n nz-popconfirm\r\n nzPopconfirmTitle=\"{{'ban_co_chac_chan_muon_xoa_menu_nay' | translate}}\"\r\n nzPopconfirmPlacement=\"bottom\"\r\n nz-button \r\n nzShape=\"circle\" \r\n nz-tooltip \r\n nzTooltipTitle=\"{{'xoa' | translate}}\"\r\n *ngIf=\"node.group != 'category' || (node.group == 'category' && node.level == 0)\"\r\n (nzOnConfirm)=\"removeMenuItem(node)\"\r\n \r\n >\r\n <i class=\"bi bi-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </mat-tree-node>\r\n </mat-tree>\r\n <!-- </mat-tree> -->\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<!-- MODAL TH\u00CAM MENU -->\r\n<nz-modal [(nzVisible)]=\"isOpenAddMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '60vw', top: '5%',position: 'relative'}\" nzCloseIcon \r\n [nzTitle]=\"titleAddMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-add-menu-vertical-admin (isAddMenu)=\"isCancelFormAddMenu($event)\"\r\n [data]=\"dataAddMenu\"\r\n [type]=\"type\"\r\n (valueData)=\"getDataFormAdd($event)\">\r\n </app-add-menu-vertical-admin>\r\n </ng-container>\r\n <ng-template #titleAddMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'them_menu' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL S\u1EECA MENU -->\r\n<nz-modal [(nzVisible)]=\"isOpenEditMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '60vw', top: '5%',position: 'relative'}\" nzCloseIcon\r\n [nzTitle]=\"titleEditMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-edit-menu-vertical-admin (isEditMenu)=\"isCancleFormEditMenu($event)\"\r\n [data]=\"dataEditMenu\"\r\n [type]=\"type\"\r\n (valueDataEdited)=\"getValueFormEditMenu($event)\">\r\n </app-edit-menu-vertical-admin>\r\n </ng-container>\r\n <ng-template #titleEditMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'chinh_sua_menu' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL TH\u00CAM MENU PH\u1EE4 -->\r\n<nz-modal [(nzVisible)]=\"isOpenAddFormSubMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: checkExistIdCategory ? '30vw' : '50vw'}\" nzCloseIcon\r\n [nzTitle]=\"titleAddSubMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-add-sub-menu-vertical-admin (isCancelFormAddSub)=\"isCancelFormAddSub($event)\"\r\n [data]=\"dataAddSubMenu\"\r\n (valueDataAdd)=\"getValueFormAddSub($event)\"\r\n (getDataCategoryAgain)=\"getDataCategoryAgain($event)\">\r\n </app-add-sub-menu-vertical-admin>\r\n </ng-container>\r\n <ng-template #titleAddSubMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'them_menu_con' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL CH\u1EC8NH S\u1EECA MENU PH\u1EE4 -->\r\n<nz-modal [(nzVisible)]=\"isOpenEditFormSubMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '50vw'}\" nzCloseIcon\r\n [nzTitle]=\"titleEditSubMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-edit-sub-menu-vertical-admin (isCancelFormEditSub)=\"isCancleFormEditSub($event)\"\r\n [data]=\"dataEditSubMenu\"\r\n (valueDataEdit)=\"getValueFormEditSub($event)\">\r\n </app-edit-sub-menu-vertical-admin>\r\n </ng-container>\r\n <ng-template #titleEditSubMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'chinh_sua_menu_con' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>", styles: [".sub-item .sub-content .btn-foundation{display:flex;grid-gap:10px;gap:10px;opacity:0}.wrapper{width:100%;height:100%;background-color:#f1f0f0}.wrapper .widget-row-elementor{display:grid;width:100%;height:100%;grid-column-gap:10px;column-gap:10px;padding:20px 40px}.wrapper .widget-row-elementor .elementor-custom{height:100%;background-color:#fff;box-shadow:#e3e3e333 0 2px 8px}.wrapper .widget-row-elementor .heading-menu{display:flex;align-items:center;justify-content:space-between;padding:10px;background:white;margin-bottom:10px}.example-list{width:100%;max-width:100%;height:100%;display:block;padding:20px 10px}.example-list::-webkit-scrollbar{width:5px;background-color:#f5f5f5}.example-list::-webkit-scrollbar-thumb{background-color:#bab9b9;border:2px solid #bab9b9;border-radius:5px}.example-box{position:relative;color:#000000de;box-sizing:border-box;list-style-type:none;cursor:move;font-size:14px;width:70%;margin:10px 10px 10px 50px}.example-box .content{position:relative;display:flex;align-items:center;justify-content:space-between;border:1px solid #b6dbff;padding:8px;border-radius:3px;background:#f8f5f5}.example-box .content .icon .item-icon{position:relative}.example-box .content .icon .close-icon{position:absolute;top:-3px;left:0;color:red;font-size:12px;cursor:pointer}.example-box .content .btn-foundation{display:flex;grid-gap:10px;gap:10px;opacity:0}.example-box .content .collapes-sub{position:absolute;top:25%;left:-20px;cursor:pointer}.example-box:hover>.content .btn-foundation{opacity:1}.sub-item{position:relative;border:1px solid #b6dbff;border-radius:3px;margin-bottom:10px;list-style-type:none}.sub-item .sub-content{display:flex;align-items:center;justify-content:space-between;background-color:#f8f5f5}.sub-item .text{padding:10px 0}.sub-item:hover>.sub-content .btn-foundation{opacity:1}.sub-item:first-child:before{height:70%}.tree_node{display:flex;align-items:center;justify-content:space-between}.tree_node:hover{background-color:#f7f7f7}.btn-foundation{display:flex;justify-content:flex-end;grid-gap:10px;gap:10px;padding-right:16px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.example-box:last-child{border:none}.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.elementor-custom::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px #d2d2d2;background-color:#fff}.elementor-custom::-webkit-scrollbar{width:5px;background-color:#55c4f8}.elementor-custom::-webkit-scrollbar-thumb{border-radius:5px;background-color:#55c4f8}\n"], components: [{ type: SelectLanguageConfigComponent, selector: "app-select-language-config", inputs: ["isAdmin", "displayLabel", "isSetLanguageCode", "languages"], outputs: ["handleChangeMultiLanguage"] }, { type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { type: i6$3.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { type: i3$3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i12$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4$1.NzModalComponent, selector: "nz-modal", inputs: ["nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzZIndex", "nzWidth", "nzCloseIcon", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel", "nzTitle", "nzFooter", "nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzContent", "nzComponentParams", "nzWrapClassName", "nzClassName", "nzStyle", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { type: AddMenuVerticalAdminComponent, selector: "app-add-menu-vertical-admin", inputs: ["data", "type"], outputs: ["isAddMenu", "isEditMenu", "valueData", "valueDataEdited"] }, { type: EditMenuVerticalAdminComponent, selector: "app-edit-menu-vertical-admin", inputs: ["data", "type"], outputs: ["isEditMenu", "valueDataEdited"] }, { type: AddSubMenuVerticalAdminComponent, selector: "app-add-sub-menu-vertical-admin", inputs: ["data"], outputs: ["isCancelFormAddSub", "valueDataAdd", "getDataCategoryAgain"] }, { type: EditSubMenuVerticalAdminComponent, selector: "app-edit-sub-menu-vertical-admin", inputs: ["data"], outputs: ["isCancelFormEditSub", "valueDataEdit"] }], directives: [{ type: i17.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i19$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "id", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListAutoScrollDisabled", "cdkDropListOrientation", "cdkDropListLockAxis", "cdkDropListData", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i6$3.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { type: i6$3.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { type: i19$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragPreviewContainer", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i6$3.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { type: i12$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i18.NzIconDirective, selector: "[nz-icon]", inputs: ["nzRotate", "nzSpin", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i6$3.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { type: i21.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitleContext", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipTitle", "nz-tooltip", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { type: i22.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus", "nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nz-popconfirm", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDanger", "nzCancelText", "nzIcon"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { type: i4$1.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }], pipes: { "translate": i12$2.TranslatePipe, "vhLanguage": VhLanguagePipe } });
|
|
9153
|
+
AtwMenuVerticalAdmin.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AtwMenuVerticalAdmin, selector: "atw-menu-vertical-admin", inputs: { data: "data", type: "type" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"wrapper\">\r\n <!-- Ch\u1ECDn ng\u00F4n ng\u1EEF -->\r\n <div class=\"mb-3\" style=\"padding: 20px 40px 0 40px;\">\r\n <app-select-language-config [isAdmin]=\"true\"></app-select-language-config>\r\n </div>\r\n <!-- Danh s\u00E1ch menu -->\r\n <div class=\"widget-row-elementor\">\r\n <div class=\"list-menu\" style=\"height: calc(100% - 70px)\">\r\n <!-- Ti\u00EAu \u0111\u1EC1 -->\r\n <div class=\"heading-menu\">\r\n <h3 class=\"m-0 menu-title\" style=\"font-weight:500;\">{{'cau_truc_menu' | translate}}</h3>\r\n <div class=\"nav-header\">\r\n <button nz-button style=\"border:1px solid #008848; color:#008848; margin-right:15px;\"\r\n (click)=\"openAddMenuItem()\">{{'them_menu' | translate}}</button>\r\n </div>\r\n </div>\r\n <!-- Danh s\u00E1ch menu -->\r\n <div class=\"elementor-custom\" style=\"overflow-y: scroll;min-height: 600px; height: calc(100% - 100px);\">\r\n <!-- <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\"> -->\r\n <mat-tree cdkDropList (cdkDropListDropped)=\"cdkDropListDropped($event)\"\r\n [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\r\n <mat-tree-node cdkDrag [cdkDragDisabled]=\"node.level != 0\" *matTreeNodeDef=\"let node\" matTreeNodePadding>\r\n <div class=\"w-100 tree_node\">\r\n <div style=\"display: flex; align-items: center\">\r\n <div style=\"padding: 0 10px; display: inline-block\">\r\n <i nz-icon nzType=\"menu\" nzTheme=\"outline\" *ngIf=\"node.level == 0\"></i>\r\n </div>\r\n <!-- C\u00F3 menu con th\u00EC th\u00EAm icon expand_more ph\u00EDa tr\u01B0\u1EDBc -->\r\n <button mat-icon-button *ngIf=\"node.expandable\" matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node['name_' + functionService.selectedLanguageCode] | vhLanguage : 'name' : 'AtwMenu'\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}\r\n </mat-icon>\r\n </button>\r\n <!-- Kh\u00F4ng c\u00F3 menu con th\u00EC th\u00EAm button disabled \u0111\u1EC3 c\u00F3 padding ph\u00EDa tr\u01B0\u1EDBc -->\r\n <button *ngIf=\"!node.expandable\" mat-icon-button disabled></button>\r\n <!-- Icon c\u1EE7a menu -->\r\n <span *ngIf=\"node.icon\">\r\n <mat-icon class=\"mr-2\">{{node.icon}}</mat-icon>\r\n </span>\r\n <!-- N\u1ED9i dung menu -->\r\n {{node['name_' + functionService.selectedLanguageCode] | vhLanguage : 'name' : 'AtwMenu'}}\r\n </div>\r\n <!-- Danh s\u00E1ch c\u00E1c n\u00FAt thao t\u00E1c -->\r\n <div class=\"btn-foundation\">\r\n <!-- Th\u00EAm icon -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'them_icon' | translate}}\"\r\n (click)=\"addIconToParent(node)\">\r\n <i class=\"bi bi-star\"></i>\r\n </button>\r\n <!-- Xo\u00E1 icon -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'xoa_icon' | translate}}\"\r\n (click)=\"deleteIcon(node)\">\r\n <i class=\"bi bi-slash-circle-fill\"></i>\r\n </button>\r\n <!-- Th\u00EAm menu con -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'them_menu_con' | translate}}\"\r\n *ngIf=\"node.group != 'category' && !node.id_freeblock\"\r\n (click)=\"openAddSubMenuItem(node)\">\r\n <i class=\"bi bi-plus\"></i>\r\n </button>\r\n <!-- G\u1ECDi c\u00E2y danh m\u1EE5c -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'goi_cay_danh_muc' | translate}}\"\r\n *ngIf=\"node.group == 'category' && node.level == 0\"\r\n (click)=\"openAddSubMenuItem(node)\">\r\n <i class=\"bi bi-text-center\"></i>\r\n </button>\r\n <!-- Ch\u1EC9nh s\u1EEDa menu -->\r\n <button nz-button nzShape=\"circle\" nz-tooltip nzTooltipTitle=\"{{'chinh_sua_menu' | translate}}\"\r\n *ngIf=\"node.group != 'category' || (node.group == 'category' && node.level == 0)\"\r\n (click)=\"openEdit(node)\">\r\n <i class=\"bi bi-pencil\"></i>\r\n </button>\r\n <!-- X\u00F3a -->\r\n <button \r\n nz-popconfirm\r\n nzPopconfirmTitle=\"{{'ban_co_chac_chan_muon_xoa_menu_nay' | translate}}\"\r\n nzPopconfirmPlacement=\"bottom\"\r\n nz-button \r\n nzShape=\"circle\" \r\n nz-tooltip \r\n nzTooltipTitle=\"{{'xoa' | translate}}\"\r\n *ngIf=\"node.group != 'category' || (node.group == 'category' && node.level == 0)\"\r\n (nzOnConfirm)=\"removeMenuItem(node)\"\r\n \r\n >\r\n <i class=\"bi bi-trash\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </mat-tree-node>\r\n </mat-tree>\r\n <!-- </mat-tree> -->\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<!-- MODAL TH\u00CAM MENU -->\r\n<nz-modal [(nzVisible)]=\"isOpenAddMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '60vw', top: '5%',position: 'relative'}\" nzCloseIcon \r\n [nzTitle]=\"titleAddMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-add-menu-vertical-admin (isAddMenu)=\"isCancelFormAddMenu($event)\"\r\n [data]=\"dataAddMenu\"\r\n [type]=\"type\"\r\n (valueData)=\"getDataFormAdd($event)\">\r\n </app-add-menu-vertical-admin>\r\n </ng-container>\r\n <ng-template #titleAddMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'them_menu' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL S\u1EECA MENU -->\r\n<nz-modal [(nzVisible)]=\"isOpenEditMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '60vw', top: '5%',position: 'relative'}\" nzCloseIcon\r\n [nzTitle]=\"titleEditMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-edit-menu-vertical-admin (isEditMenu)=\"isCancleFormEditMenu($event)\"\r\n [data]=\"dataEditMenu\"\r\n [type]=\"type\"\r\n (valueDataEdited)=\"getValueFormEditMenu($event)\">\r\n </app-edit-menu-vertical-admin>\r\n </ng-container>\r\n <ng-template #titleEditMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'chinh_sua_menu' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL TH\u00CAM MENU PH\u1EE4 -->\r\n<nz-modal [(nzVisible)]=\"isOpenAddFormSubMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: checkExistIdCategory ? '30vw' : '50vw'}\" nzCloseIcon\r\n [nzTitle]=\"titleAddSubMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-add-sub-menu-vertical-admin (isCancelFormAddSub)=\"isCancelFormAddSub($event)\"\r\n [data]=\"dataAddSubMenu\"\r\n (valueDataAdd)=\"getValueFormAddSub($event)\"\r\n (getDataCategoryAgain)=\"getDataCategoryAgain($event)\">\r\n </app-add-sub-menu-vertical-admin>\r\n </ng-container>\r\n <ng-template #titleAddSubMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'them_menu_con' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>\r\n<!-- MODAL CH\u1EC8NH S\u1EECA MENU PH\u1EE4 -->\r\n<nz-modal [(nzVisible)]=\"isOpenEditFormSubMenu\" [nzFooter]=\"null\"\r\n [nzStyle]=\"{width: '50vw'}\" nzCloseIcon\r\n [nzTitle]=\"titleEditSubMenu\" nzCancelText=\"{{'huy' | translate}}\" nzOkText=\"{{'luu' | translate}}\">\r\n <ng-container *nzModalContent>\r\n <app-edit-sub-menu-vertical-admin (isCancelFormEditSub)=\"isCancleFormEditSub($event)\"\r\n [data]=\"dataEditSubMenu\"\r\n (valueDataEdit)=\"getValueFormEditSub($event)\">\r\n </app-edit-sub-menu-vertical-admin>\r\n </ng-container>\r\n <ng-template #titleEditSubMenu>\r\n <p class=\"m-0 title\" style=\"font-weight:400;\">{{'chinh_sua_menu_con' | translate}}</p>\r\n </ng-template>\r\n</nz-modal>", styles: [".sub-item .sub-content .btn-foundation{display:flex;grid-gap:10px;gap:10px;opacity:0}.wrapper{width:100%;height:100%;background-color:#f1f0f0}.wrapper .widget-row-elementor{display:grid;width:100%;height:100%;grid-column-gap:10px;column-gap:10px;padding:20px 40px}.wrapper .widget-row-elementor .elementor-custom{height:100%;background-color:#fff;box-shadow:#e3e3e333 0 2px 8px}.wrapper .widget-row-elementor .heading-menu{display:flex;align-items:center;justify-content:space-between;padding:10px;background:white;margin-bottom:10px}.example-list{width:100%;max-width:100%;height:100%;display:block;padding:20px 10px}.example-list::-webkit-scrollbar{width:5px;background-color:#f5f5f5}.example-list::-webkit-scrollbar-thumb{background-color:#bab9b9;border:2px solid #bab9b9;border-radius:5px}.example-box{position:relative;color:#000000de;box-sizing:border-box;list-style-type:none;cursor:move;font-size:14px;width:70%;margin:10px 10px 10px 50px}.example-box .content{position:relative;display:flex;align-items:center;justify-content:space-between;border:1px solid #b6dbff;padding:8px;border-radius:3px;background:#f8f5f5}.example-box .content .icon .item-icon{position:relative}.example-box .content .icon .close-icon{position:absolute;top:-3px;left:0;color:red;font-size:12px;cursor:pointer}.example-box .content .btn-foundation{display:flex;grid-gap:10px;gap:10px;opacity:0}.example-box .content .collapes-sub{position:absolute;top:25%;left:-20px;cursor:pointer}.example-box:hover>.content .btn-foundation{opacity:1}.sub-item{position:relative;border:1px solid #b6dbff;border-radius:3px;margin-bottom:10px;list-style-type:none}.sub-item .sub-content{display:flex;align-items:center;justify-content:space-between;background-color:#f8f5f5}.sub-item .text{padding:10px 0}.sub-item:hover>.sub-content .btn-foundation{opacity:1}.sub-item:first-child:before{height:70%}.tree_node{display:flex;align-items:center;justify-content:space-between}.tree_node:hover{background-color:#f7f7f7}.btn-foundation{display:flex;justify-content:flex-end;grid-gap:10px;gap:10px;padding-right:16px}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.example-box:last-child{border:none}.example-list.cdk-drop-list-dragging .example-box:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.elementor-custom::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px #d2d2d2;background-color:#fff}.elementor-custom::-webkit-scrollbar{width:5px;background-color:#55c4f8}.elementor-custom::-webkit-scrollbar-thumb{border-radius:5px;background-color:#55c4f8}\n"], components: [{ type: SelectLanguageConfigComponent, selector: "app-select-language-config", inputs: ["isAdmin", "displayLabel", "isSetLanguageCode", "languages"], outputs: ["handleChangeMultiLanguage"] }, { type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { type: i6$3.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { type: i3$3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i12$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4$1.NzModalComponent, selector: "nz-modal", inputs: ["nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzZIndex", "nzWidth", "nzCloseIcon", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel", "nzTitle", "nzFooter", "nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzContent", "nzComponentParams", "nzWrapClassName", "nzClassName", "nzStyle", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { type: AddMenuVerticalAdminComponent, selector: "app-add-menu-vertical-admin", inputs: ["data", "type"], outputs: ["isAddMenu", "isEditMenu", "valueData", "valueDataEdited"] }, { type: EditMenuVerticalAdminComponent, selector: "app-edit-menu-vertical-admin", inputs: ["data", "type"], outputs: ["isEditMenu", "valueDataEdited"] }, { type: AddSubMenuVerticalAdminComponent, selector: "app-add-sub-menu-vertical-admin", inputs: ["data"], outputs: ["isCancelFormAddSub", "valueDataAdd", "getDataCategoryAgain"] }, { type: EditSubMenuVerticalAdminComponent, selector: "app-edit-sub-menu-vertical-admin", inputs: ["data"], outputs: ["isCancelFormEditSub", "valueDataEdit"] }], directives: [{ type: i17.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i19$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "id", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListAutoScrollDisabled", "cdkDropListOrientation", "cdkDropListLockAxis", "cdkDropListData", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i6$3.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { type: i6$3.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { type: i19$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragPreviewContainer", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i6$3.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { type: i12$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i18.NzIconDirective, selector: "[nz-icon]", inputs: ["nzRotate", "nzSpin", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i6$3.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { type: i21.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitleContext", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipTitle", "nz-tooltip", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { type: i24.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus", "nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nz-popconfirm", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDanger", "nzCancelText", "nzIcon"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }, { type: i4$1.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }], pipes: { "translate": i12$2.TranslatePipe, "vhLanguage": VhLanguagePipe } });
|
|
8834
9154
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AtwMenuVerticalAdmin, decorators: [{
|
|
8835
9155
|
type: Component,
|
|
8836
9156
|
args: [{
|
|
@@ -14284,6 +14604,8 @@ class AtwImageAdminConfig extends AtwUpdateDbComponent {
|
|
|
14284
14604
|
index: 11,
|
|
14285
14605
|
},
|
|
14286
14606
|
];
|
|
14607
|
+
/** Có nên mở nút cập nhật kích thước ảnh cho bằng kích thước thiết kế hay không */
|
|
14608
|
+
this.isDesignImageSizeValid = true;
|
|
14287
14609
|
this.imageDeviceWidthMax = 'desktop'; // biến này để lưu thiết bị có hình ảnh width lớn nhất
|
|
14288
14610
|
this.widthImageMax = 0;
|
|
14289
14611
|
this.heightImageMax = 0;
|
|
@@ -14324,48 +14646,54 @@ class AtwImageAdminConfig extends AtwUpdateDbComponent {
|
|
|
14324
14646
|
ngOnInit() {
|
|
14325
14647
|
var _a, _b, _c, _d, _e, _f;
|
|
14326
14648
|
var _g;
|
|
14327
|
-
this
|
|
14328
|
-
|
|
14329
|
-
|
|
14330
|
-
|
|
14331
|
-
|
|
14332
|
-
|
|
14333
|
-
|
|
14334
|
-
|
|
14335
|
-
|
|
14336
|
-
|
|
14337
|
-
|
|
14338
|
-
|
|
14339
|
-
|
|
14340
|
-
|
|
14341
|
-
|
|
14342
|
-
|
|
14343
|
-
|
|
14344
|
-
|
|
14345
|
-
this.config['image-fullscreen'].toggle_fullscreen
|
|
14346
|
-
|
|
14347
|
-
|
|
14348
|
-
|
|
14349
|
-
|
|
14350
|
-
|
|
14351
|
-
|
|
14352
|
-
|
|
14649
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
14650
|
+
this.id_subproject = this.vhQueryAutoWeb.getlocalSubProject_Working()._id;
|
|
14651
|
+
this.subproject = this.vhQueryAutoWeb.getlocalSubProject(this.vhQueryAutoWeb.getlocalSubProject_Working()._id);
|
|
14652
|
+
this.resolution = this.subproject.resolution;
|
|
14653
|
+
this.isDesignImageSizeValid = yield this.checkDesignImageSize();
|
|
14654
|
+
// Kiểm tra nếu chưa có config thì thêm để người dùng không cần xóa thêm lại
|
|
14655
|
+
if (!this.config.hasOwnProperty('position_onscroll')) {
|
|
14656
|
+
this.config.position_onscroll = {
|
|
14657
|
+
type: 0,
|
|
14658
|
+
top: 0,
|
|
14659
|
+
};
|
|
14660
|
+
}
|
|
14661
|
+
if (!this.config.hasOwnProperty('is_top_page'))
|
|
14662
|
+
this.config.is_top_page = false;
|
|
14663
|
+
if (!((_b = (_a = this.objectChoosing.setups) === null || _a === void 0 ? void 0 : _a.upload_image) === null || _b === void 0 ? void 0 : _b.compressWidth))
|
|
14664
|
+
this.objectChoosing.setups.upload_image.compress_width = 100;
|
|
14665
|
+
if (!((_d = (_c = this.objectChoosing.setups) === null || _c === void 0 ? void 0 : _c.upload_image) === null || _d === void 0 ? void 0 : _d.compressHeight))
|
|
14666
|
+
this.objectChoosing.setups.upload_image.compress_height = 100;
|
|
14667
|
+
if (!((_e = this.config['image-fullscreen']) === null || _e === void 0 ? void 0 : _e.hasOwnProperty('toggle_fullscreen'))) {
|
|
14668
|
+
(_f = (_g = this.config)['image-fullscreen']) !== null && _f !== void 0 ? _f : (_g['image-fullscreen'] = {});
|
|
14669
|
+
this.config['image-fullscreen'].toggle_fullscreen = false;
|
|
14670
|
+
}
|
|
14671
|
+
// phần này get dữ liệu json
|
|
14672
|
+
forkJoin([
|
|
14673
|
+
this.http.get('assets/data/effects/image.json'),
|
|
14674
|
+
]).subscribe(([effects]) => {
|
|
14675
|
+
this.effect_hover = effects;
|
|
14676
|
+
this.effect_hover_data = this.effect_hover.find((e) => e.type == this.staticdata[this.device + '_animation_type']);
|
|
14677
|
+
});
|
|
14353
14678
|
});
|
|
14354
14679
|
}
|
|
14355
14680
|
ngOnChanges(changes) {
|
|
14356
14681
|
var _a, _b, _c, _d;
|
|
14357
|
-
|
|
14358
|
-
this.
|
|
14359
|
-
|
|
14360
|
-
|
|
14361
|
-
|
|
14362
|
-
|
|
14363
|
-
|
|
14364
|
-
|
|
14365
|
-
|
|
14366
|
-
|
|
14367
|
-
|
|
14368
|
-
|
|
14682
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
14683
|
+
this.isDesignImageSizeValid = yield this.checkDesignImageSize();
|
|
14684
|
+
if (!this.staticdata.accessibility)
|
|
14685
|
+
this.staticdata.accessibility = {};
|
|
14686
|
+
if (((_a = this.class['image']) === null || _a === void 0 ? void 0 : _a['background-image']) && this.class['image']['background-image'].includes('url(')) {
|
|
14687
|
+
this.class['image']['background-image'] = 'none';
|
|
14688
|
+
}
|
|
14689
|
+
if (this.effect_hover) {
|
|
14690
|
+
this.effect_hover_data = this.effect_hover.find((e) => e.type == this.staticdata[this.device + '_animation_type']);
|
|
14691
|
+
this.customize = ((_d = (_c = (_b = this.effect_hover_data) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.find(e => { var _a; return e.id == ((_a = this.config['animation-selected']) === null || _a === void 0 ? void 0 : _a.id); })) === null || _d === void 0 ? void 0 : _d.customize) || [];
|
|
14692
|
+
}
|
|
14693
|
+
if (changes.device) {
|
|
14694
|
+
this.getWidthHeightImage();
|
|
14695
|
+
}
|
|
14696
|
+
});
|
|
14369
14697
|
}
|
|
14370
14698
|
handleOpenFullscreenPreview() {
|
|
14371
14699
|
const srcTemp = this.staticdata.img[this.device + '_img'] || 'https://upload.wikimedia.org/wikipedia/commons/1/14/No_Image_Available.jpg';
|
|
@@ -14653,7 +14981,7 @@ class AtwImageAdminConfig extends AtwUpdateDbComponent {
|
|
|
14653
14981
|
* @param file File được kéo thả vào hoặc được tải lên
|
|
14654
14982
|
*/
|
|
14655
14983
|
processImageUpload(file) {
|
|
14656
|
-
var _a, _b;
|
|
14984
|
+
var _a, _b, _c;
|
|
14657
14985
|
let compress_type = this.objectChoosing.setups.upload_image.compress_type;
|
|
14658
14986
|
let resolution = {};
|
|
14659
14987
|
switch (this.objectChoosing.setups.upload_image.compress_type) {
|
|
@@ -14664,17 +14992,28 @@ class AtwImageAdminConfig extends AtwUpdateDbComponent {
|
|
|
14664
14992
|
};
|
|
14665
14993
|
break;
|
|
14666
14994
|
case 'compress-frame':
|
|
14667
|
-
|
|
14668
|
-
|
|
14669
|
-
|
|
14670
|
-
|
|
14671
|
-
|
|
14672
|
-
|
|
14995
|
+
const dimension = (_a = this.objectChoosing[`${this.device}_config`]) === null || _a === void 0 ? void 0 : _a.dimension;
|
|
14996
|
+
if (dimension &&
|
|
14997
|
+
Object.keys(dimension).length > 0 &&
|
|
14998
|
+
typeof dimension.width === 'number' &&
|
|
14999
|
+
typeof dimension.height === 'number') {
|
|
15000
|
+
resolution = {
|
|
15001
|
+
width: dimension.width,
|
|
15002
|
+
height: dimension.height,
|
|
15003
|
+
};
|
|
15004
|
+
}
|
|
15005
|
+
else {
|
|
15006
|
+
const deviceItem = this.functionService.devices.find((device) => device.value == this.device);
|
|
15007
|
+
resolution = {
|
|
15008
|
+
width: deviceItem.width,
|
|
15009
|
+
height: deviceItem.height,
|
|
15010
|
+
};
|
|
15011
|
+
}
|
|
14673
15012
|
break;
|
|
14674
15013
|
case 'custom':
|
|
14675
15014
|
resolution = {
|
|
14676
|
-
width: +((
|
|
14677
|
-
height: +((
|
|
15015
|
+
width: +((_b = this.objectChoosing.setups.upload_image.compress_width) !== null && _b !== void 0 ? _b : 100),
|
|
15016
|
+
height: +((_c = this.objectChoosing.setups.upload_image.compress_height) !== null && _c !== void 0 ? _c : 100),
|
|
14678
15017
|
};
|
|
14679
15018
|
compress_type = 'compress-frame';
|
|
14680
15019
|
break;
|
|
@@ -14976,7 +15315,7 @@ class AtwImageAdminConfig extends AtwUpdateDbComponent {
|
|
|
14976
15315
|
* Lấy hình ảnh từ url đẩy lên server với kích thước hình thay đổi
|
|
14977
15316
|
* */
|
|
14978
15317
|
handleOkConfirm() {
|
|
14979
|
-
var _a, _b;
|
|
15318
|
+
var _a, _b, _c;
|
|
14980
15319
|
this.isConfirmLoading = true;
|
|
14981
15320
|
let compress_type = this.objectChoosing.setups.upload_image.compress_type;
|
|
14982
15321
|
let resolution = {};
|
|
@@ -14988,17 +15327,28 @@ class AtwImageAdminConfig extends AtwUpdateDbComponent {
|
|
|
14988
15327
|
};
|
|
14989
15328
|
break;
|
|
14990
15329
|
case 'compress-frame':
|
|
14991
|
-
|
|
14992
|
-
|
|
14993
|
-
|
|
14994
|
-
|
|
14995
|
-
|
|
14996
|
-
|
|
15330
|
+
const dimension = (_a = this.objectChoosing[`${this.device}_config`]) === null || _a === void 0 ? void 0 : _a.dimension;
|
|
15331
|
+
if (dimension &&
|
|
15332
|
+
Object.keys(dimension).length > 0 &&
|
|
15333
|
+
typeof dimension.width === 'number' &&
|
|
15334
|
+
typeof dimension.height === 'number') {
|
|
15335
|
+
resolution = {
|
|
15336
|
+
width: dimension.width,
|
|
15337
|
+
height: dimension.height,
|
|
15338
|
+
};
|
|
15339
|
+
}
|
|
15340
|
+
else {
|
|
15341
|
+
const deviceItem = this.functionService.devices.find((device) => device.value == this.device);
|
|
15342
|
+
resolution = {
|
|
15343
|
+
width: deviceItem.width,
|
|
15344
|
+
height: deviceItem.height,
|
|
15345
|
+
};
|
|
15346
|
+
}
|
|
14997
15347
|
break;
|
|
14998
15348
|
case 'custom':
|
|
14999
15349
|
resolution = {
|
|
15000
|
-
width: +((
|
|
15001
|
-
height: +((
|
|
15350
|
+
width: +((_b = this.objectChoosing.setups.upload_image.compress_width) !== null && _b !== void 0 ? _b : 100),
|
|
15351
|
+
height: +((_c = this.objectChoosing.setups.upload_image.compress_height) !== null && _c !== void 0 ? _c : 100),
|
|
15002
15352
|
};
|
|
15003
15353
|
compress_type = 'compress-frame';
|
|
15004
15354
|
break;
|
|
@@ -15118,9 +15468,162 @@ class AtwImageAdminConfig extends AtwUpdateDbComponent {
|
|
|
15118
15468
|
});
|
|
15119
15469
|
}
|
|
15120
15470
|
}
|
|
15471
|
+
/** Hàm kiểm tra có cần phải hiển thị nút cập nhật không */
|
|
15472
|
+
checkDesignImageSize() {
|
|
15473
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
15474
|
+
// chạy song song cho nhanh
|
|
15475
|
+
const results = yield Promise.all(this.functionService.devices.map((d) => __awaiter(this, void 0, void 0, function* () {
|
|
15476
|
+
var _a;
|
|
15477
|
+
// Nếu giao diện thiết kế đã ẩn thiết bị thì không cần check
|
|
15478
|
+
if (!((_a = this.subproject) === null || _a === void 0 ? void 0 : _a[`${d.value}_template_display`])) {
|
|
15479
|
+
return false;
|
|
15480
|
+
}
|
|
15481
|
+
// Ảnh gốc
|
|
15482
|
+
const url = this.staticdata.img[`${d.value}_img`];
|
|
15483
|
+
const imgSize = yield this.functionService.getImageSize(url);
|
|
15484
|
+
// Container thiết kế
|
|
15485
|
+
const container = this.objectChoosing[`${d.value}_class`].image;
|
|
15486
|
+
const containerSize = {
|
|
15487
|
+
width: parseFloat(container.width),
|
|
15488
|
+
height: parseFloat(container.height),
|
|
15489
|
+
};
|
|
15490
|
+
return this.checkRatioDesignImgSize(imgSize, containerSize);
|
|
15491
|
+
})));
|
|
15492
|
+
// chỉ cần 1 device trả về true → return true
|
|
15493
|
+
return results.some(v => v === true);
|
|
15494
|
+
});
|
|
15495
|
+
}
|
|
15496
|
+
/**
|
|
15497
|
+
* Hàm kiểm tra
|
|
15498
|
+
* - Ratio có bị lệch nhiều hay không hoặc
|
|
15499
|
+
* - Kích thước có lớn hơn nhiều so với kích thước hiển thị hay không?
|
|
15500
|
+
* @param imgSize Kích thước của file ảnh gốc
|
|
15501
|
+
* @param containerSize Kích thước thực tế người dùng thấy
|
|
15502
|
+
*/
|
|
15503
|
+
checkRatioDesignImgSize(imgSize, containerSize) {
|
|
15504
|
+
// Ratio
|
|
15505
|
+
const imgRatio = imgSize.width / imgSize.height;
|
|
15506
|
+
const containerRatio = containerSize.width / containerSize.height;
|
|
15507
|
+
// Ratio lệch trên 10% → ảnh bị méo → return true
|
|
15508
|
+
const ratioDiff = Math.abs(imgRatio - containerRatio) / containerRatio;
|
|
15509
|
+
if (ratioDiff > 0.1) {
|
|
15510
|
+
return true;
|
|
15511
|
+
}
|
|
15512
|
+
// Tại đây: ratio giống nhau hoặc lệch ít → xét về kích thước
|
|
15513
|
+
const widthFactor = imgSize.width / containerSize.width;
|
|
15514
|
+
const heightFactor = imgSize.height / containerSize.height;
|
|
15515
|
+
// Ảnh lớn hơn container nhiều → ảnh nặng → giảm PageSpeed → return true
|
|
15516
|
+
if (widthFactor > 1.5
|
|
15517
|
+
|| heightFactor > 1.5) {
|
|
15518
|
+
return true;
|
|
15519
|
+
}
|
|
15520
|
+
// Ảnh lớn hơn chút nhưng không ảnh hưởng PageSpeed → return false
|
|
15521
|
+
return false;
|
|
15522
|
+
}
|
|
15523
|
+
/**
|
|
15524
|
+
* Hàm update kích thước ảnh phù hợp cho từng kích thước thiết kế của từng thiết bị
|
|
15525
|
+
*/
|
|
15526
|
+
updateDesignImageSize() {
|
|
15527
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
15528
|
+
const messages = [];
|
|
15529
|
+
// ⭐ Show Loading 1 lần duy nhất
|
|
15530
|
+
yield this.functionService.showLoading("", "current-loading", null, 0, false);
|
|
15531
|
+
yield Promise.all(this.functionService.devices.map((d) => __awaiter(this, void 0, void 0, function* () {
|
|
15532
|
+
var _a;
|
|
15533
|
+
// Nếu giao diện thiết kế đã ẩn thiết bị thì không cần check
|
|
15534
|
+
if (!this.subproject[`${d.value}_template_display`])
|
|
15535
|
+
return;
|
|
15536
|
+
/** Khai báo tin nhắn thông báo cho từng thiết bị */
|
|
15537
|
+
const msgDevices = `(${this.languageService.translate('thiet_bi')} ${this.languageService.translate(d.label)}) `;
|
|
15538
|
+
// Ảnh gốc
|
|
15539
|
+
const url = this.staticdata.img[`${d.value}_img`];
|
|
15540
|
+
const imgSize = yield this.functionService.getImageSize(url);
|
|
15541
|
+
// Container thiết kế
|
|
15542
|
+
const container = this.objectChoosing[`${d.value}_class`].image;
|
|
15543
|
+
const containerSize = {
|
|
15544
|
+
width: parseFloat(container.width),
|
|
15545
|
+
height: parseFloat(container.height),
|
|
15546
|
+
};
|
|
15547
|
+
// Trường hợp nếu ảnh này đã phù hợp thì trả về thông báo chứ không update nữa
|
|
15548
|
+
if (!this.checkRatioDesignImgSize(imgSize, containerSize)) {
|
|
15549
|
+
messages.push({
|
|
15550
|
+
type: 'warning',
|
|
15551
|
+
msg: msgDevices + this.languageService.translate('anh_nay_da_phu_hop_khong_can_cap_nhat_nua')
|
|
15552
|
+
});
|
|
15553
|
+
return;
|
|
15554
|
+
}
|
|
15555
|
+
const msgSolution = this.type == 'admin'
|
|
15556
|
+
? 'vui_long_chuan_bi_mot_hinh_khac_phu_hop'
|
|
15557
|
+
: 'vui_long_sua_thiet_ke_hoac_chuan_bi_mot_hinh_khac_phu_hop';
|
|
15558
|
+
// Trường hợp đã cập nhật hoặc width là bằng sẵn rồi nhưng height thiết kế không phù hợp
|
|
15559
|
+
// Thì trả về thông báo chứ không cho update nữa vì gây tăng dung lượng lưu ảnh không cần thiết
|
|
15560
|
+
if (imgSize.width == containerSize.width &&
|
|
15561
|
+
imgSize.height != containerSize.height) {
|
|
15562
|
+
const mTmp = containerSize.height > imgSize.height
|
|
15563
|
+
? 'chieu_cao_thiet_ke_lon_hon_chieu_cao_anh'
|
|
15564
|
+
: 'chieu_cao_thiet_ke_nho_hon_chieu_cao_anh';
|
|
15565
|
+
const m = this.languageService.translate(mTmp) + '. ' + this.languageService.translate(msgSolution);
|
|
15566
|
+
messages.push({
|
|
15567
|
+
type: 'error',
|
|
15568
|
+
msg: msgDevices + m + '!!!',
|
|
15569
|
+
duration: 8000
|
|
15570
|
+
});
|
|
15571
|
+
return;
|
|
15572
|
+
}
|
|
15573
|
+
// Trường hợp nếu ảnh này bé hơn kích thước thiết kế thì báo cho người dùng và không cập nhật
|
|
15574
|
+
if (imgSize.width < containerSize.width) {
|
|
15575
|
+
const mTmp = 'chieu_dai_anh_nho_hon_chieu_dai_thiet_ke_lam_cho_viec_nen_anh_theo_khung_hien_thi_hinh_anh_khong_hoat_dong';
|
|
15576
|
+
const m = this.languageService.translate(mTmp) + '. ' + this.languageService.translate(msgSolution);
|
|
15577
|
+
messages.push({
|
|
15578
|
+
type: 'error',
|
|
15579
|
+
msg: msgDevices + m + '!!!',
|
|
15580
|
+
duration: 8000
|
|
15581
|
+
});
|
|
15582
|
+
return;
|
|
15583
|
+
}
|
|
15584
|
+
// Cập nhật ảnh cho từng thiết bị
|
|
15585
|
+
try {
|
|
15586
|
+
const rsp = yield this.vhImage.getImageFromURL_Autoweb(url, 'images/design/objects', {
|
|
15587
|
+
compress_type: 'compress-frame',
|
|
15588
|
+
resolution: containerSize,
|
|
15589
|
+
});
|
|
15590
|
+
if (rsp.vcode == 0) {
|
|
15591
|
+
this.staticdata.img[d.value + '_img'] = rsp.data;
|
|
15592
|
+
messages.push({
|
|
15593
|
+
type: 'success',
|
|
15594
|
+
msg: msgDevices + this.languageService.translate('tai_anh_thanh_cong')
|
|
15595
|
+
});
|
|
15596
|
+
}
|
|
15597
|
+
else {
|
|
15598
|
+
messages.push({
|
|
15599
|
+
type: 'error',
|
|
15600
|
+
msg: msgDevices + this.languageService.translate('tai_anh_that_bai_ly_do') + rsp.msg
|
|
15601
|
+
});
|
|
15602
|
+
}
|
|
15603
|
+
}
|
|
15604
|
+
catch (error) {
|
|
15605
|
+
if ((_a = error.message) === null || _a === void 0 ? void 0 : _a.includes('413')) {
|
|
15606
|
+
messages.push({
|
|
15607
|
+
type: 'error',
|
|
15608
|
+
msg: msgDevices + this.languageService.translate('file_anh_qua_lon_vui_chon_file_anh_co_dung_luong_nho_hon_1mb')
|
|
15609
|
+
});
|
|
15610
|
+
}
|
|
15611
|
+
}
|
|
15612
|
+
})));
|
|
15613
|
+
// CHỈ CHẠY SAU KHI HOÀN TẤT TẤT CẢ DEVICE
|
|
15614
|
+
this.updateStaticData();
|
|
15615
|
+
// ⭐ Hide loading (delay 200ms để tránh flick)
|
|
15616
|
+
yield this.functionService.hideLoading(200);
|
|
15617
|
+
// Show toàn bộ message sau cùng
|
|
15618
|
+
messages.forEach(m => {
|
|
15619
|
+
var _a;
|
|
15620
|
+
this.functionService.createMessage(m.type, m.msg, (_a = m.duration) !== null && _a !== void 0 ? _a : 5000);
|
|
15621
|
+
});
|
|
15622
|
+
});
|
|
15623
|
+
}
|
|
15121
15624
|
}
|
|
15122
15625
|
AtwImageAdminConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AtwImageAdminConfig, deps: [{ token: i1.VhQueryAutoWeb }, { token: i2.MatDialog }, { token: i2$4.HttpClient }, { token: i1.VhEventMediator }, { token: i1.VhImage }, { token: i2.MatDialog }, { token: i3$1.FunctionService }, { token: i3$1.LanguageService }, { token: PLATFORM_ID }, { token: i5$3.NzImageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
15123
|
-
AtwImageAdminConfig.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AtwImageAdminConfig, selector: "atw-image-admin-config", inputs: { visible_config_tool: "visible_config_tool", objectChoosing: "objectChoosing", type: "type", device: "device", class: "class", staticdata: "staticdata", config: "config", blocks_of_page: "blocks_of_page" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"image-editor\">\r\n <div style=\"display: flex; align-items: center; gap: 4px; flex-wrap: wrap;\">\r\n <button [ngClass]=\"configMode == 'basic' ? 'ant-btn ant-btn-primary' : 'ant-btn'\" class=\"d-flex align-items-center\" (click)=\"configMode = 'basic'\">\r\n <span>{{('cau_hinh_co_ban') | translate}}</span>\r\n </button>\r\n \r\n <button [ngClass]=\"configMode == 'advanced' ? 'ant-btn ant-btn-primary' : 'ant-btn'\" class=\"d-flex align-items-center\" (click)=\"configMode = 'advanced'\">\r\n <span>{{('cau_hinh_nang_cao') | translate}}</span>\r\n </button>\r\n </div>\r\n <!-- C\u1EA5u h\u00ECnh c\u01A1 b\u1EA3n -->\r\n <ng-container *ngIf=\"configMode == 'basic'\">\r\n <div style=\"margin-top: 10px\">\r\n <div class=\"field-row\" style=\"margin: 0\">\r\n <div class=\"field-row-sub field-row__switch\" style=\"padding: 0\" nz-tooltip\r\n [nzTooltipTitle]=\"'*_giai_thich_anh_lcp' | translate\">\r\n <span> {{'uu_tien_tai_truoc' | translate}} </span>\r\n <nz-switch [(ngModel)]=\"config.is_top_page\" (ngModelChange)=\"updateConfig()\"></nz-switch>\r\n </div>\r\n </div>\r\n\r\n <mat-form-field appearance=\"fill\">\r\n <mat-label>{{'kieu_hien_thi_anh' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.display\" (ngModelChange)=\"changeImgType()\">\r\n <mat-option value=\"shared\">{{'anh_dung_chung_cho_tung_thiet_bi' | translate}}</mat-option>\r\n <mat-option value=\"individual\">{{'anh_dung_rieng_cho_tung_thiet_bi' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"fill\">\r\n <mat-label>{{'nguon_hinh_anh_hien_thi_len' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.source\" (ngModelChange)=\"updateSetups()\">\r\n <mat-option value=\"device\">{{'tu_thiet_bi' | translate}}</mat-option>\r\n <mat-option value=\"library\">{{'tu_thu_vien' | translate}}</mat-option>\r\n <mat-option value=\"url\">{{'duong_dan_hinh_anh' | translate}}</mat-option>\r\n <mat-option value=\"free_img\">{{'kho_anh_dung_chung' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device'\" appearance=\"fill\" class=\"config-img\">\r\n <mat-label>{{'nen_anh_tai_len' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.compress_type\" (ngModelChange)=\"updateSetups()\">\r\n <mat-option [value]=\"'no-compress'\">{{'khong_nen_anh_sau_khi_tai_len' | translate}}</mat-option>\r\n <mat-option [value]=\"'compress-screen'\">{{'nen_anh_theo_ti_le_man_hinh_hien_thi' | translate}}</mat-option>\r\n <mat-option [value]=\"'compress-frame'\">{{'nen_anh_theo_ti_le_khung_hien_thi_anh' | translate}}</mat-option>\r\n <mat-option [value]=\"'custom'\">{{'nen_anh_theo_kich_thuoc_tu_chon' | translate}}</mat-option>\r\n\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device' && objectChoosing.setups.upload_image.compress_type == 'custom'\" class=\"mr-4\">\r\n <mat-label>{{'chieu_rong' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_rong' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_width\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_width = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device' && objectChoosing.setups.upload_image.compress_type == 'custom'\">\r\n <mat-label>{{'chieu_cao' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_cao' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_height\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_height = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n\r\n <!-- Hi\u1EC3n th\u1ECB t\u00EAn v\u00E0 \u0111u\u00F4i file h\u00ECnh \u1EA3nh -->\r\n <div *ngIf=\"objectChoosing.setups.upload_image.source !== 'url' && staticdata.img[device + '_img'].includes(id_subproject)\"\r\n class=\"my-1 img-info\">\r\n <p class=\"img-info__text\">\r\n {{ 'thu_muc_chua_tep_hinh_anh' | translate }}: \r\n </p>\r\n <p class=\"img-info__text highlight ml-2\">\r\n {{ getFileInfo(staticdata.img[device + '_img']).folderPath }}\r\n </p>\r\n <p class=\"img-info__text mt-1\">\r\n {{ 'ten_tep_hinh_anh' | translate }}: \r\n </p>\r\n <p class=\"img-info__text highlight ml-2\">\r\n {{ getFileInfo(staticdata.img[device + '_img']).fullFileName }}\r\n </p>\r\n </div>\r\n\r\n <!-- Upload input -->\r\n <input type=\"file\" accept=\"image/*\" (change)=\"onUpload($event)\" id=\"upload\" style=\"display: none\" />\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p: K\u00E9o th\u1EA3 \u1EA3nh ho\u1EB7c t\u1EA3i \u1EA3nh t\u1EEB m\u00E1y -->\r\n <div *ngIf=\"objectChoosing.setups.upload_image.source == 'device'\" class=\"drop-zone\" [class.dragging]=\"dragging\"\r\n (drop)=\"onFileDropped_upload($event)\" (dragover)=\"onDragOver_upload($event)\" (dragleave)=\"onDragLeave_upload()\">\r\n <label *ngIf=\"!previewUploadUrl\" for=\"upload\">\r\n <mat-icon>image</mat-icon>\r\n <p>{{ 'keo_hinh_anh_vao_day_hoac' | translate }} <span>{{ 'tai_tep_len' | translate }}</span></p>\r\n </label>\r\n\r\n <div *ngIf=\"previewUploadUrl\" class=\"preview\">\r\n <img [src]=\"previewUploadUrl\" alt=\"Preview\" />\r\n </div>\r\n\r\n <div *ngIf=\"previewUploadUrl\" class=\"gr-btn button-list\">\r\n <button (click)=\"openUpload()\">\r\n <mat-icon>vertical_align_top</mat-icon>\r\n </button>\r\n <button (click)=\"previewUploadUrl = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p t\u1EA3i \u1EA3nh t\u1EEB th\u01B0 vi\u1EC7n -->\r\n <button *ngIf=\"objectChoosing.setups.upload_image.source == 'library'\"\r\n (click)=\"openLibrary()\" class=\"upload-background-image\">\r\n <i class=\"bi bi-upload\"></i>{{'chon_tu_thu_vien' | translate}}\r\n </button>\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p ch\u1ECDn \u1EA3nh t\u1EEB 1 \u0111\u01B0\u1EDDng d\u1EABn b\u1EA5t k\u00EC -->\r\n <div class=\"title\" *ngIf=\"objectChoosing.setups.upload_image.source == 'url' || objectChoosing.setups.upload_image.source == 'free_img'\">\r\n <textarea\r\n class=\"input custom-textarea w-100\"\r\n name=\"background-image\"\r\n id=\"background-image\"\r\n placeholder=\"{{'nhap_duong_dan_anh' | translate}}\"\r\n [(ngModel)]=\"staticdata.img[device + '_img']\"\r\n (blur)=\"changeUrl()\"\r\n [disabled]=\"objectChoosing.setups.upload_image.source == 'free_img'\"\r\n >\r\n </textarea>\r\n </div>\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p ch\u1ECDn \u1EA3nh mi\u1EC5n ph\u00ED -->\r\n <div class=\"custom\" *ngIf=\"objectChoosing.setups.upload_image.source == 'free_img'\">\r\n <label for=\"upload\" (click)=\"openImageFree()\" style=\"width: 100%\">\r\n <button class=\"upload-background-image\">\r\n <i class=\"bi bi-plus-circle\"></i> {{'kho_anh_dung_chung' | translate }}\r\n </button>\r\n </label>\r\n </div>\r\n\r\n <!-- N\u00FAt sao ch\u00E9p link h\u00ECnh \u1EA3nh -->\r\n <button *ngIf=\"staticdata.img[device + '_img'].includes(id_subproject)\"\r\n (click)=\"copyLinkImg()\" nz-button nzType=\"default\" class=\"mt-2\"\r\n style=\"white-space: normal; border-color: #00a859;\">\r\n {{ 'nhan_de_sao_chep_duong_dan_anh' | translate }}\r\n </button>\r\n\r\n <!-- N\u1EBFu \u1EA3nh ch\u1EE9a id_subproject th\u00EC \u0111\u00E3 l\u00E0 \u1EA3nh tr\u00EAn server r\u1ED3i n\u00EAn s\u1EBD \u1EA9n -->\r\n <button *ngIf=\"!staticdata.img[device + '_img'].includes(id_subproject)\" style=\"width: 100%;\" \r\n nz-button nzType=\"primary\" (click)=\"isShowConfirmPopup = true\" class=\"mt-2\">\r\n {{'chuyen_anh_len_server' | translate}}\r\n </button>\r\n\r\n <app-link-page-config\r\n [objectChoosing]=\"objectChoosing\" \r\n [staticdata]=\"staticdata\"\r\n [id_object]=\"objectChoosing._id\"\r\n [dynamic_data]=\"objectChoosing.dynamic_data\"\r\n [hasContact]=\"true\"\r\n >\r\n </app-link-page-config>\r\n </div>\r\n </ng-container>\r\n <!-- Hi\u1EC3n th\u1ECB ti\u00EAu \u0111\u1EC1 m\u1EDF r\u1ED9ng -->\r\n <div class=\"editor-header\" *ngIf=\"isViewAll\">\r\n <i class=\"bi bi-chevron-left\" (click)=\"isViewAll = !isViewAll\"></i>\r\n <span (click)=\"isViewAll = !isViewAll\">{{ currentViewAll.title | translate }}</span>\r\n </div>\r\n <!-- Dropdown menu -->\r\n <div class=\"editor-content\" *ngIf=\"!isViewAll && configMode == 'advanced'\">\r\n <ul nz-menu nzMode=\"inline\">\r\n <div class=\"field-row\" style=\"margin: 0\">\r\n <div class=\"field-row-sub field-row__switch\" style=\"padding: 0\" nz-tooltip\r\n [nzTooltipTitle]=\"'*_giai_thich_anh_lcp' | translate\">\r\n <span> {{'uu_tien_tai_truoc' | translate}} </span>\r\n <nz-switch [(ngModel)]=\"config.is_top_page\" (ngModelChange)=\"updateConfig()\"></nz-switch>\r\n </div>\r\n </div>\r\n\r\n <!-- Upload \u1EA3nh -->\r\n <li nz-submenu nzTitle=\"{{'hien_thi'| translate}}\" [(nzOpen)]=\"openMap.menu1\"\r\n (nzOpenChange)=\"openHandler('menu1')\">\r\n <div class=\"upload-image\" *ngIf=\"!isViewAll\">\r\n\r\n <!-- L\u1EF1a ch\u1ECDn hi\u1EC3n th\u1ECB cho c\u00E1c thi\u1EBFt b\u1ECB -->\r\n <app-hide-show-config [elementChoosing]=\"objectChoosing\" [device]=\"device\" >\r\n </app-hide-show-config>\r\n </div>\r\n </li>\r\n\r\n\r\n <li nz-submenu nzTitle=\"{{'hinh_anh'| translate}}\" [(nzOpen)]=\"openMap.menu2\"\r\n (nzOpenChange)=\"openHandler('menu2')\">\r\n <div class=\"mt-2\" >\r\n <mat-form-field appearance=\"fill\">\r\n <mat-label>{{'kieu_hien_thi_anh' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.display\" (ngModelChange)=\"changeImgType()\">\r\n <mat-option value=\"shared\">{{'anh_dung_chung_cho_tung_thiet_bi' | translate}}</mat-option>\r\n <mat-option value=\"individual\">{{'anh_dung_rieng_cho_tung_thiet_bi' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"fill\">\r\n <mat-label>{{'nguon_hinh_anh_hien_thi_len' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.source\" (ngModelChange)=\"updateSetups()\">\r\n <mat-option value=\"device\">{{'tu_thiet_bi' | translate}}</mat-option>\r\n <mat-option value=\"library\">{{'tu_thu_vien' | translate}}</mat-option>\r\n <mat-option value=\"url\">{{'duong_dan_hinh_anh' | translate}}</mat-option>\r\n <mat-option value=\"free_img\">{{'kho_anh_dung_chung' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device'\" appearance=\"fill\" class=\"config-img\">\r\n <mat-label>{{'nen_anh_tai_len' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.compress_type\" (ngModelChange)=\"updateSetups()\">\r\n <mat-option [value]=\"'no-compress'\">{{'khong_nen_anh_sau_khi_tai_len' | translate}}</mat-option>\r\n <mat-option [value]=\"'compress-screen'\">{{'nen_anh_theo_ti_le_man_hinh_hien_thi' | translate}}</mat-option>\r\n <mat-option [value]=\"'compress-frame'\">{{'nen_anh_theo_ti_le_khung_hien_thi_anh' | translate}}</mat-option>\r\n <mat-option [value]=\"'custom'\">{{'nen_anh_theo_kich_thuoc_tu_chon' | translate}}</mat-option>\r\n\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device' && objectChoosing.setups.upload_image.compress_type == 'custom'\" class=\"mr-4\">\r\n <mat-label>{{'chieu_rong' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_rong' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_width\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_width = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device' && objectChoosing.setups.upload_image.compress_type == 'custom'\">\r\n <mat-label>{{'chieu_cao' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_cao' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_height\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_height = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n\r\n <!-- Upload input -->\r\n <input type=\"file\" accept=\"image/*\" (change)=\"onUpload($event)\" id=\"upload\" style=\"display: none\" />\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p: K\u00E9o th\u1EA3 \u1EA3nh ho\u1EB7c t\u1EA3i \u1EA3nh t\u1EEB m\u00E1y -->\r\n <div *ngIf=\"objectChoosing.setups.upload_image.source == 'device'\" class=\"drop-zone\" [class.dragging]=\"dragging\"\r\n (drop)=\"onFileDropped_upload($event)\" (dragover)=\"onDragOver_upload($event)\" (dragleave)=\"onDragLeave_upload()\">\r\n <label *ngIf=\"!previewUploadUrl\" for=\"upload\">\r\n <mat-icon>image</mat-icon>\r\n <p>{{ 'keo_hinh_anh_vao_day_hoac' | translate }} <span>{{ 'tai_tep_len' | translate }}</span></p>\r\n </label>\r\n\r\n <div *ngIf=\"previewUploadUrl\" class=\"preview\">\r\n <img [src]=\"previewUploadUrl\" alt=\"Preview\" />\r\n </div>\r\n\r\n <div *ngIf=\"previewUploadUrl\" class=\"gr-btn button-list\">\r\n <button (click)=\"openUpload()\">\r\n <mat-icon>vertical_align_top</mat-icon>\r\n </button>\r\n <button (click)=\"previewUploadUrl = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p t\u1EA3i \u1EA3nh t\u1EEB th\u01B0 vi\u1EC7n -->\r\n <button *ngIf=\"objectChoosing.setups.upload_image.source == 'library'\"\r\n (click)=\"openLibrary()\" class=\"upload-background-image\">\r\n <i class=\"bi bi-upload\"></i>{{'chon_tu_thu_vien' | translate}}\r\n </button>\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p ch\u1ECDn \u1EA3nh t\u1EEB 1 \u0111\u01B0\u1EDDng d\u1EABn b\u1EA5t k\u00EC -->\r\n <div class=\"title\" *ngIf=\"objectChoosing.setups.upload_image.source == 'url' || objectChoosing.setups.upload_image.source == 'free_img'\">\r\n <textarea\r\n class=\"input custom-textarea w-100\"\r\n name=\"background-image\"\r\n id=\"background-image\"\r\n placeholder=\"{{'nhap_duong_dan_anh' | translate}}\"\r\n [(ngModel)]=\"staticdata.img[device + '_img']\"\r\n (blur)=\"changeUrl()\"\r\n [disabled]=\"objectChoosing.setups.upload_image.source == 'free_img'\"\r\n >\r\n </textarea>\r\n </div>\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p ch\u1ECDn \u1EA3nh mi\u1EC5n ph\u00ED -->\r\n <div class=\"custom\" *ngIf=\"objectChoosing.setups.upload_image.source == 'free_img'\">\r\n <label for=\"upload\" (click)=\"openImageFree()\" style=\"width: 100%\">\r\n <button class=\"upload-background-image\">\r\n <i class=\"bi bi-plus-circle\"></i> {{'kho_anh_dung_chung' | translate }}\r\n </button>\r\n </label>\r\n </div>\r\n\r\n <!-- N\u1EBFu \u1EA3nh ch\u1EE9a id_subproject th\u00EC \u0111\u00E3 l\u00E0 \u1EA3nh tr\u00EAn server r\u1ED3i n\u00EAn s\u1EBD \u1EA9n -->\r\n <button *ngIf=\"!staticdata.img[device + '_img'].includes(id_subproject)\" style=\"width: 100%; margin-top: 5px;\" nz-button nzType=\"primary\" (click)=\"isShowConfirmPopup = true\">\r\n {{'chuyen_anh_len_server' | translate}}\r\n </button>\r\n </div>\r\n </li>\r\n\r\n <!-- C\u1EA5u h\u00ECnh filter -->\r\n <li nz-submenu nzTitle=\"{{'anh_sang_va_tuong_phan'| translate}}\" [(nzOpen)]=\"openMap.menu3\"\r\n (nzOpenChange)=\"openHandler('menu3')\">\r\n <app-brightness-contrast-config [elementChoosing]=\"objectChoosing\" [device]=\"device\" [class]=\"class\" [config]=\"config\"\r\n [filterConfig]=\"config['filter']\" [opacityClass]=\"class['image__boundary--img']\" [staticdata]=\"staticdata\"\r\n [id_object]=\"objectChoosing._id\">\r\n </app-brightness-contrast-config>\r\n </li>\r\n <!-- C\u1EA5u h\u00ECnh l\u1EADt \u1EA3nh -->\r\n <li nz-submenu nzTitle=\"{{'lat_hinh'| translate}}\" [(nzOpen)]=\"openMap.menu4\" (nzOpenChange)=\"openHandler('menu4')\">\r\n <div class=\"editor-field-body\">\r\n <div class=\"mb-3\">\r\n <div class=\"field-row-sub\">\r\n <div style=\"display: flex; gap: 4px; width: 100%\">\r\n <span nz-button nzType=\"primary\" nzSize=\"default\" (click)=\"handleSetTransform('y')\"\r\n class=\"btn_transform\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\"\r\n d=\"M15.97 15.25h-2.72c-5.3 0-9.5-2.15-9.5-4.5s4.2-4.5 9.5-4.5c3.03 0 5.82.7 7.62 1.86a.75.75 0 1 0 .81-1.26c-2.06-1.33-5.13-2.1-8.43-2.1-6.02 0-11 2.55-11 6s4.98 6 11 6h2.8l-2.3 2.3a.75.75 0 1 0 1.07 1.05l2.83-2.82c.68-.69.68-1.8 0-2.48l-2.83-2.83a.75.75 0 0 0-1.06 1.06l2.21 2.22z\">\r\n </path>\r\n </svg>\r\n <p class=\"m-0\">{{ 'ngang' | translate }}</p>\r\n </span>\r\n <button nz-button nzType=\"primary\" nzSize=\"default\" (click)=\"handleSetTransform('x')\"\r\n class=\"btn_transform\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\"\r\n d=\"M15.25 8.35v2.4c0 5.3-2.15 9.5-4.5 9.5s-4.5-4.2-4.5-9.5c0-3.03.7-5.82 1.86-7.62a.75.75 0 1 0-1.26-.81c-1.33 2.06-2.1 5.13-2.1 8.43 0 6.02 2.55 11 6 11s6-4.98 6-11V8.27l2.3 2.3A.75.75 0 1 0 20.1 9.5l-2.82-2.83a1.75 1.75 0 0 0-2.48 0L11.97 9.5a.75.75 0 1 0 1.06 1.06l2.22-2.22z\">\r\n </path>\r\n </svg>\r\n <p class=\"m-0\">{{ 'doc' | translate }}</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"field-row mb-3\">\r\n <div class=\"field-row-sub\">\r\n <div style=\"display: flex; gap: 4px; width: 100%\">\r\n <button nz-button nzType=\"primary\" nzSize=\"default\" class=\"btn_transform\"\r\n (click)=\"handleSetTransform('-z')\">\r\n <span nz-icon nzType=\"rotate-left\" nzTheme=\"outline\"></span>\r\n <p class=\"m-0\">{{ 'trai' | translate }}</p>\r\n </button>\r\n <button nz-button nzType=\"primary\" nzSize=\"default\" class=\"btn_transform\"\r\n (click)=\"handleSetTransform('z')\">\r\n <span nz-icon nzType=\"rotate-right\" nzTheme=\"outline\"></span>\r\n <p class=\"m-0\">{{ 'phai' | translate }}</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"view\">\r\n <p class=\"discover_text\" (click)=\"openViewAll(style_fields[6])\"\r\n style=\"cursor: pointer; text-align: left; margin: 0\">\r\n {{ 'mo_rong' | translate }} →\r\n </p>\r\n </div>\r\n </li>\r\n <!-- C\u1EA5u h\u00ECnh object-fit -->\r\n <li nz-submenu nzTitle=\"{{'do_bao_phu'| translate}}\" [(nzOpen)]=\"openMap.menu5\" (nzOpenChange)=\"openHandler('menu5')\">\r\n <app-object-fit-config [device]=\"device\" [class]=\"class\" [objectFitClass]=\"class['image__boundary--img']\"\r\n [style_field]=\"style_fields[2]\" (isViewAll)=\"openViewAll($event)\" [objectChoosing]=\"objectChoosing\">\r\n </app-object-fit-config>\r\n </li>\r\n <!-- C\u1EA5u h\u00ECnh h\u00ECnh d\u1EA1ng vi\u1EC1n -->\r\n <li nz-submenu nzTitle=\"{{'kieu_vien'| translate}}\" [(nzOpen)]=\"openMap.menu6\" (nzOpenChange)=\"openHandler('menu6')\">\r\n <app-borders-config [elementChoosing]=\"objectChoosing\" [device]=\"device\" [class]=\"class\" [borderClass]=\"class['image__boundary--img']\"\r\n [id_object]=\"objectChoosing._id\">\r\n </app-borders-config>\r\n <!-- N\u00FAt m\u1EDF r\u1ED9ng -->\r\n\r\n <div class=\"item-border my-3 cursor-pointer\" style=\"float: right\">\r\n <p class=\"m-0 title-border\" (click)=\"openViewAll(style_fields[3])\">\r\n {{ 'mo_rong' | translate }} →\r\n </p>\r\n </div>\r\n </li>\r\n <!-- T\u1EA1o b\u00F3ng -->\r\n <li nz-submenu nzTitle=\"{{'do_bong'| translate}}\" [(nzOpen)]=\"openMap.menu7\" (nzOpenChange)=\"openHandler('menu7')\">\r\n <!-- C\u1EA5u h\u00ECnh b\u00F3ng -->\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row\">\r\n <div class=\"field-row-sub field-row__switch\">\r\n <span> {{'ap_dung' | translate}} </span>\r\n <nz-switch [(ngModel)]=\"config.check_shadow\" (ngModelChange)=\"handleSetShadow()\"></nz-switch>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\">\r\n <p class=\"m-0\">{{'ngang' | translate}}</p>\r\n <nz-input-number [(ngModel)]=\"config['box-shadow'].box_shadow_x\" [nzMin]=\"0\" [nzStep]=\"1\"\r\n [nzDisabled]=\"!config.check_shadow\" (ngModelChange)=\"handleSetShadow()\"></nz-input-number>\r\n </div>\r\n <nz-slider [(ngModel)]=\"config['box-shadow'].box_shadow_x\" (nzOnAfterChange)=\"handleSetShadow()\"\r\n [nzMin]=\"-100\" [nzStep]=\"0.1\"></nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\">\r\n <p class=\"m-0\">{{'doc' | translate}}</p>\r\n <nz-input-number [nzStep]=\"1\" [(ngModel)]=\"config['box-shadow'].box_shadow_y\"\r\n [nzDisabled]=\"!config.check_shadow\" (ngModelChange)=\"handleSetShadow()\"></nz-input-number>\r\n </div>\r\n <nz-slider [(ngModel)]=\"config['box-shadow'].box_shadow_y\" (nzOnAfterChange)=\"handleSetShadow()\"\r\n [nzMin]=\"-100\" [nzStep]=\"0.1\"></nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\">\r\n <p class=\"m-0 title\">{{'kich_thuoc_bong' | translate}}</p>\r\n <nz-input-number [nzStep]=\"1\" [(ngModel)]=\"config['box-shadow'].box_shadow_width\"\r\n [nzDisabled]=\"!config.check_shadow\" (ngModelChange)=\"handleSetShadow()\"></nz-input-number>\r\n </div>\r\n <nz-slider [(ngModel)]=\"config['box-shadow'].box_shadow_width\" (nzOnAfterChange)=\"handleSetShadow()\"\r\n [nzMin]=\"-100\" [nzStep]=\"0.1\"></nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\">\r\n <p class=\"m-0 title\">{{'do_nhoe' | translate}}</p>\r\n <nz-input-number [nzStep]=\"1\" [(ngModel)]=\"config['box-shadow'].box_shadow_blur\"\r\n [nzDisabled]=\"!config.check_shadow\" (ngModelChange)=\"handleSetShadow()\"></nz-input-number>\r\n </div>\r\n <nz-slider [(ngModel)]=\"config['box-shadow'].box_shadow_blur\" (nzOnAfterChange)=\"handleSetShadow()\"\r\n [nzMin]=\"0\" [nzMax]=\"100\" [nzStep]=\"1\"></nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item w-100\">\r\n <p class=\"m-0 w-50\">{{'mau_sac' | translate}}</p>\r\n <input class=\"input-color w-50\" type=\"button\" [cpOKButton]=\"true\" [(colorPicker)]=\"config['box-shadow'].box_shadow_color\"\r\n [style.background]=\"config['box-shadow'].box_shadow_color\" (colorPickerClose)=\"handleSetShadow()\"\r\n [cpWidth]=\"'230px'\" [disabled]=\"!config.check_shadow\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </li>\r\n\r\n <!-- Xem to\u00E0n m\u00E0n h\u00ECnh -->\r\n <li *ngIf=\"(!staticdata?.type_link || staticdata.type_link == 'none')\" nz-submenu nzTitle=\"{{'xem_toan_man_hinh'| translate}}\"\r\n [(nzOpen)]=\"openMap.menu10\" (nzOpenChange)=\"openHandler('menu10')\">\r\n <!-- B\u1EADt t\u1EAFt ch\u1EE9c n\u0103ng c\u1EA5u h\u00ECnh to\u00E0n m\u00E0n h\u00ECnh -->\r\n <div class=\"field-row\" nz-tooltip [nzTooltipTitle]=\"'khi_click_hinh_anh_se_phong_to_ra_toan_man_hinh' | translate\">\r\n <span class=\"mx-2 w-50\">{{'toan_man_hinh' | translate}}</span>\r\n <nz-switch [ngModel]=\"config['image-fullscreen']?.['toggle_fullscreen']\"\r\n (ngModelChange)=\"config['image-fullscreen']['toggle_fullscreen'] = $event;updateConfig()\"\r\n class=\"mx-2\">\r\n </nz-switch>\r\n </div>\r\n\r\n <ng-container *ngIf=\"config['image-fullscreen']?.['toggle_fullscreen']\">\r\n <!-- B\u1EADt t\u1EAFt m\u1EDF preview to\u00E0n m\u00E0n h\u00ECnh \u1EDF design \u0111\u1EC3 c\u1EA5u h\u00ECnh -->\r\n <div class=\"item-border my-3 cursor-pointer\" style=\"float: right\">\r\n <p class=\"m-0 title-border\" (click)=\"handleOpenFullscreenPreview()\">\r\n {{ 'xem_truoc' | translate }} →\r\n </p>\r\n </div>\r\n </ng-container>\r\n </li>\r\n\r\n <!-- Hi\u1EC7u \u1EE9ng -->\r\n <li nz-submenu nzTitle=\"{{'hieu_ung'| translate}}\" [(nzOpen)]=\"openMap.menu8\" (nzOpenChange)=\"openHandler('menu8')\">\r\n <app-choose-animations-config [elementChoosing]=\"objectChoosing\" (openAnimationDetail)=\"openAnimationDetail($event)\"\r\n [id_object]=\"objectChoosing._id\" [device]=\"device\" [class]=\"class\" [config]=\"config\" [staticdata]=\"staticdata\"\r\n [cursorClass]=\"class['image']\" [effect_hover]=\"effect_hover\" [customize]=\"customize\" \r\n [effectFileUsing]=\"'image'\">\r\n </app-choose-animations-config>\r\n </li>\r\n <!-- Th\u00EAm li\u00EAn k\u1EBFt -->\r\n <li nz-submenu nzTitle=\"{{'lien_ket'| translate}}\" [(nzOpen)]=\"openMap.menu9\"\r\n (nzOpenChange)=\"openHandler('menu9')\">\r\n <app-link-page-config\r\n [objectChoosing]=\"objectChoosing\" \r\n [staticdata]=\"staticdata\"\r\n [id_object]=\"objectChoosing._id\"\r\n [dynamic_data]=\"objectChoosing.dynamic_data\"\r\n [hasContact]=\"true\"\r\n [blocks_of_page]=\"blocks_of_page\"\r\n >\r\n </app-link-page-config>\r\n </li>\r\n <!-- V\u0102N B\u1EA2N G\u1EE2I \u00DD -->\r\n <li nz-submenu nzTitle=\"{{'van_ban_goi_y' | translate}}\" [(nzOpen)]=\"openMap.menu12\" (nzOpenChange)=\"openHandler('menu12')\">\r\n <div class=\"editor-field my-0\">\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row my-0\">\r\n <!-- N\u1ED9i dung ch\u1EEF -->\r\n <div class=\"config-font\" style=\"width:100%\">\r\n <mat-form-field style=\"width:100%\">\r\n <mat-label>{{'noi_dung' | translate}}</mat-label>\r\n <textarea style=\"height:80px;background: #edf6fd;\r\n padding:10px 6px;font-size:13px;border-top-left-radius:5px;\r\n border-top-right-radius:5px\" matInput [(ngModel)]=\"config['tooltip']\"\r\n (blur)=\"updateConfig()\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n <!-- M\u00D4 T\u1EA2 N\u1ED8I DUNG C\u1EE6A \u1EA2NH -->\r\n <li nz-submenu nzTitle=\"{{'mo_ta_noi_dung_cua_anh' | translate}}\" [(nzOpen)]=\"openMap.menu14\" (nzOpenChange)=\"openHandler('menu14')\">\r\n <div class=\"editor-field my-0\">\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row my-0\">\r\n <!-- N\u1ED9i dung ch\u1EEF -->\r\n <div class=\"config-font\" style=\"width:100%\">\r\n <mat-form-field style=\"width: 100%\" class=\"aria-label-input\" [matTooltip]=\"'*_giai_thich_aria_label' | translate\">\r\n <mat-label>{{'mo_ta_noi_dung_cua_anh' | translate}}</mat-label>\r\n <textarea matInput\r\n [ngModel]=\"staticdata.accessibility?.['img_alt_' + functionService.selectedLanguageCode]\"\r\n (ngModelChange)=\"staticdata.accessibility['img_alt_' + functionService.selectedLanguageCode] = $event\"\r\n (blur)=\"updateStaticData();\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n <!-- <div *ngIf=\"loading\" style=\"position: absolute; left:0; top: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.1); display: flex; justify-content: center; align-items: center\">\r\n\r\n </div> -->\r\n </div>\r\n <!-- M\u1EDF r\u1ED9ng -->\r\n <div class=\"view-more\" *ngIf=\"isViewAll\">\r\n <!-- C\u1EA5u h\u00ECnh chi ti\u1EBFt vi\u1EC1n -->\r\n <div class=\"view_more-border\" *ngIf=\"currentViewAll.index == 4\">\r\n <app-borders-radius-config [elementChoosing]=\"objectChoosing\" [device]=\"device\" [class]=\"class\" [borderRadiusClass]=\"class['image__boundary--img']\"\r\n [id_object]=\"objectChoosing._id\">\r\n </app-borders-radius-config>\r\n </div>\r\n\r\n <!-- C\u1EA5u h\u00ECnh chi ti\u1EBFt hi\u1EC7u \u1EE9ng -->\r\n <div class=\"editor_effect-hover\" *ngIf=\"currentViewAll.index == 6\">\r\n <app-animations-config [elementChoosing]=\"objectChoosing\" [device]=\"device\" [staticdata]=\"staticdata\" [id_object]=\"objectChoosing._id\"\r\n [customize]=\"customize\"></app-animations-config>\r\n </div>\r\n <!-- M\u1EDF r\u1ED9ng h\u00ECnh d\u1EA1ng \u1EA3nh-->\r\n <div class=\"editor-field-body p-0 mt-2\" *ngIf=\"currentViewAll.index == 7\">\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row\">\r\n <!-- <div class=\"d-flex justify-content-between mt-2 align-items-start\">\r\n <p class=\"font-weight-bold\">Hi\u1EC3n th\u1ECB tr\u1EE5c \u0111\u1ED1i t\u01B0\u1EE3ng</p>\r\n <nz-switch [(ngModel)]=\"config.image.show_axis\" (ngModelChange)=\"updateConfig()\"></nz-switch>\r\n </div> -->\r\n <p style=\"font-weight: 500; font-size: 16px\">{{'lat_hinh'| translate}}</p>\r\n <div class=\"field-row-sub\">\r\n <div style=\"display: flex; gap: 4px; width: 100%\">\r\n <span nz-button nzType=\"primary\" nzSize=\"default\" (click)=\"handleSetTransform('y')\" class=\"btn_transform\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\"\r\n d=\"M15.97 15.25h-2.72c-5.3 0-9.5-2.15-9.5-4.5s4.2-4.5 9.5-4.5c3.03 0 5.82.7 7.62 1.86a.75.75 0 1 0 .81-1.26c-2.06-1.33-5.13-2.1-8.43-2.1-6.02 0-11 2.55-11 6s4.98 6 11 6h2.8l-2.3 2.3a.75.75 0 1 0 1.07 1.05l2.83-2.82c.68-.69.68-1.8 0-2.48l-2.83-2.83a.75.75 0 0 0-1.06 1.06l2.21 2.22z\">\r\n </path>\r\n </svg>\r\n <p class=\"m-0\">{{'ngang'| translate}}</p>\r\n </span>\r\n <button nz-button nzType=\"primary\" nzSize=\"default\" (click)=\"handleSetTransform('x')\"\r\n class=\"btn_transform\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\"\r\n d=\"M15.25 8.35v2.4c0 5.3-2.15 9.5-4.5 9.5s-4.5-4.2-4.5-9.5c0-3.03.7-5.82 1.86-7.62a.75.75 0 1 0-1.26-.81c-1.33 2.06-2.1 5.13-2.1 8.43 0 6.02 2.55 11 6 11s6-4.98 6-11V8.27l2.3 2.3A.75.75 0 1 0 20.1 9.5l-2.82-2.83a1.75 1.75 0 0 0-2.48 0L11.97 9.5a.75.75 0 1 0 1.06 1.06l2.22-2.22z\">\r\n </path>\r\n </svg>\r\n <p class=\"m-0\">{{'doc'| translate}}</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item mt-2\" style=\"min-height: 32px\">\r\n <p class=\"m-0\">{{'ngang'| translate}}</p>\r\n <nz-input-number\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateY\"\r\n (ngModelChange)=\"SetTransform()\"\r\n (nzBlur)=\"updateClassAndConfig()\"\r\n >\r\n </nz-input-number>\r\n </div>\r\n <nz-slider\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateY\"\r\n (nzOnAfterChange)=\"updateClassAndConfig()\"\r\n (ngModelChange)=\"SetTransform()\"\r\n >\r\n </nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\" style=\"min-height: 32px\">\r\n <p class=\"m-0\">{{'doc'| translate}}</p>\r\n <nz-input-number\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateX\"\r\n (ngModelChange)=\"SetTransform()\"\r\n (nzBlur)=\"updateClassAndConfig()\"\r\n >\r\n </nz-input-number>\r\n </div>\r\n <nz-slider\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateX\"\r\n (nzOnAfterChange)=\"updateClassAndConfig()\"\r\n (ngModelChange)=\"SetTransform()\"\r\n >\r\n </nz-slider>\r\n </div>\r\n </div>\r\n <br />\r\n <!-- Xoay h\u00ECnh \u1EA3nh -->\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row mb-3\">\r\n <div style=\"justify-content: space-between; align-items: center\">\r\n <p class=\"mt-1\" style=\"font-weight: 500; font-size: 16px\">\r\n {{'xoay_hinh'| translate}}\r\n </p>\r\n <div style=\"display: flex; justify-content: space-between; gap: 4px\">\r\n <button class=\"btn_transform\" nz-button nzType=\"primary\" nzSize=\"default\"\r\n (click)=\"handleSetTransform('-z')\">\r\n <span nz-icon nzType=\"rotate-left\" nzTheme=\"outline\"></span>\r\n <p class=\"m-0\">{{'trai'| translate}}</p>\r\n </button>\r\n <button nz-button nzType=\"primary\" nzSize=\"default\" class=\"btn_transform\"\r\n (click)=\"handleSetTransform('z')\">\r\n <span nz-icon nzType=\"rotate-right\" nzTheme=\"outline\"></span>\r\n <p class=\"m-0\">{{'phai'| translate}}</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\" styl=\"min-height: 32px\">\r\n <p class=\"m-0\">{{'xoay'| translate}}</p>\r\n <nz-input-number\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateZ\"\r\n (ngModelChange)=\"SetTransform()\"\r\n (nzBlur)=\"updateClassAndConfig()\"\r\n >\r\n </nz-input-number>\r\n </div>\r\n <nz-slider\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateZ\"\r\n (nzOnAfterChange)=\"updateClassAndConfig()\"\r\n (ngModelChange)=\"SetTransform()\">\r\n </nz-slider>\r\n </div>\r\n </div>\r\n <br />\r\n <!-- C\u1EA5u h\u00ECnh \u0110\u1ED9 nghi\u00EAng -->\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row mb-3\">\r\n <div class=\"item\">\r\n <p class=\"m-0\" style=\"font-weight: 500; font-size: 16px\">\r\n {{'do_nghieng'| translate}}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\" style=\"min-height: 32px\">\r\n <p class=\"m-0\">{{'ngang'| translate}}</p>\r\n <nz-input-number\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_skewY\"\r\n (ngModelChange)=\"SetTransform()\"\r\n (nzBlur)=\"updateClassAndConfig()\"\r\n >\r\n </nz-input-number>\r\n </div>\r\n <nz-slider\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_skewY\"\r\n (nzOnAfterChange)=\"updateClassAndConfig()\"\r\n (ngModelChange)=\"SetTransform()\"\r\n >\r\n </nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\" style=\"min-height: 32px\">\r\n <p class=\"m-0\">{{'doc'| translate}}</p>\r\n <nz-input-number\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_skewX\"\r\n (ngModelChange)=\"SetTransform()\"\r\n (nzBlur)=\"updateClassAndConfig()\"\r\n >\r\n </nz-input-number>\r\n </div>\r\n <nz-slider\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_skewX\"\r\n (nzOnAfterChange)=\"updateClassAndConfig()\"\r\n (ngModelChange)=\"SetTransform()\"\r\n >\r\n </nz-slider>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- M\u1EDF r\u1ED9ng c\u1EA5u h\u00ECnh \u0111\u1ED9 bao ph\u1EE7 -->\r\n <div class=\"editor-field-body p-1\" *ngIf=\"currentViewAll.index == 3\">\r\n <div class=\"field-row\">\r\n <div class=\"field-row-sub\">\r\n <p class=\"m-0\" style=\"font-weight: 500; font-size: 16px\">\r\n {{'vi_tri_hinh_anh'| translate}}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"d-flex justify-content-between py-1\">\r\n <p class=\"m-0\">{{'ngang'| translate}}</p>\r\n <nz-input-number [(ngModel)]=\"config.image.object_x\" [nzMin]=\"0\" [nzStep]=\"1\"\r\n (ngModelChange)=\"handleSetPositionImage()\"></nz-input-number>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"d-flex justify-content-between py-1\">\r\n <p class=\"m-0\">{{'doc'| translate}}</p>\r\n <nz-input-number [(ngModel)]=\"config.image.object_y\" [nzMin]=\"0\" [nzStep]=\"1\"\r\n (ngModelChange)=\"handleSetPositionImage()\"></nz-input-number>\r\n </div>\r\n </div>\r\n <div class=\"field-row mt-2\">\r\n <div class=\"field-row-sub\">\r\n <p class=\"m-0\" style=\"font-weight: 500; font-size: 16px\">\r\n {{'phong_thu_hinh_anh'| translate}}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"d-flex justify-content-between py-1\">\r\n <p class=\"m-0\">{{'do_co_gian'| translate}}</p>\r\n </div>\r\n <nz-slider [(ngModel)]=\"class['image__boundary--img'].transfrom_scale\" (nzOnAfterChange)=\"scale()\"\r\n (ngModelChange)=\"(class['image__boundary--img'].transfrom_scale)\" [nzMin]=\"0.1\" [nzMax]=\"2\"\r\n [nzStep]=\"0.1\"></nz-slider>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <nz-modal nzTitle=\"{{ 'chuyen_anh_len_server' | translate}}\" [(nzVisible)]=\"isShowConfirmPopup\" [nzContent]=\"modalContent\"\r\n (nzOnCancel)=\"handleCancelConfirm()\" (nzOnOk)=\"handleOkConfirm()\" [nzFooter]=\"modalFooter\">\r\n <ng-template #modalContent>\r\n <p>{{'nen_anh_tai_len' | translate}}</p>\r\n <nz-select style=\"margin-bottom: 15px\" [(ngModel)]=\"objectChoosing.setups.upload_image.compress_type\" (ngModelChange)=\"updateSetups()\"\r\n nzPlaceHolder=\"{{'nen_anh_tai_len' | translate}}\" nzAllowClear>\r\n <nz-option [nzValue]=\"'no-compress'\" nzLabel=\"{{'khong_nen_anh_sau_khi_tai_len' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'compress-screen'\" nzLabel=\"{{'nen_anh_theo_ti_le_man_hinh_hien_thi' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'compress-frame'\" nzLabel=\"{{'nen_anh_theo_ti_le_khung_hien_thi_anh' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'custom'\" nzLabel=\"{{'nen_anh_theo_kich_thuoc_tu_chon' | translate}}\"></nz-option>\r\n </nz-select>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.compress_type == 'custom'\" class=\"mr-4\">\r\n <mat-label>{{'chieu_rong' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_rong' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_width\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_width = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.compress_type == 'custom'\">\r\n <mat-label>{{'chieu_cao' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_cao' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_height\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_height = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n </ng-template>\r\n <ng-template #modalFooter>\r\n <button nz-button nzType=\"default\" (click)=\"handleCancelConfirm()\">{{'khong' | translate}}</button>\r\n <button nz-button nzType=\"primary\" (click)=\"handleOkConfirm()\" [nzLoading]=\"isConfirmLoading\">{{'dong_y' | translate}}</button>\r\n </ng-template>\r\n </nz-modal>\r\n</div>\r\n", styles: [".image-editor::ng-deep .ant-menu-submenu-title{padding:0!important}.image-editor::ng-deep .ant-menu.ant-menu-root.ant-menu-light.ant-menu-inline{padding:0!important}.image-editor::ng-deep .mat-form-field{width:100%}.image-editor::ng-deep .mat-form-field-underline{bottom:0;position:relative;margin-bottom:.5rem}.image-editor::ng-deep .mat-form-field-wrapper{padding-bottom:0}*{font-size:14px}.ant-radio-input{z-index:0}.title{line-height:1.5}.custom-device{display:flex;justify-content:space-between;align-items:center;padding:7px 0}.custom-textarea{min-height:150px!important}.upload-background-image{width:100%;text-align:center;padding:12px;background-color:var(--ion-color-primary);color:#fff;border-radius:12px}.btn_transform{display:flex;grid-gap:4px;gap:4px;align-items:center;min-width:48%;justify-content:center;background-color:#018848;color:#f5f5f5}.custom{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;padding:5px 0}.input-number{padding:5px!important;border:1px solid #ddd!important;outline:none!important;width:40%!important;border-radius:3px!important}nz-input-number{width:40%;max-height:30px}.view{padding:5px;display:flex;align-items:center;justify-content:flex-end;grid-gap:7px;gap:7px}.item{display:flex;align-items:center;justify-content:space-between}.main{padding:5px;margin-top:10px;line-height:1}.main .item{display:flex;align-items:center;justify-content:space-between;margin-bottom:15px}.main .hidden-text{margin:0;font-size:14px}.main .title-font{font-size:14px}.main nz-select{width:100px!important}.main label{display:flex;align-items:center;margin-bottom:10px;margin-right:0}.main label span.ant-radio+*{padding-right:0!important}::ng-deep span.ant-radio+*{width:100%}.w-mat-input{width:120px;overflow:hidden}.upload-background-image{display:flex;justify-content:center;align-items:center;padding:16px 18px;grid-gap:5px;gap:5px;background-color:var(--ion-color-primary);color:#fff;margin-right:-8px;border-radius:12px}.disable{opacity:.5}.field-row__switch{display:flex;width:100%;justify-content:space-around;padding:10px 0}.image-editor{background-color:#fff;height:100%;overflow:auto;overflow-x:hidden}.image-editor::-webkit-scrollbar{width:0px}.image-editor::-webkit-scrollbar-track{background:white}.image-editor::-webkit-scrollbar-thumb{background:#888}.image-editor::-webkit-scrollbar-thumb:hover{background:#555;opacity:.5}.image-editor .editor-header{height:40px;border-bottom:1px solid #ddd;display:flex;align-items:center;padding:0 5px;text-transform:uppercase;grid-gap:7px;gap:7px}.image-editor .editor-header span{font-size:13px}.image-editor .editor-header i{font-size:16px}.image-editor .editor-header span,.image-editor .editor-header i{cursor:pointer}.image-editor .upload-image{margin-top:5px}.image-editor .upload-image .switch-image .title{line-height:14px;align-items:baseline}.image-editor .upload-image .upload-image-device{width:100%}.image-editor .upload-image .upload-image-device button{width:100%;padding:10px 0;border-radius:2px}.image-editor .upload-image .upload-image-device button:hover{background-color:#fff!important;color:var(--ion-color-vh-green);border:1px solid var(--ion-color-vh-green)}.image-editor .editor-content li .upload-image{padding:5px}.image-editor .editor-content .editor-field{padding:10px 5px}.image-editor .editor-content .editor-field .editor-field-header{display:flex;justify-content:space-between}.image-editor .editor-content .editor-field .editor-field-header p:nth-child(1){font-weight:500;font-size:16px}.image-editor .editor-content .box-shadow .list-box{width:100%}.image-editor .editor-content .box-shadow .list-box .box{flex-basis:calc(33.333% - 6px);min-width:calc(33.333% - 6px);max-width:calc(33.333% - 3px)}.image-editor .editor-content .field-row{margin-bottom:14px}.image-editor .editor-content .field-row .field-row-sub{display:flex;justify-content:space-between;align-items:center}.image-editor .editor-content .field-row .field-row-sub .title{line-height:16px}.image-editor .editor-content .field-row .field-row-sub nz-input-number{width:40%}.image-editor .editor-content .field-row .field-content{display:flex;flex-wrap:wrap;grid-gap:8px;gap:8px;margin-right:-8px}.image-editor .editor-content .field-row .field-content .image-fit,.image-editor .editor-content .field-row .field-content .image-hover{flex-basis:calc(33.333% - 8px);width:calc(33.333% - 8px);flex-shrink:1;border:1px solid #ddd;cursor:pointer;transition:.2s;overflow:hidden}.image-editor .editor-content .field-row .field-content .image-fit:hover,.image-editor .editor-content .field-row .field-content .image-hover:hover{box-shadow:#0000003d 0 3px 8px;transition:.2s}.image-editor .editor-content .field-row .field-content .image-fit p,.image-editor .editor-content .field-row .field-content .image-hover p{height:25%;display:flex;align-items:center;margin:0;justify-content:center}.image-editor .editor-content .field-row .field-content .image-fit img,.image-editor .editor-content .field-row .field-content .image-hover img{width:100%;height:75%}.image-editor .editor-content .field-row .field-content .image-hover{border:none;position:relative}.image-editor .editor-content .field-row .field-content .image-hover:hover{box-shadow:none;transition:.2s}.image-editor .field-content-slide{padding:10px 0}.image-editor .field-content-slide .field-content-inner{display:flex;flex-wrap:wrap;grid-gap:8px;gap:8px;width:auto;margin-right:-8px}.image-editor .field-content-slide .field-content-inner .image-item{flex-basis:calc(33.333% - 8px);min-width:calc(33.333% - 8px);padding:10px;border:1px solid #ddd;cursor:pointer;transition:.2s;border-radius:6px;overflow:hidden}.image-editor .field-content-slide .field-content-inner .image-item:hover{box-shadow:#0000003d 0 3px 8px;transition:.2s}.image-editor .field-content-slide .field-content-inner .image-item p{height:25%;display:flex;align-items:center;margin:0;justify-content:center}.image-editor .field-content-slide .field-content-inner .image-item img{width:100%;height:75%}.image-editor .field-content-slide .field-content-inner .image-hover-item{flex-basis:calc(50% - 8px);min-width:calc(50% - 8px);height:150px;border:1px solid #ddd;cursor:pointer;transition:.2s;border-radius:6px;overflow:hidden}.image-editor .field-content-slide .field-content-inner .image-hover-item p{height:25%;display:flex;align-items:center;margin:0;justify-content:center}.image-editor .field-content-slide .field-content-inner .image-hover-item img{width:40%;height:40%}.layer-index{display:flex;align-items:center;justify-content:space-between}.layer-index .title{margin:0}.hover-content .hover-effects{display:flex}.field-content .field-content-inner{display:flex;flex-wrap:wrap;grid-gap:8px;gap:8px;width:auto;margin-right:-8px}.field-content .field-content-inner .image-item{flex-basis:calc(50% - 8px);min-width:calc(50% - 8px);height:0;border:1px solid #ddd;cursor:pointer;transition:.2s;border-radius:6px;overflow:hidden}.field-content .field-content-inner .image-item p{height:25%;display:flex;align-items:center;margin:0;justify-content:center}.selected{border:2px solid var(--ion-color-vh-green)!important}.checkbox-border span{color:red!important}.disabled{pointer-events:none;opacity:.3!important}[nz-select]{margin:0 8px 10px 0}[nz-menu]{border:none!important}.btn-more:hover{color:var(--ion-color-vh-green)}.hover-zoom-in{transition:.3s}.hover-zoom-in:hover{transition:.3s}.hover-zoom-out{transition:.3s}.hover-zoom-out:hover{transform:scale(.8)!important;transition:.3s}.hover-drop-shadow{transition:.3s}.hover-drop-shadow:hover{box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px!important;transition:.3s}.hover-opacity{transition:.3s opacity!important}.hover-opacity:hover{opacity:.6;transition:.3s opacity!important}.hover-border{transition:.3s border!important}.hover-border:hover{border:2px solid #333!important;transition:.3s border!important}.square{position:relative;width:100%;overflow:hidden}.square .content{position:absolute;width:100%;height:100%;top:0;left:0}.square:after{content:\"\";display:block;padding-bottom:100%!important}.list-box{grid-gap:4px;gap:4px;flex-wrap:wrap;display:flex}.list-box .box{flex-basis:calc(50% - 6px);min-width:calc(50% - 6px);max-width:calc(50% - 3px);margin-bottom:40px;position:relative;width:100%;display:flex;background-color:#ffa64d}.list-box .box .content-icon{margin:auto 0;color:#fff}.list-box .box .btn-setting{margin:auto;color:#fff}.list-box .box .box-item{position:relative;border:2px solid white;display:flex;background-color:#ffa64d}.list-box .box .box-item img{width:100%;height:100%}.list-box .box .box-name{position:absolute;width:100%;height:30px;bottom:-30px;display:flex;align-items:center;justify-content:center}.ant-drawer-body:ng-deep{padding:0!important}.hideLink{visibility:hidden;opacity:0;transition:visibility 0s linear .3s,opacity .3s}.showLink{visibility:visible;opacity:1;transition:visibility 0s linear 0s,opacity .3s}.button-hover{animation:name duration timing-function delay iteration-count direction fill-mode;margin-bottom:32px;padding:10px 5px;display:flex;flex-wrap:wrap;grid-gap:10px;gap:10px}.button-hover .effect-button{position:relative;background-color:#e5e5e5;text-align:center;height:40px;border-radius:5px}.button-hover .effect-button button{overflow:hidden;width:100%;height:100%;background-color:#e5e5e5;border-radius:5px;text-align:center;display:flex;justify-content:center;align-items:center}.button-hover .active{border:2px solid #00a859;border-radius:5px;min-width:55px;min-height:60px}.button-hover .effect_zoom_button{width:100%;height:34px;border:2px solid #e5e5e5;border-radius:5px;transform:scale(1);transition:.24s all ease-in-out}.button-hover .effect_zoom_button:hover{border:2px solid #00a859;border-radius:5px;transform:scale(1.1)}.button-hover .effect_blur_button{width:100%;height:34px;border:2px solid #e5e5e5;border-radius:5px;transition:.24s all ease-in-out}.button-hover .effect_blur_button:hover{opacity:.6;border:2px solid #00a859}.button-hover .effect_change_color_button{width:100%;height:34px;border:2px solid #e5e5e5;border-radius:5px;transition:.24s all ease-in-out}.button-hover .effect_change_color_button:hover{background-color:#00a859;color:#fff}.button-hover .effect_shadow{width:100%;height:34px;border:2px solid #e5e5e5;border-radius:5px;transition:.24s all ease-in-out}.button-hover .effect_shadow:hover{filter:drop-shadow(0 0 .1rem #00a859)}.button-hover .effect_movotion{position:relative;width:100%;height:34px;border:2px solid #e5e5e5;border-radius:5px;z-index:0}.button-hover .effect_movotion:before{content:\"\";background:#00a859;z-index:-1;height:50%;width:0;position:absolute;top:0;left:0;transition:.3s cubic-bezier(.785,.135,.15,.86)}.button-hover .effect_movotion:after{content:\"\";background:#00a859;z-index:-1;height:50%;width:0;position:absolute;bottom:0;right:0;transition:.3s cubic-bezier(.785,.135,.15,.86)}.button-hover .effect_movotion:hover:before{width:100%}.button-hover .effect_movotion:hover:after{width:100%}.button-hover .effect_movotion:hover{color:#fff}.button-hover .selected{border:2px solid #00a859;border-radius:5px}.label-item{width:100%;cursor:pointer}.label-item input{width:30px}.item-border{padding:0 5px;display:flex;align-items:center;justify-content:space-between;margin-top:10px}.widget-button{padding:5px;background:none}.widget-button:hover{background:#c6c6c6}.widget-button.active{background:#c6c6c6}.item-border-size{padding:5px}.item-border-size .row-border{display:flex;align-items:center;justify-content:space-between;margin-top:10px}.color-pick{display:flex;justify-content:space-around;align-items:center}.input-color{border:1px solid #ccc;outline:none;cursor:pointer;width:80px;height:30px;border-radius:5px;caret-color:transparent;padding:12px 0}.item-border-radius{margin-top:10px;padding:5px}.item-border-radius-top-left,.item-border-radius-top-right,.item-border-radius-bottom-left,.item-border-radius-bottom-right{padding:5px}.slide-bar{display:flex;align-items:center;justify-content:space-between}.cursor-pointer{cursor:pointer}.config-name{display:flex;justify-content:space-between;align-items:center;grid-gap:5px;gap:5px;margin:15px 0}.config-name p{margin:0;line-height:1.5;flex:1}.config-name>nz-input-number,.config-name>input,.config-name>nz-select{width:40%}.drop-zone{border:4px dashed #212121;border-radius:8px;padding:10px;text-align:center;background-color:#414141cc;color:#ccc;transition:border-color .3s,background-color .3s;cursor:pointer;position:relative}.drop-zone.dragging{border-color:#66b29d;background-color:#2b4a46}.drop-zone label{cursor:pointer;display:inline-block;margin-bottom:0!important}.drop-zone label mat-icon{font-size:40px;width:40px;height:40px;margin-bottom:5px;color:#fff}.drop-zone label p{font-size:14px;margin:0}.drop-zone label span{color:#00bfff;text-decoration:underline}.drop-zone .preview img{max-width:100%;max-height:200px;border-radius:8px}.drop-zone .button-list{position:absolute;top:5px;right:5px;display:flex;grid-gap:3px;gap:3px}.drop-zone .button-list button{padding:4px;border-radius:100px;background:#00a859;color:#fff}.drop-zone .button-list button mat-icon{display:flex;justify-content:center;align-items:center}.img-info__text{line-height:1.4;margin-bottom:6px}.highlight{color:#00a859;font-weight:500;font-size:16px}.aria-label-input mat-label{display:flex;grid-gap:8px;gap:8px;font-size:16px}.aria-label-input mat-label mat-icon{font-size:16px}::ng-deep .mat-tooltip{font-size:14px!important;text-align:justify!important;white-space:pre-line!important;max-width:300px!important}\n"], components: [{ type: i10.NzSwitchComponent, selector: "nz-switch", inputs: ["nzLoading", "nzDisabled", "nzControl", "nzCheckedChildren", "nzUnCheckedChildren", "nzSize"], exportAs: ["nzSwitch"] }, { type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i6$5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i7$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i12$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { type: i3$1.LinkPageComponent, selector: "app-link-page-config", inputs: ["objectChoosing", "staticdata", "linkStaticdata", "id_object", "blocks_of_page", "dynamic_data", "type_page", "type_contact", "hasContact"] }, { type: i5$5.NzSubMenuComponent, selector: "[nz-submenu]", inputs: ["nzMenuClassName", "nzPaddingLeft", "nzTitle", "nzIcon", "nzOpen", "nzDisabled"], outputs: ["nzOpenChange"], exportAs: ["nzSubmenu"] }, { type: i3$1.HideShowConfigComponent, selector: "app-hide-show-config", inputs: ["device", "isBlock", "elementChoosing"] }, { type: i3$1.BrightnessContrastConfigComponent, selector: "app-brightness-contrast-config", inputs: ["id_object", "device", "class", "config", "staticdata", "filterConfig", "opacityClass", "type", "elementChoosing"] }, { type: i3$1.ObjectFitConfigComponent, selector: "app-object-fit-config", inputs: ["class", "type", "objectFitClass", "style_field", "device", "objectChoosing"], outputs: ["isViewAll"] }, { type: i3$1.BordersConfigComponent, selector: "app-borders-config", inputs: ["elementChoosing", "class", "borderClass", "device", "isBlock", "id_object", "isPage"], outputs: ["isCloseConfig"] }, { type: i6$2.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecisionMode", "nzPlaceHolder", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzAutoFocus", "nzFormatter", "nzPrecision"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { type: i8$1.NzSliderComponent, selector: "nz-slider", inputs: ["nzDisabled", "nzDots", "nzIncluded", "nzRange", "nzVertical", "nzReverse", "nzMarks", "nzMax", "nzMin", "nzStep", "nzTooltipVisible", "nzTooltipPlacement", "nzDefaultValue", "nzTipFormatter"], outputs: ["nzOnAfterChange"], exportAs: ["nzSlider"] }, { type: i3$1.ChooseAnimationsConfigComponent, selector: "app-choose-animations-config", inputs: ["elementChoosing", "type", "id_object", "device", "class", "config", "staticdata", "cursorClass", "cursorClass2", "titleCursor", "effect_hover", "customize", "isBlock", "isParent", "isShowDialogChooseAnimation", "effectFileUsing", "conditionShowSelectEffect"], outputs: ["openAnimationDetail", "openAnimationDetailChild"] }, { type: i3$1.BordersRadiusConfigComponent, selector: "app-borders-radius-config", inputs: ["elementChoosing", "class", "borderRadiusClass", "device", "id_object", "isBlock", "isPage"] }, { type: i3$1.AnimationsConfigComponent, selector: "app-animations-config", inputs: ["staticdata", "elementChoosing", "config", "device", "id_object", "customize", "type", "isPage", "isBlock", "isParent"] }, { type: i4$1.NzModalComponent, selector: "nz-modal", inputs: ["nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzZIndex", "nzWidth", "nzCloseIcon", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel", "nzTitle", "nzFooter", "nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzContent", "nzComponentParams", "nzWrapClassName", "nzClassName", "nzStyle", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { type: i6$1.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { type: i6$1.NzOptionComponent, selector: "nz-option", inputs: ["nzLabel", "nzValue", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }], directives: [{ type: i12$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i12$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i21.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitleContext", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipTitle", "nz-tooltip", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$1.MatLabel, selector: "mat-label" }, { type: i15.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i17.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i5$5.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { type: i18.NzIconDirective, selector: "[nz-icon]", inputs: ["nzRotate", "nzSpin", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i16$2.ColorPickerDirective, selector: "[colorPicker]", inputs: ["cpWidth", "cpHeight", "cpToggle", "cpDisabled", "cpIgnoredElements", "cpFallbackColor", "cpColorMode", "cpCmykEnabled", "cpOutputFormat", "cpAlphaChannel", "cpDisableInput", "cpDialogDisplay", "cpSaveClickOutside", "cpCloseClickOutside", "cpUseRootViewContainer", "cpPosition", "cpPositionOffset", "cpPositionRelativeToArrow", "cpOKButton", "cpOKButtonText", "cpOKButtonClass", "cpCancelButton", "cpCancelButtonText", "cpCancelButtonClass", "cpPresetLabel", "cpPresetColorsClass", "cpMaxPresetColorsLength", "cpPresetEmptyMessage", "cpPresetEmptyMessageClass", "cpAddColorButton", "cpAddColorButtonText", "cpAddColorButtonClass", "cpRemoveColorButtonClass", "colorPicker", "cpPresetColors"], outputs: ["cpInputChange", "cpToggleChange", "cpSliderChange", "cpSliderDragEnd", "cpSliderDragStart", "colorPickerOpen", "colorPickerClose", "colorPickerCancel", "colorPickerSelect", "colorPickerChange", "cpCmykColorChange", "cpPresetColorsChange"], exportAs: ["ngxColorPicker"] }, { type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], pipes: { "translate": i12$2.TranslatePipe } });
|
|
15626
|
+
AtwImageAdminConfig.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AtwImageAdminConfig, selector: "atw-image-admin-config", inputs: { visible_config_tool: "visible_config_tool", objectChoosing: "objectChoosing", type: "type", device: "device", class: "class", staticdata: "staticdata", config: "config", blocks_of_page: "blocks_of_page" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"image-editor\">\r\n <div style=\"display: flex; align-items: center; gap: 4px; flex-wrap: wrap;\">\r\n <button [ngClass]=\"configMode == 'basic' ? 'ant-btn ant-btn-primary' : 'ant-btn'\" class=\"d-flex align-items-center\" (click)=\"configMode = 'basic'\">\r\n <span>{{('cau_hinh_co_ban') | translate}}</span>\r\n </button>\r\n \r\n <button [ngClass]=\"configMode == 'advanced' ? 'ant-btn ant-btn-primary' : 'ant-btn'\" class=\"d-flex align-items-center\" (click)=\"configMode = 'advanced'\">\r\n <span>{{('cau_hinh_nang_cao') | translate}}</span>\r\n </button>\r\n </div>\r\n <!-- C\u1EA5u h\u00ECnh c\u01A1 b\u1EA3n -->\r\n <ng-container *ngIf=\"configMode == 'basic'\">\r\n <div style=\"margin-top: 10px\">\r\n <div class=\"field-row mb-2\" style=\"margin: 0\">\r\n <div class=\"field-row-sub field-row__switch justify-content-between\" style=\"padding: 0\" nz-tooltip\r\n [nzTooltipTitle]=\"'*_giai_thich_anh_lcp' | translate\">\r\n <span> {{'uu_tien_tai_truoc' | translate}} </span>\r\n <nz-switch [(ngModel)]=\"config.is_top_page\" (ngModelChange)=\"updateConfig()\"></nz-switch>\r\n </div>\r\n </div>\r\n\r\n <mat-form-field appearance=\"fill\">\r\n <mat-label>{{'kieu_hien_thi_anh' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.display\" (ngModelChange)=\"changeImgType()\">\r\n <mat-option value=\"shared\">{{'anh_dung_chung_cho_tung_thiet_bi' | translate}}</mat-option>\r\n <mat-option value=\"individual\">{{'anh_dung_rieng_cho_tung_thiet_bi' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"fill\">\r\n <mat-label>{{'nguon_hinh_anh_hien_thi_len' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.source\" (ngModelChange)=\"updateSetups()\">\r\n <mat-option value=\"device\">{{'tu_thiet_bi' | translate}}</mat-option>\r\n <mat-option value=\"library\">{{'tu_thu_vien' | translate}}</mat-option>\r\n <mat-option value=\"url\">{{'duong_dan_hinh_anh' | translate}}</mat-option>\r\n <mat-option value=\"free_img\">{{'kho_anh_dung_chung' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device'\" appearance=\"fill\" class=\"config-img\">\r\n <mat-label>{{'nen_anh_tai_len' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.compress_type\" (ngModelChange)=\"updateSetups()\">\r\n <mat-option [value]=\"'no-compress'\">{{'khong_nen_anh_sau_khi_tai_len' | translate}}</mat-option>\r\n <mat-option [value]=\"'compress-screen'\">{{'nen_anh_theo_ti_le_man_hinh_hien_thi' | translate}}</mat-option>\r\n <mat-option [value]=\"'compress-frame'\">{{'nen_anh_theo_ti_le_khung_hien_thi_anh' | translate}}</mat-option>\r\n <mat-option [value]=\"'custom'\">{{'nen_anh_theo_kich_thuoc_tu_chon' | translate}}</mat-option>\r\n\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device' && objectChoosing.setups.upload_image.compress_type == 'custom'\" class=\"mr-4\">\r\n <mat-label>{{'chieu_rong' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_rong' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_width\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_width = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device' && objectChoosing.setups.upload_image.compress_type == 'custom'\">\r\n <mat-label>{{'chieu_cao' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_cao' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_height\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_height = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n\r\n <!-- Hi\u1EC3n th\u1ECB t\u00EAn v\u00E0 \u0111u\u00F4i file h\u00ECnh \u1EA3nh -->\r\n <div *ngIf=\"objectChoosing.setups.upload_image.source !== 'url' && staticdata.img[device + '_img'].includes(id_subproject)\"\r\n class=\"my-1 img-info\">\r\n <p class=\"img-info__text\">\r\n {{ 'thu_muc_chua_tep_hinh_anh' | translate }}: \r\n </p>\r\n <p class=\"img-info__text highlight ml-2\">\r\n {{ getFileInfo(staticdata.img[device + '_img']).folderPath }}\r\n </p>\r\n <p class=\"img-info__text mt-1\">\r\n {{ 'ten_tep_hinh_anh' | translate }}: \r\n </p>\r\n <p class=\"img-info__text highlight ml-2\">\r\n {{ getFileInfo(staticdata.img[device + '_img']).fullFileName }}\r\n </p>\r\n </div>\r\n\r\n <!-- Upload input -->\r\n <input type=\"file\" accept=\"image/*\" (change)=\"onUpload($event)\" id=\"upload\" style=\"display: none\" />\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p: K\u00E9o th\u1EA3 \u1EA3nh ho\u1EB7c t\u1EA3i \u1EA3nh t\u1EEB m\u00E1y -->\r\n <div *ngIf=\"objectChoosing.setups.upload_image.source == 'device'\" class=\"drop-zone\" [class.dragging]=\"dragging\"\r\n (drop)=\"onFileDropped_upload($event)\" (dragover)=\"onDragOver_upload($event)\" (dragleave)=\"onDragLeave_upload()\">\r\n <label *ngIf=\"!previewUploadUrl\" for=\"upload\">\r\n <mat-icon>image</mat-icon>\r\n <p>{{ 'keo_hinh_anh_vao_day_hoac' | translate }} <span>{{ 'tai_tep_len' | translate }}</span></p>\r\n </label>\r\n\r\n <div *ngIf=\"previewUploadUrl\" class=\"preview\">\r\n <img [src]=\"previewUploadUrl\" alt=\"Preview\" />\r\n </div>\r\n\r\n <div *ngIf=\"previewUploadUrl\" class=\"gr-btn button-list\">\r\n <button (click)=\"openUpload()\">\r\n <mat-icon>vertical_align_top</mat-icon>\r\n </button>\r\n <button (click)=\"previewUploadUrl = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p t\u1EA3i \u1EA3nh t\u1EEB th\u01B0 vi\u1EC7n -->\r\n <button *ngIf=\"objectChoosing.setups.upload_image.source == 'library'\"\r\n (click)=\"openLibrary()\" class=\"upload-background-image\">\r\n <i class=\"bi bi-upload\"></i>{{'chon_tu_thu_vien' | translate}}\r\n </button>\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p ch\u1ECDn \u1EA3nh t\u1EEB 1 \u0111\u01B0\u1EDDng d\u1EABn b\u1EA5t k\u00EC -->\r\n <div class=\"title\" *ngIf=\"objectChoosing.setups.upload_image.source == 'url' || objectChoosing.setups.upload_image.source == 'free_img'\">\r\n <textarea\r\n class=\"input custom-textarea w-100\"\r\n name=\"background-image\"\r\n id=\"background-image\"\r\n placeholder=\"{{'nhap_duong_dan_anh' | translate}}\"\r\n [(ngModel)]=\"staticdata.img[device + '_img']\"\r\n (blur)=\"changeUrl()\"\r\n [disabled]=\"objectChoosing.setups.upload_image.source == 'free_img'\"\r\n >\r\n </textarea>\r\n </div>\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p ch\u1ECDn \u1EA3nh mi\u1EC5n ph\u00ED -->\r\n <div class=\"custom\" *ngIf=\"objectChoosing.setups.upload_image.source == 'free_img'\">\r\n <label for=\"upload\" (click)=\"openImageFree()\" style=\"width: 100%\">\r\n <button class=\"upload-background-image\">\r\n <i class=\"bi bi-plus-circle\"></i> {{'kho_anh_dung_chung' | translate }}\r\n </button>\r\n </label>\r\n </div>\r\n\r\n <!-- N\u00FAt sao ch\u00E9p link h\u00ECnh \u1EA3nh -->\r\n <button *ngIf=\"staticdata.img[device + '_img'].includes(id_subproject)\"\r\n (click)=\"copyLinkImg()\" nz-button nzType=\"default\" class=\"mt-2 w-100\"\r\n style=\"white-space: normal; border-color: #00a859;\">\r\n {{ 'nhan_de_sao_chep_duong_dan_anh' | translate }}\r\n </button>\r\n\r\n <!-- N\u1EBFu \u1EA3nh ch\u1EE9a id_subproject th\u00EC \u0111\u00E3 l\u00E0 \u1EA3nh tr\u00EAn server r\u1ED3i n\u00EAn s\u1EBD \u1EA9n -->\r\n <button *ngIf=\"!staticdata.img[device + '_img'].includes(id_subproject)\" style=\"width: 100%;\" \r\n nz-button nzType=\"primary\" (click)=\"isShowConfirmPopup = true\" class=\"mt-2\">\r\n {{'chuyen_anh_len_server' | translate}}\r\n </button>\r\n\r\n <!-- C\u1EADp nh\u1EADt cho ph\u00F9 h\u1EE3p v\u1EDBi k\u00EDch th\u01B0\u1EDBc hi\u1EC3n th\u1ECB h\u00ECnh \u1EA3nh \u0111\u1EC3 t\u1ED1i \u01B0u ch\u1EC9 s\u1ED1 PageSpeed -->\r\n <button *ngIf=\"isDesignImageSizeValid\" style=\"line-height: 1.4; padding: 8px\" nz-tooltip\r\n class=\"upload-background-image mt-2\" (click)=\"updateDesignImageSize()\"\r\n [nzTooltipTitle]=\"'chi_dung_cap_nhat_kich_thuoc_anh_cho_nhung_hinh_anh_dung_yen_khong_co_hieu_ung_truot' | translate\">\r\n <i class=\"bi bi-pencil-square\"></i>\r\n {{'cap_nhat_kich_thuoc_anh_theo_kich_thuoc_thiet_ke' | translate}}\r\n </button>\r\n\r\n <app-link-page-config\r\n [objectChoosing]=\"objectChoosing\" \r\n [staticdata]=\"staticdata\"\r\n [id_object]=\"objectChoosing._id\"\r\n [dynamic_data]=\"objectChoosing.dynamic_data\"\r\n [hasContact]=\"true\"\r\n >\r\n </app-link-page-config>\r\n </div>\r\n </ng-container>\r\n <!-- Hi\u1EC3n th\u1ECB ti\u00EAu \u0111\u1EC1 m\u1EDF r\u1ED9ng -->\r\n <div class=\"editor-header\" *ngIf=\"isViewAll\">\r\n <i class=\"bi bi-chevron-left\" (click)=\"isViewAll = !isViewAll\"></i>\r\n <span (click)=\"isViewAll = !isViewAll\">{{ currentViewAll.title | translate }}</span>\r\n </div>\r\n <!-- Dropdown menu -->\r\n <div class=\"editor-content mt-2\" *ngIf=\"!isViewAll && configMode == 'advanced'\">\r\n <ul nz-menu nzMode=\"inline\">\r\n <div class=\"field-row\" style=\"margin: 0\">\r\n <div class=\"field-row-sub field-row__switch\" style=\"padding: 0\" nz-tooltip\r\n [nzTooltipTitle]=\"'*_giai_thich_anh_lcp' | translate\">\r\n <span> {{'uu_tien_tai_truoc' | translate}} </span>\r\n <nz-switch [(ngModel)]=\"config.is_top_page\" (ngModelChange)=\"updateConfig()\"></nz-switch>\r\n </div>\r\n </div>\r\n\r\n <!-- Upload \u1EA3nh -->\r\n <li nz-submenu nzTitle=\"{{'hien_thi'| translate}}\" [(nzOpen)]=\"openMap.menu1\"\r\n (nzOpenChange)=\"openHandler('menu1')\">\r\n <div class=\"upload-image\" *ngIf=\"!isViewAll\">\r\n\r\n <!-- L\u1EF1a ch\u1ECDn hi\u1EC3n th\u1ECB cho c\u00E1c thi\u1EBFt b\u1ECB -->\r\n <app-hide-show-config [elementChoosing]=\"objectChoosing\" [device]=\"device\" >\r\n </app-hide-show-config>\r\n </div>\r\n </li>\r\n\r\n\r\n <li nz-submenu nzTitle=\"{{'hinh_anh'| translate}}\" [(nzOpen)]=\"openMap.menu2\"\r\n (nzOpenChange)=\"openHandler('menu2')\">\r\n <div class=\"mt-2\" >\r\n <mat-form-field appearance=\"fill\">\r\n <mat-label>{{'kieu_hien_thi_anh' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.display\" (ngModelChange)=\"changeImgType()\">\r\n <mat-option value=\"shared\">{{'anh_dung_chung_cho_tung_thiet_bi' | translate}}</mat-option>\r\n <mat-option value=\"individual\">{{'anh_dung_rieng_cho_tung_thiet_bi' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"fill\">\r\n <mat-label>{{'nguon_hinh_anh_hien_thi_len' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.source\" (ngModelChange)=\"updateSetups()\">\r\n <mat-option value=\"device\">{{'tu_thiet_bi' | translate}}</mat-option>\r\n <mat-option value=\"library\">{{'tu_thu_vien' | translate}}</mat-option>\r\n <mat-option value=\"url\">{{'duong_dan_hinh_anh' | translate}}</mat-option>\r\n <mat-option value=\"free_img\">{{'kho_anh_dung_chung' | translate}}</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device'\" appearance=\"fill\" class=\"config-img\">\r\n <mat-label>{{'nen_anh_tai_len' | translate}}</mat-label>\r\n <mat-select disableRipple [(ngModel)]=\"objectChoosing.setups.upload_image.compress_type\" (ngModelChange)=\"updateSetups()\">\r\n <mat-option [value]=\"'no-compress'\">{{'khong_nen_anh_sau_khi_tai_len' | translate}}</mat-option>\r\n <mat-option [value]=\"'compress-screen'\">{{'nen_anh_theo_ti_le_man_hinh_hien_thi' | translate}}</mat-option>\r\n <mat-option [value]=\"'compress-frame'\">{{'nen_anh_theo_ti_le_khung_hien_thi_anh' | translate}}</mat-option>\r\n <mat-option [value]=\"'custom'\">{{'nen_anh_theo_kich_thuoc_tu_chon' | translate}}</mat-option>\r\n\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device' && objectChoosing.setups.upload_image.compress_type == 'custom'\" class=\"mr-4\">\r\n <mat-label>{{'chieu_rong' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_rong' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_width\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_width = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.source == 'device' && objectChoosing.setups.upload_image.compress_type == 'custom'\">\r\n <mat-label>{{'chieu_cao' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_cao' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_height\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_height = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n\r\n <!-- Upload input -->\r\n <input type=\"file\" accept=\"image/*\" (change)=\"onUpload($event)\" id=\"upload\" style=\"display: none\" />\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p: K\u00E9o th\u1EA3 \u1EA3nh ho\u1EB7c t\u1EA3i \u1EA3nh t\u1EEB m\u00E1y -->\r\n <div *ngIf=\"objectChoosing.setups.upload_image.source == 'device'\" class=\"drop-zone\" [class.dragging]=\"dragging\"\r\n (drop)=\"onFileDropped_upload($event)\" (dragover)=\"onDragOver_upload($event)\" (dragleave)=\"onDragLeave_upload()\">\r\n <label *ngIf=\"!previewUploadUrl\" for=\"upload\">\r\n <mat-icon>image</mat-icon>\r\n <p>{{ 'keo_hinh_anh_vao_day_hoac' | translate }} <span>{{ 'tai_tep_len' | translate }}</span></p>\r\n </label>\r\n\r\n <div *ngIf=\"previewUploadUrl\" class=\"preview\">\r\n <img [src]=\"previewUploadUrl\" alt=\"Preview\" />\r\n </div>\r\n\r\n <div *ngIf=\"previewUploadUrl\" class=\"gr-btn button-list\">\r\n <button (click)=\"openUpload()\">\r\n <mat-icon>vertical_align_top</mat-icon>\r\n </button>\r\n <button (click)=\"previewUploadUrl = ''\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p t\u1EA3i \u1EA3nh t\u1EEB th\u01B0 vi\u1EC7n -->\r\n <button *ngIf=\"objectChoosing.setups.upload_image.source == 'library'\"\r\n (click)=\"openLibrary()\" class=\"upload-background-image\">\r\n <i class=\"bi bi-upload\"></i>{{'chon_tu_thu_vien' | translate}}\r\n </button>\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p ch\u1ECDn \u1EA3nh t\u1EEB 1 \u0111\u01B0\u1EDDng d\u1EABn b\u1EA5t k\u00EC -->\r\n <div class=\"title\" *ngIf=\"objectChoosing.setups.upload_image.source == 'url' || objectChoosing.setups.upload_image.source == 'free_img'\">\r\n <textarea\r\n class=\"input custom-textarea w-100\"\r\n name=\"background-image\"\r\n id=\"background-image\"\r\n placeholder=\"{{'nhap_duong_dan_anh' | translate}}\"\r\n [(ngModel)]=\"staticdata.img[device + '_img']\"\r\n (blur)=\"changeUrl()\"\r\n [disabled]=\"objectChoosing.setups.upload_image.source == 'free_img'\"\r\n >\r\n </textarea>\r\n </div>\r\n <!-- Tr\u01B0\u1EDDng h\u1EE3p ch\u1ECDn \u1EA3nh mi\u1EC5n ph\u00ED -->\r\n <div class=\"custom\" *ngIf=\"objectChoosing.setups.upload_image.source == 'free_img'\">\r\n <label for=\"upload\" (click)=\"openImageFree()\" style=\"width: 100%\">\r\n <button class=\"upload-background-image\">\r\n <i class=\"bi bi-plus-circle\"></i> {{'kho_anh_dung_chung' | translate }}\r\n </button>\r\n </label>\r\n </div>\r\n\r\n <!-- N\u1EBFu \u1EA3nh ch\u1EE9a id_subproject th\u00EC \u0111\u00E3 l\u00E0 \u1EA3nh tr\u00EAn server r\u1ED3i n\u00EAn s\u1EBD \u1EA9n -->\r\n <button *ngIf=\"!staticdata.img[device + '_img'].includes(id_subproject)\" style=\"width: 100%; margin-top: 5px;\" nz-button nzType=\"primary\" (click)=\"isShowConfirmPopup = true\">\r\n {{'chuyen_anh_len_server' | translate}}\r\n </button>\r\n\r\n <!-- C\u1EADp nh\u1EADt cho ph\u00F9 h\u1EE3p v\u1EDBi k\u00EDch th\u01B0\u1EDBc hi\u1EC3n th\u1ECB h\u00ECnh \u1EA3nh \u0111\u1EC3 t\u1ED1i \u01B0u ch\u1EC9 s\u1ED1 PageSpeed -->\r\n <button *ngIf=\"isDesignImageSizeValid\" style=\"line-height: 1.4; padding: 8px\" nz-tooltip\r\n class=\"upload-background-image mt-2\" (click)=\"updateDesignImageSize()\"\r\n [nzTooltipTitle]=\"'chi_dung_cap_nhat_kich_thuoc_anh_cho_nhung_hinh_anh_dung_yen_khong_co_hieu_ung_truot' | translate\">\r\n <i class=\"bi bi-pencil-square\"></i>\r\n {{'cap_nhat_kich_thuoc_anh_theo_kich_thuoc_thiet_ke' | translate}}\r\n </button>\r\n </div>\r\n </li>\r\n\r\n <!-- C\u1EA5u h\u00ECnh filter -->\r\n <li nz-submenu nzTitle=\"{{'anh_sang_va_tuong_phan'| translate}}\" [(nzOpen)]=\"openMap.menu3\"\r\n (nzOpenChange)=\"openHandler('menu3')\">\r\n <app-brightness-contrast-config [elementChoosing]=\"objectChoosing\" [device]=\"device\" [class]=\"class\" [config]=\"config\"\r\n [filterConfig]=\"config['filter']\" [opacityClass]=\"class['image__boundary--img']\" [staticdata]=\"staticdata\"\r\n [id_object]=\"objectChoosing._id\">\r\n </app-brightness-contrast-config>\r\n </li>\r\n <!-- C\u1EA5u h\u00ECnh l\u1EADt \u1EA3nh -->\r\n <li nz-submenu nzTitle=\"{{'lat_hinh'| translate}}\" [(nzOpen)]=\"openMap.menu4\" (nzOpenChange)=\"openHandler('menu4')\">\r\n <div class=\"editor-field-body\">\r\n <div class=\"mb-3\">\r\n <div class=\"field-row-sub\">\r\n <div style=\"display: flex; gap: 4px; width: 100%\">\r\n <span nz-button nzType=\"primary\" nzSize=\"default\" (click)=\"handleSetTransform('y')\"\r\n class=\"btn_transform\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\"\r\n d=\"M15.97 15.25h-2.72c-5.3 0-9.5-2.15-9.5-4.5s4.2-4.5 9.5-4.5c3.03 0 5.82.7 7.62 1.86a.75.75 0 1 0 .81-1.26c-2.06-1.33-5.13-2.1-8.43-2.1-6.02 0-11 2.55-11 6s4.98 6 11 6h2.8l-2.3 2.3a.75.75 0 1 0 1.07 1.05l2.83-2.82c.68-.69.68-1.8 0-2.48l-2.83-2.83a.75.75 0 0 0-1.06 1.06l2.21 2.22z\">\r\n </path>\r\n </svg>\r\n <p class=\"m-0\">{{ 'ngang' | translate }}</p>\r\n </span>\r\n <button nz-button nzType=\"primary\" nzSize=\"default\" (click)=\"handleSetTransform('x')\"\r\n class=\"btn_transform\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\"\r\n d=\"M15.25 8.35v2.4c0 5.3-2.15 9.5-4.5 9.5s-4.5-4.2-4.5-9.5c0-3.03.7-5.82 1.86-7.62a.75.75 0 1 0-1.26-.81c-1.33 2.06-2.1 5.13-2.1 8.43 0 6.02 2.55 11 6 11s6-4.98 6-11V8.27l2.3 2.3A.75.75 0 1 0 20.1 9.5l-2.82-2.83a1.75 1.75 0 0 0-2.48 0L11.97 9.5a.75.75 0 1 0 1.06 1.06l2.22-2.22z\">\r\n </path>\r\n </svg>\r\n <p class=\"m-0\">{{ 'doc' | translate }}</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"field-row mb-3\">\r\n <div class=\"field-row-sub\">\r\n <div style=\"display: flex; gap: 4px; width: 100%\">\r\n <button nz-button nzType=\"primary\" nzSize=\"default\" class=\"btn_transform\"\r\n (click)=\"handleSetTransform('-z')\">\r\n <span nz-icon nzType=\"rotate-left\" nzTheme=\"outline\"></span>\r\n <p class=\"m-0\">{{ 'trai' | translate }}</p>\r\n </button>\r\n <button nz-button nzType=\"primary\" nzSize=\"default\" class=\"btn_transform\"\r\n (click)=\"handleSetTransform('z')\">\r\n <span nz-icon nzType=\"rotate-right\" nzTheme=\"outline\"></span>\r\n <p class=\"m-0\">{{ 'phai' | translate }}</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"view\">\r\n <p class=\"discover_text\" (click)=\"openViewAll(style_fields[6])\"\r\n style=\"cursor: pointer; text-align: left; margin: 0\">\r\n {{ 'mo_rong' | translate }} →\r\n </p>\r\n </div>\r\n </li>\r\n <!-- C\u1EA5u h\u00ECnh object-fit -->\r\n <li nz-submenu nzTitle=\"{{'do_bao_phu'| translate}}\" [(nzOpen)]=\"openMap.menu5\" (nzOpenChange)=\"openHandler('menu5')\">\r\n <app-object-fit-config [device]=\"device\" [class]=\"class\" [objectFitClass]=\"class['image__boundary--img']\"\r\n [style_field]=\"style_fields[2]\" (isViewAll)=\"openViewAll($event)\" [objectChoosing]=\"objectChoosing\">\r\n </app-object-fit-config>\r\n </li>\r\n <!-- C\u1EA5u h\u00ECnh h\u00ECnh d\u1EA1ng vi\u1EC1n -->\r\n <li nz-submenu nzTitle=\"{{'kieu_vien'| translate}}\" [(nzOpen)]=\"openMap.menu6\" (nzOpenChange)=\"openHandler('menu6')\">\r\n <app-borders-config [elementChoosing]=\"objectChoosing\" [device]=\"device\" [class]=\"class\" [borderClass]=\"class['image__boundary--img']\"\r\n [id_object]=\"objectChoosing._id\">\r\n </app-borders-config>\r\n <!-- N\u00FAt m\u1EDF r\u1ED9ng -->\r\n\r\n <div class=\"item-border my-3 cursor-pointer\" style=\"float: right\">\r\n <p class=\"m-0 title-border\" (click)=\"openViewAll(style_fields[3])\">\r\n {{ 'mo_rong' | translate }} →\r\n </p>\r\n </div>\r\n </li>\r\n <!-- T\u1EA1o b\u00F3ng -->\r\n <li nz-submenu nzTitle=\"{{'do_bong'| translate}}\" [(nzOpen)]=\"openMap.menu7\" (nzOpenChange)=\"openHandler('menu7')\">\r\n <!-- C\u1EA5u h\u00ECnh b\u00F3ng -->\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row\">\r\n <div class=\"field-row-sub field-row__switch\">\r\n <span> {{'ap_dung' | translate}} </span>\r\n <nz-switch [(ngModel)]=\"config.check_shadow\" (ngModelChange)=\"handleSetShadow()\"></nz-switch>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\">\r\n <p class=\"m-0\">{{'ngang' | translate}}</p>\r\n <nz-input-number [(ngModel)]=\"config['box-shadow'].box_shadow_x\" [nzMin]=\"0\" [nzStep]=\"1\"\r\n [nzDisabled]=\"!config.check_shadow\" (ngModelChange)=\"handleSetShadow()\"></nz-input-number>\r\n </div>\r\n <nz-slider [(ngModel)]=\"config['box-shadow'].box_shadow_x\" (nzOnAfterChange)=\"handleSetShadow()\"\r\n [nzMin]=\"-100\" [nzStep]=\"0.1\"></nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\">\r\n <p class=\"m-0\">{{'doc' | translate}}</p>\r\n <nz-input-number [nzStep]=\"1\" [(ngModel)]=\"config['box-shadow'].box_shadow_y\"\r\n [nzDisabled]=\"!config.check_shadow\" (ngModelChange)=\"handleSetShadow()\"></nz-input-number>\r\n </div>\r\n <nz-slider [(ngModel)]=\"config['box-shadow'].box_shadow_y\" (nzOnAfterChange)=\"handleSetShadow()\"\r\n [nzMin]=\"-100\" [nzStep]=\"0.1\"></nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\">\r\n <p class=\"m-0 title\">{{'kich_thuoc_bong' | translate}}</p>\r\n <nz-input-number [nzStep]=\"1\" [(ngModel)]=\"config['box-shadow'].box_shadow_width\"\r\n [nzDisabled]=\"!config.check_shadow\" (ngModelChange)=\"handleSetShadow()\"></nz-input-number>\r\n </div>\r\n <nz-slider [(ngModel)]=\"config['box-shadow'].box_shadow_width\" (nzOnAfterChange)=\"handleSetShadow()\"\r\n [nzMin]=\"-100\" [nzStep]=\"0.1\"></nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\">\r\n <p class=\"m-0 title\">{{'do_nhoe' | translate}}</p>\r\n <nz-input-number [nzStep]=\"1\" [(ngModel)]=\"config['box-shadow'].box_shadow_blur\"\r\n [nzDisabled]=\"!config.check_shadow\" (ngModelChange)=\"handleSetShadow()\"></nz-input-number>\r\n </div>\r\n <nz-slider [(ngModel)]=\"config['box-shadow'].box_shadow_blur\" (nzOnAfterChange)=\"handleSetShadow()\"\r\n [nzMin]=\"0\" [nzMax]=\"100\" [nzStep]=\"1\"></nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item w-100\">\r\n <p class=\"m-0 w-50\">{{'mau_sac' | translate}}</p>\r\n <input class=\"input-color w-50\" type=\"button\" [cpOKButton]=\"true\" [(colorPicker)]=\"config['box-shadow'].box_shadow_color\"\r\n [style.background]=\"config['box-shadow'].box_shadow_color\" (colorPickerClose)=\"handleSetShadow()\"\r\n [cpWidth]=\"'230px'\" [disabled]=\"!config.check_shadow\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </li>\r\n\r\n <!-- Xem to\u00E0n m\u00E0n h\u00ECnh -->\r\n <li *ngIf=\"(!staticdata?.type_link || staticdata.type_link == 'none')\" nz-submenu nzTitle=\"{{'xem_toan_man_hinh'| translate}}\"\r\n [(nzOpen)]=\"openMap.menu10\" (nzOpenChange)=\"openHandler('menu10')\">\r\n <!-- B\u1EADt t\u1EAFt ch\u1EE9c n\u0103ng c\u1EA5u h\u00ECnh to\u00E0n m\u00E0n h\u00ECnh -->\r\n <div class=\"field-row\" nz-tooltip [nzTooltipTitle]=\"'khi_click_hinh_anh_se_phong_to_ra_toan_man_hinh' | translate\">\r\n <span class=\"mx-2 w-50\">{{'toan_man_hinh' | translate}}</span>\r\n <nz-switch [ngModel]=\"config['image-fullscreen']?.['toggle_fullscreen']\"\r\n (ngModelChange)=\"config['image-fullscreen']['toggle_fullscreen'] = $event;updateConfig()\"\r\n class=\"mx-2\">\r\n </nz-switch>\r\n </div>\r\n\r\n <ng-container *ngIf=\"config['image-fullscreen']?.['toggle_fullscreen']\">\r\n <!-- B\u1EADt t\u1EAFt m\u1EDF preview to\u00E0n m\u00E0n h\u00ECnh \u1EDF design \u0111\u1EC3 c\u1EA5u h\u00ECnh -->\r\n <div class=\"item-border my-3 cursor-pointer\" style=\"float: right\">\r\n <p class=\"m-0 title-border\" (click)=\"handleOpenFullscreenPreview()\">\r\n {{ 'xem_truoc' | translate }} →\r\n </p>\r\n </div>\r\n </ng-container>\r\n </li>\r\n\r\n <!-- Hi\u1EC7u \u1EE9ng -->\r\n <li nz-submenu nzTitle=\"{{'hieu_ung'| translate}}\" [(nzOpen)]=\"openMap.menu8\" (nzOpenChange)=\"openHandler('menu8')\">\r\n <app-choose-animations-config [elementChoosing]=\"objectChoosing\" (openAnimationDetail)=\"openAnimationDetail($event)\"\r\n [id_object]=\"objectChoosing._id\" [device]=\"device\" [class]=\"class\" [config]=\"config\" [staticdata]=\"staticdata\"\r\n [cursorClass]=\"class['image']\" [effect_hover]=\"effect_hover\" [customize]=\"customize\" \r\n [effectFileUsing]=\"'image'\">\r\n </app-choose-animations-config>\r\n </li>\r\n <!-- Th\u00EAm li\u00EAn k\u1EBFt -->\r\n <li nz-submenu nzTitle=\"{{'lien_ket'| translate}}\" [(nzOpen)]=\"openMap.menu9\"\r\n (nzOpenChange)=\"openHandler('menu9')\">\r\n <app-link-page-config\r\n [objectChoosing]=\"objectChoosing\" \r\n [staticdata]=\"staticdata\"\r\n [id_object]=\"objectChoosing._id\"\r\n [dynamic_data]=\"objectChoosing.dynamic_data\"\r\n [hasContact]=\"true\"\r\n [blocks_of_page]=\"blocks_of_page\"\r\n >\r\n </app-link-page-config>\r\n </li>\r\n <!-- V\u0102N B\u1EA2N G\u1EE2I \u00DD -->\r\n <li nz-submenu nzTitle=\"{{'van_ban_goi_y' | translate}}\" [(nzOpen)]=\"openMap.menu12\" (nzOpenChange)=\"openHandler('menu12')\">\r\n <div class=\"editor-field my-0\">\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row my-0\">\r\n <!-- N\u1ED9i dung ch\u1EEF -->\r\n <div class=\"config-font\" style=\"width:100%\">\r\n <mat-form-field style=\"width:100%\">\r\n <mat-label>{{'noi_dung' | translate}}</mat-label>\r\n <textarea style=\"height:80px;background: #edf6fd;\r\n padding:10px 6px;font-size:13px;border-top-left-radius:5px;\r\n border-top-right-radius:5px\" matInput [(ngModel)]=\"config['tooltip']\"\r\n (blur)=\"updateConfig()\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n <!-- M\u00D4 T\u1EA2 N\u1ED8I DUNG C\u1EE6A \u1EA2NH -->\r\n <li nz-submenu nzTitle=\"{{'mo_ta_noi_dung_cua_anh' | translate}}\" [(nzOpen)]=\"openMap.menu14\" (nzOpenChange)=\"openHandler('menu14')\">\r\n <div class=\"editor-field my-0\">\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row my-0\">\r\n <!-- N\u1ED9i dung ch\u1EEF -->\r\n <div class=\"config-font\" style=\"width:100%\">\r\n <mat-form-field style=\"width: 100%\" class=\"aria-label-input\" [matTooltip]=\"'*_giai_thich_aria_label' | translate\">\r\n <mat-label>{{'mo_ta_noi_dung_cua_anh' | translate}}</mat-label>\r\n <textarea matInput\r\n [ngModel]=\"staticdata.accessibility?.['img_alt_' + functionService.selectedLanguageCode]\"\r\n (ngModelChange)=\"staticdata.accessibility['img_alt_' + functionService.selectedLanguageCode] = $event\"\r\n (blur)=\"updateStaticData();\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n\r\n <!-- <div *ngIf=\"loading\" style=\"position: absolute; left:0; top: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.1); display: flex; justify-content: center; align-items: center\">\r\n\r\n </div> -->\r\n </div>\r\n <!-- M\u1EDF r\u1ED9ng -->\r\n <div class=\"view-more\" *ngIf=\"isViewAll\">\r\n <!-- C\u1EA5u h\u00ECnh chi ti\u1EBFt vi\u1EC1n -->\r\n <div class=\"view_more-border\" *ngIf=\"currentViewAll.index == 4\">\r\n <app-borders-radius-config [elementChoosing]=\"objectChoosing\" [device]=\"device\" [class]=\"class\" [borderRadiusClass]=\"class['image__boundary--img']\"\r\n [id_object]=\"objectChoosing._id\">\r\n </app-borders-radius-config>\r\n </div>\r\n\r\n <!-- C\u1EA5u h\u00ECnh chi ti\u1EBFt hi\u1EC7u \u1EE9ng -->\r\n <div class=\"editor_effect-hover\" *ngIf=\"currentViewAll.index == 6\">\r\n <app-animations-config [elementChoosing]=\"objectChoosing\" [device]=\"device\" [staticdata]=\"staticdata\" [id_object]=\"objectChoosing._id\"\r\n [customize]=\"customize\"></app-animations-config>\r\n </div>\r\n <!-- M\u1EDF r\u1ED9ng h\u00ECnh d\u1EA1ng \u1EA3nh-->\r\n <div class=\"editor-field-body p-0 mt-2\" *ngIf=\"currentViewAll.index == 7\">\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row\">\r\n <!-- <div class=\"d-flex justify-content-between mt-2 align-items-start\">\r\n <p class=\"font-weight-bold\">Hi\u1EC3n th\u1ECB tr\u1EE5c \u0111\u1ED1i t\u01B0\u1EE3ng</p>\r\n <nz-switch [(ngModel)]=\"config.image.show_axis\" (ngModelChange)=\"updateConfig()\"></nz-switch>\r\n </div> -->\r\n <p style=\"font-weight: 500; font-size: 16px\">{{'lat_hinh'| translate}}</p>\r\n <div class=\"field-row-sub\">\r\n <div style=\"display: flex; gap: 4px; width: 100%\">\r\n <span nz-button nzType=\"primary\" nzSize=\"default\" (click)=\"handleSetTransform('y')\" class=\"btn_transform\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\"\r\n d=\"M15.97 15.25h-2.72c-5.3 0-9.5-2.15-9.5-4.5s4.2-4.5 9.5-4.5c3.03 0 5.82.7 7.62 1.86a.75.75 0 1 0 .81-1.26c-2.06-1.33-5.13-2.1-8.43-2.1-6.02 0-11 2.55-11 6s4.98 6 11 6h2.8l-2.3 2.3a.75.75 0 1 0 1.07 1.05l2.83-2.82c.68-.69.68-1.8 0-2.48l-2.83-2.83a.75.75 0 0 0-1.06 1.06l2.21 2.22z\">\r\n </path>\r\n </svg>\r\n <p class=\"m-0\">{{'ngang'| translate}}</p>\r\n </span>\r\n <button nz-button nzType=\"primary\" nzSize=\"default\" (click)=\"handleSetTransform('x')\"\r\n class=\"btn_transform\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\"\r\n d=\"M15.25 8.35v2.4c0 5.3-2.15 9.5-4.5 9.5s-4.5-4.2-4.5-9.5c0-3.03.7-5.82 1.86-7.62a.75.75 0 1 0-1.26-.81c-1.33 2.06-2.1 5.13-2.1 8.43 0 6.02 2.55 11 6 11s6-4.98 6-11V8.27l2.3 2.3A.75.75 0 1 0 20.1 9.5l-2.82-2.83a1.75 1.75 0 0 0-2.48 0L11.97 9.5a.75.75 0 1 0 1.06 1.06l2.22-2.22z\">\r\n </path>\r\n </svg>\r\n <p class=\"m-0\">{{'doc'| translate}}</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item mt-2\" style=\"min-height: 32px\">\r\n <p class=\"m-0\">{{'ngang'| translate}}</p>\r\n <nz-input-number\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateY\"\r\n (ngModelChange)=\"SetTransform()\"\r\n (nzBlur)=\"updateClassAndConfig()\"\r\n >\r\n </nz-input-number>\r\n </div>\r\n <nz-slider\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateY\"\r\n (nzOnAfterChange)=\"updateClassAndConfig()\"\r\n (ngModelChange)=\"SetTransform()\"\r\n >\r\n </nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\" style=\"min-height: 32px\">\r\n <p class=\"m-0\">{{'doc'| translate}}</p>\r\n <nz-input-number\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateX\"\r\n (ngModelChange)=\"SetTransform()\"\r\n (nzBlur)=\"updateClassAndConfig()\"\r\n >\r\n </nz-input-number>\r\n </div>\r\n <nz-slider\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateX\"\r\n (nzOnAfterChange)=\"updateClassAndConfig()\"\r\n (ngModelChange)=\"SetTransform()\"\r\n >\r\n </nz-slider>\r\n </div>\r\n </div>\r\n <br />\r\n <!-- Xoay h\u00ECnh \u1EA3nh -->\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row mb-3\">\r\n <div style=\"justify-content: space-between; align-items: center\">\r\n <p class=\"mt-1\" style=\"font-weight: 500; font-size: 16px\">\r\n {{'xoay_hinh'| translate}}\r\n </p>\r\n <div style=\"display: flex; justify-content: space-between; gap: 4px\">\r\n <button class=\"btn_transform\" nz-button nzType=\"primary\" nzSize=\"default\"\r\n (click)=\"handleSetTransform('-z')\">\r\n <span nz-icon nzType=\"rotate-left\" nzTheme=\"outline\"></span>\r\n <p class=\"m-0\">{{'trai'| translate}}</p>\r\n </button>\r\n <button nz-button nzType=\"primary\" nzSize=\"default\" class=\"btn_transform\"\r\n (click)=\"handleSetTransform('z')\">\r\n <span nz-icon nzType=\"rotate-right\" nzTheme=\"outline\"></span>\r\n <p class=\"m-0\">{{'phai'| translate}}</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\" styl=\"min-height: 32px\">\r\n <p class=\"m-0\">{{'xoay'| translate}}</p>\r\n <nz-input-number\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateZ\"\r\n (ngModelChange)=\"SetTransform()\"\r\n (nzBlur)=\"updateClassAndConfig()\"\r\n >\r\n </nz-input-number>\r\n </div>\r\n <nz-slider\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_rotateZ\"\r\n (nzOnAfterChange)=\"updateClassAndConfig()\"\r\n (ngModelChange)=\"SetTransform()\">\r\n </nz-slider>\r\n </div>\r\n </div>\r\n <br />\r\n <!-- C\u1EA5u h\u00ECnh \u0110\u1ED9 nghi\u00EAng -->\r\n <div class=\"editor-field-body\">\r\n <div class=\"field-row mb-3\">\r\n <div class=\"item\">\r\n <p class=\"m-0\" style=\"font-weight: 500; font-size: 16px\">\r\n {{'do_nghieng'| translate}}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\" style=\"min-height: 32px\">\r\n <p class=\"m-0\">{{'ngang'| translate}}</p>\r\n <nz-input-number\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_skewY\"\r\n (ngModelChange)=\"SetTransform()\"\r\n (nzBlur)=\"updateClassAndConfig()\"\r\n >\r\n </nz-input-number>\r\n </div>\r\n <nz-slider\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_skewY\"\r\n (nzOnAfterChange)=\"updateClassAndConfig()\"\r\n (ngModelChange)=\"SetTransform()\"\r\n >\r\n </nz-slider>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"item\" style=\"min-height: 32px\">\r\n <p class=\"m-0\">{{'doc'| translate}}</p>\r\n <nz-input-number\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_skewX\"\r\n (ngModelChange)=\"SetTransform()\"\r\n (nzBlur)=\"updateClassAndConfig()\"\r\n >\r\n </nz-input-number>\r\n </div>\r\n <nz-slider\r\n [nzMin]=\"-360\"\r\n [nzMax]=\"360\"\r\n [(ngModel)]=\"config['transform'].transform_skewX\"\r\n (nzOnAfterChange)=\"updateClassAndConfig()\"\r\n (ngModelChange)=\"SetTransform()\"\r\n >\r\n </nz-slider>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- M\u1EDF r\u1ED9ng c\u1EA5u h\u00ECnh \u0111\u1ED9 bao ph\u1EE7 -->\r\n <div class=\"editor-field-body p-1\" *ngIf=\"currentViewAll.index == 3\">\r\n <div class=\"field-row\">\r\n <div class=\"field-row-sub\">\r\n <p class=\"m-0\" style=\"font-weight: 500; font-size: 16px\">\r\n {{'vi_tri_hinh_anh'| translate}}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"d-flex justify-content-between py-1\">\r\n <p class=\"m-0\">{{'ngang'| translate}}</p>\r\n <nz-input-number [(ngModel)]=\"config.image.object_x\" [nzMin]=\"0\" [nzStep]=\"1\"\r\n (ngModelChange)=\"handleSetPositionImage()\"></nz-input-number>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"d-flex justify-content-between py-1\">\r\n <p class=\"m-0\">{{'doc'| translate}}</p>\r\n <nz-input-number [(ngModel)]=\"config.image.object_y\" [nzMin]=\"0\" [nzStep]=\"1\"\r\n (ngModelChange)=\"handleSetPositionImage()\"></nz-input-number>\r\n </div>\r\n </div>\r\n <div class=\"field-row mt-2\">\r\n <div class=\"field-row-sub\">\r\n <p class=\"m-0\" style=\"font-weight: 500; font-size: 16px\">\r\n {{'phong_thu_hinh_anh'| translate}}\r\n </p>\r\n </div>\r\n </div>\r\n <div class=\"field-row\">\r\n <div class=\"d-flex justify-content-between py-1\">\r\n <p class=\"m-0\">{{'do_co_gian'| translate}}</p>\r\n </div>\r\n <nz-slider [(ngModel)]=\"class['image__boundary--img'].transfrom_scale\" (nzOnAfterChange)=\"scale()\"\r\n (ngModelChange)=\"(class['image__boundary--img'].transfrom_scale)\" [nzMin]=\"0.1\" [nzMax]=\"2\"\r\n [nzStep]=\"0.1\"></nz-slider>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <nz-modal nzTitle=\"{{ 'chuyen_anh_len_server' | translate}}\" [(nzVisible)]=\"isShowConfirmPopup\" [nzContent]=\"modalContent\"\r\n (nzOnCancel)=\"handleCancelConfirm()\" (nzOnOk)=\"handleOkConfirm()\" [nzFooter]=\"modalFooter\">\r\n <ng-template #modalContent>\r\n <p>{{'nen_anh_tai_len' | translate}}</p>\r\n <nz-select style=\"margin-bottom: 15px\" [(ngModel)]=\"objectChoosing.setups.upload_image.compress_type\" (ngModelChange)=\"updateSetups()\"\r\n nzPlaceHolder=\"{{'nen_anh_tai_len' | translate}}\" nzAllowClear>\r\n <nz-option [nzValue]=\"'no-compress'\" nzLabel=\"{{'khong_nen_anh_sau_khi_tai_len' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'compress-screen'\" nzLabel=\"{{'nen_anh_theo_ti_le_man_hinh_hien_thi' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'compress-frame'\" nzLabel=\"{{'nen_anh_theo_ti_le_khung_hien_thi_anh' | translate}}\"></nz-option>\r\n <nz-option [nzValue]=\"'custom'\" nzLabel=\"{{'nen_anh_theo_kich_thuoc_tu_chon' | translate}}\"></nz-option>\r\n </nz-select>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.compress_type == 'custom'\" class=\"mr-4\">\r\n <mat-label>{{'chieu_rong' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_rong' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_width\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_width = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n\r\n <mat-form-field *ngIf=\"objectChoosing.setups.upload_image.compress_type == 'custom'\">\r\n <mat-label>{{'chieu_cao' | translate}}</mat-label>\r\n <input matInput placeholder=\"{{'chieu_cao' | translate}}\" [ngModel]=\"objectChoosing.setups.upload_image.compress_height\"\r\n (ngModelChange)=\"objectChoosing.setups.upload_image.compress_height = $event\" (blur)=\"updateSetups()\">\r\n </mat-form-field>\r\n </ng-template>\r\n <ng-template #modalFooter>\r\n <button nz-button nzType=\"default\" (click)=\"handleCancelConfirm()\">{{'khong' | translate}}</button>\r\n <button nz-button nzType=\"primary\" (click)=\"handleOkConfirm()\" [nzLoading]=\"isConfirmLoading\">{{'dong_y' | translate}}</button>\r\n </ng-template>\r\n </nz-modal>\r\n</div>\r\n", styles: [".image-editor::ng-deep .ant-menu-submenu-title{padding:0!important}.image-editor::ng-deep .ant-menu.ant-menu-root.ant-menu-light.ant-menu-inline{padding:0!important}.image-editor::ng-deep .mat-form-field{width:100%}.image-editor::ng-deep .mat-form-field-underline{bottom:0;position:relative;margin-bottom:.5rem}.image-editor::ng-deep .mat-form-field-wrapper{padding-bottom:0}*{font-size:14px}.ant-radio-input{z-index:0}.title{line-height:1.5}.custom-device{display:flex;justify-content:space-between;align-items:center;padding:7px 0}.custom-textarea{min-height:150px!important}.upload-background-image{width:100%;text-align:center;padding:12px;background-color:var(--ion-color-primary);color:#fff;border-radius:12px}.btn_transform{display:flex;grid-gap:4px;gap:4px;align-items:center;min-width:48%;justify-content:center;background-color:#018848;color:#f5f5f5}.custom{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;padding:5px 0}.input-number{padding:5px!important;border:1px solid #ddd!important;outline:none!important;width:40%!important;border-radius:3px!important}nz-input-number{width:40%;max-height:30px}.view{padding:5px;display:flex;align-items:center;justify-content:flex-end;grid-gap:7px;gap:7px}.item{display:flex;align-items:center;justify-content:space-between}.main{padding:5px;margin-top:10px;line-height:1}.main .item{display:flex;align-items:center;justify-content:space-between;margin-bottom:15px}.main .hidden-text{margin:0;font-size:14px}.main .title-font{font-size:14px}.main nz-select{width:100px!important}.main label{display:flex;align-items:center;margin-bottom:10px;margin-right:0}.main label span.ant-radio+*{padding-right:0!important}::ng-deep span.ant-radio+*{width:100%}.w-mat-input{width:120px;overflow:hidden}.upload-background-image{display:flex;justify-content:center;align-items:center;padding:16px 18px;grid-gap:5px;gap:5px;background-color:var(--ion-color-primary);color:#fff;margin-right:-8px;border-radius:12px}.disable{opacity:.5}.field-row__switch{display:flex;width:100%;justify-content:space-around;padding:10px 0}.image-editor{background-color:#fff;height:100%;overflow:auto;overflow-x:hidden}.image-editor::-webkit-scrollbar{width:0px}.image-editor::-webkit-scrollbar-track{background:white}.image-editor::-webkit-scrollbar-thumb{background:#888}.image-editor::-webkit-scrollbar-thumb:hover{background:#555;opacity:.5}.image-editor .editor-header{height:40px;border-bottom:1px solid #ddd;display:flex;align-items:center;padding:0 5px;text-transform:uppercase;grid-gap:7px;gap:7px}.image-editor .editor-header span{font-size:13px}.image-editor .editor-header i{font-size:16px}.image-editor .editor-header span,.image-editor .editor-header i{cursor:pointer}.image-editor .upload-image{margin-top:5px}.image-editor .upload-image .switch-image .title{line-height:14px;align-items:baseline}.image-editor .upload-image .upload-image-device{width:100%}.image-editor .upload-image .upload-image-device button{width:100%;padding:10px 0;border-radius:2px}.image-editor .upload-image .upload-image-device button:hover{background-color:#fff!important;color:var(--ion-color-vh-green);border:1px solid var(--ion-color-vh-green)}.image-editor .editor-content li .upload-image{padding:5px}.image-editor .editor-content .editor-field{padding:10px 5px}.image-editor .editor-content .editor-field .editor-field-header{display:flex;justify-content:space-between}.image-editor .editor-content .editor-field .editor-field-header p:nth-child(1){font-weight:500;font-size:16px}.image-editor .editor-content .box-shadow .list-box{width:100%}.image-editor .editor-content .box-shadow .list-box .box{flex-basis:calc(33.333% - 6px);min-width:calc(33.333% - 6px);max-width:calc(33.333% - 3px)}.image-editor .editor-content .field-row{margin-bottom:14px}.image-editor .editor-content .field-row .field-row-sub{display:flex;justify-content:space-between;align-items:center}.image-editor .editor-content .field-row .field-row-sub .title{line-height:16px}.image-editor .editor-content .field-row .field-row-sub nz-input-number{width:40%}.image-editor .editor-content .field-row .field-content{display:flex;flex-wrap:wrap;grid-gap:8px;gap:8px;margin-right:-8px}.image-editor .editor-content .field-row .field-content .image-fit,.image-editor .editor-content .field-row .field-content .image-hover{flex-basis:calc(33.333% - 8px);width:calc(33.333% - 8px);flex-shrink:1;border:1px solid #ddd;cursor:pointer;transition:.2s;overflow:hidden}.image-editor .editor-content .field-row .field-content .image-fit:hover,.image-editor .editor-content .field-row .field-content .image-hover:hover{box-shadow:#0000003d 0 3px 8px;transition:.2s}.image-editor .editor-content .field-row .field-content .image-fit p,.image-editor .editor-content .field-row .field-content .image-hover p{height:25%;display:flex;align-items:center;margin:0;justify-content:center}.image-editor .editor-content .field-row .field-content .image-fit img,.image-editor .editor-content .field-row .field-content .image-hover img{width:100%;height:75%}.image-editor .editor-content .field-row .field-content .image-hover{border:none;position:relative}.image-editor .editor-content .field-row .field-content .image-hover:hover{box-shadow:none;transition:.2s}.image-editor .field-content-slide{padding:10px 0}.image-editor .field-content-slide .field-content-inner{display:flex;flex-wrap:wrap;grid-gap:8px;gap:8px;width:auto;margin-right:-8px}.image-editor .field-content-slide .field-content-inner .image-item{flex-basis:calc(33.333% - 8px);min-width:calc(33.333% - 8px);padding:10px;border:1px solid #ddd;cursor:pointer;transition:.2s;border-radius:6px;overflow:hidden}.image-editor .field-content-slide .field-content-inner .image-item:hover{box-shadow:#0000003d 0 3px 8px;transition:.2s}.image-editor .field-content-slide .field-content-inner .image-item p{height:25%;display:flex;align-items:center;margin:0;justify-content:center}.image-editor .field-content-slide .field-content-inner .image-item img{width:100%;height:75%}.image-editor .field-content-slide .field-content-inner .image-hover-item{flex-basis:calc(50% - 8px);min-width:calc(50% - 8px);height:150px;border:1px solid #ddd;cursor:pointer;transition:.2s;border-radius:6px;overflow:hidden}.image-editor .field-content-slide .field-content-inner .image-hover-item p{height:25%;display:flex;align-items:center;margin:0;justify-content:center}.image-editor .field-content-slide .field-content-inner .image-hover-item img{width:40%;height:40%}.layer-index{display:flex;align-items:center;justify-content:space-between}.layer-index .title{margin:0}.hover-content .hover-effects{display:flex}.field-content .field-content-inner{display:flex;flex-wrap:wrap;grid-gap:8px;gap:8px;width:auto;margin-right:-8px}.field-content .field-content-inner .image-item{flex-basis:calc(50% - 8px);min-width:calc(50% - 8px);height:0;border:1px solid #ddd;cursor:pointer;transition:.2s;border-radius:6px;overflow:hidden}.field-content .field-content-inner .image-item p{height:25%;display:flex;align-items:center;margin:0;justify-content:center}.selected{border:2px solid var(--ion-color-vh-green)!important}.checkbox-border span{color:red!important}.disabled{pointer-events:none;opacity:.3!important}[nz-select]{margin:0 8px 10px 0}[nz-menu]{border:none!important}.btn-more:hover{color:var(--ion-color-vh-green)}.hover-zoom-in{transition:.3s}.hover-zoom-in:hover{transition:.3s}.hover-zoom-out{transition:.3s}.hover-zoom-out:hover{transform:scale(.8)!important;transition:.3s}.hover-drop-shadow{transition:.3s}.hover-drop-shadow:hover{box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px!important;transition:.3s}.hover-opacity{transition:.3s opacity!important}.hover-opacity:hover{opacity:.6;transition:.3s opacity!important}.hover-border{transition:.3s border!important}.hover-border:hover{border:2px solid #333!important;transition:.3s border!important}.square{position:relative;width:100%;overflow:hidden}.square .content{position:absolute;width:100%;height:100%;top:0;left:0}.square:after{content:\"\";display:block;padding-bottom:100%!important}.list-box{grid-gap:4px;gap:4px;flex-wrap:wrap;display:flex}.list-box .box{flex-basis:calc(50% - 6px);min-width:calc(50% - 6px);max-width:calc(50% - 3px);margin-bottom:40px;position:relative;width:100%;display:flex;background-color:#ffa64d}.list-box .box .content-icon{margin:auto 0;color:#fff}.list-box .box .btn-setting{margin:auto;color:#fff}.list-box .box .box-item{position:relative;border:2px solid white;display:flex;background-color:#ffa64d}.list-box .box .box-item img{width:100%;height:100%}.list-box .box .box-name{position:absolute;width:100%;height:30px;bottom:-30px;display:flex;align-items:center;justify-content:center}.ant-drawer-body:ng-deep{padding:0!important}.hideLink{visibility:hidden;opacity:0;transition:visibility 0s linear .3s,opacity .3s}.showLink{visibility:visible;opacity:1;transition:visibility 0s linear 0s,opacity .3s}.button-hover{animation:name duration timing-function delay iteration-count direction fill-mode;margin-bottom:32px;padding:10px 5px;display:flex;flex-wrap:wrap;grid-gap:10px;gap:10px}.button-hover .effect-button{position:relative;background-color:#e5e5e5;text-align:center;height:40px;border-radius:5px}.button-hover .effect-button button{overflow:hidden;width:100%;height:100%;background-color:#e5e5e5;border-radius:5px;text-align:center;display:flex;justify-content:center;align-items:center}.button-hover .active{border:2px solid #00a859;border-radius:5px;min-width:55px;min-height:60px}.button-hover .effect_zoom_button{width:100%;height:34px;border:2px solid #e5e5e5;border-radius:5px;transform:scale(1);transition:.24s all ease-in-out}.button-hover .effect_zoom_button:hover{border:2px solid #00a859;border-radius:5px;transform:scale(1.1)}.button-hover .effect_blur_button{width:100%;height:34px;border:2px solid #e5e5e5;border-radius:5px;transition:.24s all ease-in-out}.button-hover .effect_blur_button:hover{opacity:.6;border:2px solid #00a859}.button-hover .effect_change_color_button{width:100%;height:34px;border:2px solid #e5e5e5;border-radius:5px;transition:.24s all ease-in-out}.button-hover .effect_change_color_button:hover{background-color:#00a859;color:#fff}.button-hover .effect_shadow{width:100%;height:34px;border:2px solid #e5e5e5;border-radius:5px;transition:.24s all ease-in-out}.button-hover .effect_shadow:hover{filter:drop-shadow(0 0 .1rem #00a859)}.button-hover .effect_movotion{position:relative;width:100%;height:34px;border:2px solid #e5e5e5;border-radius:5px;z-index:0}.button-hover .effect_movotion:before{content:\"\";background:#00a859;z-index:-1;height:50%;width:0;position:absolute;top:0;left:0;transition:.3s cubic-bezier(.785,.135,.15,.86)}.button-hover .effect_movotion:after{content:\"\";background:#00a859;z-index:-1;height:50%;width:0;position:absolute;bottom:0;right:0;transition:.3s cubic-bezier(.785,.135,.15,.86)}.button-hover .effect_movotion:hover:before{width:100%}.button-hover .effect_movotion:hover:after{width:100%}.button-hover .effect_movotion:hover{color:#fff}.button-hover .selected{border:2px solid #00a859;border-radius:5px}.label-item{width:100%;cursor:pointer}.label-item input{width:30px}.item-border{padding:0 5px;display:flex;align-items:center;justify-content:space-between;margin-top:10px}.widget-button{padding:5px;background:none}.widget-button:hover{background:#c6c6c6}.widget-button.active{background:#c6c6c6}.item-border-size{padding:5px}.item-border-size .row-border{display:flex;align-items:center;justify-content:space-between;margin-top:10px}.color-pick{display:flex;justify-content:space-around;align-items:center}.input-color{border:1px solid #ccc;outline:none;cursor:pointer;width:80px;height:30px;border-radius:5px;caret-color:transparent;padding:12px 0}.item-border-radius{margin-top:10px;padding:5px}.item-border-radius-top-left,.item-border-radius-top-right,.item-border-radius-bottom-left,.item-border-radius-bottom-right{padding:5px}.slide-bar{display:flex;align-items:center;justify-content:space-between}.cursor-pointer{cursor:pointer}.config-name{display:flex;justify-content:space-between;align-items:center;grid-gap:5px;gap:5px;margin:15px 0}.config-name p{margin:0;line-height:1.5;flex:1}.config-name>nz-input-number,.config-name>input,.config-name>nz-select{width:40%}.drop-zone{border:4px dashed #212121;border-radius:8px;padding:10px;text-align:center;background-color:#414141cc;color:#ccc;transition:border-color .3s,background-color .3s;cursor:pointer;position:relative}.drop-zone.dragging{border-color:#66b29d;background-color:#2b4a46}.drop-zone label{cursor:pointer;display:inline-block;margin-bottom:0!important}.drop-zone label mat-icon{font-size:40px;width:40px;height:40px;margin-bottom:5px;color:#fff}.drop-zone label p{font-size:14px;margin:0}.drop-zone label span{color:#00bfff;text-decoration:underline}.drop-zone .preview img{max-width:100%;max-height:200px;border-radius:8px}.drop-zone .button-list{position:absolute;top:5px;right:5px;display:flex;grid-gap:3px;gap:3px}.drop-zone .button-list button{padding:4px;border-radius:100px;background:#00a859;color:#fff}.drop-zone .button-list button mat-icon{display:flex;justify-content:center;align-items:center}.img-info__text{line-height:1.4;margin-bottom:6px}.highlight{color:#00a859;font-weight:500;font-size:16px}.aria-label-input mat-label{display:flex;grid-gap:8px;gap:8px;font-size:16px}.aria-label-input mat-label mat-icon{font-size:16px}::ng-deep .mat-tooltip{font-size:14px!important;text-align:justify!important;white-space:pre-line!important;max-width:300px!important}\n"], components: [{ type: i10.NzSwitchComponent, selector: "nz-switch", inputs: ["nzLoading", "nzDisabled", "nzControl", "nzCheckedChildren", "nzUnCheckedChildren", "nzSize"], exportAs: ["nzSwitch"] }, { type: i5$1.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i6$5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i7$1.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i12$3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { type: i3$1.LinkPageComponent, selector: "app-link-page-config", inputs: ["objectChoosing", "staticdata", "linkStaticdata", "id_object", "blocks_of_page", "dynamic_data", "type_page", "type_contact", "hasContact"] }, { type: i5$5.NzSubMenuComponent, selector: "[nz-submenu]", inputs: ["nzMenuClassName", "nzPaddingLeft", "nzTitle", "nzIcon", "nzOpen", "nzDisabled"], outputs: ["nzOpenChange"], exportAs: ["nzSubmenu"] }, { type: i3$1.HideShowConfigComponent, selector: "app-hide-show-config", inputs: ["device", "isBlock", "elementChoosing"] }, { type: i3$1.BrightnessContrastConfigComponent, selector: "app-brightness-contrast-config", inputs: ["id_object", "device", "class", "config", "staticdata", "filterConfig", "opacityClass", "type", "elementChoosing"] }, { type: i3$1.ObjectFitConfigComponent, selector: "app-object-fit-config", inputs: ["class", "type", "objectFitClass", "style_field", "device", "objectChoosing"], outputs: ["isViewAll"] }, { type: i3$1.BordersConfigComponent, selector: "app-borders-config", inputs: ["elementChoosing", "class", "borderClass", "device", "isBlock", "id_object", "isPage"], outputs: ["isCloseConfig"] }, { type: i6$2.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecisionMode", "nzPlaceHolder", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzAutoFocus", "nzFormatter", "nzPrecision"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { type: i8$1.NzSliderComponent, selector: "nz-slider", inputs: ["nzDisabled", "nzDots", "nzIncluded", "nzRange", "nzVertical", "nzReverse", "nzMarks", "nzMax", "nzMin", "nzStep", "nzTooltipVisible", "nzTooltipPlacement", "nzDefaultValue", "nzTipFormatter"], outputs: ["nzOnAfterChange"], exportAs: ["nzSlider"] }, { type: i3$1.ChooseAnimationsConfigComponent, selector: "app-choose-animations-config", inputs: ["elementChoosing", "type", "id_object", "device", "class", "config", "staticdata", "cursorClass", "cursorClass2", "titleCursor", "effect_hover", "customize", "isBlock", "isParent", "isShowDialogChooseAnimation", "effectFileUsing", "conditionShowSelectEffect"], outputs: ["openAnimationDetail", "openAnimationDetailChild"] }, { type: i3$1.BordersRadiusConfigComponent, selector: "app-borders-radius-config", inputs: ["elementChoosing", "class", "borderRadiusClass", "device", "id_object", "isBlock", "isPage"] }, { type: i3$1.AnimationsConfigComponent, selector: "app-animations-config", inputs: ["staticdata", "elementChoosing", "config", "device", "id_object", "customize", "type", "isPage", "isBlock", "isParent"] }, { type: i4$1.NzModalComponent, selector: "nz-modal", inputs: ["nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzZIndex", "nzWidth", "nzCloseIcon", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel", "nzTitle", "nzFooter", "nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzContent", "nzComponentParams", "nzWrapClassName", "nzClassName", "nzStyle", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { type: i6$1.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { type: i6$1.NzOptionComponent, selector: "nz-option", inputs: ["nzLabel", "nzValue", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }], directives: [{ type: i12$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i12$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i21.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitleContext", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipTitle", "nz-tooltip", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$1.MatLabel, selector: "mat-label" }, { type: i15.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i17.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i5$5.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { type: i18.NzIconDirective, selector: "[nz-icon]", inputs: ["nzRotate", "nzSpin", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i16$2.ColorPickerDirective, selector: "[colorPicker]", inputs: ["cpWidth", "cpHeight", "cpToggle", "cpDisabled", "cpIgnoredElements", "cpFallbackColor", "cpColorMode", "cpCmykEnabled", "cpOutputFormat", "cpAlphaChannel", "cpDisableInput", "cpDialogDisplay", "cpSaveClickOutside", "cpCloseClickOutside", "cpUseRootViewContainer", "cpPosition", "cpPositionOffset", "cpPositionRelativeToArrow", "cpOKButton", "cpOKButtonText", "cpOKButtonClass", "cpCancelButton", "cpCancelButtonText", "cpCancelButtonClass", "cpPresetLabel", "cpPresetColorsClass", "cpMaxPresetColorsLength", "cpPresetEmptyMessage", "cpPresetEmptyMessageClass", "cpAddColorButton", "cpAddColorButtonText", "cpAddColorButtonClass", "cpRemoveColorButtonClass", "colorPicker", "cpPresetColors"], outputs: ["cpInputChange", "cpToggleChange", "cpSliderChange", "cpSliderDragEnd", "cpSliderDragStart", "colorPickerOpen", "colorPickerClose", "colorPickerCancel", "colorPickerSelect", "colorPickerChange", "cpCmykColorChange", "cpPresetColorsChange"], exportAs: ["ngxColorPicker"] }, { type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], pipes: { "translate": i12$2.TranslatePipe } });
|
|
15124
15627
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AtwImageAdminConfig, decorators: [{
|
|
15125
15628
|
type: Component,
|
|
15126
15629
|
args: [{
|
|
@@ -54957,7 +55460,7 @@ class AtwSelectAdmin {
|
|
|
54957
55460
|
}
|
|
54958
55461
|
}
|
|
54959
55462
|
AtwSelectAdmin.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AtwSelectAdmin, deps: [{ token: i1.VhQueryAutoWeb }], target: i0.ɵɵFactoryTarget.Component });
|
|
54960
|
-
AtwSelectAdmin.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AtwSelectAdmin, selector: "atw-select-admin", inputs: { data: "data", type: "type", staticdata: "staticdata" }, ngImport: i0, template: "<div>\r\n <button *ngIf=\"type == 'page'\" class=\"btn-add mb-2\" (click)=\"addData()\">\r\n <span>{{'them_du_lieu_moi' | translate}}</span>\r\n <span class=\"ml-1\" nz-icon nzType=\"plus-circle\" nzTheme=\"outline\"></span>\r\n </button>\r\n <nz-table #editRowTable nzBordered [nzData]=\"staticdata.data_list\" [nzShowPagination]=\"false\"\r\n [nzScroll]=\"{ x: '643px', y: '400px' }\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40%\">{{'nhan' | translate}}</th>\r\n <th nzWidth=\"40%\">{{'gia_tri' | translate}}</th>\r\n <th nzWidth=\"20%\" nzRight>{{'thao_tac' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of editRowTable.data\">\r\n <td><input type=\"text\" nz-input [(ngModel)]=\"data.label\" (blur)=\"updateStaticData()\" /></td>\r\n <td><input type=\"text\" nz-input [(ngModel)]=\"data.value\" (blur)=\"updateStaticData()\" /></td>\r\n <td nzRight>\r\n <span style=\"color: red\" nz-icon nzType=\"delete\" nzTheme=\"outline\" nz-popconfirm\r\n [nzPopconfirmTitle]=\"'xac_nhan_xoa' | translate\" [nzOkText]=\"'dong_y' | translate\"\r\n [nzCancelText]=\"'huy' | translate\" (nzOnConfirm)=\"deleteRow(data._id)\"></span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n</div>", styles: [".btn-add{padding:.7rem 1rem;background-color:var(--ion-color-vh-pink);color:#fff;display:flex;justify-content:center;align-items:center;grid-gap:.5rem;gap:.5rem}\n"], components: [{ type: i7.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange"], exportAs: ["nzTable"] }, { type: i7.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { type: i7.NzTbodyComponent, selector: "tbody" }], directives: [{ type: i12$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i18.NzIconDirective, selector: "[nz-icon]", inputs: ["nzRotate", "nzSpin", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i7.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { type: i7.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { type: i7.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { type: i7.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { type: i12$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "disabled"], exportAs: ["nzInput"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type:
|
|
55463
|
+
AtwSelectAdmin.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AtwSelectAdmin, selector: "atw-select-admin", inputs: { data: "data", type: "type", staticdata: "staticdata" }, ngImport: i0, template: "<div>\r\n <button *ngIf=\"type == 'page'\" class=\"btn-add mb-2\" (click)=\"addData()\">\r\n <span>{{'them_du_lieu_moi' | translate}}</span>\r\n <span class=\"ml-1\" nz-icon nzType=\"plus-circle\" nzTheme=\"outline\"></span>\r\n </button>\r\n <nz-table #editRowTable nzBordered [nzData]=\"staticdata.data_list\" [nzShowPagination]=\"false\"\r\n [nzScroll]=\"{ x: '643px', y: '400px' }\">\r\n <thead>\r\n <tr>\r\n <th nzWidth=\"40%\">{{'nhan' | translate}}</th>\r\n <th nzWidth=\"40%\">{{'gia_tri' | translate}}</th>\r\n <th nzWidth=\"20%\" nzRight>{{'thao_tac' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let data of editRowTable.data\">\r\n <td><input type=\"text\" nz-input [(ngModel)]=\"data.label\" (blur)=\"updateStaticData()\" /></td>\r\n <td><input type=\"text\" nz-input [(ngModel)]=\"data.value\" (blur)=\"updateStaticData()\" /></td>\r\n <td nzRight>\r\n <span style=\"color: red\" nz-icon nzType=\"delete\" nzTheme=\"outline\" nz-popconfirm\r\n [nzPopconfirmTitle]=\"'xac_nhan_xoa' | translate\" [nzOkText]=\"'dong_y' | translate\"\r\n [nzCancelText]=\"'huy' | translate\" (nzOnConfirm)=\"deleteRow(data._id)\"></span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </nz-table>\r\n</div>", styles: [".btn-add{padding:.7rem 1rem;background-color:var(--ion-color-vh-pink);color:#fff;display:flex;justify-content:center;align-items:center;grid-gap:.5rem;gap:.5rem}\n"], components: [{ type: i7.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange"], exportAs: ["nzTable"] }, { type: i7.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { type: i7.NzTbodyComponent, selector: "tbody" }], directives: [{ type: i12$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i18.NzIconDirective, selector: "[nz-icon]", inputs: ["nzRotate", "nzSpin", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { type: i14.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i7.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { type: i7.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { type: i7.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { type: i7.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { type: i12$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "disabled"], exportAs: ["nzInput"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i24.NzPopconfirmDirective, selector: "[nz-popconfirm]", inputs: ["nzPopconfirmTrigger", "nzPopconfirmPlacement", "nzCondition", "nzPopconfirmShowArrow", "nzPopconfirmBackdrop", "nzAutofocus", "nzPopconfirmArrowPointAtCenter", "nzPopconfirmTitle", "nz-popconfirm", "nzPopconfirmOrigin", "nzPopconfirmMouseEnterDelay", "nzPopconfirmMouseLeaveDelay", "nzPopconfirmOverlayClassName", "nzPopconfirmOverlayStyle", "nzPopconfirmVisible", "nzOkText", "nzOkType", "nzOkDanger", "nzCancelText", "nzIcon"], outputs: ["nzPopconfirmVisibleChange", "nzOnCancel", "nzOnConfirm"], exportAs: ["nzPopconfirm"] }], pipes: { "translate": i12$2.TranslatePipe } });
|
|
54961
55464
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AtwSelectAdmin, decorators: [{
|
|
54962
55465
|
type: Component,
|
|
54963
55466
|
args: [{
|