diff --git a/public/csv/identity_users_import_template.xlsx b/public/csv/identity_users_import_template.xlsx new file mode 100644 index 00000000..0c9c8a5d Binary files /dev/null and b/public/csv/identity_users_import_template.xlsx differ diff --git a/src/app/core/constants/menu-router.data.ts b/src/app/core/constants/menu-router.data.ts index c98dbde8..67dd1f6d 100644 --- a/src/app/core/constants/menu-router.data.ts +++ b/src/app/core/constants/menu-router.data.ts @@ -112,189 +112,3 @@ export const sidebarData: SidebarItem[] = [ ], }, ]; - -export const menuItems: SidebarItem[] = [ - { - id: 'home', - path: 'second/example-using-component-slide/app-menu-layout', - label: 'Home', - icon: 'fas fa-home', - isActive: true, - }, - { - id: 'dashboard', - path: '/second/dashboard', - label: 'Dashboard', - icon: 'fas fa-tachometer-alt', - }, - { - id: 'components', - path: '/second/example-using-component-slide', - label: 'Components', - icon: 'fas fa-code', - children: [ - { - id: 'code-editor', - path: '/second/example-using-component-slide/code-editor', - label: 'Code Editor', - icon: 'fas fa-file-code', - }, - { - id: 'input-button', - path: '/second/example-using-component-slide/input-button', - label: 'Input Button', - icon: 'fas fa-keyboard', - }, - { - id: 'dropdown', - path: '/second/example-using-component-slide/dropdown', - label: 'Dropdown', - icon: 'fas fa-chevron-down', - }, - { - id: 'text-editor', - path: '/second/example-using-component-slide/text-editor', - label: 'Text Editor', - icon: 'fas fa-edit', - }, - { - id: 'card-data', - path: '/second/example-using-component-slide/card-data', - label: 'Card Data', - icon: 'fas fa-id-card', - }, - { - id: 'trending', - path: '/second/example-using-component-slide/trending', - label: 'Trending', - icon: 'fas fa-fire', - }, - ], - }, - { - id: 'auth', - path: '/main/auth', - label: 'Authentication', - icon: 'fas fa-user', - children: [ - { - id: 'login', - path: '/main/auth/login', - label: 'Login', - icon: 'fas fa-sign-in-alt', - }, - { - id: 'register', - path: '/main/auth/register', - label: 'Register', - icon: 'fas fa-user-plus', - }, - ], - }, - { - id: 'post', - path: '/main/post', - label: 'Posts', - icon: 'fas fa-file-pen', - }, -]; - -export const navStudentItems: SidebarItem[] = [ - { - id: 'post', - path: '/post-management/post-list', - label: 'Bài viết', - icon: 'fas fa-newspaper', - }, - { - id: 'exercise', - path: 'exercise/exercise-layout/list', - label: 'Bài tập', - icon: 'fas fa-tasks', - }, - { - id: 'resource', - path: '/resource-management/resource-list', - label: 'Kho tài liệu', - icon: 'fas fa-book', - }, - { - id: 'message', - path: '/message', - label: 'Tin nhắn', - icon: 'fas fa-comments', - children: [ - { - id: 'org', - path: '/message/org', - label: 'Cộng đồng', - icon: 'fas fa-users', - }, - { - id: 'private', - path: '/message/private', - label: 'Nội bộ', - icon: 'fas fa-user-friends', - }, - ], - }, - { - id: 'statistics', - path: '/statistics', - label: 'Thống kê', - icon: 'fas fa-chart-bar', - }, - { - id: 'management', - path: 'management/admin', - label: 'Admin quản lý', - icon: 'fas fa-user-shield', - }, - { - id: 'payment', - path: '/service-and-payment/payment', - label: 'Thanh toán', - icon: 'fas fa-credit-card', - }, - { - id: 'organization ', - path: '/organization/list', - label: 'Tổ chức', - icon: 'fa-solid fa-building-user', - }, -]; - -export const sidebarOrganizations: SidebarItem[] = [ - { - id: 'org-post ', - path: '/organization/details/', - label: 'Bài viết nội bộ', - icon: 'fas fa-newspaper', - }, - { - id: 'org-exercise ', - path: '/organization/exercise', - label: 'Bài tập nội bộ', - icon: 'fa-solid fa-book-open', - }, - { - id: 'grade', - path: '/organization/grade/list', - label: 'Danh sách lớp', - icon: 'fa-solid fa-rectangle-list', - children: [ - { - id: 'org', - path: '/message/org', - label: 'Khối 1', - icon: 'fas fa-users', - }, - { - id: 'private', - path: '/message/private', - label: 'Khối 2', - icon: 'fas fa-users', - }, - ], - }, -]; diff --git a/src/app/core/fake-data/comment.data.ts b/src/app/core/fake-data/comment.data.ts deleted file mode 100644 index eb5970ad..00000000 --- a/src/app/core/fake-data/comment.data.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { avatarUrlDefault } from '../constants/value.constant'; -import { ICommentFilmResponse } from '../models/comment.models'; -const avatarDefault = avatarUrlDefault; - -export const mockComments: ICommentFilmResponse[] = [ - { - id: '1', - parentId: null, - content: 'Bộ phim này thật tuyệt vời, cốt truyện rất lôi cuốn!', - isDeactivated: false, - createdAt: '2025-07-07T10:00:00Z', - updatedAt: '2025-07-07T10:00:00Z', - user: { - id: 'u1', - username: 'hoanganh', - email: 'hoanganh@example.com', - role: 'user', - avatarUrl: avatarDefault, - }, - replies: [ - { - id: '1-1', - parentId: '1', - content: 'Đồng ý! Mình cũng rất thích diễn xuất của nhân vật chính.', - isDeactivated: false, - createdAt: '2025-07-07T10:10:00Z', - updatedAt: '2025-07-07T10:10:00Z', - user: { - id: 'u2', - username: 'linhpham', - avatarUrl: avatarDefault, - }, - }, - { - id: '1-2', - parentId: '1', - content: 'Mình nghĩ đoạn kết hơi hụt hẫng nhưng tổng thể vẫn ok.', - isDeactivated: false, - createdAt: '2025-07-07T10:15:00Z', - updatedAt: '2025-07-07T10:15:00Z', - user: { - id: 'u3', - username: 'davidnguyen', - avatarUrl: avatarDefault, - }, - }, - ], - }, - { - id: '2', - parentId: null, - content: 'Cảnh quay đẹp nhưng kết thúc hơi khó hiểu.', - isDeactivated: false, - createdAt: '2025-07-06T14:20:00Z', - updatedAt: '2025-07-06T14:20:00Z', - user: { - id: 'u3', - username: 'davidnguyen', - avatarUrl: avatarDefault, - }, - replies: [ - { - id: '2-1', - parentId: '2', - content: 'Đúng rồi, mình phải xem lại lần 2 mới hiểu hơn.', - isDeactivated: false, - createdAt: '2025-07-06T15:00:00Z', - updatedAt: '2025-07-06T15:00:00Z', - user: { - id: 'u4', - username: 'minhthuy', - avatarUrl: avatarDefault, - }, - }, - ], - }, - { - id: '3', - parentId: null, - content: 'Có ai biết nhạc nền trong phim này tên gì không?', - isDeactivated: false, - createdAt: '2025-07-05T12:30:00Z', - updatedAt: '2025-07-05T12:30:00Z', - user: { - id: 'u4', - username: 'minhthuy', - avatarUrl: avatarDefault, - }, - replies: [ - { - id: '3-1', - parentId: '3', - content: 'Mình nghĩ là bài "Endless Journey" của Yiruma đó!', - isDeactivated: false, - createdAt: '2025-07-05T12:50:00Z', - updatedAt: '2025-07-05T12:50:00Z', - user: { - id: 'u5', - username: 'tranquang', - avatarUrl: avatarDefault, - }, - }, - ], - }, - { - id: '4', - parentId: null, - content: 'Thấy phim hơi dài, có nhiều đoạn thừa.', - isDeactivated: false, - createdAt: '2025-07-05T15:45:00Z', - updatedAt: '2025-07-05T15:45:00Z', - user: { - id: 'u5', - username: 'tranquang', - avatarUrl: avatarDefault, - }, - replies: [ - { - id: '4-1', - parentId: '4', - content: 'Chuẩn luôn! Nếu cắt bớt chắc hay hơn.', - isDeactivated: false, - createdAt: '2025-07-05T16:00:00Z', - updatedAt: '2025-07-05T16:00:00Z', - user: { - id: 'u6', - username: 'kimanh', - avatarUrl: avatarDefault, - }, - }, - ], - }, - { - id: '5', - parentId: null, - content: 'Phim hay nhưng cần phụ đề tiếng Việt chuẩn hơn.', - isDeactivated: false, - createdAt: '2025-07-04T09:10:00Z', - updatedAt: '2025-07-04T09:10:00Z', - user: { - id: 'u6', - username: 'kimanh', - avatarUrl: avatarDefault, - }, - replies: [ - { - id: '5-1', - parentId: '5', - content: 'Chuẩn rồi! Đôi khi mình cũng không hiểu rõ lời thoại.', - isDeactivated: false, - createdAt: '2025-07-04T09:30:00Z', - updatedAt: '2025-07-04T09:30:00Z', - user: { - id: 'u7', - username: 'tuanle', - avatarUrl: avatarDefault, - }, - }, - ], - }, - { - id: '6', - parentId: null, - content: 'Mình xem đi xem lại mà vẫn xúc động như lần đầu.', - isDeactivated: false, - createdAt: '2025-07-03T19:00:00Z', - updatedAt: '2025-07-03T19:00:00Z', - user: { - id: 'u7', - username: 'tuanle', - avatarUrl: avatarDefault, - }, - replies: [], - }, - { - id: '7', - parentId: null, - content: 'Hiệu ứng hình ảnh đỉnh cao, rất đáng xem!', - isDeactivated: false, - createdAt: '2025-07-03T21:15:00Z', - updatedAt: '2025-07-03T21:15:00Z', - user: { - id: 'u8', - username: 'ngocmai', - avatarUrl: avatarDefault, - }, - replies: [ - { - id: '7-1', - parentId: '7', - content: 'Mình mê luôn hiệu ứng ở cảnh cuối cùng!', - isDeactivated: false, - createdAt: '2025-07-03T21:30:00Z', - updatedAt: '2025-07-03T21:30:00Z', - user: { - id: 'u9', - username: 'longvu', - avatarUrl: avatarDefault, - }, - }, - ], - }, - { - id: '8', - parentId: null, - content: 'Âm thanh và nhạc phim thực sự tuyệt vời!', - isDeactivated: false, - createdAt: '2025-07-02T16:30:00Z', - updatedAt: '2025-07-02T16:30:00Z', - user: { - id: 'u9', - username: 'longvu', - avatarUrl: avatarDefault, - }, - replies: [], - }, - { - id: '9', - parentId: null, - content: 'Có phần hơi bạo lực nhưng tổng thể vẫn ổn.', - isDeactivated: false, - createdAt: '2025-07-02T17:00:00Z', - updatedAt: '2025-07-02T17:00:00Z', - user: { - id: 'u10', - username: 'quynhhoa', - avatarUrl: avatarDefault, - }, - replies: [ - { - id: '9-1', - parentId: '9', - content: 'Ừ, có vài cảnh mình phải tua qua luôn.', - isDeactivated: false, - createdAt: '2025-07-02T17:10:00Z', - updatedAt: '2025-07-02T17:10:00Z', - user: { - id: 'u11', - username: 'hoainam', - avatarUrl: avatarDefault, - }, - }, - ], - }, - { - id: '10', - parentId: null, - content: 'Ai đã xem phần 2 chưa? Có hay bằng phần 1 không?', - isDeactivated: false, - createdAt: '2025-07-01T08:20:00Z', - updatedAt: '2025-07-01T08:20:00Z', - user: { - id: 'u11', - username: 'hoainam', - avatarUrl: avatarDefault, - }, - replies: [ - { - id: '10-1', - parentId: '10', - content: 'Phần 2 mình thấy ổn nhưng hơi thiếu cảm xúc so với phần 1.', - isDeactivated: false, - createdAt: '2025-07-01T08:40:00Z', - updatedAt: '2025-07-01T08:40:00Z', - user: { - id: 'u1', - username: 'hoanganh', - avatarUrl: avatarDefault, - }, - }, - ], - }, -]; diff --git a/src/app/core/models/organization.model.ts b/src/app/core/models/organization.model.ts index d1090366..3489c44b 100644 --- a/src/app/core/models/organization.model.ts +++ b/src/app/core/models/organization.model.ts @@ -99,3 +99,11 @@ export type AddUsersOrgRequest = { defaultRole: string; active: boolean; }; + +//response excel +export type ImportMemberResponse = { + total: number; + created: number; + skipped: number; + errors: string[]; +}; diff --git a/src/app/core/services/api-service/organization.service.ts b/src/app/core/services/api-service/organization.service.ts index 81bfd30d..339c5ddd 100644 --- a/src/app/core/services/api-service/organization.service.ts +++ b/src/app/core/services/api-service/organization.service.ts @@ -8,6 +8,7 @@ import { CreateOrgRequest, EditOrgRequest, FilterOrgs, + ImportMemberResponse, OrganizationInfo, OrganizationResponse, ParamGetAllBlockOfOrg, @@ -116,4 +117,11 @@ export class OrganizationService { API_CONFIG.ENDPOINTS.DELETE.REMOVE_MEMBER_FROM_BLOCK(blockId, memberId) ); } + + importMemberExcel(file: File) { + return this.api.uploadFile>( + API_CONFIG.ENDPOINTS.POST.IMPORT_EXCEL_ADD_MEMBER, + file + ); + } } diff --git a/src/app/core/services/config-service/api.enpoints.ts b/src/app/core/services/config-service/api.enpoints.ts index e606939b..a9c1a40f 100644 --- a/src/app/core/services/config-service/api.enpoints.ts +++ b/src/app/core/services/config-service/api.enpoints.ts @@ -270,6 +270,7 @@ export const API_CONFIG = { BULK_ADD_TO_ORG: (orgId: string) => `/org/${orgId}/members:bulk`, BULK_ADD_TO_BLOCK: (blockId: string) => `/org/block/${blockId}/members:bulk`, + IMPORT_EXCEL_ADD_MEMBER: '/identity/users/import', }, PUT: { EDIT_FILE: (id: string) => `/file/api/FileDocument/edit/${id}`, diff --git a/src/app/core/services/grpc/Playground.proto b/src/app/core/services/grpc/Playground.proto deleted file mode 100644 index e1cfc7e2..00000000 --- a/src/app/core/services/grpc/Playground.proto +++ /dev/null @@ -1,50 +0,0 @@ -syntax = "proto3"; - -package coding.playground; -option java_multiple_files = true; -option java_package = "com.codecampus.coding.grpc.playground"; -option java_outer_classname = "PlaygroundProto"; - -import "google/protobuf/timestamp.proto"; -import "google/protobuf/empty.proto"; - - -message RunRequest { - string language = 1; // "python" | "cpp" | "java" - string source_code = 2; - string stdin = 3; // optional - int32 memory_mb = 4; // default 256 - float cpus = 5; // default 0.5 - int32 time_limit_sec = 6; // default 5 -} - -message RunUpdate { - enum Phase { - PHASE_UNSPECIFIED = 0; - STARTED = 1; - COMPILING = 2; - COMPILE_OUT = 3; - COMPILE_ERR = 4; - RUNNING = 5; - STDOUT = 6; - STDERR = 7; - FINISHED = 8; - ERROR = 9; - } - - Phase phase = 1; - string chunk = 2; // 1 dòng/1 mẩu log/1 block stdout - int32 exit_code = 3; // set khi FINISHED/ERROR - int32 runtime_ms = 4; // set khi FINISHED - int32 memory_kb = 5; // optional, nếu đo được - google.protobuf.Timestamp ts = 6; -} - - -service PlaygroundService { - // Server-streaming: gửi log/STDOUT theo thời gian thực - rpc Run (RunRequest) returns (stream RunUpdate); - - // (Tuỳ chọn) Hủy job nếu client không kịp cancel stream - rpc Cancel (google.protobuf.Empty) returns (google.protobuf.Empty); -} \ No newline at end of file diff --git a/src/app/features/organization/organization-component/details-organization/details-organization.component.html b/src/app/features/organization/organization-component/details-organization/details-organization.component.html index bb3821c9..480d272f 100644 --- a/src/app/features/organization/organization-component/details-organization/details-organization.component.html +++ b/src/app/features/organization/organization-component/details-organization/details-organization.component.html @@ -1,19 +1,6 @@
- -
-
- -
-
-
-
-
-
- -
-
- + {{ m.role }}
+
+ +
Đang tải...
diff --git a/src/app/features/organization/pages/block-details/block-details.component.scss b/src/app/features/organization/pages/block-details/block-details.component.scss index d8d61eb1..6deb77d8 100644 --- a/src/app/features/organization/pages/block-details/block-details.component.scss +++ b/src/app/features/organization/pages/block-details/block-details.component.scss @@ -156,6 +156,28 @@ gap: 5px; } +/* Nút xóa */ +.member-actions { + display: flex; + align-items: center; +} + +.btn-remove { + background: none; + border: none; + font-size: 1rem; + color: var(--text-muted-color); + cursor: pointer; + padding: 8px; + border-radius: 5px; + transition: color 0.2s ease, background 0.2s ease; + + &:hover { + color: #fff; + background: #ef4444; /* Màu đỏ nổi bật khi di chuột */ + } +} + .role-badge .fa-crown { color: gold; } diff --git a/src/app/features/organization/pages/block-details/block-details.component.ts b/src/app/features/organization/pages/block-details/block-details.component.ts index b3553c86..58b37b18 100644 --- a/src/app/features/organization/pages/block-details/block-details.component.ts +++ b/src/app/features/organization/pages/block-details/block-details.component.ts @@ -9,6 +9,8 @@ import { } from '../../../../core/models/organization.model'; import { ModalAddUserToBlockComponent } from '../../organization-component/modal-add-user-to-block/modal-add-user-to-block.component'; import { avatarUrlDefault } from '../../../../core/constants/value.constant'; +import { openModalNotification } from '../../../../shared/utils/notification'; +import { Store } from '@ngrx/store'; @Component({ selector: 'app-block-details', @@ -31,7 +33,8 @@ export class BlockDetailsComponent implements OnInit { constructor( private route: ActivatedRoute, - private orgService: OrganizationService + private orgService: OrganizationService, + private store: Store ) { this.route.paramMap.subscribe((params) => { this.blockId = params.get('blockId') || ''; @@ -84,6 +87,17 @@ export class BlockDetailsComponent implements OnInit { } } + openModalConfirmDelete(memberId: string) { + openModalNotification( + this.store, + 'Xác nhận xóa', + 'Bạn có chắc chắn xóa thành viên này?', + 'Đồng ý', + 'Hủy', + () => this.removeMember(memberId) + ); + } + removeMember(memberId: string) { this.orgService.removeMemberFromBlock(this.blockId, memberId).subscribe({ next: () => { diff --git a/src/app/features/organization/pages/organization-management/organization-management.component.html b/src/app/features/organization/pages/organization-management/organization-management.component.html index d46f639e..1408ef05 100644 --- a/src/app/features/organization/pages/organization-management/organization-management.component.html +++ b/src/app/features/organization/pages/organization-management/organization-management.component.html @@ -9,7 +9,23 @@

Quản lý Tổ chức

placeholder="Tìm kiếm theo tên, email..." />
- + + + + + diff --git a/src/app/features/organization/pages/organization-management/organization-management.component.scss b/src/app/features/organization/pages/organization-management/organization-management.component.scss index 3b034912..0e028f03 100644 --- a/src/app/features/organization/pages/organization-management/organization-management.component.scss +++ b/src/app/features/organization/pages/organization-management/organization-management.component.scss @@ -29,6 +29,13 @@ display: flex; gap: 1rem; align-items: center; + .btn { + white-space: nowrap; + p { + margin: 0; + font-size: 12px; + } + } } } // Search Bar @@ -55,10 +62,10 @@ cursor: pointer; transition: all 0.3s ease; &.primary { - background: #007bff; - color: #fff; + background: var(--button-color); + color: var(--reverse-color-text); &:hover { - background: #0056b3; + background: oklch(from var(--button-color) calc(l * 0.8) c h); } } &.danger { @@ -68,6 +75,9 @@ background: #a71d2a; } } + &.other { + padding: 8px; + } } .org-list { @@ -98,7 +108,7 @@ } .org-card { - background: #fff; + background: var(--surface-color); border-radius: 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); display: flex; @@ -110,8 +120,8 @@ min-width: 400px; &:hover { - transform: translateY(-5px); - box-shadow: 0 8px 20px rgba(0, 0, 0, 0.12); + transform: translateY(-1px); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.12); } .card-header { diff --git a/src/app/features/organization/pages/organization-management/organization-management.component.ts b/src/app/features/organization/pages/organization-management/organization-management.component.ts index b4ad9b40..7ce9775f 100644 --- a/src/app/features/organization/pages/organization-management/organization-management.component.ts +++ b/src/app/features/organization/pages/organization-management/organization-management.component.ts @@ -13,7 +13,8 @@ import { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs'; import { OrganizationService } from '../../../../core/services/api-service/organization.service'; import { CreateOrgRequest, - FilterOrgs, // Import model FilterOrgs + FilterOrgs, + ImportMemberResponse, // Import model FilterOrgs OrganizationResponse, } from '../../../../core/models/organization.model'; import { PaginationComponent } from '../../../../shared/components/fxdonad-shared/pagination/pagination.component'; @@ -21,6 +22,8 @@ import { lottieOptions2 } from '../../../../core/constants/value.constant'; import { LottieComponent } from 'ngx-lottie'; import { OrganizationCreateModalComponent } from '../../organization-component/organization-create-modal/organization-create-modal.component'; import { Router } from '@angular/router'; +import { sendNotification } from '../../../../shared/utils/notification'; +import { Store } from '@ngrx/store'; @Component({ selector: 'app-organization-management', @@ -55,11 +58,13 @@ export class OrganizationManagementComponent implements OnInit, OnDestroy { private destroy$ = new Subject(); createForm!: FormGroup; + importResult: ImportMemberResponse | null = null; constructor( private orgService: OrganizationService, private fb: FormBuilder, - private router: Router + private router: Router, + private store: Store ) {} ngOnInit() { @@ -130,7 +135,40 @@ export class OrganizationManagementComponent implements OnInit, OnDestroy { this.loadOrgs(); } - // --- Các hàm modal giữ nguyên --- + // Nút tải file mẫu + downloadTemplate() { + const link = document.createElement('a'); + link.href = '/csv/identity_users_import_template.xlsx'; + link.download = 'identity_users_import_template.xlsx'; + link.click(); + } + + // Khi chọn file import + onImportExcel(event: Event) { + const file = (event.target as HTMLInputElement).files?.[0]; + if (!file) return; + + this.orgService.importMemberExcel(file).subscribe({ + next: (res) => { + this.importResult = res.result; + sendNotification( + this.store, + 'Import thành công', + `Import hoàn tất:\nTổng: ${res.result.total}\nTạo mới: ${res.result.created}\nBỏ qua: ${res.result.skipped}\nLỗi: ${res.result.errors.length}`, + 'success' + ); + }, + error: (err) => { + alert('Import thất bại!'); + console.error(err); + }, + }); + + // Reset input để chọn lại cùng 1 file lần sau + (event.target as HTMLInputElement).value = ''; + } + + // --- Các hàm modal --- openCreateModal() { this.showCreateModal = true; } diff --git a/src/app/layouts/layout-pages/admin-layout/admin-layout.ts b/src/app/layouts/layout-pages/admin-layout/admin-layout.ts index 60aaf4ec..3d9a244a 100644 --- a/src/app/layouts/layout-pages/admin-layout/admin-layout.ts +++ b/src/app/layouts/layout-pages/admin-layout/admin-layout.ts @@ -2,12 +2,7 @@ import { Component, OnInit, SimpleChanges } from '@angular/core'; import { Router, NavigationEnd, RouterOutlet } from '@angular/router'; import { filter } from 'rxjs/operators'; import { HeaderComponent } from '../../../shared/components/my-shared/header/header'; -import { FooterComponent } from '../../../shared/components/my-shared/footer/footer'; import { MenuLayoutComponent } from '../../layout-components/menu/menu-layout.component'; -import { - menuItems, - navStudentItems, -} from '../../../core/constants/menu-router.data'; import { CommonModule, NgIf } from '@angular/common'; import { MainSidebarComponent } from '../../../shared/components/fxdonad-shared/main-sidebar/main-sidebar.component'; import { sidebarData } from '../../../features/admin/menu-router.data'; diff --git a/src/app/shared/components/fxdonad-shared/comment/comment.component.ts b/src/app/shared/components/fxdonad-shared/comment/comment.component.ts index 676d7c20..7eb0f876 100644 --- a/src/app/shared/components/fxdonad-shared/comment/comment.component.ts +++ b/src/app/shared/components/fxdonad-shared/comment/comment.component.ts @@ -13,12 +13,11 @@ import { Output, SimpleChanges, } from '@angular/core'; -import { buildImageUrl } from '../../../utils/BuildUrlFile'; + import { CommentResponse, ICommentFilmResponse, } from '../../../../core/models/comment.models'; -import { mockComments } from '../../../../core/fake-data/comment.data'; import { avatarUrlDefault } from '../../../../core/constants/value.constant'; import { decodeJWT } from '../../../utils/stringProcess'; import { checkAuthenticated } from '../../../utils/userInfo';