\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Reset' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\n\r\n@Component({\r\n selector: 'app-auto-number',\r\n templateUrl: './auto-number.component.html',\r\n styleUrls: ['./auto-number.component.css']\r\n})\r\nexport class AutoNumberComponent implements OnInit, OnDestroy {\r\n\r\n user: any;\r\n loading = false;\r\n autoNumbers = [];\r\n autoNumberSelectableSettings: SelectableSettings;\r\n autoNumberSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public autoNumberFocus = {\r\n Name: true\r\n };\r\n autoNumberSortByField: SortDescriptor[] = [];\r\n\r\n public autoNumberState: State = {\r\n // skip: 0,\r\n // take: 5,{ field: 'ProductName', operator: 'contains', value: 'Chef' }\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n autoNumberGridDataResult: GridDataResult;\r\n\r\n autoNumberSkip = 0;\r\n autoNumberPageSize = 50;\r\n autoNumberSelection: number[] = [];\r\n autoNumberItem: any;\r\n myInterval: any;\r\n autoNumberNames: Array<{ Name: string, ID: number }>;\r\n autoNumberNamesFilter: Array<{ Name: string, ID: number }>;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public autoNumberOpened = false;\r\n isEnabledSaveAll = false;\r\n data: any;\r\n control: any;\r\n controlDefault = true;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n }\r\n\r\n handleFilter(value) {\r\n this.autoNumberNamesFilter = this.autoNumberNames.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.autoNumberSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'multiple'\r\n };\r\n }\r\n\r\n async getAutoNumbers() {\r\n this.loading = true;\r\n const result = await this.appService.doGET('api/AutoNumber', null);\r\n if (result) {\r\n this.autoNumbers = result.Data;\r\n this.bindAutoNumbers();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.autoNumberSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.autoNumbers.find((item) => {\r\n return item.ID === this.autoNumberSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.autoNumberSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.autoNumberItem = {\r\n IsAdd: true,\r\n ID: '',\r\n FormatString: '',\r\n Step: 0,\r\n CurNumber: 0,\r\n Reset: false,\r\n };\r\n this.autoNumberFocus.Name = true;\r\n }\r\n\r\n onAutoNumberPageChange(event: PageChangeEvent) {\r\n this.autoNumberSkip = event.skip;\r\n this.bindAutoNumbers();\r\n }\r\n\r\n onAutoNumberSelectedKeysChange() {\r\n }\r\n\r\n bindAutoNumbers() {\r\n this.autoNumberGridDataResult = {\r\n data: orderBy(this.autoNumbers, this.autoNumberSortByField),\r\n total: this.autoNumbers.length\r\n };\r\n this.autoNumberGridDataResult = process(this.autoNumbers, this.autoNumberState);\r\n }\r\n\r\n onAutoNumberSortChange(sort: SortDescriptor[]): void {\r\n this.autoNumberSortByField = sort;\r\n this.bindAutoNumbers();\r\n }\r\n\r\n public onAutoNumberDataStateChange(state: DataStateChangeEvent): void {\r\n this.autoNumberSelection = [];\r\n this.autoNumberState = state;\r\n this.autoNumberGridDataResult = process(this.autoNumbers, this.autoNumberState);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array
;\r\n\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n // tslint:disable-next-line:prefer-const\r\n for (let i = 1; i < fileData.length; i++) {\r\n this.autoNumbers.push({\r\n ID: fileData[i][0],\r\n FormatString: fileData[i][1],\r\n Step: fileData[i][2],\r\n CurNumber: fileData[i][3],\r\n Reset : fileData[i][4],\r\n });\r\n }\r\n this.bindAutoNumbers();\r\n this.isEnabledSaveAll = true;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n this.onReload();\r\n });\r\n }\r\n\r\n async initDisplay() {\r\n const resultAutoNumber = await this.appService.doGET('api/Enum/GetEAutoNumberName', null);\r\n if (resultAutoNumber) {\r\n this.autoNumberNames = resultAutoNumber.Data;\r\n this.autoNumberNamesFilter = this.autoNumberNames.slice();\r\n }\r\n }\r\n onReload() {\r\n this.getAutoNumbers();\r\n }\r\n\r\n onClearAutoNumber() {\r\n this.setDefault();\r\n }\r\n\r\n onAddNewAutoNumber() {\r\n this.autoNumberOpened = true;\r\n this.setDefault();\r\n }\r\n\r\n onSaveAutoNumber() {\r\n if (this.autoNumberItem.IsAdd) { this.addAutoNumber(); } else { this.updateAutoNumber(); }\r\n }\r\n\r\n async onSaveAutoNumbers() {\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.autoNumbers.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.autoNumbers[i]));\r\n }\r\n const result = await this.appService.doPOST('api/AutoNumber/SaveAll', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.autoNumberItem;\r\n return {\r\n ID: temp.ID,\r\n FormatString: temp.FormatString,\r\n Step: temp.Step,\r\n CurNumber: temp.CurNumber,\r\n Reset: temp.Reset\r\n };\r\n }\r\n\r\n onCloseAutoNumber(status) {\r\n this.autoNumberOpened = false;\r\n }\r\n onCloseUser(status) {\r\n this.autoNumberOpened = false;\r\n this.autoNumberNamesFilter = this.autoNumberNames.slice();\r\n }\r\n\r\n onEditAutoNumber() {\r\n if (this.autoNumberSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.autoNumberSelection.length > 1) {\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.autoNumberSelection[0];\r\n const selectedItem = this.autoNumbers.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n\r\n if (selectedItem) {\r\n selectedItem.IsAdd = false;\r\n this.autoNumberItem = selectedItem;\r\n this.autoNumberOpened = true;\r\n }\r\n }\r\n }\r\n\r\n async addAutoNumber() {\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/AutoNumber', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewAutoNumber();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n async updateAutoNumber() {\r\n const id = this.autoNumberItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPUT('api/AutoNumber', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n async onDeleteAutoNumber() {\r\n if (this.autoNumberSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n const dataRequest = {\r\n IDSs: this.autoNumberSelection,\r\n DeleteBy: this.user.UserName\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/AutoNumber/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.autoNumberSelection = [];\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n }\r\n}\r\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2FkL2NtdC11c2VyL2NtdC11c2VyLmNvbXBvbmVudC5jc3MifQ== */\"","module.exports = \" \"","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-cmt-user',\r\n templateUrl: './cmt-user.component.html',\r\n styleUrls: ['./cmt-user.component.css']\r\n})\r\nexport class CmtUserComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2FkL2NvbmZpZy9jb25maWcuY29tcG9uZW50LmNzcyJ9 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\n\r\n@Component({\r\n selector: 'app-config',\r\n templateUrl: './config.component.html',\r\n styleUrls: ['./config.component.css']\r\n})\r\nexport class ConfigComponent implements OnInit, OnDestroy {\r\n\r\n user: any;\r\n loading = false;\r\n configs = [];\r\n configSelectableSettings: SelectableSettings;\r\n configSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public configFocus = {\r\n Name: true\r\n };\r\n configSortByField: SortDescriptor[] = [{\r\n field: 'Name',\r\n dir: 'asc'\r\n }];\r\n\r\n public configState: State = {\r\n // skip: 0,\r\n // take: 5,{ field: 'ProductName', operator: 'contains', value: 'Chef' }\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n configGridDataResult: GridDataResult;\r\n\r\n configSkip = 0;\r\n configPageSize = 50;\r\n configSelection: number[] = [];\r\n configItem: any;\r\n myInterval: any;\r\n configNames: Array<{ Name: string, ID: number }>;\r\n configNamesFilter: Array<{ Name: string, ID: number }>;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public configOpened = false;\r\n isEnabledSaveAll = false;\r\n data: any;\r\n control: any;\r\n controlDefault = true;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n }\r\n\r\n handleFilter(value) {\r\n this.configNamesFilter = this.configNames.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.configSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'multiple'\r\n };\r\n }\r\n\r\n async getConfigs() {\r\n this.loading = true;\r\n const result = await this.appService.doGET('api/Config', null);\r\n if (result) {\r\n this.configs = result.Data;\r\n this.bindConfigs();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.configSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.configs.find((item) => {\r\n return item.ID === this.configSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.configSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.configItem = {\r\n IsAdd: true,\r\n ID: '',\r\n Name: '',\r\n Description: '',\r\n };\r\n this.configFocus.Name = true;\r\n }\r\n\r\n onConfigPageChange(event: PageChangeEvent) {\r\n this.configSkip = event.skip;\r\n this.bindConfigs();\r\n }\r\n\r\n onConfigSelectedKeysChange() {\r\n }\r\n\r\n bindConfigs() {\r\n this.configGridDataResult = {\r\n data: orderBy(this.configs, this.configSortByField),\r\n total: this.configs.length\r\n };\r\n }\r\n\r\n onConfigSortChange(sort: SortDescriptor[]): void {\r\n this.configSortByField = sort;\r\n this.bindConfigs();\r\n }\r\n\r\n public onConfigDataStateChange(state: DataStateChangeEvent): void {\r\n this.configState = state;\r\n this.configGridDataResult = process(this.configs, this.configState);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array
;\r\n\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n\r\n // tslint:disable-next-line:prefer-const\r\n for (let i = 1; i < fileData.length; i++) {\r\n this.configs.push({\r\n ID: fileData[i][0],\r\n Name: fileData[i][1],\r\n Description: fileData[i][2],\r\n });\r\n }\r\n this.bindConfigs();\r\n this.isEnabledSaveAll = true;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n this.onReload();\r\n });\r\n }\r\n\r\n async initDisplay() {\r\n const resultConfig = await this.appService.doGET('api/Enum/GetEConfig', null);\r\n if (resultConfig) {\r\n this.configNames = resultConfig.Data;\r\n this.configNamesFilter = this.configNames.slice();\r\n }\r\n }\r\n onReload() {\r\n this.getConfigs();\r\n }\r\n\r\n onClearConfig() {\r\n this.setDefault();\r\n }\r\n\r\n onAddNewConfig() {\r\n this.configOpened = true;\r\n this.setDefault();\r\n }\r\n\r\n onSaveConfig() {\r\n if (this.configItem.IsAdd) { this.addConfig(); } else { this.updateConfig(); }\r\n }\r\n\r\n async onSaveConfigs() {\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.configs.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.configs[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Config/SaveAll', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.configItem;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n Description: temp.Description,\r\n };\r\n }\r\n\r\n onCloseConfig(status) {\r\n this.configOpened = false;\r\n }\r\n onCloseUser(status) {\r\n this.configOpened = false;\r\n this.configNamesFilter = this.configNames.slice();\r\n }\r\n\r\n onEditConfig() {\r\n if (this.configSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.configSelection.length > 1) {\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.configSelection[0];\r\n const selectedItem = this.configs.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n\r\n if (selectedItem) {\r\n selectedItem.IsAdd = false;\r\n this.configItem = selectedItem;\r\n this.configOpened = true;\r\n }\r\n }\r\n }\r\n\r\n async addConfig() {\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Config', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewConfig();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n async updateConfig() {\r\n const id = this.configItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPUT('api/Config', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n async onDeleteConfig() {\r\n if (this.configSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n const dataRequest = {\r\n IDSs: this.configSelection,\r\n DeleteBy: this.user.UserName\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Config/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.configSelection = [];\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n }\r\n}\r\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2FkL2NvbnRyb2wvY29udHJvbC5jb21wb25lbnQuY3NzIn0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\n\r\n@Component({\r\n selector: 'app-control',\r\n templateUrl: './control.component.html',\r\n styleUrls: ['./control.component.css']\r\n})\r\nexport class ControlComponent implements OnInit, OnDestroy {\r\n\r\n user: any;\r\n loading = false;\r\n dataControls = [];\r\n dataControlSelectableSettings: SelectableSettings;\r\n dataControlSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataControlFocus = {\r\n Name: true\r\n };\r\n dataControlSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //Config: Constant for paging\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataControlSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataControlPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataControlSelection: number[] = [];\r\n dataControlItem: any;\r\n myInterval: any;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataControlState: State = {\r\n skip: this.dataControlSkip,\r\n take: this.dataControlSkip + this.dataControlPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n dataControlGridDataResult: GridDataResult;\r\n\r\n roles: Array<{ Name: string, ID: string }>;\r\n rolesFilter: Array<{ Name: string, ID: string }>;\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n }\r\n\r\n rolesHandleFilter(value) {\r\n this.rolesFilter = this.roles.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataControlSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getControls() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/Control/Search', dataRequest);\r\n if (result) {\r\n this.dataControls = result.Data;\r\n this.bindControls();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataControlSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataControls.find((item) => {\r\n return item.ID === this.dataControlSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataControlSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataControlItem = {\r\n IsAdd: true,\r\n ID: '',\r\n Name: '',\r\n };\r\n }\r\n\r\n onControlPageChange(event: PageChangeEvent) {\r\n this.dataControlSkip = event.skip;\r\n this.bindControls();\r\n }\r\n\r\n onControlSelectedKeysChange() {\r\n\r\n if (this.dataControlSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataControlSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataControlSelection[0];\r\n const selectedItem = this.dataControls.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataControlItem = selectedItem;\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindControls() {\r\n this.dataControlGridDataResult = {\r\n data: orderBy(this.dataControls, this.dataControlSortByField),\r\n total: this.dataControls.length\r\n };\r\n\r\n this.dataControlGridDataResult = process(this.dataControls, this.dataControlState);\r\n }\r\n\r\n onControlSortChange(sort: SortDescriptor[]): void {\r\n this.dataControlSortByField = sort;\r\n this.bindControls();\r\n }\r\n\r\n public onControlDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataControlSelection = [];\r\n this.dataControlState = state;\r\n this.dataControlGridDataResult = process(this.dataControls, this.dataControlState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n 'ID',\r\n 'Name',\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n\r\n let role: any;\r\n this.dataControls = [];\r\n for (let i = 1; i < fileData.length; i++) {\r\n role = this.roles.find(item => {\r\n return this.appUtils.compareString(fileData[i][this.getColumnIndex('RoleID')], item.Name, item.ID);\r\n });\r\n\r\n if (fileData[i].indexOf(fileData[i][this.getColumnIndex('RoleName')]) === -1) {\r\n this.dataControls.push({\r\n IsAdd: false,\r\n ID: fileData[i][this.getColumnIndex('ID')],\r\n Name: fileData[i][this.getColumnIndex('Name')]\r\n });\r\n }\r\n }\r\n this.bindControls();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n this.onReload();\r\n });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n const resultRole = await this.appService.doGET('api/Role', null);\r\n if (resultRole && resultRole.Status === 1) {\r\n this.roles = resultRole.Data;\r\n this.rolesFilter = this.roles.slice();\r\n }\r\n }\r\n\r\n onSearch() {\r\n this.getControls();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.getControls();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearControl() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewControl() {\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.setDefault();\r\n }\r\n\r\n onSaveControl() {\r\n if (this.dataControlItem.IsAdd) { this.addControl(); } else { this.updateControl(); }\r\n }\r\n\r\n async onSaveControls() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataControls.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataControls[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Control/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataControlItem;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n };\r\n }\r\n\r\n onCloseControl(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n\r\n onEditControl() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n }\r\n\r\n async addControl() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Control', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewControl();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateControl() {\r\n this.appComponent.loading = true;\r\n const id = this.dataControlItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPUT('api/Control', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteControl() {\r\n if (this.dataControlSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataControlSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Control/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewControl();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataControlSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n}\r\n\r\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2FkL2xvYWQtZGF0YS1hdXRvL2xvYWQtZGF0YS1hdXRvLmNvbXBvbmVudC5jc3MifQ== */\"","module.exports = \"\\r\\n \\r\\n Cập nhật đường dẫn tin bài \\r\\n \\r\\n \\r\\n Cập nhật đường dẫn chuyên mục \\r\\n \\r\\n \\r\\n Cập nhật đường dẫn hệ thống văn bản \\r\\n \\r\\n
\\r\\n\"","import { Component, OnInit } from '@angular/core';\r\nimport { AppService } from 'src/app/services/app.service';\r\n\r\n@Component({\r\n selector: 'app-load-data-auto',\r\n templateUrl: './load-data-auto.component.html',\r\n styleUrls: ['./load-data-auto.component.css']\r\n})\r\nexport class LoadDataAutoComponent implements OnInit {\r\n\r\n constructor(\r\n public appService: AppService,\r\n ) { \r\n\r\n }\r\n\r\n async UpdatePost(){\r\n const resultPost = await this.appService.doGET('api/Post/updateUrlPathPostAuto', null);\r\n if (resultPost && resultPost.Status === 1) {\r\n console.log(resultPost)\r\n }\r\n }\r\n\r\n async UpdateMenu(){\r\n const resultPost = await this.appService.doGET('api/Post/updateUrlPathMenuAuto', null);\r\n if (resultPost && resultPost.Status === 1) {\r\n console.log(resultPost)\r\n }\r\n }\r\n\r\n async UpdateOffice(){\r\n const resultPost = await this.appService.doGET('api/Post/updateUrlPathOfficeAuto', null);\r\n if (resultPost && resultPost.Status === 1) {\r\n console.log(resultPost)\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","module.exports = \".k-grid-content {\\r\\n max-height: 200px;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 302px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvYWQvcGFnZS9wYWdlLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUEsbUJBQW1COztBQUNuQjtJQUNJLGVBQWU7SUFDZixTQUFTO0lBQ1QsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtBQUNkOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCOztBQUVBO0lBQ0k7UUFDSSxlQUFlO1FBQ2YsU0FBUztRQUNULGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLFVBQVU7SUFDZDs7SUFFQTtRQUNJLGVBQWU7UUFDZixVQUFVO1FBQ1YsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkO0FBQ0o7O0FBRUEsbUJBQW1COztBQUVuQjtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtBQUNqQiIsImZpbGUiOiJzcmMvYXBwL2FkL3BhZ2UvcGFnZS5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmstZ3JpZC1jb250ZW50IHtcclxuICAgIG1heC1oZWlnaHQ6IDIwMHB4O1xyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqL1xyXG4uc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDc2cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTglO1xyXG59XHJcblxyXG4uc3RpY2t5LXRvb2xiYXItYnRuLXVzZXJ7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDE5M3B4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk5LjU1JTtcclxufVxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2OHB4KSB7XHJcbiAgICAuc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogNzZweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTQlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAuc3RpY2t5LXRvb2xiYXItYnRuLXVzZXJ7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogMTkzcHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk5JTtcclxuICAgIH1cclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuc3RpY2t5LWhlYWRlci1ncmlkIC5rLWdyaWQgLmstZ3JpZC1oZWFkZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAzMDJweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5Ny41NSU7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Page_MenuFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Page_ButtonFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\n@Component({\r\n selector: 'app-page',\r\n templateUrl: './page.component.html',\r\n styleUrls: ['./page.component.css']\r\n})\r\nexport class PageComponent implements OnInit, OnDestroy {\r\n\r\n isStickySearch = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isStickySearch = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataPages = [];\r\n dataPageSelectableSettings: SelectableSettings;\r\n dataPageSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataPageFocus = {\r\n Name: true\r\n };\r\n dataPageSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //Config: Constant for paging\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataPageSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataPagePageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataPageSelection: number[] = [];\r\n dataPageItem: any;\r\n myInterval: any;\r\n pageName: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataPageState: State = {\r\n skip: this.dataPageSkip,\r\n take: this.dataPageSkip + this.dataPagePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n group: [{ field: 'ParentName' }]\r\n };\r\n dataPageGridDataResult: GridDataResult;\r\n\r\n parentPages: Array<{ Name: string, ID: string }>;\r\n parentPagesFilter: Array<{ Name: string, ID: string }>;\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.getPageParent();\r\n this.getPageName();\r\n }\r\n\r\n parentPagesHandleFilter(value) {\r\n this.parentPagesFilter = this.parentPages.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataPageSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getPages() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/Page/Search', dataRequest);\r\n if (result) {\r\n this.dataPages = result.Data; \r\n // this.parentPagesFilter = this.parentPages.slice();\r\n this.bindPages();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n async getPageParent() {\r\n const dataRequest = {\r\n searchText: ''\r\n };\r\n const result = await this.appService.doGET('api/Page/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.parentPages = [];\r\n this.parentPages.push({\r\n ID: null,\r\n Name: 'Root'\r\n });\r\n\r\n result.Data.forEach(item => {\r\n if (!item.ParentID) {\r\n this.parentPages.push(item);\r\n }\r\n });\r\n\r\n this.parentPagesFilter = this.parentPages.slice();\r\n }\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataPageSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataPages.find((item) => {\r\n return item.ID === this.dataPageSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataPageSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataPageItem = {\r\n IsAdd: true,\r\n ID: null,\r\n Name: null,\r\n ParentID: '',\r\n OrdinalNumber: 0,\r\n MenuFlg: true,\r\n ButtonFlg: false\r\n };\r\n this.dataPageFocus.Name = true;\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.dataPageSelection = [];\r\n }\r\n\r\n onPagePageChange(event: PageChangeEvent) {\r\n this.dataPageSkip = event.skip;\r\n this.bindPages();\r\n }\r\n\r\n onPageSelectedKeysChange() {\r\n\r\n if (this.dataPageSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataPageSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataPageSelection[0];\r\n const selectedItem = this.dataPages.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataPageItem = selectedItem;\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindPages() {\r\n this.dataPageGridDataResult = {\r\n data: orderBy(this.dataPages, this.dataPageSortByField),\r\n total: this.dataPages.length\r\n };\r\n\r\n this.dataPageGridDataResult = process(this.dataPages, this.dataPageState);\r\n }\r\n\r\n onPageSortChange(sort: SortDescriptor[]): void {\r\n this.dataPageSortByField = sort;\r\n this.bindPages();\r\n }\r\n\r\n public onPageDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataPageSelection = [];\r\n this.dataPageState = state;\r\n this.dataPageGridDataResult = process(this.dataPages, this.dataPageState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n 'NameParentPage',\r\n 'ParentID',\r\n 'ID',\r\n 'Name',\r\n 'OrdinalNumber',\r\n 'MenuFlg',\r\n 'ButtonFlg'\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n \r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n\r\n const extension = e.files[0].extension.toLowerCase();\r\n if (!extension || (extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.pdf')) {\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .xlsx, .xls.', false);\r\n return false;\r\n }\r\n\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n let parentPage: any;\r\n this.dataPages = [];\r\n for (let i = 1; i < fileData.length; i++) {\r\n parentPage = this.parentPages.find(item => {\r\n return this.appUtils.compareString(fileData[i][this.getColumnIndex('ParentID')], item.Name, item.ID);\r\n });\r\n\r\n if (fileData[i].indexOf(fileData[i][this.getColumnIndex('NameParentPage')]) == -1) {\r\n this.dataPages.push({\r\n IsAdd: false,\r\n ParentID: parentPage ? parentPage.ID : null,\r\n ParentName: parentPage ? parentPage.Name : null,\r\n ID: fileData[i][this.getColumnIndex('ID')],\r\n Name: fileData[i][this.getColumnIndex('Name')],\r\n OrdinalNumber: fileData[i][this.getColumnIndex('OrdinalNumber')],\r\n MenuFlg: fileData[i][this.getColumnIndex('MenuFlg')],\r\n ButtonFlg: fileData[i][this.getColumnIndex('ButtonFlg')],\r\n });\r\n }\r\n }\r\n this.bindPages();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n this.onReload();\r\n });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n onSearch() {\r\n this.getPages();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.getPages();\r\n this.getPageParent();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearPage() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewPage() {\r\n \r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n onSavePage() {\r\n if (this.dataPageItem.IsAdd) { this.addPage(); } else { this.updatePage(); }\r\n }\r\n\r\n async onSavePages() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n for (let i = 0; i < this.dataPages.length; i++) {\r\n let DataPages = this.dataPages[i];\r\n const dataRequest = {\r\n searchText: DataPages.Name\r\n };\r\n const resultPageListFromServer = await this.appService.doGET('api/Page/Search', dataRequest);\r\n let isDuplicate = false;\r\n if (resultPageListFromServer && resultPageListFromServer.Data &&\r\n resultPageListFromServer.Data.length > 0) {\r\n resultPageListFromServer.Data.forEach(element => {\r\n if (element.Name == DataPages.Name) {\r\n isDuplicate = true;\r\n }\r\n });\r\n }\r\n if (isDuplicate == false) {\r\n dataRequests.push(this.createDataRequest(this.dataPages[i]));\r\n }\r\n }\r\n const result = await this.appService.doPOST('api/Page/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataPageItem;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n ParentID: temp.ParentID,\r\n MenuFlg: temp.MenuFlg,\r\n ButtonFlg: temp.ButtonFlg,\r\n OrdinalNumber: temp.OrdinalNumber\r\n };\r\n }\r\n\r\n onClosePage(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n onEditPage() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async addPage() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Page', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updatePage() {\r\n this.appComponent.loading = true;\r\n const id = this.dataPageItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPUT('api/Page', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewPage();\r\n this.infoOpened = false\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeletePage() {\r\n if (this.dataPageSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataPageSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Page/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewPage();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataPageSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n}\r\n","module.exports = \"/* sticky toolbar */\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n.sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n/* sticky toolbar */\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 300px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvYWQvcm9sZS9yb2xlLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CO0FBQ25CO0lBQ0ksZUFBZTtJQUNmLFNBQVM7SUFDVCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixVQUFVO0FBQ2Q7QUFFQTtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtBQUNqQjtBQUVBO0lBQ0k7UUFDSSxlQUFlO1FBQ2YsU0FBUztRQUNULGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLFVBQVU7SUFDZDs7SUFFQTtRQUNJLGVBQWU7UUFDZixVQUFVO1FBQ1YsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkO0FBQ0o7QUFFQSxtQkFBbUI7QUFHbkI7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakIiLCJmaWxlIjoic3JjL2FwcC9hZC9yb2xlL3JvbGUuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHN0aWNreSB0b29sYmFyICovXHJcbi5zdGlja3ktZ3JvdXAtc2VhcmNoIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogNzZweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OCU7XHJcbn1cclxuXHJcbi5zdGlja3ktdG9vbGJhci1idG4tdXNlcntcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMTkzcHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTkuNTUlO1xyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY4cHgpIHtcclxuICAgIC5zdGlja3ktZ3JvdXAtc2VhcmNoIHtcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiA3NnB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5NCU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5zdGlja3ktdG9vbGJhci1idG4tdXNlcntcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiAxOTNweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTklO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqL1xyXG5cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuc3RpY2t5LWhlYWRlci1ncmlkIC5rLWdyaWQgLmstZ3JpZC1oZWFkZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAzMDBweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5Ny41NSU7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Role_DefaultFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'app-role',\r\n templateUrl: './role.component.html',\r\n styleUrls: ['./role.component.css'],\r\n})\r\nexport class RoleComponent implements OnInit, OnDestroy {\r\n\r\n isStickySearch = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isStickySearch = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataRoles = [];\r\n dataRoleSelectableSettings: SelectableSettings;\r\n dataRoleSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataRoleFocus = {\r\n Name: true\r\n };\r\n dataRoleSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataRoleSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataRolePageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataRoleSelection: number[] = [];\r\n dataRoleItem: any;\r\n myInterval: any;\r\n pageName: any;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataRoleState: State = {\r\n skip: this.dataRoleSkip,\r\n take: this.dataRoleSkip + this.dataRolePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n dataRoleGridDataResult: GridDataResult;\r\n\r\n roles: Array<{ Name: string, ID: string }>;\r\n rolesFilter: Array<{ Name: string, ID: string }>;\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n infoOpened = false;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n }\r\n\r\n rolesHandleFilter(value) {\r\n this.rolesFilter = this.roles.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataRoleSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getRoles() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/Role/Search', dataRequest);\r\n if (result) {\r\n this.dataRoles = result.Data;\r\n this.bindRoles();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataRoleSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataRoles.find((item) => {\r\n return item.ID === this.dataRoleSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataRoleSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataRoleItem = {\r\n IsAdd: true,\r\n ID: '',\r\n Name: '',\r\n DefaultFlg: false\r\n };\r\n this.dataRoleSelection = [];\r\n this.enabled = true;\r\n this.enabledID = true;\r\n }\r\n\r\n onRolePageChange(event: PageChangeEvent) {\r\n this.dataRoleSkip = event.skip;\r\n this.bindRoles();\r\n }\r\n\r\n onRoleSelectedKeysChange() {\r\n\r\n if (this.dataRoleSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataRoleSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataRoleSelection[0];\r\n const selectedItem = this.dataRoles.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataRoleItem = selectedItem;\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindRoles() {\r\n this.dataRoleGridDataResult = {\r\n data: orderBy(this.dataRoles, this.dataRoleSortByField),\r\n total: this.dataRoles.length\r\n };\r\n\r\n this.dataRoleGridDataResult = process(this.dataRoles, this.dataRoleState);\r\n }\r\n\r\n onRoleSortChange(sort: SortDescriptor[]): void {\r\n this.dataRoleSortByField = sort;\r\n this.bindRoles();\r\n }\r\n\r\n public onRoleDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataRoleSelection = [];\r\n this.dataRoleState = state;\r\n this.dataRoleGridDataResult = process(this.dataRoles, this.dataRoleState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n 'ID',\r\n 'Name',\r\n 'DefaultFlg'\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n\r\n const extension = e.files[0].extension.toLowerCase();\r\n if (!extension || (extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.pdf')) {\r\n \r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .xlsx, .xls.', false);\r\n\r\n return false;\r\n }\r\n\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n \r\n \r\n this.dataRoles = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 1; i < fileData.length; i++) {\r\n\r\n this.dataRoles.push({\r\n IsAdd: false,\r\n ID: fileData[i][this.getColumnIndex('ID')],\r\n Name: fileData[i][this.getColumnIndex('Name')],\r\n DefaultFlg: fileData[i][this.getColumnIndex('DefaultFlg')],\r\n });\r\n }\r\n this.bindRoles();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n this.onReload();\r\n });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n const resultRole = await this.appService.doGET('api/Role', null);\r\n if (resultRole && resultRole.Status === 1) {\r\n this.roles = resultRole.Data;\r\n this.rolesFilter = this.roles.slice();\r\n }\r\n }\r\n\r\n onSearch() {\r\n this.getRoles();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.getRoles();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearRole() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewRole() {\r\n \r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n onSaveRole() {\r\n if (this.dataRoleItem.IsAdd) { this.addRole(); } else { this.updateRole(); }\r\n }\r\n\r\n async onSaveRoles() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataRoles.length; i++) {\r\n\t\t\tlet role = this.dataRoles[i];\r\n const resultRoleListFromServer = await this.appService.doGET('api/Role/Search', { searchText: role.Name });\r\n\t\t\tlet isDuplicate = false;\r\n\t\t\tif (resultRoleListFromServer && resultRoleListFromServer.Data &&\r\n\t\t\t\tresultRoleListFromServer.Data.length > 0) {\r\n resultRoleListFromServer.Data.forEach(element => {\r\n\t\t\t\t\tif (element.ID == role.ID) {\r\n\t\t\t\t\t\tisDuplicate = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tif (isDuplicate == false) {\r\n\t\t\t\tdataRequests.push(this.createDataRequest(this.dataRoles[i]));\r\n\t\t\t}\r\n\t\t}\r\n const result = await this.appService.doPOST('api/Role/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataRoleItem;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n DefaultFlg: temp.DefaultFlg\r\n };\r\n }\r\n\r\n onCloseRole(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n onEditRole() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async addRole() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Role', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateRole() {\r\n this.appComponent.loading = true;\r\n const id = this.dataRoleItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPUT('api/Role', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewRole();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteRole() {\r\n if (this.dataRoleSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataRoleSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Role/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewRole();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataRoleSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n\t\tconst result: ExcelExportData = {\r\n\t\t\tdata: process(this.dataRoles, {}).data\r\n\t\t};\r\n\r\n\t\treturn result;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n","module.exports = \".k-treeview .k-in {\\r\\n width: 100% !important;\\r\\n}\\r\\n\\r\\n.k-treeview .k-in div,\\r\\n.k-treeview .k-in div label {\\r\\n width: inherit;\\r\\n}\\r\\n\\r\\n.k-treeview .k-in.k-state-selected {\\r\\n width: 100% !important;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 100%;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 182px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn-1{\\r\\n position: fixed;\\r\\n top: 133px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 100%;\\r\\n background-color: white;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 182px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 92%;\\r\\n }\\r\\n\\r\\n .sticky-toolbar-btn-1{\\r\\n position: fixed;\\r\\n top: 133px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 100%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvYWQvdXNlci1yb2xlL3VzZXItcm9sZS5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksc0JBQXNCO0FBQzFCOztBQUVBOztJQUVJLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxzQkFBc0I7QUFDMUI7O0FBRUEsbUJBQW1COztBQUNuQjtJQUNJLGVBQWU7SUFDZixTQUFTO0lBQ1QsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsV0FBVztJQUNYLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtBQUNkOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixXQUFXO0FBQ2Y7O0FBRUE7SUFDSTtRQUNJLGVBQWU7UUFDZixTQUFTO1FBQ1QsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsV0FBVztRQUNYLHVCQUF1QjtJQUMzQjs7SUFFQTtRQUNJLGVBQWU7UUFDZixVQUFVO1FBQ1YsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkOztJQUVBO1FBQ0ksZUFBZTtRQUNmLFVBQVU7UUFDVixjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixXQUFXO0lBQ2Y7QUFDSjs7QUFFQSxtQkFBbUIiLCJmaWxlIjoic3JjL2FwcC9hZC91c2VyLXJvbGUvdXNlci1yb2xlLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuay10cmVldmlldyAuay1pbiB7XHJcbiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uay10cmVldmlldyAuay1pbiBkaXYsXHJcbi5rLXRyZWV2aWV3IC5rLWluIGRpdiBsYWJlbCB7XHJcbiAgICB3aWR0aDogaW5oZXJpdDtcclxufVxyXG5cclxuLmstdHJlZXZpZXcgLmstaW4uay1zdGF0ZS1zZWxlY3RlZCB7XHJcbiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqL1xyXG4uc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDc2cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG59XHJcblxyXG4uc3RpY2t5LXRvb2xiYXItYnRue1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAxODJweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OCU7XHJcbn1cclxuXHJcbi5zdGlja3ktdG9vbGJhci1idG4tMXtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMTMzcHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2OHB4KSB7XHJcbiAgICAuc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogNzZweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLnN0aWNreS10b29sYmFyLWJ0bntcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiAxODJweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTIlO1xyXG4gICAgfVxyXG5cclxuICAgIC5zdGlja3ktdG9vbGJhci1idG4tMXtcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiAxMzNweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgIH1cclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi8iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.Name}}\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { Location } from '@angular/common';\r\nimport { of } from 'rxjs/observable/of';\r\nimport { AppComponent } from 'src/app/app.component';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\n\r\n@Component({\r\n selector: 'app-user-role',\r\n templateUrl: './user-role.component.html',\r\n styleUrls: ['./user-role.component.css']\r\n})\r\nexport class UserRoleComponent implements OnInit, OnDestroy {\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n userRoles = [];\r\n userRoleFilter = [];\r\n searchUserRoleFilter = [];\r\n searchUserRoles = [];\r\n userRoleSelectedKeys = [];\r\n userRoleSelectableSettings: SelectableSettings;\r\n userRoleSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n userRoleSortByField: SortDescriptor[] = [];\r\n\r\n searchOption = {\r\n RoleID: null,\r\n SearchText: ''\r\n };\r\n\r\n public userRoleState: State = {\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n userRoleGridDataResult: GridDataResult;\r\n\r\n userRoleSkip = 0;\r\n userRolePageSize = 5;\r\n userRoleSelection: number[] = [];\r\n userRoleItem: any;\r\n myInterval: any;\r\n\r\n roles: Array<{ Name: string, ID: string }>;\r\n roleFilters: Array<{ Name: string, ID: string }>;\r\n roleSearchs: Array<{ Name: string, ID: string }>;\r\n\r\n public updateFilePathUrl = this.appService.apiRoot + 'File/Upload';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public userRoleOpened = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n private location: Location,\r\n private appComponent: AppComponent,\r\n public appControls: AppControls\r\n ) {\r\n\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.initDisplay();\r\n this.getPageName();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n pageName: any;\r\n \r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.allowMulti = !this.allowMulti;\r\n this.userRoleSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n async getUserRoles() {\r\n this.appComponent.loading = true;\r\n if (this.searchOption.RoleID && this.searchOption.RoleID !== this.guid.empty) {\r\n const dataRequest = {\r\n id: this.searchOption.RoleID\r\n };\r\n this.loading = true;\r\n const result = await this.appService.doGET('api/RolePage', dataRequest);\r\n if (result) {\r\n this.userRoles = result.Data.Items || [];\r\n }\r\n this.loading = false;\r\n } else {\r\n this.userRoles = [];\r\n }\r\n\r\n this.userRoleFilter = this.userRoles.slice();\r\n this.bindUserRoles();\r\n this.getSearchUserRole();\r\n this.appComponent.loading = false;\r\n }\r\n\r\n getSearchUserRole() {\r\n const result = [];\r\n this.userRoles.forEach((userRole) => {\r\n if (!result.find((f) => {\r\n return f.indexOf(userRole.Name) >= 0;\r\n })) {\r\n result.push(userRole.Name);\r\n }\r\n\r\n if (userRole.Items && userRole.Items.length > 0) {\r\n userRole.Items.forEach((item) => {\r\n if (item.Name && !result.find((f) => {\r\n return f.indexOf(item.Name) >= 0;\r\n })) {\r\n result.push(item.Name);\r\n }\r\n });\r\n }\r\n });\r\n\r\n this.searchUserRoles = result;\r\n this.searchUserRoleFilter = this.searchUserRoles.slice();\r\n }\r\n\r\n onUserRolePageChange(event: PageChangeEvent) {\r\n this.userRoleSkip = event.skip;\r\n this.bindUserRoles();\r\n }\r\n\r\n onUserRoleSelectedKeysChange() {\r\n }\r\n\r\n userRoleHandleSelection({ index }: any) {\r\n if (index.indexOf('_') < 0) {\r\n const i = this.intl.parseNumber(index);\r\n const page = this.userRoleFilter[i];\r\n if (page.Items && page.Items.length > 0) {\r\n page.Items.forEach((item) => {\r\n item.ActiveFlg = !page.ActiveFlg;\r\n });\r\n }\r\n }\r\n this.bindUserRoles();\r\n }\r\n\r\n onSearchUserRoleChange() {\r\n this.userRoleFilter = this.search(this.userRoles, this.searchOption.SearchText);\r\n }\r\n\r\n onSearchUserRoleFiltering(filter: any) {\r\n this.searchUserRoleFilter = this.searchUserRoles.filter((s) => s.toLowerCase().indexOf(filter.toLowerCase()) !== -1);\r\n }\r\n\r\n public search(items: any[], term: string): any[] {\r\n return items.reduce((acc, item) => {\r\n if (this.contains(item.Name, term)) {\r\n acc.push(item);\r\n } else if (item.Items && item.Items.length > 0) {\r\n const newItems = this.search(item.Items, term);\r\n\r\n if (newItems.length > 0) {\r\n acc.push({ ID: item.ID, Name: item.Name, ActiveFlg: item.ActiveFlg, Items: newItems });\r\n }\r\n }\r\n\r\n return acc;\r\n }, []);\r\n }\r\n\r\n public contains(text: string, term: string): boolean {\r\n return text.toLowerCase().indexOf(term.toLowerCase()) >= 0;\r\n }\r\n\r\n bindUserRoles() {\r\n this.userRoleGridDataResult = {\r\n data: orderBy(this.userRoles, this.userRoleSortByField),\r\n total: this.userRoles.length\r\n };\r\n this.userRoleGridDataResult = process(this.userRoles, this.userRoleState);\r\n }\r\n\r\n onUserRoleSortChange(sort: SortDescriptor[]): void {\r\n this.userRoleSortByField = sort;\r\n this.bindUserRoles();\r\n }\r\n\r\n public onUserRoleDataStateChange(state: DataStateChangeEvent): void {\r\n this.userRoleSelection = [];\r\n this.userRoleState = state;\r\n this.userRoleGridDataResult = process(this.userRoles, this.userRoleState);\r\n }\r\n\r\n onRoleSearchHandleFilter(value) {\r\n this.roleSearchs = this.roles.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n async onRoleSearchValueChange(e: any) {\r\n this.roleSearchs = this.roles.slice();\r\n this.onReload();\r\n }\r\n\r\n async onServiceSearchValueChange(e: any) {\r\n this.onReload();\r\n }\r\n\r\n async initDisplay() {\r\n\r\n const resultrole = await this.appService.doGET('api/role/GetForCombobox', null);\r\n if (resultrole) {\r\n this.roles = resultrole.Data;\r\n this.roleFilters = this.roles.slice();\r\n this.roleSearchs = this.roles.slice();\r\n }\r\n\r\n if (this.roles.length > 0) {\r\n this.searchOption.RoleID = this.roles[0].ID;\r\n this.onReload();\r\n }\r\n }\r\n\r\n onReload() {\r\n this.getUserRoles();\r\n }\r\n\r\n async onSaveUserRole() {\r\n\r\n\r\n const dataRequests = [];\r\n let page: any;\r\n let controls: any;\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.userRoles.length; i++) {\r\n page = this.userRoles[i];\r\n controls = [];\r\n if (page.Items && page.Items.length > 0) {\r\n page.Items.forEach(ctr => {\r\n if (ctr.ActiveFlg) {\r\n controls.push(ctr.ID);\r\n }\r\n });\r\n }\r\n\r\n dataRequests.push({\r\n RoleID: this.searchOption.RoleID,\r\n PageID: page.ID,\r\n Value: controls.length > 0 ? JSON.stringify(controls) : '',\r\n ActiveFlg: page.ActiveFlg\r\n });\r\n }\r\n\r\n const result = await this.appService.doPOST('api/RolePage', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n onBack() {\r\n this.location.back();\r\n }\r\n\r\n}\r\n","module.exports = \".k-grid input[type=\\\"password\\\"] {\\r\\n background: inherit;\\r\\n border: none;\\r\\n}\\r\\n\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n\\r\\n.sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 300px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid-cmt .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 253px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvYWQvdXNlci91c2VyLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxtQkFBbUI7SUFDbkIsWUFBWTtBQUNoQjs7O0FBR0EsbUJBQW1COzs7QUFDbkI7SUFDSSxlQUFlO0lBQ2YsU0FBUztJQUNULGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLFVBQVU7QUFDZDs7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakI7OztBQUVBO0lBQ0k7UUFDSSxlQUFlO1FBQ2YsU0FBUztRQUNULGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLFVBQVU7SUFDZDs7SUFFQTtRQUNJLGVBQWU7UUFDZixVQUFVO1FBQ1YsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkO0FBQ0o7OztBQUVBLG1CQUFtQjs7O0FBR25CO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCOzs7QUFHQTtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtBQUNqQiIsImZpbGUiOiJzcmMvYXBwL2FkL3VzZXIvdXNlci5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmstZ3JpZCBpbnB1dFt0eXBlPVwicGFzc3dvcmRcIl0ge1xyXG4gICAgYmFja2dyb3VuZDogaW5oZXJpdDtcclxuICAgIGJvcmRlcjogbm9uZTtcclxufVxyXG5cclxuXHJcbi8qIHN0aWNreSB0b29sYmFyICovXHJcbi5zdGlja3ktZ3JvdXAtc2VhcmNoIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogNzZweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OCU7XHJcbn1cclxuXHJcbi5zdGlja3ktdG9vbGJhci1idG4tdXNlcntcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMTkzcHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTkuNTUlO1xyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY4cHgpIHtcclxuICAgIC5zdGlja3ktZ3JvdXAtc2VhcmNoIHtcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiA3NnB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5NCU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5zdGlja3ktdG9vbGJhci1idG4tdXNlcntcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiAxOTNweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTklO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqL1xyXG5cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuc3RpY2t5LWhlYWRlci1ncmlkIC5rLWdyaWQgLmstZ3JpZC1oZWFkZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAzMDBweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5Ny41NSU7XHJcbn1cclxuXHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnN0aWNreS1oZWFkZXItZ3JpZC1jbXQgLmstZ3JpZCAuay1ncmlkLWhlYWRlciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDI1M3B4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk3LjU1JTtcclxufSJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'User_LockFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Input, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { delay, map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-user',\r\n templateUrl: './user.component.html',\r\n styleUrls: ['./user.component.css'],\r\n})\r\nexport class UserComponent implements OnInit, OnDestroy {\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataUsers = [];\r\n dataUserSelectableSettings: SelectableSettings;\r\n dataUserSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public group: any[] = [{\r\n field: 'RoleName'\r\n }];\r\n public dataUserFocus = {\r\n Name: true\r\n };\r\n dataUserSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataUserSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataUserPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataUserSelection: number[] = [];\r\n dataUserItem: any;\r\n myInterval: any;\r\n pageName: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataUserState: State = {\r\n skip: this.dataUserSkip,\r\n take: this.dataUserSkip + this.dataUserPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n group: [{ field: 'RoleName' }]\r\n };\r\n dataUserGridDataResult: GridDataResult;\r\n\r\n roles: Array<{ Name: string, ID: string }>;\r\n rolesFilter: Array<{ Name: string, ID: string }>;\r\n\r\n units: Array<{ Name: string, ID: string }>;\r\n unitsFilter: Array<{ Name: string, ID: string }>;\r\n members: Array<{ FullName: string, UserName: string }> = [];\r\n membersFilter: Array<{ FullName: string, UserName: string }> = [];\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n @Input() userType = 0;\r\n\r\n public dataUserStateCmt: State = {\r\n skip: this.dataUserSkip,\r\n take: this.dataUserSkip + this.dataUserPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n ) {\r\n \r\n }\r\n\r\n rolesHandleFilter(value) {\r\n this.rolesFilter = this.roles.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n unitsHandleFilter(value) {\r\n this.unitsFilter = this.units.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n membersHandleFilter(value) {\r\n this.membersFilter = this.members.filter((s) => s.FullName.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataUserSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getUsers() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n const result = await this.appService.doGET('api/User/Search', dataRequest);\r\n //const result = await this.appService.doGET('api/User/Search', null);\r\n if (result && result.Status === 1) {\r\n for (let i = 0; i < result.Data.length; i++) {\r\n if(result.Data[i].MemberList == null || result.Data[i].MemberList == \"\"){\r\n result.Data[i].MemberList = [];\r\n }\r\n else{\r\n result.Data[i].MemberList = JSON.parse(result.Data[i].MemberList);\r\n }\r\n if(result.Data[i].UnitRpList == null || result.Data[i].UnitRpList == \"\"){\r\n result.Data[i].UnitRpList = [];\r\n }\r\n else{\r\n result.Data[i].UnitRpList = JSON.parse(result.Data[i].UnitRpList);\r\n }\r\n }\r\n this.dataUsers = result.Data;\r\n console.log(this.dataUsers)\r\n this.bindUsers();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataUserSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataUsers.find((item) => {\r\n return item.UserName === this.dataUserSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataUserSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataUserItem = {\r\n IsAdd: true,\r\n UserName: '',\r\n Password: '',\r\n FullName: '',\r\n Description: '',\r\n LockFlg: false,\r\n DelFlg: false,\r\n RoleID: '',\r\n UnitID: null\r\n };\r\n\r\n\r\n this.dataUserSelection = []\r\n this.enabled = true;\r\n this.enabledID = true;\r\n }\r\n\r\n onUserPageChange(event: PageChangeEvent) {\r\n this.dataUserSkip = event.skip;\r\n this.bindUsers();\r\n }\r\n\r\n onUserSelectedKeysChange() {\r\n\r\n if (this.dataUserSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataUserSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataUserSelection[0];\r\n const selectedItem = this.dataUsers.find((item) => {\r\n return item.UserName === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataUserItem = selectedItem;\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindUsers() {\r\n this.dataUserGridDataResult = {\r\n data: orderBy(this.dataUsers, this.dataUserSortByField),\r\n total: this.dataUsers.length\r\n };\r\n if(this.userType == 1){\r\n this.dataUserGridDataResult = process(this.dataUsers, this.dataUserStateCmt);\r\n }else {\r\n this.dataUserGridDataResult = process(this.dataUsers, this.dataUserState);\r\n }\r\n }\r\n\r\n onUserSortChange(sort: SortDescriptor[]): void {\r\n this.dataUserSortByField = sort;\r\n this.bindUsers();\r\n }\r\n\r\n public onUserDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataUserSelection = [];\r\n if(this.userType == 1){\r\n this.dataUserStateCmt = state;\r\n this.dataUserGridDataResult = process(this.dataUsers, this.dataUserStateCmt);\r\n }else {\r\n this.dataUserState = state;\r\n this.dataUserGridDataResult = process(this.dataUsers, this.dataUserState);\r\n }\r\n \r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n 'RoleName',\r\n 'RoleID',\r\n 'UserName',\r\n 'Password',\r\n 'FullName',\r\n 'UnitID',\r\n 'Description',\r\n 'LockFlg',\r\n 'DelFlg'\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n const extension = e.files[0].extension.toLowerCase();\r\n if (!extension || (extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.pdf')) {\r\n \r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .xlsx, .xls.', false);\r\n\r\n return false;\r\n }\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n let role: any;\r\n let unit: any;\r\n this.dataUsers = [];\r\n for (let i = 1; i < fileData.length; i++) {\r\n role = this.roles.find(item => {\r\n return this.appUtils.compareString(fileData[i][this.getColumnIndex('RoleID')], item.Name, item.ID);\r\n });\r\n\r\n unit = this.units.find(item => {\r\n return this.appUtils.compareString(fileData[i][this.getColumnIndex('UnitID')], item.Name, item.ID);\r\n });\r\n\r\n if (fileData[i].indexOf(fileData[i][this.getColumnIndex('RoleName')]) === -1) {\r\n this.dataUsers.push({\r\n IsAdd: false,\r\n RoleID: role ? role.ID : null,\r\n RoleName: role ? role.Name : null,\r\n UnitID: unit ? unit.ID : null,\r\n UnitName: unit ? unit.Name : null,\r\n\r\n UserName: fileData[i][this.getColumnIndex('UserName')],\r\n Password: fileData[i][this.getColumnIndex('Password')],\r\n FullName: fileData[i][this.getColumnIndex('FullName')],\r\n Description: fileData[i][this.getColumnIndex('Description')],\r\n LockFlg: fileData[i][this.getColumnIndex('LockFlg')],\r\n DelFlg: fileData[i][this.getColumnIndex('DelFlg')],\r\n });\r\n }\r\n }\r\n this.bindUsers();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n this.onReload();\r\n });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n const resultRole = await this.appService.doGET('api/Role', null);\r\n if (resultRole && resultRole.Status === 1) {\r\n this.roles = resultRole.Data;\r\n this.rolesFilter = this.roles.slice();\r\n }\r\n\r\n const resultUnit = await this.appService.doGET('api/Unit', null);\r\n if (resultUnit && resultUnit.Status === 1) {\r\n this.units = resultUnit.Data;\r\n this.unitsFilter = this.units.slice();\r\n }\r\n\r\n const resultMemberList = await this.appService.doGET('api/User/GetListUser', null);\r\n if (resultMemberList && resultMemberList.Status === 1) { \r\n this.members = resultMemberList.Data;\r\n this.membersFilter = this.members.slice();\r\n }\r\n }\r\n\r\n onSearch() {\r\n if(this.userType == 1){\r\n this.searchCmtUser();\r\n }else{\r\n this.getUsers();\r\n } \r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n if(this.userType == 1){\r\n this.searchCmtUser();\r\n }else{\r\n this.getUsers();\r\n }\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearUser() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewUser() {\r\n \r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n onSaveUser() {\r\n if (this.dataUserItem.IsAdd) { this.addUser(); } else { this.updateUser(); }\r\n }\r\n\r\n async onSaveUsers() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataUsers.length; i++) {\r\n // check duplicate data\r\n let user = this.dataUsers[i];\r\n const dataRequest = {\r\n searchText: user.UserName\r\n };\r\n \r\n const resultUserListFromServer = await this.appService.doGET('api/User/Search', dataRequest);\t\t\t\r\n let isDuplicate = false;\r\n\t\t\tif (resultUserListFromServer && resultUserListFromServer.Data &&\r\n\t\t\t\tresultUserListFromServer.Data.length > 0) {\r\n resultUserListFromServer.Data.forEach(element => {\r\n\t\t\t\t\tif (element.UserName == user.UserName) {\r\n\t\t\t\t\t\tisDuplicate = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tif (isDuplicate == false) {\r\n\t\t\t\tdataRequests.push(this.createDataRequest(this.dataUsers[i]));\r\n\t\t\t}\r\n \r\n }\r\n const result = await this.appService.doPOST('api/User/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataUserItem;\r\n\r\n var members: any[] = [];\r\n if (this.dataUserItem.MemberList) {\r\n for (let i = 0; i < this.dataUserItem.MemberList.length; i++) {\r\n members.push(this.dataUserItem.MemberList[i]);\r\n }\r\n }\r\n\r\n var unitRplist: any[] = [];\r\n if (this.dataUserItem.UnitRpList) {\r\n for (let i = 0; i < this.dataUserItem.UnitRpList.length; i++) {\r\n unitRplist.push(this.dataUserItem.UnitRpList[i]);\r\n }\r\n }\r\n return {\r\n UserName: temp.UserName,\r\n Password: temp.Password,\r\n FullName: temp.FullName,\r\n Description: temp.Description,\r\n LockFlg: temp.LockFlg,\r\n DelFlg: temp.DelFlg,\r\n RoleID: temp.RoleID,\r\n UnitID: temp.UnitID,\r\n MemberList: members.length > 0 ? JSON.stringify(members): null,\r\n UnitRpList: unitRplist.length > 0 ? JSON.stringify(unitRplist): null\r\n };\r\n }\r\n\r\n onCloseUser(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n onEditUser() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async addUser() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/User', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateUser() {\r\n this.appComponent.loading = true;\r\n const id = this.dataUserItem.UserName;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPUT('api/User', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewUser();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteUser() {\r\n if (this.dataUserSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataUserSelection),\r\n FlgRevert: false\r\n };\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/User/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewUser();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataUserSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataUsers, { group: this.group }).data,\r\n group: this.group\r\n };\r\n\r\n return result;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault()\r\n this.infoOpened = false;\r\n }\r\n async searchCmtUser() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText,\r\n Type: this.userType\r\n };\r\n const result = await this.appService.doGET('api/User/SearchCmtUser', dataRequest);\r\n //const result = await this.appService.doGET('api/User/Search', null);\r\n if (result) {\r\n this.dataUsers = result.Data;\r\n this.bindUsers();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n async onLockCmtUser() {\r\n if (this.dataUserSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataUserSelection),\r\n FlgRevert: false\r\n };\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/User/LockCmtUser', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewUser();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataUserSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onUnLockCmtUser() {\r\n if (this.dataUserSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataUserSelection),\r\n FlgRevert: true\r\n };\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/User/LockCmtUser', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewUser();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataUserSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n public valueNormalizerMember = (text$: Observable) => text$.pipe(map((text: string) => {\r\n //search for matching item to avoid duplicates\r\n if(!text.replace(/\\s/g, '').length){\r\n return\r\n } \r\n }));\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n ]\r\n})\r\nexport class AppRoutingModule { }","module.exports = \"/* @import '@angular/material/prebuilt-themes/deeppurple-amber.css'; */\\r\\n\\r\\n/* * { */\\r\\n\\r\\n/* font-family: \\\"Open Sans\\\", sans-serif !important; */\\r\\n\\r\\n/* Add !important to overwrite all elements */\\r\\n\\r\\n/* } */\\r\\n\\r\\n:host ::ng-deep html,\\r\\n:host ::ng-deep body,\\r\\n:host ::ng-deep .dashboard-main-wrapper {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n position: absolute;\\r\\n overflow-x: hidden;\\r\\n background-color: #ffffff !important;\\r\\n font-family: \\\"Open Sans\\\", sans-serif !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .bg {\\r\\n background-repeat: no-repeat;\\r\\n background-size: 100% 100%;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-toolbar .k-button-icon {\\r\\n border-radius: 25%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-dialog-titlebar {\\r\\n border-color: inherit;\\r\\n color: #fff;\\r\\n background-color: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .router-outlet-content {\\r\\n padding: 8px;\\r\\n margin-top: 57px;\\r\\n background-color: white;\\r\\n /* background-color: #eff0f0 */\\r\\n /* phong */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .router-outlet-content>header>i {\\r\\n float: left;\\r\\n margin-top: 8px;\\r\\n padding-left: 10px;\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .router-outlet-content>header>h4 {\\r\\n color: #006CB7;\\r\\n text-transform: capitalize;\\r\\n padding-left: 20px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control {\\r\\n margin-bottom: 7px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control>* {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control label {\\r\\n margin-bottom: 0;\\r\\n font-weight: 500;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control .text {\\r\\n padding-left: 7px;\\r\\n color: #0067b2;\\r\\n font-size: 17px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .sticky-toolbar-btn-user .k-toolbar {\\r\\n margin-bottom: 0px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-toolbar {\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-panelbar>.k-item>.k-link,\\r\\n:host ::ng-deep .k-panelbar>.k-item>.k-link.k-state-selected:hover,\\r\\n:host ::ng-deep .k-panelbar>.k-item>.k-link.k-state-selected.k-state-hover {\\r\\n color: #fff;\\r\\n background-color: #e7e7e7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-panelbar>.k-item>.k-link.k-state-selected {\\r\\n color: #fff;\\r\\n background-color: #e7e7e7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-panelbar .k-content {\\r\\n padding: 7px;\\r\\n background: #f1f1f1;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-panelbar .k-content .func {\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-button-icontext span {\\r\\n padding-left: 2px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep input,\\r\\n:host ::ng-deep button {\\r\\n font-size: 17px !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-textbox-container {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-button.k-primary,\\r\\n:host ::ng-deep .k-button.k-primary,\\r\\n:host ::ng-deep .k-slider .k-draghandle {\\r\\n color: #fff !important;\\r\\n border-radius: 10px;\\r\\n border-color: #3897f0 !important;\\r\\n background-color: #3897f0 !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-textbox-container {\\r\\n font-size: 21px !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-button.k-primary:hover,\\r\\n:host ::ng-deep .k-slider .k-draghandle:hover {\\r\\n border-color: #1b6db9 !important;\\r\\n background-color: #1b6db9 !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .window-center {\\r\\n left: 0 !important;\\r\\n right: 0;\\r\\n top: 0 !important;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.swal-warning {\\r\\n background-color: rgba(255, 193, 7, 0.8) !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep *::-moz-selection {\\r\\n background: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep *::selection {\\r\\n background: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-dialog-wrapper {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n flex-direction: column;\\r\\n outline: 0;\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n z-index: 10001;\\r\\n /* width: 70%;\\r\\n height: 90%;\\r\\n margin-top: 30px;\\r\\n margin-left: 227px; */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-dialog-buttongroup {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-list .k-item.k-state-selected,\\r\\n:host ::ng-deep .k-list-optionlabel.k-state-selected,\\r\\n:host ::ng-deep .k-list-container .k-button:active,\\r\\n:host ::ng-deep .k-list-container .k-button.k-state-active,\\r\\n:host ::ng-deep .k-column-menu .k-menu:not(.k-context-menu) .k-item.k-state-selected,\\r\\n:host ::ng-deep .k-spreadsheet-popup .k-button:active,\\r\\n:host ::ng-deep .k-spreadsheet-popup .k-button.k-state-active,\\r\\n:host ::ng-deep .k-spreadsheet-popup .k-button.k-state-selected,\\r\\n:host ::ng-deep .k-menu-group .k-item.k-state-selected,\\r\\n:host ::ng-deep .k-menu.k-context-menu .k-item.k-state-selected {\\r\\n color: #fff;\\r\\n background-color: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-grid td.k-state-selected,\\r\\n:host ::ng-deep .k-grid tr.k-state-selected>td {\\r\\n background-color: rgba(1, 69, 142, 0.25);\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-pager-numbers .k-state-selected,\\r\\n:host ::ng-deep .k-checkbox:checked+.k-checkbox-label::before {\\r\\n border-color: #006CB7;\\r\\n background-color: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .n-bg input .k-textbox-focused,\\r\\n:host ::ng-deep .n-bg .k-dateinput.k-state-disabled>.k-textbox:hover,\\r\\n:host ::ng-deep .n-bg .k-maskedtextbox.k-state-disabled>.k-textbox:hover,\\r\\n:host ::ng-deep .n-bg .k-multiselect-wrap,\\r\\n:host ::ng-deep .n-bg input.k-textbox,\\r\\n:host ::ng-deep .n-bg textarea.k-textbox,\\r\\n:host ::ng-deep .n-bg .k-input,\\r\\n:host ::ng-deep .n-bg .k-textbox>input,\\r\\n:host ::ng-deep .n-bg input.k-textbox:hover,\\r\\n:host ::ng-deep .n-bg textarea.k-textbox,\\r\\n:host ::ng-deep .n-bg textarea.k-textbox:hover,\\r\\n:host ::ng-deep .n-bg .input-group span :host ::ng-deep .n-bg .k-autocomplete,\\r\\n:host ::ng-deep .n-bg .k-flatcolorpicker .k-color-value,\\r\\n:host ::ng-deep .n-bg .k-combobox .k-dropdown-wrap,\\r\\n:host ::ng-deep .n-bg .k-datepicker .k-picker-wrap,\\r\\n:host ::ng-deep .n-bg .k-timepicker .k-picker-wrap,\\r\\n:host ::ng-deep .n-bg .k-datetimepicker .k-picker-wrap,\\r\\n:host ::ng-deep .n-bg .k-dateinput .k-dateinput-wrap,\\r\\n:host ::ng-deep .n-bg .k-textbox,\\r\\n:host ::ng-deep .n-bg .k-textarea,\\r\\n:host ::ng-deep .n-bg .k-input.k-textbox,\\r\\n:host ::ng-deep .n-bg .k-multiselect-wrap,\\r\\n:host ::ng-deep .n-bg .k-numerictextbox .k-numeric-wrap,\\r\\n:host ::ng-deep .n-bg .k-dropdown-wrap,\\r\\n:host ::ng-deep .n-bg .k-dropdown-wrap:hover,\\r\\n:host ::ng-deep .n-bg .k-dateinput {\\r\\n border-left: none !important;\\r\\n border-top: none !important;\\r\\n border-right: none !important;\\r\\n border-radius: 0 !important;\\r\\n background-color: inherit !important;\\r\\n background-image: none;\\r\\n box-shadow: none !important;\\r\\n color: inherit;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-notification-wrap {\\r\\n font-size: 19px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-notification-success {\\r\\n background-color: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .n-bg .k-dropdown-wrap .k-input,\\r\\n:host ::ng-deep .n-bg .k-dateinput-wrap,\\r\\n:host ::ng-deep .n-bg .k-dateinput-wrap .k-input {\\r\\n border: none !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-button-list .k-item {\\r\\n padding: 10px 20px !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .n-b .k-button {\\r\\n border: none !important;\\r\\n color: #000000 !important;\\r\\n box-shadow: none !important;\\r\\n background-color: inherit !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-toolbar .k-button {\\r\\n background-color: #0067b2;\\r\\n color: white;\\r\\n background: #0067b2;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .n-b .k-button:hover {\\r\\n background-color: inherit !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .btn-cf .k-button {\\r\\n color: white;\\r\\n}\\r\\n\\r\\n:host ::ng-deep a:hover {\\r\\n cursor: pointer;\\r\\n /* background-color: turquoise; */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .btn {\\r\\n background-image: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .floating-label {\\r\\n font-size: 12px;\\r\\n margin-bottom: 1px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .nav-item button {\\r\\n width: 100%;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-filtercell-operator {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-notification-group {\\r\\n z-index: 99999;\\r\\n}\\r\\n\\r\\n/* :host ::ng-deep ::-webkit-scrollbar {\\r\\n width: 5px;\\r\\n height: 5px;\\r\\n } */\\r\\n\\r\\n/* Handle */\\r\\n\\r\\n:host ::ng-deep ::-webkit-scrollbar-thumb {\\r\\n background: #006CB7;\\r\\n}\\r\\n\\r\\n/* Handle on hover */\\r\\n\\r\\n:host ::ng-deep ::-webkit-scrollbar-thumb:hover {\\r\\n background: #ff6358;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-grid td.checkbox {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n:host ::ng-deep td input[type=\\\"checkbox\\\"] {\\r\\n width: 17px;\\r\\n height: 17px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .closed {\\r\\n color: yellow;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .required {\\r\\n color: #ff6358 !important;\\r\\n padding-left: 3px;\\r\\n}\\r\\n\\r\\n.loading {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\n.loading img {\\r\\n margin: auto;\\r\\n left: 0;\\r\\n right: 0;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n position: absolute;\\r\\n z-index: 2;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-notification {\\r\\n min-width: 300px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-notification {\\r\\n width: 100%;\\r\\n padding: 10px 20px;\\r\\n border: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-notification .k-icon {\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-tabstrip>.k-content {\\r\\n background-color: #ffffff !important;\\r\\n overflow-x: hidden;\\r\\n padding: 0px !important;\\r\\n /* padding-left: 20px;\\r\\n padding-right: 20px; */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-tabstrip-items .k-item {\\r\\n color: #000000;\\r\\n background-color: #ffffff;\\r\\n font-weight: bold;\\r\\n font-size: 20px;\\r\\n text-transform: capitalize;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-tabstrip-items .k-item:hover {\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-tabstrip-items .k-item.k-state-active,\\r\\n:host ::ng-deep .k-tabstrip-items .k-item.k-state-selected {\\r\\n border-color: #006CB7;\\r\\n border-top: 0;\\r\\n border-right: 0;\\r\\n border-bottom-width: 3px;\\r\\n border-left: 0;\\r\\n color: #006CB7;\\r\\n /* background-color: #006CB7; */\\r\\n /* font-weight: bold; */\\r\\n /* font-size: 20px; */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-panelbar>.k-item>.k-link,\\r\\n:host ::ng-deep .k-panelbar>.k-item>.k-link.k-state-selected:hover,\\r\\n:host ::ng-deep .k-panelbar>.k-item>.k-link.k-state-selected.k-state-hover {\\r\\n background-color: #e7e7e7;\\r\\n color: #000;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-grid-header,\\r\\n.k-grid-toolbar,\\r\\n:host ::ng-deep .k-grouping-header,\\r\\n.k-grid-add-row,\\r\\n:host ::ng-deep .k-grid-footer {\\r\\n color: #fff;\\r\\n background-color: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .commentgrid .k-grid-toolbar {\\r\\n background-color: white !important;\\r\\n border: none !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .officegrid .k-grid-toolbar {\\r\\n border: 1px solid #707070;\\r\\n margin-top: 23px;\\r\\n padding: 20px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-grid .tr {\\r\\n background: white !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .officegrid .k-grid-aria-root {\\r\\n border: 1px solid #707070;\\r\\n margin-top: 30px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-filter-row td,\\r\\n:host ::ng-deep .k-filter-row th {\\r\\n padding: 3px 3px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-filter-row .k-textbox {\\r\\n background-color: #e7e7e7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-btn-success {\\r\\n background-color: #5cb85c;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-btn-danger {\\r\\n background-color: #d9534f;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .g-col-checked {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control label {\\r\\n color: #656565;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control-search input {\\r\\n float: left;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control-search .btn-search {\\r\\n width: 35px;\\r\\n height: 34px;\\r\\n float: right;\\r\\n border-radius: 0;\\r\\n margin-top: -34px;\\r\\n border: 0;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control-search .btn-search-advance {\\r\\n width: 35px;\\r\\n height: 34px;\\r\\n float: right;\\r\\n right: 35px;\\r\\n border-radius: 0;\\r\\n margin-top: -34px;\\r\\n border: 0;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control-search .btn-check {\\r\\n width: 35px;\\r\\n height: 34px;\\r\\n float: right;\\r\\n border-radius: 0;\\r\\n margin-top: -34px;\\r\\n border: 0;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control-search .btn-remove {\\r\\n background-color: transparent !important;\\r\\n right: 40px;\\r\\n color: black !important;\\r\\n width: 30px;\\r\\n height: 32px;\\r\\n float: right;\\r\\n border-radius: 0;\\r\\n margin-top: -33px;\\r\\n border: 0;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .btn-remove.k-button.k-primary:hover {\\r\\n border: 0 !important;\\r\\n background-color: transparent !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .btn-remove.k-button.k-primary.k-outline:focus,\\r\\n:host ::ng-deep .btn-remove.k-button.k-primary.k-outline.k-state-focused {\\r\\n box-shadow: none !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-toolbar {\\r\\n border: 0;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-panelbar>.k-item>.k-link {\\r\\n color: white !important;\\r\\n background-color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .vnpt-upload-img {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .vnpt-upload-img .k-upload {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-editor .k-toolbar .k-button {\\r\\n border-color: rgba(0, 0, 0, 0.08);\\r\\n color: #656565;\\r\\n background-color: #4b4141;\\r\\n background: #f6f6f6;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-editor .k-content {\\r\\n background-color: white !important;\\r\\n height: 100% !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .xdialogchat .k-dialog {\\r\\n height: inherit !important;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-grid th {\\r\\n white-space: normal !important;\\r\\n vertical-align: top;\\r\\n /* padding-top: 15px; */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal {\\r\\n max-width: 1140px;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-grid {\\r\\n border: none !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-grid .k-grid-content {\\r\\n overflow-y: hidden;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-grid .k-pager-wrap {\\r\\n border-color: #ebebeb;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-grid .k-pager-wrap {\\r\\n background-color: inherit;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-tabstrip .k-content {\\r\\n background-color: inherit;\\r\\n border: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-tabstrip-top>.k-tabstrip-items {\\r\\n border: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .tableRow {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .rowTitle {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n font-size: 16px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .rowTitleAccount {\\r\\n align-items: center;\\r\\n font-size: 16px;\\r\\n color: navy;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .container {\\r\\n padding: 20px;\\r\\n background-color: #f5f5f5;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .group {\\r\\n margin-top: 20px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .group-header {\\r\\n padding-top: 10px;\\r\\n border-bottom: 2px solid #006CB7;\\r\\n padding-left: 0px;\\r\\n font-size: 15px;\\r\\n color: white;\\r\\n font-weight: 500;\\r\\n background-color: white;\\r\\n /* text-transform: capitalize; */\\r\\n padding-bottom: 0.12%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-tabstrip-items .k-link {\\r\\n padding: 6px 12px;\\r\\n color: inherit;\\r\\n cursor: pointer;\\r\\n display: inline-flex;\\r\\n vertical-align: middle;\\r\\n flex: 1 1 auto;\\r\\n flex-direction: row;\\r\\n align-content: center;\\r\\n align-items: center;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .group-header>span:first-child {\\r\\n background-color: #006CB7;\\r\\n padding: 9px 10px 4px 10px\\r\\n}\\r\\n\\r\\n/* :host ::ng-deep .portal .k-grid-content {\\r\\n margin-bottom: 30px;\\r\\n} */\\r\\n\\r\\n:host ::ng-deep .k-pager-nav,\\r\\n:host ::ng-deep .k-pager-info,\\r\\n:host ::ng-deep .portal .k-grid tbody tr,\\r\\n:host ::ng-deep .portal .k-grid tbody tr:hover,\\r\\n:host ::ng-deep .portal .k-grid tbody tr.k-state-hover {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .group-body {\\r\\n margin-top: 20px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .group-body-border {\\r\\n margin-top: 20px;\\r\\n /* background-color: #f5f5f5; */\\r\\n padding: 15px;\\r\\n border: 1px solid #cacaca\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .group-body .group-body-item {\\r\\n margin-bottom: 20px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .group-body .group-body-item:hover {\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .group-body-item i {\\r\\n color: #989898;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .btn-send {\\r\\n color: white;\\r\\n background-color: #006CB7;\\r\\n padding: 7px 12px;\\r\\n float: right;\\r\\n border: none !important;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-grid td {\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-grid-border td {\\r\\n border-width: 1px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-grid.k-grid tr.k-alt {\\r\\n background-color: inherit;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-grid td.k-state-selected,\\r\\n:host ::ng-deep .portal-grid tr.k-state-selected>td {\\r\\n background-color: inherit !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .group2 {\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .input-row {\\r\\n width: 100%;\\r\\n font-size: 16px !important;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .group-header-2 {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n padding-left: 14px;\\r\\n font-size: 20px;\\r\\n color: black;\\r\\n font-weight: bold;\\r\\n /* background-color: #006CB7; */\\r\\n width: 50%;\\r\\n text-transform: capitalize;\\r\\n border-bottom: crimson;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .post-container {\\r\\n width: 750px;\\r\\n /* max-width: 750px; */\\r\\n float: left;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .icon {\\r\\n width: 7px;\\r\\n float: left;\\r\\n font-size: 17px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .icon-title {\\r\\n overflow: hidden;\\r\\n padding-left: 10px;\\r\\n text-align: left;\\r\\n font-weight: 400;\\r\\n padding-bottom: 10px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .icon-title:hover {\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .item-img {\\r\\n width: 100%;\\r\\n height: 140px;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n /* height: 80%; */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .item-title {\\r\\n overflow: hidden;\\r\\n text-align: left;\\r\\n padding-top: 10px;\\r\\n max-height: 104px;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n/* :host ::ng-deep .text:hover {\\r\\n cursor: pointer;\\r\\n color: yellow;\\r\\n} */\\r\\n\\r\\n:host ::ng-deep .item-img-2 {\\r\\n width: 160px;\\r\\n height: 110px;\\r\\n float: left;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .item-title-2 {\\r\\n overflow: hidden;\\r\\n padding-left: 10px;\\r\\n text-align: left;\\r\\n font-weight: 500;\\r\\n height: 95px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .post-right {\\r\\n /* max-width: 360px; */\\r\\n width: 360px;\\r\\n float: right;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-pager-numeric-buttons {\\r\\n z-index: 0;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .admin .group {\\r\\n margin-top: 10px;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .admin .group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 14px;\\r\\n font-size: 20px;\\r\\n color: #006CB7;\\r\\n font-weight: 500;\\r\\n background-color: #f5f5f5;\\r\\n /* text-transform: capitalize; */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-window {\\r\\n background-color: #f6f6f6;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n /* width: 57%;\\r\\n height: 500px; */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .dialog-info {\\r\\n width: 75% !important;\\r\\n height: 90% !important;\\r\\n z-index: 1060 !important;\\r\\n /* max-width: 800px !important;\\r\\n max-height: 600px !important; */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .group-search {\\r\\n color: #006CB7;\\r\\n background-color: #f5f5f5;\\r\\n /* text-transform: capitalize; */\\r\\n padding: 10px 8px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-event {\\r\\n color: #000000;\\r\\n background-color: #63ddff;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scheduler .k-event .k-resize-s,\\r\\n.k-event .k-resize-s {\\r\\n height: .5em;\\r\\n bottom: 0;\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scheduler .k-event .k-resize-n,\\r\\n.k-event .k-resize-n {\\r\\n height: .5em;\\r\\n bottom: 0;\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scheduler .k-event>div,\\r\\n.k-event>div {\\r\\n height: 100%;\\r\\n position: absolute;\\r\\n width: 100%;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scheduler .k-scheduler-footer {\\r\\n border-color: rgba(0, 0, 0, 0.08);\\r\\n color: #656565;\\r\\n background-color: #f6f6f6;\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-dialog-wrapper {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n flex-direction: column;\\r\\n outline: 0;\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n z-index: 10001;\\r\\n left: 0 !important;\\r\\n right: 0;\\r\\n top: 0 !important;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n width: 75% !important;\\r\\n height: 90% !important;\\r\\n z-index: 1060 !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .admin .btn-search {\\r\\n color: white;\\r\\n background-color: #006CB7;\\r\\n padding: 7px 12 px;\\r\\n float: right;\\r\\n border: none !important;\\r\\n font-size: 16px;\\r\\n font-weight: bold;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .w-b {\\r\\n width: 150px;\\r\\n text-transform: capitalize;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .btn-mg-t {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .progress {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .volume-control[_ngcontent-c10] {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .playtime[_ngcontent-c11] {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .visible[_ngcontent-c5] {\\r\\n padding-bottom: 35px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .visible[_ngcontent-c5] {\\r\\n padding-bottom: 35px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .left {\\r\\n padding-left: 90px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .k-grid tr {\\r\\n border-color: inherit;\\r\\n /* float: left; */\\r\\n /* max-width: 25%; */\\r\\n /* height: 290px; */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-grid td {\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .col,\\r\\n:host ::ng-deep .portal .col-1,\\r\\n:host ::ng-deep .portal .col-10,\\r\\n:host ::ng-deep .portal .col-11,\\r\\n:host ::ng-deep .portal .col-12,\\r\\n:host ::ng-deep .portal .col-2,\\r\\n:host ::ng-deep .portal .col-3,\\r\\n:host ::ng-deep .portal .col-4,\\r\\n:host ::ng-deep .portal .col-5,\\r\\n:host ::ng-deep .portal .col-6,\\r\\n:host ::ng-deep .portal .col-7,\\r\\n:host ::ng-deep .portal .col-8,\\r\\n:host ::ng-deep .portal .col-9,\\r\\n:host ::ng-deep .portal .col-auto,\\r\\n:host ::ng-deep .portal .col-lg,\\r\\n:host ::ng-deep .portal .col-lg-1,\\r\\n:host ::ng-deep .portal .col-lg-10,\\r\\n:host ::ng-deep .portal .col-lg-11,\\r\\n:host ::ng-deep .portal .col-lg-12,\\r\\n:host ::ng-deep .portal .col-lg-2,\\r\\n:host ::ng-deep .portal .col-lg-3,\\r\\n:host ::ng-deep .portal .col-lg-4,\\r\\n:host ::ng-deep .portal .col-lg-5,\\r\\n:host ::ng-deep .portal .col-lg-6,\\r\\n:host ::ng-deep .portal .col-lg-7,\\r\\n:host ::ng-deep .portal .col-lg-8,\\r\\n:host ::ng-deep .portal .col-lg-9,\\r\\n:host ::ng-deep .portal .col-lg-auto,\\r\\n:host ::ng-deep .portal .col-md,\\r\\n:host ::ng-deep .portal .col-md-1,\\r\\n:host ::ng-deep .portal .col-md-10,\\r\\n:host ::ng-deep .portal .col-md-11,\\r\\n:host ::ng-deep .portal .col-md-12,\\r\\n:host ::ng-deep .portal .col-md-2,\\r\\n:host ::ng-deep .portal .col-md-3,\\r\\n:host ::ng-deep .portal .col-md-4,\\r\\n:host ::ng-deep .portal .col-md-5,\\r\\n:host ::ng-deep .portal .col-md-6,\\r\\n:host ::ng-deep .portal .col-md-7,\\r\\n:host ::ng-deep .portal .col-md-8,\\r\\n:host ::ng-deep .portal .col-md-9,\\r\\n:host ::ng-deep .portal .col-md-auto,\\r\\n:host ::ng-deep .portal .col-sm,\\r\\n:host ::ng-deep .portal .col-sm-1,\\r\\n:host ::ng-deep .portal .col-sm-10,\\r\\n:host ::ng-deep .portal .col-sm-11,\\r\\n:host ::ng-deep .portal .col-sm-12,\\r\\n:host ::ng-deep .portal .col-sm-2,\\r\\n:host ::ng-deep .portal .col-sm-3,\\r\\n:host ::ng-deep .portal .col-sm-4,\\r\\n:host ::ng-deep .portal .col-sm-5,\\r\\n:host ::ng-deep .portal .col-sm-6,\\r\\n:host ::ng-deep .portal .col-sm-7,\\r\\n:host ::ng-deep .portal .col-sm-8,\\r\\n:host ::ng-deep .portal .col-sm-9,\\r\\n:host ::ng-deep .portal .col-sm-auto,\\r\\n:host ::ng-deep .portal .col-xl,\\r\\n:host ::ng-deep .portal .col-xl-1,\\r\\n:host ::ng-deep .portal .col-xl-10,\\r\\n:host ::ng-deep .portal .col-xl-11,\\r\\n:host ::ng-deep .portal .col-xl-12,\\r\\n:host ::ng-deep .portal .col-xl-2,\\r\\n:host ::ng-deep .portal .col-xl-3,\\r\\n:host ::ng-deep .portal .col-xl-4,\\r\\n:host ::ng-deep .portal .col-xl-5,\\r\\n:host ::ng-deep .portal .col-xl-6,\\r\\n:host ::ng-deep .portal .col-xl-7,\\r\\n:host ::ng-deep .portal .col-xl-8,\\r\\n:host ::ng-deep .portal .col-xl-9,\\r\\n:host ::ng-deep .portal .col-xl-auto {\\r\\n padding-right: 10px;\\r\\n padding-left: 10px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .row {\\r\\n margin-right: 0px;\\r\\n margin-left: 0px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .col-md-20p {\\r\\n position: relative;\\r\\n width: 100%;\\r\\n padding-right: 10px;\\r\\n padding-left: 10px;\\r\\n background-color: #f0f0f0;\\r\\n border: 2px solid white;\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-scheduler-toolbar {\\r\\n border-width: 0;\\r\\n border-bottom-width: 1px;\\r\\n white-space: nowrap;\\r\\n flex-shrink: 0;\\r\\n position: relative;\\r\\n z-index: 0;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scheduler .k-event .k-event-actions .k-icon,\\r\\n.k-event .k-event-actions .k-icon {\\r\\n line-height: normal;\\r\\n font-size: inherit;\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-scheduler-toolbar .k-nav-current .k-lg-date-format {\\r\\n max-width: 400px;\\r\\n}\\r\\n\\r\\n@media (min-width: 768px) {\\r\\n :host ::ng-deep .col-md-20p {\\r\\n flex: 0 0 20%;\\r\\n max-width: 20%;\\r\\n }\\r\\n}\\r\\n\\r\\n:host ::ng-deep .org-chart-style {\\r\\n background-color: #FFCB08;\\r\\n box-shadow: 7px 7px #c1c1c1;\\r\\n text-transform: uppercase;\\r\\n padding: 5px;\\r\\n font-size: 14px;\\r\\n min-width: 65px;\\r\\n color: navy\\r\\n}\\r\\n\\r\\n:host ::ng-deep .org-chart {\\r\\n overflow-x: scroll;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .org-chart-style1 {\\r\\n background-color: #ffffff;\\r\\n box-shadow: 2px 2px 2px 2px #c1c1c1;\\r\\n padding: 10px;\\r\\n font-size: 16px;\\r\\n min-width: 180px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .carousel-control-next,\\r\\n:host ::ng-deep .carousel-control-prev {\\r\\n background: #006CB7;\\r\\n width: 35px;\\r\\n height: 35px;\\r\\n margin: auto;\\r\\n opacity: 1;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .carousel-control-next {\\r\\n margin-left: -10px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .carousel-control-prev {\\r\\n margin-right: -10px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .text:hover {\\r\\n cursor: pointer;\\r\\n color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .text:hover>.summaray {\\r\\n cursor: pointer;\\r\\n color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .google-visualization-orgchart-nodesel {\\r\\n border: none;\\r\\n /* background-color: #fff7ae;\\r\\n background: -webkit-gradient(linear, left top, left bottom, from(#fff7ae), to(#eee79e)); */\\r\\n}\\r\\n\\r\\n:host ::ng-deep .org-chart {\\r\\n width: initial;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .account-avatar {\\r\\n width: 100px;\\r\\n height: 125px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .account-name {\\r\\n font-weight: 500;\\r\\n font-size: 13px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .account-part {\\r\\n font-size: 15px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .border-bt-cus {\\r\\n width: 40px;\\r\\n height: 3px;\\r\\n background-color: #006CB7;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scrollview.k-scrollview-wrap .k-scrollview-prev span,\\r\\ndiv.k-scrollview .k-scrollview-prev span {\\r\\n margin: 0;\\r\\n padding: 6px;\\r\\n vertical-align: middle;\\r\\n font-size: 18px;\\r\\n font-weight: normal;\\r\\n /* background: url(http://localhost:8080/assets/images/arrowL.png); */\\r\\n /* background: url(http://123.30.158.155:8003/assets/images/arrowL.png); */\\r\\n background: url(https://api.congdoantphochiminh.org.vn/assets/images/arrowL.png);\\r\\n background-repeat: no-repeat;\\r\\n background-size: contain;\\r\\n /* background-color: #006cb7; */\\r\\n margin-top: 20px;\\r\\n opacity: .9;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scrollview.k-scrollview-wrap {\\r\\n border: hidden;\\r\\n width: 101.75% !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scrollview.k-scrollview-wrap ul.k-scrollview li>img {\\r\\n padding-left: 10px;\\r\\n padding-right: 10px;\\r\\n min-height: 100%;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scrollview.k-scrollview-wrap .k-scrollview-next span,\\r\\ndiv.k-scrollview .k-scrollview-next span {\\r\\n margin: 0;\\r\\n padding: 6px;\\r\\n vertical-align: middle;\\r\\n font-size: 18px;\\r\\n font-weight: normal;\\r\\n /* background: url(http://localhost:8080/assets/images/arrowR.png); */\\r\\n /* background: url(http://123.30.158.155:8003/assets/images/arrowR.png); */\\r\\n background: url(https://api.congdoantphochiminh.org.vn/assets/images/arrowR.png);\\r\\n background-repeat: no-repeat;\\r\\n background-size: contain;\\r\\n /* background-color: #006cb7; */\\r\\n margin-top: 20px;\\r\\n opacity: .9;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scrollview.k-scrollview-wrap a {\\r\\n top: 40% !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep kendo-scrollview.k-scrollview-wrap .k-scrollview-next,\\r\\ndiv.k-scrollview .k-scrollview-next,\\r\\n:host ::ng-deep kendo-scrollview.k-scrollview-wrap .k-scrollview-prev,\\r\\ndiv.k-scrollview .k-scrollview-prev {\\r\\n color: inherit;\\r\\n background: rgba(0, 0, 0, 0);\\r\\n text-shadow: rgba(0, 0, 0, 0.3) 0 0 15px;\\r\\n opacity: 1;\\r\\n outline-width: 0;\\r\\n height: 20%;\\r\\n top: 35%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .row {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .italicStyle {\\r\\n font-style: italic;\\r\\n}\\r\\n\\r\\n/* //banner bottom */\\r\\n\\r\\n:host ::ng-deep .p-grid {\\r\\n border: 1px solid #e7e9ec;\\r\\n box-shadow: 2.5px 2.5px 2.5px 2.5px #e7e9ec;\\r\\n border-radius: 3px;\\r\\n text-align: center;\\r\\n /* padding: 2em 0 2.25em 0; */\\r\\n margin-top: 40px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .p-grid img {\\r\\n width: 160px;\\r\\n height: 180px;\\r\\n padding: 10px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .carousel-demo .ui-carousel.custom-carousel .ui-carousel-dot-icon {\\r\\n /* width: 16px !important;\\r\\n height: 16px !important;\\r\\n border-radius: 50%; */\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel .ui-carousel-dots-container .ui-carousel-dot-item.ui-state-highlight .ui-carousel-dot-icon {\\r\\n /* background-color: #007ad9;\\r\\n width: 10px !important;\\r\\n height: 10px !important;\\r\\n border-radius: 50%; */\\r\\n display: none;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel .ui-carousel-dots-container .ui-carousel-dot-item .ui-carousel-dot-icon {\\r\\n /* background-color: #b2c1cd;\\r\\n width: 10px !important;\\r\\n height: 10px !important;\\r\\n border-radius: 50%;\\r\\n margin: 0 0.2em; */\\r\\n display: none;\\r\\n}\\r\\n\\r\\n/* :host ::ng-deep .pi-chevron-left:before {\\r\\n content: \\\"\\\\e919\\\";\\r\\n font-size: medium;\\r\\n transform: rotate(90deg);\\r\\n color: #707070;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .pi-chevron-right:before {\\r\\n content: \\\"\\\\e919\\\";\\r\\n font-size: medium;\\r\\n transform: rotate(270deg);\\r\\n color: #707070;\\r\\n}\\r\\n*/\\r\\n\\r\\n:host ::ng-deep .ui-carousel .ui-carousel-content .ui-carousel-prev {\\r\\n border: solid 0px rgba(178, 193, 205, 0.64);\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel .ui-carousel-content .ui-carousel-next {\\r\\n border: solid 0px rgba(178, 193, 205, 0.64);\\r\\n}\\r\\n\\r\\n/* :host ::ng-deep .ui-carousel-item:nth-child(5n +3) img {\\r\\n height: 235px;\\r\\n width: 220px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel-item:nth-child(5n +3) .p-grid {\\r\\n margin: 10px 3px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel-item:not(:nth-child(5n +3)):hover img {\\r\\n opacity: 1;\\r\\n height: 210px;\\r\\n width: 189px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel-item:not(:nth-child(5n+3)):hover .p-grid {\\r\\n margin: 10px 6px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel-items-container .ui-carousel-item {\\r\\n z-index: -1;\\r\\n margin-right: 10.35px;\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel-items-container .ui-carousel-item:nth-child(5n +2) {\\r\\n margin-right: -27px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel-items-container .ui-carousel-item:nth-child(5n +4) {\\r\\n margin-left: -23px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel-items-container .ui-carousel-item:nth-child(5n +3) {\\r\\n z-index: 1 !important;\\r\\n margin-left: -15px;\\r\\n margin-right: -15px;\\r\\n background-color: white;\\r\\n} */\\r\\n\\r\\n:host ::ng-deep .img-item-content {\\r\\n /* border: 1px solid #b3c2ca; */\\r\\n border-radius: 3px;\\r\\n margin: .3rem;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .banner-bottom button {\\r\\n font-size: 14px !important;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n /* :host ::ng-deep .ui-carousel-item {\\r\\n flex: 1 0 50% !important;\\r\\n } */\\r\\n :host ::ng-deep .p-grid {\\r\\n border: 1px solid #e7e9ec;\\r\\n box-shadow: 2.5px 2.5px 2.5px 2.5px #e7e9ec;\\r\\n border-radius: 3px;\\r\\n text-align: center;\\r\\n margin-top: 0px;\\r\\n }\\r\\n :host ::ng-deep .p-grid img {\\r\\n width: 100% !important;\\r\\n height: 120px !important;\\r\\n padding: 10px;\\r\\n }\\r\\n /* :host ::ng-deep .carousel-demo .ui-carousel .ui-carousel-content .ui-carousel-item .car-data .car-title {\\r\\n font-weight: 700;\\r\\n font-size: 20px;\\r\\n margin-top: 24px;\\r\\n }\\r\\n :host ::ng-deep .carousel-demo .ui-carousel .ui-carousel-content .ui-carousel-item .car-data .car-subtitle {\\r\\n margin: 0.25em 0 2em 0;\\r\\n }\\r\\n :host ::ng-deep .carousel-demo .ui-carousel .ui-carousel-content .ui-carousel-item .car-data button {\\r\\n margin-left: 0.5em;\\r\\n }\\r\\n :host ::ng-deep .carousel-demo .ui-carousel .ui-carousel-content .ui-carousel-item .car-data button:first-child {\\r\\n margin-left: 0;\\r\\n } */\\r\\n :host ::ng-deep .carousel-demo .ui-carousel.custom-carousel .ui-carousel-dot-icon {\\r\\n /* width: 16px !important;\\r\\n height: 16px !important;\\r\\n border-radius: 50%; */\\r\\n display: none;\\r\\n }\\r\\n /* :host ::ng-deep .carousel-demo .ui-carousel.ui-carousel-horizontal .ui-carousel-content .ui-carousel-item.ui-carousel-item-start .car-details>.p-grid {\\r\\n margin-left: 0.6em;\\r\\n }\\r\\n :host ::ng-deep .carousel-demo .ui-carousel.ui-carousel-horizontal .ui-carousel-content .ui-carousel-item.ui-carousel-item-end .car-details>.p-grid {\\r\\n margin-right: 0.6em;\\r\\n } */\\r\\n :host ::ng-deep .ui-carousel .ui-carousel-dots-container .ui-carousel-dot-item.ui-state-highlight .ui-carousel-dot-icon {\\r\\n /* background-color: #007ad9;\\r\\n width: 10px !important;\\r\\n height: 10px !important;\\r\\n border-radius: 50%; */\\r\\n display: none;\\r\\n }\\r\\n :host ::ng-deep .ui-carousel .ui-carousel-dots-container .ui-carousel-dot-item .ui-carousel-dot-icon {\\r\\n /* background-color: #b2c1cd;\\r\\n width: 10px !important;\\r\\n height: 10px !important;\\r\\n border-radius: 50%;\\r\\n margin: 0 0.2em; */\\r\\n display: none;\\r\\n }\\r\\n /* :host ::ng-deep .pi-chevron-left:before {\\r\\n content: \\\"\\\\e919\\\";\\r\\n font-size: medium;\\r\\n transform: rotate(90deg);\\r\\n color: #707070;\\r\\n }\\r\\n :host ::ng-deep .pi-chevron-right:before {\\r\\n content: \\\"\\\\e919\\\";\\r\\n font-size: medium;\\r\\n transform: rotate(270deg);\\r\\n color: #707070;\\r\\n }\\r\\n :host ::ng-deep .ui-carousel .ui-carousel-content .ui-carousel-prev {\\r\\n background-color: #ffffff;\\r\\n height: auto;\\r\\n border: solid 1px rgba(178, 193, 205, 0.64);\\r\\n border-radius: 0;\\r\\n z-index: 1;\\r\\n margin-top: 0px;\\r\\n margin-right: -29px;\\r\\n padding: 3.5px;\\r\\n color: #333333;\\r\\n transition: color 0.2s;\\r\\n }\\r\\n :host ::ng-deep .ui-carousel .ui-carousel-content .ui-carousel-next {\\r\\n background-color: #ffffff;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n padding: 3.5px;\\r\\n margin-top: 0px;\\r\\n margin-left: -29px;\\r\\n border: solid 1px rgba(178, 193, 205, 0.64);\\r\\n border-radius: 0;\\r\\n color: #333333;\\r\\n transition: color 0.2s;\\r\\n } */\\r\\n /* :host ::ng-deep .ui-carousel-item:nth-child(5n +3) .p-grid {\\r\\n margin: 0px;\\r\\n }\\r\\n :host ::ng-deep .ui-carousel-item:not(:nth-child(5n +3)):hover img {\\r\\n opacity: 1;\\r\\n height: auto;\\r\\n width: auto;\\r\\n }\\r\\n :host ::ng-deep .ui-carousel-item:not(:nth-child(5n+3)):hover .p-grid {\\r\\n margin: 0px;\\r\\n }\\r\\n :host ::ng-deep .ui-carousel-items-container .ui-carousel-item {\\r\\n z-index: -1;\\r\\n margin-right: 0px;\\r\\n background-color: white;\\r\\n }\\r\\n :host ::ng-deep .ui-carousel-items-container .ui-carousel-item:nth-child(5n +2) {\\r\\n margin-right: 0px;\\r\\n }\\r\\n :host ::ng-deep .ui-carousel-items-container .ui-carousel-item:nth-child(5n +4) {\\r\\n margin-left: 0px;\\r\\n }\\r\\n :host ::ng-deep .ui-carousel-items-container .ui-carousel-item:nth-child(5n +3) {\\r\\n z-index: 1 !important;\\r\\n margin-left: 0px;\\r\\n margin-right: 0px;\\r\\n background-color: white;\\r\\n } */\\r\\n :host ::ng-deep kendo-scrollview.k-scrollview-wrap a {\\r\\n top: 27% !important;\\r\\n }\\r\\n :host ::ng-deep kendo-scrollview.k-scrollview-wrap ul.k-scrollview li>img {\\r\\n padding-left: 9px;\\r\\n padding-right: 13px;\\r\\n min-height: 100%;\\r\\n width: 100%;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:767px) {\\r\\n :host ::ng-deep .item-img {\\r\\n width: 100%;\\r\\n height: 100px;\\r\\n }\\r\\n :host ::ng-deep .item-title {\\r\\n overflow: hidden;\\r\\n text-align: inherit !important;\\r\\n padding-top: 10px;\\r\\n max-height: 120px;\\r\\n margin-bottom: 15px;\\r\\n font-size: 14px;\\r\\n padding-left: 5px;\\r\\n padding-right: 5px;\\r\\n }\\r\\n :host ::ng-deep .col-md-20p {\\r\\n padding: 0px !important;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (width:768px) {\\r\\n :host ::ng-deep .item-img {\\r\\n width: 100%;\\r\\n height: 115px;\\r\\n }\\r\\n :host ::ng-deep .item-title {\\r\\n overflow: hidden;\\r\\n text-align: inherit !important;\\r\\n padding-top: 10px;\\r\\n max-height: 120px;\\r\\n margin-bottom: 15px;\\r\\n font-size: 14px;\\r\\n padding-left: 5px;\\r\\n padding-right: 5px;\\r\\n }\\r\\n :host ::ng-deep .col-md-20p {\\r\\n padding: 0px !important;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (min-width:768px) {\\r\\n :host ::ng-deep .unit-item-active .img {\\r\\n margin: 2px 0px 0px 1px !important;\\r\\n width: 213px !important;\\r\\n height: 222px !important;\\r\\n }\\r\\n}\\r\\n\\r\\n:host ::ng-deep .post-detail .description img {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .border-after {\\r\\n width: 40px;\\r\\n height: 3px;\\r\\n background-color: #006CB7;\\r\\n margin-top: 7px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep ::-moz-placeholder {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep ::-ms-input-placeholder {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep ::placeholder {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal .control label {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .meeting-week table {\\r\\n border-collapse: collapse !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .meeting-week .k-grid {\\r\\n border-color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .portal-meeting-week .k-grid {\\r\\n width: 93%;\\r\\n}\\r\\n\\r\\n/* :host ::ng-deep .meeting-week .k-grid tr {\\r\\n border-top: 1px solid navy;\\r\\n} */\\r\\n\\r\\n:host ::ng-deep .meeting-week .k-grid td,\\r\\n:host ::ng-deep .meeting-week .k-grid th {\\r\\n vertical-align: top !important;\\r\\n background-color: white;\\r\\n border-color: navy !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .meeting-week .k-grid th {\\r\\n border-bottom: 0 !important;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .meeting-week .k-grid td {\\r\\n padding: 0 !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .meeting-week .k-grid td>div {\\r\\n padding: 8px 12px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .meeting-week .k-grid .k-grid-header {\\r\\n background-color: white;\\r\\n color: navy;\\r\\n font-weight: bold;\\r\\n padding: 0 !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .meeting-week .k-grid .k-grid-content {\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n/* bắt đầu scroll lich tuân */\\r\\n\\r\\n:host ::ng-deep .meeting-week .meeting-week-display .k-grid .k-grid-content {\\r\\n overflow-y: scroll;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n max-height: 300px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .meeting-week .meeting-week-display .k-grid .k-grid-content::-webkit-scrollbar {\\r\\n width: 1px;\\r\\n}\\r\\n\\r\\n/* Track */\\r\\n\\r\\n:host ::ng-deep .meeting-week .meeting-week-display .k-grid .k-grid-content::-webkit-scrollbar-track {\\r\\n background: #f1f1f1;\\r\\n}\\r\\n\\r\\n/* Handle */\\r\\n\\r\\n:host ::ng-deep .meeting-week .meeting-week-display .k-grid .k-grid-content::-webkit-scrollbar-thumb {\\r\\n background: #888;\\r\\n}\\r\\n\\r\\n/* Handle on hover */\\r\\n\\r\\n:host ::ng-deep .meeting-week .meeting-week-display .k-grid .k-grid-content::-webkit-scrollbar-thumb:hover {\\r\\n background: #555;\\r\\n}\\r\\n\\r\\n/* kết thúc scroll lich tuân */\\r\\n\\r\\n:host ::ng-deep .home-page .ui-carousel-item {\\r\\n overflow: hidden !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .control-search input,\\r\\n:host ::ng-deep .k-dateinput .k-dateinput-wrap,\\r\\n:host ::ng-deep .k-grid-norecords,\\r\\n:host ::ng-deep .k-dialog-wrapper label,\\r\\n:host ::ng-deep .group-search label,\\r\\n:host ::ng-deep .k-grid .k-grid-container,\\r\\n:host ::ng-deep .k-grid .k-grouping-row td,\\r\\n:host ::ng-deep .k-treeview,\\r\\n:host ::ng-deep .k-combobox.k-combobox-clearable .k-input,\\r\\n:host ::ng-deep .k-dropdown .k-dropdown-wrap .k-input,\\r\\n:host ::ng-deep .k-textbox:hover,\\r\\n:host ::ng-deep .k-textbox.k-state-hover,\\r\\n:host ::ng-deep .k-textarea:hover,\\r\\n:host ::ng-deep .k-textarea.k-state-hover {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ck-editor__editable_inline {\\r\\n height: 550px;\\r\\n min-height: 550px;\\r\\n background: white;\\r\\n border: 1px solid gray;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .carousel-caption {\\r\\n position: absolute;\\r\\n right: 0;\\r\\n bottom: 0;\\r\\n left: 0;\\r\\n color: #fff;\\r\\n text-align: left;\\r\\n background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, .9) 100%);\\r\\n padding: 15px;\\r\\n z-index: 1;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .carousel-caption a {\\r\\n color: #fff;\\r\\n font-size: 16px;\\r\\n font-family: 'RobotoSlab-Bold';\\r\\n}\\r\\n\\r\\n:host ::ng-deep .carousel-caption a:hover {\\r\\n text-decoration: none;\\r\\n color: yellow;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .ui-carousel .ui-carousel-dots-container {\\r\\n display: none !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .editor-height .ck-editor__editable_inline {\\r\\n min-height: 300px;\\r\\n background: white;\\r\\n border: 1px solid gray;\\r\\n}\\r\\n\\r\\n/* bắt đầu post-summary */\\r\\n\\r\\n:host ::ng-deep .post-summary .ck-editor__editable_inline {\\r\\n height: 150px !important;\\r\\n min-height: 150px !important;\\r\\n background: white;\\r\\n border: 1px solid gray;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .text-tiny {\\r\\n font-size: 0.7em;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .text-small {\\r\\n font-size: 0.85em;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .text-big {\\r\\n font-size: 1.4em;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .text-huge {\\r\\n font-size: 1.8em;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .post-detail .description figcaption {\\r\\n display: block;\\r\\n caption-side: bottom;\\r\\n word-break: break-word;\\r\\n color: hsl(0, 0%, 20%);\\r\\n background-color: hsl(0, 0%, 97%);\\r\\n padding: .6em;\\r\\n font-size: .75em;\\r\\n outline-offset: -1px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n/* kết thúc post-summary */\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 258px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvYXBwLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0VBQXNFOztBQUV0RSxRQUFROztBQUNKLHFEQUFxRDs7QUFDckQsNkNBQTZDOztBQUNqRCxNQUFNOztBQUVOOzs7SUFHSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsb0NBQW9DO0lBQ3BDLCtDQUErQztBQUNuRDs7QUFFQTtJQUNJLDRCQUE0QjtJQUM1QiwwQkFBMEI7SUFDMUIsV0FBVztJQUNYLFlBQVk7SUFDWixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxxQkFBcUI7SUFDckIsV0FBVztJQUNYLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsdUJBQXVCO0lBQ3ZCLDhCQUE4QjtJQUM5QixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksY0FBYztJQUNkLDBCQUEwQjtJQUMxQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCxlQUFlO0FBQ25COztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBOzs7SUFHSSxXQUFXO0lBQ1gseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksV0FBVztJQUNYLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLFlBQVk7SUFDWixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7O0lBRUksMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksV0FBVztBQUNmOztBQUVBOzs7SUFHSSxzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLGdDQUFnQztJQUNoQyxvQ0FBb0M7QUFDeEM7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7O0lBRUksZ0NBQWdDO0lBQ2hDLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsaUJBQWlCO0lBQ2pCLFNBQVM7SUFDVCxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksbURBQW1EO0FBQ3ZEOztBQUVBO0lBQ0ksbUJBQW1CO0FBQ3ZCOztBQUZBO0lBQ0ksbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLFVBQVU7SUFDVixlQUFlO0lBQ2YsTUFBTTtJQUNOLE9BQU87SUFDUCxXQUFXO0lBQ1gsWUFBWTtJQUNaLGNBQWM7SUFDZDs7O3lCQUdxQjtBQUN6Qjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7Ozs7Ozs7Ozs7SUFVSSxXQUFXO0lBQ1gseUJBQXlCO0FBQzdCOztBQUVBOztJQUVJLHdDQUF3QztBQUM1Qzs7QUFFQTs7SUFFSSxxQkFBcUI7SUFDckIseUJBQXlCO0FBQzdCOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTBCSSw0QkFBNEI7SUFDNUIsMkJBQTJCO0lBQzNCLDZCQUE2QjtJQUM3QiwyQkFBMkI7SUFDM0Isb0NBQW9DO0lBQ3BDLHNCQUFzQjtJQUN0QiwyQkFBMkI7SUFDM0IsY0FBYztBQUNsQjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSx5QkFBeUI7QUFDN0I7O0FBRUE7OztJQUdJLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLDZCQUE2QjtBQUNqQzs7QUFFQTtJQUNJLHVCQUF1QjtJQUN2Qix5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixZQUFZO0lBQ1osbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGVBQWU7SUFDZixpQ0FBaUM7QUFDckM7O0FBRUE7SUFDSSxzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSxlQUFlO0lBQ2Ysa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxjQUFjO0FBQ2xCOztBQUdBOzs7S0FHSzs7QUFHTCxXQUFXOztBQUVYO0lBQ0ksbUJBQW1CO0FBQ3ZCOztBQUdBLG9CQUFvQjs7QUFFcEI7SUFDSSxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osT0FBTztJQUNQLFFBQVE7SUFDUixNQUFNO0lBQ04sU0FBUztJQUNULGtCQUFrQjtJQUNsQixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkI7MEJBQ3NCO0FBQzFCOztBQUVBO0lBQ0ksY0FBYztJQUNkLHlCQUF5QjtJQUN6QixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUE7O0lBRUkscUJBQXFCO0lBQ3JCLGFBQWE7SUFDYixlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLGNBQWM7SUFDZCxjQUFjO0lBQ2QsK0JBQStCO0lBQy9CLHVCQUF1QjtJQUN2QixxQkFBcUI7QUFDekI7O0FBRUE7OztJQUdJLHlCQUF5QjtJQUN6QixXQUFXO0FBQ2Y7O0FBRUE7Ozs7O0lBS0ksV0FBVztJQUNYLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLGtDQUFrQztJQUNsQyx1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsZ0JBQWdCO0lBQ2hCLGFBQWE7QUFDakI7O0FBRUE7SUFDSSw0QkFBNEI7QUFDaEM7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsZ0JBQWdCO0FBQ3BCOztBQUVBOztJQUVJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLFNBQVM7QUFDYjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osWUFBWTtJQUNaLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLFNBQVM7QUFDYjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsU0FBUztBQUNiOztBQUVBO0lBQ0ksd0NBQXdDO0lBQ3hDLFdBQVc7SUFDWCx1QkFBdUI7SUFDdkIsV0FBVztJQUNYLFlBQVk7SUFDWixZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixTQUFTO0FBQ2I7O0FBRUE7SUFDSSxvQkFBb0I7SUFDcEIsd0NBQXdDO0FBQzVDOztBQUVBOztJQUVJLDJCQUEyQjtBQUMvQjs7QUFFQTtJQUNJLFNBQVM7QUFDYjs7QUFFQTtJQUNJLHVCQUF1QjtJQUN2QixvQ0FBb0M7QUFDeEM7O0FBRUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGlDQUFpQztJQUNqQyxjQUFjO0lBQ2QseUJBQXlCO0lBQ3pCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGtDQUFrQztJQUNsQyx1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSwwQkFBMEI7SUFDMUIsV0FBVztBQUNmOztBQUVBO0lBQ0ksOEJBQThCO0lBQzlCLG1CQUFtQjtJQUNuQix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLHFCQUFxQjtBQUN6Qjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksWUFBWTtBQUNoQjs7QUFFQTtJQUNJLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLFdBQVc7QUFDZjs7QUFFQTtJQUNJLG1CQUFtQjtJQUNuQixlQUFlO0lBQ2YsV0FBVztJQUNYLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGFBQWE7SUFDYix5QkFBeUI7QUFDN0I7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsZ0NBQWdDO0lBQ2hDLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQix1QkFBdUI7SUFDdkIsZ0NBQWdDO0lBQ2hDLHFCQUFxQjtBQUN6Qjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsZUFBZTtJQUNmLG9CQUFvQjtJQUNwQixzQkFBc0I7SUFDdEIsY0FBYztJQUNkLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLFdBQVc7QUFDZjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QjtBQUNKOztBQUdBOztHQUVHOztBQUVIOzs7OztJQUtJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQiwrQkFBK0I7SUFDL0IsYUFBYTtJQUNiO0FBQ0o7O0FBRUE7SUFDSSxtQkFBbUI7SUFDbkIsV0FBVztBQUNmOztBQUVBO0lBQ0ksY0FBYztBQUNsQjs7QUFFQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxZQUFZO0lBQ1oseUJBQXlCO0lBQ3pCLGlCQUFpQjtJQUNqQixZQUFZO0lBQ1osdUJBQXVCO0lBQ3ZCLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSx5QkFBeUI7QUFDN0I7O0FBRUE7O0lBRUksb0NBQW9DO0FBQ3hDOztBQUVBO0lBQ0ksbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksV0FBVztJQUNYLDBCQUEwQjtJQUMxQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQiwrQkFBK0I7SUFDL0IsVUFBVTtJQUNWLDBCQUEwQjtJQUMxQixzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osc0JBQXNCO0lBQ3RCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLFVBQVU7SUFDVixXQUFXO0lBQ1gsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsV0FBVztBQUNmOztBQUVBO0lBQ0ksY0FBYztBQUNsQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0lBQ2Isb0JBQWlCO09BQWpCLGlCQUFpQjtJQUNqQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsbUJBQW1CO0FBQ3ZCOztBQUdBOzs7R0FHRzs7QUFFSDtJQUNJLFlBQVk7SUFDWixhQUFhO0lBQ2IsV0FBVztJQUNYLG9CQUFpQjtPQUFqQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLHNCQUFzQjtJQUN0QixZQUFZO0lBQ1osWUFBWTtBQUNoQjs7QUFFQTtJQUNJLFVBQVU7QUFDZDs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLDhCQUE4QjtJQUM5QixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIseUJBQXlCO0lBQ3pCLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixXQUFXO0lBQ1gsWUFBWTtJQUNaO29CQUNnQjtBQUNwQjs7QUFFQTtJQUNJLHFCQUFxQjtJQUNyQixzQkFBc0I7SUFDdEIsd0JBQXdCO0lBQ3hCO21DQUMrQjtBQUNuQzs7QUFFQTtJQUNJLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsZ0NBQWdDO0lBQ2hDLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsZUFBZTtBQUNuQjs7QUFFQTs7SUFFSSxZQUFZO0lBQ1osU0FBUztJQUNULGFBQWE7QUFDakI7O0FBRUE7O0lBRUksWUFBWTtJQUNaLFNBQVM7SUFDVCxhQUFhO0FBQ2pCOztBQUVBOztJQUVJLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsV0FBVztJQUNYLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxpQ0FBaUM7SUFDakMsY0FBYztJQUNkLHlCQUF5QjtJQUN6QixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLFVBQVU7SUFDVixlQUFlO0lBQ2YsTUFBTTtJQUNOLE9BQU87SUFDUCxXQUFXO0lBQ1gsWUFBWTtJQUNaLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLGlCQUFpQjtJQUNqQixTQUFTO0lBQ1QsWUFBWTtJQUNaLHFCQUFxQjtJQUNyQixzQkFBc0I7SUFDdEIsd0JBQXdCO0FBQzVCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLHlCQUF5QjtJQUN6QixrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLFlBQVk7SUFDWiwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxxQkFBcUI7SUFDckIsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxVQUFVO0FBQ2Q7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFzRUksbUJBQW1CO0lBQ25CLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLHVCQUF1QjtJQUN2QixlQUFlO0FBQ25COztBQUVBO0lBQ0ksZUFBZTtJQUNmLHdCQUF3QjtJQUN4QixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLGtCQUFrQjtJQUNsQixVQUFVO0FBQ2Q7O0FBRUE7O0lBRUksbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUVBO0tBQ0s7UUFDRyxhQUFhO1FBQ2IsY0FBYztJQUNsQjtBQUNKOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLDJCQUEyQjtJQUMzQix5QkFBeUI7SUFDekIsWUFBWTtJQUNaLGVBQWU7SUFDZixlQUFlO0lBQ2Y7QUFDSjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixtQ0FBbUM7SUFDbkMsYUFBYTtJQUNiLGVBQWU7SUFDZixnQkFBZ0I7QUFDcEI7O0FBRUE7O0lBRUksbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxZQUFZO0lBQ1osWUFBWTtJQUNaLFVBQVU7QUFDZDs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGVBQWU7SUFDZix5QkFBeUI7QUFDN0I7O0FBRUE7SUFDSSxlQUFlO0lBQ2YseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksWUFBWTtJQUNaOzhGQUMwRjtBQUM5Rjs7QUFFQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsV0FBVztBQUNmOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFdBQVc7QUFDZjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxXQUFXO0lBQ1gseUJBQXlCO0FBQzdCOztBQUVBOztJQUVJLFNBQVM7SUFDVCxZQUFZO0lBQ1osc0JBQXNCO0lBQ3RCLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIscUVBQXFFO0lBQ3JFLDBFQUEwRTtJQUMxRSxnRkFBZ0Y7SUFDaEYsNEJBQTRCO0lBQzVCLHdCQUF3QjtJQUN4QiwrQkFBK0I7SUFDL0IsZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksY0FBYztJQUNkLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsZ0JBQWdCO0lBQ2hCLFdBQVc7QUFDZjs7QUFFQTs7SUFFSSxTQUFTO0lBQ1QsWUFBWTtJQUNaLHNCQUFzQjtJQUN0QixlQUFlO0lBQ2YsbUJBQW1CO0lBQ25CLHFFQUFxRTtJQUNyRSwwRUFBMEU7SUFDMUUsZ0ZBQWdGO0lBQ2hGLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsK0JBQStCO0lBQy9CLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLG1CQUFtQjtBQUN2Qjs7QUFFQTs7OztJQUlJLGNBQWM7SUFDZCw0QkFBNEI7SUFDNUIsd0NBQXdDO0lBQ3hDLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLFFBQVE7QUFDWjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFHQSxvQkFBb0I7O0FBRXBCO0lBQ0kseUJBQXlCO0lBQ3pCLDJDQUEyQztJQUMzQyxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLDZCQUE2QjtJQUM3QixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osYUFBYTtJQUNiLGFBQWE7QUFDakI7O0FBRUE7SUFDSTs7eUJBRXFCO0lBQ3JCLGFBQWE7QUFDakI7O0FBRUE7SUFDSTs7O3lCQUdxQjtJQUNyQixhQUFhO0FBQ2pCOztBQUVBO0lBQ0k7Ozs7c0JBSWtCO0lBQ2xCLGFBQWE7QUFDakI7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Q0FhQzs7QUFFRDtJQUNJLDJDQUEyQztBQUMvQzs7QUFFQTtJQUNJLDJDQUEyQztBQUMvQzs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7O0FBRUg7SUFDSSwrQkFBK0I7SUFDL0Isa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSTs7T0FFRztLQUNGO1FBQ0cseUJBQXlCO1FBQ3pCLDJDQUEyQztRQUMzQyxrQkFBa0I7UUFDbEIsa0JBQWtCO1FBQ2xCLGVBQWU7SUFDbkI7S0FDQztRQUNHLHNCQUFzQjtRQUN0Qix3QkFBd0I7UUFDeEIsYUFBYTtJQUNqQjtJQUNBOzs7Ozs7Ozs7Ozs7O09BYUc7S0FDRjtRQUNHOzs2QkFFcUI7UUFDckIsYUFBYTtJQUNqQjtJQUNBOzs7OztPQUtHO0tBQ0Y7UUFDRzs7OzZCQUdxQjtRQUNyQixhQUFhO0lBQ2pCO0tBQ0M7UUFDRzs7OzswQkFJa0I7UUFDbEIsYUFBYTtJQUNqQjtJQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1DRztJQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EyQkc7S0FDRjtRQUNHLG1CQUFtQjtJQUN2QjtLQUNDO1FBQ0csaUJBQWlCO1FBQ2pCLG1CQUFtQjtRQUNuQixnQkFBZ0I7UUFDaEIsV0FBVztJQUNmO0FBQ0o7O0FBRUE7S0FDSztRQUNHLFdBQVc7UUFDWCxhQUFhO0lBQ2pCO0tBQ0M7UUFDRyxnQkFBZ0I7UUFDaEIsOEJBQThCO1FBQzlCLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFDakIsbUJBQW1CO1FBQ25CLGVBQWU7UUFDZixpQkFBaUI7UUFDakIsa0JBQWtCO0lBQ3RCO0tBQ0M7UUFDRyx1QkFBdUI7SUFDM0I7QUFDSjs7QUFFQTtLQUNLO1FBQ0csV0FBVztRQUNYLGFBQWE7SUFDakI7S0FDQztRQUNHLGdCQUFnQjtRQUNoQiw4QkFBOEI7UUFDOUIsaUJBQWlCO1FBQ2pCLGlCQUFpQjtRQUNqQixtQkFBbUI7UUFDbkIsZUFBZTtRQUNmLGlCQUFpQjtRQUNqQixrQkFBa0I7SUFDdEI7S0FDQztRQUNHLHVCQUF1QjtJQUMzQjtBQUNKOztBQUVBO0tBQ0s7UUFDRyxrQ0FBa0M7UUFDbEMsdUJBQXVCO1FBQ3ZCLHdCQUF3QjtJQUM1QjtBQUNKOztBQUVBO0lBQ0ksV0FBVztBQUNmOztBQUVBO0lBQ0ksV0FBVztJQUNYLFdBQVc7SUFDWCx5QkFBeUI7SUFDekIsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLFdBQVc7QUFDZjs7QUFGQTtJQUNJLFdBQVc7QUFDZjs7QUFGQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLFVBQVU7QUFDZDs7QUFFQTs7R0FFRzs7QUFFSDs7SUFFSSw4QkFBOEI7SUFDOUIsdUJBQXVCO0lBQ3ZCLDZCQUE2QjtBQUNqQzs7QUFFQTtJQUNJLDJCQUEyQjtJQUMzQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSx1QkFBdUI7SUFDdkIsV0FBVztJQUNYLGlCQUFpQjtJQUNqQixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBR0EsNkJBQTZCOztBQUU3QjtJQUNJLGtCQUFrQjtJQUNsQiwyQkFBbUI7SUFBbkIsd0JBQW1CO0lBQW5CLG1CQUFtQjtJQUNuQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxVQUFVO0FBQ2Q7O0FBR0EsVUFBVTs7QUFFVjtJQUNJLG1CQUFtQjtBQUN2Qjs7QUFHQSxXQUFXOztBQUVYO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUdBLG9CQUFvQjs7QUFFcEI7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBR0EsOEJBQThCOztBQUU5QjtJQUNJLDJCQUEyQjtBQUMvQjs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7SUFjSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLFNBQVM7SUFDVCxPQUFPO0lBQ1AsV0FBVztJQUNYLGdCQUFnQjtJQUNoQix5RkFBeUY7SUFDekYsYUFBYTtJQUNiLFVBQVU7SUFDVixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsZUFBZTtJQUNmLDhCQUE4QjtBQUNsQzs7QUFFQTtJQUNJLHFCQUFxQjtJQUNyQixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksd0JBQXdCO0FBQzVCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixzQkFBc0I7QUFDMUI7O0FBR0EseUJBQXlCOztBQUV6QjtJQUNJLHdCQUF3QjtJQUN4Qiw0QkFBNEI7SUFDNUIsaUJBQWlCO0lBQ2pCLHNCQUFzQjtBQUMxQjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGNBQWM7SUFDZCxvQkFBb0I7SUFDcEIsc0JBQXNCO0lBQ3RCLHNCQUFzQjtJQUN0QixpQ0FBaUM7SUFDakMsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixvQkFBb0I7SUFDcEIsa0JBQWtCO0FBQ3RCOztBQUNBLDBCQUEwQjs7QUFHMUI7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakIiLCJmaWxlIjoic3JjL2FwcC9hcHAuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIEBpbXBvcnQgJ0Bhbmd1bGFyL21hdGVyaWFsL3ByZWJ1aWx0LXRoZW1lcy9kZWVwcHVycGxlLWFtYmVyLmNzcyc7ICovXHJcblxyXG4vKiAqIHsgKi9cclxuICAgIC8qIGZvbnQtZmFtaWx5OiBcIk9wZW4gU2Fuc1wiLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7ICovXHJcbiAgICAvKiBBZGQgIWltcG9ydGFudCB0byBvdmVyd3JpdGUgYWxsIGVsZW1lbnRzICovXHJcbi8qIH0gKi9cclxuXHJcbjpob3N0IDo6bmctZGVlcCBodG1sLFxyXG46aG9zdCA6Om5nLWRlZXAgYm9keSxcclxuOmhvc3QgOjpuZy1kZWVwIC5kYXNoYm9hcmQtbWFpbi13cmFwcGVyIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50O1xyXG4gICAgZm9udC1mYW1pbHk6IFwiT3BlbiBTYW5zXCIsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5iZyB7XHJcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5rLXRvb2xiYXIgLmstYnV0dG9uLWljb24ge1xyXG4gICAgYm9yZGVyLXJhZGl1czogMjUlO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstZGlhbG9nLXRpdGxlYmFyIHtcclxuICAgIGJvcmRlci1jb2xvcjogaW5oZXJpdDtcclxuICAgIGNvbG9yOiAjZmZmO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNztcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5yb3V0ZXItb3V0bGV0LWNvbnRlbnQge1xyXG4gICAgcGFkZGluZzogOHB4O1xyXG4gICAgbWFyZ2luLXRvcDogNTdweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogI2VmZjBmMCAqL1xyXG4gICAgLyogcGhvbmcgKi9cclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5yb3V0ZXItb3V0bGV0LWNvbnRlbnQ+aGVhZGVyPmkge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICBtYXJnaW4tdG9wOiA4cHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5yb3V0ZXItb3V0bGV0LWNvbnRlbnQ+aGVhZGVyPmg0IHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY29udHJvbCB7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA3cHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY29udHJvbD4qIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmNvbnRyb2wgbGFiZWwge1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMDtcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY29udHJvbCAudGV4dCB7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDdweDtcclxuICAgIGNvbG9yOiAjMDA2N2IyO1xyXG4gICAgZm9udC1zaXplOiAxN3B4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnN0aWNreS10b29sYmFyLWJ0bi11c2VyIC5rLXRvb2xiYXIge1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMHB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstdG9vbGJhciB7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1wYW5lbGJhcj4uay1pdGVtPi5rLWxpbmssXHJcbjpob3N0IDo6bmctZGVlcCAuay1wYW5lbGJhcj4uay1pdGVtPi5rLWxpbmsuay1zdGF0ZS1zZWxlY3RlZDpob3ZlcixcclxuOmhvc3QgOjpuZy1kZWVwIC5rLXBhbmVsYmFyPi5rLWl0ZW0+LmstbGluay5rLXN0YXRlLXNlbGVjdGVkLmstc3RhdGUtaG92ZXIge1xyXG4gICAgY29sb3I6ICNmZmY7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlN2U3O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstcGFuZWxiYXI+LmstaXRlbT4uay1saW5rLmstc3RhdGUtc2VsZWN0ZWQge1xyXG4gICAgY29sb3I6ICNmZmY7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlN2U3O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstcGFuZWxiYXIgLmstY29udGVudCB7XHJcbiAgICBwYWRkaW5nOiA3cHg7XHJcbiAgICBiYWNrZ3JvdW5kOiAjZjFmMWYxO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstcGFuZWxiYXIgLmstY29udGVudCAuZnVuYyB7XHJcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstYnV0dG9uLWljb250ZXh0IHNwYW4ge1xyXG4gICAgcGFkZGluZy1sZWZ0OiAycHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCBpbnB1dCxcclxuOmhvc3QgOjpuZy1kZWVwIGJ1dHRvbiB7XHJcbiAgICBmb250LXNpemU6IDE3cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIGtlbmRvLXRleHRib3gtY29udGFpbmVyIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstYnV0dG9uLmstcHJpbWFyeSxcclxuOmhvc3QgOjpuZy1kZWVwIC5rLWJ1dHRvbi5rLXByaW1hcnksXHJcbjpob3N0IDo6bmctZGVlcCAuay1zbGlkZXIgLmstZHJhZ2hhbmRsZSB7XHJcbiAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcclxuICAgIGJvcmRlci1jb2xvcjogIzM4OTdmMCAhaW1wb3J0YW50O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzM4OTdmMCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstdGV4dGJveC1jb250YWluZXIge1xyXG4gICAgZm9udC1zaXplOiAyMXB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1idXR0b24uay1wcmltYXJ5OmhvdmVyLFxyXG46aG9zdCA6Om5nLWRlZXAgLmstc2xpZGVyIC5rLWRyYWdoYW5kbGU6aG92ZXIge1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjMWI2ZGI5ICFpbXBvcnRhbnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMWI2ZGI5ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAud2luZG93LWNlbnRlciB7XHJcbiAgICBsZWZ0OiAwICFpbXBvcnRhbnQ7XHJcbiAgICByaWdodDogMDtcclxuICAgIHRvcDogMCAhaW1wb3J0YW50O1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG59XHJcblxyXG4uc3dhbC13YXJuaW5nIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAxOTMsIDcsIDAuOCkgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwICo6OnNlbGVjdGlvbiB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjMDA2Q0I3O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstZGlhbG9nLXdyYXBwZXIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBvdXRsaW5lOiAwO1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgei1pbmRleDogMTAwMDE7XHJcbiAgICAvKiB3aWR0aDogNzAlO1xyXG4gICAgaGVpZ2h0OiA5MCU7XHJcbiAgICBtYXJnaW4tdG9wOiAzMHB4O1xyXG4gICAgbWFyZ2luLWxlZnQ6IDIyN3B4OyAqL1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstZGlhbG9nLWJ1dHRvbmdyb3VwIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1saXN0IC5rLWl0ZW0uay1zdGF0ZS1zZWxlY3RlZCxcclxuOmhvc3QgOjpuZy1kZWVwIC5rLWxpc3Qtb3B0aW9ubGFiZWwuay1zdGF0ZS1zZWxlY3RlZCxcclxuOmhvc3QgOjpuZy1kZWVwIC5rLWxpc3QtY29udGFpbmVyIC5rLWJ1dHRvbjphY3RpdmUsXHJcbjpob3N0IDo6bmctZGVlcCAuay1saXN0LWNvbnRhaW5lciAuay1idXR0b24uay1zdGF0ZS1hY3RpdmUsXHJcbjpob3N0IDo6bmctZGVlcCAuay1jb2x1bW4tbWVudSAuay1tZW51Om5vdCguay1jb250ZXh0LW1lbnUpIC5rLWl0ZW0uay1zdGF0ZS1zZWxlY3RlZCxcclxuOmhvc3QgOjpuZy1kZWVwIC5rLXNwcmVhZHNoZWV0LXBvcHVwIC5rLWJ1dHRvbjphY3RpdmUsXHJcbjpob3N0IDo6bmctZGVlcCAuay1zcHJlYWRzaGVldC1wb3B1cCAuay1idXR0b24uay1zdGF0ZS1hY3RpdmUsXHJcbjpob3N0IDo6bmctZGVlcCAuay1zcHJlYWRzaGVldC1wb3B1cCAuay1idXR0b24uay1zdGF0ZS1zZWxlY3RlZCxcclxuOmhvc3QgOjpuZy1kZWVwIC5rLW1lbnUtZ3JvdXAgLmstaXRlbS5rLXN0YXRlLXNlbGVjdGVkLFxyXG46aG9zdCA6Om5nLWRlZXAgLmstbWVudS5rLWNvbnRleHQtbWVudSAuay1pdGVtLmstc3RhdGUtc2VsZWN0ZWQge1xyXG4gICAgY29sb3I6ICNmZmY7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstZ3JpZCB0ZC5rLXN0YXRlLXNlbGVjdGVkLFxyXG46aG9zdCA6Om5nLWRlZXAgLmstZ3JpZCB0ci5rLXN0YXRlLXNlbGVjdGVkPnRkIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMSwgNjksIDE0MiwgMC4yNSk7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1wYWdlci1udW1iZXJzIC5rLXN0YXRlLXNlbGVjdGVkLFxyXG46aG9zdCA6Om5nLWRlZXAgLmstY2hlY2tib3g6Y2hlY2tlZCsuay1jaGVja2JveC1sYWJlbDo6YmVmb3JlIHtcclxuICAgIGJvcmRlci1jb2xvcjogIzAwNkNCNztcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjc7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAubi1iZyBpbnB1dCAuay10ZXh0Ym94LWZvY3VzZWQsXHJcbjpob3N0IDo6bmctZGVlcCAubi1iZyAuay1kYXRlaW5wdXQuay1zdGF0ZS1kaXNhYmxlZD4uay10ZXh0Ym94OmhvdmVyLFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgLmstbWFza2VkdGV4dGJveC5rLXN0YXRlLWRpc2FibGVkPi5rLXRleHRib3g6aG92ZXIsXHJcbjpob3N0IDo6bmctZGVlcCAubi1iZyAuay1tdWx0aXNlbGVjdC13cmFwLFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgaW5wdXQuay10ZXh0Ym94LFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgdGV4dGFyZWEuay10ZXh0Ym94LFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgLmstaW5wdXQsXHJcbjpob3N0IDo6bmctZGVlcCAubi1iZyAuay10ZXh0Ym94PmlucHV0LFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgaW5wdXQuay10ZXh0Ym94OmhvdmVyLFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgdGV4dGFyZWEuay10ZXh0Ym94LFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgdGV4dGFyZWEuay10ZXh0Ym94OmhvdmVyLFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgLmlucHV0LWdyb3VwIHNwYW4gOmhvc3QgOjpuZy1kZWVwIC5uLWJnIC5rLWF1dG9jb21wbGV0ZSxcclxuOmhvc3QgOjpuZy1kZWVwIC5uLWJnIC5rLWZsYXRjb2xvcnBpY2tlciAuay1jb2xvci12YWx1ZSxcclxuOmhvc3QgOjpuZy1kZWVwIC5uLWJnIC5rLWNvbWJvYm94IC5rLWRyb3Bkb3duLXdyYXAsXHJcbjpob3N0IDo6bmctZGVlcCAubi1iZyAuay1kYXRlcGlja2VyIC5rLXBpY2tlci13cmFwLFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgLmstdGltZXBpY2tlciAuay1waWNrZXItd3JhcCxcclxuOmhvc3QgOjpuZy1kZWVwIC5uLWJnIC5rLWRhdGV0aW1lcGlja2VyIC5rLXBpY2tlci13cmFwLFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgLmstZGF0ZWlucHV0IC5rLWRhdGVpbnB1dC13cmFwLFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgLmstdGV4dGJveCxcclxuOmhvc3QgOjpuZy1kZWVwIC5uLWJnIC5rLXRleHRhcmVhLFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgLmstaW5wdXQuay10ZXh0Ym94LFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgLmstbXVsdGlzZWxlY3Qtd3JhcCxcclxuOmhvc3QgOjpuZy1kZWVwIC5uLWJnIC5rLW51bWVyaWN0ZXh0Ym94IC5rLW51bWVyaWMtd3JhcCxcclxuOmhvc3QgOjpuZy1kZWVwIC5uLWJnIC5rLWRyb3Bkb3duLXdyYXAsXHJcbjpob3N0IDo6bmctZGVlcCAubi1iZyAuay1kcm9wZG93bi13cmFwOmhvdmVyLFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgLmstZGF0ZWlucHV0IHtcclxuICAgIGJvcmRlci1sZWZ0OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICBib3JkZXItdG9wOiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICBib3JkZXItcmlnaHQ6IG5vbmUgIWltcG9ydGFudDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDtcclxuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XHJcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICBjb2xvcjogaW5oZXJpdDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5rLW5vdGlmaWNhdGlvbi13cmFwIHtcclxuICAgIGZvbnQtc2l6ZTogMTlweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5rLW5vdGlmaWNhdGlvbi1zdWNjZXNzIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjc7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAubi1iZyAuay1kcm9wZG93bi13cmFwIC5rLWlucHV0LFxyXG46aG9zdCA6Om5nLWRlZXAgLm4tYmcgLmstZGF0ZWlucHV0LXdyYXAsXHJcbjpob3N0IDo6bmctZGVlcCAubi1iZyAuay1kYXRlaW5wdXQtd3JhcCAuay1pbnB1dCB7XHJcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIGtlbmRvLWJ1dHRvbi1saXN0IC5rLWl0ZW0ge1xyXG4gICAgcGFkZGluZzogMTBweCAyMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAubi1iIC5rLWJ1dHRvbiB7XHJcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcclxuICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7XHJcbiAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay10b29sYmFyIC5rLWJ1dHRvbiB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2N2IyO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgYmFja2dyb3VuZDogIzAwNjdiMjtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5uLWIgLmstYnV0dG9uOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5idG4tY2YgLmstYnV0dG9uIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIGE6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogdHVycXVvaXNlOyAqL1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmJ0biB7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmZsb2F0aW5nLWxhYmVsIHtcclxuICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDFweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5uYXYtaXRlbSBidXR0b24ge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstZmlsdGVyY2VsbC1vcGVyYXRvciB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstbm90aWZpY2F0aW9uLWdyb3VwIHtcclxuICAgIHotaW5kZXg6IDk5OTk5O1xyXG59XHJcblxyXG5cclxuLyogOmhvc3QgOjpuZy1kZWVwIDo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gICAgd2lkdGg6IDVweDtcclxuICAgIGhlaWdodDogNXB4O1xyXG4gIH0gKi9cclxuXHJcblxyXG4vKiBIYW5kbGUgKi9cclxuXHJcbjpob3N0IDo6bmctZGVlcCA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcclxuICAgIGJhY2tncm91bmQ6ICMwMDZDQjc7XHJcbn1cclxuXHJcblxyXG4vKiBIYW5kbGUgb24gaG92ZXIgKi9cclxuXHJcbjpob3N0IDo6bmctZGVlcCA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQ6ICNmZjYzNTg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1ncmlkIHRkLmNoZWNrYm94IHtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIHRkIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XHJcbiAgICB3aWR0aDogMTdweDtcclxuICAgIGhlaWdodDogMTdweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5jbG9zZWQge1xyXG4gICAgY29sb3I6IHllbGxvdztcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5yZXF1aXJlZCB7XHJcbiAgICBjb2xvcjogI2ZmNjM1OCAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZy1sZWZ0OiAzcHg7XHJcbn1cclxuXHJcbi5sb2FkaW5nIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG59XHJcblxyXG4ubG9hZGluZyBpbWcge1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIGtlbmRvLW5vdGlmaWNhdGlvbiB7XHJcbiAgICBtaW4td2lkdGg6IDMwMHB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstbm90aWZpY2F0aW9uIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstbm90aWZpY2F0aW9uIC5rLWljb24ge1xyXG4gICAgZm9udC1zaXplOiAzMHB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstdGFic3RyaXA+LmstY29udGVudCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmICFpbXBvcnRhbnQ7XHJcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XHJcbiAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcclxuICAgIC8qIHBhZGRpbmctbGVmdDogMjBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDIwcHg7ICovXHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay10YWJzdHJpcC1pdGVtcyAuay1pdGVtIHtcclxuICAgIGNvbG9yOiAjMDAwMDAwO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay10YWJzdHJpcC1pdGVtcyAuay1pdGVtOmhvdmVyIHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstdGFic3RyaXAtaXRlbXMgLmstaXRlbS5rLXN0YXRlLWFjdGl2ZSxcclxuOmhvc3QgOjpuZy1kZWVwIC5rLXRhYnN0cmlwLWl0ZW1zIC5rLWl0ZW0uay1zdGF0ZS1zZWxlY3RlZCB7XHJcbiAgICBib3JkZXItY29sb3I6ICMwMDZDQjc7XHJcbiAgICBib3JkZXItdG9wOiAwO1xyXG4gICAgYm9yZGVyLXJpZ2h0OiAwO1xyXG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogM3B4O1xyXG4gICAgYm9yZGVyLWxlZnQ6IDA7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxuICAgIC8qIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjc7ICovXHJcbiAgICAvKiBmb250LXdlaWdodDogYm9sZDsgKi9cclxuICAgIC8qIGZvbnQtc2l6ZTogMjBweDsgKi9cclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5rLXBhbmVsYmFyPi5rLWl0ZW0+LmstbGluayxcclxuOmhvc3QgOjpuZy1kZWVwIC5rLXBhbmVsYmFyPi5rLWl0ZW0+LmstbGluay5rLXN0YXRlLXNlbGVjdGVkOmhvdmVyLFxyXG46aG9zdCA6Om5nLWRlZXAgLmstcGFuZWxiYXI+LmstaXRlbT4uay1saW5rLmstc3RhdGUtc2VsZWN0ZWQuay1zdGF0ZS1ob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlN2U3O1xyXG4gICAgY29sb3I6ICMwMDA7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1ncmlkLWhlYWRlcixcclxuLmstZ3JpZC10b29sYmFyLFxyXG46aG9zdCA6Om5nLWRlZXAgLmstZ3JvdXBpbmctaGVhZGVyLFxyXG4uay1ncmlkLWFkZC1yb3csXHJcbjpob3N0IDo6bmctZGVlcCAuay1ncmlkLWZvb3RlciB7XHJcbiAgICBjb2xvcjogI2ZmZjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjc7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY29tbWVudGdyaWQgLmstZ3JpZC10b29sYmFyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XHJcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5vZmZpY2VncmlkIC5rLWdyaWQtdG9vbGJhciB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjNzA3MDcwO1xyXG4gICAgbWFyZ2luLXRvcDogMjNweDtcclxuICAgIHBhZGRpbmc6IDIwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1ncmlkIC50ciB7XHJcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLm9mZmljZWdyaWQgLmstZ3JpZC1hcmlhLXJvb3Qge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzcwNzA3MDtcclxuICAgIG1hcmdpbi10b3A6IDMwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1maWx0ZXItcm93IHRkLFxyXG46aG9zdCA6Om5nLWRlZXAgLmstZmlsdGVyLXJvdyB0aCB7XHJcbiAgICBwYWRkaW5nOiAzcHggM3B4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstZmlsdGVyLXJvdyAuay10ZXh0Ym94IHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlN2U3ZTc7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1idG4tc3VjY2VzcyB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNWNiODVjO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstYnRuLWRhbmdlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDk1MzRmO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmctY29sLWNoZWNrZWQge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmNvbnRyb2wgbGFiZWwge1xyXG4gICAgY29sb3I6ICM2NTY1NjU7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY29udHJvbC1zZWFyY2ggaW5wdXQge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY29udHJvbC1zZWFyY2ggLmJ0bi1zZWFyY2gge1xyXG4gICAgd2lkdGg6IDM1cHg7XHJcbiAgICBoZWlnaHQ6IDM0cHg7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICBib3JkZXItcmFkaXVzOiAwO1xyXG4gICAgbWFyZ2luLXRvcDogLTM0cHg7XHJcbiAgICBib3JkZXI6IDA7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY29udHJvbC1zZWFyY2ggLmJ0bi1zZWFyY2gtYWR2YW5jZSB7XHJcbiAgICB3aWR0aDogMzVweDtcclxuICAgIGhlaWdodDogMzRweDtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICAgIHJpZ2h0OiAzNXB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMDtcclxuICAgIG1hcmdpbi10b3A6IC0zNHB4O1xyXG4gICAgYm9yZGVyOiAwO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmNvbnRyb2wtc2VhcmNoIC5idG4tY2hlY2sge1xyXG4gICAgd2lkdGg6IDM1cHg7XHJcbiAgICBoZWlnaHQ6IDM0cHg7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICBib3JkZXItcmFkaXVzOiAwO1xyXG4gICAgbWFyZ2luLXRvcDogLTM0cHg7XHJcbiAgICBib3JkZXI6IDA7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY29udHJvbC1zZWFyY2ggLmJ0bi1yZW1vdmUge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcclxuICAgIHJpZ2h0OiA0MHB4O1xyXG4gICAgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7XHJcbiAgICB3aWR0aDogMzBweDtcclxuICAgIGhlaWdodDogMzJweDtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDA7XHJcbiAgICBtYXJnaW4tdG9wOiAtMzNweDtcclxuICAgIGJvcmRlcjogMDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5idG4tcmVtb3ZlLmstYnV0dG9uLmstcHJpbWFyeTpob3ZlciB7XHJcbiAgICBib3JkZXI6IDAgIWltcG9ydGFudDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuYnRuLXJlbW92ZS5rLWJ1dHRvbi5rLXByaW1hcnkuay1vdXRsaW5lOmZvY3VzLFxyXG46aG9zdCA6Om5nLWRlZXAgLmJ0bi1yZW1vdmUuay1idXR0b24uay1wcmltYXJ5Lmstb3V0bGluZS5rLXN0YXRlLWZvY3VzZWQge1xyXG4gICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAga2VuZG8tdG9vbGJhciB7XHJcbiAgICBib3JkZXI6IDA7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1wYW5lbGJhcj4uay1pdGVtPi5rLWxpbmsge1xyXG4gICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAudm5wdC11cGxvYWQtaW1nIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC52bnB0LXVwbG9hZC1pbWcgLmstdXBsb2FkIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1lZGl0b3IgLmstdG9vbGJhciAuay1idXR0b24ge1xyXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDgpO1xyXG4gICAgY29sb3I6ICM2NTY1NjU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNGI0MTQxO1xyXG4gICAgYmFja2dyb3VuZDogI2Y2ZjZmNjtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5rLWVkaXRvciAuay1jb250ZW50IHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XHJcbiAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC54ZGlhbG9nY2hhdCAuay1kaWFsb2cge1xyXG4gICAgaGVpZ2h0OiBpbmhlcml0ICFpbXBvcnRhbnQ7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5rLWdyaWQgdGgge1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbCAhaW1wb3J0YW50O1xyXG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcclxuICAgIC8qIHBhZGRpbmctdG9wOiAxNXB4OyAqL1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCB7XHJcbiAgICBtYXgtd2lkdGg6IDExNDBweDtcclxuICAgIG1hcmdpbjogYXV0bztcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwtZ3JpZCB7XHJcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwtZ3JpZCAuay1ncmlkLWNvbnRlbnQge1xyXG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbC1ncmlkIC5rLXBhZ2VyLXdyYXAge1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjZWJlYmViO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbC1ncmlkIC5rLXBhZ2VyLXdyYXAge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwtdGFic3RyaXAgLmstY29udGVudCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstdGFic3RyaXAtdG9wPi5rLXRhYnN0cmlwLWl0ZW1zIHtcclxuICAgIGJvcmRlcjogbm9uZTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLnRhYmxlUm93IHtcclxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5yb3dUaXRsZSB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAucm93VGl0bGVBY2NvdW50IHtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb250YWluZXIge1xyXG4gICAgcGFkZGluZzogMjBweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5ncm91cCB7XHJcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuZ3JvdXAtaGVhZGVyIHtcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMwMDZDQjc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDBweDtcclxuICAgIGZvbnQtc2l6ZTogMTVweDtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICAgIC8qIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOyAqL1xyXG4gICAgcGFkZGluZy1ib3R0b206IDAuMTIlO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstdGFic3RyaXAtaXRlbXMgLmstbGluayB7XHJcbiAgICBwYWRkaW5nOiA2cHggMTJweDtcclxuICAgIGNvbG9yOiBpbmhlcml0O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgZmxleDogMSAxIGF1dG87XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gICAgYWxpZ24tY29udGVudDogY2VudGVyO1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuZ3JvdXAtaGVhZGVyPnNwYW46Zmlyc3QtY2hpbGQge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNztcclxuICAgIHBhZGRpbmc6IDlweCAxMHB4IDRweCAxMHB4XHJcbn1cclxuXHJcblxyXG4vKiA6aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuay1ncmlkLWNvbnRlbnQge1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMzBweDtcclxufSAqL1xyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5rLXBhZ2VyLW5hdixcclxuOmhvc3QgOjpuZy1kZWVwIC5rLXBhZ2VyLWluZm8sXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5rLWdyaWQgdGJvZHkgdHIsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5rLWdyaWQgdGJvZHkgdHI6aG92ZXIsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5rLWdyaWQgdGJvZHkgdHIuay1zdGF0ZS1ob3ZlciB7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmdyb3VwLWJvZHkge1xyXG4gICAgbWFyZ2luLXRvcDogMjBweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmdyb3VwLWJvZHktYm9yZGVyIHtcclxuICAgIG1hcmdpbi10b3A6IDIwcHg7XHJcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OyAqL1xyXG4gICAgcGFkZGluZzogMTVweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjYWNhY2FcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmdyb3VwLWJvZHkgLmdyb3VwLWJvZHktaXRlbSB7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5ncm91cC1ib2R5IC5ncm91cC1ib2R5LWl0ZW06aG92ZXIge1xyXG4gICAgY29sb3I6ICMwMDZDQjc7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuZ3JvdXAtYm9keS1pdGVtIGkge1xyXG4gICAgY29sb3I6ICM5ODk4OTg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuYnRuLXNlbmQge1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNztcclxuICAgIHBhZGRpbmc6IDdweCAxMnB4O1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsLWdyaWQgdGQge1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwtZ3JpZC1ib3JkZXIgdGQge1xyXG4gICAgYm9yZGVyLXdpZHRoOiAxcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsLWdyaWQuay1ncmlkIHRyLmstYWx0IHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsLWdyaWQgdGQuay1zdGF0ZS1zZWxlY3RlZCxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwtZ3JpZCB0ci5rLXN0YXRlLXNlbGVjdGVkPnRkIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5ncm91cDIge1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5pbnB1dC1yb3cge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBmb250LXNpemU6IDE2cHggIWltcG9ydGFudDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuZ3JvdXAtaGVhZGVyLTIge1xyXG4gICAgcGFkZGluZy10b3A6IDEzcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMTNweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTRweDtcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgIGNvbG9yOiBibGFjaztcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNzsgKi9cclxuICAgIHdpZHRoOiA1MCU7XHJcbiAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcclxuICAgIGJvcmRlci1ib3R0b206IGNyaW1zb247XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9zdC1jb250YWluZXIge1xyXG4gICAgd2lkdGg6IDc1MHB4O1xyXG4gICAgLyogbWF4LXdpZHRoOiA3NTBweDsgKi9cclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmljb24ge1xyXG4gICAgd2lkdGg6IDdweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgZm9udC1zaXplOiAxN3B4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmljb24tdGl0bGUge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5pY29uLXRpdGxlOmhvdmVyIHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLml0ZW0taW1nIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxNDBweDtcclxuICAgIG9iamVjdC1maXQ6IGNvdmVyO1xyXG4gICAgLyogaGVpZ2h0OiA4MCU7ICovXHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuaXRlbS10aXRsZSB7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgbWF4LWhlaWdodDogMTA0cHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG59XHJcblxyXG5cclxuLyogOmhvc3QgOjpuZy1kZWVwIC50ZXh0OmhvdmVyIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGNvbG9yOiB5ZWxsb3c7XHJcbn0gKi9cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuaXRlbS1pbWctMiB7XHJcbiAgICB3aWR0aDogMTYwcHg7XHJcbiAgICBoZWlnaHQ6IDExMHB4O1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICBvYmplY3QtZml0OiBjb3ZlcjtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5pdGVtLXRpdGxlLTIge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICBmb250LXdlaWdodDogNTAwO1xyXG4gICAgaGVpZ2h0OiA5NXB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnBvc3QtcmlnaHQge1xyXG4gICAgLyogbWF4LXdpZHRoOiAzNjBweDsgKi9cclxuICAgIHdpZHRoOiAzNjBweDtcclxuICAgIGZsb2F0OiByaWdodDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIGtlbmRvLXBhZ2VyLW51bWVyaWMtYnV0dG9ucyB7XHJcbiAgICB6LWluZGV4OiAwO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmFkbWluIC5ncm91cCB7XHJcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5hZG1pbiAuZ3JvdXAtaGVhZGVyIHtcclxuICAgIHBhZGRpbmctdG9wOiAxM3B4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEzcHg7XHJcbiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDZDQjc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDE0cHg7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xyXG4gICAgLyogdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7ICovXHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay13aW5kb3cge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjZmNjtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgLyogd2lkdGg6IDU3JTtcclxuICAgIGhlaWdodDogNTAwcHg7ICovXHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuZGlhbG9nLWluZm8ge1xyXG4gICAgd2lkdGg6IDc1JSAhaW1wb3J0YW50O1xyXG4gICAgaGVpZ2h0OiA5MCUgIWltcG9ydGFudDtcclxuICAgIHotaW5kZXg6IDEwNjAgIWltcG9ydGFudDtcclxuICAgIC8qIG1heC13aWR0aDogODAwcHggIWltcG9ydGFudDtcclxuICAgIG1heC1oZWlnaHQ6IDYwMHB4ICFpbXBvcnRhbnQ7ICovXHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuZ3JvdXAtc2VhcmNoIHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcclxuICAgIC8qIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOyAqL1xyXG4gICAgcGFkZGluZzogMTBweCA4cHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1ldmVudCB7XHJcbiAgICBjb2xvcjogIzAwMDAwMDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM2M2RkZmY7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCBrZW5kby1zY2hlZHVsZXIgLmstZXZlbnQgLmstcmVzaXplLXMsXHJcbi5rLWV2ZW50IC5rLXJlc2l6ZS1zIHtcclxuICAgIGhlaWdodDogLjVlbTtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCBrZW5kby1zY2hlZHVsZXIgLmstZXZlbnQgLmstcmVzaXplLW4sXHJcbi5rLWV2ZW50IC5rLXJlc2l6ZS1uIHtcclxuICAgIGhlaWdodDogLjVlbTtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCBrZW5kby1zY2hlZHVsZXIgLmstZXZlbnQ+ZGl2LFxyXG4uay1ldmVudD5kaXYge1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCBrZW5kby1zY2hlZHVsZXIgLmstc2NoZWR1bGVyLWZvb3RlciB7XHJcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wOCk7XHJcbiAgICBjb2xvcjogIzY1NjU2NTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNmY2ZjY7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstZGlhbG9nLXdyYXBwZXIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBvdXRsaW5lOiAwO1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgei1pbmRleDogMTAwMDE7XHJcbiAgICBsZWZ0OiAwICFpbXBvcnRhbnQ7XHJcbiAgICByaWdodDogMDtcclxuICAgIHRvcDogMCAhaW1wb3J0YW50O1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgd2lkdGg6IDc1JSAhaW1wb3J0YW50O1xyXG4gICAgaGVpZ2h0OiA5MCUgIWltcG9ydGFudDtcclxuICAgIHotaW5kZXg6IDEwNjAgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5hZG1pbiAuYnRuLXNlYXJjaCB7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgcGFkZGluZzogN3B4IDEyIHB4O1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIG1hcmdpbi10b3A6IDEwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAudy1iIHtcclxuICAgIHdpZHRoOiAxNTBweDtcclxuICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmJ0bi1tZy10IHtcclxuICAgIG1hcmdpbi10b3A6IDEwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucHJvZ3Jlc3Mge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC52b2x1bWUtY29udHJvbFtfbmdjb250ZW50LWMxMF0ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wbGF5dGltZVtfbmdjb250ZW50LWMxMV0ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC52aXNpYmxlW19uZ2NvbnRlbnQtYzVdIHtcclxuICAgIHBhZGRpbmctYm90dG9tOiAzNXB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnZpc2libGVbX25nY29udGVudC1jNV0ge1xyXG4gICAgcGFkZGluZy1ib3R0b206IDM1cHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAubGVmdCB7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDkwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5rLWdyaWQgdHIge1xyXG4gICAgYm9yZGVyLWNvbG9yOiBpbmhlcml0O1xyXG4gICAgLyogZmxvYXQ6IGxlZnQ7ICovXHJcbiAgICAvKiBtYXgtd2lkdGg6IDI1JTsgKi9cclxuICAgIC8qIGhlaWdodDogMjkwcHg7ICovXHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsLWdyaWQgdGQge1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbCxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC0xLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLTEwLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLTExLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLTEyLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLTIsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtMyxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC00LFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLTUsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtNixcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC03LFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLTgsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtOSxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1hdXRvLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLWxnLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLWxnLTEsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbGctMTAsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbGctMTEsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbGctMTIsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbGctMixcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1sZy0zLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLWxnLTQsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbGctNSxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1sZy02LFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLWxnLTcsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbGctOCxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1sZy05LFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLWxnLWF1dG8sXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbWQsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbWQtMSxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1tZC0xMCxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1tZC0xMSxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1tZC0xMixcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1tZC0yLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLW1kLTMsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbWQtNCxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1tZC01LFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLW1kLTYsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbWQtNyxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1tZC04LFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLW1kLTksXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtbWQtYXV0byxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1zbSxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1zbS0xLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXNtLTEwLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXNtLTExLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXNtLTEyLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXNtLTIsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtc20tMyxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1zbS00LFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXNtLTUsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtc20tNixcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1zbS03LFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXNtLTgsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wtc20tOSxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC1zbS1hdXRvLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXhsLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXhsLTEsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wteGwtMTAsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wteGwtMTEsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wteGwtMTIsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wteGwtMixcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC14bC0zLFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXhsLTQsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wteGwtNSxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC14bC02LFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXhsLTcsXHJcbjpob3N0IDo6bmctZGVlcCAucG9ydGFsIC5jb2wteGwtOCxcclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLmNvbC14bC05LFxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29sLXhsLWF1dG8ge1xyXG4gICAgcGFkZGluZy1yaWdodDogMTBweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwgLnJvdyB7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDBweDtcclxuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY29sLW1kLTIwcCB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwO1xyXG4gICAgYm9yZGVyOiAycHggc29saWQgd2hpdGU7XHJcbiAgICBtYXJnaW4tdG9wOiA1cHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuay1zY2hlZHVsZXItdG9vbGJhciB7XHJcbiAgICBib3JkZXItd2lkdGg6IDA7XHJcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAwO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAga2VuZG8tc2NoZWR1bGVyIC5rLWV2ZW50IC5rLWV2ZW50LWFjdGlvbnMgLmstaWNvbixcclxuLmstZXZlbnQgLmstZXZlbnQtYWN0aW9ucyAuay1pY29uIHtcclxuICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7XHJcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmstc2NoZWR1bGVyLXRvb2xiYXIgLmstbmF2LWN1cnJlbnQgLmstbGctZGF0ZS1mb3JtYXQge1xyXG4gICAgbWF4LXdpZHRoOiA0MDBweDtcclxufVxyXG5cclxuQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XHJcbiAgICAgOmhvc3QgOjpuZy1kZWVwIC5jb2wtbWQtMjBwIHtcclxuICAgICAgICBmbGV4OiAwIDAgMjAlO1xyXG4gICAgICAgIG1heC13aWR0aDogMjAlO1xyXG4gICAgfVxyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLm9yZy1jaGFydC1zdHlsZSB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZDQjA4O1xyXG4gICAgYm94LXNoYWRvdzogN3B4IDdweCAjYzFjMWMxO1xyXG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcclxuICAgIHBhZGRpbmc6IDVweDtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIG1pbi13aWR0aDogNjVweDtcclxuICAgIGNvbG9yOiBuYXZ5XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAub3JnLWNoYXJ0IHtcclxuICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5vcmctY2hhcnQtc3R5bGUxIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XHJcbiAgICBib3gtc2hhZG93OiAycHggMnB4IDJweCAycHggI2MxYzFjMTtcclxuICAgIHBhZGRpbmc6IDEwcHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBtaW4td2lkdGg6IDE4MHB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmNhcm91c2VsLWNvbnRyb2wtbmV4dCxcclxuOmhvc3QgOjpuZy1kZWVwIC5jYXJvdXNlbC1jb250cm9sLXByZXYge1xyXG4gICAgYmFja2dyb3VuZDogIzAwNkNCNztcclxuICAgIHdpZHRoOiAzNXB4O1xyXG4gICAgaGVpZ2h0OiAzNXB4O1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgb3BhY2l0eTogMTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5jYXJvdXNlbC1jb250cm9sLW5leHQge1xyXG4gICAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmNhcm91c2VsLWNvbnRyb2wtcHJldiB7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnRleHQ6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC50ZXh0OmhvdmVyPi5zdW1tYXJheSB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBjb2xvcjogIzAwNkNCNyAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmdvb2dsZS12aXN1YWxpemF0aW9uLW9yZ2NoYXJ0LW5vZGVzZWwge1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogI2ZmZjdhZTtcclxuICAgIGJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGZyb20oI2ZmZjdhZSksIHRvKCNlZWU3OWUpKTsgKi9cclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5vcmctY2hhcnQge1xyXG4gICAgd2lkdGg6IGluaXRpYWw7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuYWNjb3VudC1hdmF0YXIge1xyXG4gICAgd2lkdGg6IDEwMHB4O1xyXG4gICAgaGVpZ2h0OiAxMjVweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5hY2NvdW50LW5hbWUge1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmFjY291bnQtcGFydCB7XHJcbiAgICBmb250LXNpemU6IDE1cHg7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5ib3JkZXItYnQtY3VzIHtcclxuICAgIHdpZHRoOiA0MHB4O1xyXG4gICAgaGVpZ2h0OiAzcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAga2VuZG8tc2Nyb2xsdmlldy5rLXNjcm9sbHZpZXctd3JhcCAuay1zY3JvbGx2aWV3LXByZXYgc3BhbixcclxuZGl2Lmstc2Nyb2xsdmlldyAuay1zY3JvbGx2aWV3LXByZXYgc3BhbiB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiA2cHg7XHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICAgIC8qIGJhY2tncm91bmQ6IHVybChodHRwOi8vbG9jYWxob3N0OjgwODAvYXNzZXRzL2ltYWdlcy9hcnJvd0wucG5nKTsgKi9cclxuICAgIC8qIGJhY2tncm91bmQ6IHVybChodHRwOi8vMTIzLjMwLjE1OC4xNTU6ODAwMy9hc3NldHMvaW1hZ2VzL2Fycm93TC5wbmcpOyAqL1xyXG4gICAgYmFja2dyb3VuZDogdXJsKGh0dHBzOi8vYXBpLmNvbmdkb2FudHBob2NoaW1pbmgub3JnLnZuL2Fzc2V0cy9pbWFnZXMvYXJyb3dMLnBuZyk7XHJcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG4gICAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xyXG4gICAgLyogYmFja2dyb3VuZC1jb2xvcjogIzAwNmNiNzsgKi9cclxuICAgIG1hcmdpbi10b3A6IDIwcHg7XHJcbiAgICBvcGFjaXR5OiAuOTtcclxuICAgIGhlaWdodDogMTAwJTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIGtlbmRvLXNjcm9sbHZpZXcuay1zY3JvbGx2aWV3LXdyYXAge1xyXG4gICAgYm9yZGVyOiBoaWRkZW47XHJcbiAgICB3aWR0aDogMTAxLjc1JSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAga2VuZG8tc2Nyb2xsdmlldy5rLXNjcm9sbHZpZXctd3JhcCB1bC5rLXNjcm9sbHZpZXcgbGk+aW1nIHtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XHJcbiAgICBtaW4taGVpZ2h0OiAxMDAlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCBrZW5kby1zY3JvbGx2aWV3Lmstc2Nyb2xsdmlldy13cmFwIC5rLXNjcm9sbHZpZXctbmV4dCBzcGFuLFxyXG5kaXYuay1zY3JvbGx2aWV3IC5rLXNjcm9sbHZpZXctbmV4dCBzcGFuIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDZweDtcclxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbiAgICBmb250LXNpemU6IDE4cHg7XHJcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gICAgLyogYmFja2dyb3VuZDogdXJsKGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hc3NldHMvaW1hZ2VzL2Fycm93Ui5wbmcpOyAqL1xyXG4gICAgLyogYmFja2dyb3VuZDogdXJsKGh0dHA6Ly8xMjMuMzAuMTU4LjE1NTo4MDAzL2Fzc2V0cy9pbWFnZXMvYXJyb3dSLnBuZyk7ICovXHJcbiAgICBiYWNrZ3JvdW5kOiB1cmwoaHR0cHM6Ly9hcGkuY29uZ2RvYW50cGhvY2hpbWluaC5vcmcudm4vYXNzZXRzL2ltYWdlcy9hcnJvd1IucG5nKTtcclxuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XHJcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XHJcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Y2I3OyAqL1xyXG4gICAgbWFyZ2luLXRvcDogMjBweDtcclxuICAgIG9wYWNpdHk6IC45O1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAga2VuZG8tc2Nyb2xsdmlldy5rLXNjcm9sbHZpZXctd3JhcCBhIHtcclxuICAgIHRvcDogNDAlICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCBrZW5kby1zY3JvbGx2aWV3Lmstc2Nyb2xsdmlldy13cmFwIC5rLXNjcm9sbHZpZXctbmV4dCxcclxuZGl2Lmstc2Nyb2xsdmlldyAuay1zY3JvbGx2aWV3LW5leHQsXHJcbjpob3N0IDo6bmctZGVlcCBrZW5kby1zY3JvbGx2aWV3Lmstc2Nyb2xsdmlldy13cmFwIC5rLXNjcm9sbHZpZXctcHJldixcclxuZGl2Lmstc2Nyb2xsdmlldyAuay1zY3JvbGx2aWV3LXByZXYge1xyXG4gICAgY29sb3I6IGluaGVyaXQ7XHJcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDApO1xyXG4gICAgdGV4dC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4zKSAwIDAgMTVweDtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICBvdXRsaW5lLXdpZHRoOiAwO1xyXG4gICAgaGVpZ2h0OiAyMCU7XHJcbiAgICB0b3A6IDM1JTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5yb3cge1xyXG4gICAgbWFyZ2luLXRvcDogMTBweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5pdGFsaWNTdHlsZSB7XHJcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XHJcbn1cclxuXHJcblxyXG4vKiAvL2Jhbm5lciBib3R0b20gKi9cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucC1ncmlkIHtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNlN2U5ZWM7XHJcbiAgICBib3gtc2hhZG93OiAyLjVweCAyLjVweCAyLjVweCAyLjVweCAjZTdlOWVjO1xyXG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgLyogcGFkZGluZzogMmVtIDAgMi4yNWVtIDA7ICovXHJcbiAgICBtYXJnaW4tdG9wOiA0MHB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnAtZ3JpZCBpbWcge1xyXG4gICAgd2lkdGg6IDE2MHB4O1xyXG4gICAgaGVpZ2h0OiAxODBweDtcclxuICAgIHBhZGRpbmc6IDEwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY2Fyb3VzZWwtZGVtbyAudWktY2Fyb3VzZWwuY3VzdG9tLWNhcm91c2VsIC51aS1jYXJvdXNlbC1kb3QtaWNvbiB7XHJcbiAgICAvKiB3aWR0aDogMTZweCAhaW1wb3J0YW50O1xyXG4gICAgaGVpZ2h0OiAxNnB4ICFpbXBvcnRhbnQ7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7ICovXHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnVpLWNhcm91c2VsIC51aS1jYXJvdXNlbC1kb3RzLWNvbnRhaW5lciAudWktY2Fyb3VzZWwtZG90LWl0ZW0udWktc3RhdGUtaGlnaGxpZ2h0IC51aS1jYXJvdXNlbC1kb3QtaWNvbiB7XHJcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA3YWQ5O1xyXG4gICAgd2lkdGg6IDEwcHggIWltcG9ydGFudDtcclxuICAgIGhlaWdodDogMTBweCAhaW1wb3J0YW50O1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlOyAqL1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbCAudWktY2Fyb3VzZWwtZG90cy1jb250YWluZXIgLnVpLWNhcm91c2VsLWRvdC1pdGVtIC51aS1jYXJvdXNlbC1kb3QtaWNvbiB7XHJcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiAjYjJjMWNkO1xyXG4gICAgd2lkdGg6IDEwcHggIWltcG9ydGFudDtcclxuICAgIGhlaWdodDogMTBweCAhaW1wb3J0YW50O1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgbWFyZ2luOiAwIDAuMmVtOyAqL1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuXHJcbi8qIDpob3N0IDo6bmctZGVlcCAucGktY2hldnJvbi1sZWZ0OmJlZm9yZSB7XHJcbiAgICBjb250ZW50OiBcIlxcZTkxOVwiO1xyXG4gICAgZm9udC1zaXplOiBtZWRpdW07XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XHJcbiAgICBjb2xvcjogIzcwNzA3MDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5waS1jaGV2cm9uLXJpZ2h0OmJlZm9yZSB7XHJcbiAgICBjb250ZW50OiBcIlxcZTkxOVwiO1xyXG4gICAgZm9udC1zaXplOiBtZWRpdW07XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xyXG4gICAgY29sb3I6ICM3MDcwNzA7XHJcbn1cclxuKi9cclxuXHJcbjpob3N0IDo6bmctZGVlcCAudWktY2Fyb3VzZWwgLnVpLWNhcm91c2VsLWNvbnRlbnQgLnVpLWNhcm91c2VsLXByZXYge1xyXG4gICAgYm9yZGVyOiBzb2xpZCAwcHggcmdiYSgxNzgsIDE5MywgMjA1LCAwLjY0KTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbCAudWktY2Fyb3VzZWwtY29udGVudCAudWktY2Fyb3VzZWwtbmV4dCB7XHJcbiAgICBib3JkZXI6IHNvbGlkIDBweCByZ2JhKDE3OCwgMTkzLCAyMDUsIDAuNjQpO1xyXG59XHJcblxyXG5cclxuLyogOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbC1pdGVtOm50aC1jaGlsZCg1biArMykgaW1nIHtcclxuICAgIGhlaWdodDogMjM1cHg7XHJcbiAgICB3aWR0aDogMjIwcHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAudWktY2Fyb3VzZWwtaXRlbTpudGgtY2hpbGQoNW4gKzMpIC5wLWdyaWQge1xyXG4gICAgbWFyZ2luOiAxMHB4IDNweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbC1pdGVtOm5vdCg6bnRoLWNoaWxkKDVuICszKSk6aG92ZXIgaW1nIHtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICBoZWlnaHQ6IDIxMHB4O1xyXG4gICAgd2lkdGg6IDE4OXB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnVpLWNhcm91c2VsLWl0ZW06bm90KDpudGgtY2hpbGQoNW4rMykpOmhvdmVyIC5wLWdyaWQge1xyXG4gICAgbWFyZ2luOiAxMHB4IDZweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbC1pdGVtcy1jb250YWluZXIgLnVpLWNhcm91c2VsLWl0ZW0ge1xyXG4gICAgei1pbmRleDogLTE7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDEwLjM1cHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbC1pdGVtcy1jb250YWluZXIgLnVpLWNhcm91c2VsLWl0ZW06bnRoLWNoaWxkKDVuICsyKSB7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IC0yN3B4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnVpLWNhcm91c2VsLWl0ZW1zLWNvbnRhaW5lciAudWktY2Fyb3VzZWwtaXRlbTpudGgtY2hpbGQoNW4gKzQpIHtcclxuICAgIG1hcmdpbi1sZWZ0OiAtMjNweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbC1pdGVtcy1jb250YWluZXIgLnVpLWNhcm91c2VsLWl0ZW06bnRoLWNoaWxkKDVuICszKSB7XHJcbiAgICB6LWluZGV4OiAxICFpbXBvcnRhbnQ7XHJcbiAgICBtYXJnaW4tbGVmdDogLTE1cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IC0xNXB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbn0gKi9cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuaW1nLWl0ZW0tY29udGVudCB7XHJcbiAgICAvKiBib3JkZXI6IDFweCBzb2xpZCAjYjNjMmNhOyAqL1xyXG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgbWFyZ2luOiAuM3JlbTtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5iYW5uZXItYm90dG9tIGJ1dHRvbiB7XHJcbiAgICBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2OHB4KSB7XHJcbiAgICAvKiA6aG9zdCA6Om5nLWRlZXAgLnVpLWNhcm91c2VsLWl0ZW0ge1xyXG4gICAgICAgIGZsZXg6IDEgMCA1MCUgIWltcG9ydGFudDtcclxuICAgIH0gKi9cclxuICAgICA6aG9zdCA6Om5nLWRlZXAgLnAtZ3JpZCB7XHJcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2U3ZTllYztcclxuICAgICAgICBib3gtc2hhZG93OiAyLjVweCAyLjVweCAyLjVweCAyLjVweCAjZTdlOWVjO1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICAgICAgbWFyZ2luLXRvcDogMHB4O1xyXG4gICAgfVxyXG4gICAgIDpob3N0IDo6bmctZGVlcCAucC1ncmlkIGltZyB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcclxuICAgICAgICBoZWlnaHQ6IDEyMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgcGFkZGluZzogMTBweDtcclxuICAgIH1cclxuICAgIC8qIDpob3N0IDo6bmctZGVlcCAuY2Fyb3VzZWwtZGVtbyAudWktY2Fyb3VzZWwgLnVpLWNhcm91c2VsLWNvbnRlbnQgLnVpLWNhcm91c2VsLWl0ZW0gLmNhci1kYXRhIC5jYXItdGl0bGUge1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XHJcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgICAgIG1hcmdpbi10b3A6IDI0cHg7XHJcbiAgICB9XHJcbiAgICAgOmhvc3QgOjpuZy1kZWVwIC5jYXJvdXNlbC1kZW1vIC51aS1jYXJvdXNlbCAudWktY2Fyb3VzZWwtY29udGVudCAudWktY2Fyb3VzZWwtaXRlbSAuY2FyLWRhdGEgLmNhci1zdWJ0aXRsZSB7XHJcbiAgICAgICAgbWFyZ2luOiAwLjI1ZW0gMCAyZW0gMDtcclxuICAgIH1cclxuICAgICA6aG9zdCA6Om5nLWRlZXAgLmNhcm91c2VsLWRlbW8gLnVpLWNhcm91c2VsIC51aS1jYXJvdXNlbC1jb250ZW50IC51aS1jYXJvdXNlbC1pdGVtIC5jYXItZGF0YSBidXR0b24ge1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwLjVlbTtcclxuICAgIH1cclxuICAgICA6aG9zdCA6Om5nLWRlZXAgLmNhcm91c2VsLWRlbW8gLnVpLWNhcm91c2VsIC51aS1jYXJvdXNlbC1jb250ZW50IC51aS1jYXJvdXNlbC1pdGVtIC5jYXItZGF0YSBidXR0b246Zmlyc3QtY2hpbGQge1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xyXG4gICAgfSAqL1xyXG4gICAgIDpob3N0IDo6bmctZGVlcCAuY2Fyb3VzZWwtZGVtbyAudWktY2Fyb3VzZWwuY3VzdG9tLWNhcm91c2VsIC51aS1jYXJvdXNlbC1kb3QtaWNvbiB7XHJcbiAgICAgICAgLyogd2lkdGg6IDE2cHggIWltcG9ydGFudDtcclxuICAgICAgICBoZWlnaHQ6IDE2cHggIWltcG9ydGFudDtcclxuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7ICovXHJcbiAgICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgIH1cclxuICAgIC8qIDpob3N0IDo6bmctZGVlcCAuY2Fyb3VzZWwtZGVtbyAudWktY2Fyb3VzZWwudWktY2Fyb3VzZWwtaG9yaXpvbnRhbCAudWktY2Fyb3VzZWwtY29udGVudCAudWktY2Fyb3VzZWwtaXRlbS51aS1jYXJvdXNlbC1pdGVtLXN0YXJ0IC5jYXItZGV0YWlscz4ucC1ncmlkIHtcclxuICAgICAgICBtYXJnaW4tbGVmdDogMC42ZW07XHJcbiAgICB9XHJcbiAgICAgOmhvc3QgOjpuZy1kZWVwIC5jYXJvdXNlbC1kZW1vIC51aS1jYXJvdXNlbC51aS1jYXJvdXNlbC1ob3Jpem9udGFsIC51aS1jYXJvdXNlbC1jb250ZW50IC51aS1jYXJvdXNlbC1pdGVtLnVpLWNhcm91c2VsLWl0ZW0tZW5kIC5jYXItZGV0YWlscz4ucC1ncmlkIHtcclxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDAuNmVtO1xyXG4gICAgfSAqL1xyXG4gICAgIDpob3N0IDo6bmctZGVlcCAudWktY2Fyb3VzZWwgLnVpLWNhcm91c2VsLWRvdHMtY29udGFpbmVyIC51aS1jYXJvdXNlbC1kb3QtaXRlbS51aS1zdGF0ZS1oaWdobGlnaHQgLnVpLWNhcm91c2VsLWRvdC1pY29uIHtcclxuICAgICAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA3YWQ5O1xyXG4gICAgICAgIHdpZHRoOiAxMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgaGVpZ2h0OiAxMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOyAqL1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB9XHJcbiAgICAgOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbCAudWktY2Fyb3VzZWwtZG90cy1jb250YWluZXIgLnVpLWNhcm91c2VsLWRvdC1pdGVtIC51aS1jYXJvdXNlbC1kb3QtaWNvbiB7XHJcbiAgICAgICAgLyogYmFja2dyb3VuZC1jb2xvcjogI2IyYzFjZDtcclxuICAgICAgICB3aWR0aDogMTBweCAhaW1wb3J0YW50O1xyXG4gICAgICAgIGhlaWdodDogMTBweCAhaW1wb3J0YW50O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgICAgICBtYXJnaW46IDAgMC4yZW07ICovXHJcbiAgICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgIH1cclxuICAgIC8qIDpob3N0IDo6bmctZGVlcCAucGktY2hldnJvbi1sZWZ0OmJlZm9yZSB7XHJcbiAgICAgICAgY29udGVudDogXCJcXGU5MTlcIjtcclxuICAgICAgICBmb250LXNpemU6IG1lZGl1bTtcclxuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XHJcbiAgICAgICAgY29sb3I6ICM3MDcwNzA7XHJcbiAgICB9XHJcbiAgICAgOmhvc3QgOjpuZy1kZWVwIC5waS1jaGV2cm9uLXJpZ2h0OmJlZm9yZSB7XHJcbiAgICAgICAgY29udGVudDogXCJcXGU5MTlcIjtcclxuICAgICAgICBmb250LXNpemU6IG1lZGl1bTtcclxuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xyXG4gICAgICAgIGNvbG9yOiAjNzA3MDcwO1xyXG4gICAgfVxyXG4gICAgIDpob3N0IDo6bmctZGVlcCAudWktY2Fyb3VzZWwgLnVpLWNhcm91c2VsLWNvbnRlbnQgLnVpLWNhcm91c2VsLXByZXYge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIGJvcmRlcjogc29saWQgMXB4IHJnYmEoMTc4LCAxOTMsIDIwNSwgMC42NCk7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIG1hcmdpbi10b3A6IDBweDtcclxuICAgICAgICBtYXJnaW4tcmlnaHQ6IC0yOXB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDMuNXB4O1xyXG4gICAgICAgIGNvbG9yOiAjMzMzMzMzO1xyXG4gICAgICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMnM7XHJcbiAgICB9XHJcbiAgICAgOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbCAudWktY2Fyb3VzZWwtY29udGVudCAudWktY2Fyb3VzZWwtbmV4dCB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICBwYWRkaW5nOiAzLjVweDtcclxuICAgICAgICBtYXJnaW4tdG9wOiAwcHg7XHJcbiAgICAgICAgbWFyZ2luLWxlZnQ6IC0yOXB4O1xyXG4gICAgICAgIGJvcmRlcjogc29saWQgMXB4IHJnYmEoMTc4LCAxOTMsIDIwNSwgMC42NCk7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcclxuICAgICAgICBjb2xvcjogIzMzMzMzMztcclxuICAgICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xyXG4gICAgfSAqL1xyXG4gICAgLyogOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbC1pdGVtOm50aC1jaGlsZCg1biArMykgLnAtZ3JpZCB7XHJcbiAgICAgICAgbWFyZ2luOiAwcHg7XHJcbiAgICB9XHJcbiAgICAgOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbC1pdGVtOm5vdCg6bnRoLWNoaWxkKDVuICszKSk6aG92ZXIgaW1nIHtcclxuICAgICAgICBvcGFjaXR5OiAxO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB3aWR0aDogYXV0bztcclxuICAgIH1cclxuICAgICA6aG9zdCA6Om5nLWRlZXAgLnVpLWNhcm91c2VsLWl0ZW06bm90KDpudGgtY2hpbGQoNW4rMykpOmhvdmVyIC5wLWdyaWQge1xyXG4gICAgICAgIG1hcmdpbjogMHB4O1xyXG4gICAgfVxyXG4gICAgIDpob3N0IDo6bmctZGVlcCAudWktY2Fyb3VzZWwtaXRlbXMtY29udGFpbmVyIC51aS1jYXJvdXNlbC1pdGVtIHtcclxuICAgICAgICB6LWluZGV4OiAtMTtcclxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDBweDtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICAgIH1cclxuICAgICA6aG9zdCA6Om5nLWRlZXAgLnVpLWNhcm91c2VsLWl0ZW1zLWNvbnRhaW5lciAudWktY2Fyb3VzZWwtaXRlbTpudGgtY2hpbGQoNW4gKzIpIHtcclxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDBweDtcclxuICAgIH1cclxuICAgICA6aG9zdCA6Om5nLWRlZXAgLnVpLWNhcm91c2VsLWl0ZW1zLWNvbnRhaW5lciAudWktY2Fyb3VzZWwtaXRlbTpudGgtY2hpbGQoNW4gKzQpIHtcclxuICAgICAgICBtYXJnaW4tbGVmdDogMHB4O1xyXG4gICAgfVxyXG4gICAgIDpob3N0IDo6bmctZGVlcCAudWktY2Fyb3VzZWwtaXRlbXMtY29udGFpbmVyIC51aS1jYXJvdXNlbC1pdGVtOm50aC1jaGlsZCg1biArMykge1xyXG4gICAgICAgIHotaW5kZXg6IDEgIWltcG9ydGFudDtcclxuICAgICAgICBtYXJnaW4tbGVmdDogMHB4O1xyXG4gICAgICAgIG1hcmdpbi1yaWdodDogMHB4O1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgfSAqL1xyXG4gICAgIDpob3N0IDo6bmctZGVlcCBrZW5kby1zY3JvbGx2aWV3Lmstc2Nyb2xsdmlldy13cmFwIGEge1xyXG4gICAgICAgIHRvcDogMjclICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcbiAgICAgOmhvc3QgOjpuZy1kZWVwIGtlbmRvLXNjcm9sbHZpZXcuay1zY3JvbGx2aWV3LXdyYXAgdWwuay1zY3JvbGx2aWV3IGxpPmltZyB7XHJcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA5cHg7XHJcbiAgICAgICAgcGFkZGluZy1yaWdodDogMTNweDtcclxuICAgICAgICBtaW4taGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpIHtcclxuICAgICA6aG9zdCA6Om5nLWRlZXAgLml0ZW0taW1nIHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBoZWlnaHQ6IDEwMHB4O1xyXG4gICAgfVxyXG4gICAgIDpob3N0IDo6bmctZGVlcCAuaXRlbS10aXRsZSB7XHJcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0ICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgcGFkZGluZy10b3A6IDEwcHg7XHJcbiAgICAgICAgbWF4LWhlaWdodDogMTIwcHg7XHJcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDtcclxuICAgICAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHg7XHJcbiAgICAgICAgcGFkZGluZy1yaWdodDogNXB4O1xyXG4gICAgfVxyXG4gICAgIDpob3N0IDo6bmctZGVlcCAuY29sLW1kLTIwcCB7XHJcbiAgICAgICAgcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKHdpZHRoOjc2OHB4KSB7XHJcbiAgICAgOmhvc3QgOjpuZy1kZWVwIC5pdGVtLWltZyB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgaGVpZ2h0OiAxMTVweDtcclxuICAgIH1cclxuICAgICA6aG9zdCA6Om5nLWRlZXAgLml0ZW0tdGl0bGUge1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgICAgdGV4dC1hbGlnbjogaW5oZXJpdCAhaW1wb3J0YW50O1xyXG4gICAgICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgICAgIG1heC1oZWlnaHQ6IDEyMHB4O1xyXG4gICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7XHJcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgICAgIHBhZGRpbmctbGVmdDogNXB4O1xyXG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcclxuICAgIH1cclxuICAgICA6aG9zdCA6Om5nLWRlZXAgLmNvbC1tZC0yMHAge1xyXG4gICAgICAgIHBhZGRpbmc6IDBweCAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpIHtcclxuICAgICA6aG9zdCA6Om5nLWRlZXAgLnVuaXQtaXRlbS1hY3RpdmUgLmltZyB7XHJcbiAgICAgICAgbWFyZ2luOiAycHggMHB4IDBweCAxcHggIWltcG9ydGFudDtcclxuICAgICAgICB3aWR0aDogMjEzcHggIWltcG9ydGFudDtcclxuICAgICAgICBoZWlnaHQ6IDIyMnB4ICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAucG9zdC1kZXRhaWwgLmRlc2NyaXB0aW9uIGltZyB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5ib3JkZXItYWZ0ZXIge1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgICBoZWlnaHQ6IDNweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjc7XHJcbiAgICBtYXJnaW4tdG9wOiA3cHg7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCA6OnBsYWNlaG9sZGVyIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnBvcnRhbCAuY29udHJvbCBsYWJlbCB7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5tZWV0aW5nLXdlZWsgdGFibGUge1xyXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLm1lZXRpbmctd2VlayAuay1ncmlkIHtcclxuICAgIGJvcmRlci1jb2xvcjogbmF2eTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3J0YWwtbWVldGluZy13ZWVrIC5rLWdyaWQge1xyXG4gICAgd2lkdGg6IDkzJTtcclxufVxyXG5cclxuLyogOmhvc3QgOjpuZy1kZWVwIC5tZWV0aW5nLXdlZWsgLmstZ3JpZCB0ciB7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgbmF2eTtcclxufSAqL1xyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5tZWV0aW5nLXdlZWsgLmstZ3JpZCB0ZCxcclxuOmhvc3QgOjpuZy1kZWVwIC5tZWV0aW5nLXdlZWsgLmstZ3JpZCB0aCB7XHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wICFpbXBvcnRhbnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICAgIGJvcmRlci1jb2xvcjogbmF2eSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLm1lZXRpbmctd2VlayAuay1ncmlkIHRoIHtcclxuICAgIGJvcmRlci1ib3R0b206IDAgIWltcG9ydGFudDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5tZWV0aW5nLXdlZWsgLmstZ3JpZCB0ZCB7XHJcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAubWVldGluZy13ZWVrIC5rLWdyaWQgdGQ+ZGl2IHtcclxuICAgIHBhZGRpbmc6IDhweCAxMnB4O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLm1lZXRpbmctd2VlayAuay1ncmlkIC5rLWdyaWQtaGVhZGVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5tZWV0aW5nLXdlZWsgLmstZ3JpZCAuay1ncmlkLWNvbnRlbnQge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuXHJcbi8qIGLhuq90IMSR4bqndSBzY3JvbGwgbGljaCB0dcOibiAqL1xyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5tZWV0aW5nLXdlZWsgLm1lZXRpbmctd2Vlay1kaXNwbGF5IC5rLWdyaWQgLmstZ3JpZC1jb250ZW50IHtcclxuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcclxuICAgIGhlaWdodDogZml0LWNvbnRlbnQ7XHJcbiAgICBtYXgtaGVpZ2h0OiAzMDBweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5tZWV0aW5nLXdlZWsgLm1lZXRpbmctd2Vlay1kaXNwbGF5IC5rLWdyaWQgLmstZ3JpZC1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgICB3aWR0aDogMXB4O1xyXG59XHJcblxyXG5cclxuLyogVHJhY2sgKi9cclxuXHJcbjpob3N0IDo6bmctZGVlcCAubWVldGluZy13ZWVrIC5tZWV0aW5nLXdlZWstZGlzcGxheSAuay1ncmlkIC5rLWdyaWQtY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sge1xyXG4gICAgYmFja2dyb3VuZDogI2YxZjFmMTtcclxufVxyXG5cclxuXHJcbi8qIEhhbmRsZSAqL1xyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5tZWV0aW5nLXdlZWsgLm1lZXRpbmctd2Vlay1kaXNwbGF5IC5rLWdyaWQgLmstZ3JpZC1jb250ZW50Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjODg4O1xyXG59XHJcblxyXG5cclxuLyogSGFuZGxlIG9uIGhvdmVyICovXHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLm1lZXRpbmctd2VlayAubWVldGluZy13ZWVrLWRpc3BsYXkgLmstZ3JpZCAuay1ncmlkLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQ6ICM1NTU7XHJcbn1cclxuXHJcblxyXG4vKiBr4bq/dCB0aMO6YyBzY3JvbGwgbGljaCB0dcOibiAqL1xyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5ob21lLXBhZ2UgLnVpLWNhcm91c2VsLWl0ZW0ge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmNvbnRyb2wtc2VhcmNoIGlucHV0LFxyXG46aG9zdCA6Om5nLWRlZXAgLmstZGF0ZWlucHV0IC5rLWRhdGVpbnB1dC13cmFwLFxyXG46aG9zdCA6Om5nLWRlZXAgLmstZ3JpZC1ub3JlY29yZHMsXHJcbjpob3N0IDo6bmctZGVlcCAuay1kaWFsb2ctd3JhcHBlciBsYWJlbCxcclxuOmhvc3QgOjpuZy1kZWVwIC5ncm91cC1zZWFyY2ggbGFiZWwsXHJcbjpob3N0IDo6bmctZGVlcCAuay1ncmlkIC5rLWdyaWQtY29udGFpbmVyLFxyXG46aG9zdCA6Om5nLWRlZXAgLmstZ3JpZCAuay1ncm91cGluZy1yb3cgdGQsXHJcbjpob3N0IDo6bmctZGVlcCAuay10cmVldmlldyxcclxuOmhvc3QgOjpuZy1kZWVwIC5rLWNvbWJvYm94LmstY29tYm9ib3gtY2xlYXJhYmxlIC5rLWlucHV0LFxyXG46aG9zdCA6Om5nLWRlZXAgLmstZHJvcGRvd24gLmstZHJvcGRvd24td3JhcCAuay1pbnB1dCxcclxuOmhvc3QgOjpuZy1kZWVwIC5rLXRleHRib3g6aG92ZXIsXHJcbjpob3N0IDo6bmctZGVlcCAuay10ZXh0Ym94Lmstc3RhdGUtaG92ZXIsXHJcbjpob3N0IDo6bmctZGVlcCAuay10ZXh0YXJlYTpob3ZlcixcclxuOmhvc3QgOjpuZy1kZWVwIC5rLXRleHRhcmVhLmstc3RhdGUtaG92ZXIge1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY2stZWRpdG9yX19lZGl0YWJsZV9pbmxpbmUge1xyXG4gICAgaGVpZ2h0OiA1NTBweDtcclxuICAgIG1pbi1oZWlnaHQ6IDU1MHB4O1xyXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBncmF5O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmNhcm91c2VsLWNhcHRpb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgY29sb3I6ICNmZmY7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwKSAwJSwgcmdiYSgwLCAwLCAwLCAuOSkgMTAwJSk7XHJcbiAgICBwYWRkaW5nOiAxNXB4O1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmNhcm91c2VsLWNhcHRpb24gYSB7XHJcbiAgICBjb2xvcjogI2ZmZjtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvU2xhYi1Cb2xkJztcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5jYXJvdXNlbC1jYXB0aW9uIGE6aG92ZXIge1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgY29sb3I6IHllbGxvdztcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC51aS1jYXJvdXNlbCAudWktY2Fyb3VzZWwtZG90cy1jb250YWluZXIge1xyXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLmVkaXRvci1oZWlnaHQgLmNrLWVkaXRvcl9fZWRpdGFibGVfaW5saW5lIHtcclxuICAgIG1pbi1oZWlnaHQ6IDMwMHB4O1xyXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBncmF5O1xyXG59XHJcblxyXG5cclxuLyogYuG6r3QgxJHhuqd1IHBvc3Qtc3VtbWFyeSAqL1xyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5wb3N0LXN1bW1hcnkgLmNrLWVkaXRvcl9fZWRpdGFibGVfaW5saW5lIHtcclxuICAgIGhlaWdodDogMTUwcHggIWltcG9ydGFudDtcclxuICAgIG1pbi1oZWlnaHQ6IDE1MHB4ICFpbXBvcnRhbnQ7XHJcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIGdyYXk7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAudGV4dC10aW55IHtcclxuICAgIGZvbnQtc2l6ZTogMC43ZW07XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAudGV4dC1zbWFsbCB7XHJcbiAgICBmb250LXNpemU6IDAuODVlbTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC50ZXh0LWJpZyB7XHJcbiAgICBmb250LXNpemU6IDEuNGVtO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnRleHQtaHVnZSB7XHJcbiAgICBmb250LXNpemU6IDEuOGVtO1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnBvc3QtZGV0YWlsIC5kZXNjcmlwdGlvbiAgZmlnY2FwdGlvbiB7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGNhcHRpb24tc2lkZTogYm90dG9tO1xyXG4gICAgd29yZC1icmVhazogYnJlYWstd29yZDtcclxuICAgIGNvbG9yOiBoc2woMCwgMCUsIDIwJSk7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2woMCwgMCUsIDk3JSk7XHJcbiAgICBwYWRkaW5nOiAuNmVtO1xyXG4gICAgZm9udC1zaXplOiAuNzVlbTtcclxuICAgIG91dGxpbmUtb2Zmc2V0OiAtMXB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcbi8qIGvhur90IHRow7pjIHBvc3Qtc3VtbWFyeSAqL1xyXG5cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuc3RpY2t5LWhlYWRlci1ncmlkIC5rLWdyaWQgLmstZ3JpZC1oZWFkZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAyNThweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5Ny41NSU7XHJcbn1cclxuIl19 */\"","module.exports = \"\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\"","import { Component, OnInit } from '@angular/core';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\nimport { AppLanguage } from './services/app.language';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n templateUrl: './app.component.html',\r\n styleUrls: ['./app.component.css']\r\n})\r\nexport class AppComponent implements OnInit {\r\n title = 'UBND Quận 10';\r\n loading = false;\r\n constructor(\r\n private language: AppLanguage,\r\n private router: Router) {\r\n this.language.default();\r\n }\r\n\r\n ngOnInit() {\r\n this.router.events.subscribe((evt) => {\r\n if (!(evt instanceof NavigationEnd)) {\r\n return;\r\n }\r\n window.scrollTo(0, 0);\r\n });\r\n}\r\n\r\n switchLanguage(language: string) {\r\n this.language.set(language);\r\n }\r\n\r\n onActivate(event) {\r\n window.scroll(0, 0);\r\n //or document.body.scrollTop = 0;\r\n //or document.querySelector('body').scrollTo(0,0)\r\n\r\n }\r\n\r\n onActivate2(event) {\r\n let scrollToTop = window.setInterval(() => {\r\n let pos = window.pageYOffset;\r\n if (pos > 0) {\r\n window.scrollTo(0, pos - 20); // how far to scroll on each step\r\n } else {\r\n window.clearInterval(scrollToTop);\r\n }\r\n }, 16);\r\n }\r\n}\r\n","import { BrowserModule } from '@angular/platform-browser';\r\nimport { LOCALE_ID, NgModule } from '@angular/core';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { AppRoutingModule } from './app-routing.module';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { HttpClientModule, HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http';\r\nimport { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api';\r\nimport { Headers, Http, RequestOptions, Response, HttpModule } from '@angular/http';\r\nimport { FormsModule } from '@angular/forms';\r\nimport {\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatSnackBarModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatDatepickerModule\r\n} from '@angular/material';\r\nimport { TranslateModule, TranslateLoader } from '@ngx-translate/core';\r\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\r\nimport { AngularFontAwesomeModule } from 'angular-font-awesome';\r\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\r\nimport { FocusModule } from 'angular2-focus';\r\n// import { TooltipModule } from 'ngx-bootstrap/tooltip';\r\nimport { ModalModule } from 'ngx-bootstrap/modal';\r\n\r\nimport { AppRouter } from './app.router';\r\nimport { AuthenticationService } from './services/authentication.service';\r\nimport { TokenInterceptor } from './services/token.interceptor';\r\nimport { AuthGuard } from './services/auth.guard';\r\nimport { AuthService } from './services/auth.service';\r\nimport { AppLanguage } from './services/app.language';\r\n\r\nimport { UserComponent } from './ad/user/user.component';\r\nimport { RoleComponent } from './ad/role/role.component';\r\nimport { AppComponent } from './app.component';\r\nimport { ChangePasswordComponent } from './change-password/change-password.component';\r\nimport { LoginComponent } from './login/login.component';\r\nimport { HomeComponent } from './home/home.component';\r\n\r\nimport { DropDownsModule } from '@progress/kendo-angular-dropdowns';\r\nimport { DateInputModule, DatePickerModule, DateInputsModule } from '@progress/kendo-angular-dateinputs';\r\nimport { InputsModule } from '@progress/kendo-angular-inputs';\r\nimport { ButtonsModule } from '@progress/kendo-angular-buttons';\r\nimport { GridModule, ExcelModule } from '@progress/kendo-angular-grid';\r\nimport { LayoutModule } from '@progress/kendo-angular-layout';\r\nimport { ToolBarModule } from '@progress/kendo-angular-toolbar';\r\nimport { TooltipModule } from '@progress/kendo-angular-tooltip';\r\nimport { ExcelExportModule } from '@progress/kendo-angular-excel-export';\r\nimport { IntlModule } from '@progress/kendo-angular-intl';\r\nimport { NotificationModule } from '@progress/kendo-angular-notification';\r\nimport { UploadModule } from '@progress/kendo-angular-upload';\r\nimport { DialogModule, DialogsModule } from '@progress/kendo-angular-dialog';\r\nimport { PopupModule } from '@progress/kendo-angular-popup';\r\nimport { TreeViewModule } from '@progress/kendo-angular-treeview';\r\nimport { ChartsModule } from '@progress/kendo-angular-charts';\r\nimport { EditorModule } from '@progress/kendo-angular-editor';\r\nimport { NgbModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { MatVideoModule } from 'mat-video';\r\n\r\nimport { UserRoleComponent } from './ad/user-role/user-role.component';\r\nimport { PageComponent } from './ad/page/page.component';\r\nimport { ControlComponent } from './ad/control/control.component';\r\nimport { AutoNumberComponent } from './ad/auto-number/auto-number.component';\r\nimport { ConfigComponent } from './ad/config/config.component';\r\nimport { DashboardComponent } from './dashboard/dashboard.component';\r\nimport { UnitComponent } from './m/unit/unit.component';\r\nimport { HomepageComponent } from './portal/homepage/homepage.component';\r\nimport { PostDetailComponent } from './portal/post-detail/post-detail.component';\r\nimport { PostComponent } from './s/post/post.component';\r\nimport { PhotoComponent } from './m/photo/photo.component';\r\nimport { MenuComponent } from './m/menu/menu.component';\r\nimport { AdmiProcComponent } from './portal/admi-proc/admi-proc.component';\r\nimport { MultimediaComponent } from './portal/multimedia/multimedia.component';\r\nimport { OfficeComponent } from './data/office/office.component';\r\nimport { AdProcedureComponent } from './data/ad-procedure/ad-procedure.component';\r\nimport { AdmiProcDetailComponent } from './portal/admi-proc-detail/admi-proc-detail.component';\r\nimport { TypeComponent } from './m/type/type.component';\r\nimport { UserOfficeComponent } from './portal/user-office/user-office.component';\r\nimport { UserOfficeDetailComponent } from './portal/user-office-detail/user-office-detail.component';\r\nimport { CommentComponent } from './data/comment/comment.component';\r\nimport { CommentListComponent } from './portal/comment-list/comment-list.component';\r\nimport { PostWardComponent } from './data/post-ward/post-ward.component';\r\nimport { PostListComponent } from './portal/post-list/post-list.component';\r\nimport { HeaderComponent } from './portal/header/header.component';\r\nimport { FooterComponent } from './portal/footer/footer.component';\r\nimport { RightComponent } from './portal/right/right.component';\r\nimport { VideosComponent } from './portal/videos/videos.component';\r\nimport { CommentOftenComponent } from './portal/comment-often/comment-often.component';\r\nimport { AskAndReplyComponent } from './data/ask-and-reply/ask-and-reply.component';\r\nimport { VideoComponent } from './m/video/video.component';\r\nimport { AskAndReplyFeedbackComponent } from './data/ask-and-reply-feedback/ask-and-reply-feedback.component';\r\nimport { ServiceOnlineComponent } from './portal/service-online/service-online.component';\r\nimport { ManageMultimediaComponent } from './m/manage-multimedia/manage-multimedia.component';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\nimport { ScheduleComponent } from './data/schedule/schedule.component';\r\nimport { OrganizeComponent } from './data/organize/organize.component';\r\nimport { AccountComponent } from './data/account/account.component';\r\nimport { PartComponent } from './data/part/part.component';\r\nimport { WeeklyReportComponent } from './data/weekly-report/weekly-report.component';\r\nimport { WeeklyReportPortalComponent } from './portal/weekly-report-portal/weekly-report-portal.component';\r\nimport { OfficeDrtComponent } from './data/office-drt/office-drt.component';\r\nimport { OrganizeChartComponent } from './portal/organization/organize-chart/organize-chart.component';\r\nimport { OfficeDrt2Component } from './portal/office-drt2/office-drt2.component';\r\nimport { GoogleChartsModule } from 'angular-google-charts';\r\nimport { CarouselModule } from 'primeng/carousel';\r\nimport { ScrollViewModule } from '@progress/kendo-angular-scrollview';\r\nimport { MandatesComponent } from './data/mandates/mandates.component';\r\nimport { PostResultComponent } from './portal/post-result/post-result.component';\r\nimport { SchedulerModule } from '@progress/kendo-angular-scheduler';\r\nimport { DataRoomMeetingComponent } from './data/data-room-meeting/data-room-meeting/data-room-meeting.component';\r\nimport { DataDeviceRoomMeetingComponent } from './data/data-device-room-meeting/data-device-room-meeting/data-device-room-meeting.component';\r\nimport { MeetingComponent } from './data/meeting/meeting.component';\r\nimport localeVi from '@angular/common/locales/vi';\r\nimport { registerLocaleData } from '@angular/common';\r\nregisterLocaleData(localeVi);\r\n\r\nimport '@progress/kendo-angular-intl/locales/de/all';\r\nimport '@progress/kendo-angular-intl/locales/es/all';\r\nimport '@progress/kendo-angular-intl/locales/vi/all';\r\nimport { PortalMeetingComponent } from './portal/portal-meeting/portal-meeting.component';\r\nimport { MeetingInfoComponent } from './data/meeting-info/meeting-info.component';\r\nimport { NLDNewsComponent } from './portal/nldnews/nldnews.component';\r\nimport { LoginAskComponent } from './portal/login-ask/login-ask.component';\r\nimport { CreateAccountComponent } from './portal/create-account/create-account.component';\r\nimport { ChangeAccountPasswordComponent } from './portal/change-account-password/change-account-password.component';\r\nimport { MeetingWeekComponent } from './portal/portal_meeting_week/meeting-week/meeting-week.component';\r\nimport { PDFExportModule } from '@progress/kendo-angular-pdf-export';\r\nimport { WebSocketService } from \"src/app/websocket.service\";\r\nimport { MeetingWeekGridComponent } from './portal/meeting-week-grid/meeting-week-grid.component';\r\nimport { MailConfigComponent } from './data/mail-config/mail-config.component';\r\nimport {MatToolbarModule} from '@angular/material/toolbar';\r\nimport { DatePipe } from '@angular/common';\r\nimport { CmtUserComponent } from './ad/cmt-user/cmt-user.component';\r\nimport { OrgChartModule } from '@mondal/org-chart';\r\nimport { DocumentMeetingComponent } from './data/document-meeting/document-meeting.component';\r\nimport { LoadDataAutoComponent } from './ad/load-data-auto/load-data-auto.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n AppComponent,\r\n LoginComponent,\r\n HomeComponent,\r\n HomeComponent,\r\n ChangePasswordComponent,\r\n UserComponent,\r\n RoleComponent,\r\n UserRoleComponent,\r\n PageComponent,\r\n ControlComponent,\r\n AutoNumberComponent,\r\n ConfigComponent,\r\n DashboardComponent,\r\n UnitComponent,\r\n HomepageComponent,\r\n PostComponent,\r\n PhotoComponent,\r\n MenuComponent,\r\n PostDetailComponent,\r\n AdmiProcComponent,\r\n MultimediaComponent,\r\n OfficeComponent,\r\n AdProcedureComponent,\r\n AdmiProcDetailComponent,\r\n TypeComponent,\r\n UserOfficeComponent,\r\n UserOfficeDetailComponent,\r\n CommentComponent,\r\n CommentListComponent,\r\n PostWardComponent,\r\n PostListComponent,\r\n HeaderComponent,\r\n FooterComponent,\r\n RightComponent,\r\n VideosComponent,\r\n CommentOftenComponent,\r\n AskAndReplyComponent,\r\n VideoComponent,\r\n AskAndReplyFeedbackComponent,\r\n VideoComponent,\r\n ServiceOnlineComponent,\r\n ManageMultimediaComponent,\r\n ScheduleComponent,\r\n OrganizeComponent,\r\n AccountComponent,\r\n PartComponent,\r\n WeeklyReportComponent,\r\n WeeklyReportPortalComponent,\r\n OfficeDrtComponent,\r\n OrganizeChartComponent,\r\n OfficeDrt2Component,\r\n MandatesComponent,\r\n PostResultComponent,\r\n DataRoomMeetingComponent,\r\n DataDeviceRoomMeetingComponent,\r\n MeetingComponent,\r\n PortalMeetingComponent,\r\n MeetingInfoComponent,\r\n NLDNewsComponent,\r\n MeetingWeekComponent,\r\n LoginAskComponent,\r\n CreateAccountComponent,\r\n ChangeAccountPasswordComponent,\r\n MeetingWeekGridComponent,\r\n MailConfigComponent,\r\n CmtUserComponent,\r\n DocumentMeetingComponent,\r\n LoadDataAutoComponent,\r\n ],\r\n imports: [\r\n BrowserModule,\r\n ButtonsModule,\r\n DropDownsModule,\r\n DateInputModule,\r\n DateInputsModule,\r\n DatePickerModule,\r\n GridModule,\r\n ExcelModule,\r\n ExcelExportModule,\r\n LayoutModule,\r\n ToolBarModule,\r\n TooltipModule,\r\n UploadModule,\r\n DialogModule,\r\n DialogsModule,\r\n PopupModule,\r\n TreeViewModule,\r\n ChartsModule,\r\n EditorModule,\r\n MatDatepickerModule,\r\n IntlModule,\r\n InputsModule,\r\n NotificationModule,\r\n BrowserAnimationsModule,\r\n AppRoutingModule,\r\n HttpClientModule,\r\n HttpClientInMemoryWebApiModule,\r\n HttpModule,\r\n FormsModule,\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatSnackBarModule,\r\n MatSortModule,\r\n MatTableModule,\r\n AngularFontAwesomeModule,\r\n NgbModule,\r\n MatVideoModule,\r\n CKEditorModule,\r\n RouterModule.forRoot(AppRouter.routes, { useHash: true }),\r\n TranslateModule.forRoot({\r\n loader: {\r\n provide: TranslateLoader,\r\n useFactory: HttpLoaderFactory,\r\n deps: [HttpClient]\r\n }\r\n }),\r\n BsDropdownModule.forRoot(),\r\n FocusModule.forRoot(),\r\n ModalModule.forRoot(),\r\n GoogleChartsModule,\r\n CarouselModule,\r\n ScrollViewModule,\r\n SchedulerModule,\r\n PDFExportModule,\r\n MatToolbarModule,\r\n OrgChartModule\r\n ],\r\n exports: [BsDropdownModule, TooltipModule, ModalModule],\r\n providers: [AuthGuard,\r\n AuthService,\r\n AppLanguage,\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: TokenInterceptor,\r\n multi: true\r\n },\r\n {\r\n provide: LOCALE_ID,\r\n useValue: 'vi-VN',\r\n },\r\n WebSocketService,\r\n { provide: LOCALE_ID, useValue: 'vi-VN' },\r\n DatePipe\r\n ],\r\n bootstrap: [AppComponent]\r\n})\r\nexport class AppModule { }\r\nexport function HttpLoaderFactory(http: HttpClient) {\r\n return new TranslateHttpLoader(http);\r\n}\r\n","import { LoginComponent } from './login/login.component';\r\nimport { HomeComponent } from './home/home.component';\r\nimport { Routes } from '@angular/router';\r\nimport { AuthGuard } from './services/auth.guard';\r\nimport { ChangePasswordComponent } from './change-password/change-password.component';\r\nimport { UserComponent } from './ad/user/user.component';\r\nimport { RoleComponent } from './ad/role/role.component';\r\nimport { UserRoleComponent } from './ad/user-role/user-role.component';\r\nimport { PageComponent } from './ad/page/page.component';\r\nimport { ControlComponent } from './ad/control/control.component';\r\nimport { AutoNumberComponent } from './ad/auto-number/auto-number.component';\r\nimport { ConfigComponent } from './ad/config/config.component';\r\nimport { DashboardComponent } from './dashboard/dashboard.component';\r\nimport { UnitComponent } from './m/unit/unit.component';\r\nimport { HomepageComponent } from './portal/homepage/homepage.component';\r\nimport { PostComponent } from './s/post/post.component';\r\nimport { PhotoComponent } from './m/photo/photo.component';\r\nimport { MenuComponent } from './m/menu/menu.component';\r\nimport { PostDetailComponent } from './portal/post-detail/post-detail.component';\r\nimport { AdmiProcComponent } from './portal/admi-proc/admi-proc.component';\r\nimport { MultimediaComponent } from './portal/multimedia/multimedia.component';\r\nimport { OfficeComponent } from './data/office/office.component';\r\nimport { AdProcedureComponent } from './data/ad-procedure/ad-procedure.component';\r\nimport { AdmiProcDetailComponent } from './portal/admi-proc-detail/admi-proc-detail.component';\r\nimport { TypeComponent } from './m/type/type.component';\r\nimport { UserOfficeComponent } from './portal/user-office/user-office.component';\r\nimport { UserOfficeDetailComponent } from './portal/user-office-detail/user-office-detail.component';\r\nimport { CommentComponent } from './data/comment/comment.component';\r\nimport { CommentListComponent } from './portal/comment-list/comment-list.component';\r\nimport { PostWardComponent } from './data/post-ward/post-ward.component';\r\nimport { PostListComponent } from './portal/post-list/post-list.component';\r\nimport { VideosComponent } from './portal/videos/videos.component';\r\nimport { CommentOftenComponent } from './portal/comment-often/comment-often.component';\r\nimport { AskAndReplyComponent } from './data/ask-and-reply/ask-and-reply.component';\r\nimport { VideoComponent } from './m/video/video.component';\r\nimport { AskAndReplyFeedbackComponent } from './data/ask-and-reply-feedback/ask-and-reply-feedback.component';\r\nimport { ServiceOnlineComponent } from './portal/service-online/service-online.component';\r\nimport { ManageMultimediaComponent } from './m/manage-multimedia/manage-multimedia.component';\r\nimport { ScheduleComponent } from './data/schedule/schedule.component';\r\nimport { AccountComponent } from './data/account/account.component';\r\nimport { PartComponent } from './data/part/part.component';\r\nimport { WeeklyReportComponent } from './data/weekly-report/weekly-report.component';\r\nimport { WeeklyReportPortalComponent } from './portal/weekly-report-portal/weekly-report-portal.component';\r\nimport { OfficeDrtComponent } from './data/office-drt/office-drt.component';\r\nimport { OrganizeChartComponent } from './portal/organization/organize-chart/organize-chart.component';\r\nimport { OfficeDrt2Component } from './portal/office-drt2/office-drt2.component';\r\nimport { MandatesComponent } from './data/mandates/mandates.component';\r\nimport { PostResultComponent } from './portal/post-result/post-result.component';\r\nimport { DataRoomMeetingComponent } from './data/data-room-meeting/data-room-meeting/data-room-meeting.component';\r\nimport { DataDeviceRoomMeetingComponent } from './data/data-device-room-meeting/data-device-room-meeting/data-device-room-meeting.component';\r\nimport { MeetingComponent } from './data/meeting/meeting.component';\r\nimport { PortalMeetingComponent } from './portal/portal-meeting/portal-meeting.component';\r\nimport { MeetingInfoComponent } from './data/meeting-info/meeting-info.component';\r\nimport { NLDNewsComponent } from './portal/nldnews/nldnews.component';\r\nimport { LoginAskComponent } from './portal/login-ask/login-ask.component';\r\nimport { CreateAccountComponent } from './portal/create-account/create-account.component';\r\nimport { ChangeAccountPasswordComponent } from './portal/change-account-password/change-account-password.component';\r\nimport { MeetingWeekComponent } from './portal/portal_meeting_week/meeting-week/meeting-week.component';\r\nimport { MailConfigComponent } from './data/mail-config/mail-config.component';\r\nimport { CmtUserComponent } from './ad/cmt-user/cmt-user.component';\r\nimport { DocumentMeetingComponent } from './data/document-meeting/document-meeting.component';\r\nimport { LoadDataAutoComponent } from './ad/load-data-auto/load-data-auto.component';\r\n\r\nexport class AppRouter {\r\n public static routes: Routes = [\r\n { path: 'login', component: LoginComponent },\r\n { path: '', component: HomepageComponent },\r\n { path: 'change-password', component: ChangePasswordComponent, canActivate: [AuthGuard] },\r\n { path: 'ad/user', component: UserComponent, canActivate: [AuthGuard] },\r\n { path: 'ad/role', component: RoleComponent, canActivate: [AuthGuard] },\r\n { path: 'ad/user-role', component: UserRoleComponent, canActivate: [AuthGuard] },\r\n { path: 'ad/page', component: PageComponent, canActivate: [AuthGuard] },\r\n { path: 'ad/control', component: ControlComponent, canActivate: [AuthGuard] },\r\n { path: 'ad/auto-number', component: AutoNumberComponent, canActivate: [AuthGuard] },\r\n { path: 'ad/config', component: ConfigComponent, canActivate: [AuthGuard] },\r\n\r\n { path: 'm/unit', component: UnitComponent, canActivate: [AuthGuard] },\r\n { path: 'm/type', component: TypeComponent, canActivate: [AuthGuard] },\r\n { path: 'm/menu', component: MenuComponent, canActivate: [AuthGuard] },\r\n\r\n { path: 'dashboard', component: DashboardComponent },\r\n\r\n { path: 'portal', component: HomepageComponent },\r\n { path: 'portal/adminis-proc', component: AdmiProcComponent },\r\n { path: 'portal/multimedia', component: MultimediaComponent },\r\n { path: 'portal/admi-proc-detail', component: AdmiProcDetailComponent },\r\n { path: 'portal/post-detail', component: PostDetailComponent },\r\n { path: 'portal/office', component: UserOfficeComponent },\r\n { path: 'portal/office-detail', component: UserOfficeDetailComponent },\r\n { path: 'portal/comment-list', component: CommentListComponent },\r\n { path: 'portal/post-list', component: PostListComponent },\r\n { path: 'portal/videos', component: VideosComponent },\r\n { path: 'portal/comment-often', component: CommentOftenComponent },\r\n { path: 'portal/service-online', component: ServiceOnlineComponent },\r\n { path: 'portal/organize', component: OrganizeChartComponent },\r\n // { path: 'portal/weekly-report-portal', component: WeeklyReportPortalComponent},\r\n // { path: 'portal/portal-meeting', component: PortalMeetingComponent},\r\n { path: 'portal/nldnews', component: NLDNewsComponent},\r\n { path: 'portal/ask-and-reply', component: AskAndReplyComponent},\r\n { path: 'portal/login-ask', component: LoginAskComponent},\r\n { path: 'portal/create-account', component: CreateAccountComponent},\r\n { path: 'portal/change-account-password', component: ChangeAccountPasswordComponent},\r\n\r\n { path: 'data/menu', component: MenuComponent, canActivate: [AuthGuard]},\r\n { path: 'data/post', component: PostComponent, canActivate: [AuthGuard]},\r\n { path: 'data/meeting', component: MeetingComponent, canActivate: [AuthGuard]},\r\n { path: 'data/meeting-info', component: MeetingInfoComponent, canActivate: [AuthGuard]},\r\n { path: 'data/office', component: OfficeComponent, canActivate: [AuthGuard]},\r\n { path: 'data/ad-procedure', component: AdProcedureComponent, canActivate: [AuthGuard]},\r\n { path: 'data/post-ward', component: PostWardComponent, canActivate: [AuthGuard]},\r\n { path: 'data/comment', component: CommentComponent, canActivate: [AuthGuard]},\r\n { path: 'data/ask-and-reply', component: AskAndReplyComponent, canActivate: [AuthGuard]},\r\n { path: 'data/multimedia', component: PhotoComponent, canActivate: [AuthGuard]},\r\n { path: 'data/videos', component: VideoComponent, canActivate: [AuthGuard]},\r\n { path: 'data/ask-and-reply-feedback', component: AskAndReplyFeedbackComponent, canActivate: [AuthGuard]},\r\n { path: 'm/manage-multimedia', component: ManageMultimediaComponent, canActivate: [AuthGuard]},\r\n { path: 'data/schedule', component: ScheduleComponent, canActivate: [AuthGuard]},\r\n { path: 'data/account', component: AccountComponent, canActivate: [AuthGuard]},\r\n { path: 'data/part', component: PartComponent, canActivate: [AuthGuard]},\r\n { path: 'data/weekly-report', component: WeeklyReportComponent, canActivate: [AuthGuard]},\r\n { path: 'data/office-drt', component: OfficeDrtComponent, canActivate: [AuthGuard]},\r\n { path: 'portal/request', component: CommentListComponent },\r\n { path: 'portal/office-drt', component: OfficeDrt2Component },\r\n { path: 'data/mandates', component: MandatesComponent },\r\n { path: 'portal/post-result', component: PostResultComponent },\r\n { path: 'data/data-room-meeting', component: DataRoomMeetingComponent },\r\n { path: 'data/data-device-room-meeting', component: DataDeviceRoomMeetingComponent },\r\n { path: 'portal/meeting-week', component: MeetingWeekComponent },\r\n { path: 'data/mail-config', component: MailConfigComponent },\r\n { path: 'portal/meeting', component: MeetingComponent, canActivate: [AuthGuard]},\r\n { path: 'portal/weekly-report', component: WeeklyReportComponent, canActivate: [AuthGuard]},\r\n { path: 'data/cmt-user', component: CmtUserComponent, canActivate: [AuthGuard]},\r\n { path: 'data/document-meeting', component: DocumentMeetingComponent, canActivate: [AuthGuard]},\r\n { path: 'data/post/loadAuto', component: LoadDataAutoComponent}\r\n ];\r\n}\r\n","module.exports = \".bg>img {\\r\\n height: 40px;\\r\\n width: 50px;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\ndiv.bg>span {\\r\\n color: white;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n left: 53px;\\r\\n font-size: 24px;\\r\\n /* font-family: Arial, Helvetica, sans-serif; */\\r\\n font-family: 'Open Sans', sans-serif;\\r\\n font-weight: bold;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n}\\r\\n\\r\\n.bg {\\r\\n background-color: #006CB7;\\r\\n background-repeat: no-repeat;\\r\\n background-size: 100% 100%;\\r\\n width: 100%;\\r\\n height: 56px;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\nsection {\\r\\n border: 0.5px solid #65656552;\\r\\n border-radius: 40px;\\r\\n position: fixed;\\r\\n height: 300px;\\r\\n max-width: 400px;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n left: 0;\\r\\n margin: auto;\\r\\n background-color: #ffffff;\\r\\n color: black;\\r\\n padding: 0px 30px;\\r\\n}\\r\\n\\r\\ninput {\\r\\n border-bottom-color: whitesmoke;\\r\\n color: #FFFFFF;\\r\\n}\\r\\n\\r\\n.login-container {\\r\\n height: 664px;\\r\\n margin-top: -10px !important;\\r\\n}\\r\\n\\r\\n.login-button-container {\\r\\n margin-top: 20px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.login-button-container button {\\r\\n padding: 10px 20px;\\r\\n border-radius: 10px;\\r\\n}\\r\\n\\r\\n.footer {\\r\\n margin-top: 140px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.row {\\r\\n padding-top: 0px !important;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvY2hhbmdlLXBhc3N3b3JkL2NoYW5nZS1wYXNzd29yZC5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksWUFBWTtJQUNaLFdBQVc7SUFDWCxNQUFNO0lBQ04sU0FBUztJQUNULFlBQVk7SUFDWixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLE1BQU07SUFDTixTQUFTO0lBQ1QsWUFBWTtJQUNaLFVBQVU7SUFDVixlQUFlO0lBQ2YsK0NBQStDO0lBQy9DLG9DQUFvQztJQUNwQyxpQkFBaUI7SUFDakIsMkJBQW1CO0lBQW5CLHdCQUFtQjtJQUFuQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsNEJBQTRCO0lBQzVCLDBCQUEwQjtJQUMxQixXQUFXO0lBQ1gsWUFBWTtJQUNaLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3QixtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLFlBQVk7SUFDWix5QkFBeUI7SUFDekIsWUFBWTtJQUNaLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLCtCQUErQjtJQUMvQixjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLDRCQUE0QjtBQUNoQzs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLDJCQUEyQjtBQUMvQiIsImZpbGUiOiJzcmMvYXBwL2NoYW5nZS1wYXNzd29yZC9jaGFuZ2UtcGFzc3dvcmQuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5iZz5pbWcge1xyXG4gICAgaGVpZ2h0OiA0MHB4O1xyXG4gICAgd2lkdGg6IDUwcHg7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbn1cclxuXHJcbmRpdi5iZz5zcGFuIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIG1hcmdpbjogYXV0bztcclxuICAgIGxlZnQ6IDUzcHg7XHJcbiAgICBmb250LXNpemU6IDI0cHg7XHJcbiAgICAvKiBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgKi9cclxuICAgIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJywgc2Fucy1zZXJpZjtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcclxufVxyXG5cclxuLmJnIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjc7XHJcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDEwMCU7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogNTZweDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxufVxyXG5cclxuc2VjdGlvbiB7XHJcbiAgICBib3JkZXI6IDAuNXB4IHNvbGlkICM2NTY1NjU1MjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDQwcHg7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBoZWlnaHQ6IDMwMHB4O1xyXG4gICAgbWF4LXdpZHRoOiA0MDBweDtcclxuICAgIHRvcDogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIG1hcmdpbjogYXV0bztcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbiAgICBwYWRkaW5nOiAwcHggMzBweDtcclxufVxyXG5cclxuaW5wdXQge1xyXG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogd2hpdGVzbW9rZTtcclxuICAgIGNvbG9yOiAjRkZGRkZGO1xyXG59XHJcblxyXG4ubG9naW4tY29udGFpbmVyIHtcclxuICAgIGhlaWdodDogNjY0cHg7XHJcbiAgICBtYXJnaW4tdG9wOiAtMTBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ubG9naW4tYnV0dG9uLWNvbnRhaW5lciB7XHJcbiAgICBtYXJnaW4tdG9wOiAyMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG4ubG9naW4tYnV0dG9uLWNvbnRhaW5lciBidXR0b24ge1xyXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcclxufVxyXG5cclxuLmZvb3RlciB7XHJcbiAgICBtYXJnaW4tdG9wOiAxNDBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLnJvdyB7XHJcbiAgICBwYWRkaW5nLXRvcDogMHB4ICFpbXBvcnRhbnQ7XHJcbn0iXX0= */\"","module.exports = \"\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n {{ 'Confirm' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n {{ 'Back' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\"","import { Component, OnInit } from '@angular/core';\r\nimport { AppService } from '../services/app.service';\r\nimport { Router } from '@angular/router';\r\nimport { AuthenticationService } from '../services/authentication.service';\r\nimport { AppSwal } from '../services/app.swal';\r\nimport { Location } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-change-password',\r\n templateUrl: './change-password.component.html',\r\n styleUrls: ['./change-password.component.css']\r\n})\r\nexport class ChangePasswordComponent implements OnInit {\r\n\r\n changePassword = {\r\n UserName: '',\r\n CurrentPassword: '',\r\n NewPassword: '',\r\n ConfirmPassword: ''\r\n };\r\n\r\n constructor(\r\n private appService: AppService,\r\n private router: Router,\r\n private authenticationService: AuthenticationService,\r\n private appSwal: AppSwal,\r\n private location: Location\r\n ) {\r\n this.authenticationService.getUser();\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async onChangePassword() {\r\n this.changePassword.UserName = this.authenticationService.user.UserName;\r\n const id = this.changePassword.UserName;\r\n const result = await this.appService.doPUT('api/Account/ChangePassword', this.changePassword, { id} );\r\n if (result && result.Status === 1) {\r\n this.appSwal.showSuccess(result.Msg, false);\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n onBackPage() {\r\n this.location.back();\r\n }\r\n}\r\n","module.exports = \".search-time-block {\\r\\n position: absolute;\\r\\n margin-left: 12%;\\r\\n height: 70% !important;\\r\\n width: 100%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGFzaGJvYXJkL2Rhc2hib2FyZC5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsV0FBVztBQUNmIiwiZmlsZSI6InNyYy9hcHAvZGFzaGJvYXJkL2Rhc2hib2FyZC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnNlYXJjaC10aW1lLWJsb2NrIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIG1hcmdpbi1sZWZ0OiAxMiU7XHJcbiAgICBoZWlnaHQ6IDcwJSAhaW1wb3J0YW50O1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \"","import { Component, OnInit } from '@angular/core';\r\nimport { AppControls } from '../services/app.controls';\r\nimport { GridDataResult, DataStateChangeEvent, SelectableSettings, PageChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { orderBy, process, SortDescriptor, State } from '@progress/kendo-data-query';\r\nimport 'hammerjs';\r\nimport { AppService } from '../services/app.service';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { AppSwal } from '../services/app.swal';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 'app-dashboard',\r\n templateUrl: './dashboard.component.html',\r\n styleUrls: ['./dashboard.component.css']\r\n})\r\nexport class DashboardComponent implements OnInit {\r\n searchData = {\r\n FromDate: null,\r\n ToDate: null,\r\n };\r\n infoOpened = false;\r\n dataCommentGridDataResult: GridDataResult;\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataComments = [];\r\n data: any[];\r\n public hot;\r\n public normal;\r\n public all;\r\n dataCommentSelectableSettings: SelectableSettings;\r\n allowMulti = true;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataCommentSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public enabled = false;\r\n public enabledID = false;\r\n dataCommentItem: any;\r\n dataCommentSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n dataCommentSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataCommentPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataCommentSelection: number[] = [];\r\n dataFileUrls: any[];\r\n postItem: any;\r\n public dataCommentState: State = {\r\n skip: this.dataCommentSkip,\r\n take: this.dataCommentSkip + this.dataCommentPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n FromDate: any;\r\n ToDate: any;\r\n dataUsers: [];\r\n loading = false;\r\n dataPostGridDataResult: GridDataResult;\r\n constructor(\r\n public appControls: AppControls,\r\n public appService: AppService,\r\n public intl: IntlService,\r\n private appSwal: AppSwal,\r\n private translate: TranslateService,\r\n ) { \r\n \r\n this.getPageName();\r\n //this.FromDate = new Date();\r\n //this.ToDate = new Date();\r\n this.getPost();\r\n\r\n }\r\n \r\n pageName: any;\r\n\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n bindComments() {\r\n this.dataCommentGridDataResult = {\r\n data: orderBy(this.dataUsers, this.dataCommentSortByField),\r\n total: this.dataUsers.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataUsers, this.dataCommentState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n onCommentsortChange(sort: SortDescriptor[]): void {\r\n this.dataCommentSortByField = sort;\r\n this.bindComments();\r\n }\r\n\r\n public onCommentDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataCommentSelection = [];\r\n this.dataCommentState = state;\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataCommentSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n onCommentPageChange(event: PageChangeEvent) {\r\n this.dataCommentSkip = event.skip;\r\n this.bindComments();\r\n }\r\n\r\n async onCommentselectedKeysChange() {\r\n\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataCommentSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataCommentSelection[0];\r\n const selectedItem = this.dataComments.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n\r\n this.dataCommentItem = selectedItem;\r\n\r\n this.enabled = false;\r\n this.enabledID = false;\r\n\r\n\r\n const dataRequest = {\r\n id: this.dataCommentItem.PostID\r\n };\r\n\r\n this.postItem = null;\r\n const resultRequestMenu = await this.appService.doGET('api/Post/GetById', dataRequest);\r\n if (resultRequestMenu && resultRequestMenu.Status === 1) {\r\n this.postItem = resultRequestMenu.Data;\r\n }\r\n }\r\n }\r\n\r\n onSearch() {\r\n this.infoOpened = true;\r\n }\r\n onCloseInfo(e) {\r\n this.infoOpened = false;\r\n }\r\n \r\n async getPost() {\r\n const searchData = {\r\n FromDate: this.intl.formatDate(this.FromDate, 'yyyy-MM-dd'),\r\n ToDate: this.intl.formatDate(this.ToDate, 'yyyy-MM-dd')\r\n };\r\n\r\n const result = await this.appService.doPOST('api/Dashboard', searchData);\r\n if(result && result.Status === 1){\r\n this.dataUsers = result.Data.res;\r\n \r\n this.bindComments();\r\n this.hot = result.Data.CountPost[0];\r\n this.normal = result.Data.CountPost[1];\r\n this.all = result.Data.CountPost[2];\r\n this.data = [{\r\n kind: 'Tin nổi bật' + '\\n' + this.hot, share: this.hot\r\n }, {\r\n kind: 'Tin thường' + '\\n' + this.normal, share: this.normal\r\n }];\r\n }\r\n this.loading = false;\r\n this.infoOpened = false;\r\n }\r\n\r\n public labelContent(e: any): string {\r\n return e.category;\r\n }\r\n\r\n}\r\n","module.exports = \":host ::ng-deep .k-tabstrip>.k-content {\\r\\n background-color: #f6f6f6 !important;\\r\\n}\\r\\n\\r\\n.dialog-post {\\r\\n z-index: 1000 !important;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 300px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9hY2NvdW50L2FjY291bnQuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLHdCQUF3QjtBQUM1Qjs7QUFFQSxtQkFBbUI7O0FBQ25CO0lBQ0ksZUFBZTtJQUNmLFNBQVM7SUFDVCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakI7O0FBRUE7SUFDSTtRQUNJLGVBQWU7UUFDZixTQUFTO1FBQ1QsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkOztJQUVBO1FBQ0ksZUFBZTtRQUNmLFVBQVU7UUFDVixjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixVQUFVO0lBQ2Q7QUFDSjs7QUFFQSxtQkFBbUI7O0FBR25CO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCIiwiZmlsZSI6InNyYy9hcHAvZGF0YS9hY2NvdW50L2FjY291bnQuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIjpob3N0IDo6bmctZGVlcCAuay10YWJzdHJpcD4uay1jb250ZW50IHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNmY2ZjYgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmRpYWxvZy1wb3N0IHtcclxuICAgIHotaW5kZXg6IDEwMDAgIWltcG9ydGFudDtcclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiA3NnB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk4JTtcclxufVxyXG5cclxuLnN0aWNreS10b29sYmFyLWJ0bi11c2Vye1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAxOTNweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OS41NSU7XHJcbn1cclxuXHJcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjhweCkge1xyXG4gICAgLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDc2cHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk0JTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLnN0aWNreS10b29sYmFyLWJ0bi11c2Vye1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDE5M3B4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5OSU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qIHN0aWNreSB0b29sYmFyICovXHJcblxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5zdGlja3ktaGVhZGVyLWdyaWQgLmstZ3JpZCAuay1ncmlkLWhlYWRlciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDMwMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk3LjU1JTtcclxufSJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Account_LockFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Account_DelFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{'Account_DisplayFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, ɵConsole, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport * as DecoupledEditor from '@ckeditor/ckeditor5-build-decoupled-document';\r\n\r\n@Component({\r\n selector: 'app-account',\r\n templateUrl: './account.component.html',\r\n styleUrls: ['./account.component.css']\r\n})\r\nexport class AccountComponent implements OnInit, OnDestroy {\r\n\r\n isStickySearch = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isStickySearch = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataAccounts = [];\r\n dataAccountSelectableSettings: SelectableSettings;\r\n dataAccountSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataAccountFocus = {\r\n Name: true\r\n };\r\n dataAccountSortByField: SortDescriptor[] = [\r\n ];\r\n\r\n public WKS_NUM_PAGING_SKIP = 0;\r\n public WKS_NUM_PAGING_TAKE = 50;\r\n public WKS_NUM_PAGING_BTN = 5;\r\n\r\n dataAccountSkip = this.WKS_NUM_PAGING_SKIP;\r\n dataAccountPageSize = this.WKS_NUM_PAGING_TAKE;\r\n dataAccountSelection: number[] = [];\r\n dataAccountItem: any;\r\n dataAccountItemEnLanguage: any;\r\n myInterval: any;\r\n\r\n public Editor = DecoupledEditor;\r\n config = {\r\n toolbar: ['heading',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'link',\r\n 'bulletedList',\r\n 'numberedList',\r\n '|',\r\n 'indent',\r\n 'outdent',\r\n '|',\r\n 'insertTable',\r\n 'mediaEmbed',\r\n 'undo',\r\n 'redo']\r\n }\r\n\r\n public buttonCount = this.WKS_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n infoOpened = false;\r\n\r\n public dataAccountState: State = {\r\n skip: this.dataAccountSkip,\r\n take: this.dataAccountSkip + this.dataAccountPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'RoleName' }]\r\n };\r\n dataAccountGridDataResult: GridDataResult;\r\n\r\n units: Array<{ Name: string, ID: string }>;\r\n unitsFilter: Array<{ Name: string, ID: string }>;\r\n genders: Array<{ Name: string, ID: string }>;\r\n parts: Array<{ Name: string, ID: string }>;\r\n partsFilter: Array<{ Name: string, ID: string }>;\r\n\r\n accountParents: Array<{ Name: string, ID: string }>;\r\n accountParentsFilter: Array<{ Name: string, ID: string }>;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n pageName: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n InputingFile = false;\r\n dataAccountItemtemp: any;\r\n imgImageDefault: any;\r\n imageDef: any;\r\n public imgSaveUrl: any;\r\n imgImageMain: any;\r\n public uploadFlgDefault = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n uploadFlg = this.uploadFlgDefault;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n public appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.imgSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=image`;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n // bind current context(this) of our component instance to [fetchData]\r\n this.allData = this.allData.bind(this);\r\n }\r\n\r\n // used to export all kendo-grid data(not care for paging) to excel file(s)\r\n public allData(): ExcelExportData {\r\n // show loading icon to let user know heavy-export is occurring\r\n this.appComponent.loading = true;\r\n const result: ExcelExportData = {\r\n data: process(this.dataAccounts, { sort: this.dataAccountSortByField }).data\r\n };\r\n // unshow loading icon\r\n this.appComponent.loading = false;\r\n return result;\r\n }\r\n\r\n unitsHandleFilter(value) {\r\n this.unitsFilter = this.units.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n partsHandleFilter(value) {\r\n this.partsFilter = this.parts.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n accountParentsHandleFilter(value) {\r\n this.accountParentsFilter = this.accountParents.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n this.getPageName();\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.allowMulti = !this.allowMulti;\r\n if (this.InputingFile == true) {\r\n this.allowMulti = false;\r\n this.dataAccountSelectableSettings = {\r\n enabled: false,\r\n mode: 'single'\r\n };\r\n } else {\r\n this.dataAccountSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n }\r\n\r\n setSelectableSettingsFile(): void {\r\n this.dataAccountSelectableSettings = {\r\n enabled: true,\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getAccounts() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n this.dataAccountSelection = [];\r\n\r\n const result = await this.appService.doGET('api/Account/Search', dataRequest);\r\n if (result) {\r\n this.dataAccounts = result.Data;\r\n this.bindAccounts();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n\r\n const resultParent = await this.appService.doGET('api/Account', null);\r\n if (resultParent) {\r\n this.accountParents = resultParent.Data;\r\n this.accountParentsFilter = this.accountParents.slice();\r\n }\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataAccountSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataAccounts.find((item) => {\r\n return item.ID === this.dataAccountSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataAccountSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataAccountItem = {\r\n IsAdd: true,\r\n ID: this.guid.empty,\r\n Name: '',\r\n Gender: 0,\r\n Phone: '',\r\n Email: '',\r\n UnitID: null,\r\n LockFlg: false,\r\n DelFlg: false,\r\n BirthDay: null,\r\n AvatarUrl: '',\r\n PartID: null,\r\n ParentID: null,\r\n Description: null,\r\n OrderIdx: null,\r\n DisplayFlg: false\r\n };\r\n this.dataAccountItemEnLanguage = {\r\n ID: null,\r\n AccountID: null,\r\n Description: null,\r\n CreateAt: null,\r\n CreateBy: null,\r\n UpdateAt: null,\r\n UpdateBy: null,\r\n LanguageID: null,\r\n };\r\n\r\n this.dataAccountItemtemp = Object.assign({}, this.dataAccountItem);\r\n this.imageDef = '../../assets/images/default-02.png';\r\n this.imgImageDefault = [\r\n this.imageDef,\r\n ];\r\n this.imgImageMain = [''];\r\n this.uploadFlg = this.uploadFlgDefault;\r\n }\r\n bindtemp(item) {\r\n\r\n this.dataAccountItemtemp = Object.assign({}, item);\r\n }\r\n\r\n onAccountPageChange(event: PageChangeEvent) {\r\n this.dataAccountSkip = event.skip;\r\n this.bindAccounts();\r\n }\r\n\r\n async onAccountSelectedKeysChange() {\r\n\r\n if (this.dataAccountSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataAccountSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n if (this.dataAccounts.length > 0 && this.InputingFile == false) {\r\n const selectedID = this.dataAccountSelection[0];\r\n const selectedItem = this.dataAccounts.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataAccountItem = selectedItem;\r\n this.dataAccountItem.BirthDay = this.dataAccountItem.BirthDay ? new Date(this.dataAccountItem.BirthDay) : null;\r\n\r\n this.imgImageDefault = [];\r\n //call api get base 64 to render image\r\n if (this.dataAccountItem.AvatarUrl) {\r\n const dataRequest = {\r\n imagePath: `${this.dataAccountItem.AvatarUrl}`\r\n };\r\n\r\n const result = await this.appService.doGET('api/Post/GetBase64ImageResult', dataRequest);\r\n\r\n if (result && result.Status === 1) {\r\n if (result.Data != null && result.Data.Base64 != null && result.Data.Base64 !== '') {\r\n const url = result.Data.Base64;\r\n this.imgImageDefault[0] = url;\r\n }\r\n }\r\n } else {\r\n this.imageDef = '../../assets/images/default-02.png';\r\n this.imgImageDefault = [\r\n this.imageDef,\r\n ];\r\n }\r\n\r\n this.bindtemp(this.dataAccountItem);\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.uploadFlg.image = false;\r\n }\r\n }\r\n }\r\n\r\n bindAccounts() {\r\n this.dataAccountGridDataResult = {\r\n data: orderBy(this.dataAccounts, this.dataAccountSortByField),\r\n total: this.dataAccounts.length\r\n };\r\n\r\n this.dataAccountGridDataResult = process(this.dataAccounts, this.dataAccountState);\r\n }\r\n\r\n onAccountSortChange(sort: SortDescriptor[]): void {\r\n this.dataAccountSortByField = sort;\r\n this.bindAccounts();\r\n }\r\n\r\n public onAccountDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataAccountSelection = [];\r\n this.dataAccountState = state;\r\n this.dataAccountGridDataResult = process(this.dataAccounts, this.dataAccountState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n 'Name',\r\n 'Gender',\r\n 'Phone',\r\n 'Email',\r\n 'BirthDay',\r\n 'PartID'\r\n ];\r\n return columns.indexOf(name);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n const extension = e.files[0].extension.toLowerCase();\r\n if (!extension || (extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.pdf')) {\r\n \r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .xlsx, .xls.', false);\r\n\r\n return false;\r\n }\r\n\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n this.InputingFile = true;\r\n this.setSelectableSettings();\r\n this.dataAccounts = [];\r\n let part;\r\n let gender;\r\n let brithDay;\r\n for (let i = 1; i < fileData.length; i++) {\r\n\r\n part = this.appUtils.getObjectByList(this.parts, fileData[i][this.getColumnIndex('PartID')]);\r\n gender = this.appUtils.getObjectByList(this.genders, fileData[i][this.getColumnIndex('Gender')]);\r\n brithDay = this.appUtils.getDate(fileData[i][this.getColumnIndex('BirthDay')]);\r\n\r\n this.dataAccounts.push({\r\n IsAdd: false,\r\n ID: this.guid.empty,\r\n Name: fileData[i][this.getColumnIndex('Name')],\r\n Gender: gender ? gender.ID : null,\r\n GenderName: gender ? gender.Name : '',\r\n Phone: fileData[i][this.getColumnIndex('Phone')],\r\n Email: fileData[i][this.getColumnIndex('Email')],\r\n BirthDay: brithDay ? brithDay.Value : null,\r\n PartID: part ? part.ID : null,\r\n PartName: part ? part.Name : null,\r\n LockFlg: false,\r\n DelFlg: false\r\n });\r\n }\r\n this.bindAccounts();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n const resultRole = await this.appService.doGET('api/Unit', null);\r\n if (resultRole && resultRole.Status === 1) {\r\n this.units = resultRole.Data;\r\n this.unitsFilter = this.units.slice();\r\n }\r\n\r\n const resultGender = await this.appService.doGET('api/Enum/GetEGender', null);\r\n if (resultGender && resultGender.Status === 1) {\r\n this.genders = resultGender.Data;\r\n }\r\n\r\n const resultPart = await this.appService.doGET('api/Part', null);\r\n if (resultPart && resultPart.Status === 1) {\r\n this.parts = resultPart.Data;\r\n this.partsFilter = this.parts.slice();\r\n }\r\n }\r\n\r\n onSearch() {\r\n this.getAccounts();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.InputingFile = false;\r\n this.setSelectableSettingsFile();\r\n this.searchOption.SearchText = '';\r\n this.getAccounts();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearAccount() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewAccount() {\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n onSaveAccount() {\r\n if (this.dataAccountItem.IsAdd) { this.addAccount(); } else { this.updateAccount(); }\r\n }\r\n\r\n async onSaveAccounts() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n for (let i = 0; i < this.dataAccounts.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataAccounts[i]));\r\n }\r\n if (dataRequests.length < 1) {\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n this.appComponent.loading = false;\r\n this.appSwal.showWarning(this.translate.instant('Error_NoItem_Save'), false);\r\n return;\r\n }\r\n const result = await this.appService.doPOST('api/Account/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataAccountItemtemp;\r\n const tempEnLanguage = this.dataAccountItemEnLanguage;\r\n return {\r\n Account: {\r\n IsAdd: temp.IsAdd,\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n Gender: temp.Gender,\r\n Phone: temp.Phone,\r\n Email: temp.Email,\r\n UnitID: temp.UnitID,\r\n LockFlg: temp.LockFlg,\r\n DelFlg: temp.DelFlg,\r\n BirthDay: temp.BirthDay ? this.intl.formatDate(new Date(temp.BirthDay), 'yyyy-MM-ddT00:00:00') : null,\r\n AvatarUrl: temp.AvatarUrl,\r\n CreateAt: temp.CreateAt,\r\n UpdateAt: temp.UpdateAt,\r\n PartID: temp.PartID,\r\n ParentID: temp.ParentID,\r\n Description: temp.Description,\r\n OrderIdx: temp.OrderIdx,\r\n DisplayFlg: temp.DisplayFlg\r\n },\r\n EnLanguage: {\r\n ID: tempEnLanguage.ID,\r\n AccountID: tempEnLanguage.AccountID,\r\n Description: tempEnLanguage.Description,\r\n CreateAt: tempEnLanguage.CreateAt,\r\n CreateBy: tempEnLanguage.CreateBy,\r\n UpdateAt: tempEnLanguage.UpdateAt,\r\n UpdateBy: tempEnLanguage.UpdateBy,\r\n LanguageID: 'en-US'\r\n }\r\n \r\n };\r\n }\r\n\r\n onCloseAccount(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n\r\n onEditAccount() {\r\n this.infoOpened = true;\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.getLanguage();\r\n }\r\n\r\n async addAccount() {\r\n this.appComponent.loading = true;\r\n this.dataAccountItemtemp.AvatarUrl = (this.uploadFlg.image === true && this.imgImageMain && this.imgImageMain.length > 0)\r\n ? this.imgImageMain[0] : null;\r\n\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Account', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewAccount();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.infoOpened = false;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateAccount() {\r\n this.appComponent.loading = true;\r\n this.dataAccountItemtemp.AvatarUrl = (this.uploadFlg.image === true && this.imgImageMain && this.imgImageMain.length > 0)\r\n ? this.imgImageMain[0] : this.dataAccountItemtemp.AvatarUrl;\r\n const id = this.dataAccountItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPUT('api/Account', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.infoOpened = false;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteAccount() {\r\n if (this.dataAccountSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataAccountSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Account/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataAccountSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n async onImageUrlSelectEventHandler(e: SelectEvent, index) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n // tslint:disable-next-line: max-line-length\r\n if (e.files[0].extension !== '.jpg' && e.files[0].extension !== '.png' && e.files[0].extension !== '.gif' && e.files[0].extension !== '.jpeg') {\r\n this.appSwal.showWarning(this.translate.instant('MsgImgOnly'), false);\r\n return false;\r\n }\r\n\r\n this.appComponent.loading = true;\r\n const fileData = await this.file.readImage(e.files[0].rawFile);\r\n const base64 = `${fileData}`;\r\n this.imgImageDefault[index] = this.domSanitizer.bypassSecurityTrustResourceUrl(base64);\r\n this.imgImageDefault.push(this.imageDef);\r\n }\r\n\r\n onImageUrlSuccessEventHandle(e: any, index) {\r\n try {\r\n this.appComponent.loading = false;\r\n this.uploadFlg.image = true;\r\n this.imgImageMain[index] = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n } catch {\r\n this.uploadFlg.image = false;\r\n }\r\n }\r\n\r\n onImageUrlRemoveEventHandler(index) {\r\n this.imgImageMain[index] = '';\r\n }\r\n\r\n public onTabSelect(e) {\r\n \r\n }\r\n\r\n async getLanguage(){\r\n var k = 0;\r\n if(this.dataAccountItem.ID != null){\r\n const dataRequest = {\r\n id: this.dataAccountItem.ID\r\n }\r\n const result = await this.appService.doGET('api/Account/GetAccountLanguage', dataRequest);\r\n if (result && result.Status == 1) {\r\n for(let i = 0; i < result.Data.length; i++){\r\n if(result.Data[i].LanguageID == \"en-US\"){\r\n this.dataAccountItemEnLanguage = result.Data[i];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","module.exports = \".bra-name {\\r\\n color: blue;\\r\\n}\\r\\n\\r\\n[_nghost-c0] .k-panelbar>.k-item>.k-link.k-state-selected {\\r\\n background-color: #7c9bb7 !important;\\r\\n}\\r\\n\\r\\n.banner-element,\\r\\n.video-element {\\r\\n display: inline-block;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n.banner-element {\\r\\n width: 100%;\\r\\n height: 156px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.banner-element img {\\r\\n width: 100%;\\r\\n height: 156px;\\r\\n}\\r\\n\\r\\n.video-element {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.video-element img {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n}\\r\\n\\r\\n.image-element {\\r\\n width: 210px;\\r\\n height: 140px;\\r\\n padding: 0;\\r\\n margin-left: 17px;\\r\\n margin-right: 17px;\\r\\n}\\r\\n\\r\\n.image-element img {\\r\\n width: 100px;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\n.custom-list {\\r\\n width: 40%;\\r\\n display: contents;\\r\\n}\\r\\n\\r\\n.custom-list-status {\\r\\n width: 50%;\\r\\n display: contents;\\r\\n}\\r\\n\\r\\n.custom-list-status input {\\r\\n margin-top: 4px;\\r\\n}\\r\\n\\r\\n.custom-list-child {\\r\\n display: block;\\r\\n margin-left: 20px;\\r\\n}\\r\\n\\r\\n.element-search {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.element-search {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.image-upload-cus {\\r\\n display: contents;\\r\\n width: 100%;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\nagm-map {\\r\\n height: 506px;\\r\\n}\\r\\n\\r\\n.file-uploaded {\\r\\n color: #006CB7 !important;\\r\\n width: 182px;\\r\\n float: right;\\r\\n margin-top: 36px;\\r\\n}\\r\\n\\r\\n.none {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 14px;\\r\\n font-size: 20px;\\r\\n color: #006CB7;\\r\\n font-weight: 500;\\r\\n background-color: #f5f5f5;\\r\\n /* text-transform: capitalize; */\\r\\n}\\r\\n\\r\\n.dialog-post {\\r\\n z-index: 1000 !important;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9hZC1wcm9jZWR1cmUvYWQtcHJvY2VkdXJlLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxvQ0FBb0M7QUFDeEM7O0FBRUE7O0lBRUkscUJBQXFCO0lBQ3JCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0lBQ2IsVUFBVTtBQUNkOztBQUVBO0lBQ0ksV0FBVztJQUNYLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLFVBQVU7QUFDZDs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGFBQWE7SUFDYixVQUFVO0lBQ1YsaUJBQWlCO0lBQ2pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLFlBQVk7SUFDWixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksVUFBVTtJQUNWLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLFVBQVU7SUFDVixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksY0FBYztJQUNkLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsV0FBVztJQUNYLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxhQUFhO0FBQ2pCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWixZQUFZO0lBQ1osZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsZ0NBQWdDO0FBQ3BDOztBQUVBO0lBQ0ksd0JBQXdCO0FBQzVCIiwiZmlsZSI6InNyYy9hcHAvZGF0YS9hZC1wcm9jZWR1cmUvYWQtcHJvY2VkdXJlLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuYnJhLW5hbWUge1xyXG4gICAgY29sb3I6IGJsdWU7XHJcbn1cclxuXHJcbltfbmdob3N0LWMwXSAuay1wYW5lbGJhcj4uay1pdGVtPi5rLWxpbmsuay1zdGF0ZS1zZWxlY3RlZCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2M5YmI3ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5iYW5uZXItZWxlbWVudCxcclxuLnZpZGVvLWVsZW1lbnQge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcclxufVxyXG5cclxuLmJhbm5lci1lbGVtZW50IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxNTZweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi5iYW5uZXItZWxlbWVudCBpbWcge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDE1NnB4O1xyXG59XHJcblxyXG4udmlkZW8tZWxlbWVudCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMjA2cHg7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG59XHJcblxyXG4udmlkZW8tZWxlbWVudCBpbWcge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDIwNnB4O1xyXG59XHJcblxyXG4uaW1hZ2UtZWxlbWVudCB7XHJcbiAgICB3aWR0aDogMjEwcHg7XHJcbiAgICBoZWlnaHQ6IDE0MHB4O1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbi1sZWZ0OiAxN3B4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAxN3B4O1xyXG59XHJcblxyXG4uaW1hZ2UtZWxlbWVudCBpbWcge1xyXG4gICAgd2lkdGg6IDEwMHB4O1xyXG4gICAgaGVpZ2h0OiAxMDBweDtcclxufVxyXG5cclxuLmN1c3RvbS1saXN0IHtcclxuICAgIHdpZHRoOiA0MCU7XHJcbiAgICBkaXNwbGF5OiBjb250ZW50cztcclxufVxyXG5cclxuLmN1c3RvbS1saXN0LXN0YXR1cyB7XHJcbiAgICB3aWR0aDogNTAlO1xyXG4gICAgZGlzcGxheTogY29udGVudHM7XHJcbn1cclxuXHJcbi5jdXN0b20tbGlzdC1zdGF0dXMgaW5wdXQge1xyXG4gICAgbWFyZ2luLXRvcDogNHB4O1xyXG59XHJcblxyXG4uY3VzdG9tLWxpc3QtY2hpbGQge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBtYXJnaW4tbGVmdDogMjBweDtcclxufVxyXG5cclxuLmVsZW1lbnQtc2VhcmNoIHtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG59XHJcblxyXG4uZWxlbWVudC1zZWFyY2gge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5pbWFnZS11cGxvYWQtY3VzIHtcclxuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMHB4O1xyXG59XHJcblxyXG5hZ20tbWFwIHtcclxuICAgIGhlaWdodDogNTA2cHg7XHJcbn1cclxuXHJcbi5maWxlLXVwbG9hZGVkIHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3ICFpbXBvcnRhbnQ7XHJcbiAgICB3aWR0aDogMTgycHg7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICBtYXJnaW4tdG9wOiAzNnB4O1xyXG59XHJcblxyXG4ubm9uZSB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4uZ3JvdXAtaGVhZGVyIHtcclxuICAgIHBhZGRpbmctdG9wOiAxM3B4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEzcHg7XHJcbiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDZDQjc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDE0cHg7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xyXG4gICAgLyogdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7ICovXHJcbn1cclxuXHJcbi5kaWFsb2ctcG9zdCB7XHJcbiAgICB6LWluZGV4OiAxMDAwICFpbXBvcnRhbnQ7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'AdProcedure_PostalServiceFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n Mức độ {{dataItem.PublicService}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'AdProcedure_PostalServiceFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \"","\r\nimport { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\n\r\n@Component({\r\n selector: 'app-ad-procedure',\r\n templateUrl: './ad-procedure.component.html',\r\n styleUrls: ['./ad-procedure.component.css']\r\n})\r\nexport class AdProcedureComponent implements OnInit, OnDestroy {\r\n //codeimage\r\n commentInput = null;\r\n\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n dataAdProcedures = [];\r\n adProceduresFilter = [];\r\n dataAdProcedureSelectableSettings: SelectableSettings;\r\n dataAdProcedureSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataAdProcedureFocus = {\r\n Name: true\r\n };\r\n dataAdProcedureSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataAdProcedureSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataAdProcedurePageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataAdProcedureSelection: number[] = [];\r\n dataAdProcedureItem: any;\r\n myInterval: any;\r\n isRight100p = false;\r\n pageName: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataAdProcedureState: State = {\r\n skip: this.dataAdProcedureSkip,\r\n take: this.dataAdProcedureSkip + this.dataAdProcedurePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n dataAdProcedureGridDataResult: GridDataResult;\r\n\r\n dataTemplateFileUrlsGridDataResult: GridDataResult;\r\n dataTemplateFileUrlsSelectableSettings: SelectableSettings;\r\n dataTemplateFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataTemplateFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataTemplateFileUrlsSelection: number[] = [];\r\n\r\n fieldTypes: Array<{ Name: string, ID: string }>;\r\n fieldTypesFilter: Array<{ Name: string, ID: string }>;\r\n fieldTypesSearch: Array<{ Name: string, ID: string }>;\r\n\r\n templateTypes: Array<{ Name: string, ID: string }> = [];\r\n templateTypesFilter: Array<{ Name: string, ID: string }> = [];\r\n\r\n baseJuridicalTypes: Array<{ Name: string, ID: string }> = [];\r\n baseJuridicalTypesFilter: Array<{ Name: string, ID: string }> = [];\r\n\r\n dataTemplateTypeID = [];\r\n dataBaseJuridicalTypeID = [];\r\n dataAdProcedure = [];\r\n\r\n filesUpload: Array;\r\n dataTemplateFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n placeActives: Array<{ Name: string, ID: number }>;\r\n publicServices: Array<{ Name: string, ID: number }>;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n allowInsertFile = true;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n FieldTypeID: null,\r\n PlaceActive: -1,\r\n PublicService: -1,\r\n PostalServiceFlg: null\r\n };\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataAdProcedureSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataTemplateFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onFieldTypeHandleFilter(value) {\r\n this.fieldTypesFilter = this.fieldTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onFieldTypeSearchHandleFilter(value) {\r\n this.fieldTypesSearch = this.fieldTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onTemplateTypesHandleFilter(value) {\r\n this.templateTypesFilter = this.templateTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onBaseJuridicalTypesHandleFilter(value) {\r\n this.baseJuridicalTypesFilter = this.baseJuridicalTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onAdProceduresHandleFilter(value) {\r\n this.adProceduresFilter = this.dataAdProcedures.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onTypeSearchHandleFilter(value) {\r\n this.onReload();\r\n }\r\n\r\n\r\n onSearchKeyPress(e: any) {\r\n // if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n // this.onSearch();\r\n // }\r\n }\r\n\r\n async getAdProcedures() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n FieldTypeID: this.searchOption.FieldTypeID,\r\n PlaceActive: this.searchOption.PlaceActive,\r\n PublicService: this.searchOption.PublicService,\r\n PostalServiceFlg: this.searchOption.PostalServiceFlg\r\n };\r\n\r\n const result = await this.appService.doPOST('api/AdProcedure/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataAdProcedures = result.Data;\r\n this.adProceduresFilter = this.dataAdProcedures.slice();\r\n this.bindAdProcedures();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataAdProcedureSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataAdProcedures.find((item) => {\r\n return item.ID === this.dataAdProcedureSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataAdProcedureSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataAdProcedureItem = {\r\n IsAdd: true,\r\n Name: null,\r\n OrderActive: null,\r\n MethodActive: null,\r\n FileInfo: null,\r\n ResolveDate: null,\r\n ObjectActive: null,\r\n PlaceActive: 0,\r\n ResultActive: null,\r\n TemplateTypeID: null,\r\n TemplateFileUrl: null,\r\n Fees: null,\r\n ConditionAtive: null,\r\n BaseJuridicalTypeID: null,\r\n BaseJuridicalFileUrl: null,\r\n AdProcedure: null,\r\n PublicService: null,\r\n PublicServiceLink: null,\r\n FieldTypeID: null,\r\n PostalServiceFlg: null,\r\n CreateAt: new Date(),\r\n UpdateAt: new Date(),\r\n DelFlg: null,\r\n Code: null\r\n };\r\n\r\n this.dataTemplateTypeID = [];\r\n this.dataBaseJuridicalTypeID = [];\r\n this.dataAdProcedure = [];\r\n this.dataAdProcedureSelection = [];\r\n this.filesUpload = [];\r\n this.dataTemplateFileUrls = [];\r\n this.bindTemplateFileUrls();\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n }\r\n\r\n onPostPageChange(event: PageChangeEvent) {\r\n this.dataAdProcedureSkip = event.skip;\r\n this.bindAdProcedures();\r\n }\r\n\r\n async onAdProcedureselectedKeysChange() {\r\n\r\n if (this.dataAdProcedureSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataAdProcedureSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataAdProcedureSelection[0];\r\n const selectedItem = this.dataAdProcedures.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n selectedItem.PublishAt = selectedItem.PublishAt ? new Date(selectedItem.PublishAt) : null;\r\n\r\n this.dataAdProcedureItem = selectedItem;\r\n\r\n const TemplateFileUrl = selectedItem.TemplateFileUrl;\r\n this.dataTemplateFileUrls = [];\r\n if (TemplateFileUrl) {\r\n this.dataTemplateFileUrls.push({\r\n Name: this.getNameByUrl(selectedItem.TemplateFileUrl),\r\n Url: selectedItem.TemplateFileUrl\r\n });\r\n }\r\n this.bindTemplateFileUrls();\r\n\r\n let temp = [];\r\n if (selectedItem.TemplateTypeID) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.templateTypes.length; i++) {\r\n if (selectedItem.TemplateTypeID.indexOf(this.templateTypes[i].ID) >= 0) {\r\n temp.push(this.templateTypes[i]);\r\n }\r\n }\r\n }\r\n this.dataTemplateTypeID = temp;\r\n\r\n temp = [];\r\n if (selectedItem.BaseJuridicalTypeID) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.baseJuridicalTypes.length; i++) {\r\n if (selectedItem.BaseJuridicalTypeID.indexOf(this.baseJuridicalTypes[i].ID) >= 0) {\r\n temp.push(this.templateTypes[i]);\r\n }\r\n }\r\n }\r\n this.dataBaseJuridicalTypeID = temp;\r\n\r\n temp = [];\r\n if (selectedItem.AdProcedure) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataAdProcedures.length; i++) {\r\n if (selectedItem.AdProcedure.indexOf(this.dataAdProcedures[i].ID) >= 0) {\r\n temp.push(this.dataAdProcedures[i]);\r\n }\r\n }\r\n }\r\n this.dataAdProcedure = temp;\r\n\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindAdProcedures() {\r\n this.dataAdProcedureGridDataResult = {\r\n data: orderBy(this.dataAdProcedures, this.dataAdProcedureSortByField),\r\n total: this.dataAdProcedures.length\r\n };\r\n\r\n this.dataAdProcedureGridDataResult = process(this.dataAdProcedures, this.dataAdProcedureState);\r\n }\r\n\r\n bindTemplateFileUrls() {\r\n this.dataTemplateFileUrlsGridDataResult = {\r\n data: this.dataTemplateFileUrls,\r\n total: this.dataTemplateFileUrls.length\r\n };\r\n\r\n this.dataAdProcedureGridDataResult = process(this.dataAdProcedures, this.dataAdProcedureState);\r\n }\r\n\r\n onAdProceduresortChange(sort: SortDescriptor[]): void {\r\n this.dataAdProcedureSortByField = sort;\r\n this.bindAdProcedures();\r\n }\r\n\r\n public onPostDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataAdProcedureSelection = [];\r\n this.dataAdProcedureState = state;\r\n this.dataAdProcedureGridDataResult = process(this.dataAdProcedures, this.dataAdProcedureState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n\r\n // mau don, to khai\r\n const resultTemplateType = await this.appService.doGET('api/AdProcedure/GetTemplateType', null);\r\n if (resultTemplateType && resultTemplateType.Status === 1) {\r\n this.templateTypes = resultTemplateType.Data;\r\n this.templateTypesFilter = this.templateTypes.slice();\r\n }\r\n\r\n // can cu phap ly\r\n const resultBaseJuridicalType = await this.appService.doGET('api/AdProcedure/GetBaseJuridicalType', null);\r\n if (resultBaseJuridicalType && resultBaseJuridicalType.Status === 1) {\r\n this.baseJuridicalTypes = resultBaseJuridicalType.Data;\r\n this.baseJuridicalTypesFilter = this.baseJuridicalTypes.slice();\r\n }\r\n\r\n // linh vuc\r\n const resultFieldType = await this.appService.doGET('api/AdProcedure/GetFieldType', null);\r\n if (resultFieldType && resultFieldType.Status === 1) {\r\n this.fieldTypes = resultFieldType.Data;\r\n this.fieldTypesFilter = this.fieldTypes.slice();\r\n this.fieldTypesSearch = this.fieldTypes.slice();\r\n }\r\n\r\n this.placeActives = [\r\n { Name: 'Tất cả', ID: -1 },\r\n { Name: 'UBND quận', ID: 0 },\r\n { Name: 'UBND phường', ID: 1 }\r\n ];\r\n\r\n this.publicServices = [\r\n { Name: 'Tất cả', ID: -1 },\r\n { Name: 'Mức độ 2', ID: 2 },\r\n { Name: 'Mức độ 3', ID: 3 },\r\n { Name: 'Mức độ 4', ID: 4 }\r\n ];\r\n }\r\n\r\n onSearch() {\r\n this.getAdProcedures();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n //this.searchOption.SearchText = '';\r\n this.getAdProcedures();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearPost() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewPost() {\r\n \r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n async onSavePost() {\r\n if (this.dataAdProcedureItem.IsAdd) { this.addPost(); } else { this.updatePost(); }\r\n }\r\n\r\n async onSaveAdProcedures() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataAdProcedures.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataAdProcedures[i]));\r\n }\r\n const result = await this.appService.doPOST('api/AdProcedure/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataAdProcedureItem;\r\n\r\n let templateFileUrl = '';\r\n if (this.dataTemplateFileUrls.length > 0) {\r\n templateFileUrl = this.dataTemplateFileUrls[0].Url;\r\n }\r\n\r\n const templateTypeIDJSON: any[] = [];\r\n if (this.dataTemplateTypeID.length > 0) {\r\n for (let i = 0; i < this.dataTemplateTypeID.length; i++) {\r\n templateTypeIDJSON.push(this.dataTemplateTypeID[i].ID);\r\n }\r\n }\r\n\r\n const baseJuridicalTypeIDJSON: any[] = [];\r\n if (this.dataBaseJuridicalTypeID.length > 0) {\r\n for (let i = 0; i < this.dataBaseJuridicalTypeID.length; i++) {\r\n baseJuridicalTypeIDJSON.push(this.dataBaseJuridicalTypeID[i].ID);\r\n }\r\n }\r\n\r\n const adProcedureJSON: any[] = [];\r\n if (this.dataAdProcedure.length > 0) {\r\n for (let i = 0; i < this.dataAdProcedure.length; i++) {\r\n adProcedureJSON.push(this.dataAdProcedure[i].ID);\r\n }\r\n }\r\n\r\n //\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n OrderActive: temp.OrderActive,\r\n MethodActive: temp.MethodActive,\r\n FileInfo: temp.FileInfo,\r\n ResolveDate: temp.ResolveDate,\r\n ObjectActive: temp.ObjectActive,\r\n PlaceActive: temp.PlaceActive,\r\n ResultActive: temp.ResultActive,\r\n TemplateTypeID: templateTypeIDJSON.length > 0 ? JSON.stringify(templateTypeIDJSON) : null,\r\n TemplateFileUrl: templateFileUrl,\r\n Fees: temp.Fees,\r\n ConditionAtive: temp.ConditionAtive,\r\n BaseJuridicalTypeID: baseJuridicalTypeIDJSON.length > 0 ? JSON.stringify(baseJuridicalTypeIDJSON) : null,\r\n BaseJuridicalFileUrl: temp.BaseJuridicalFileUrl,\r\n AdProcedure: adProcedureJSON.length > 0 ? JSON.stringify(adProcedureJSON) : null,\r\n PublicService: temp.PublicService,\r\n PublicServiceLink: temp.PublicServiceLink,\r\n FieldTypeID: temp.FieldTypeID,\r\n PostalServiceFlg: temp.PostalServiceFlg,\r\n CreateAt: temp.CreateAt,\r\n UpdateAt: temp.UpdateAt,\r\n DelFlg: temp.DelFlg,\r\n Code: temp.Code\r\n };\r\n }\r\n\r\n onClosePost(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n onEditPost() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async addPost() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPOST('api/AdProcedure', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updatePost() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataAdProcedureItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataAdProcedureItem);\r\n\r\n const result = await this.appService.doPUT('api/AdProcedure', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeletePost() {\r\n if (this.dataAdProcedureSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataAdProcedureSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/AdProcedure/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewPost();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataAdProcedureSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n getNameByUrl(TemplateFileUrl) {\r\n const nameFile = TemplateFileUrl.replace(/^.*[\\\\\\/]/, '');\r\n\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(dataItem: any) {\r\n\r\n const dataRequest = {\r\n url: dataItem.Url\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, dataItem.Name);\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataTemplateFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataTemplateFileUrls[i].Url === dataItem.Url) {\r\n this.dataTemplateFileUrls.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n this.bindTemplateFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataAdProcedures, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n\r\n if (!e.files || e.files.length <= 0) {\r\n return;\r\n }\r\n\r\n const extension = e.files[0].extension.toLowerCase();\r\n\r\n this.allowInsertFile = true;\r\n\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 30;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n // this.dataTemplateFileUrls = [];\r\n // this.bindTemplateFileUrls();\r\n }\r\n } catch {\r\n }\r\n\r\n // tslint:disable-next-line: max-line-length\r\n if (!extension || (extension.toLowerCase() !== '.doc' && extension.toLowerCase() !== '.docx' && extension.toLowerCase() !== '.pdf')) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .doc, .docx, .pdf', false);\r\n // this.dataTemplateFileUrls = [];\r\n // this.bindTemplateFileUrls();\r\n\r\n return false;\r\n }\r\n\r\n\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n\r\n if (!this.allowInsertFile) {\r\n return;\r\n }\r\n try {\r\n this.dataTemplateFileUrls = [];\r\n const k = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n this.dataTemplateFileUrls.push({\r\n Name: this.getNameByUrl(k),\r\n Url: k\r\n });\r\n\r\n this.bindTemplateFileUrls();\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n\r\n }\r\n\r\n onFullScreen() {\r\n this.isRight100p = !this.isRight100p;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n}\r\n\r\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2RhdGEvYXNrLWFuZC1yZXBseS1mZWVkYmFjay9hc2stYW5kLXJlcGx5LWZlZWRiYWNrLmNvbXBvbmVudC5jc3MifQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.CreateAt | date: 'dd/MM/yyyy HH:mm'}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.SendAt | date: 'dd/MM/yyyy HH:mm'}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.ReplyAt | date: 'dd/MM/yyyy HH:mm'}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{postItem.Title}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n Chuyển \\r\\n \\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ActivatedRoute } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-ask-and-reply-feedback',\r\n templateUrl: './ask-and-reply-feedback.component.html',\r\n styleUrls: ['./ask-and-reply-feedback.component.css']\r\n})\r\nexport class AskAndReplyFeedbackComponent implements OnInit, OnDestroy {\r\n //codeimage\r\n commentInput = null;\r\n\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n dataComments = [];\r\n dataCommentSelectableSettings: SelectableSettings;\r\n dataCommentSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataCommentFocus = {\r\n Name: true\r\n };\r\n dataCommentSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataCommentSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataCommentPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataCommentSelection: number[] = [];\r\n dataCommentItem: any;\r\n myInterval: any;\r\n pageName: any;\r\n\r\n postItem: any;\r\n infoOpened = false;\r\n unitOpened = false;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public commentFlg = false;\r\n\r\n public dataCommentState: State = {\r\n skip: this.dataCommentSkip,\r\n take: this.dataCommentSkip + this.dataCommentPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n dataCommentGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n menuIDs: Array<{ Name: string, ID: number }>;\r\n statuss: Array<{ Name: string, ID: number }>;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n FromDate: null,\r\n ToDate: null,\r\n MenuID: 0,\r\n Status: 0\r\n };\r\n\r\n units: Array<{ Name: string, ID: string }>;\r\n unitFilters: Array<{ Name: string, ID: string }>;\r\n dataSendItem = {\r\n UnitID: null\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private activatedRoute: ActivatedRoute,\r\n ) {\r\n\r\n this.activatedRoute.queryParams.subscribe((params: any) => {\r\n if (params && params.menuID) {\r\n this.searchOption.MenuID = params.menuID;\r\n }\r\n this.initDisplay();\r\n });\r\n\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n\r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataCommentSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onMenuIDSearchHandleFilter(value) {\r\n this.onReload();\r\n }\r\n\r\n\r\n onSearchKeyPress(e: any) {\r\n // if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n // this.onSearch();\r\n // }\r\n }\r\n\r\n async getComments() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n FromDate: this.searchOption.FromDate ? this.intl.formatDate(new Date(this.searchOption.FromDate), 'yyyy-MM-ddT00:00:00') : null,\r\n ToDate: this.searchOption.ToDate ? this.intl.formatDate(new Date(this.searchOption.ToDate), 'yyyy-MM-ddT00:00:00') : null,\r\n MenuID: this.searchOption.MenuID,\r\n Status: this.searchOption.Status\r\n };\r\n\r\n const result = await this.appService.doPOST('api/Comment/SearchByReplyUnit', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataComments = result.Data;\r\n this.bindComments();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataCommentSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataComments.find((item) => {\r\n return item.ID === this.dataCommentSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataCommentSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n onClickNotify(e: any) {\r\n const menuID = e;\r\n this.searchOption.MenuID = menuID;\r\n this.onReload();\r\n }\r\n\r\n setDefault() {\r\n this.dataCommentItem = {\r\n IsAdd: true,\r\n MenuID: this.searchOption.MenuID,\r\n FullName: null,\r\n Address: null,\r\n Phone: null,\r\n Phone1: null,\r\n Email: null,\r\n Title: null,\r\n PostID: null,\r\n Description: null,\r\n ApprovedFlg: null,\r\n Type: null,\r\n CreateAt: null,\r\n FeedbackContent: null,\r\n FeedbackBy: null,\r\n FeedbackAt: null,\r\n OftenFlg: false,\r\n SendAt: null,\r\n ReplyUnitID: null,\r\n ReplyFlg: null,\r\n ReplyAt: null,\r\n Note: null,\r\n };\r\n this.enabled = true;\r\n this.enabledID = true;\r\n\r\n this.dataSendItem = {\r\n UnitID: null\r\n };\r\n this.dataCommentSelection = [];\r\n this.filesUpload = [];\r\n this.dataFileUrls = [];\r\n this.bindFileUrls();\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n }\r\n\r\n onCommentPageChange(event: PageChangeEvent) {\r\n this.dataCommentSkip = event.skip;\r\n this.bindComments();\r\n }\r\n\r\n async onCommentselectedKeysChange() {\r\n\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataCommentSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataCommentSelection[0];\r\n const selectedItem = this.dataComments.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n //selectedItem.PublishAt = selectedItem.PublishAt ? new Date(selectedItem.PublishAt) : null;\r\n\r\n this.dataCommentItem = selectedItem;\r\n\r\n // const fileUrl = selectedItem.FileUrl;\r\n // this.dataFileUrls = [];\r\n // if (fileUrl) {\r\n // this.dataFileUrls.push({\r\n // Name: this.getNameByUrl(selectedItem.FileUrl),\r\n // Url: selectedItem.FileUrl\r\n // });\r\n // }\r\n // this.bindFileUrls();\r\n\r\n this.enabled = false;\r\n this.enabledID = false;\r\n\r\n\r\n const dataRequest = {\r\n id: this.dataCommentItem.PostID\r\n };\r\n\r\n this.postItem = null;\r\n // const resultRequestMenu = await this.appService.doGET('api/Post/GetById', dataRequest);\r\n // if (resultRequestMenu && resultRequestMenu.Status === 1) {\r\n // this.postItem = resultRequestMenu.Data;\r\n // }\r\n }\r\n }\r\n\r\n bindComments() {\r\n this.dataCommentGridDataResult = {\r\n data: orderBy(this.dataComments, this.dataCommentSortByField),\r\n total: this.dataComments.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n onCommentsortChange(sort: SortDescriptor[]): void {\r\n this.dataCommentSortByField = sort;\r\n this.bindComments();\r\n }\r\n\r\n public onCommentDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataCommentSelection = [];\r\n this.dataCommentState = state;\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n // binh luan,hoi dap, kien nghi\r\n const resultRequestMenu = await this.appService.doGET('api/Comment/GetRequestMenu', null);\r\n if (resultRequestMenu && resultRequestMenu.Status === 1) {\r\n this.menuIDs = resultRequestMenu.Data;\r\n if (this.menuIDs.length > 0) {\r\n if (!this.searchOption.MenuID) {\r\n this.searchOption.MenuID = this.menuIDs[0].ID;\r\n } else {\r\n this.onReload();\r\n }\r\n }\r\n }\r\n\r\n const resultUnit = await this.appService.doGET('api/Unit', null);\r\n if (resultUnit && resultUnit.Status === 1) {\r\n this.units = resultUnit.Data;\r\n this.unitFilters = this.units.slice();\r\n }\r\n\r\n this.statuss = [\r\n //{ Name: 'Tất cả', ID: -1 },\r\n { Name: 'Chưa trả lời', ID: 0 },\r\n { Name: 'Đã trả lời', ID: 1 }\r\n ];\r\n }\r\n\r\n onSearch() {\r\n this.getComments();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.setDefault();\r\n //this.searchOption.SearchText = '';\r\n this.getComments();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearComment() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewComment() {\r\n\r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n async onSaveComment() {\r\n this.updateComment();\r\n }\r\n\r\n async onSaveComments() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataComments.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataComments[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Comment/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataCommentItem;\r\n\r\n // let fileName = '';\r\n // if (this.dataFileUrls.length > 0) {\r\n // fileName = this.dataFileUrls[0].Url;\r\n // }\r\n\r\n //\r\n return {\r\n ID: temp.ID,\r\n //PublishAt: temp.PublishAt ? this.intl.formatDate(new Date(temp.PublishAt), 'yyyy-MM-ddT00:00:00') : null,\r\n\r\n MenuID: temp.MenuID,\r\n FullName: temp.FullName,\r\n Address: temp.Address,\r\n Phone: temp.Phone,\r\n Phone1: temp.Phone1,\r\n Email: temp.Email,\r\n Title: temp.Title,\r\n PostID: temp.PostID,\r\n Description: temp.Description,\r\n ApprovedFlg: temp.ApprovedFlg,\r\n Type: temp.Type,\r\n CreateAt: temp.CreateAt,\r\n FeedbackContent: temp.FeedbackContent,\r\n FeedbackBy: temp.FeedbackBy,\r\n FeedbackAt: temp.FeedbackAt,\r\n OftenFlg: temp.OftenFlg,\r\n SendAt: temp.SendAt,\r\n ReplyUnitID: temp.ReplyUnitID,\r\n ReplyFlg: true,\r\n ReplyAt: this.intl.formatDate(new Date(), 'yyyy-MM-ddTHH:mm:ss'),\r\n Note: temp.Note\r\n };\r\n }\r\n\r\n onCloseComment(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n\r\n onEditComment() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n\r\n this.infoOpened = true;\r\n }\r\n\r\n async addComment() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPOST('api/Comment', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateComment() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataCommentItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataCommentItem);\r\n\r\n const result = await this.appService.doPUT('api/Comment', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteComment() {\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataCommentSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Comment/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewComment();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataCommentSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onSend() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataCommentItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataCommentItem);\r\n\r\n const result = await this.appService.doPOST('api/Comment/SendUnit', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.unitOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onOpenSendUnit() {\r\n this.unitOpened = true;\r\n }\r\n\r\n getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(dataItem: any) {\r\n\r\n const dataRequest = {\r\n url: dataItem.Url\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, dataItem.Name);\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.slice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataComments, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = await this.file.readFile(e.files[0].rawFile);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n try {\r\n this.dataFileUrls = [];\r\n const k = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n this.dataFileUrls.push({\r\n Name: this.getNameByUrl(k),\r\n Url: k\r\n });\r\n\r\n this.bindFileUrls();\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n\r\n }\r\n\r\n onUnitsHandleFilter(value) {\r\n this.unitFilters = this.units.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n\r\n onCloseInfo(e) {\r\n this.infoOpened = false;\r\n this.setDefault();\r\n }\r\n\r\n onCloseUnit(e) {\r\n this.unitOpened = false;\r\n this.setDefault();\r\n }\r\n}\r\n\r\n","module.exports = \".group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 14px;\\r\\n font-size: 20px;\\r\\n color: #006CB7;\\r\\n font-weight: 500;\\r\\n background-color: #f5f5f5;\\r\\n /* text-transform: capitalize; */\\r\\n}\\r\\n\\r\\n.xdiv {\\r\\n border: 0.1px solid rgb(184, 184, 184);\\r\\n background-color: white;\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.xdivcol11 {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.xdivcol12 {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n height: 46px;\\r\\n}\\r\\n\\r\\n.xdivcol1 {\\r\\n padding-left: 0px;\\r\\n padding-right: 0px;\\r\\n}\\r\\n\\r\\n.link:hover {\\r\\n cursor: pointer;\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n.xbutton {\\r\\n background-color: red;\\r\\n color: white !important;\\r\\n background: red;\\r\\n width: 100%;\\r\\n font-size: 25px !important;\\r\\n}\\r\\n\\r\\n.dialog-post {\\r\\n z-index: 1000 !important;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 220px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 220px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 278px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9hc2stYW5kLXJlcGx5L2Fzay1hbmQtcmVwbHkuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsZ0NBQWdDO0FBQ3BDOztBQUVBO0lBQ0ksc0NBQXNDO0lBQ3RDLHVCQUF1QjtJQUN2QixlQUFlO0FBQ25COztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsY0FBYztBQUNsQjs7QUFFQTtJQUNJLHFCQUFxQjtJQUNyQix1QkFBdUI7SUFDdkIsZUFBZTtJQUNmLFdBQVc7SUFDWCwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSx3QkFBd0I7QUFDNUI7O0FBRUEsbUJBQW1COztBQUNuQjtJQUNJLGVBQWU7SUFDZixTQUFTO0lBQ1QsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtBQUNkOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCOztBQUVBO0lBQ0k7UUFDSSxlQUFlO1FBQ2YsU0FBUztRQUNULGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLFVBQVU7SUFDZDs7SUFFQTtRQUNJLGVBQWU7UUFDZixVQUFVO1FBQ1YsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkO0FBQ0o7O0FBRUEsbUJBQW1COztBQUVuQjtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtBQUNqQiIsImZpbGUiOiJzcmMvYXBwL2RhdGEvYXNrLWFuZC1yZXBseS9hc2stYW5kLXJlcGx5LmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuZ3JvdXAtaGVhZGVyIHtcclxuICAgIHBhZGRpbmctdG9wOiAxM3B4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEzcHg7XHJcbiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDZDQjc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDE0cHg7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xyXG4gICAgLyogdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7ICovXHJcbn1cclxuXHJcbi54ZGl2IHtcclxuICAgIGJvcmRlcjogMC4xcHggc29saWQgcmdiKDE4NCwgMTg0LCAxODQpO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgICBtYXJnaW4tdG9wOiAwcHg7XHJcbn1cclxuXHJcbi54ZGl2Y29sMTEge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbn1cclxuXHJcbi54ZGl2Y29sMTIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBoZWlnaHQ6IDQ2cHg7XHJcbn1cclxuXHJcbi54ZGl2Y29sMSB7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDBweDtcclxufVxyXG5cclxuLmxpbms6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgY29sb3I6ICMwMDZDQjc7XHJcbn1cclxuXHJcbi54YnV0dG9uIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJlZDtcclxuICAgIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xyXG4gICAgYmFja2dyb3VuZDogcmVkO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBmb250LXNpemU6IDI1cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLmRpYWxvZy1wb3N0IHtcclxuICAgIHotaW5kZXg6IDEwMDAgIWltcG9ydGFudDtcclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiA3NnB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk4JTtcclxufVxyXG5cclxuLnN0aWNreS10b29sYmFyLWJ0bntcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMjIwcHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTkuNTUlO1xyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY4cHgpIHtcclxuICAgIC5zdGlja3ktZ3JvdXAtc2VhcmNoIHtcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiA3NnB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5NCU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5zdGlja3ktdG9vbGJhci1idG57XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogMjIwcHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk5JTtcclxuICAgIH1cclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuc3RpY2t5LWhlYWRlci1ncmlkIC5rLWdyaWQgLmstZ3JpZC1oZWFkZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAyNzhweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5Ny41NSU7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Từ ngày \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Đến ngày \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.CreateAt | date: 'dd/MM/yyyy HH:mm'}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{onDotsString(dataItem.FeedbackContent)}}
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.FeedbackAt | date: 'dd/MM/yyyy HH:mm'}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n {{i+1}}. {{ getFileName(file) }} \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{postItem.Title}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n Chuyển \\r\\n \\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport * as DecoupledEditor from '@ckeditor/ckeditor5-build-decoupled-document';\r\nimport { UploadAdapter } from 'src/app/s/post/post.component';\r\n// import CKFinder from '@ckeditor/ckeditor5-ckfinder/src/ckfinder';\r\ndeclare var CKEDITOR: any;\r\n\r\n@Component({\r\n selector: 'app-ask-and-reply',\r\n templateUrl: './ask-and-reply.component.html',\r\n styleUrls: ['./ask-and-reply.component.css']\r\n})\r\nexport class AskAndReplyComponent implements OnInit, OnDestroy {\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 140;\r\n }\r\n\r\n //codeimage\r\n commentInput = null;\r\n\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n dataComments = [];\r\n dataCommentSelectableSettings: SelectableSettings;\r\n dataCommentSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataCommentFocus = {\r\n Name: true\r\n };\r\n dataCommentSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataCommentSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataCommentPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataCommentSelection: number[] = [];\r\n dataCommentItem: any;\r\n myInterval: any;\r\n pageName: any;\r\n\r\n postItem: any;\r\n infoOpened = false;\r\n unitOpened = false;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n public commentArr = [];\r\n public commentFlg = false;\r\n\r\n public dataCommentState: State = {\r\n skip: this.dataCommentSkip,\r\n take: this.dataCommentSkip + this.dataCommentPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n dataCommentGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n dataCommentFiles = []\r\n public fileSaveUrl: any;\r\n\r\n menuIDs: Array<{ Name: string, ID: number }>;\r\n statuss: Array<{ Name: string, ID: number }>;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n\r\n isApproved = true;\r\n isCancleApproved = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n FromDate: null,\r\n ToDate: null,\r\n MenuID: 0,\r\n Status: 0\r\n };\r\n\r\n units: Array<{ Name: string, ID: string }>;\r\n unitFilters: Array<{ Name: string, ID: string }>;\r\n dataSendItem = {\r\n UnitID: null\r\n };\r\n\r\n outerWidth: any;\r\n myRestrictions: FileRestrictions = {\r\n maxFileSize: 1024 * 1024 * 120\r\n };\r\n\r\n public Editor = DecoupledEditor;\r\n\r\n ckeConfig: any;\r\n editorOptions = { theme: 'vs-dark', language: 'javascript' };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private activatedRoute: ActivatedRoute,\r\n ) {\r\n\r\n this.activatedRoute.queryParams.subscribe((params: any) => {\r\n if (params && params.menuID) {\r\n this.searchOption.MenuID = params.menuID;\r\n }\r\n this.initDisplay();\r\n });\r\n\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n\r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n ngOnInit() {\r\n this.outerWidth = window.outerWidth;\r\n this.ckeConfig = {\r\n allowedContent: true,\r\n extraPlugins: 'divarea',\r\n forcePasteAsPlainText: true\r\n };\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = true;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataCommentSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onMenuIDSearchHandleFilter(value) {\r\n this.onReload();\r\n }\r\n\r\n\r\n onSearchKeyPress(e: any) {\r\n // if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n // this.onSearch();\r\n // }\r\n }\r\n\r\n async getComments() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n FromDate: this.searchOption.FromDate ? this.intl.formatDate(new Date(this.searchOption.FromDate), 'yyyy-MM-ddT00:00:00') : null,\r\n ToDate: this.searchOption.ToDate ? this.intl.formatDate(new Date(this.searchOption.ToDate), 'yyyy-MM-ddT00:00:00') : null,\r\n MenuID: this.searchOption.MenuID,\r\n Status: this.searchOption.Status\r\n };\r\n\r\n const result = await this.appService.doPOST('api/Comment/SearchData', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.commentArr = [];\r\n result.Data.forEach(item =>{\r\n if (item.FileUrl == null || item.FileUrl == \"\") {\r\n item.FileUrl = [];\r\n }\r\n else {\r\n item.FileUrl = JSON.parse(item.FileUrl);\r\n }\r\n const comment = {\r\n ID: item.ID,\r\n CreateAt: item.CreateAt,\r\n Description: item.Description,\r\n Email: item.Email,\r\n FeedbackAt: item.FeedbackAt,\r\n FeedbackBy: item.FeedbackBy,\r\n FeedbackContent: item.FeedbackContent,\r\n FullName: item.FullName,\r\n MenuID: item.MenuID,\r\n Phone: item.Phone,\r\n SendAt: item.SendAt,\r\n Title: item.Title,\r\n FileUrl: item.FileUrl,\r\n ApprovedFlg: item.ApprovedFlg\r\n }\r\n this.commentArr.push(comment)\r\n })\r\n this.dataComments = this.commentArr;\r\n this.bindComments();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataCommentSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataComments.find((item) => {\r\n return item.ID === this.dataCommentSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataCommentSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n onClickNotify(e: any) {\r\n const menuID = e;\r\n this.searchOption.MenuID = menuID;\r\n this.onReload();\r\n }\r\n\r\n setDefault() {\r\n this.dataCommentItem = {\r\n IsAdd: true,\r\n MenuID: this.searchOption.MenuID,\r\n FullName: null,\r\n Address: null,\r\n Phone: null,\r\n Phone1: null,\r\n Email: null,\r\n Title: null,\r\n PostID: null,\r\n Description: null,\r\n ApprovedFlg: null,\r\n Type: null,\r\n CreateAt: null,\r\n FeedbackContent: null,\r\n FeedbackBy: null,\r\n FeedbackAt: null,\r\n OftenFlg: false,\r\n SendAt: null,\r\n ReplyUnitID: null,\r\n ReplyFlg: null,\r\n ReplyAt: null,\r\n Note: null,\r\n FileUrl: []\r\n };\r\n this.enabled = true;\r\n this.enabledID = true;\r\n\r\n this.dataSendItem = {\r\n UnitID: null\r\n };\r\n this.dataCommentSelection = [];\r\n this.filesUpload = [];\r\n this.dataFileUrls = [];\r\n //this.isApproved = false;\r\n this.bindFileUrls();\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n }\r\n\r\n onCommentPageChange(event: PageChangeEvent) {\r\n this.dataCommentSkip = event.skip;\r\n this.bindComments();\r\n }\r\n\r\n async onCommentselectedKeysChange() {\r\n\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataCommentSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataCommentSelection[0];\r\n const selectedItem = this.dataComments.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n //selectedItem.PublishAt = selectedItem.PublishAt ? new Date(selectedItem.PublishAt) : null;\r\n\r\n this.dataCommentItem = selectedItem;\r\n\r\n if(this.dataCommentItem.ApprovedFlg == true){\r\n this.isApproved = false;\r\n this.isCancleApproved = true\r\n }\r\n else{\r\n this.isApproved = true;\r\n this.isCancleApproved = false;\r\n }\r\n\r\n // const fileUrl = selectedItem.FileUrl;\r\n // this.dataFileUrls = [];\r\n // if (fileUrl) {\r\n // this.dataFileUrls.push({\r\n // Name: this.getNameByUrl(selectedItem.FileUrl),\r\n // Url: selectedItem.FileUrl\r\n // });\r\n // }\r\n // this.bindFileUrls();\r\n\r\n this.enabled = false;\r\n this.enabledID = false;\r\n\r\n\r\n const dataRequest = {\r\n id: this.dataCommentItem.PostID\r\n };\r\n\r\n this.postItem = null;\r\n // const resultRequestMenu = await this.appService.doGET('api/Post/GetById', dataRequest);\r\n // if (resultRequestMenu && resultRequestMenu.Status === 1) {\r\n // this.postItem = resultRequestMenu.Data;\r\n // }\r\n }\r\n }\r\n\r\n bindComments() {\r\n this.dataCommentGridDataResult = {\r\n data: orderBy(this.dataComments, this.dataCommentSortByField),\r\n total: this.dataComments.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n onCommentsortChange(sort: SortDescriptor[]): void {\r\n this.dataCommentSortByField = sort;\r\n this.bindComments();\r\n }\r\n\r\n public onCommentDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataCommentSelection = [];\r\n this.dataCommentState = state;\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n // binh luan,hoi dap, kien nghi\r\n const resultRequestMenu = await this.appService.doGET('api/Comment/GetRequestMenu', null);\r\n if (resultRequestMenu && resultRequestMenu.Status === 1) {\r\n this.menuIDs = resultRequestMenu.Data;\r\n if (this.menuIDs.length > 0) {\r\n if (!this.searchOption.MenuID) {\r\n\r\n this.searchOption.MenuID = this.menuIDs[0].ID;\r\n }\r\n this.onReload();\r\n }\r\n }\r\n\r\n const resultUnit = await this.appService.doGET('api/Unit', null);\r\n if (resultUnit && resultUnit.Status === 1) {\r\n this.units = resultUnit.Data;\r\n this.unitFilters = this.units.slice();\r\n }\r\n\r\n this.statuss = [\r\n //{ Name: 'Tất cả', ID: -1 },\r\n { Name: 'Chưa xử lý', ID: 0 },\r\n { Name: 'Đã duyệt', ID: 1 },\r\n // { Name: 'Đã gửi', ID: 2 },\r\n // { Name: 'Đã trả lời', ID: 3 },\r\n ];\r\n }\r\n\r\n onSearch() {\r\n this.getComments();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.setDefault();\r\n //this.searchOption.SearchText = '';\r\n this.getComments();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearComment() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewComment() {\r\n\r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n async onSaveComment() {\r\n if (this.dataCommentItem.IsAdd) { this.addComment(); } else { this.updateComment(); }\r\n }\r\n\r\n async onSaveComments() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataComments.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataComments[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Comment/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataCommentItem;\r\n\r\n // let fileName = '';\r\n // if (this.dataFileUrls.length > 0) {\r\n // fileName = this.dataFileUrls[0].Url;\r\n // }\r\n\r\n //\r\n\r\n var files: any[] = [];\r\n if (this.dataCommentItem.FileUrl) {\r\n for (let i = 0; i < this.dataCommentItem.FileUrl.length; i++) {\r\n files.push(this.dataCommentItem.FileUrl[i]);\r\n }\r\n }\r\n return {\r\n ID: temp.ID,\r\n //PublishAt: temp.PublishAt ? this.intl.formatDate(new Date(temp.PublishAt), 'yyyy-MM-ddT00:00:00') : null,\r\n\r\n MenuID: temp.MenuID,\r\n FullName: temp.FullName,\r\n Address: temp.Address,\r\n Phone: temp.Phone,\r\n Phone1: temp.Phone1,\r\n Email: temp.Email,\r\n Title: temp.Title,\r\n PostID: temp.PostID,\r\n Description: temp.Description,\r\n ApprovedFlg: temp.ApprovedFlg,\r\n Type: temp.Type,\r\n CreateAt: temp.CreateAt,\r\n FeedbackContent: temp.FeedbackContent,\r\n FeedbackBy: temp.FeedbackBy,\r\n FeedbackAt: temp.FeedbackAt,\r\n OftenFlg: temp.OftenFlg,\r\n SendAt: temp.SendAt,\r\n ReplyUnitID: temp.ReplyUnitID,\r\n ReplyFlg: temp.ReplyFlg,\r\n ReplyAt: temp.ReplyAt,\r\n Note: temp.Note,\r\n IsAdd: temp.IsAdd,\r\n FileUrl: JSON.stringify(files),\r\n };\r\n }\r\n\r\n onCloseComment(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n\r\n onEditComment() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async addComment() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPOST('api/Comment', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateComment() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataCommentItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataCommentItem);\r\n\r\n const result = await this.appService.doPUT('api/Comment', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteComment() {\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataCommentSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Comment/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewComment();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataCommentSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onSend() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataCommentItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataCommentItem);\r\n const result = await this.appService.doPOST('api/Comment/SendUnit', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.unitOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onSendReply() {\r\n const dataRequest = {\r\n id: this.dataCommentItem.ID\r\n };\r\n if (this.dataCommentItem.FeedbackContent == '' ||\r\n this.dataCommentItem.FeedbackContent === null ||\r\n this.dataCommentItem.FeedbackContent.match(/^ *$/)) {\r\n this.appSwal.showWarning(\"Bạn chưa trả lời câu hỏi này\", false);\r\n }\r\n else {\r\n const option = await this.appSwal.showWarning('Bạn có chắc chắn muốn duyệt câu hỏi này không?', true);\r\n if (option) {\r\n const result = await this.appService.doGET('api/Comment/Send', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n async onSendReplyCancle() {\r\n const dataRequest = {\r\n id: this.dataCommentItem.ID\r\n };\r\n if (this.dataCommentItem.FeedbackContent == '' ||\r\n this.dataCommentItem.FeedbackContent === null ||\r\n this.dataCommentItem.FeedbackContent.match(/^ *$/)) {\r\n this.appSwal.showWarning(\"Bạn chưa trả lời câu hỏi này\", false);\r\n }\r\n else {\r\n const option = await this.appSwal.showWarning('Bạn có chắc chắn muốn hủy duyệt câu hỏi này không?', true);\r\n if (option) {\r\n const result = await this.appService.doGET('api/Comment/SendCancle', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n async onOpenSendUnit() {\r\n this.unitOpened = true;\r\n }\r\n\r\n getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n\r\n return nameFile;\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.slice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataComments, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n \r\n try {\r\n const fileData = await this.file.readFile(e.files[0].rawFile);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n try {\r\n if(e != null && e.response.body != null) {\r\n if(e.response.body.Status != 0) {\r\n if (this.dataCommentItem.FileUrl == undefined) {\r\n this.dataCommentItem.FileUrl = [];\r\n }\r\n this.dataCommentItem.FileUrl.push(`${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`);\r\n } else {\r\n this.appSwal.showError(e.response.body.Msg);\r\n }\r\n } \r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n\r\n this.dataCommentItem.FileUrl = [];\r\n this.filesUpload = [];\r\n }\r\n\r\n onUnitsHandleFilter(value) {\r\n this.unitFilters = this.units.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n\r\n onCloseInfo(e) {\r\n this.infoOpened = false;\r\n this.setDefault();\r\n }\r\n\r\n onCloseUnit(e) {\r\n this.unitOpened = false;\r\n this.setDefault();\r\n }\r\n\r\n getFileName(fileUrls) {\r\n var nameFile = \"\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(file: any) {\r\n\r\n const dataRequest = {\r\n url: file\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, this.getFileName(file));\r\n }\r\n }\r\n\r\n onDotsString(string){\r\n if(string){\r\n var width = this.outerWidth;\r\n var txtLength = 75;\r\n if(string.length > 75 && width >= 768){\r\n var orgString = string;\r\n if(orgString.indexOf(\" \", txtLength) == -1 || orgString.indexOf(\" \", txtLength) - txtLength > 10){\r\n txtLength = orgString.lastIndexOf(\" \", txtLength);\r\n }\r\n if(string == string.toUpperCase()){\r\n txtLength = txtLength - 15;\r\n }\r\n var newString = orgString.slice(0,orgString.indexOf(\" \", txtLength)) + \"...\";\r\n return newString;\r\n } else{\r\n return string;\r\n }\r\n }\r\n }\r\n\r\n onRemoveFile(file){\r\n var isExistedInFile = this.dataCommentItem.FileUrl.findIndex(x => x == file);\r\n if (isExistedInFile != -1) {\r\n this.dataCommentItem.FileUrl.splice(isExistedInFile, 1);\r\n }\r\n }\r\n\r\n onReady(eventData) {\r\n eventData.plugins.get('FileRepository').createUploadAdapter = function (loader) {\r\n return new UploadAdapter(loader);\r\n };\r\n eventData.ui.getEditableElement().parentElement.insertBefore(\r\n eventData.ui.view.toolbar.element,\r\n eventData.ui.getEditableElement()\r\n );\r\n }\r\n public ckeditorContent: string = \"\";\r\n\r\n getData() {\r\n console.log(CKEDITOR.instances.content.getData());\r\n }\r\n}\r\n\r\n","module.exports = \".bra-name {\\r\\n color: blue;\\r\\n}\\r\\n\\r\\n[_nghost-c0] .k-panelbar>.k-item>.k-link.k-state-selected {\\r\\n background-color: #7c9bb7 !important;\\r\\n}\\r\\n\\r\\n.banner-element,\\r\\n.video-element {\\r\\n display: inline-block;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n.banner-element {\\r\\n width: 100%;\\r\\n height: 156px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.banner-element img {\\r\\n width: 100%;\\r\\n height: 156px;\\r\\n}\\r\\n\\r\\n.video-element {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.video-element img {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n}\\r\\n\\r\\n.image-element {\\r\\n width: 210px;\\r\\n height: 140px;\\r\\n padding: 0;\\r\\n margin-left: 17px;\\r\\n margin-right: 17px;\\r\\n}\\r\\n\\r\\n.image-element img {\\r\\n width: 100px;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\n.custom-list {\\r\\n width: 40%;\\r\\n display: contents;\\r\\n}\\r\\n\\r\\n.custom-list-status {\\r\\n width: 50%;\\r\\n display: contents;\\r\\n}\\r\\n\\r\\n.custom-list-status input {\\r\\n margin-top: 4px;\\r\\n}\\r\\n\\r\\n.custom-list-child {\\r\\n display: block;\\r\\n margin-left: 20px;\\r\\n}\\r\\n\\r\\n.element-search {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.element-search {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.image-upload-cus {\\r\\n display: contents;\\r\\n width: 100%;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\nagm-map {\\r\\n height: 506px;\\r\\n}\\r\\n\\r\\n.file-uploaded {\\r\\n color: #006CB7 !important;\\r\\n width: 182px;\\r\\n float: right;\\r\\n margin-top: 36px;\\r\\n}\\r\\n\\r\\n.title {\\r\\n font-size: 28px;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.img-banner {\\r\\n width: 100%;\\r\\n max-height: 500px;\\r\\n}\\r\\n\\r\\n.description {\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 14px;\\r\\n font-size: 20px;\\r\\n color: #006CB7;\\r\\n font-weight: 500;\\r\\n background-color: #f5f5f5;\\r\\n /* text-transform: capitalize; */\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9jb21tZW50L2NvbW1lbnQuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLG9DQUFvQztBQUN4Qzs7QUFFQTs7SUFFSSxxQkFBcUI7SUFDckIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGFBQWE7SUFDYixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0lBQ2IsVUFBVTtBQUNkOztBQUVBO0lBQ0ksV0FBVztJQUNYLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osYUFBYTtJQUNiLFVBQVU7SUFDVixpQkFBaUI7SUFDakIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxVQUFVO0lBQ1YsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksVUFBVTtJQUNWLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxjQUFjO0lBQ2QsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksY0FBYztBQUNsQjs7QUFFQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixXQUFXO0lBQ1gsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsWUFBWTtJQUNaLFlBQVk7SUFDWixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsZ0NBQWdDO0FBQ3BDIiwiZmlsZSI6InNyYy9hcHAvZGF0YS9jb21tZW50L2NvbW1lbnQuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5icmEtbmFtZSB7XHJcbiAgICBjb2xvcjogYmx1ZTtcclxufVxyXG5cclxuW19uZ2hvc3QtYzBdIC5rLXBhbmVsYmFyPi5rLWl0ZW0+LmstbGluay5rLXN0YXRlLXNlbGVjdGVkIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM3YzliYjcgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmJhbm5lci1lbGVtZW50LFxyXG4udmlkZW8tZWxlbWVudCB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xyXG59XHJcblxyXG4uYmFubmVyLWVsZW1lbnQge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDE1NnB4O1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuLmJhbm5lci1lbGVtZW50IGltZyB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTU2cHg7XHJcbn1cclxuXHJcbi52aWRlby1lbGVtZW50IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAyMDZweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi52aWRlby1lbGVtZW50IGltZyB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMjA2cHg7XHJcbn1cclxuXHJcbi5pbWFnZS1lbGVtZW50IHtcclxuICAgIHdpZHRoOiAyMTBweDtcclxuICAgIGhlaWdodDogMTQwcHg7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgbWFyZ2luLWxlZnQ6IDE3cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDE3cHg7XHJcbn1cclxuXHJcbi5pbWFnZS1lbGVtZW50IGltZyB7XHJcbiAgICB3aWR0aDogMTAwcHg7XHJcbiAgICBoZWlnaHQ6IDEwMHB4O1xyXG59XHJcblxyXG4uY3VzdG9tLWxpc3Qge1xyXG4gICAgd2lkdGg6IDQwJTtcclxuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xyXG59XHJcblxyXG4uY3VzdG9tLWxpc3Qtc3RhdHVzIHtcclxuICAgIHdpZHRoOiA1MCU7XHJcbiAgICBkaXNwbGF5OiBjb250ZW50cztcclxufVxyXG5cclxuLmN1c3RvbS1saXN0LXN0YXR1cyBpbnB1dCB7XHJcbiAgICBtYXJnaW4tdG9wOiA0cHg7XHJcbn1cclxuXHJcbi5jdXN0b20tbGlzdC1jaGlsZCB7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xyXG59XHJcblxyXG4uZWxlbWVudC1zZWFyY2gge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuXHJcbi5lbGVtZW50LXNlYXJjaCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLmltYWdlLXVwbG9hZC1jdXMge1xyXG4gICAgZGlzcGxheTogY29udGVudHM7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwcHg7XHJcbn1cclxuXHJcbmFnbS1tYXAge1xyXG4gICAgaGVpZ2h0OiA1MDZweDtcclxufVxyXG5cclxuLmZpbGUtdXBsb2FkZWQge1xyXG4gICAgY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxuICAgIHdpZHRoOiAxODJweDtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICAgIG1hcmdpbi10b3A6IDM2cHg7XHJcbn1cclxuXHJcbi50aXRsZSB7XHJcbiAgICBmb250LXNpemU6IDI4cHg7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmltZy1iYW5uZXIge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBtYXgtaGVpZ2h0OiA1MDBweDtcclxufVxyXG5cclxuLmRlc2NyaXB0aW9uIHtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbn1cclxuXHJcbi5ncm91cC1oZWFkZXIge1xyXG4gICAgcGFkZGluZy10b3A6IDEzcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMTNweDtcclxuICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwNkNCNztcclxuICAgIHBhZGRpbmctbGVmdDogMTRweDtcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XHJcbiAgICAvKiB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsgKi9cclxufSJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.CreateAt | date: 'dd/MM/yyyy'}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Comment_ApprovedFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{postItem.Title}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ActivatedRoute } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-comment',\r\n templateUrl: './comment.component.html',\r\n styleUrls: ['./comment.component.css']\r\n})\r\nexport class CommentComponent implements OnInit, OnDestroy {\r\n //codeimage\r\n commentInput = null;\r\n\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n dataComments = [];\r\n dataCommentSelectableSettings: SelectableSettings;\r\n dataCommentSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataCommentFocus = {\r\n Name: true\r\n };\r\n dataCommentSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataCommentSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataCommentPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataCommentSelection: number[] = [];\r\n dataCommentItem: any;\r\n myInterval: any;\r\n pageName: any;\r\n\r\n postItem: any;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public commentFlg = false;\r\n infoOpened = false;\r\n\r\n public dataCommentState: State = {\r\n skip: this.dataCommentSkip,\r\n take: this.dataCommentSkip + this.dataCommentPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n dataCommentGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n menuIDs: Array<{ Name: string, ID: number }>;\r\n statuss: Array<{ Name: string, ID: number }>;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n FromDate: null,\r\n ToDate: null,\r\n MenuID: 0,\r\n Status: 0\r\n };\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n public domSanitizer: DomSanitizer,\r\n private activatedRoute: ActivatedRoute,\r\n ) {\r\n\r\n this.activatedRoute.queryParams.subscribe((params: any) => {\r\n if (params && params.menuID) {\r\n this.searchOption.MenuID = params.menuID;\r\n }\r\n this.initDisplay();\r\n });\r\n\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n\r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataCommentSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onMenuIDSearchHandleFilter(value) {\r\n this.onReload();\r\n }\r\n\r\n\r\n onSearchKeyPress(e: any) {\r\n // if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n // this.onSearch();\r\n // }\r\n }\r\n\r\n async getComments() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n FromDate: this.searchOption.FromDate ? this.intl.formatDate(new Date(this.searchOption.FromDate), 'yyyy-MM-ddT00:00:00') : null,\r\n ToDate: this.searchOption.ToDate ? this.intl.formatDate(new Date(this.searchOption.ToDate), 'yyyy-MM-ddT00:00:00') : null,\r\n MenuID: this.searchOption.MenuID,\r\n Status: this.searchOption.Status\r\n };\r\n\r\n const result = await this.appService.doPOST('api/Comment/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataComments = result.Data;\r\n this.bindComments();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataCommentSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataComments.find((item) => {\r\n return item.ID === this.dataCommentSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataCommentSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n onClickNotify(e: any) {\r\n const menuID = e;\r\n this.searchOption.MenuID = menuID;\r\n this.onReload();\r\n }\r\n\r\n setDefault() {\r\n this.dataCommentItem = {\r\n IsAdd: true,\r\n MenuID: this.searchOption.MenuID,\r\n FullName: null,\r\n Address: null,\r\n Phone: null,\r\n Phone1: null,\r\n Email: null,\r\n Title: null,\r\n PostID: null,\r\n Description: null,\r\n ApprovedFlg: null,\r\n Type: null,\r\n CreateAt: null,\r\n FeedbackContent: null,\r\n FeedbackBy: null,\r\n FeedbackAt: null,\r\n OftenFlg: false\r\n };\r\n \r\n this.enabled = true;\r\n this.enabledID = true;\r\n\r\n this.dataCommentSelection = [];\r\n this.filesUpload = [];\r\n this.dataFileUrls = [];\r\n this.bindFileUrls();\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n }\r\n\r\n onCommentPageChange(event: PageChangeEvent) {\r\n this.dataCommentSkip = event.skip;\r\n this.bindComments();\r\n }\r\n\r\n async onCommentselectedKeysChange() {\r\n\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataCommentSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataCommentSelection[0];\r\n const selectedItem = this.dataComments.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n //selectedItem.PublishAt = selectedItem.PublishAt ? new Date(selectedItem.PublishAt) : null;\r\n\r\n this.dataCommentItem = selectedItem;\r\n\r\n // const fileUrl = selectedItem.FileUrl;\r\n // this.dataFileUrls = [];\r\n // if (fileUrl) {\r\n // this.dataFileUrls.push({\r\n // Name: this.getNameByUrl(selectedItem.FileUrl),\r\n // Url: selectedItem.FileUrl\r\n // });\r\n // }\r\n // this.bindFileUrls();\r\n\r\n this.enabled = false;\r\n this.enabledID = false;\r\n\r\n\r\n const dataRequest = {\r\n id: this.dataCommentItem.PostID\r\n };\r\n\r\n this.postItem = null;\r\n const resultRequestMenu = await this.appService.doGET('api/Post/GetById', dataRequest);\r\n if (resultRequestMenu && resultRequestMenu.Status === 1) {\r\n this.postItem = resultRequestMenu.Data;\r\n }\r\n }\r\n }\r\n\r\n bindComments() {\r\n this.dataCommentGridDataResult = {\r\n data: orderBy(this.dataComments, this.dataCommentSortByField),\r\n total: this.dataComments.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n onCommentsortChange(sort: SortDescriptor[]): void {\r\n this.dataCommentSortByField = sort;\r\n this.bindComments();\r\n }\r\n\r\n public onCommentDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataCommentSelection = [];\r\n this.dataCommentState = state;\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n // binh luan,hoi dap, kien nghi\r\n const resultRequestMenu = await this.appService.doGET('api/Comment/GetMenuByComment', null);\r\n if (resultRequestMenu && resultRequestMenu.Status === 1) {\r\n this.menuIDs = resultRequestMenu.Data;\r\n if (this.menuIDs.length > 0) {\r\n if (!this.searchOption.MenuID) {\r\n this.searchOption.MenuID = this.menuIDs[0].ID;\r\n }\r\n this.onReload();\r\n }\r\n }\r\n\r\n this.statuss = [\r\n //{ Name: 'Tất cả', ID: -1 },\r\n { Name: 'Chưa duyệt', ID: 0 },\r\n { Name: 'Đã duyệt', ID: 1 }\r\n ];\r\n }\r\n\r\n onSearch() {\r\n this.getComments();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.setDefault();\r\n //this.searchOption.SearchText = '';\r\n this.getComments();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearComment() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewComment() {\r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n async onSaveComment() {\r\n if (this.dataCommentItem.IsAdd) { this.addComment(); } else { this.updateComment(); }\r\n }\r\n\r\n async onSaveComments() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataComments.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataComments[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Comment/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataCommentItem;\r\n\r\n // let fileName = '';\r\n // if (this.dataFileUrls.length > 0) {\r\n // fileName = this.dataFileUrls[0].Url;\r\n // }\r\n\r\n //\r\n return {\r\n ID: temp.ID,\r\n //PublishAt: temp.PublishAt ? this.intl.formatDate(new Date(temp.PublishAt), 'yyyy-MM-ddT00:00:00') : null,\r\n\r\n MenuID: temp.MenuID,\r\n FullName: temp.FullName,\r\n Address: temp.Address,\r\n Phone: temp.Phone,\r\n Phone1: temp.Phone1,\r\n Email: temp.Email,\r\n Title: temp.Title,\r\n PostID: temp.PostID,\r\n Description: temp.Description,\r\n ApprovedFlg: temp.ApprovedFlg,\r\n Type: temp.Type,\r\n CreateAt: temp.CreateAt,\r\n FeedbackContent: temp.FeedbackContent,\r\n FeedbackBy: temp.FeedbackBy,\r\n FeedbackAt: temp.FeedbackAt,\r\n OftenFlg: temp.OftenFlg,\r\n PortalFlg: true\r\n };\r\n }\r\n\r\n onCloseComment(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n\r\n onEditComment() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async addComment() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPOST('api/Comment', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewComment();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateComment() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataCommentItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataCommentItem);\r\n\r\n const result = await this.appService.doPUT('api/Comment', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteComment() {\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataCommentSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Comment/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewComment();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataCommentSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(dataItem: any) {\r\n\r\n const dataRequest = {\r\n url: dataItem.Url\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, dataItem.Name);\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataComments, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = await this.file.readFile(e.files[0].rawFile);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n try {\r\n this.dataFileUrls = [];\r\n const k = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n this.dataFileUrls.push({\r\n Name: this.getNameByUrl(k),\r\n Url: k\r\n });\r\n\r\n this.bindFileUrls();\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n}\r\n\r\n","module.exports = \"/* sticky toolbar */\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n.sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n/* sticky toolbar */\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 300px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9kYXRhLWRldmljZS1yb29tLW1lZXRpbmcvZGF0YS1kZXZpY2Utcm9vbS1tZWV0aW5nL2RhdGEtZGV2aWNlLXJvb20tbWVldGluZy5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1CQUFtQjtBQUNuQjtJQUNJLGVBQWU7SUFDZixTQUFTO0lBQ1QsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtBQUNkO0FBRUE7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakI7QUFFQTtJQUNJO1FBQ0ksZUFBZTtRQUNmLFNBQVM7UUFDVCxjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixVQUFVO0lBQ2Q7O0lBRUE7UUFDSSxlQUFlO1FBQ2YsVUFBVTtRQUNWLGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLFVBQVU7SUFDZDtBQUNKO0FBRUEsbUJBQW1CO0FBR25CO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCIiwiZmlsZSI6InNyYy9hcHAvZGF0YS9kYXRhLWRldmljZS1yb29tLW1lZXRpbmcvZGF0YS1kZXZpY2Utcm9vbS1tZWV0aW5nL2RhdGEtZGV2aWNlLXJvb20tbWVldGluZy5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiA3NnB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk4JTtcclxufVxyXG5cclxuLnN0aWNreS10b29sYmFyLWJ0bi11c2Vye1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAxOTNweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OS41NSU7XHJcbn1cclxuXHJcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjhweCkge1xyXG4gICAgLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDc2cHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk0JTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLnN0aWNreS10b29sYmFyLWJ0bi11c2Vye1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDE5M3B4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5OSU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qIHN0aWNreSB0b29sYmFyICovXHJcblxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5zdGlja3ktaGVhZGVyLWdyaWQgLmstZ3JpZCAuay1ncmlkLWhlYWRlciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDMwMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk3LjU1JTtcclxufSJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'DelFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { saveAs } from '@progress/kendo-file-saver';\r\nimport { Http } from '@angular/http';\r\nimport { KendoButtonService } from '@progress/kendo-angular-buttons/dist/es2015/button/button.service';\r\nimport { DataSource } from '@angular/cdk/table';\r\n\r\n@Component({\r\n selector: 'app-data-device-room-meeting',\r\n templateUrl: './data-device-room-meeting.component.html',\r\n styleUrls: ['./data-device-room-meeting.component.css']\r\n})\r\nexport class DataDeviceRoomMeetingComponent implements OnInit , OnDestroy {\r\n\r\n isStickySearch = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isStickySearch = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataDeviceRoomMeetings = [];\r\n dataDeviceRoomMeetingsTemp = [];\r\n dataDeviceRoomMeetingSelectableSettings: SelectableSettings;\r\n dataDeviceRoomMeetingSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataDeviceRoomMeetingFocus = {\r\n Name: true\r\n };\r\n dataDeviceRoomMeetingSortByField: SortDescriptor[] = [];\r\n\r\n public WORKING_NUM_PAGING_SKIP = 0;\r\n public WORKING_NUM_PAGING_TAKE = 50;\r\n public WORKING_NUM_PAGING_BTN = 5;\r\n\r\n dataDeviceRoomMeetingSkip = this.WORKING_NUM_PAGING_SKIP;\r\n dataDeviceRoomMeetingPageSize = this.WORKING_NUM_PAGING_TAKE;\r\n dataDeviceRoomMeetingSelection: number[] = [];\r\n dataDeviceRoomMeetingItem: any;\r\n dataDeviceRoomMeetingItemtemp: any;\r\n myInterval: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.WORKING_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataDeviceRoomMeetingState: State = {\r\n skip: this.dataDeviceRoomMeetingSkip,\r\n take: this.dataDeviceRoomMeetingSkip + this.dataDeviceRoomMeetingPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n dataDeviceRoomMeetingGridDataResult: GridDataResult;\r\n\r\n DeviceRoomMeetings: Array<{ Name: string, ID: string }>;\r\n DeviceRoomMeetingsFilter: Array<{ Name: string, ID: string }>;\r\n DeviceRoomMeetingfile: Array<{ Name: string, ID: string }>;\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n pageName: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n InputingFile = false;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private http: Http,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n this.getPageName();\r\n }\r\n\r\n DeviceRoomMeetingsHandleFilter(value) {\r\n this.DeviceRoomMeetingsFilter = this.DeviceRoomMeetings.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.allowMulti = !this.allowMulti;\r\n if (this.InputingFile === true) {\r\n this.allowMulti = false;\r\n this.dataDeviceRoomMeetingSelectableSettings = {\r\n enabled: false,\r\n mode: 'single'\r\n };\r\n } else {\r\n this.dataDeviceRoomMeetingSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n }\r\n\r\n setSelectableSettingsFile(): void {\r\n this.dataDeviceRoomMeetingSelectableSettings = {\r\n enabled: true,\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getDeviceRoomMeetings() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/DeviceRoomMeeting/Search', dataRequest);\r\n if (result && result.Status) {\r\n\r\n this.dataDeviceRoomMeetings = result.Data;\r\n this.dataDeviceRoomMeetingsTemp = result.Data;\r\n this.bindDeviceRoomMeetings();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n\r\n checkSelectionID() {\r\n for (let i = this.dataDeviceRoomMeetingSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataDeviceRoomMeetings.find((item) => {\r\n return item.ID === this.dataDeviceRoomMeetingSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataDeviceRoomMeetingSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataDeviceRoomMeetingItem = {\r\n IsAdd: true,\r\n ID: '',\r\n Name: '',\r\n Description: '',\r\n DelFlg: false,\r\n };\r\n this.dataDeviceRoomMeetingItemtemp = Object.assign({}, this.dataDeviceRoomMeetingItem);\r\n\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.dataDeviceRoomMeetingSelection = [];\r\n }\r\n bindtemp(item) {\r\n this.dataDeviceRoomMeetingItemtemp = Object.assign({}, item);\r\n }\r\n\r\n onDeviceRoomMeetingPageChange(event: PageChangeEvent) {\r\n this.dataDeviceRoomMeetingSkip = event.skip;\r\n this.bindDeviceRoomMeetings();\r\n }\r\n\r\n async onDeviceRoomMeetingSelectedKeysChange() {\r\n if (this.dataDeviceRoomMeetingSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n if (this.dataDeviceRoomMeetingSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n if (this.dataDeviceRoomMeetings.length > 0 && this.InputingFile === false) {\r\n const selectedID = this.dataDeviceRoomMeetingSelection[0];\r\n const selectedItem = this.dataDeviceRoomMeetings.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.bindtemp(selectedItem);\r\n this.dataDeviceRoomMeetingItem = selectedItem;\r\n \r\n }\r\n }\r\n }\r\n\r\n bindDeviceRoomMeetings() {\r\n this.dataDeviceRoomMeetingGridDataResult = {\r\n data: orderBy(this.dataDeviceRoomMeetings, this.dataDeviceRoomMeetingSortByField),\r\n total: this.dataDeviceRoomMeetings.length\r\n };\r\n\r\n this.dataDeviceRoomMeetingGridDataResult = process(this.dataDeviceRoomMeetings, this.dataDeviceRoomMeetingState);\r\n }\r\n\r\n onDeviceRoomMeetingSortChange(sort: SortDescriptor[]): void {\r\n this.dataDeviceRoomMeetingSortByField = sort;\r\n this.bindDeviceRoomMeetings();\r\n }\r\n\r\n public onDeviceRoomMeetingDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataDeviceRoomMeetingSelection = [];\r\n this.dataDeviceRoomMeetingState = state;\r\n this.dataDeviceRoomMeetingGridDataResult = process(this.dataDeviceRoomMeetings, this.dataDeviceRoomMeetingState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n // 'ID',\r\n 'Name',\r\n 'Description',\r\n 'DelFlg'\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n const extension = e.files[0].extension.toLowerCase();\r\n if (!extension || (extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.pdf')) {\r\n\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .xlsx, .xls.', false);\r\n\r\n return false;\r\n }\r\n\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n this.InputingFile = true;\r\n this.setSelectableSettings();\r\n this.dataDeviceRoomMeetings = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 1; i < fileData.length; i++) {\r\n\r\n let deviceName = fileData[i][this.getColumnIndex('Name')];\r\n let description = fileData[i][this.getColumnIndex('Description')];\r\n if (this.dataDeviceRoomMeetingsTemp.filter(item => item.Name == deviceName).length > 0\r\n\t\t\t\t&& this.dataDeviceRoomMeetingsTemp.filter(item => item.Description == description).length > 0) {\r\n\t\t\t\tthis.appSwal.showError(this.translate.instant('DuplicateDataImport'));\r\n\t\t\t\tthis.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n\t\t\t\treturn\r\n\t\t\t}\r\n \r\n const obj = {\r\n IsAdd: false,\r\n Name: deviceName,\r\n Description: description,\r\n DelFlg: fileData[i][this.getColumnIndex('DelFlg')],\r\n };\r\n\r\n this.dataDeviceRoomMeetings.push(obj);\r\n }\r\n this.bindDeviceRoomMeetings();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n this.getDeviceRoomMeetings();\r\n }\r\n\r\n async initDisplay() {\r\n\r\n }\r\n\r\n onSearch() {\r\n this.getDeviceRoomMeetings();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.InputingFile = false;\r\n this.setSelectableSettingsFile();\r\n this.searchOption.SearchText = '';\r\n this.getDeviceRoomMeetings();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearDeviceRoomMeeting() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n async getDeviceRoomMeeting() {\r\n const result = await this.appService.doGET('api/DeviceRoomMeeting', null);\r\n if (result.Status) {\r\n this.DeviceRoomMeetingfile = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < result.Data.length; i++) {\r\n this.DeviceRoomMeetingfile.push({\r\n ID: result.Data[i].ID,\r\n Name: result.Data[i].Name\r\n });\r\n }\r\n }\r\n }\r\n\r\n async onAddNewDeviceRoomMeeting() {\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.setDefault();\r\n this.infoOpened = true;\r\n const resultDeviceRoomMeeting = await this.appService.doGET('api/DeviceRoomMeeting', null);\r\n if (resultDeviceRoomMeeting && resultDeviceRoomMeeting.Status === 1) {\r\n this.DeviceRoomMeetings = resultDeviceRoomMeeting.Data;\r\n this.DeviceRoomMeetingsFilter = this.DeviceRoomMeetings.slice();\r\n }\r\n }\r\n\r\n onSaveDeviceRoomMeeting() {\r\n if (this.dataDeviceRoomMeetingItem.IsAdd) {\r\n this.addDeviceRoomMeeting();\r\n } else {\r\n this.updateDeviceRoomMeeting();\r\n }\r\n\r\n }\r\n\r\n async onSaveDeviceRoomMeetings() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataDeviceRoomMeetings.length; i++) {\r\n // check duplicate data\r\n let DeviceRoomMeeting = this.dataDeviceRoomMeetings[i];\r\n const dataRequest = {\r\n searchText: DeviceRoomMeeting.Name\r\n };\r\n const resultDeviceRoomMeetingListFromServer = await this.appService.doGET('api/DeviceRoomMeeting/Search', dataRequest);\r\n let isDuplicate = false;\r\n if (resultDeviceRoomMeetingListFromServer && resultDeviceRoomMeetingListFromServer.Data &&\r\n resultDeviceRoomMeetingListFromServer.Data.length > 0) {\r\n resultDeviceRoomMeetingListFromServer.Data.forEach(element => {\r\n if (element.Name == DeviceRoomMeeting.Name) {\r\n isDuplicate = true;\r\n }\r\n });\r\n }\r\n if (isDuplicate == false) {\r\n dataRequests.push(this.createDataRequest(this.dataDeviceRoomMeetings[i]));\r\n }\r\n }\r\n const result = await this.appService.doPOST('api/DeviceRoomMeeting/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n this.infoOpened = false;\r\n \r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataDeviceRoomMeetingItemtemp;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n Description: temp.Description,\r\n DelFlg: temp.DelFlg,\r\n };\r\n }\r\n\r\n onEditDeviceRoomMeeting() {\r\n this.infoOpened = true;\r\n this.enabled = true;\r\n this.enabledID = false;\r\n }\r\n\r\n async addDeviceRoomMeeting() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/DeviceRoomMeeting', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n \r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateDeviceRoomMeeting() {\r\n this.appComponent.loading = true;\r\n const id = this.dataDeviceRoomMeetingItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPUT('api/DeviceRoomMeeting', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n this.onReload();\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteDeviceRoomMeeting() {\r\n if (this.dataDeviceRoomMeetingSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataDeviceRoomMeetingSelection),\r\n FlgRevert: false\r\n };\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/DeviceRoomMeeting/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataDeviceRoomMeetingSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n}\r\n\r\n","module.exports = \"/* sticky toolbar */\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n.sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n/* sticky toolbar */\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 300px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9kYXRhLXJvb20tbWVldGluZy9kYXRhLXJvb20tbWVldGluZy9kYXRhLXJvb20tbWVldGluZy5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1CQUFtQjtBQUNuQjtJQUNJLGVBQWU7SUFDZixTQUFTO0lBQ1QsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtBQUNkO0FBRUE7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakI7QUFFQTtJQUNJO1FBQ0ksZUFBZTtRQUNmLFNBQVM7UUFDVCxjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixVQUFVO0lBQ2Q7O0lBRUE7UUFDSSxlQUFlO1FBQ2YsVUFBVTtRQUNWLGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLFVBQVU7SUFDZDtBQUNKO0FBRUEsbUJBQW1CO0FBRW5CO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCIiwiZmlsZSI6InNyYy9hcHAvZGF0YS9kYXRhLXJvb20tbWVldGluZy9kYXRhLXJvb20tbWVldGluZy9kYXRhLXJvb20tbWVldGluZy5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiA3NnB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk4JTtcclxufVxyXG5cclxuLnN0aWNreS10b29sYmFyLWJ0bi11c2Vye1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAxOTNweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OS41NSU7XHJcbn1cclxuXHJcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjhweCkge1xyXG4gICAgLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDc2cHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk0JTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLnN0aWNreS10b29sYmFyLWJ0bi11c2Vye1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDE5M3B4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5OSU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qIHN0aWNreSB0b29sYmFyICovXHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnN0aWNreS1oZWFkZXItZ3JpZCAuay1ncmlkIC5rLWdyaWQtaGVhZGVyIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMzAwcHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTcuNTUlO1xyXG59Il19 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'DelFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { saveAs } from '@progress/kendo-file-saver';\r\nimport { Http } from '@angular/http';\r\nimport { KendoButtonService } from '@progress/kendo-angular-buttons/dist/es2015/button/button.service';\r\nimport { DataSource } from '@angular/cdk/table';\r\n\r\n\r\n@Component({\r\n selector: 'app-data-room-meeting',\r\n templateUrl: './data-room-meeting.component.html',\r\n styleUrls: ['./data-room-meeting.component.css']\r\n})\r\nexport class DataRoomMeetingComponent implements OnInit, OnDestroy {\r\n\r\n isStickySearch = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isStickySearch = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataRoomMeetings = [];\r\n dataRoomMeetingsTemp = [];\r\n dataRoomMeetingSelectableSettings: SelectableSettings;\r\n dataRoomMeetingSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataRoomMeetingFocus = {\r\n Name: true\r\n };\r\n dataRoomMeetingSortByField: SortDescriptor[] = [];\r\n\r\n public WORKING_NUM_PAGING_SKIP = 0;\r\n public WORKING_NUM_PAGING_TAKE = 50;\r\n public WORKING_NUM_PAGING_BTN = 5;\r\n\r\n dataRoomMeetingSkip = this.WORKING_NUM_PAGING_SKIP;\r\n dataRoomMeetingPageSize = this.WORKING_NUM_PAGING_TAKE;\r\n dataRoomMeetingSelection: number[] = [];\r\n dataRoomMeetingItem: any;\r\n dataRoomMeetingItemtemp: any;\r\n myInterval: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.WORKING_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataRoomMeetingState: State = {\r\n skip: this.dataRoomMeetingSkip,\r\n take: this.dataRoomMeetingSkip + this.dataRoomMeetingPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n dataRoomMeetingGridDataResult: GridDataResult;\r\n\r\n RoomMeetings: Array<{ Name: string, ID: string }>;\r\n RoomMeetingsFilter: Array<{ Name: string, ID: string }>;\r\n RoomMeetingfile: Array<{ Name: string, ID: string }>;\r\n DeviceRoomMeeting: Array<{ Name: string, ID: string }>;\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n pageName: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n InputingFile = false;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private http: Http,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n this.getPageName();\r\n }\r\n\r\n RoomMeetingsHandleFilter(value) {\r\n this.RoomMeetingsFilter = this.RoomMeetings.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.allowMulti = !this.allowMulti;\r\n if (this.InputingFile === true) {\r\n this.allowMulti = false;\r\n this.dataRoomMeetingSelectableSettings = {\r\n enabled: false,\r\n mode: 'single'\r\n };\r\n } else {\r\n this.dataRoomMeetingSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n }\r\n\r\n setSelectableSettingsFile(): void {\r\n this.dataRoomMeetingSelectableSettings = {\r\n enabled: true,\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getRoomMeetings() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/RoomMeeting/Search', dataRequest);\r\n if (result && result.Status) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < result.Data.length; i++) {\r\n if (result.Data[i].ParentID !== '') {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let j = 0; j < result.Data.length; j++) {\r\n if (result.Data[i].ParentID === result.Data[j].ID) {\r\n result.Data[i].ParentName = result.Data[j].Name\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.dataRoomMeetings = result.Data;\r\n this.dataRoomMeetingsTemp = this.dataRoomMeetings;\r\n this.bindRoomMeetings();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n\r\n this.getRoomMeetingParent();\r\n }\r\n\r\n async getRoomMeetingParent() {\r\n const result = await this.appService.doGET('api/RoomMeeting', null);\r\n if (result && result.Status) {\r\n this.RoomMeetings = result.Data;\r\n this.RoomMeetingsFilter = this.RoomMeetings.slice();\r\n }\r\n }\r\n\r\n checkSelectionID() {\r\n for (let i = this.dataRoomMeetingSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataRoomMeetings.find((item) => {\r\n return item.ID === this.dataRoomMeetingSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataRoomMeetingSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataRoomMeetingItem = {\r\n IsAdd: true,\r\n ID: '',\r\n Name: '',\r\n Address: '',\r\n SeatNumber: 0,\r\n Device: [],\r\n DATA_DEVICEs: [],\r\n DelFlg: false,\r\n };\r\n this.dataRoomMeetingItemtemp = Object.assign({}, this.dataRoomMeetingItem);\r\n\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.dataRoomMeetingSelection = [];\r\n }\r\n bindtemp(item) {\r\n this.dataRoomMeetingItemtemp = Object.assign({}, item);\r\n }\r\n\r\n onRoomMeetingPageChange(event: PageChangeEvent) {\r\n this.dataRoomMeetingSkip = event.skip;\r\n this.bindRoomMeetings();\r\n }\r\n\r\n async onRoomMeetingSelectedKeysChange() {\r\n if (this.dataRoomMeetingSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n if (this.dataRoomMeetingSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n if (this.dataRoomMeetings.length > 0 && this.InputingFile === false) {\r\n const selectedID = this.dataRoomMeetingSelection[0];\r\n const selectedItem = this.dataRoomMeetings.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataRoomMeetingItem = selectedItem;\r\n this.bindtemp(this.dataRoomMeetingItem);\r\n }\r\n }\r\n }\r\n\r\n bindRoomMeetings() {\r\n this.dataRoomMeetingGridDataResult = {\r\n data: orderBy(this.dataRoomMeetings, this.dataRoomMeetingSortByField),\r\n total: this.dataRoomMeetings.length\r\n };\r\n\r\n this.dataRoomMeetingGridDataResult = process(this.dataRoomMeetings, this.dataRoomMeetingState);\r\n }\r\n\r\n onRoomMeetingSortChange(sort: SortDescriptor[]): void {\r\n this.dataRoomMeetingSortByField = sort;\r\n this.bindRoomMeetings();\r\n }\r\n\r\n public onRoomMeetingDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataRoomMeetingSelection = [];\r\n this.dataRoomMeetingState = state;\r\n this.dataRoomMeetingGridDataResult = process(this.dataRoomMeetings, this.dataRoomMeetingState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n // 'ID',\r\n 'Name',\r\n 'Address',\r\n 'SeatNumber',\r\n 'DeviceListName',\r\n 'DelFlg'\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n getDeviceIdsFromNames(deviceNameStr) {\r\n\t\tvar deviceIds = []\r\n\t\tif (deviceNameStr === '') {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tvar deviceNames = deviceNameStr.split(';');\r\n\t\tdeviceNames.forEach(name => {\r\n\t\t\tlet deviceId = this.DeviceRoomMeeting.find(item => {\r\n\t\t\t\treturn this.appUtils.compareString(name, item.Name, item.ID);\r\n\t\t\t});\r\n\t\t\tdeviceIds.push(deviceId);\r\n\t\t});\r\n\t\treturn deviceIds;\r\n }\r\n \r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n const extension = e.files[0].extension.toLowerCase();\r\n if (!extension || (extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.pdf')) {\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .xlsx, .xls.', false);\r\n return false;\r\n }\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n this.InputingFile = true;\r\n this.setSelectableSettings();\r\n this.dataRoomMeetings = [];\r\n const RoomMeetingListTemp = this.RoomMeetings.slice();\r\n\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 1; i < fileData.length; i++) {\r\n let deviceNames = fileData[i][this.getColumnIndex('DeviceListName')];\r\n let address = fileData[i][this.getColumnIndex('Address')];\r\n let name = fileData[i][this.getColumnIndex('Name')];\r\n if (this.dataRoomMeetingsTemp.filter(item => item.Name == name).length > 0\r\n\t\t\t\t&& this.dataRoomMeetingsTemp.filter(item => item.Address == address).length > 0) {\r\n\t\t\t\tthis.appSwal.showError(this.translate.instant('DuplicateDataImport'));\r\n\t\t\t\tthis.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n\t\t\t\treturn\r\n }\r\n var deviceIds = [];\r\n\t\t\tlet deviceItems = [];\r\n\t\t\tif (deviceNames && deviceNames != \"\") {\r\n\t\t\t\tdeviceItems = this.getDeviceIdsFromNames(deviceNames);\r\n\t\t\t\tif (deviceItems) {\r\n\t\t\t\t\tdeviceIds = deviceItems.map(({ ID }) => ID)\r\n\t\t\t\t}\r\n }\r\n \r\n \r\n const obj = {\r\n IsAdd: false,\r\n Address: address,\r\n Name: name,\r\n DeviceListName: fileData[i][this.getColumnIndex('DeviceListName')],\r\n DATA_DEVICEs: deviceItems,\r\n SeatNumber: fileData[i][this.getColumnIndex('SeatNumber')],\r\n DelFlg: fileData[i][this.getColumnIndex('DelFlg')]\r\n };\r\n\r\n this.dataRoomMeetings.push(obj);\r\n }\r\n this.bindRoomMeetings();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n this.getRoomMeetings();\r\n }\r\n\r\n async initDisplay() {\r\n const deviceList = await this.appService.doGET('api/DeviceRoomMeeting', null);\r\n\t\tif (deviceList && deviceList.Status === 1) {\r\n\t\t\tthis.DeviceRoomMeeting = deviceList.Data;\r\n\t\t}\r\n\r\n }\r\n\r\n onSearch() {\r\n this.getRoomMeetings();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.InputingFile = false;\r\n this.setSelectableSettingsFile();\r\n this.searchOption.SearchText = '';\r\n this.getRoomMeetings();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearRoomMeeting() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n async getRoomMeeting() {\r\n const result = await this.appService.doGET('api/RoomMeeting', null);\r\n if (result.Status) {\r\n this.RoomMeetingfile = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < result.Data.length; i++) {\r\n this.RoomMeetingfile.push({\r\n ID: result.Data[i].ID,\r\n Name: result.Data[i].Name\r\n });\r\n }\r\n }\r\n }\r\n\r\n async onAddNewRoomMeeting() {\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.setDefault();\r\n this.infoOpened = true;\r\n const resultRoomMeeting = await this.appService.doGET('api/RoomMeeting', null);\r\n if (resultRoomMeeting && resultRoomMeeting.Status === 1) {\r\n this.RoomMeetings = resultRoomMeeting.Data;\r\n this.RoomMeetingsFilter = this.RoomMeetings.slice();\r\n }\r\n\r\n }\r\n\r\n onSaveRoomMeeting() {\r\n if (this.dataRoomMeetingItem.IsAdd) {\r\n this.addRoomMeeting();\r\n\r\n } else {\r\n this.updateRoomMeeting();\r\n }\r\n\r\n }\r\n\r\n async onSaveRoomMeetings() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n \r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataRoomMeetings.length; i++) {\r\n // check duplicate data\r\n let RoomMeeting = this.dataRoomMeetings[i];\r\n const dataRequest = {\r\n searchText: RoomMeeting.Name\r\n };\r\n const resultRoomMeetingListFromServer = await this.appService.doGET('api/RoomMeeting/Search', dataRequest);\r\n let isDuplicate = false;\r\n if (resultRoomMeetingListFromServer && resultRoomMeetingListFromServer.Data &&\r\n resultRoomMeetingListFromServer.Data.length > 0) {\r\n resultRoomMeetingListFromServer.Data.forEach(element => {\r\n if (element.Name == RoomMeeting.Name) {\r\n isDuplicate = true;\r\n }\r\n });\r\n }\r\n if (isDuplicate == false) {\r\n dataRequests.push(this.createDataRequest(this.dataRoomMeetings[i]));\r\n }\r\n }\r\n const result = await this.appService.doPOST('api/RoomMeeting/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const deviceList = [];\r\n // tslint:disable-next-line: max-line-length\r\n \r\n // if (this.dataRoomMeetingItemtemp.Name == \"\" && this.dataRoomMeetingItemtemp.Device == \"\") {\r\n\t\t// \tthis.dataRoomMeetingItemtemp = data;\r\n\t\t// }\r\n \r\n\t\tif (typeof (this.dataRoomMeetingItemtemp.DATA_DEVICEs) !== 'undefined' && this.dataRoomMeetingItemtemp.DATA_DEVICEs != null && this.dataRoomMeetingItemtemp.DATA_DEVICEs.length > 0) {\r\n\t\t\t// tslint:disable-next-line:prefer-for-of\r\n\t\t\tfor (let i = 0; i < this.dataRoomMeetingItemtemp.DATA_DEVICEs.length; i++) {\r\n\t\t\t\tdeviceList.push(this.dataRoomMeetingItemtemp.DATA_DEVICEs[i].ID);\r\n\t\t\t}\r\n }\r\n const temp = data ? data : this.dataRoomMeetingItemtemp;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n Address: temp.Address,\r\n Device: JSON.stringify(deviceList) ,\r\n SeatNumber: temp.SeatNumber,\r\n DelFlg: temp.DelFlg,\r\n };\r\n }\r\n\r\n onEditRoomMeeting() {\r\n this.infoOpened = true;\r\n this.enabled = true;\r\n this.enabledID = false;\r\n }\r\n\r\n async addRoomMeeting() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/RoomMeeting', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateRoomMeeting() {\r\n this.appComponent.loading = true;\r\n const id = this.dataRoomMeetingItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPUT('api/RoomMeeting', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n this.onReload();\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteRoomMeeting() {\r\n if (this.dataRoomMeetingSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataRoomMeetingSelection),\r\n FlgRevert: false\r\n };\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/RoomMeeting/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataRoomMeetingSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n\r\n}\r\n","module.exports = \"/* sticky toolbar */\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n.sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 199px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 199px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n/* sticky toolbar */\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9kb2N1bWVudC1tZWV0aW5nL2RvY3VtZW50LW1lZXRpbmcuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUI7QUFDbkI7SUFDSSxlQUFlO0lBQ2YsU0FBUztJQUNULGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLFVBQVU7QUFDZDtBQUVBO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCO0FBRUE7SUFDSTtRQUNJLGVBQWU7UUFDZixTQUFTO1FBQ1QsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkOztJQUVBO1FBQ0ksZUFBZTtRQUNmLFVBQVU7UUFDVixjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixVQUFVO0lBQ2Q7QUFDSjtBQUVBLG1CQUFtQiIsImZpbGUiOiJzcmMvYXBwL2RhdGEvZG9jdW1lbnQtbWVldGluZy9kb2N1bWVudC1tZWV0aW5nLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBzdGlja3kgdG9vbGJhciAqL1xyXG4uc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDc2cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTglO1xyXG59XHJcblxyXG4uc3RpY2t5LXRvb2xiYXItYnRue1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAxOTlweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OS41NSU7XHJcbn1cclxuXHJcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjhweCkge1xyXG4gICAgLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDc2cHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk0JTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLnN0aWNreS10b29sYmFyLWJ0bntcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiAxOTlweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTklO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqLyJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { saveAs } from '@progress/kendo-file-saver';\r\nimport { Http } from '@angular/http';\r\nimport { KendoButtonService } from '@progress/kendo-angular-buttons/dist/es2015/button/button.service';\r\nimport { DataSource } from '@angular/cdk/table';\r\n\r\n@Component({\r\n selector: 'app-document-meeting',\r\n templateUrl: './document-meeting.component.html',\r\n styleUrls: ['./document-meeting.component.css']\r\n})\r\nexport class DocumentMeetingComponent implements OnInit {\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataDocumentMeetings = [];\r\n dataDocumentMeetingsTemp = [];\r\n dataDocumentMeetingSelectableSettings: SelectableSettings;\r\n dataDocumentMeetingSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataDocumentMeetingFocus = {\r\n Name: true\r\n };\r\n dataDocumentMeetingSortByField: SortDescriptor[] = [];\r\n\r\n public WORKING_NUM_PAGING_SKIP = 0;\r\n public WORKING_NUM_PAGING_TAKE = 50;\r\n public WORKING_NUM_PAGING_BTN = 5;\r\n\r\n dataDocumentMeetingSkip = this.WORKING_NUM_PAGING_SKIP;\r\n dataDocumentMeetingPageSize = this.WORKING_NUM_PAGING_TAKE;\r\n dataDocumentMeetingSelection: number[] = [];\r\n dataDocumentMeetingItem: any;\r\n dataDocumentMeetingItemtemp: any;\r\n myInterval: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.WORKING_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataDocumentMeetingState: State = {\r\n skip: this.dataDocumentMeetingSkip,\r\n take: this.dataDocumentMeetingSkip + this.dataDocumentMeetingPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n dataDocumentMeetingGridDataResult: GridDataResult;\r\n\r\n DocumentMeetings: Array<{ Name: string, ID: string }>;\r\n DocumentMeetingfile: Array<{ Name: string, ID: string }>;\r\n DeviceDocumentMeeting: Array<{ Name: string, ID: string }>;\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n pageName: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n InputingFile = false;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n filesUpload: Array;\r\n allowInsertFile = true;\r\n filesUploadName = \"\";\r\n public fileSaveUrl: any;\r\n urlDownload = this.appService.apiRoot;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private http: Http,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.getPageName();\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.allowMulti = !this.allowMulti;\r\n if (this.InputingFile === true) {\r\n this.allowMulti = false;\r\n this.dataDocumentMeetingSelectableSettings = {\r\n enabled: false,\r\n mode: 'single'\r\n };\r\n } else {\r\n this.dataDocumentMeetingSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n }\r\n\r\n setSelectableSettingsFile(): void {\r\n this.dataDocumentMeetingSelectableSettings = {\r\n enabled: true,\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getDocumentMeetings() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/Document/Search', dataRequest);\r\n if (result && result.Status) { \r\n\r\n this.dataDocumentMeetings = result.Data;\r\n this.dataDocumentMeetingsTemp = this.dataDocumentMeetings;\r\n this.bindDocumentMeetings();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n\r\n }\r\n\r\n\r\n checkSelectionID() {\r\n for (let i = this.dataDocumentMeetingSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataDocumentMeetings.find((item) => {\r\n return item.ID === this.dataDocumentMeetingSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataDocumentMeetingSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataDocumentMeetingItem = {\r\n IsAdd: true,\r\n ID: '',\r\n Name: '',\r\n Path: '',\r\n };\r\n this.dataDocumentMeetingItemtemp = Object.assign({}, this.dataDocumentMeetingItem);\r\n\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.filesUpload = [];\r\n this.dataDocumentMeetingSelection = [];\r\n this.filesUploadName = \"\";\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n }\r\n bindtemp(item) {\r\n this.dataDocumentMeetingItemtemp = Object.assign({}, item);\r\n }\r\n\r\n onDocumentMeetingPageChange(event: PageChangeEvent) {\r\n this.dataDocumentMeetingSkip = event.skip;\r\n this.bindDocumentMeetings();\r\n }\r\n\r\n async onDocumentMeetingSelectedKeysChange() {\r\n if (this.dataDocumentMeetingSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n if (this.dataDocumentMeetingSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n if (this.dataDocumentMeetings.length > 0 && this.InputingFile === false) {\r\n const selectedID = this.dataDocumentMeetingSelection[0];\r\n const selectedItem = this.dataDocumentMeetings.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataDocumentMeetingItem = selectedItem;\r\n this.bindtemp(this.dataDocumentMeetingItem);\r\n }\r\n }\r\n }\r\n\r\n bindDocumentMeetings() {\r\n this.dataDocumentMeetingGridDataResult = {\r\n data: orderBy(this.dataDocumentMeetings, this.dataDocumentMeetingSortByField),\r\n total: this.dataDocumentMeetings.length\r\n };\r\n\r\n this.dataDocumentMeetingGridDataResult = process(this.dataDocumentMeetings, this.dataDocumentMeetingState);\r\n }\r\n\r\n onDocumentMeetingSortChange(sort: SortDescriptor[]): void {\r\n this.dataDocumentMeetingSortByField = sort;\r\n this.bindDocumentMeetings();\r\n }\r\n\r\n public onDocumentMeetingDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataDocumentMeetingSelection = [];\r\n this.dataDocumentMeetingState = state;\r\n this.dataDocumentMeetingGridDataResult = process(this.dataDocumentMeetings, this.dataDocumentMeetingState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n // 'ID',\r\n 'Name', \r\n 'Path'\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n \r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n const extension = e.files[0].extension.toLowerCase();\r\n if (!extension || (extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.pdf')) {\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .xlsx, .xls.', false);\r\n return false;\r\n }\r\n\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n this.InputingFile = true;\r\n this.setSelectableSettings();\r\n this.dataDocumentMeetings = [];\r\n const DocumentMeetingListTemp = this.DocumentMeetings.slice();\r\n\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 1; i < fileData.length; i++) {\r\n let name = fileData[i][this.getColumnIndex('Name')];\r\n if (this.dataDocumentMeetingsTemp.filter(item => item.Name == name).length > 0) {\r\n\t\t\t\tthis.appSwal.showError(this.translate.instant('DuplicateDataImport'));\r\n\t\t\t\tthis.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n\t\t\t\treturn\r\n }\r\n \r\n const obj = {\r\n IsAdd: false, \r\n Name: name, \r\n Path: fileData[i][this.getColumnIndex('Path')]\r\n };\r\n\r\n this.dataDocumentMeetings.push(obj);\r\n }\r\n this.bindDocumentMeetings();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n this.getDocumentMeetings();\r\n }\r\n\r\n\r\n onSearch() {\r\n this.getDocumentMeetings();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.InputingFile = false;\r\n this.setSelectableSettingsFile();\r\n this.searchOption.SearchText = '';\r\n this.getDocumentMeetings();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearDocumentMeeting() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n async onAddNewDocumentMeeting() {\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.setDefault();\r\n this.infoOpened = true; \r\n }\r\n\r\n onSaveDocumentMeeting() {\r\n if (this.dataDocumentMeetingItem.IsAdd) {\r\n this.addDocumentMeeting();\r\n\r\n } else {\r\n this.updateDocumentMeeting();\r\n }\r\n\r\n }\r\n\r\n async onSaveDocumentMeetings() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n \r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataDocumentMeetings.length; i++) {\r\n // check duplicate data\r\n let DocumentMeeting = this.dataDocumentMeetings[i];\r\n const dataRequest = {\r\n searchText: DocumentMeeting.Name\r\n };\r\n const resultDocumentMeetingListFromServer = await this.appService.doGET('api/Document/Search', dataRequest);\r\n let isDuplicate = false;\r\n if (resultDocumentMeetingListFromServer && resultDocumentMeetingListFromServer.Data &&\r\n resultDocumentMeetingListFromServer.Data.length > 0) {\r\n resultDocumentMeetingListFromServer.Data.forEach(element => {\r\n if (element.Name == DocumentMeeting.Name) {\r\n isDuplicate = true;\r\n }\r\n });\r\n }\r\n if (isDuplicate == false) {\r\n dataRequests.push(this.createDataRequest(this.dataDocumentMeetings[i]));\r\n }\r\n }\r\n const result = await this.appService.doPOST('api/Document/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n \r\n const temp = data ? data : this.dataDocumentMeetingItemtemp;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n Path: temp.Path\r\n };\r\n }\r\n\r\n onEditDocumentMeeting() {\r\n this.infoOpened = true;\r\n this.enabled = true;\r\n this.enabledID = false;\r\n }\r\n\r\n async addDocumentMeeting() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Document', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateDocumentMeeting() {\r\n this.appComponent.loading = true;\r\n const id = this.dataDocumentMeetingItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPUT('api/Document', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n this.onReload();\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteDocumentMeeting() {\r\n if (this.dataDocumentMeetingSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataDocumentMeetingSelection),\r\n FlgRevert: false\r\n };\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Document/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataDocumentMeetingSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return;\r\n }\r\n\r\n const extension = e.files[0].extension.toLowerCase();\r\n\r\n this.allowInsertFile = true;\r\n\r\n try {\r\n const fileData = e.files[0];\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n this.appSwal.showError(e);\r\n return false;\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n this.dataDocumentMeetingItemtemp.Path = '';\r\n this.filesUploadName = '';\r\n this.filesUpload = [];\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n if (!this.allowInsertFile) {\r\n return;\r\n }\r\n try {\r\n if(this.dataDocumentMeetingItemtemp.Path == undefined){\r\n this.dataDocumentMeetingItemtemp.Path = '';\r\n }\r\n this.dataDocumentMeetingItemtemp.Path =`${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n this.dataDocumentMeetingItemtemp.Name = this.getFileName(this.dataDocumentMeetingItemtemp.Path);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n getFileName(fileUrls) {\r\n var nameFile = \"\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n onRemoveFile(file){\r\n this.dataDocumentMeetingItemtemp.Path = '';\r\n }\r\n\r\n getUrlDownload(item) { \r\n let url = this.urlDownload.replace(/\\\"/g, \"\") + item;\r\n url = url.replace(/\\\"/g, '')\r\n window.open(url);\r\n }\r\n}\r\n","module.exports = \".bra-name {\\r\\n color: blue;\\r\\n}\\r\\n\\r\\n[_nghost-c0] .k-panelbar>.k-item>.k-link.k-state-selected {\\r\\n background-color: #7c9bb7 !important;\\r\\n}\\r\\n\\r\\n.banner-element,\\r\\n.video-element {\\r\\n display: inline-block;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n.banner-element {\\r\\n width: 100%;\\r\\n height: 156px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.banner-element img {\\r\\n width: 100%;\\r\\n height: 156px;\\r\\n}\\r\\n\\r\\n.video-element {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.video-element img {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n}\\r\\n\\r\\n.image-element {\\r\\n width: 210px;\\r\\n height: 140px;\\r\\n padding: 0;\\r\\n margin-left: 17px;\\r\\n margin-right: 17px;\\r\\n}\\r\\n\\r\\n.image-element img {\\r\\n width: 100px;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\n.custom-list {\\r\\n width: 40%;\\r\\n display: contents;\\r\\n}\\r\\n\\r\\n.custom-list-status {\\r\\n width: 50%;\\r\\n display: contents;\\r\\n}\\r\\n\\r\\n.custom-list-status input {\\r\\n margin-top: 4px;\\r\\n}\\r\\n\\r\\n.custom-list-child {\\r\\n display: block;\\r\\n margin-left: 20px;\\r\\n}\\r\\n\\r\\n.element-search {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.element-search {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.image-upload-cus {\\r\\n display: contents;\\r\\n width: 100%;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\nagm-map {\\r\\n height: 506px;\\r\\n}\\r\\n\\r\\n.file-uploaded {\\r\\n color: #006CB7 !important;\\r\\n width: 182px;\\r\\n float: right;\\r\\n margin-top: 36px;\\r\\n}\\r\\n\\r\\n.xdialogchat {\\r\\n width: 90% !important;\\r\\n height: 90% !important;\\r\\n max-width: 800px !important;\\r\\n max-height: 600px !important;\\r\\n}\\r\\n\\r\\n.page {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.title {\\r\\n font-size: 28px;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.img-banner {\\r\\n width: 100%;\\r\\n max-height: 500px;\\r\\n}\\r\\n\\r\\n.description {\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n/* .cke_contents{\\r\\n height: 750px;\\r\\n}\\r\\n.cke_reset{\\r\\n height: 750px;\\r\\n} */\\r\\n\\r\\n#cke_2_contents {\\r\\n height: 750px;\\r\\n}\\r\\n\\r\\n.portal .group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n}\\r\\n\\r\\n.btnLink {\\r\\n background-color: DodgerBlue;\\r\\n border: none;\\r\\n color: white;\\r\\n /* padding: 12px 16px; */\\r\\n font-size: 16px;\\r\\n cursor: pointer;\\r\\n position: absolute;\\r\\n right: 15px;\\r\\n z-index: 1;\\r\\n}\\r\\n\\r\\n.btnLink:hover {\\r\\n background-color: RoyalBlue;\\r\\n}\\r\\n\\r\\n.dialog-post {\\r\\n z-index: 1000 !important;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 199px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 199px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9tYWlsLWNvbmZpZy9tYWlsLWNvbmZpZy5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksV0FBVztBQUNmOztBQUVBO0lBQ0ksb0NBQW9DO0FBQ3hDOztBQUVBOztJQUVJLHFCQUFxQjtJQUNyQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLFVBQVU7QUFDZDs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGFBQWE7SUFDYixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLFlBQVk7SUFDWixhQUFhO0lBQ2IsVUFBVTtJQUNWLGlCQUFpQjtJQUNqQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osYUFBYTtBQUNqQjs7QUFFQTtJQUNJLFVBQVU7SUFDVixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxVQUFVO0lBQ1YsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGNBQWM7SUFDZCxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksV0FBVztBQUNmOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLFdBQVc7SUFDWCxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksYUFBYTtBQUNqQjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixZQUFZO0lBQ1osWUFBWTtJQUNaLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLHFCQUFxQjtJQUNyQixzQkFBc0I7SUFDdEIsMkJBQTJCO0lBQzNCLDRCQUE0QjtBQUNoQzs7QUFFQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGVBQWU7SUFDZixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUdBOzs7OztHQUtHOztBQUVIO0lBQ0ksYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSw0QkFBNEI7SUFDNUIsWUFBWTtJQUNaLFlBQVk7SUFDWix3QkFBd0I7SUFDeEIsZUFBZTtJQUNmLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFVBQVU7QUFDZDs7QUFFQTtJQUNJLDJCQUEyQjtBQUMvQjs7QUFFQTtJQUNJLHdCQUF3QjtBQUM1Qjs7QUFFQSxtQkFBbUI7O0FBQ25CO0lBQ0ksZUFBZTtJQUNmLFNBQVM7SUFDVCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakI7O0FBRUE7SUFDSTtRQUNJLGVBQWU7UUFDZixTQUFTO1FBQ1QsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkOztJQUVBO1FBQ0ksZUFBZTtRQUNmLFVBQVU7UUFDVixjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixVQUFVO0lBQ2Q7QUFDSjs7QUFFQSxtQkFBbUIiLCJmaWxlIjoic3JjL2FwcC9kYXRhL21haWwtY29uZmlnL21haWwtY29uZmlnLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuYnJhLW5hbWUge1xyXG4gICAgY29sb3I6IGJsdWU7XHJcbn1cclxuXHJcbltfbmdob3N0LWMwXSAuay1wYW5lbGJhcj4uay1pdGVtPi5rLWxpbmsuay1zdGF0ZS1zZWxlY3RlZCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2M5YmI3ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5iYW5uZXItZWxlbWVudCxcclxuLnZpZGVvLWVsZW1lbnQge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcclxufVxyXG5cclxuLmJhbm5lci1lbGVtZW50IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxNTZweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi5iYW5uZXItZWxlbWVudCBpbWcge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDE1NnB4O1xyXG59XHJcblxyXG4udmlkZW8tZWxlbWVudCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMjA2cHg7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG59XHJcblxyXG4udmlkZW8tZWxlbWVudCBpbWcge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDIwNnB4O1xyXG59XHJcblxyXG4uaW1hZ2UtZWxlbWVudCB7XHJcbiAgICB3aWR0aDogMjEwcHg7XHJcbiAgICBoZWlnaHQ6IDE0MHB4O1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbi1sZWZ0OiAxN3B4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAxN3B4O1xyXG59XHJcblxyXG4uaW1hZ2UtZWxlbWVudCBpbWcge1xyXG4gICAgd2lkdGg6IDEwMHB4O1xyXG4gICAgaGVpZ2h0OiAxMDBweDtcclxufVxyXG5cclxuLmN1c3RvbS1saXN0IHtcclxuICAgIHdpZHRoOiA0MCU7XHJcbiAgICBkaXNwbGF5OiBjb250ZW50cztcclxufVxyXG5cclxuLmN1c3RvbS1saXN0LXN0YXR1cyB7XHJcbiAgICB3aWR0aDogNTAlO1xyXG4gICAgZGlzcGxheTogY29udGVudHM7XHJcbn1cclxuXHJcbi5jdXN0b20tbGlzdC1zdGF0dXMgaW5wdXQge1xyXG4gICAgbWFyZ2luLXRvcDogNHB4O1xyXG59XHJcblxyXG4uY3VzdG9tLWxpc3QtY2hpbGQge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBtYXJnaW4tbGVmdDogMjBweDtcclxufVxyXG5cclxuLmVsZW1lbnQtc2VhcmNoIHtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG59XHJcblxyXG4uZWxlbWVudC1zZWFyY2gge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5pbWFnZS11cGxvYWQtY3VzIHtcclxuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMHB4O1xyXG59XHJcblxyXG5hZ20tbWFwIHtcclxuICAgIGhlaWdodDogNTA2cHg7XHJcbn1cclxuXHJcbi5maWxlLXVwbG9hZGVkIHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3ICFpbXBvcnRhbnQ7XHJcbiAgICB3aWR0aDogMTgycHg7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICBtYXJnaW4tdG9wOiAzNnB4O1xyXG59XHJcblxyXG4ueGRpYWxvZ2NoYXQge1xyXG4gICAgd2lkdGg6IDkwJSAhaW1wb3J0YW50O1xyXG4gICAgaGVpZ2h0OiA5MCUgIWltcG9ydGFudDtcclxuICAgIG1heC13aWR0aDogODAwcHggIWltcG9ydGFudDtcclxuICAgIG1heC1oZWlnaHQ6IDYwMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5wYWdlIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4udGl0bGUge1xyXG4gICAgZm9udC1zaXplOiAyOHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5pbWctYmFubmVyIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWF4LWhlaWdodDogNTAwcHg7XHJcbn1cclxuXHJcbi5kZXNjcmlwdGlvbiB7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG59XHJcblxyXG5cclxuLyogLmNrZV9jb250ZW50c3tcclxuICAgIGhlaWdodDogNzUwcHg7XHJcbn1cclxuLmNrZV9yZXNldHtcclxuICAgIGhlaWdodDogNzUwcHg7XHJcbn0gKi9cclxuXHJcbiNja2VfMl9jb250ZW50cyB7XHJcbiAgICBoZWlnaHQ6IDc1MHB4O1xyXG59XHJcblxyXG4ucG9ydGFsIC5ncm91cC1oZWFkZXIge1xyXG4gICAgcGFkZGluZy10b3A6IDEzcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMTNweDtcclxufVxyXG5cclxuLmJ0bkxpbmsge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogRG9kZ2VyQmx1ZTtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIC8qIHBhZGRpbmc6IDEycHggMTZweDsgKi9cclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHJpZ2h0OiAxNXB4O1xyXG4gICAgei1pbmRleDogMTtcclxufVxyXG5cclxuLmJ0bkxpbms6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogUm95YWxCbHVlO1xyXG59XHJcblxyXG4uZGlhbG9nLXBvc3Qge1xyXG4gICAgei1pbmRleDogMTAwMCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqL1xyXG4uc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDc2cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTglO1xyXG59XHJcblxyXG4uc3RpY2t5LXRvb2xiYXItYnRue1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAxOTlweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OS41NSU7XHJcbn1cclxuXHJcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjhweCkge1xyXG4gICAgLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDc2cHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk0JTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLnN0aWNreS10b29sYmFyLWJ0bntcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiAxOTlweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTklO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqLyJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{postTemp.Title}}
\\r\\n
\\r\\n
\\r\\n
{{postTemp.Title}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ConfigComponent } from 'src/app/ad/config/config.component';\r\nimport * as DecoupledEditor from '@ckeditor/ckeditor5-build-decoupled-document';\r\n// import CKFinder from '@ckeditor/ckeditor5-ckfinder/src/ckfinder';\r\ndeclare var CKEDITOR: any;\r\n\r\n@Component({\r\n selector: 'app-mail-config',\r\n templateUrl: './mail-config.component.html',\r\n styleUrls: ['./mail-config.component.css']\r\n})\r\nexport class MailConfigComponent implements OnInit {\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 140;\r\n }\r\n\r\n public uploadFlgDefault = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n public Editor = DecoupledEditor;\r\n\r\n uploadFlg = this.uploadFlgDefault;\r\n public websiteDefault = null;\r\n websiteLink = this.websiteDefault;\r\n public bannerDef = '../../assets/images/default-01.png';\r\n public imageDef = '../../assets/images/default-02.png';\r\n public imgSaveUrl: any;\r\n imgImageDefault: any;\r\n imgImageMain: any;\r\n\r\n user: any;\r\n loading = false;\r\n dataPosts = [];\r\n dataPostSelectableSettings: SelectableSettings;\r\n dataPostSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataPostFocus = {\r\n Name: true\r\n };\r\n dataPostSortByField: SortDescriptor[] = [];\r\n\r\n dataLogPostSelectableSettings: SelectableSettings;\r\n logPostOpened = false;\r\n reViewOpened = false;\r\n postTemp = {\r\n MenuName: '',\r\n Title: '',\r\n Description: '',\r\n ImageUrls: ''\r\n };\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataPostSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataPostPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataPostSelection: number[] = [];\r\n dataPostItem: any;\r\n myInterval: any;\r\n infoOpened = false;\r\n isReviewDialog = false;\r\n\r\n public dataPostState: State = {\r\n skip: this.dataPostSkip,\r\n take: this.dataPostSkip + this.dataPostPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n };\r\n\r\n\r\n\r\n dataPostGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n dataLogPostGridDataResult: GridDataResult;\r\n dataLogPosts: any[];\r\n\r\n dataMenuID: any[];\r\n pageName: any;\r\n\r\n menus: Array<{ Name: string, ID: string }>;\r\n menusFilter: Array<{ Name: string, ID: string }>;\r\n menusFilterSearch: Array<{ Name: string, ID: string }>;\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n PortalId: 14,\r\n MenuID: ''\r\n };\r\n\r\n IDValue: any;\r\n\r\n portalIds: any[];\r\n ckeConfig: any;\r\n editorOptions = { theme: 'vs-dark', language: 'javascript' };\r\n //CKEDITOR: any;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.imgSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=image`;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n this.onReload();\r\n this.getIDConfig();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n\r\n ngOnInit() {\r\n this.ckeConfig = {\r\n allowedContent: true,\r\n extraPlugins: 'divarea',\r\n forcePasteAsPlainText: true\r\n };\r\n }\r\n\r\n async getIDConfig(){\r\n const result = await this.appService.doGET('api/Enum/GetEConfig', null);\r\n if(result || result.Status === 1){\r\n this.IDValue = result.Data;\r\n }\r\n }\r\n\r\n onReady(eventData) {\r\n eventData.plugins.get('FileRepository').createUploadAdapter = function (loader) {\r\n console.log('loader : ', loader)\r\n console.log(btoa(loader.file));\r\n return new UploadAdapter(loader);\r\n };\r\n eventData.ui.getEditableElement().parentElement.insertBefore(\r\n eventData.ui.view.toolbar.element,\r\n eventData.ui.getEditableElement()\r\n );\r\n }\r\n public ckeditorContent: string = \"\";\r\n\r\n getData() {\r\n console.log(CKEDITOR.instances.content.getData());\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataPostSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onMenusSearchHandleFilter(value) {\r\n this.menusFilterSearch = this.menus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getPosts() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/MailConfig/getMail', dataRequest);\r\n\r\n if (result) {\r\n this.dataPosts = result.Data;\r\n this.bindPosts();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n onTabChanged(e) {\r\n if (e.index === 0) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataPostSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataPosts.find((item) => {\r\n return item.ID === this.dataPostSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataPostSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataPostItem = {\r\n IsAdd: true,\r\n Title: null,\r\n Description: null,\r\n CreateAt: new Date(),\r\n UpdateAt: new Date(),\r\n };\r\n this.enabled = true;\r\n this.enabledID = true;\r\n }\r\n\r\n onPostPageChange(event: PageChangeEvent) {\r\n this.dataPostSkip = event.skip;\r\n this.bindPosts();\r\n }\r\n\r\n async onPostSelectedKeysChange() {\r\n\r\n if (this.dataPostSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataPostSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataPostSelection[0];\r\n const selectedItem = this.dataPosts.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataPostItem = selectedItem;\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindPosts() {\r\n this.dataPostGridDataResult = {\r\n data: orderBy(this.dataPosts, this.dataPostSortByField),\r\n total: this.dataPosts.length\r\n };\r\n\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n bindLogPosts() {\r\n this.dataLogPostGridDataResult = {\r\n data: this.dataLogPosts,\r\n total: this.dataLogPosts.length\r\n };\r\n\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n onPostSortChange(sort: SortDescriptor[]): void {\r\n this.dataPostSortByField = sort;\r\n this.bindPosts();\r\n }\r\n\r\n public onPostDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataPostSelection = [];\r\n this.dataPostState = state;\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.imgImageMain[index] = '',\r\n this.onReload();\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n\r\n onSearch() {\r\n this.getPosts();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.getPosts();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearPost() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewPost() {\r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n async onSavePost() {\r\n //this.addPost();\r\n if (this.dataPostItem.IsAdd) { this.addPost(); } else { this.updatePost(); }\r\n }\r\n\r\n\r\n onCloseReViewPost(e) {\r\n this.reViewOpened = false;\r\n if (this.isReviewDialog) {\r\n this.infoOpened = true;\r\n } else {\r\n this.infoOpened = false;\r\n }\r\n }\r\n\r\n onReviewPost() {\r\n this.reViewOpened = true;\r\n this.infoOpened = false;\r\n this.getPostTemp();\r\n }\r\n\r\n onReviewPostDialog() {\r\n this.reViewOpened = true;\r\n this.infoOpened = false;\r\n this.isReviewDialog = true;\r\n this.getPostTemp();\r\n }\r\n isUploadFromServe = false;\r\n\r\n getPostTemp() {\r\n \r\n this.postTemp.Title = this.dataPostItem.Title;\r\n this.postTemp.Description = this.dataPostItem.Description;\r\n\r\n var content = this.postTemp.Description;\r\n var require = content.indexOf(\"= 0) {\r\n while (content.indexOf(\"= 0) {\r\n var st_Index = content.indexOf(\"\")\r\n var sub1 = content.substring(st_Index, end_Index + \" \".length);\r\n\r\n var st_key = sub1.indexOf(\"?v=\"); var end_key = sub1.indexOf('\">');\r\n var key = sub1.substring(st_key + \"?v=\".length, end_key);\r\n\r\n var replace = '';\r\n\r\n this.postTemp.Description = this.postTemp.Description.replace(sub1, replace);\r\n content = this.postTemp.Description;\r\n }\r\n }\r\n\r\n\r\n if (this.postTemp.ImageUrls.indexOf(\"Multimedia\") >= 0) {\r\n this.isUploadFromServe = true;\r\n }\r\n else {\r\n this.isUploadFromServe = false;\r\n }\r\n\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataPostItem;\r\n\r\n return {\r\n ID: temp.ID,\r\n Value: temp.Value,\r\n Description: temp.Description,\r\n SercurityValue: temp.SercurityValue\r\n };\r\n }\r\n\r\n onClosePost(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n\r\n onEditPost() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n parseToArrayTxt(arrayObject) {\r\n var arrayTxt = \"\";\r\n for (var i = 0; i < arrayObject.length; i++) {\r\n if (arrayObject[i] != \"\" && arrayObject[i] != null && arrayObject[i] != this.imageDef) {\r\n if (arrayTxt == \"\") {\r\n arrayTxt = \"[\" + \"\\\"\" + arrayObject[i] + \"\\\"\";\r\n } else {\r\n arrayTxt = arrayTxt + \",\" + \"\\\"\" + arrayObject[i] + \"\\\"\";\r\n }\r\n }\r\n }\r\n\r\n if (arrayTxt != \"\") {\r\n arrayTxt = arrayTxt + \"]\";\r\n }\r\n\r\n return arrayTxt;\r\n }\r\n\r\n async addPost() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/MailConfig/addMail', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewPost();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updatePost() {\r\n this.appComponent.loading = true;\r\n const id = this.dataPostItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPUT('api/MailConfig/updateMail', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n async onDeletePost() {\r\n if (this.dataPostSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataPostSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Post/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewPost();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataPostSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n // const lastIdx = fileUrl.lastIndexOf('/');\r\n // if (lastIdx > 0) {\r\n // nameFile = fileUrl.substring(lastIdx + 1);\r\n // }\r\n\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(dataItem: any) {\r\n\r\n const dataRequest = {\r\n url: dataItem.Url\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, dataItem.Name);\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataPosts, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = await this.file.readFile(e.files[0].rawFile);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n try {\r\n const k = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n this.dataFileUrls.push({\r\n Name: this.getNameByUrl(k),\r\n Url: k\r\n });\r\n\r\n this.bindFileUrls();\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n}\r\n\r\nexport class UploadAdapter {\r\n private loader;\r\n constructor(loader: any) {\r\n this.loader = loader;\r\n }\r\n\r\n upload() {\r\n return this.loader.file\r\n .then(file => new Promise((resolve, reject) => {\r\n var myReader = new FileReader();\r\n myReader.onloadend = (e) => {\r\n resolve({ default: myReader.result });\r\n }\r\n myReader.readAsDataURL(file);\r\n }));\r\n };\r\n\r\n}","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2RhdGEvbWFuZGF0ZXMvbWFuZGF0ZXMuY29tcG9uZW50LmNzcyJ9 */\"","module.exports = \"\\r\\n mandates works!\\r\\n
\\r\\n\"","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-mandates',\r\n templateUrl: './mandates.component.html',\r\n styleUrls: ['./mandates.component.css']\r\n})\r\nexport class MandatesComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","module.exports = \".xbutton {\\r\\n background-color: red;\\r\\n color: white !important;\\r\\n background: red;\\r\\n width: 100%;\\r\\n font-size: 25px !important;\\r\\n}\\r\\n\\r\\n.xdiv {\\r\\n border: 0.1px solid rgb(184, 184, 184);\\r\\n background-color: white;\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.xdivcol11 {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.xdivcol12 {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n height: 46px;\\r\\n}\\r\\n\\r\\n.xdivcol1 {\\r\\n padding-left: 0px;\\r\\n padding-right: 0px;\\r\\n}\\r\\n\\r\\n.text-url-style {\\r\\n color: navy;\\r\\n text-decoration: underline;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9tZWV0aW5nLWluZm8vbWVldGluZy1pbmZvLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxxQkFBcUI7SUFDckIsdUJBQXVCO0lBQ3ZCLGVBQWU7SUFDZixXQUFXO0lBQ1gsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksc0NBQXNDO0lBQ3RDLHVCQUF1QjtJQUN2QixlQUFlO0FBQ25COztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsMEJBQTBCO0FBQzlCIiwiZmlsZSI6InNyYy9hcHAvZGF0YS9tZWV0aW5nLWluZm8vbWVldGluZy1pbmZvLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIueGJ1dHRvbiB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XHJcbiAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDtcclxuICAgIGJhY2tncm91bmQ6IHJlZDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgZm9udC1zaXplOiAyNXB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi54ZGl2IHtcclxuICAgIGJvcmRlcjogMC4xcHggc29saWQgcmdiKDE4NCwgMTg0LCAxODQpO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgICBtYXJnaW4tdG9wOiAwcHg7XHJcbn1cclxuXHJcbi54ZGl2Y29sMTEge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbn1cclxuXHJcbi54ZGl2Y29sMTIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBoZWlnaHQ6IDQ2cHg7XHJcbn1cclxuXHJcbi54ZGl2Y29sMSB7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDBweDtcclxufVxyXG5cclxuLnRleHQtdXJsLXN0eWxlIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XHJcbn0iXX0= */\"","module.exports = \"\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\"","import { Component, Renderer2, NgZone, AfterViewInit, OnInit, OnDestroy, ViewEncapsulation, ViewChild, ElementRef, Output, EventEmitter, Input } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay, map } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { FormGroup, FormBuilder } from '@angular/forms';\r\nimport * as DecoupledEditor from '@ckeditor/ckeditor5-build-decoupled-document';\r\nimport { WebSocketService } from 'src/app/websocket.service';\r\n\r\n@Component({\r\n selector: 'app-meeting-info',\r\n templateUrl: './meeting-info.component.html',\r\n styleUrls: ['./meeting-info.component.css']\r\n})\r\nexport class MeetingInfoComponent implements OnInit {\r\n\r\n @Input() meetingdata = null;\r\n\r\n user: any;\r\n loading = false;\r\n dataMeetingItemTemp: any;\r\n\r\n admins: Array<{ FullName: string, UserName: string }> = [];\r\n adminsFilter: Array<{ FullName: string, UserName: string }> = [];\r\n members: Array<{ FullName: string, UserName: string }> = [];\r\n membersFilter: Array<{ FullName: string, UserName: string }> = [];\r\n units: Array<{ Name: string, ID: string }>;\r\n unitsFilter: Array<{ Name: string, ID: string }>;\r\n allmembers: Array<{ Name: string, ID: string }> = [];\r\n allmembersFilter: Array<{ Name: string, ID: string }> = [];\r\n rooms: Array<{ Name: string, ID: string }>;\r\n roomsFilter: Array<{ Name: string, ID: string }>;\r\n\r\n control: any;\r\n controlDefault = true;\r\n InputingFile = false;\r\n allowInsertFile = true;\r\n\r\n filesUpload: Array;\r\n filesUploadName = \"\";\r\n myRestrictions: FileRestrictions = {\r\n maxFileSize: 1024 * 1024 * 120\r\n };\r\n\r\n fileName = [];\r\n\r\n public Editor = DecoupledEditor;\r\n config = {\r\n toolbar: ['heading',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'link',\r\n 'bulletedList',\r\n 'numberedList',\r\n '|',\r\n 'indent',\r\n 'outdent',\r\n '|',\r\n 'insertTable',\r\n 'mediaEmbed',\r\n 'undo',\r\n 'redo']\r\n }\r\n SEND_DATA_WHEN_NOTIFY = '';\r\n\r\n public fileSaveUrl: any;\r\n urlDownload = this.appService.apiRoot;\r\n\r\n currentDay = new Date();\r\n\r\n constructor(private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private formBuilder: FormBuilder,\r\n public wsService: WebSocketService\r\n ) {\r\n \r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.language.default();\r\n this.setDefault();\r\n\r\n this.SEND_DATA_WHEN_NOTIFY = appService.domainAPI + \"api/NotifyWs\";\r\n \r\n }\r\n\r\n ngOnInit() {\r\n this.dataMeetingItemTemp = this.meetingdata;\r\n this.getRoomlist();\r\n this.getUnit();\r\n this.onReload();\r\n this.initDisplay();\r\n }\r\n\r\n async initDisplay() {\r\n const result = await this.appService.doGET('api/User/GetListUser', null);\r\n if (result && result.Status === 1) {\r\n this.admins = result.Data;\r\n this.adminsFilter = this.admins.slice();\r\n this.members = result.Data;\r\n this.membersFilter = this.members.slice();\r\n }\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setDefault() {\r\n if(this.dataMeetingItemTemp == undefined || this.dataMeetingItemTemp.SchedulerAddNewDate == undefined){\r\n this.dataMeetingItemTemp = {\r\n viewOnly: false,\r\n IsAdd: true,\r\n Name: '',\r\n Admin: null,\r\n Address: '',\r\n MeetingDate: null,\r\n StartAt: null,\r\n EndAt: null,\r\n ApproveFlg: false,\r\n FileUrl: [],\r\n Description: '',\r\n CentralContent: ''\r\n };\r\n } else {\r\n this.dataMeetingItemTemp = {\r\n viewOnly: false,\r\n IsAdd: true,\r\n Name: '',\r\n Admin: null,\r\n Address: '',\r\n MeetingDate: this.dataMeetingItemTemp.SchedulerAddNewDate,\r\n StartAt: null,\r\n EndAt: null,\r\n ApproveFlg: false,\r\n FileUrl: [],\r\n Description: '',\r\n SchedulerAddNewDate: this.dataMeetingItemTemp.SchedulerAddNewDate,\r\n CentralContent: ''\r\n };\r\n }\r\n \r\n this.filesUpload = [];\r\n this.filesUploadName = \"\";\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n }\r\n\r\n onReload() {\r\n this.bindMemberList();\r\n this.membersFilter = this.members.slice();\r\n }\r\n\r\n bindMemberList() {\r\n this.members = [];\r\n for (let i = 0; i < this.admins.length; i++) {\r\n this.members.push({\r\n UserName: this.admins[i].UserName,\r\n FullName: this.admins[i].FullName\r\n });\r\n }\r\n }\r\n\r\n changeAdmin(e) {\r\n if (e != undefined) {\r\n if (this.dataMeetingItemTemp.MemberList != undefined) {\r\n for(let i = 0; i < e.length; i++){\r\n var isExistedInMember = this.dataMeetingItemTemp.MemberList.findIndex(x => x.UserName == e[i].UserName);\r\n if (isExistedInMember != -1) {\r\n this.dataMeetingItemTemp.MemberList.splice(isExistedInMember, 1);\r\n }\r\n }\r\n }\r\n this.bindMemberList();\r\n for(let i = 0; i < e.length; i++){\r\n if(this.members.findIndex(x => x.UserName == e[i].UserName) != -1){\r\n this.members.splice(this.members.findIndex(x => x.UserName == e[i].UserName), 1);\r\n }\r\n }\r\n this.membersFilter = this.members.slice();\r\n } else {\r\n this.bindMemberList();\r\n this.membersFilter = this.members.slice();\r\n }\r\n }\r\n\r\n \r\n\r\n adminsHandleFilter(value) {\r\n this.adminsFilter = this.admins.filter((s) => s.FullName.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n membersHandleFilter(value) {\r\n this.membersFilter = this.members.filter((s) => s.FullName.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n unitsHandleFilter(value) {\r\n this.unitsFilter = this.units.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n roomsHandleFilter(value) {\r\n this.roomsFilter = this.rooms.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n allmembersHandleFilter(value) {\r\n this.allmembersFilter = this.allmembers.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n async getUserlist() {\r\n const result = await this.appService.doGET('api/Account', null);\r\n if (result && result.Status === 1) {\r\n this.allmembers = result.Data;\r\n this.allmembersFilter = this.allmembers.slice();\r\n }\r\n }\r\n\r\n async getRoomlist() {\r\n const result = await this.appService.doGET('api/RoomMeeting', null);\r\n if (result && result.Status === 1) {\r\n this.rooms = result.Data;\r\n this.roomsFilter = this.rooms.slice();\r\n }\r\n }\r\n\r\n async getUnit() {\r\n const resultRole = await this.appService.doGET('api/Unit/GetListUnitSort', null);\r\n if (resultRole && resultRole.Status === 1) {\r\n this.units = resultRole.Data;\r\n this.unitsFilter = this.units.slice();\r\n }\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return;\r\n }\r\n\r\n\r\n const extension = e.files[0].extension.toLowerCase();\r\n\r\n this.allowInsertFile = true;\r\n\r\n try {\r\n const fileData = e.files[0];\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n if (!this.allowInsertFile) {\r\n return;\r\n }\r\n try {\r\n if(this.dataMeetingItemTemp.FileUrl == undefined){\r\n this.dataMeetingItemTemp.FileUrl = [];\r\n }\r\n this.dataMeetingItemTemp.FileUrl.push(`${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`);\r\n\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n getFileName(fileUrls) {\r\n var nameFile = \"\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n\r\n async onSaveMeeting() {\r\n if (this.dataMeetingItemTemp.IsAdd) { this.addMeeting(); } else { this.updateMeeting(); }\r\n }\r\n\r\n async addMeeting() {\r\n this.appComponent.loading = true;\r\n var members: any[] = [];\r\n if (this.dataMeetingItemTemp.MemberList) {\r\n for (let i = 0; i < this.dataMeetingItemTemp.MemberList.length; i++) {\r\n members.push(this.dataMeetingItemTemp.MemberList[i].UserName);\r\n }\r\n } \r\n const dataRequest = {\r\n Meeting: await this.createDataRequest(null),\r\n TypeRequest: 'web-app'\r\n };\r\n const result = await this.appService.doPOST('api/Meeting/AddMeeting', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.setDefault();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n } \r\n \r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateMeeting() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n var members: any[] = [];\r\n if (this.dataMeetingItemTemp.MemberList) {\r\n for (let i = 0; i < this.dataMeetingItemTemp.MemberList.length; i++) {\r\n members.push(this.dataMeetingItemTemp.MemberList[i].UserName);\r\n }\r\n } \r\n const dataRequest = {\r\n Meeting: await this.createDataRequest(null),\r\n TypeRequest: 'web-app'\r\n };\r\n const id = this.dataMeetingItemTemp.ID;\r\n const result = await this.appService.doPUT('api/Meeting', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.sendWSMessage(dataRequest.Meeting.ID);\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n } \r\n \r\n this.appComponent.loading = false;\r\n }\r\n\r\n async createDataRequest(data) {\r\n const temp = data ? data : this.dataMeetingItemTemp;\r\n var units: any[] = []; \r\n if (this.dataMeetingItemTemp.UnitList) {\r\n for (let i = 0; i < this.dataMeetingItemTemp.UnitList.length; i++) {\r\n units.push(this.dataMeetingItemTemp.UnitList[i].ID);\r\n }\r\n }\r\n var admins: any[] = [];\r\n if (this.dataMeetingItemTemp.Admin) {\r\n for (let i = 0; i < this.dataMeetingItemTemp.Admin.length; i++) {\r\n admins.push(this.dataMeetingItemTemp.Admin[i].UserName);\r\n }\r\n }\r\n var members: any[] = [];\r\n if (this.dataMeetingItemTemp.MemberList) {\r\n for (let i = 0; i < this.dataMeetingItemTemp.MemberList.length; i++) {\r\n members.push(this.dataMeetingItemTemp.MemberList[i].UserName);\r\n }\r\n }\r\n var rooms: any[] = [];\r\n if (this.dataMeetingItemTemp.RoomMeetingList) {\r\n for (let i = 0; i < this.dataMeetingItemTemp.RoomMeetingList.length; i++) {\r\n rooms.push(this.dataMeetingItemTemp.RoomMeetingList[i].ID);\r\n }\r\n }\r\n var files: any[] = [];\r\n if (this.dataMeetingItemTemp.FileUrl) {\r\n for (let i = 0; i < this.dataMeetingItemTemp.FileUrl.length; i++) {\r\n files.push(this.dataMeetingItemTemp.FileUrl[i]);\r\n }\r\n }\r\n\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n Admin: JSON.stringify(admins),\r\n UnitList: JSON.stringify(units),\r\n MeetingDate: temp.MeetingDate ? this.intl.formatDate(new Date(temp.MeetingDate), 'yyyy-MM-ddT00:00:00') : null,\r\n StartAt: temp.StartAt ? this.intl.formatDate(new Date(temp.StartAt), 'yyyy-MM-ddTHH:mm:ss') : null,\r\n EndAt: temp.EndAt ? this.intl.formatDate(new Date(temp.EndAt), 'yyyy-MM-ddTHH:mm:ss') : null,\r\n RoomMeetingList: JSON.stringify(rooms),\r\n MemberList: JSON.stringify(members),\r\n ApproveFlg: temp.ApproveFlg,\r\n ApproveBy: temp.ApproveBy,\r\n ApproveAt: temp.ApproveAt,\r\n DelFlg: temp.DelFlg,\r\n DelAt: temp.DelAt,\r\n DelBy: temp.DelBy,\r\n CreateAt: temp.CreateAt,\r\n CreateBy: temp.CreateBy,\r\n UpdateAt: temp.UpdateAt,\r\n UpdateBy: temp.UpdateBy,\r\n PublicFlg: temp.PublicFlg,\r\n PublicBy: temp.PublicBy,\r\n PublicAt: temp.PublicAt,\r\n Description: temp.Description,\r\n FileUrl: JSON.stringify(files),\r\n CentralContent: temp.CentralContent,\r\n Week: temp.MeetingDate ?this.getWeekNumber(temp.MeetingDate): null\r\n };\r\n }\r\n onRemoveFileToUpload() {\r\n this.dataMeetingItemTemp.FileUrl = [];\r\n this.filesUploadName = '';\r\n this.filesUpload = [];\r\n }\r\n\r\n public valueNormalizerUnit = (text$: Observable) => text$.pipe(map((text: string) => {\r\n //search for matching item to avoid duplicates\r\n if(!text.replace(/\\s/g, '').length){\r\n return\r\n }\r\n //search in values\r\n if(this.dataMeetingItemTemp.UnitList == undefined){\r\n this.dataMeetingItemTemp.UnitList = [];\r\n }\r\n const matchingValue: any = this.dataMeetingItemTemp.UnitList.find((item: any) => {\r\n return item[\"ID\"].toLowerCase() === text.toLowerCase();\r\n });\r\n\r\n if (matchingValue) {\r\n return matchingValue; //return the already selected matching value and the component will remove it\r\n }\r\n\r\n //search in data\r\n const matchingItem: any = this.unitsFilter.find((item: any) => {\r\n return item[\"ID\"].toLowerCase() === text.toLowerCase();\r\n });\r\n\r\n if (matchingItem) {\r\n return matchingItem;\r\n } else {\r\n return {\r\n ID: text, //generate unique value for the custom item\r\n Name: text\r\n };\r\n }\r\n}));\r\n\r\npublic valueNormalizerAdmin = (text$: Observable) => text$.pipe(map((text: string) => {\r\n //search for matching item to avoid duplicates\r\n if(!text.replace(/\\s/g, '').length){\r\n return\r\n }\r\n //search in values\r\n if(this.dataMeetingItemTemp.Admin == undefined){\r\n this.dataMeetingItemTemp.Admin = [];\r\n }\r\n const matchingValue: any = this.dataMeetingItemTemp.Admin.find((item: any) => {\r\n return item[\"UserName\"].toLowerCase() === text.toLowerCase();\r\n });\r\n\r\n if (matchingValue) {\r\n return matchingValue; //return the already selected matching value and the component will remove it\r\n }\r\n\r\n //search in data\r\n const matchingItem: any = this.adminsFilter.find((item: any) => {\r\n return item[\"UserName\"].toLowerCase() === text.toLowerCase();\r\n });\r\n\r\n if (matchingItem) {\r\n return matchingItem;\r\n } else {\r\n return {\r\n UserName: text, //generate unique value for the custom item\r\n FullName: text\r\n };\r\n }\r\n}));\r\n\r\npublic valueNormalizerMember = (text$: Observable) => text$.pipe(map((text: string) => {\r\n //search for matching item to avoid duplicates\r\n if(!text.replace(/\\s/g, '').length){\r\n return\r\n }\r\n //search in values\r\n if(this.dataMeetingItemTemp.MemberList == undefined){\r\n this.dataMeetingItemTemp.MemberList = [];\r\n }\r\n const matchingValue: any = this.dataMeetingItemTemp.MemberList.find((item: any) => {\r\n return item[\"UserName\"].toLowerCase() === text.toLowerCase();\r\n });\r\n\r\n if (matchingValue) {\r\n return matchingValue; //return the already selected matching value and the component will remove it\r\n }\r\n\r\n //search in data\r\n const matchingItem: any = this.membersFilter.find((item: any) => {\r\n return item[\"UserName\"].toLowerCase() === text.toLowerCase();\r\n });\r\n\r\n if (matchingItem) {\r\n return matchingItem;\r\n } else {\r\n return {\r\n UserName: text, //generate unique value for the custom item\r\n FullName: text\r\n };\r\n }\r\n}));\r\n\r\npublic valueNormalizerRoom = (text: Observable) => text.pipe(map((text: string) => {\r\n //search for matching item to avoid duplicates\r\n if(!text.replace(/\\s/g, '').length){\r\n return\r\n }\r\n //search in values\r\n if(this.dataMeetingItemTemp.RoomMeetingList == undefined){\r\n this.dataMeetingItemTemp.RoomMeetingList = [];\r\n }\r\n const matchingValue: any = this.dataMeetingItemTemp.RoomMeetingList.find((item: any) => {\r\n return item[\"ID\"].toLowerCase() === text.toLowerCase();\r\n });\r\n\r\n if (matchingValue) {\r\n return matchingValue; //return the already selected matching value and the component will remove it\r\n }\r\n\r\n //search in data\r\n const matchingItem: any = this.roomsFilter.find((item: any) => {\r\n return item[\"ID\"].toLowerCase() === text.toLowerCase();\r\n });\r\n\r\n if (matchingItem) {\r\n return matchingItem;\r\n } else {\r\n return {\r\n ID: text, //generate unique value for the custom item\r\n Name: text\r\n };\r\n }\r\n}));\r\n\r\nonRemoveFile(file){\r\n var isExistedInFile = this.dataMeetingItemTemp.FileUrl.findIndex(x => x == file);\r\n if (isExistedInFile != -1) {\r\n this.dataMeetingItemTemp.FileUrl.splice(isExistedInFile, 1);\r\n }\r\n}\r\nasync onDownloadFile(file: any) {\r\n\r\n const dataRequest = {\r\n url: file\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, this.getFileName(file));\r\n }\r\n}\r\n\r\nasync sendWSMessage(id){\r\n var dataRequest = {\r\n meetingID: id\r\n }\r\n const result = await this.appService.doGET('api/Meeting/GetAdminMemberList', dataRequest);\r\n if (result && result.Status == 1) {\r\n \r\n this.wsService.sendMessage(result.Data, this.SEND_DATA_WHEN_NOTIFY);\r\n }\r\n}\r\n\r\ngetWeekNumber(date): number {\r\n const today = new Date(date);\r\n const firstDayOfYear = new Date(today.getFullYear(), 0, 1);\r\n const pastDaysOfYear = (today.valueOf() - firstDayOfYear.valueOf()) / 86400000;\r\n return Math.ceil((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7);\r\n}\r\n\r\ngetUrlDownload(item) {\r\n const matchingValueMember: any = this.dataMeetingItemTemp.MemberList.find((item: any) => {\r\n return item[\"UserName\"].toLowerCase() === this.user.UserName.toLowerCase();\r\n }); \r\n\r\n const matchingValueAdmin: any = this.dataMeetingItemTemp.Admin.find((item: any) => {\r\n return item[\"UserName\"].toLowerCase() === this.user.UserName.toLowerCase();\r\n });\r\n if(matchingValueMember || matchingValueAdmin){\r\n let url = this.urlDownload.replace(/\\\"/g, \"\") + item;\r\n url = url.replace(/\\\"/g, '')\r\n window.open(url);\r\n }else {\r\n this.appSwal.showWarning('Bạn không có quyền để xem tài liệu.', false);\r\n }\r\n}\r\n\r\n}\r\n","module.exports = \".xcheckbox {\\r\\n font-size: 24px;\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n.ck-content .text-tiny {\\r\\n font-size: 0.7em;\\r\\n}\\r\\n\\r\\n.ck-content .text-small {\\r\\n font-size: 0.85em;\\r\\n}\\r\\n\\r\\n.ck-content .text-big {\\r\\n font-size: 1.4em;\\r\\n}\\r\\n\\r\\n.ck-content .text-huge {\\r\\n font-size: 1.8em;\\r\\n}\\r\\n\\r\\n.meeting-week-hidden {\\r\\n position: absolute;\\r\\n top: -200%;\\r\\n left: -200%;\\r\\n max-width: 595px;\\r\\n}\\r\\n\\r\\n.hr-style-1 {\\r\\n width: 55%;\\r\\n border-top: 1px solid navy;\\r\\n margin-top: 2px;\\r\\n}\\r\\n\\r\\n.hr-style-2 {\\r\\n width: 34%;\\r\\n border-top: 1px solid navy;\\r\\n margin-top: 2px;\\r\\n}\\r\\n\\r\\n@font-face {\\r\\n font-family: \\\"Times New Roman\\\";\\r\\n src: url('/assets/font/Times\\\\ New\\\\ Roman\\\\ 400.ttf') format(\\\"truetype\\\");\\r\\n}\\r\\n\\r\\n@font-face {\\r\\n font-family: \\\"Times New Roman\\\";\\r\\n font-weight: bold;\\r\\n src: url('/assets/font/Times\\\\ New\\\\ Roman\\\\ Gras\\\\ 700.ttf') format(\\\"truetype\\\");\\r\\n}\\r\\n\\r\\n@font-face {\\r\\n font-family: \\\"Times New Roman\\\";\\r\\n font-style: italic;\\r\\n src: url('/assets/font/Times\\\\ New\\\\ Roman\\\\ Gras\\\\ Italique\\\\ 700.ttf') format(\\\"truetype\\\");\\r\\n}\\r\\n\\r\\n@font-face {\\r\\n font-family: \\\"Times New Roman\\\";\\r\\n font-weight: bold;\\r\\n font-style: italic;\\r\\n src: url('/assets/font/Times\\\\ New\\\\ Roman\\\\ Italique\\\\ 400.ttf') format(\\\"truetype\\\");\\r\\n}\\r\\n\\r\\nkendo-pdf-export {\\r\\n font-family: \\\"Times New Roman\\\", sans-serif;\\r\\n font-size: 12px !important;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.description {\\r\\n font-weight: bold;\\r\\n font-size: 12pt;\\r\\n}\\r\\n\\r\\npre {\\r\\n font-family: \\\"Times New Roman\\\", sans-serif;\\r\\n white-space: pre-wrap;\\r\\n margin-bottom: 0;\\r\\n color: navy;\\r\\n font-size: 12px;\\r\\n padding-left: 15px;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 200px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 200px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 260px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9tZWV0aW5nL21lZXRpbmcuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLGVBQWU7SUFDZixjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVixXQUFXO0lBQ1gsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksVUFBVTtJQUNWLDBCQUEwQjtJQUMxQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksVUFBVTtJQUNWLDBCQUEwQjtJQUMxQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksOEJBQThCO0lBQzlCLHNFQUFzRTtBQUMxRTs7QUFFQTtJQUNJLDhCQUE4QjtJQUM5QixpQkFBaUI7SUFDakIsNEVBQTRFO0FBQ2hGOztBQUVBO0lBQ0ksOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixzRkFBc0Y7QUFDMUY7O0FBRUE7SUFDSSw4QkFBOEI7SUFDOUIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixnRkFBZ0Y7QUFDcEY7O0FBRUE7SUFDSSwwQ0FBMEM7SUFDMUMsMEJBQTBCO0lBQzFCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksMENBQTBDO0lBQzFDLHFCQUFxQjtJQUNyQixnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLGVBQWU7SUFDZixrQkFBa0I7QUFDdEI7O0FBRUEsbUJBQW1COztBQUNuQjtJQUNJLGVBQWU7SUFDZixTQUFTO0lBQ1QsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtBQUNkOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCOztBQUVBO0lBQ0k7UUFDSSxlQUFlO1FBQ2YsU0FBUztRQUNULGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLFVBQVU7SUFDZDs7SUFFQTtRQUNJLGVBQWU7UUFDZixVQUFVO1FBQ1YsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkO0FBQ0o7O0FBRUEsbUJBQW1COztBQUNuQjtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtBQUNqQiIsImZpbGUiOiJzcmMvYXBwL2RhdGEvbWVldGluZy9tZWV0aW5nLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIueGNoZWNrYm94IHtcclxuICAgIGZvbnQtc2l6ZTogMjRweDtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG59XHJcblxyXG4uY2stY29udGVudCAudGV4dC10aW55IHtcclxuICAgIGZvbnQtc2l6ZTogMC43ZW07XHJcbn1cclxuXHJcbi5jay1jb250ZW50IC50ZXh0LXNtYWxsIHtcclxuICAgIGZvbnQtc2l6ZTogMC44NWVtO1xyXG59XHJcblxyXG4uY2stY29udGVudCAudGV4dC1iaWcge1xyXG4gICAgZm9udC1zaXplOiAxLjRlbTtcclxufVxyXG5cclxuLmNrLWNvbnRlbnQgLnRleHQtaHVnZSB7XHJcbiAgICBmb250LXNpemU6IDEuOGVtO1xyXG59XHJcblxyXG4ubWVldGluZy13ZWVrLWhpZGRlbiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IC0yMDAlO1xyXG4gICAgbGVmdDogLTIwMCU7XHJcbiAgICBtYXgtd2lkdGg6IDU5NXB4O1xyXG59XHJcblxyXG4uaHItc3R5bGUtMSB7XHJcbiAgICB3aWR0aDogNTUlO1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIG5hdnk7XHJcbiAgICBtYXJnaW4tdG9wOiAycHg7XHJcbn1cclxuXHJcbi5oci1zdHlsZS0yIHtcclxuICAgIHdpZHRoOiAzNCU7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgbmF2eTtcclxuICAgIG1hcmdpbi10b3A6IDJweDtcclxufVxyXG5cclxuQGZvbnQtZmFjZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIjtcclxuICAgIHNyYzogdXJsKCcvYXNzZXRzL2ZvbnQvVGltZXNcXCBOZXdcXCBSb21hblxcIDQwMC50dGYnKSBmb3JtYXQoXCJ0cnVldHlwZVwiKTtcclxufVxyXG5cclxuQGZvbnQtZmFjZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIjtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgc3JjOiB1cmwoJy9hc3NldHMvZm9udC9UaW1lc1xcIE5ld1xcIFJvbWFuXFwgR3Jhc1xcIDcwMC50dGYnKSBmb3JtYXQoXCJ0cnVldHlwZVwiKTtcclxufVxyXG5cclxuQGZvbnQtZmFjZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIjtcclxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcclxuICAgIHNyYzogdXJsKCcvYXNzZXRzL2ZvbnQvVGltZXNcXCBOZXdcXCBSb21hblxcIEdyYXNcXCBJdGFsaXF1ZVxcIDcwMC50dGYnKSBmb3JtYXQoXCJ0cnVldHlwZVwiKTtcclxufVxyXG5cclxuQGZvbnQtZmFjZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIjtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgc3JjOiB1cmwoJy9hc3NldHMvZm9udC9UaW1lc1xcIE5ld1xcIFJvbWFuXFwgSXRhbGlxdWVcXCA0MDAudHRmJykgZm9ybWF0KFwidHJ1ZXR5cGVcIik7XHJcbn1cclxuXHJcbmtlbmRvLXBkZi1leHBvcnQge1xyXG4gICAgZm9udC1mYW1pbHk6IFwiVGltZXMgTmV3IFJvbWFuXCIsIHNhbnMtc2VyaWY7XHJcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4uZGVzY3JpcHRpb24ge1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBmb250LXNpemU6IDEycHQ7XHJcbn1cclxuXHJcbnByZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIiwgc2Fucy1zZXJpZjtcclxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcclxuICAgIG1hcmdpbi1ib3R0b206IDA7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTVweDtcclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiA3NnB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk4JTtcclxufVxyXG5cclxuLnN0aWNreS10b29sYmFyLWJ0bntcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMjAwcHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTkuNTUlO1xyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY4cHgpIHtcclxuICAgIC5zdGlja3ktZ3JvdXAtc2VhcmNoIHtcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiA3NnB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5NCU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5zdGlja3ktdG9vbGJhci1idG57XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogMjAwcHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk5JTtcclxuICAgIH1cclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuOmhvc3QgOjpuZy1kZWVwIC5zdGlja3ktaGVhZGVyLWdyaWQgLmstZ3JpZCAuay1ncmlkLWhlYWRlciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDI2MHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk3LjU1JTtcclxufSJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Search' | translate}} \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{(dataItem.Name.length > 50) ? (dataItem.Name | slice:0:50) + '...' : dataItem.Name}} \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{(dataItem.ShowAdmin.length > 50) ? (dataItem.ShowAdmin | slice:0:50) + '...' : dataItem.ShowAdmin}} \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{(dataItem.ShowUnit.length > 50) ? (dataItem.ShowUnit | slice:0:50) + '...' : dataItem.ShowUnit}} \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
{{dataItem.CreateBy}}
\\r\\n
{{dataItem.CreateAt | date:'HH:mm'}} \\r\\n
{{dataItem.CreateAt | date:'dd/MM/yyyy'}} \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
{{dataItem.MeetingDayName}}
\\r\\n
{{dataItem.MeetingDate | date:'dd/MM/yyyy'}} \\r\\n
\\r\\n \\r\\n \\r\\n {{'Meeting_Date' | translate}}: \\r\\n {{getDayInWeek(value)}} - {{value | date:'dd/MM/yyyy'}} \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.StartAt | date:'HH:mm'}} \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.EndAt | date:'HH:mm'}} \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n \\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
{{'Weekly_Banner_Left_top' | translate}}
\\r\\n
{{'Weekly_Banner_Left_bottom' | translate}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{'Weekly_Banner_right_top' | translate}}
\\r\\n
{{'Weekly_Banner_right_bottom' | translate}}
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n {{'Weekly_Name_RP' | translate}} {{this.searchOption.Week}} \\r\\n (Từ {{ this.fromDatePrintDraft | date: 'dd/MM/yyyy'}} đến {{ this.toDatePrintDraft | date: 'dd/MM/yyyy'}}) \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
Nội dung trọng tâm:
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n Lịch tuần thay giấy mời đối với nội bộ cơ quan Liên đoàn Lao động Thành phố. \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
{{'Weekly_Banner_Left_top' | translate}}
\\r\\n
{{'Weekly_Banner_Left_bottom' | translate}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{'Weekly_Banner_right_top' | translate}}
\\r\\n
{{'Weekly_Banner_right_bottom' | translate}}
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n {{'Weekly_Name_RP' | translate}} {{this.searchOption.Week}} \\r\\n (Từ {{ this.fromDatePrintDraft | date: 'dd/MM/yyyy'}} đến {{ this.toDatePrintDraft | date: 'dd/MM/yyyy'}}) \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
Nội dung trọng tâm:
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
0\\\" #ngcarousel [showNavigationArrows]=\\\"false\\\" [interval]=\\\"5000\\\" class=\\\"no-indicators\\\" data-interval=\\\"false\\\" [pauseOnHover]=\\\"true\\\" [keyboard]=\\\"true\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n Lịch tuần thay giấy mời đối với nội bộ cơ quan Liên đoàn Lao động Thành phố. \\r\\n
\\r\\n
\\r\\n 1\\\">\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { FormGroup, FormBuilder } from '@angular/forms';\r\nimport * as DecoupledEditor from '@ckeditor/ckeditor5-build-decoupled-document';\r\nimport { t } from '@angular/core/src/render3';\r\nimport { WebSocketService } from 'src/app/websocket.service';\r\nimport { DatePipe } from '@angular/common'\r\nimport { NgbCarousel } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n\r\n@Component({\r\n selector: 'app-meeting',\r\n templateUrl: './meeting.component.html',\r\n styleUrls: ['./meeting.component.css'],\r\n})\r\nexport class MeetingComponent implements OnInit, OnDestroy {\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataMeetings = [];\r\n dataMeetingSelectableSettings: SelectableSettings;\r\n dataMeetingSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n dataMeetingSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n public Editor = DecoupledEditor;\r\n config = {\r\n toolbar: ['heading',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'link',\r\n 'bulletedList',\r\n 'numberedList',\r\n '|',\r\n 'indent',\r\n 'outdent',\r\n '|',\r\n 'insertTable',\r\n 'mediaEmbed',\r\n 'undo',\r\n 'redo']\r\n }\r\n\r\n public fileSaveUrl: any;\r\n\r\n public NUM_PAGING_SKIP = 0;\r\n public NUM_PAGING_TAKE = 50;\r\n public NUM_PAGING_BTN = 5;\r\n\r\n dataMeetingSkip = this.NUM_PAGING_SKIP;\r\n dataMeetingPageSize = this.NUM_PAGING_TAKE;\r\n dataMeetingSelection: number[] = [];\r\n dataMeetingItem: any;\r\n dataMeetingItemTemp: any;\r\n myInterval: any;\r\n pageName: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.NUM_PAGING_BTN;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataMeetingState: State = {\r\n skip: this.dataMeetingSkip,\r\n take: this.dataMeetingSkip + this.dataMeetingPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n // tslint:disable-next-line:comment-format\r\n group: [{ field: 'MeetingDate', dir: 'desc' }]\r\n };\r\n dataMeetingGridDataResult: GridDataResult;\r\n\r\n meetingApproveStatuses: Array<{ Name: string, ID: number }>;\r\n meetingPublicStatuses: Array<{ Name: string, ID: number }>;\r\n\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n currentDay = new Date();\r\n lastestDayOfYear = new Date(new Date().getFullYear(),11,31);\r\n searchOption = {\r\n SearchText: '',\r\n ApproveFlg: -1,\r\n PublicFlg: -1,\r\n FromDate: null,\r\n ToDate: null,\r\n Week: this.getWeekNumber()\r\n };\r\n\r\n \r\n WeekNoFromDB: number;\r\n centralContent = '';\r\n infoCentralContentOpened = false;\r\n SEND_DATA_WHEN_NOTIFY = '';\r\n\r\n previewOpened = false;\r\n\r\n weeks: any;\r\n reviewRpbtn = true;\r\n toDatePrintDraft = new Date();\r\n fromDatePrintDraft = new Date();\r\n\r\n public dataMeetingStateRP: State = {\r\n skip: this.dataMeetingSkip,\r\n take: this.dataMeetingSkip + this.dataMeetingPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n // tslint:disable-next-line:comment-format\r\n };\r\n dataMeetingGridDataResultRP: GridDataResult;\r\n public slideDayOfWeek : Array<{ Ob: any, ID: string, ObGrid: GridDataResult }> = [];\r\n @ViewChild('ngcarousel') ngCarousel: NgbCarousel;\r\n\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private formBuilder: FormBuilder,\r\n public wsService: WebSocketService,\r\n private datePipe: DatePipe\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.getPageName();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.setDefault();\r\n this.initDisplay();\r\n this.onReload();\r\n this.allData = this.allData.bind(this);\r\n this.SEND_DATA_WHEN_NOTIFY = appService.domainAPI + \"api/NotifyWs\";\r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataMeetingSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n async getMeetings() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n ApproveFlg: this.searchOption.ApproveFlg,\r\n PublicFlg: this.searchOption.PublicFlg,\r\n FromDate: this.searchOption.FromDate ? this.intl.formatDate(new Date(this.searchOption.FromDate), 'yyyy-MM-ddT00:00:00') : null,\r\n ToDate: this.searchOption.ToDate ? this.intl.formatDate(new Date(this.searchOption.ToDate), 'yyyy-MM-ddT00:00:00') : null\r\n };\r\n const result = await this.appService.doPOST('api/Meeting/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n const dayOfWeek = [];\r\n for (let i = 0; i < result.Data.length; i++) {\r\n result.Data[i].UnitList = JSON.parse(result.Data[i].UnitString);\r\n for(let j = 0; j < result.Data[i].UnitList.length; j++){\r\n if(result.Data[i].ShowUnit == undefined){\r\n result.Data[i].ShowUnit = \"\";\r\n }\r\n if(j != result.Data[i].UnitList.length - 1){\r\n result.Data[i].ShowUnit = result.Data[i].ShowUnit + \" \" + result.Data[i].UnitList[j].Name + \",\";\r\n } else{\r\n result.Data[i].ShowUnit = result.Data[i].ShowUnit + \" \" + result.Data[i].UnitList[j].Name;\r\n }\r\n }\r\n result.Data[i].Admin = JSON.parse(result.Data[i].AdminString);\r\n for(let k = 0; k < result.Data[i].Admin.length; k++){\r\n if(result.Data[i].ShowAdmin == undefined){\r\n result.Data[i].ShowAdmin = \"\";\r\n }\r\n if(k != result.Data[i].Admin.length - 1){\r\n result.Data[i].ShowAdmin = result.Data[i].ShowAdmin + \" \" + result.Data[i].Admin[k].FullName + \",\";\r\n } else{\r\n result.Data[i].ShowAdmin = result.Data[i].ShowAdmin + \" \" + result.Data[i].Admin[k].FullName;\r\n }\r\n }\r\n result.Data[i].RoomMeetingList = JSON.parse(result.Data[i].RoomMeetingString);\r\n if (result.Data[i].RoomMeetingList){\r\n for(let j = 0; j < result.Data[i].RoomMeetingList.length; j++){\r\n if(result.Data[i].RoomMeetingName == undefined){\r\n result.Data[i].RoomMeetingName = \"\";\r\n }\r\n if(j != result.Data[i].RoomMeetingList.length - 1){\r\n result.Data[i].RoomMeetingName = result.Data[i].RoomMeetingName + \" \" + result.Data[i].RoomMeetingList[j].Name + \",\";\r\n } else{\r\n result.Data[i].RoomMeetingName = result.Data[i].RoomMeetingName + \" \" + result.Data[i].RoomMeetingList[j].Name;\r\n }\r\n }\r\n } \r\n result.Data[i].MemberList = JSON.parse(result.Data[i].MemberString);\r\n for (let j = 0; j < result.Data[i].MemberList.length; j++) {\r\n if (result.Data[i].ShowMembers == undefined) {\r\n result.Data[i].ShowMembers = \"\";\r\n }\r\n if (j != result.Data[i].MemberList.length - 1) {\r\n result.Data[i].ShowMembers = result.Data[i].ShowMembers + \" \" + result.Data[i].MemberList[j].FullName + \",\";\r\n } else {\r\n result.Data[i].ShowMembers = result.Data[i].ShowMembers + \" \" + result.Data[i].MemberList[j].FullName;\r\n }\r\n }\r\n if(result.Data[i].FileUrl == null || result.Data[i].FileUrl == \"\"){\r\n result.Data[i].FileUrl = [];\r\n }\r\n else{\r\n result.Data[i].FileUrl = JSON.parse(result.Data[i].FileUrl);\r\n }\r\n result.Data[i].MeetingDayName = this.getDayInWeek(result.Data[i].MeetingDate);\r\n result.Data[i].DayName = this.getDayInWeek(result.Data[i].StartAt);\r\n result.Data[i].DayHour = this.getHour(result.Data[i].StartAt);\r\n result.Data[i].StartAtRp = result.Data[i].StartAt;\r\n if (dayOfWeek.find(dayItem => {\r\n return dayItem === result.Data[i].DayName;\r\n })) {\r\n result.Data[i].DayName = '';\r\n result.Data[i].StartAtRp = null;\r\n } else {\r\n dayOfWeek.push(result.Data[i].DayName);\r\n }\r\n }\r\n this.dataMeetings = result.Data;\r\n this.bindMeetings();\r\n }\r\n\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataMeetingSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataMeetings.find((item) => {\r\n return item.ID === this.dataMeetingSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataMeetingSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n onCloseInfo(e) {\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n this.infoCentralContentOpened = false;\r\n }\r\n\r\n setDefault() {\r\n this.dataMeetingItem = {\r\n viewOnly: false,\r\n IsAdd: true,\r\n Name: '',\r\n Admin: null,\r\n Address: '',\r\n MeetingDate: null,\r\n StartAt: null,\r\n EndAt: null,\r\n ApproveFlg: false,\r\n FileUrl: [],\r\n Description: ''\r\n };\r\n this.dataMeetingItemTemp = Object.assign({}, this.dataMeetingItem);\r\n this.dataMeetingSelection = [];\r\n this.allowMulti = false;\r\n }\r\n\r\n onMeetingPageChange(event: PageChangeEvent) {\r\n this.dataMeetingSkip = event.skip;\r\n this.bindMeetings();\r\n }\r\n\r\n async onMeetingselectedKeysChange() {\r\n if (this.dataMeetingSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataMeetingSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataMeetingSelection[0];\r\n const selectedItem = this.dataMeetings.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n selectedItem.viewOnly = false;\r\n selectedItem.MeetingDate = selectedItem.MeetingDate ? new Date(selectedItem.MeetingDate) : null;\r\n selectedItem.StartAt = selectedItem.StartAt ? new Date(selectedItem.StartAt) : null;\r\n selectedItem.EndAt = selectedItem.EndAt ? new Date(selectedItem.EndAt) : null;\r\n this.dataMeetingItem = selectedItem;\r\n this.bindTemp(this.dataMeetingItem);\r\n }\r\n }\r\n\r\n bindMeetings() {\r\n this.dataMeetingGridDataResult = {\r\n data: orderBy(this.dataMeetings, this.dataMeetingSortByField),\r\n total: this.dataMeetings.length\r\n };\r\n\r\n this.dataMeetingGridDataResult = process(this.dataMeetings, this.dataMeetingState);\r\n this.dataMeetingGridDataResultRP = process(this.dataMeetings, this.dataMeetingStateRP);\r\n }\r\n\r\n onMeetingsortChange(sort: SortDescriptor[]): void {\r\n this.dataMeetingSortByField = sort;\r\n this.bindMeetings();\r\n }\r\n\r\n public onMeetingDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataMeetingSelection = [];\r\n this.dataMeetingState = state;\r\n this.dataMeetingStateRP = state;\r\n this.dataMeetingGridDataResult = process(this.dataMeetings, this.dataMeetingState);\r\n this.dataMeetingGridDataResultRP = process(this.dataMeetings, this.dataMeetingStateRP);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n }\r\n\r\n async initDisplay() {\r\n\r\n this.meetingApproveStatuses = [\r\n { Name: 'Tất cả', ID: -1 },\r\n { Name: 'Chưa duyệt', ID: 0 },\r\n { Name: 'Đã duyệt', ID: 1 },\r\n ];\r\n\r\n this.meetingPublicStatuses = [\r\n { Name: 'Tất cả', ID: -1 },\r\n { Name: 'Chưa công bố', ID: 0 },\r\n { Name: 'Đã công bố', ID: 1 },\r\n ];\r\n\r\n this.weeks = [];\r\n for (let i = 1; i <= 52; i++) {\r\n this.weeks.push({\r\n ID: i,\r\n Name: i\r\n });\r\n }\r\n }\r\n\r\n onSearch() {\r\n \r\n this.getMeetings();\r\n this.isEnabledSaveAll = false;\r\n this.reviewRpbtn = false;\r\n }\r\n\r\n onReload() {\r\n // this.getMeetings();\r\n this.getMeetingByWeek();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n this.dataMeetingItem = {\r\n IsAdd: true,\r\n viewOnly: false,\r\n Name: '',\r\n Admin: null,\r\n Address: '',\r\n MeetingDate: null,\r\n StartAt: null,\r\n EndAt: null,\r\n ApproveFlg: false\r\n };\r\n this.dataMeetingItemTemp = {\r\n IsAdd: true,\r\n viewOnly: false,\r\n Name: '',\r\n Admin: null,\r\n Address: '',\r\n MeetingDate: null,\r\n StartAt: null,\r\n EndAt: null,\r\n ApproveFlg: false\r\n };\r\n\r\n this.dataMeetingSelection = [];\r\n }\r\n\r\n onAddNewMeeting() {\r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n async onSaveMeetings() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataMeetings.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataMeetings[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Meeting/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n bindTemp(data) {\r\n this.dataMeetingItemTemp = Object.assign({}, data);\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataMeetingItemTemp;\r\n\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n Admin: temp.Admin,\r\n UnitID: temp.UnitID,\r\n MeetingDate: temp.MeetingDate ? this.intl.formatDate(new Date(temp.MeetingDate), 'yyyy-MM-ddT00:00:00') : null,\r\n StartAt: temp.StartAt ? this.intl.formatDate(new Date(temp.StartAt), 'yyyy-MM-ddTHH:mm:ss') : null,\r\n EndAt: temp.EndAt ? this.intl.formatDate(new Date(temp.EndAt), 'yyyy-MM-ddTHH:mm:ss') : null,\r\n RoomMeetingID: temp.RoomMeetingID,\r\n RoomOther: temp.RoomOther,\r\n ApproveFlg: temp.ApproveFlg,\r\n ApproveBy: temp.ApproveBy,\r\n ApproveAt: temp.ApproveAt,\r\n DelFlg: temp.DelFlg,\r\n DelAt: temp.DelAt,\r\n DelBy: temp.DelBy,\r\n CreateAt: temp.CreateAt,\r\n CreateBy: temp.CreateBy,\r\n UpdateAt: temp.UpdateAt,\r\n UpdateBy: temp.UpdateBy,\r\n PublicFlg: temp.PublicFlg,\r\n PublicBy: temp.PublicBy,\r\n PublicAt: temp.PublicAt,\r\n Description: temp.Description,\r\n FileUrl: temp.FileUrl,\r\n };\r\n } \r\n\r\n async onEditMeeting() {\r\n if(this.dataMeetingItem.ApproveFlg == true && this.dataMeetingItem.PublicFlg != true){\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorEditMeeting'), false);\r\n return;\r\n }\r\n this.infoOpened = true;\r\n }\r\n\r\n async onDeleteMeeting() {\r\n if (this.dataMeetingSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataMeetingSelection),\r\n FlgRevert: false\r\n }; \r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Meeting/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n } \r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onApproved() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataMeetingItem.ID;\r\n\r\n const result = await this.appService.doGET('api/Meeting/Approved', { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onUnApproved() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataMeetingItem.ID;\r\n\r\n const result = await this.appService.doGET('api/Meeting/UnApproved', { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onPublic() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataMeetingItem.ID;\r\n\r\n const result = await this.appService.doGET('api/Meeting/Public', { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.sendWSMessage(id);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onUnPublic() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataMeetingItem.ID;\r\n\r\n const result = await this.appService.doGET('api/Meeting/UnPublic', { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.sendWSMessage(id);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDelFlg() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataMeetingItem.ID;\r\n\r\n const result = await this.appService.doGET('api/Meeting/DeleteFlag', { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.sendWSMessage(id);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // async onUnDelFlg() {\r\n // this.appComponent.loading = true;\r\n // // tslint:disable-next-line: max-line-length\r\n // const id = this.dataMeetingItem.ID;\r\n\r\n // const result = await this.appService.doGET('api/Meeting/UnDeleteFlag', { id });\r\n // if (result && result.Status === 1) {\r\n // this.notification.showSuccess(result.Msg);\r\n // this.onReload();\r\n // this.setDefault();\r\n // this.infoOpened = false;\r\n // } else {\r\n // this.appSwal.showWarning(result.Msg, false);\r\n // }\r\n // this.appComponent.loading = false;\r\n // }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataMeetings, {}).data\r\n };\r\n return result;\r\n }\r\n\r\n getWeekNumber(): number {\r\n const today = new Date();\r\n const firstDayOfYear = new Date(today.getFullYear(), 0, 1);\r\n const pastDaysOfYear = (today.valueOf() - firstDayOfYear.valueOf()) / 86400000;\r\n return Math.ceil((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7);\r\n }\r\n\r\n async sendWSMessage(id){\r\n var dataRequest = {\r\n meetingID: id\r\n }\r\n const result = await this.appService.doGET('api/Meeting/GetAdminMemberList', dataRequest);\r\n if (result && result.Status == 1) {\r\n this.wsService.sendMessage(result.Data, this.SEND_DATA_WHEN_NOTIFY);\r\n }\r\n \r\n }\r\n\r\n onExportPdf(pdf: any) {\r\n \r\n pdf.saveAs('Lich cong tac tuan.pdf');\r\n }\r\n\r\n getHour(date) {\r\n var current_day = new Date(date);\r\n\r\n return ((current_day.getHours() < 10) ? \"0\" : \"\") + current_day.getHours() + \":\" + ((current_day.getMinutes() < 10) ? \"0\" : \"\") + current_day.getMinutes()\r\n }\r\n\r\n getDayInWeek(date) {\r\n var current_day = new Date(date);\r\n var day_name = '';\r\n switch (current_day.getDay()) {\r\n case 0:\r\n day_name = \"Chủ nhật\";\r\n break;\r\n case 1:\r\n day_name = \"Thứ hai\";\r\n break;\r\n case 2:\r\n day_name = \"Thứ ba\";\r\n break;\r\n case 3:\r\n day_name = \"Thứ tư\";\r\n break;\r\n case 4:\r\n day_name = \"Thứ năm\";\r\n break;\r\n case 5:\r\n day_name = \"Thứ sáu\";\r\n break;\r\n case 6:\r\n day_name = \"Thứ bảy\";\r\n }\r\n return day_name\r\n }\r\n\r\n onReviewDialog(){\r\n this.previewOpened = true;\r\n }\r\n\r\n onClosePreview(e) {\r\n this.previewOpened = false;\r\n }\r\n\r\n valueChangeWeekFilter(e){\r\n this.searchOption.SearchText = '';\r\n this.searchOption.FromDate = null;\r\n this.searchOption.ToDate = null;\r\n this.getMeetingByWeek();\r\n }\r\n\r\n async getMeetingByWeek(){\r\n this.loading = true;\r\n const dataRequest = {\r\n ApproveFlg: this.searchOption.ApproveFlg,\r\n PublicFlg: this.searchOption.PublicFlg,\r\n Week: this.searchOption.Week\r\n };\r\n const result = await this.appService.doPOST('api/Meeting/SearchByWeek', dataRequest);\r\n if (result && result.Status === 1) {\r\n const dayOfWeek = [];\r\n this.slideDayOfWeek = [];\r\n let idxDayofWeek = \"\";\r\n for (let i = 0; i < result.Data.length; i++) {\r\n result.Data[i].UnitList = JSON.parse(result.Data[i].UnitString);\r\n for(let j = 0; j < result.Data[i].UnitList.length; j++){\r\n if(result.Data[i].ShowUnit == undefined){\r\n result.Data[i].ShowUnit = \"\";\r\n }\r\n if(j != result.Data[i].UnitList.length - 1){\r\n result.Data[i].ShowUnit = result.Data[i].ShowUnit + \" \" + result.Data[i].UnitList[j].Name + \",\";\r\n } else{\r\n result.Data[i].ShowUnit = result.Data[i].ShowUnit + \" \" + result.Data[i].UnitList[j].Name;\r\n }\r\n }\r\n result.Data[i].Admin = JSON.parse(result.Data[i].AdminString);\r\n for(let k = 0; k < result.Data[i].Admin.length; k++){\r\n if(result.Data[i].ShowAdmin == undefined){\r\n result.Data[i].ShowAdmin = \"\";\r\n }\r\n if(k != result.Data[i].Admin.length - 1){\r\n result.Data[i].ShowAdmin = result.Data[i].ShowAdmin + \" \" + result.Data[i].Admin[k].FullName + \",\";\r\n } else{\r\n result.Data[i].ShowAdmin = result.Data[i].ShowAdmin + \" \" + result.Data[i].Admin[k].FullName;\r\n }\r\n }\r\n result.Data[i].RoomMeetingList = JSON.parse(result.Data[i].RoomMeetingString);\r\n if (result.Data[i].RoomMeetingList){\r\n for(let j = 0; j < result.Data[i].RoomMeetingList.length; j++){\r\n if(result.Data[i].RoomMeetingName == undefined){\r\n result.Data[i].RoomMeetingName = \"\";\r\n }\r\n if(j != result.Data[i].RoomMeetingList.length - 1){\r\n result.Data[i].RoomMeetingName = result.Data[i].RoomMeetingName + \" \" + result.Data[i].RoomMeetingList[j].Name + \",\";\r\n } else{\r\n result.Data[i].RoomMeetingName = result.Data[i].RoomMeetingName + \" \" + result.Data[i].RoomMeetingList[j].Name;\r\n }\r\n }\r\n } \r\n result.Data[i].MemberList = JSON.parse(result.Data[i].MemberString);\r\n for (let j = 0; j < result.Data[i].MemberList.length; j++) {\r\n if (result.Data[i].ShowMembers == undefined) {\r\n result.Data[i].ShowMembers = \"\";\r\n }\r\n if (j != result.Data[i].MemberList.length - 1) {\r\n result.Data[i].ShowMembers = result.Data[i].ShowMembers + \" \" + result.Data[i].MemberList[j].FullName + \",\";\r\n } else {\r\n result.Data[i].ShowMembers = result.Data[i].ShowMembers + \" \" + result.Data[i].MemberList[j].FullName;\r\n }\r\n }\r\n if(result.Data[i].FileUrl == null || result.Data[i].FileUrl == \"\"){\r\n result.Data[i].FileUrl = [];\r\n }\r\n else{\r\n result.Data[i].FileUrl = JSON.parse(result.Data[i].FileUrl);\r\n }\r\n result.Data[i].MeetingDayName = this.getDayInWeek(result.Data[i].MeetingDate);\r\n result.Data[i].DayName = this.getDayInWeek(result.Data[i].StartAt);\r\n result.Data[i].DayHour = this.getHour(result.Data[i].StartAt);\r\n result.Data[i].StartAtRp = result.Data[i].StartAt;\r\n\r\n if (idxDayofWeek != result.Data[i].DayName){\r\n idxDayofWeek = result.Data[i].DayName; \r\n this.slideDayOfWeek.push({\r\n ID: idxDayofWeek,\r\n Ob: [result.Data[i]],\r\n ObGrid: null\r\n })\r\n }else {\r\n if(this.slideDayOfWeek.length > 0){\r\n this.slideDayOfWeek[this.slideDayOfWeek.indexOf(this.slideDayOfWeek.find(r=> r.ID == idxDayofWeek))].Ob.push(result.Data[i])\r\n } \r\n }\r\n\r\n if (dayOfWeek.find(dayItem => {\r\n return dayItem === result.Data[i].DayName;\r\n })) {\r\n result.Data[i].DayName = '';\r\n result.Data[i].StartAtRp = null;\r\n } else {\r\n dayOfWeek.push(result.Data[i].DayName);\r\n }\r\n this.fromDatePrintDraft = new Date(result.Data[0].MeetingDate);\r\n }\r\n this.dataMeetings = result.Data;\r\n\r\n this.slideDayOfWeek.forEach(r => {\r\n r.ObGrid = {\r\n data: orderBy(r.Ob, this.dataMeetingSortByField),\r\n total: r.Ob.length\r\n }; \r\n r.ObGrid = process(r.Ob, this.dataMeetingStateRP);\r\n });\r\n this.bindMeetings();\r\n }\r\n const day = this.fromDatePrintDraft.getDay();\r\n this.fromDatePrintDraft = new Date(this.fromDatePrintDraft.setDate(this.fromDatePrintDraft.getDate() - day + (day == 0 ? -6:1)));\r\n const fromDate = new Date(this.fromDatePrintDraft);\r\n if(this.fromDatePrintDraft){ \r\n this.toDatePrintDraft = new Date(fromDate.setDate(fromDate.getDate() + 6));\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n this.reviewRpbtn = true;\r\n }\r\n\r\n // Move to previous slide\r\n getToPrev() {\r\n this.ngCarousel.prev();\r\n }\r\n\r\n // Move to next slide\r\n goToNext() {\r\n this.ngCarousel.next();\r\n }\r\n\r\n // Pause slide\r\n stopCarousel() {\r\n this.ngCarousel.pause();\r\n }\r\n}\r\n\r\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2RhdGEvb2ZmaWNlLWRydC9vZmZpY2UtZHJ0LmNvbXBvbmVudC5jc3MifQ== */\"","module.exports = \" \"","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-office-drt',\r\n templateUrl: './office-drt.component.html',\r\n styleUrls: ['./office-drt.component.css']\r\n})\r\nexport class OfficeDrtComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","module.exports = \".bra-name {\\r\\n color: blue;\\r\\n}\\r\\n\\r\\n[_nghost-c0] .k-panelbar>.k-item>.k-link.k-state-selected {\\r\\n background-color: #7c9bb7 !important;\\r\\n}\\r\\n\\r\\n.banner-element,\\r\\n.video-element {\\r\\n display: inline-block;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n.banner-element {\\r\\n width: 100%;\\r\\n height: 156px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.banner-element img {\\r\\n width: 100%;\\r\\n height: 156px;\\r\\n}\\r\\n\\r\\n.video-element {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.video-element img {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n}\\r\\n\\r\\n.image-element {\\r\\n width: 210px;\\r\\n height: 140px;\\r\\n padding: 0;\\r\\n margin-left: 17px;\\r\\n margin-right: 17px;\\r\\n}\\r\\n\\r\\n.image-element img {\\r\\n width: 100px;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\n.custom-list {\\r\\n width: 40%;\\r\\n display: contents;\\r\\n}\\r\\n\\r\\n.custom-list-status {\\r\\n width: 50%;\\r\\n display: contents;\\r\\n}\\r\\n\\r\\n.custom-list-status input {\\r\\n margin-top: 4px;\\r\\n}\\r\\n\\r\\n.custom-list-child {\\r\\n display: block;\\r\\n margin-left: 20px;\\r\\n}\\r\\n\\r\\n.element-search {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.element-search {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.image-upload-cus {\\r\\n display: contents;\\r\\n width: 100%;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\nagm-map {\\r\\n height: 506px;\\r\\n}\\r\\n\\r\\n.file-uploaded {\\r\\n color: #006CB7 !important;\\r\\n width: 182px;\\r\\n float: right;\\r\\n margin-top: 36px;\\r\\n}\\r\\n\\r\\n.group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 14px;\\r\\n font-size: 20px;\\r\\n color: #006CB7;\\r\\n font-weight: 500;\\r\\n background-color: #f5f5f5;\\r\\n /* text-transform: capitalize; */\\r\\n}\\r\\n\\r\\n/* file upload */\\r\\n\\r\\n.xbutton {\\r\\n background-color: red;\\r\\n color: white;\\r\\n background: red;\\r\\n width: 100%;\\r\\n font-size: 25px !important;\\r\\n}\\r\\n\\r\\n.xdiv {\\r\\n border: 0.1px solid rgb(184, 184, 184);\\r\\n background-color: white;\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.xdivcol11 {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.xdivcol1 {\\r\\n padding-left: 0px;\\r\\n padding-right: 0px;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 580px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n :host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed !important;\\r\\n top: 640px !important;\\r\\n display: block !important;\\r\\n height: auto !important;\\r\\n z-index: 1 !important;\\r\\n width: 97% !important;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:1250px) { \\r\\n \\r\\n .sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 280px !important;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n }\\r\\n\\r\\n :host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 340px !important;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 264px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 324px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n\\r\\n\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9vZmZpY2Uvb2ZmaWNlLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxvQ0FBb0M7QUFDeEM7O0FBRUE7O0lBRUkscUJBQXFCO0lBQ3JCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0lBQ2IsVUFBVTtBQUNkOztBQUVBO0lBQ0ksV0FBVztJQUNYLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLFVBQVU7QUFDZDs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGFBQWE7SUFDYixVQUFVO0lBQ1YsaUJBQWlCO0lBQ2pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLFlBQVk7SUFDWixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksVUFBVTtJQUNWLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLFVBQVU7SUFDVixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksY0FBYztJQUNkLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsV0FBVztJQUNYLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxhQUFhO0FBQ2pCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWixZQUFZO0lBQ1osZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQiw4QkFBOEI7SUFDOUIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLHlCQUF5QjtJQUN6QixnQ0FBZ0M7QUFDcEM7O0FBR0EsZ0JBQWdCOztBQUVoQjtJQUNJLHFCQUFxQjtJQUNyQixZQUFZO0lBQ1osZUFBZTtJQUNmLFdBQVc7SUFDWCwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxzQ0FBc0M7SUFDdEMsdUJBQXVCO0lBQ3ZCLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGtCQUFrQjtBQUN0Qjs7QUFFQSxtQkFBbUI7O0FBQ25CO0lBQ0ksZUFBZTtJQUNmLFNBQVM7SUFDVCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixVQUFVO0FBQ2Q7O0FBR0E7SUFDSTtRQUNJLGVBQWU7UUFDZixTQUFTO1FBQ1QsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkOztJQUVBO1FBQ0ksZUFBZTtRQUNmLFVBQVU7UUFDVixjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixVQUFVO0lBQ2Q7SUFDQTtRQUNJLDBCQUEwQjtRQUMxQixxQkFBcUI7UUFDckIseUJBQXlCO1FBQ3pCLHVCQUF1QjtRQUN2QixxQkFBcUI7UUFDckIscUJBQXFCO0lBQ3pCO0FBQ0o7O0FBRUE7O0lBRUk7UUFDSSxlQUFlO1FBQ2YscUJBQXFCO1FBQ3JCLGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLGFBQWE7SUFDakI7O0lBRUE7UUFDSSxlQUFlO1FBQ2YscUJBQXFCO1FBQ3JCLGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLGFBQWE7SUFDakI7QUFDSjs7QUFFQSxtQkFBbUI7O0FBRW5CO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCIiwiZmlsZSI6InNyYy9hcHAvZGF0YS9vZmZpY2Uvb2ZmaWNlLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuYnJhLW5hbWUge1xyXG4gICAgY29sb3I6IGJsdWU7XHJcbn1cclxuXHJcbltfbmdob3N0LWMwXSAuay1wYW5lbGJhcj4uay1pdGVtPi5rLWxpbmsuay1zdGF0ZS1zZWxlY3RlZCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2M5YmI3ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5iYW5uZXItZWxlbWVudCxcclxuLnZpZGVvLWVsZW1lbnQge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcclxufVxyXG5cclxuLmJhbm5lci1lbGVtZW50IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxNTZweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi5iYW5uZXItZWxlbWVudCBpbWcge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDE1NnB4O1xyXG59XHJcblxyXG4udmlkZW8tZWxlbWVudCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMjA2cHg7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG59XHJcblxyXG4udmlkZW8tZWxlbWVudCBpbWcge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDIwNnB4O1xyXG59XHJcblxyXG4uaW1hZ2UtZWxlbWVudCB7XHJcbiAgICB3aWR0aDogMjEwcHg7XHJcbiAgICBoZWlnaHQ6IDE0MHB4O1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG1hcmdpbi1sZWZ0OiAxN3B4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAxN3B4O1xyXG59XHJcblxyXG4uaW1hZ2UtZWxlbWVudCBpbWcge1xyXG4gICAgd2lkdGg6IDEwMHB4O1xyXG4gICAgaGVpZ2h0OiAxMDBweDtcclxufVxyXG5cclxuLmN1c3RvbS1saXN0IHtcclxuICAgIHdpZHRoOiA0MCU7XHJcbiAgICBkaXNwbGF5OiBjb250ZW50cztcclxufVxyXG5cclxuLmN1c3RvbS1saXN0LXN0YXR1cyB7XHJcbiAgICB3aWR0aDogNTAlO1xyXG4gICAgZGlzcGxheTogY29udGVudHM7XHJcbn1cclxuXHJcbi5jdXN0b20tbGlzdC1zdGF0dXMgaW5wdXQge1xyXG4gICAgbWFyZ2luLXRvcDogNHB4O1xyXG59XHJcblxyXG4uY3VzdG9tLWxpc3QtY2hpbGQge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBtYXJnaW4tbGVmdDogMjBweDtcclxufVxyXG5cclxuLmVsZW1lbnQtc2VhcmNoIHtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG59XHJcblxyXG4uZWxlbWVudC1zZWFyY2gge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5pbWFnZS11cGxvYWQtY3VzIHtcclxuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMHB4O1xyXG59XHJcblxyXG5hZ20tbWFwIHtcclxuICAgIGhlaWdodDogNTA2cHg7XHJcbn1cclxuXHJcbi5maWxlLXVwbG9hZGVkIHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3ICFpbXBvcnRhbnQ7XHJcbiAgICB3aWR0aDogMTgycHg7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICBtYXJnaW4tdG9wOiAzNnB4O1xyXG59XHJcblxyXG4uZ3JvdXAtaGVhZGVyIHtcclxuICAgIHBhZGRpbmctdG9wOiAxM3B4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEzcHg7XHJcbiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDZDQjc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDE0cHg7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xyXG4gICAgLyogdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7ICovXHJcbn1cclxuXHJcblxyXG4vKiBmaWxlIHVwbG9hZCAqL1xyXG5cclxuLnhidXR0b24ge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgYmFja2dyb3VuZDogcmVkO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBmb250LXNpemU6IDI1cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLnhkaXYge1xyXG4gICAgYm9yZGVyOiAwLjFweCBzb2xpZCByZ2IoMTg0LCAxODQsIDE4NCk7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICAgIG1hcmdpbi10b3A6IDBweDtcclxufVxyXG5cclxuLnhkaXZjb2wxMSB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxufVxyXG5cclxuLnhkaXZjb2wxIHtcclxuICAgIHBhZGRpbmctbGVmdDogMHB4O1xyXG4gICAgcGFkZGluZy1yaWdodDogMHB4O1xyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqL1xyXG4uc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDc2cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTglO1xyXG59XHJcblxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2OHB4KSB7XHJcbiAgICAuc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogNzZweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTQlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAuc3RpY2t5LXRvb2xiYXItYnRue1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDU4MHB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5OSU7XHJcbiAgICB9XHJcbiAgICA6aG9zdCA6Om5nLWRlZXAgLnN0aWNreS1oZWFkZXItZ3JpZCAuay1ncmlkIC5rLWdyaWQtaGVhZGVyIHtcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQgIWltcG9ydGFudDtcclxuICAgICAgICB0b3A6IDY0MHB4ICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcclxuICAgICAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcclxuICAgICAgICB6LWluZGV4OiAxICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgd2lkdGg6IDk3JSAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6MTI1MHB4KSB7ICAgIFxyXG4gICAgXHJcbiAgICAuc3RpY2t5LXRvb2xiYXItYnRue1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDI4MHB4ICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk5LjU1JTtcclxuICAgIH1cclxuXHJcbiAgICA6aG9zdCA6Om5nLWRlZXAgLnN0aWNreS1oZWFkZXItZ3JpZCAuay1ncmlkIC5rLWdyaWQtaGVhZGVyIHtcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiAzNDBweCAhaW1wb3J0YW50O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5Ny41NSU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qIHN0aWNreSB0b29sYmFyICovXHJcblxyXG4uc3RpY2t5LXRvb2xiYXItYnRue1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAyNjRweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OS41NSU7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuc3RpY2t5LWhlYWRlci1ncmlkIC5rLWdyaWQgLmstZ3JpZC1oZWFkZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAzMjRweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5Ny41NSU7XHJcbn1cclxuXHJcbiJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n :\\r\\n Từ ngày \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n Đến ngày \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.PublishAt | date: 'dd/MM/yyyy'}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{i+1}}. {{ getFileName(file) }} \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, Input, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { t } from '@angular/core/src/render3';\r\n\r\n@Component({\r\n selector: 'app-office',\r\n templateUrl: './office.component.html',\r\n styleUrls: ['./office.component.css']\r\n})\r\nexport class OfficeComponent implements OnInit, OnDestroy {\r\n\r\n\r\n\r\n @Input() officeDrt = 0;\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 260;\r\n }\r\n\r\n //codeimage\r\n commentInput = null;\r\n\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n dataOffices = [];\r\n dataOfficeSelectableSettings: SelectableSettings;\r\n dataOfficeSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataOfficeFocus = {\r\n Name: true\r\n };\r\n dataOfficeSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 20;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataOfficeSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataOfficePageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataOfficeSelection: number[] = [];\r\n dataOfficeItem: any;\r\n myInterval: any;\r\n pageName: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataOfficeState: State = {\r\n skip: this.dataOfficeSkip,\r\n take: this.dataOfficeSkip + this.dataOfficePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n dataOfficeGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n officeTypes: Array<{ Name: string, ID: string, ParentName: string }>;\r\n officeTypesFilter: Array<{ Name: string, ID: string, ParentName: string}>;\r\n officeTypesSearch: Array<{ Name: string, ID: string, ParentName: string }>;\r\n\r\n accountTypes: Array<{ Name: string, ID: string, ParentName: string }>;\r\n accountTypesFilter: Array<{ Name: string, ID: string, ParentName: string }>;\r\n accountTypesSearch: Array<{ Name: string, ID: string, ParentName: string }>;\r\n\r\n publishTypes: Array<{ Name: string, ID: string }>;\r\n publishTypesFilter: Array<{ Name: string, ID: string }>;\r\n publishTypesSearch: Array<{ Name: string, ID: string }>;\r\n\r\n fieldTypes: Array<{ Name: string, ID: string }>;\r\n fieldTypesFilter: Array<{ Name: string, ID: string }>;\r\n fieldTypesSearch: Array<{ Name: string, ID: string }>;\r\n\r\n filesUpload: Array;\r\n filesUploadName = \"\";\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n types: Array<{ Name: string, ID: number }>;\r\n priorities: Array<{ Name: string, ID: number }>;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n allowInsertFile = true;\r\n\r\n currentDate = new Date();\r\n currentMonth = this.currentDate.getMonth();\r\n currentYear = this.currentDate.getFullYear();\r\n\r\n searchOption = {\r\n SearchText: '',\r\n OfficeTypeID: null,\r\n PublishTypeID: null,\r\n CategoryTypeID: null,\r\n FieldTypeID: null,\r\n FromDate: null,\r\n ToDate: null,\r\n Type: 0\r\n };\r\n\r\n public min: Date = new Date(1900, 0, 1);\r\n public max: Date = new Date();\r\n\r\n myRestrictions: FileRestrictions = {\r\n maxFileSize: 1024 * 1024 * 120\r\n };\r\n\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n \r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n ngOnInit() {\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataOfficeSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onOfficeTypeHandleFilter(value) {\r\n this.officeTypesFilter = this.officeTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onOfficeTypeSearchHandleFilter(value) {\r\n this.officeTypesSearch = this.officeTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onPublishTypeHandleFilter(value) {\r\n this.publishTypesFilter = this.publishTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onPublishTypeSearchHandleFilter(value) {\r\n this.publishTypesSearch = this.publishTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onAccountTypeHandleFilter(value) {\r\n this.accountTypesFilter = this.accountTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onAccountTypeSearchHandleFilter(value) {\r\n this.accountTypesSearch = this.accountTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onFieldTypeHandleFilter(value) {\r\n this.fieldTypesFilter = this.fieldTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onFieldTypeSearchHandleFilter(value) {\r\n this.fieldTypesSearch = this.fieldTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onTypeSearchHandleFilter(value) {\r\n this.onReload();\r\n }\r\n\r\n\r\n onSearchKeyPress(e: any) {\r\n // if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n // this.onSearch();\r\n // }\r\n }\r\n\r\n async getOffices() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n OfficeTypeID: this.searchOption.OfficeTypeID,\r\n PublishTypeID: this.searchOption.PublishTypeID,\r\n CategoryTypeID: this.searchOption.CategoryTypeID,\r\n FieldTypeID: this.searchOption.FieldTypeID,\r\n FromDate: this.searchOption.FromDate ? this.intl.formatDate(new Date(this.searchOption.FromDate), 'yyyy-MM-ddT00:00:00') : null,\r\n ToDate: this.searchOption.ToDate ? this.intl.formatDate(new Date(this.searchOption.ToDate), 'yyyy-MM-ddT00:00:00') : null,\r\n Type: this.searchOption.Type\r\n };\r\n\r\n const result = await this.appService.doPOST('api/Office/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n for(let k = 0; k < result.Data.length; k++){\r\n \r\n if(result.Data[k].FileUrl == null || result.Data.FileUrl == \"\"){\r\n result.Data[k].FileUrl = [];\r\n }\r\n else{ \r\n result.Data[k].FileUrl = JSON.parse(result.Data[k].FileUrl); \r\n }\r\n if (result.Data[k].Priority == 0){\r\n result.Data[k].PriorityName = \"Khẩn\";\r\n }else if (result.Data[k].Priority == 1){\r\n result.Data[k].PriorityName = \"Bình thường\";\r\n }\r\n }\r\n this.dataOffices = result.Data; \r\n\r\n this.bindOffices();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataOfficeSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataOffices.find((item) => {\r\n return item.ID === this.dataOfficeSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataOfficeSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataOfficeItem = {\r\n IsAdd: true,\r\n SerialNumber: '',\r\n OfficeTypeID: null,\r\n PublishAt: '',\r\n PublishTypeID: '',\r\n FieldTypeID: null,\r\n Summary: '',\r\n SignatureBy: '',\r\n FileUrl: [],\r\n CreateAt: new Date(),\r\n UpdateAt: new Date(),\r\n DelFlg: false,\r\n Type: this.officeDrt,\r\n Title: '',\r\n Priority: 1,\r\n OrderIdx: 0,\r\n UrlPath: ''\r\n };\r\n\r\n this.searchOption.Type = this.officeDrt;\r\n\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.dataOfficeSelection = [];\r\n this.filesUpload = [];\r\n this.filesUploadName = \"\";\r\n this.dataFileUrls = [];\r\n // this.bindFileUrls();\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n\r\n if(this.currentMonth == 0){\r\n this.searchOption.FromDate = new Date(this.currentYear - 1, 11, 1);\r\n }else {\r\n this.searchOption.FromDate = new Date(this.currentYear, this.currentMonth -1, 1);\r\n }\r\n this.searchOption.ToDate = new Date(this.currentYear, this.currentMonth +1, 0);\r\n }\r\n\r\n onPostPageChange(event: PageChangeEvent) {\r\n this.dataOfficeSkip = event.skip;\r\n this.bindOffices();\r\n }\r\n\r\n async onOfficeselectedKeysChange() {\r\n \r\n if (this.dataOfficeSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n if (this.dataOfficeSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataOfficeSelection[0];\r\n const selectedItem = this.dataOffices.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n selectedItem.PublishAt = selectedItem.PublishAt ? new Date(selectedItem.PublishAt) : null;\r\n\r\n this.dataOfficeItem = selectedItem;\r\n\r\n // const fileUrl = selectedItem.FileUrl;\r\n // this.dataFileUrls = [];\r\n // if (fileUrl) {\r\n // this.dataFileUrls.push({\r\n // Name: this.getNameByUrl(selectedItem.FileUrl),\r\n // Url: selectedItem.FileUrl\r\n // });\r\n // }\r\n // this.bindFileUrls();\r\n\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindOffices() {\r\n this.dataOfficeGridDataResult = {\r\n data: orderBy(this.dataOffices, this.dataOfficeSortByField),\r\n total: this.dataOffices.length\r\n };\r\n\r\n this.dataOfficeGridDataResult = process(this.dataOffices, this.dataOfficeState);\r\n }\r\n\r\n // bindFileUrls() {\r\n // this.dataFileUrlsGridDataResult = {\r\n // data: this.dataFileUrls,\r\n // total: this.dataFileUrls.length\r\n // };\r\n\r\n // this.dataOfficeGridDataResult = process(this.dataOffices, this.dataOfficeState);\r\n // }\r\n\r\n onOfficesortChange(sort: SortDescriptor[]): void {\r\n this.dataOfficeSortByField = sort;\r\n this.bindOffices();\r\n }\r\n\r\n public onPostDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataOfficeSelection = [];\r\n this.dataOfficeState = state;\r\n this.dataOfficeGridDataResult = process(this.dataOffices, this.dataOfficeState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n // loai van ban\r\n // const officeTypeDataRequest = {\r\n // pageID: this.appControls.getPage().replace('data', 'portal')\r\n // }\r\n const resultOfficeType = await this.appService.doGET('api/Office/GetOfficeType', null);\r\n if (resultOfficeType && resultOfficeType.Status === 1) {\r\n for (let i = 0; i < resultOfficeType.Data.length; i++){\r\n if(resultOfficeType.Data[i].ParentName != resultOfficeType.Data[i].Name && resultOfficeType.Data[i].ParentName != null){\r\n resultOfficeType.Data[i].Name = resultOfficeType.Data[i].Name + \" (\" + resultOfficeType.Data[i].ParentName + \")\"\r\n } \r\n }\r\n this.officeTypes = resultOfficeType.Data;\r\n this.officeTypesFilter = this.officeTypes.slice();\r\n this.officeTypesSearch = this.officeTypes.slice();\r\n }\r\n\r\n // co truong muc\r\n const resultAccountType = await this.appService.doGET('api/Office/GetCategoryType', null);\r\n if (resultAccountType && resultAccountType.Status === 1) {\r\n for (let i = 0; i < resultAccountType.Data.length; i++){\r\n if(resultAccountType.Data[i].ParentName != resultAccountType.Data[i].Name && resultAccountType.Data[i].ParentName != null){\r\n resultAccountType.Data[i].Name = resultAccountType.Data[i].Name + \" (\" + resultAccountType.Data[i].ParentName + \")\"\r\n } \r\n }\r\n this.accountTypes = resultAccountType.Data;\r\n this.accountTypesFilter = this.accountTypes.slice();\r\n this.accountTypesSearch = this.accountTypes.slice();\r\n }\r\n\r\n // co quan ban hanh\r\n const resultPublishType = await this.appService.doGET('api/Office/GetPublishType', null);\r\n if (resultPublishType && resultPublishType.Status === 1) {\r\n this.publishTypes = resultPublishType.Data;\r\n this.publishTypesFilter = this.publishTypes.slice();\r\n this.publishTypesSearch = this.publishTypes.slice();\r\n }\r\n\r\n // linh vuc\r\n const resultFieldType = await this.appService.doGET('api/Office/GetFieldType', null);\r\n if (resultFieldType && resultFieldType.Status === 1) {\r\n this.fieldTypes = resultFieldType.Data;\r\n this.fieldTypesFilter = this.fieldTypes.slice();\r\n this.fieldTypesSearch = this.fieldTypes.slice();\r\n }\r\n\r\n this.types = [\r\n { Name: 'Thư viện điện tử', ID: 0 },\r\n { Name: 'Thông tin chỉ đạo', ID: 1 }\r\n ];\r\n\r\n this.priorities = [\r\n { Name: 'Khẩn', ID: 0 },\r\n { Name: 'Bình thường', ID: 1 }\r\n ];\r\n }\r\n\r\n onSearch() {\r\n this.getOffices();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n //this.searchOption.SearchText = '';\r\n this.getOffices();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearPost() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewPost() {\r\n \r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n async onSavePost() {\r\n if (this.dataOfficeItem.IsAdd) { this.addPost(); } else { this.updatePost(); }\r\n }\r\n\r\n async onSaveOffices() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataOffices.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataOffices[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Office/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataOfficeItem;\r\n\r\n // let fileName = '';\r\n // if (this.dataFileUrls.length > 0) {\r\n // fileName = this.dataFileUrls[0].Url;\r\n // }\r\n var files: any[] = [];\r\n if (this.dataOfficeItem.FileUrl) {\r\n for (let i = 0; i < this.dataOfficeItem.FileUrl.length; i++) {\r\n // this.dataOfficeItem.FileUrl[i] = this.dataOfficeItem.FileUrl[i].replace(\" \",\"_\")\r\n files.push(this.dataOfficeItem.FileUrl[i]);\r\n }\r\n }\r\n //\r\n return {\r\n ID: temp.ID,\r\n SerialNumber: temp.SerialNumber,\r\n OfficeTypeID: temp.OfficeTypeID,\r\n PublishAt: temp.PublishAt ? this.intl.formatDate(new Date(temp.PublishAt), 'yyyy-MM-ddT00:00:00') : null,\r\n PublishTypeID: temp.PublishTypeID,\r\n CategoryTypeID: temp.CategoryTypeID,\r\n FieldTypeID: temp.FieldTypeID,\r\n Summary: temp.Summary,\r\n SignatureBy: temp.SignatureBy,\r\n FileUrl: JSON.stringify(files),\r\n CreateAt: temp.CreateAt,\r\n UpdateAt: temp.UpdateAt,\r\n DelFlg: temp.DelFlg,\r\n Type: temp.Type,\r\n Title: temp.Title,\r\n Priority: temp.Priority,\r\n OrderIdx: temp.OrderIdx,\r\n UrlPath: temp.UrlPath\r\n };\r\n }\r\n\r\n onClosePost(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n onEditPost() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async addPost() {\r\n this.appComponent.loading = true; \r\n if (this.dataOfficeItem.PublishAt){\r\n if (this.dataOfficeItem.PublishAt.getTime() < this.min || this.dataOfficeItem.PublishAt.getTime() > this.max ){\r\n this.appSwal.showWarning(this.translate.instant('RangeDate'), false);\r\n }else {\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Office', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n }else {\r\n this.appSwal.showWarning(\"Ngày ban hành đang rỗng\", false);\r\n }\r\n \r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updatePost() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataOfficeItem.ID;\r\n if (this.dataOfficeItem.PublishAt.getTime() < this.min || this.dataOfficeItem.PublishAt.getTime() > this.max){\r\n this.appSwal.showWarning(this.translate.instant('RangeDate'), false);\r\n }else {\r\n const dataRequest = this.createDataRequest(this.dataOfficeItem);\r\n const result = await this.appService.doPUT('api/Office', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n \r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeletePost() {\r\n if (this.dataOfficeSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataOfficeSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Office/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewPost();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataOfficeSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // getNameByUrl(fileUrl) {\r\n // const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n\r\n // return nameFile;\r\n // }\r\n\r\n async onDownloadFile(dataItem: any) {\r\n\r\n const dataRequest = {\r\n url: dataItem.Url\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, dataItem.Name);\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n // this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n this.dataOffices.forEach(item =>{\r\n item.PublishAt = this.intl.formatDate(new Date(item.PublishAt), 'dd/MM/yyyy')\r\n })\r\n const result: ExcelExportData = {\r\n data: process(this.dataOffices, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return;\r\n }\r\n\r\n const extension = e.files[0].extension.toLowerCase();\r\n\r\n this.allowInsertFile = true;\r\n\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n }\r\n } catch {\r\n }\r\n\r\n // tslint:disable-next-line: max-line-length\r\n if (!extension || (extension.toLowerCase() !== '.doc' && extension.toLowerCase() !== '.docx' && extension.toLowerCase() !== '.pdf'\r\n && extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.zip')) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .doc, .docx, .pdf, .xlsx, .xls, .zip', false);\r\n\r\n return false;\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n\r\n if (!this.allowInsertFile) {\r\n return;\r\n }\r\n\r\n try {\r\n // this.dataFileUrls = [];\r\n // const k = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n // this.dataFileUrls.push({\r\n // Name: this.getNameByUrl(k),\r\n // Url: k\r\n // });\r\n this.dataOfficeItem.FileUrl.push(`${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`);\r\n // this.bindFileUrls();\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n getFileName(fileUrls) {\r\n var nameFile = \"\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n this.dataOfficeItem.FileUrl = [];\r\n this.filesUploadName = '';\r\n this.filesUpload = [];\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n onRemoveFile(file){\r\n var isExistedInFile = this.dataOfficeItem.FileUrl.findIndex(x => x == file);\r\n if (isExistedInFile != -1) {\r\n this.dataOfficeItem.FileUrl.splice(isExistedInFile, 1);\r\n }\r\n }\r\n\r\n titleChange(e : any){\r\n if (e){\r\n this.dataOfficeItem.UrlPath = this.cleanAccents(e);\r\n } \r\n } \r\n cleanAccents (str: string){\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g,\"a\"); \r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g,\"e\"); \r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g,\"i\"); \r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g,\"o\"); \r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g,\"u\"); \r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g,\"y\"); \r\n str = str.replace(/đ/g,\"d\");\r\n str = str.replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, \"A\");\r\n str = str.replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, \"E\");\r\n str = str.replace(/Ì|Í|Ị|Ỉ|Ĩ/g, \"I\");\r\n str = str.replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, \"O\");\r\n str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, \"U\");\r\n str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, \"Y\");\r\n str = str.replace(/Đ/g, \"D\");\r\n // Some system encode vietnamese combining accent as individual utf-8 characters\r\n // Một vài bộ encode coi các dấu mũ, dấu chữ như một kí tự riêng biệt nên thêm hai dòng này\r\n str = str.replace(/\\u0300|\\u0301|\\u0303|\\u0309|\\u0323/g, \"\"); // ̀ ́ ̃ ̉ ̣ huyền, sắc, ngã, hỏi, nặng\r\n str = str.replace(/\\u02C6|\\u0306|\\u031B/g, \"\"); // ˆ ̆ ̛ Â, Ê, Ă, Ơ, Ư \r\n str = str.replace(/[!&\\/\\\\#,+()$~%.'\":*?<>{} ]/g,'-'); \r\n str = str.trim();\r\n return str;\r\n }\r\n}\r\n\r\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL2RhdGEvb3JnYW5pemUvb3JnYW5pemUuY29tcG9uZW50LmNzcyJ9 */\"","module.exports = \"\\r\\n organize works!\\r\\n
\\r\\n\"","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-organize',\r\n templateUrl: './organize.component.html',\r\n styleUrls: ['./organize.component.css']\r\n})\r\nexport class OrganizeComponent implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","module.exports = \":host ::ng-deep .k-tabstrip>.k-content{\\r\\n background-color: #f6f6f6 !important;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 300px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9wYXJ0L3BhcnQuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLG9DQUFvQztBQUN4Qzs7QUFFQSxtQkFBbUI7O0FBQ25CO0lBQ0ksZUFBZTtJQUNmLFNBQVM7SUFDVCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakI7O0FBRUE7SUFDSTtRQUNJLGVBQWU7UUFDZixTQUFTO1FBQ1QsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkOztJQUVBO1FBQ0ksZUFBZTtRQUNmLFVBQVU7UUFDVixjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixVQUFVO0lBQ2Q7QUFDSjs7QUFFQSxtQkFBbUI7O0FBR25CO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0FBQ2pCIiwiZmlsZSI6InNyYy9hcHAvZGF0YS9wYXJ0L3BhcnQuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIjpob3N0IDo6bmctZGVlcCAuay10YWJzdHJpcD4uay1jb250ZW50e1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjZmNiAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqL1xyXG4uc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDc2cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTglO1xyXG59XHJcblxyXG4uc3RpY2t5LXRvb2xiYXItYnRuLXVzZXJ7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDE5M3B4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk5LjU1JTtcclxufVxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2OHB4KSB7XHJcbiAgICAuc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogNzZweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTQlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAuc3RpY2t5LXRvb2xiYXItYnRuLXVzZXJ7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogMTkzcHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk5JTtcclxuICAgIH1cclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuXHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnN0aWNreS1oZWFkZXItZ3JpZCAuay1ncmlkIC5rLWdyaWQtaGVhZGVyIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMzAwcHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTcuNTUlO1xyXG59Il19 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'DelFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { saveAs } from '@progress/kendo-file-saver';\r\nimport { Http } from '@angular/http';\r\nimport { KendoButtonService } from '@progress/kendo-angular-buttons/dist/es2015/button/button.service';\r\nimport { DataSource } from '@angular/cdk/table';\r\n\r\n\r\n@Component({\r\n selector: 'app-part',\r\n templateUrl: './part.component.html',\r\n styleUrls: ['./part.component.css']\r\n})\r\nexport class PartComponent implements OnInit, OnDestroy {\r\n\r\n isStickySearch = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isStickySearch = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataParts = [];\r\n dataPartSelectableSettings: SelectableSettings;\r\n dataPartSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataPartFocus = {\r\n Name: true\r\n };\r\n dataPartSortByField: SortDescriptor[] = [];\r\n\r\n public WORKING_NUM_PAGING_SKIP = 0;\r\n public WORKING_NUM_PAGING_TAKE = 50;\r\n public WORKING_NUM_PAGING_BTN = 5;\r\n\r\n dataPartSkip = this.WORKING_NUM_PAGING_SKIP;\r\n dataPartPageSize = this.WORKING_NUM_PAGING_TAKE;\r\n dataPartSelection: number[] = [];\r\n dataPartItem: any;\r\n dataPartItemEnLanguage: any;\r\n dataPartItemtemp: any;\r\n myInterval: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.WORKING_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataPartState: State = {\r\n skip: this.dataPartSkip,\r\n take: this.dataPartSkip + this.dataPartPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n dataPartGridDataResult: GridDataResult;\r\n\r\n Parts: Array<{ Name: string, ID: string }>;\r\n PartsFilter: Array<{ Name: string, ID: string }>;\r\n Partfile: Array<{ Name: string, ID: string }>;\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n pageName: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n InputingFile = false;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private http: Http,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n this.getPageName();\r\n }\r\n\r\n PartsHandleFilter(value) {\r\n this.PartsFilter = this.Parts.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.allowMulti = !this.allowMulti;\r\n if (this.InputingFile === true) {\r\n this.allowMulti = false;\r\n this.dataPartSelectableSettings = {\r\n enabled: false,\r\n mode: 'single'\r\n };\r\n } else {\r\n this.dataPartSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n }\r\n\r\n setSelectableSettingsFile(): void {\r\n this.dataPartSelectableSettings = {\r\n enabled: true,\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getParts() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/Part/Search', dataRequest);\r\n if (result && result.Status) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < result.Data.length; i++) {\r\n if (result.Data[i].ParentID !== '') {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let j = 0; j < result.Data.length; j++) {\r\n if (result.Data[i].ParentID === result.Data[j].ID) {\r\n result.Data[i].ParentName = result.Data[j].Name\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.dataParts = result.Data;\r\n this.bindParts();\r\n\r\n\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n\r\n this.getPartParent();\r\n }\r\n\r\n async getPartParent() {\r\n const result = await this.appService.doGET('api/Part', null);\r\n if (result && result.Status) {\r\n this.Parts = result.Data;\r\n this.PartsFilter = this.Parts.slice();\r\n }\r\n }\r\n\r\n checkSelectionID() {\r\n for (let i = this.dataPartSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataParts.find((item) => {\r\n return item.ID === this.dataPartSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataPartSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataPartItem = {\r\n IsAdd: true,\r\n ID: '',\r\n Name: '',\r\n ParentID: '',\r\n ParentName: '',\r\n DelFlg: false\r\n };\r\n this.dataPartItemEnLanguage = {\r\n ID: null,\r\n PartID: null,\r\n Name: null,\r\n CreateAt: null,\r\n CreateBy: null,\r\n UpdateAt: null,\r\n UpdateBy: null,\r\n LanguageID: null,\r\n };\r\n this.dataPartItemtemp = Object.assign({}, this.dataPartItem);\r\n\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.dataPartSelection = [];\r\n }\r\n bindtemp(item) {\r\n this.dataPartItemtemp = Object.assign({}, item);\r\n }\r\n\r\n onPartPageChange(event: PageChangeEvent) {\r\n this.dataPartSkip = event.skip;\r\n this.bindParts();\r\n }\r\n\r\n async onPartSelectedKeysChange() {\r\n if (this.dataPartSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n if (this.dataPartSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n if (this.dataParts.length > 0 && this.InputingFile === false) {\r\n const selectedID = this.dataPartSelection[0];\r\n const selectedItem = this.dataParts.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataPartItem = selectedItem;\r\n this.bindtemp(this.dataPartItem);\r\n }\r\n }\r\n }\r\n\r\n bindParts() {\r\n this.dataPartGridDataResult = {\r\n data: orderBy(this.dataParts, this.dataPartSortByField),\r\n total: this.dataParts.length\r\n };\r\n\r\n this.dataPartGridDataResult = process(this.dataParts, this.dataPartState);\r\n }\r\n\r\n onPartSortChange(sort: SortDescriptor[]): void {\r\n this.dataPartSortByField = sort;\r\n this.bindParts();\r\n }\r\n\r\n public onPartDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataPartSelection = [];\r\n this.dataPartState = state;\r\n this.dataPartGridDataResult = process(this.dataParts, this.dataPartState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n // 'ID',\r\n 'Name',\r\n 'ParentID'\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n const extension = e.files[0].extension.toLowerCase();\r\n if (!extension || (extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.pdf')) {\r\n\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .xlsx, .xls.', false);\r\n\r\n return false;\r\n }\r\n\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n this.InputingFile = true;\r\n this.setSelectableSettings();\r\n this.dataParts = [];\r\n const PartListTemp = this.Parts.slice();\r\n\r\n const parentIdx = this.getColumnIndex('ParentID');\r\n let checkPart;\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 1; i < fileData.length; i++) {\r\n checkPart = PartListTemp.find(x => x.ID === fileData[i][parentIdx] || x.Name === fileData[i][parentIdx]);\r\n\r\n let partName = fileData[i][this.getColumnIndex('Name')];\r\n // check duplicate data\r\n if (this.dataParts.filter(item => item.Name == partName).length > 0\r\n || this.dataParts.filter(item => item.ParentName == partName).length > 0) {\r\n this.appSwal.showError(this.translate.instant('DuplicateDataImport'));\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n return\r\n }\r\n\r\n const obj = {\r\n IsAdd: false,\r\n Name: partName,\r\n ParentID: checkPart ? checkPart.ID : null,\r\n ParentName: checkPart ? checkPart.Name : null\r\n };\r\n\r\n this.dataParts.push(obj);\r\n }\r\n this.bindParts();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n this.getParts();\r\n }\r\n\r\n async initDisplay() {\r\n\r\n }\r\n\r\n onSearch() {\r\n this.getParts();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.InputingFile = false;\r\n this.setSelectableSettingsFile();\r\n this.searchOption.SearchText = '';\r\n this.getParts();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearPart() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n\r\n\r\n async getPart() {\r\n const result = await this.appService.doGET('api/Part', null);\r\n if (result.Status) {\r\n this.Partfile = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < result.Data.length; i++) {\r\n this.Partfile.push({\r\n ID: result.Data[i].ID,\r\n Name: result.Data[i].Name\r\n });\r\n }\r\n }\r\n }\r\n\r\n async onAddNewPart() {\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.setDefault();\r\n this.infoOpened = true;\r\n const resultPart = await this.appService.doGET('api/Part', null);\r\n if (resultPart && resultPart.Status === 1) {\r\n this.Parts = resultPart.Data;\r\n this.PartsFilter = this.Parts.slice();\r\n }\r\n\r\n }\r\n\r\n onSavePart() {\r\n if (this.dataPartItem.IsAdd) {\r\n this.addPart();\r\n\r\n } else {\r\n this.updatePart();\r\n }\r\n\r\n }\r\n\r\n async onSaveParts() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataParts.length; i++) {\r\n // check duplicate data\r\n let part = this.dataParts[i];\r\n const dataRequest = {\r\n searchText: part.Name\r\n };\r\n const resultPartListFromServer = await this.appService.doGET('api/Part/Search', dataRequest);\r\n let isDuplicate = false;\r\n if (resultPartListFromServer && resultPartListFromServer.Data &&\r\n\t\t\t\tresultPartListFromServer.Data.length > 0) {\r\n resultPartListFromServer.Data.forEach(element => {\r\n\t\t\t\t\tif (element.Name == part.Name) {\r\n\t\t\t\t\t\tisDuplicate = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tif (isDuplicate == false) {\r\n\t\t\t\tdataRequests.push(this.createDataRequest(this.dataParts[i]));\r\n\t\t\t}\r\n \r\n }\r\n const result = await this.appService.doPOST('api/Part/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataPartItemtemp;\r\n const tempEnLanguage = this.dataPartItemEnLanguage;\r\n return {\r\n Part: {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n ParentID: temp.ParentID,\r\n ParentName: temp.ParentName,\r\n DelFlg: temp.DelFlg\r\n },\r\n EnLanguage: {\r\n ID: tempEnLanguage.ID,\r\n PartID: tempEnLanguage.PartID,\r\n Name: tempEnLanguage.Name,\r\n CreateAt: tempEnLanguage.CreateAt,\r\n CreateBy: tempEnLanguage.CreateBy,\r\n UpdateAt: tempEnLanguage.UpdateAt,\r\n UpdateBy: tempEnLanguage.UpdateBy,\r\n LanguageID: 'en-US'\r\n }\r\n \r\n };\r\n }\r\n\r\n onEditPart() {\r\n this.infoOpened = true;\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.getLanguage();\r\n }\r\n\r\n async addPart() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Part', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updatePart() {\r\n this.appComponent.loading = true;\r\n const id = this.dataPartItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPUT('api/Part', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.infoOpened = false;\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeletePart() {\r\n if (this.dataPartSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataPartSelection),\r\n FlgRevert: false\r\n };\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Part/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataPartSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n async getLanguage(){\r\n var k = 0;\r\n if(this.dataPartItem.ID != null){\r\n const dataRequest = {\r\n id: this.dataPartItem.ID\r\n }\r\n const result = await this.appService.doGET('api/Part/GetPartLanguage', dataRequest);\r\n if (result && result.Status == 1) {\r\n for(let i = 0; i < result.Data.length; i++){\r\n if(result.Data[i].LanguageID == \"en-US\"){\r\n this.dataPartItemEnLanguage = result.Data[i];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public onTabSelect(e) {\r\n \r\n }\r\n\r\n\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","module.exports = \".ngBL {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.ndBL {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.img-banner {\\r\\n width: 100%;\\r\\n max-height: 500px;\\r\\n}\\r\\n\\r\\n.title {\\r\\n font-size: 28px;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.group-body-item {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n height: 130px;\\r\\n}\\r\\n\\r\\n.group-body-item-none-bg {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n}\\r\\n\\r\\n.description {\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.img-comment {\\r\\n width: 75px;\\r\\n height: 75px;\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.group-body-item:hover,\\r\\n.group-body-item-none-bg :hover {\\r\\n color: #006CB7;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.portal .group-body-2 {\\r\\n background-color: #F5F5F5;\\r\\n padding: 10px 20px;\\r\\n}\\r\\n\\r\\n.file-uploaded {\\r\\n color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n.group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 14px;\\r\\n font-size: 20px;\\r\\n color: #006CB7;\\r\\n font-weight: 500;\\r\\n background-color: #f5f5f5;\\r\\n /* text-transform: capitalize; */\\r\\n}\\r\\n\\r\\n.dialog-post {\\r\\n z-index: 1000 !important;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9wb3N0LXdhcmQvcG9zdC13YXJkLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksb0JBQW9CO0lBQ3BCLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osV0FBVztBQUNmOztBQUVBOztJQUVJLGNBQWM7SUFDZCxlQUFlO0FBQ25COztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsZ0NBQWdDO0FBQ3BDOztBQUVBO0lBQ0ksd0JBQXdCO0FBQzVCIiwiZmlsZSI6InNyYy9hcHAvZGF0YS9wb3N0LXdhcmQvcG9zdC13YXJkLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIubmdCTCB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbi5uZEJMIHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxufVxyXG5cclxuLmltZy1iYW5uZXIge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBtYXgtaGVpZ2h0OiA1MDBweDtcclxufVxyXG5cclxuLnRpdGxlIHtcclxuICAgIGZvbnQtc2l6ZTogMjhweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uZ3JvdXAtYm9keS1pdGVtIHtcclxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xyXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XHJcbiAgICBoZWlnaHQ6IDEzMHB4O1xyXG59XHJcblxyXG4uZ3JvdXAtYm9keS1pdGVtLW5vbmUtYmcge1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcclxufVxyXG5cclxuLmRlc2NyaXB0aW9uIHtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbn1cclxuXHJcbi5pbWctY29tbWVudCB7XHJcbiAgICB3aWR0aDogNzVweDtcclxuICAgIGhlaWdodDogNzVweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uZ3JvdXAtYm9keS1pdGVtOmhvdmVyLFxyXG4uZ3JvdXAtYm9keS1pdGVtLW5vbmUtYmcgOmhvdmVyIHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4ucG9ydGFsIC5ncm91cC1ib2R5LTIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjVGNTtcclxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcclxufVxyXG5cclxuLmZpbGUtdXBsb2FkZWQge1xyXG4gICAgY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmdyb3VwLWhlYWRlciB7XHJcbiAgICBwYWRkaW5nLXRvcDogMTNweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiAxM3B4O1xyXG4gICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA2Q0I3O1xyXG4gICAgcGFkZGluZy1sZWZ0OiAxNHB4O1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgY29sb3I6ICMwMDZDQjc7XHJcbiAgICBmb250LXdlaWdodDogNTAwO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcclxuICAgIC8qIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOyAqL1xyXG59XHJcblxyXG4uZGlhbG9nLXBvc3Qge1xyXG4gICAgei1pbmRleDogMTAwMCAhaW1wb3J0YW50O1xyXG59Il19 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{dataPostItem.Title}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n [title]=\\\"'Send' | translate\\\" (click)=\\\"onSendPost()\\\" [disabled]=\\\"enabled\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Post_HotFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{postTemp.Title}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { flatten } from '@angular/core/src/render3/util';\r\n\r\n@Component({\r\n selector: 'app-post-ward',\r\n templateUrl: './post-ward.component.html',\r\n styleUrls: ['./post-ward.component.css']\r\n})\r\nexport class PostWardComponent implements OnInit {\r\n //codeimage\r\n commentInput = null;\r\n infoOpened = false;\r\n public abc = '123';\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n reViewOpened = false;\r\n postTemp = {\r\n MenuName: '',\r\n Title: '',\r\n Description: '',\r\n ImageUrls: ''\r\n };\r\n\r\n public uploadFlgDefault = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n pageName: any;\r\n uploadFlg = this.uploadFlgDefault;\r\n public websiteDefault = null;\r\n websiteLink = this.websiteDefault;\r\n public bannerDef = '../../assets/images/default-01.png';\r\n public imageDef = '../../assets/images/default-02.png';\r\n bannerUrl: any;\r\n public imgSaveUrl: any;\r\n imgImageDefault: any;\r\n imgImageMain: any;\r\n //\r\n\r\n\r\n user: any;\r\n loading = false;\r\n dataPosts = [];\r\n dataPostSelectableSettings: SelectableSettings;\r\n dataPostSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataPostFocus = {\r\n Name: true\r\n };\r\n dataPostSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n dataLogPostSelectableSettings: SelectableSettings;\r\n logPostOpened = false;\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataPostSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataPostPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataPostSelection: number[] = [];\r\n dataPostItem: any;\r\n myInterval: any;\r\n\r\n\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataPostState: State = {\r\n skip: this.dataPostSkip,\r\n take: this.dataPostSkip + this.dataPostPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n dataPostGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n dataLogPostGridDataResult: GridDataResult;\r\n dataLogPosts: any[];\r\n\r\n dataMenuID: any[];\r\n\r\n menus: Array<{ Name: string, ID: string }>;\r\n menusFilter: Array<{ Name: string, ID: string }>;\r\n menusFilterSearch: Array<{ Name: string, ID: string }>;\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n PortalId: 14,\r\n MenuID: ''\r\n };\r\n\r\n portalIds: any[];\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n public domSanitizer: DomSanitizer,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.imgSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=image`;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.initDisplay();\r\n this.onReload();\r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n \r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataPostSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onMenusHandleFilter(value) {\r\n this.menusFilter = this.menus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onMenusSearchHandleFilter(value) {\r\n this.menusFilterSearch = this.menus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n public valueChange(value: any): void {\r\n \r\n }\r\n\r\n async onGetPost15p() {\r\n this.loading = true;\r\n const dataRequest = {\r\n id: this.searchOption.PortalId\r\n };\r\n\r\n const result = await this.appService.doGET('api/Post/GetPost15p', dataRequest);\r\n if (result) {\r\n this.dataPosts = result.Data;\r\n this.bindPosts();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataPostSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataPosts.find((item) => {\r\n return item.ID === this.dataPostSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataPostSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataPostItem = {\r\n IsAdd: true,\r\n MenuID: null,\r\n Title: null,\r\n Summary: null,\r\n Description: null,\r\n ImageUrls: null,\r\n FileUrls: null,\r\n CreateAt: new Date(),\r\n UpdateAt: new Date(),\r\n MobileFlg: null,\r\n ApprovedFlg: null,\r\n ApprovedAt: new Date(),\r\n ApprovedBy: null,\r\n OrderIdx: -1,\r\n HotFlg: false,\r\n Note: ''\r\n };\r\n this.imageDef = '../../assets/images/default-02.png';\r\n this.imgImageDefault = [\r\n this.imageDef,\r\n // this.imageDef,\r\n // this.imageDef,\r\n \r\n ];\r\n //this.imagesUploadName = \"\";\r\n this.imgImageMain = [''];\r\n this.uploadFlg = this.uploadFlgDefault;\r\n this.websiteLink = this.websiteDefault;\r\n\r\n this.dataMenuID = [];\r\n this.dataPostSelection = [];\r\n this.filesUpload = [];\r\n this.dataFileUrls = [];\r\n //this.bindFileUrls();\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n }\r\n imgChange = true;\r\n async onImageUrlSelectEventHandler(e: SelectEvent, index) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n // tslint:disable-next-line: max-line-length\r\n if (e.files[0].extension !== '.jpg' && e.files[0].extension !== '.png' && e.files[0].extension !== '.gif' && e.files[0].extension !== '.jpeg') {\r\n this.appSwal.showWarning(this.translate.instant('MsgImgOnly'), false);\r\n return false;\r\n }\r\n\r\n const fileData = await this.file.readImage(e.files[0].rawFile);\r\n const base64 = `${fileData}`;\r\n this.imgImageDefault[index] = this.domSanitizer.bypassSecurityTrustResourceUrl(base64);\r\n this.imgImageDefault.push(this.imageDef);\r\n this.imgChange = false;\r\n //this.imagesUploadName = e.files[0].rawFile.name;\r\n }\r\n\r\n onImageUrlSuccessEventHandle(e: any, index) {\r\n try {\r\n this.uploadFlg.image = true;\r\n this.imgImageMain[index] = e.response.body.Data.MediaNm[0];\r\n } catch {\r\n this.uploadFlg.image = false;\r\n // this.imgImageDefault[index] = this.imageDef;\r\n }\r\n }\r\n\r\n onImageUrlRemoveEventHandler(index) {\r\n this.imgImageMain[index] = '';\r\n }\r\n\r\n onPostPageChange(event: PageChangeEvent) {\r\n this.dataPostSkip = event.skip;\r\n this.bindPosts();\r\n }\r\n\r\n async onPostSelectedKeysChange() {\r\n\r\n if (this.dataPostSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataPostSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataPostSelection[0];\r\n const selectedItem = this.dataPosts.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = true;\r\n \r\n this.dataPostItem = selectedItem;\r\n /*-------------------------xử lý hình ảnh-------------------------*/\r\n var stringDomain = \"http://www.quan10.gov.vn\";\r\n\r\n //--------lấy nội dung bài viết => lấy index đầu cuối cắt chuỗi--------//\r\n var tempDescription = this.dataPostItem.Description;\r\n var startIndex = tempDescription.indexOf(\"src\");\r\n var endIndex = tempDescription.indexOf('.jpg\"');\r\n\r\n //--------chuỗi đã cắt lấy vị trí để chèn domain--------//\r\n var tempURL_Image = tempDescription.substring(startIndex, endIndex + '.jpg\"'.length + 1)\r\n \r\n var positionDomain = tempURL_Image.indexOf(\"/Portals\");\r\n\r\n //--------chuỗi sau khi gắn domain--------//\r\n var URL_Image = [tempURL_Image.slice(0, positionDomain), stringDomain, tempURL_Image.slice(positionDomain)].join('');\r\n \r\n\r\n //--------replace vào nội dung--------//\r\n do{\r\n this.dataPostItem.Description = this.dataPostItem.Description.replace('src=\"/Portals', 'src=\"http://www.quan10.gov.vn/Portals')\r\n \r\n }\r\n while(this.dataPostItem.Description.indexOf('src=\"/Portals') > 0)\r\n\r\n do{\r\n this.dataPostItem.Description = this.dataPostItem.Description.replace('href=\"/Portals', 'href=\"http://www.quan10.gov.vn/Portals')\r\n }\r\n while(this.dataPostItem.Description.indexOf('href=\"/Portals') > 0)\r\n this.dataPostItem.ImageUrls = selectedItem.ImageUrls;\r\n\r\n /*----------------------------------------------------------------*/\r\n this.imgImageDefault = [];\r\n //call api get base 64 to render image\r\n this.imageDef = '../../assets/images/default-02.png';\r\n this.imgImageDefault = [\r\n this.imageDef,\r\n // this.imageDef,\r\n // this.imageDef,\r\n ];\r\n\r\n const temp = [];\r\n if (selectedItem.MenuName) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.menus.length; i++) {\r\n if (selectedItem.MenuName.indexOf(this.menus[i].Name) >= 0) {\r\n temp.push(this.menus[i]);\r\n }\r\n }\r\n }\r\n this.dataMenuID = temp;\r\n\r\n\r\n // const fileUrls = JSON.parse(selectedItem.FileUrls);\r\n // this.dataFileUrls = [];\r\n // // tslint:disable-next-line:prefer-for-of\r\n // for (let i = 0; i < fileUrls.length; i++) {\r\n // this.dataFileUrls.push({\r\n // Name: this.getNameByUrl(fileUrls[i]),\r\n // Url: fileUrls[i]\r\n // });\r\n // }\r\n // this.bindFileUrls();\r\n //this.imagesUploadName = this.getPostName(this.dataPostItem);\r\n\r\n this.uploadFlg.image = false;\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindPosts() {\r\n this.dataPostGridDataResult = {\r\n data: orderBy(this.dataPosts, this.dataPostSortByField),\r\n total: this.dataPosts.length\r\n };\r\n\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n bindLogPosts() {\r\n this.dataLogPostGridDataResult = {\r\n data: this.dataLogPosts,\r\n total: this.dataLogPosts.length\r\n };\r\n\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n onPostSortChange(sort: SortDescriptor[]): void {\r\n this.dataPostSortByField = sort;\r\n this.bindPosts();\r\n }\r\n\r\n public onPostDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataPostSelection = [];\r\n this.dataPostState = state;\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n //this.onReload();\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.imgImageMain[index] = '',\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n\r\n const resultPost = await this.appService.doGET('api/Post/GetMenu', null);\r\n if (resultPost && resultPost.Status === 1) {\r\n this.menus = resultPost.Data;\r\n this.menusFilter = this.menus.slice();\r\n }\r\n\r\n this.portalIds = [\r\n { Name: 'Phường 1 Quận 10', ID: 14 },\r\n { Name: 'Phường 2 Quận 10', ID: 15 },\r\n { Name: 'Phường 3 Quận 10', ID: 16 },\r\n { Name: 'Phường 4 Quận 10', ID: 2 },\r\n { Name: 'Phường 5 Quận 10', ID: 17 },\r\n { Name: 'Phường 6 Quận 10', ID: 18 },\r\n { Name: 'Phường 7 Quận 10', ID: 19 },\r\n { Name: 'Phường 8 Quận 10', ID: 20 },\r\n { Name: 'Phường 9 Quận 10', ID: 10 },\r\n { Name: 'Phường 10 Quận 10', ID: 21 },\r\n { Name: 'Phường 11 Quận 10', ID: 22 },\r\n { Name: 'Phường 12 Quận 10', ID: 23 },\r\n { Name: 'Phường 13 Quận 10', ID: 24 },\r\n { Name: 'Phường 14 Quận 10', ID: 11 },\r\n { Name: 'Phường 15 Quận 10', ID: 7 }\r\n ];\r\n }\r\n\r\n onSearch() {\r\n this.onGetPost15p();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.onGetPost15p();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearPost() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewPost() {\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.setDefault();\r\n }\r\n\r\n async onSavePost() {\r\n if (this.dataPostItem.IsAdd) { this.addPost(); } else { this.updatePost(); }\r\n this.logPostOpened = false;\r\n }\r\n \r\n onReviewPost() {\r\n this.reViewOpened = true;\r\n this.getPostTemp();\r\n }\r\n getPostTemp() {\r\n const menuIDJSON: any[] = [];\r\n if (this.dataMenuID.length > 0) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataMenuID.length; i++) {\r\n menuIDJSON.push(this.dataMenuID[i].Name);\r\n }\r\n }\r\n\r\n this.postTemp.MenuName = this.dataPostItem.IsAdd ? menuIDJSON.join(';') : this.dataPostItem.MenuName;\r\n this.postTemp.Title = this.dataPostItem.Title;\r\n this.postTemp.Description = this.dataPostItem.Description;\r\n }\r\n\r\n async onSendPost() {\r\n\r\n const dataRequest = {\r\n id: this.dataPostItem.ID\r\n };\r\n console.info(dataRequest);\r\n\r\n const option = await this.appSwal.showWarning('Bạn có chắc chắn muốn xuất tin bài này không?', true);\r\n if (option) {\r\n const result = await this.appService.doGET('api/Post/Send', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataPostItem.ApprovedFlg = true;\r\n this.dataPostItem.ApprovedAt = result.Data.ApprovedAt;\r\n this.dataPostItem.ApprovedBy = result.Data.ApprovedBy;\r\n\r\n this.notification.showSuccess(result.Msg);\r\n\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n }\r\n\r\n async onViewLogPost() {\r\n\r\n const dataRequest = {\r\n id: this.dataPostItem.ID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Post/GetLog', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataLogPosts = result.Data;\r\n this.bindLogPosts();\r\n\r\n this.logPostOpened = true;\r\n\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n onCloseLogPost(e) {\r\n this.logPostOpened = false;\r\n }\r\n\r\n async onCancelPost() {\r\n\r\n const dataRequest = {\r\n ID: this.dataPostItem.ID\r\n };\r\n\r\n const option = await this.appSwal.showWarning('Bạn có chắc chắn muốn hủy xuất tin bài này không?', true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Post/Send', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataPostItem.ApprovedFlg = false;\r\n this.dataPostItem.ApprovedAt = null;\r\n this.dataPostItem.ApprovedBy = null;\r\n\r\n this.notification.showSuccess(result.Msg);\r\n\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n }\r\n\r\n\r\n async onSavePosts() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataPosts.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataPosts[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Post/Saves', dataRequests);\r\n //this.dataPostItem.ImageUrls = (this.uploadFlg.image == true) ? this.parseToArrayTxt(this.imgImageMain) : null;\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataPostItem;\r\n\r\n // let fileName = '';\r\n // if (this.dataFileUrls.length > 0) {\r\n // fileName = this.dataFileUrls[0].Url;\r\n // }\r\n\r\n const menuIDJSON: any[] = [];\r\n if (this.dataMenuID.length > 0) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataMenuID.length; i++) {\r\n menuIDJSON.push(this.dataMenuID[i].ID);\r\n }\r\n }\r\n\r\n return {\r\n ID: temp.ID,\r\n MenuID: menuIDJSON.length > 0 ? JSON.stringify(menuIDJSON) : null,\r\n Title: temp.Title,\r\n Summary: temp.Summary,\r\n Description: temp.Description,\r\n ImageUrls: temp.ImageUrls,\r\n FileUrls: null,\r\n CreateAt: temp.CreateAt,\r\n UpdateAt: temp.UpdateAt,\r\n MobileFlg: temp.MobileFlg,\r\n ApprovedFlg: true,\r\n ApprovedAt: this.intl.formatDate(new Date(), 'yyyy-MM-ddT00:00:00'),\r\n ApprovedBy: this.user.UserName,\r\n OrderIdx: temp.OrderIdx,\r\n HotFlg: temp.HotFlg,\r\n Note: temp.Note\r\n };\r\n }\r\n\r\n onClosePost(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n\r\n onEditPost() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n //this.logPostOpened = true;\r\n this.infoOpened = true;\r\n }\r\n\r\n parseToArrayTxt(arrayObject) {\r\n var arrayTxt = \"\";\r\n for (var i = 0; i < arrayObject.length; i++) {\r\n if (arrayObject[i] != \"\" && arrayObject[i] != null && arrayObject[i] != this.imageDef) {\r\n if (arrayTxt == \"\") {\r\n arrayTxt = \"[\" + \"\\\"\" + arrayObject[i] + \"\\\"\";\r\n } else {\r\n arrayTxt = arrayTxt + \",\" + \"\\\"\" + arrayObject[i] + \"\\\"\";\r\n }\r\n }\r\n }\r\n\r\n if (arrayTxt != \"\") {\r\n arrayTxt = arrayTxt + \"]\";\r\n }\r\n\r\n return arrayTxt;\r\n }\r\n\r\n async addPost() {\r\n this.appComponent.loading = true;\r\n if(this.imgChange == false){\r\n this.dataPostItem.ImageUrls = (this.uploadFlg.image === true && this.imgImageMain && this.imgImageMain.length > 0)\r\n ? this.imgImageMain[0] : null;\r\n //this.dataPostItem.ImageUrls = (this.uploadFlg.image == true) ? this.parseToArrayTxt(this.imgImageMain) : null;\r\n }\r\n else{\r\n this.dataPostItem.ImageUrls = this.dataPostItem.ImageUrls;\r\n }\r\n \r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Post', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewPost();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updatePost() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n // this.dataPostItem.ImageUrls = (this.uploadFlg.image === true && this.imgImageMain && this.imgImageMain.length > 0)\r\n // ? this.imgImageMain[0] : this.dataPostItem.ImageUrls;\r\n if(this.imgChange == false){\r\n this.dataPostItem.ImageUrls = (this.uploadFlg.image === true && this.imgImageMain && this.imgImageMain.length > 0)\r\n ? this.imgImageMain[0] : null;\r\n //this.dataPostItem.ImageUrls = (this.uploadFlg.image == true) ? this.parseToArrayTxt(this.imgImageMain) : null;\r\n }\r\n else{\r\n this.dataPostItem.ImageUrls = this.dataPostItem.ImageUrls;\r\n }\r\n \r\n const id = this.dataPostItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataPostItem);\r\n\r\n const result = await this.appService.doPUT('api/Post', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeletePost() {\r\n if (this.dataPostSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataPostSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Post/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewPost();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataPostSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n getPostName(dataItem) {\r\n var nameFile = \"temp.txt\";\r\n var fileUrls = dataItem.ImageUrls;\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var listurlArr = JSON.parse(fileUrls);\r\n if (listurlArr.length > 0) {\r\n var nameObj = listurlArr[0];\r\n var urlArr = nameObj.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return nameFile;\r\n }\r\n\r\n getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n // const lastIdx = fileUrl.lastIndexOf('/');\r\n // if (lastIdx > 0) {\r\n // nameFile = fileUrl.substring(lastIdx + 1);\r\n // }\r\n\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(dataItem: any) {\r\n\r\n const dataRequest = {\r\n url: dataItem.Url\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, dataItem.Name);\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataPosts, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = await this.file.readFile(e.files[0].rawFile);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n try {\r\n const k = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n this.dataFileUrls.push({\r\n Name: this.getNameByUrl(k),\r\n Url: k\r\n });\r\n\r\n this.bindFileUrls();\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n\r\n }\r\n onCloseInfo(e) {\r\n //this.setDefault();\r\n this.infoOpened = false;\r\n this.logPostOpened = false;\r\n }\r\n onCloseReViewPost(e) {\r\n this.reViewOpened = false;\r\n }\r\n}\r\n\r\n","module.exports = \".schedule-editor .k-window{\\r\\n width: 57%px;\\r\\n height: 500px;\\r\\n}\\r\\n\\r\\n.label-scheduler{\\r\\n padding-bottom: 5px;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.placeholer-color{\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.text-box{\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.deleted{\\r\\n text-decoration: line-through;\\r\\n}\\r\\n\\r\\n.changed{\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.publiced{\\r\\n background-color: mediumturquoise;\\r\\n}\\r\\n\\r\\n.approved{\\r\\n background-color: rgb(25, 214, 116);\\r\\n}\\r\\n\\r\\n.text-center{\\r\\n padding-top: 10px;\\r\\n width: 100%;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.xpre{\\r\\n white-space: pre-wrap; \\r\\n word-break: break-word;\\r\\n}\\r\\n\\r\\n.xbutton{\\r\\n color: #0067b2;\\r\\n /* background: #0067b2; */\\r\\n background-color: white;\\r\\n border-radius: 25%;\\r\\n float: left;\\r\\n border: none;\\r\\n font-size: 13px !important;\\r\\n padding-left: 0px;\\r\\n padding-top: 0px;\\r\\n padding-right: 0px;\\r\\n padding-bottom: 0px;\\r\\n}\\r\\n\\r\\n.xMonth{\\r\\n padding-top: 0px;\\r\\n padding-left: 0px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-scheduler-monthview .k-scheduler-table td{\\r\\n padding-top: 0px;\\r\\n padding-left: 0px;\\r\\n}\\r\\n\\r\\n/* :host ::ng-deep .k-more-events{\\r\\n display: none;\\r\\n} */\\r\\n\\r\\n/* :host ::ng-deep .router-outlet-content{\\r\\n padding-left: 8px;\\r\\n} */\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS9zY2hlZHVsZS9zY2hlZHVsZS5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksWUFBWTtJQUNaLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxtQkFBbUI7SUFDbkIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksWUFBWTtBQUNoQjs7QUFFQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLDZCQUE2QjtBQUNqQzs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGlDQUFpQztBQUNyQzs7QUFFQTtJQUNJLG1DQUFtQztBQUN2Qzs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixXQUFXO0lBQ1gsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0kscUJBQXFCO0lBQ3JCLHNCQUFzQjtBQUMxQjs7QUFFQTtJQUNJLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsdUJBQXVCO0lBQ3ZCLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsWUFBWTtJQUNaLDBCQUEwQjtJQUMxQixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGlCQUFpQjtBQUNyQjs7QUFFQTs7R0FFRzs7QUFNSDs7R0FFRyIsImZpbGUiOiJzcmMvYXBwL2RhdGEvc2NoZWR1bGUvc2NoZWR1bGUuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5zY2hlZHVsZS1lZGl0b3IgLmstd2luZG93e1xyXG4gICAgd2lkdGg6IDU3JXB4O1xyXG4gICAgaGVpZ2h0OiA1MDBweDtcclxufVxyXG5cclxuLmxhYmVsLXNjaGVkdWxlcntcclxuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XHJcbiAgICBmb250LXdlaWdodDogNzAwO1xyXG59XHJcblxyXG4ucGxhY2Vob2xlci1jb2xvcntcclxuICAgIGNvbG9yOiBibGFjaztcclxufVxyXG5cclxuLnRleHQtYm94e1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi5kZWxldGVke1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7XHJcbn1cclxuXHJcbi5jaGFuZ2Vke1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5wdWJsaWNlZHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IG1lZGl1bXR1cnF1b2lzZTtcclxufVxyXG5cclxuLmFwcHJvdmVke1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1LCAyMTQsIDExNik7XHJcbn1cclxuXHJcbi50ZXh0LWNlbnRlcntcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi54cHJle1xyXG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyBcclxuICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XHJcbn1cclxuXHJcbi54YnV0dG9ue1xyXG4gICAgY29sb3I6ICMwMDY3YjI7XHJcbiAgICAvKiBiYWNrZ3JvdW5kOiAjMDA2N2IyOyAqL1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgICBib3JkZXItcmFkaXVzOiAyNSU7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIGZvbnQtc2l6ZTogMTNweCAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZy1sZWZ0OiAwcHg7XHJcbiAgICBwYWRkaW5nLXRvcDogMHB4O1xyXG4gICAgcGFkZGluZy1yaWdodDogMHB4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDBweDtcclxufVxyXG5cclxuLnhNb250aHtcclxuICAgIHBhZGRpbmctdG9wOiAwcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDBweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5rLXNjaGVkdWxlci1tb250aHZpZXcgLmstc2NoZWR1bGVyLXRhYmxlIHRke1xyXG4gICAgcGFkZGluZy10b3A6IDBweDtcclxuICAgIHBhZGRpbmctbGVmdDogMHB4O1xyXG59XHJcblxyXG4vKiA6aG9zdCA6Om5nLWRlZXAgLmstbW9yZS1ldmVudHN7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59ICovXHJcblxyXG5cclxuXHJcblxyXG5cclxuLyogOmhvc3QgOjpuZy1kZWVwIC5yb3V0ZXItb3V0bGV0LWNvbnRlbnR7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDhweDtcclxufSAqL1xyXG5cclxuXHJcblxyXG4iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n event.dataItem.publicat\\r\\n }\\\">\\r\\n \\r\\n
{{event.title}}
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{register(date)}} \\r\\n \\r\\n {{ date | date: 'dd' }} \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n\\r\\n \\r\\n \"","import { Component, OnInit, Renderer2, ChangeDetectorRef } from '@angular/core';\r\nimport { SchedulerEvent, DateChangeEvent } from '@progress/kendo-angular-scheduler';\r\nimport { FormGroup, FormBuilder, Validators, ValidatorFn } from '@angular/forms';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { AppService } from 'src/app/services/app.service';\r\nimport { AppComponent } from 'src/app/app.component';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { isBuffer } from 'util';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport * as FileSaver from 'file-saver';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\n\r\n\r\nconst intersects = (startTime1: Date, endTime1: Date, startTime2: Date, endTime2: Date) =>\r\n (startTime1 < startTime2 && endTime1 > endTime2) ||\r\n (startTime2 <= startTime1 && startTime1 < endTime2) ||\r\n (startTime2 < endTime1 && endTime1 <= endTime2);\r\n\r\n@Component({\r\n selector: 'app-schedule',\r\n templateUrl: './schedule.component.html',\r\n styleUrls: ['./schedule.component.css'],\r\n})\r\nexport class ScheduleComponent implements OnInit {\r\n //public startTime = '07:00';\r\n isFile = false;\r\n dataMeetings = [];\r\n dataMeetingItem: any;\r\n dataMeetingItemTemp: any;\r\n meetingRoom: Array<{ Name: string, ID: string }>;\r\n dataRoomID: any[];\r\n infoOpened = false;\r\n isAdd = true;\r\n public selectedDate: Date = new Date(Date.now());\r\n public formGroup: FormGroup;\r\n control: any;\r\n controlDefault = true;\r\n\r\n members: Array<{ FullName: string, UserName: string }> = [];\r\n membersFilter: Array<{ FullName: string, UserName: string }> = [];\r\n\r\n startFlg = false;\r\n\r\n dataScheduler: any[] = [];\r\n user: any;\r\n\r\n\r\n public eventsArr: SchedulerEvent[] = [];\r\n public events: SchedulerEvent[] = [];\r\n\r\n listDateInMonthView = [];\r\n eventHeight = 1;\r\n eventHeightPixel = '600px';\r\n doCalMaxEvent = true;\r\n\r\n constructor(\r\n private formBuilder: FormBuilder,\r\n private appGuid: AppGuid,\r\n public appService: AppService,\r\n private appComponent: AppComponent,\r\n private appSwal: AppSwal,\r\n private notification: Notification,\r\n public intl: IntlService,\r\n private appUtils: AppUtils,\r\n //private renderer: Renderer2,\r\n private domSanitizer: DomSanitizer,\r\n private file: AppFile,\r\n private cdRef : ChangeDetectorRef,\r\n public appControls: AppControls,\r\n private authenticationService: AuthenticationService,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.getMeeting();\r\n this.getRoom();\r\n this.setDefault();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setDefault() {\r\n\r\n this.dataMeetingItem = {\r\n ID: '',\r\n Name: '',\r\n RoomMeetingID: null,\r\n RoomOther: null,\r\n Room: '',\r\n StartAt: '',\r\n EndAt: '',\r\n MeetingDate: null,\r\n CreateAt: null,\r\n ApproveFlg: null,\r\n DelFlg: null,\r\n Description: '',\r\n FileUrl: null,\r\n Unit: '',\r\n Admin: '',\r\n Member: ''\r\n };\r\n this.dataMeetingItemTemp = {\r\n viewOnly: false,\r\n IsAdd: true,\r\n Name: '',\r\n Admin: null,\r\n Address: '',\r\n MeetingDate: null,\r\n StartAt: null,\r\n EndAt: null,\r\n ApproveFlg: false,\r\n FileUrl: []\r\n };\r\n }\r\n\r\n async getRoom() {\r\n const result = await this.appService.doGET('api/Meeting/GetMeetingRoom', null);\r\n this.meetingRoom = result.Data;\r\n }\r\n\r\n async getMeeting() {\r\n const result = await this.appService.doGET('api/Meeting/GetMeeting', null);\r\n if (result) {\r\n if (result && result.Status === 1) {\r\n this.dataScheduler = result.Data;\r\n this.eventsArr = [];\r\n result.Data.forEach(item => {\r\n var tempStart = this.intl.formatDate(new Date(item.StartAt), 'HH:mm');\r\n var tempEnd = this.intl.formatDate(new Date(item.EndAt), 'HH:mm');\r\n const event = {\r\n id: item.ID,\r\n title: tempStart + \"-\" + tempEnd + \"-\" + item.Name,\r\n start: new Date(item.StartAt),\r\n end: new Date(item.EndAt),\r\n readonly: true,\r\n delflg: item.DelFlg,\r\n approveflg: item.ApproveFlg,\r\n publicflg: item.PublicFlg,\r\n publicat: new Date(item.PublicAt),\r\n updateat: new Date(item.UpdateAt),\r\n fileurl: item.FileUrl,\r\n meetingdate: item.MeetingDate\r\n }\r\n this.eventsArr.push(event);\r\n item.UnitList = JSON.parse(item.Unit);\r\n for (let j = 0; j < item.UnitList.length; j++) {\r\n if (item.ShowUnit == undefined) {\r\n item.ShowUnit = \"\";\r\n }\r\n if (j != item.UnitList.length - 1) {\r\n item.ShowUnit = item.ShowUnit + \" \" + item.UnitList[j].Name + \",\";\r\n } else {\r\n item.ShowUnit = item.ShowUnit + \" \" + item.UnitList[j].Name;\r\n }\r\n }\r\n item.Admin = JSON.parse(item.Admin);\r\n for (let k = 0; k < item.Admin.length; k++) {\r\n if (item.ShowAdmin == undefined) {\r\n item.ShowAdmin = \"\";\r\n }\r\n if (k != item.Admin.length - 1) {\r\n item.ShowAdmin = item.ShowAdmin + \" \" + item.Admin[k].FullName + \",\";\r\n } else {\r\n item.ShowAdmin = item.ShowAdmin + \" \" + item.Admin[k].FullName;\r\n }\r\n }\r\n item.RoomMeetingList = JSON.parse(item.RoomMeeting)[0];\r\n item.MemberList = JSON.parse(item.Member);\r\n if (item.FileUrl == null || item.FileUrl == \"\") {\r\n item.FileUrl = [];\r\n }\r\n else {\r\n item.FileUrl = JSON.parse(item.FileUrl);\r\n }\r\n\r\n this.dataMeetings.push(item);\r\n });\r\n this.events = this.eventsArr;\r\n this.startFlg = true;\r\n }\r\n }\r\n }\r\n\r\n\r\n ngOnInit() {\r\n }\r\n\r\n membersHandleFilter(value) {\r\n this.membersFilter = this.members.filter((s) => s.FullName.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n\r\n\r\n \r\n\r\n public getNextId(): number {\r\n const len = this.events.length;\r\n return (len === 0) ? 1 : this.events[this.events.length - 1].id + 1;\r\n }\r\n\r\n getUrlDownload(fileUrl) {\r\n let url = this.appService.apiRoot.replace(\"\\\"\", \"\") + fileUrl;\r\n url = url.replace(\"\\\"\", '')\r\n return url;\r\n }\r\n\r\n async downloadFile(fileUrl) {\r\n const dataRequest = {\r\n url: fileUrl\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, this.appUtils.getNameByUrl(fileUrl));\r\n }\r\n }\r\n\r\n private occupiedSlot(args: any): boolean {\r\n let occupied = false;\r\n this.events.find(e => {\r\n if (e !== args.dataItem && intersects(args.start, args.end, e.start, e.end)) {\r\n occupied = true;\r\n return true;\r\n }\r\n });\r\n return occupied;\r\n }\r\n\r\n public onDragStart(args: any): void {\r\n this.preventReadonly(args);\r\n }\r\n\r\n public onDrag(args: any): void {\r\n if (this.occupiedSlot(args)) {\r\n args.setHintClass('invalid');\r\n }\r\n }\r\n\r\n public onDragEnd(args: any): void {\r\n if (this.occupiedSlot(args)) {\r\n args.preventDefault();\r\n }\r\n }\r\n\r\n private preventReadonly(args: any): void {\r\n if (args.dataItem.readonly) {\r\n args.preventDefault();\r\n }\r\n }\r\n\r\n public ngAfterViewChecked() {\r\n //this.renderer.setStyle(document.querySelector(\"multi-day-view .k-scheduler-pane\"), \"display\", \"none\");\r\n }\r\n\r\n onCloseInfo(e) {\r\n if(this.dataMeetingItemTemp.viewOnly == true){\r\n this.infoOpened = false;\r\n return;\r\n }\r\n this.getMeeting();\r\n this.getRoom();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n addMeeting(date) {\r\n this.setDefault();\r\n this.dataMeetingItemTemp.MeetingDate = new Date(date);\r\n this.dataMeetingItemTemp.SchedulerAddNewDate = new Date(date);\r\n this.infoOpened = true;\r\n }\r\n\r\n compareDate(date) {\r\n var result = false;\r\n var calendarDate = new Date(date);\r\n var today = new Date();\r\n if (calendarDate.getUTCDate() + 1 == today.getUTCDate() && calendarDate.getUTCMonth() == today.getUTCMonth()\r\n && calendarDate.getUTCFullYear() == today.getUTCFullYear()) {\r\n result = true;\r\n } else if (calendarDate < today) {\r\n result = false;\r\n } else {\r\n result = true;\r\n }\r\n return result\r\n }\r\n\r\n // async increaseEventHeight(){\r\n // this.eventHeight = this.eventHeight + 1;\r\n // this.eventHeightPixel = (this.eventHeight * 600).toString() + \"px\";\r\n // this.getMeeting();\r\n // this.createFormGroup = this.createFormGroup.bind(this);\r\n // this.getRoom();\r\n // this.setDefault();\r\n // }\r\n\r\n // async decreaseEventHeight(){\r\n // if(this.eventHeight > 1){\r\n // this.eventHeight = this.eventHeight - 1;\r\n // }\r\n // this.eventHeightPixel = (this.eventHeight * 600).toString() + \"px\";\r\n // this.getMeeting();\r\n // this.createFormGroup = this.createFormGroup.bind(this);\r\n // this.getRoom();\r\n // this.setDefault();\r\n // }\r\n\r\n async register(date) {\r\n if (this.doCalMaxEvent) {\r\n if (this.listDateInMonthView.length == 42) {\r\n var newDate = new Date(date);\r\n if (this.listDateInMonthView[0].getDate() == newDate.getDate()) {\r\n this.doCalMaxEvent = false;\r\n return;\r\n }\r\n this.listDateInMonthView = [];\r\n }\r\n this.listDateInMonthView.push(new Date(date));\r\n if (this.listDateInMonthView.length == 42) {\r\n this.calMaxEvent();\r\n }\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n compareDateGreater(date1, date2) {\r\n var cDate1 = new Date(date1);\r\n cDate1.setHours(0);\r\n cDate1.setMinutes(0);\r\n cDate1.setSeconds(0);\r\n cDate1.setMilliseconds(0);\r\n var cDate2 = new Date(date2);\r\n cDate2.setHours(0);\r\n cDate2.setMinutes(0);\r\n cDate2.setSeconds(0);\r\n cDate2.setMilliseconds(0);\r\n if (cDate1 >= cDate2) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n compareDateLeeser(date1, date2) {\r\n var cDate1 = new Date(date1);\r\n cDate1.setHours(0);\r\n cDate1.setMinutes(0);\r\n cDate1.setSeconds(0);\r\n cDate1.setMilliseconds(0);\r\n var cDate2 = new Date(date2);\r\n cDate2.setHours(0);\r\n cDate2.setMinutes(0);\r\n cDate2.setSeconds(0);\r\n cDate2.setMilliseconds(0);\r\n if (cDate1 <= cDate2) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n async calMaxEvent() {\r\n var events = this.events;\r\n var dateInMonth = this.listDateInMonthView;\r\n var listEventInMonth = [];\r\n var maxEvent = {\r\n count: 0,\r\n date: 0,\r\n month: 0,\r\n year: 0\r\n };\r\n var currentDate = {\r\n count: 0,\r\n date: 0,\r\n month: 0,\r\n year: 0\r\n };\r\n for (let i = 0; i < events.length; i++) {\r\n if (this.compareDateGreater(events[i].start, dateInMonth[0]) && this.compareDateLeeser(events[i].start, dateInMonth[dateInMonth.length - 1])) {\r\n listEventInMonth.push(events[i]);\r\n }\r\n }\r\n for (let j = 0; j < listEventInMonth.length; j++) {\r\n var outerDate = new Date(listEventInMonth[j].start);\r\n currentDate.date = outerDate.getDate();\r\n currentDate.month = outerDate.getMonth();\r\n currentDate.year = outerDate.getFullYear();\r\n currentDate.count = 0;\r\n\r\n if (maxEvent.date == 0) {\r\n maxEvent.date = outerDate.getDate();\r\n maxEvent.month = outerDate.getMonth();\r\n maxEvent.year = outerDate.getFullYear();\r\n maxEvent.count = 0;\r\n }\r\n\r\n for (let k = 0; k < listEventInMonth.length; k++) {\r\n var innerDate = new Date(listEventInMonth[k].start);\r\n if (currentDate.date == innerDate.getDate() && currentDate.month == outerDate.getMonth()\r\n && currentDate.year == outerDate.getFullYear()) {\r\n currentDate.count = currentDate.count + 1;\r\n }\r\n }\r\n\r\n if (currentDate.count > maxEvent.count) {\r\n maxEvent.date = currentDate.date;\r\n maxEvent.month = currentDate.month;\r\n maxEvent.year = currentDate.year;\r\n maxEvent.count = currentDate.count;\r\n }\r\n }\r\n if (maxEvent.count == 3) {\r\n this.eventHeightPixel = (maxEvent.count * 261).toString() + \"px\";\r\n this.getMeeting();\r\n this.cdRef.detectChanges();\r\n } else if (maxEvent.count > 3 && maxEvent.count <= 7) {\r\n this.eventHeightPixel = (maxEvent.count * 231).toString() + \"px\";\r\n this.getMeeting();\r\n this.cdRef.detectChanges();\r\n }else if (maxEvent.count > 7 && maxEvent.count <= 11) {\r\n this.eventHeightPixel = (maxEvent.count * 200).toString() + \"px\";\r\n this.getMeeting();\r\n this.cdRef.detectChanges();\r\n } else if (maxEvent.count > 11) {\r\n this.eventHeightPixel = (maxEvent.count * 190).toString() + \"px\";\r\n this.getMeeting();\r\n this.cdRef.detectChanges();\r\n } else{\r\n this.eventHeightPixel = '600px';\r\n this.getMeeting();\r\n this.cdRef.detectChanges();\r\n }\r\n }\r\n\r\n public onDateChange(args: DateChangeEvent): void {\r\n this.doCalMaxEvent = true;\r\n }\r\n\r\n onViewInfo(id) {\r\n var selectedMeeting = this.dataMeetings[this.dataMeetings.findIndex(x => x.ID == id)];\r\n selectedMeeting.viewOnly = true;\r\n this.setDefault();\r\n this.dataMeetingItemTemp = selectedMeeting;\r\n this.dataMeetingItemTemp.MeetingDate = new Date(selectedMeeting.MeetingDate);\r\n this.dataMeetingItemTemp.StartAt = new Date(selectedMeeting.StartAt);\r\n this.dataMeetingItemTemp.EndAt = new Date(selectedMeeting.EndAt);\r\n this.infoOpened = true;\r\n }\r\n\r\n}\r\n","module.exports = \".xbutton {\\r\\n background-color: red;\\r\\n color: white !important;\\r\\n background: red;\\r\\n width: 100%;\\r\\n font-size: 25px !important;\\r\\n}\\r\\n\\r\\n.xdiv {\\r\\n border: 0.1px solid rgb(184, 184, 184);\\r\\n background-color: white;\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.xdivcol11 {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.xdivcol12 {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n height: 46px;\\r\\n}\\r\\n\\r\\n.xdivcol1 {\\r\\n padding-left: 0px;\\r\\n padding-right: 0px;\\r\\n}\\r\\n\\r\\n.button-view-rp {\\r\\n padding-left: 25%;\\r\\n color: white;\\r\\n background-color: blue;\\r\\n}\\r\\n\\r\\n.td-border {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.btn-view-rp {\\r\\n color: white;\\r\\n background-color: #006CB7;\\r\\n padding: 7px 12px;\\r\\n border: none !important;\\r\\n font-size: 16px;\\r\\n display: block;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.align-center-bt {\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.text-color-rp {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.text-color-rp span {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.opinion-style {\\r\\n height: auto;\\r\\n margin-left: 0px;\\r\\n padding: 10px;\\r\\n border: 0.1px solid rgb(184, 184, 184);\\r\\n background-color: white;\\r\\n}\\r\\n\\r\\n.opinion-content {\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.opinion-by {\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n text-align: right;\\r\\n font-size: 11px;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.opinion-row {\\r\\n margin-top: 0px !important;\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.icon-edit-opinion{\\r\\n margin-left: 5px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.k-dropdown .k-dropdown-wrap .k-input{\\r\\n background-image: linear-gradient(#FFFFFF, #FFFFFF);\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvZGF0YS93ZWVrbHktcmVwb3J0L3dlZWtseS1yZXBvcnQuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLHFCQUFxQjtJQUNyQix1QkFBdUI7SUFDdkIsZUFBZTtJQUNmLFdBQVc7SUFDWCwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxzQ0FBc0M7SUFDdEMsdUJBQXVCO0lBQ3ZCLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixZQUFZO0lBQ1osc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLHlCQUF5QjtJQUN6QixpQkFBaUI7SUFDakIsdUJBQXVCO0lBQ3ZCLGVBQWU7SUFDZixjQUFjO0lBQ2QsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixzQ0FBc0M7SUFDdEMsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksU0FBUztJQUNULFFBQVE7SUFDUixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLDBCQUEwQjtJQUMxQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLG1EQUFtRDtBQUN2RCIsImZpbGUiOiJzcmMvYXBwL2RhdGEvd2Vla2x5LXJlcG9ydC93ZWVrbHktcmVwb3J0LmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIueGJ1dHRvbiB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XHJcbiAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDtcclxuICAgIGJhY2tncm91bmQ6IHJlZDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgZm9udC1zaXplOiAyNXB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi54ZGl2IHtcclxuICAgIGJvcmRlcjogMC4xcHggc29saWQgcmdiKDE4NCwgMTg0LCAxODQpO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgICBtYXJnaW4tdG9wOiAwcHg7XHJcbn1cclxuXHJcbi54ZGl2Y29sMTEge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbn1cclxuXHJcbi54ZGl2Y29sMTIge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBoZWlnaHQ6IDQ2cHg7XHJcbn1cclxuXHJcbi54ZGl2Y29sMSB7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDBweDtcclxufVxyXG5cclxuLmJ1dHRvbi12aWV3LXJwIHtcclxuICAgIHBhZGRpbmctbGVmdDogMjUlO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogYmx1ZTtcclxufVxyXG5cclxuLnRkLWJvcmRlciB7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5idG4tdmlldy1ycCB7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgcGFkZGluZzogN3B4IDEycHg7XHJcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG59XHJcblxyXG4uYWxpZ24tY2VudGVyLWJ0IHtcclxuICAgIG1hcmdpbjogYXV0bztcclxufVxyXG5cclxuLnRleHQtY29sb3ItcnAge1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbi50ZXh0LWNvbG9yLXJwIHNwYW4ge1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbi5vcGluaW9uLXN0eWxlIHtcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XHJcbiAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgYm9yZGVyOiAwLjFweCBzb2xpZCByZ2IoMTg0LCAxODQsIDE4NCk7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLm9waW5pb24tY29udGVudCB7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG59XHJcblxyXG4ub3Bpbmlvbi1ieSB7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICByaWdodDogMDtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgZm9udC1zaXplOiAxMXB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbn1cclxuXHJcbi5vcGluaW9uLXJvdyB7XHJcbiAgICBtYXJnaW4tdG9wOiAwcHggIWltcG9ydGFudDtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxufVxyXG5cclxuLmljb24tZWRpdC1vcGluaW9ue1xyXG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLmstZHJvcGRvd24gLmstZHJvcGRvd24td3JhcCAuay1pbnB1dHtcclxuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCgjRkZGRkZGLCAjRkZGRkZGKTtcclxufSJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n Liệt kê \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ column.title }}\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ column.title }}\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n Xem báo cáo \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ column.title }}\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{ onDotsVideoString(dataItem.FullName) }}\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ column.title }}\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{ onDotsVideoString(dataItem.OpinionTB) }}\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ column.title }}\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{ onDotsVideoString(dataItem.Opinion) }}\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{ column.title }}\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
{{ onDotsVideoString(opinionCt) }}
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n {{ \\\"Tittle_Report\\\" | translate }} \\r\\n {{ dataWeeklyReportItem.Week }}/{{ dataWeeklyReportItem.Year }}\\r\\n
\\r\\n
\\r\\n TỪ NGÀY \\r\\n {{ dataWeeklyReportItem.FromDate | date : \\\"dd/MM/yyyy\\\" }}\\r\\n ĐẾN NGÀY \\r\\n {{ dataWeeklyReportItem.ToDate | date : \\\"dd/MM/yyyy\\\" }}\\r\\n
\\r\\n
\\r\\n Thời gian cập nhật {{ dayHour }},\\r\\n {{ dataWeeklyReportItem.UpdateAt | date : \\\"dd/MM/yyyy\\\" }}\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{\\r\\n \\\"NoRecordsAvailable\\\" | translate\\r\\n }} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{\\r\\n \\\"NoRecordsAvailable\\\" | translate\\r\\n }} \\r\\n \\r\\n \\r\\n \\r\\n {{\\r\\n \\\"NoRecordsAvailable\\\" | translate\\r\\n }} \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{ dataWeeklyReportItem.OpinionTB }}\\r\\n
\\r\\n
\\r\\n {{ dataWeeklyReportItem.OpinionTBBy }}\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{ dataWeeklyReportItem.Opinion }}\\r\\n
\\r\\n
\\r\\n {{ dataWeeklyReportItem.OpinionBy }}\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{ opinionCt.Opinion }}\\r\\n
\\r\\n
\\r\\n {{ opinionCt.OpinionBy }}\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, Input, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { t } from '@angular/core/src/render3';\r\nimport { DatePipe } from '@angular/common';\r\nimport { Packer } from 'docx';\r\nimport { DocumentCreator } from \"../../word-generator\";\r\n\r\n@Component({\r\n selector: 'app-weekly-report',\r\n templateUrl: './weekly-report.component.html',\r\n styleUrls: ['./weekly-report.component.css']\r\n})\r\nexport class WeeklyReportComponent implements OnInit, OnDestroy {\r\n\r\n //codeimage\r\n commentInput = null;\r\n\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n dataWeeklyReports = [];\r\n dataWeeklyReportSelectableSettings: SelectableSettings;\r\n dataWeeklyReportSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataWeeklyReportFocus = {\r\n Name: true\r\n };\r\n dataWeeklyReportSortByField: SortDescriptor[] = [\r\n\r\n ];\r\n\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataWeeklyReportSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataWeeklyReportPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataWeeklyReportSelection: number[] = [];\r\n dataWeeklyReportItem: any;\r\n myInterval: any;\r\n pageName: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n editOpinion = false;\r\n editOpinionTB = false;\r\n\r\n public dataWeeklyReportState: State = {\r\n skip: this.dataWeeklyReportSkip,\r\n take: this.dataWeeklyReportSkip + this.dataWeeklyReportPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n group: [{ field: 'UnitName' }]\r\n };\r\n dataWeeklyReportGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n groupTypes: Array<{ Name: string, ID: string }>;\r\n groupTypesFilter: Array<{ Name: string, ID: string }>;\r\n groupTypesSearch: Array<{ Name: string, ID: string }>;\r\n\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n allowInsertFile = true;\r\n\r\n // units: Array<{ Name: string, ID: string }>;\r\n // unitsFilter: Array<{ Name: string, ID: string }>;\r\n currentDay = new Date();\r\n \r\n lastestDayOfYear = new Date(new Date().getFullYear(),11,31);\r\n filesUploadName = \"\";\r\n myRestrictions: FileRestrictions = {\r\n maxFileSize: 1024 * 1024 * 120\r\n };\r\n dayHour = \"\";\r\n \r\n years: any;\r\n weeks: any;\r\n isChairman = true;\r\n weekCurrent = 0;\r\n viewOnly = false\r\n saveBtnFlg = true;\r\n isListed = false;\r\n \r\n closeRpTime : number;\r\n closeRpDate : any;\r\n timeReOpenRP : any;\r\n urlDownload = this.appService.apiRoot;\r\n infoOpinionOpened = false;\r\n opinionRegular = [];\r\n outerWidth: any;\r\n IsReply = false;\r\n unitRPList: any;\r\n searchOption = {\r\n Year: this.currentDay.getFullYear(),\r\n Week: 0\r\n };\r\n\r\n levelList: Array<{ Name: string, ID: string }> = [];\r\n levelListFilter: Array<{ Name: string, ID: string }> = [];\r\n\r\n selectedItem: any;\r\n\r\n OpinionByName: string;\r\n OpinionTBByName: string;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private datePipe: DatePipe\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.initDisplay();\r\n this.setSelectableSettings();\r\n this.onReload(); \r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n \r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n ngOnInit() {\r\n \r\n this.outerWidth = window.outerWidth;\r\n this.getLevelListFilter();\r\n }\r\n \r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n \r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataWeeklyReportSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onGroupTypeHandleFilter(value) {\r\n this.groupTypesFilter = this.groupTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onGroupTypeSearchHandleFilter(value) {\r\n this.groupTypesSearch = this.groupTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onTypeSearchHandleFilter(value) {\r\n this.onReload();\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n // if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n // this.onSearch();\r\n // }\r\n }\r\n\r\n async getLevelListFilter() {\r\n const result = await this.appService.doGET('api/Type/GetCompleteLevel', {});\r\n if (result && result.Status === 1) {\r\n this.levelList = result.Data;\r\n this.levelListFilter = this.levelList.slice();\r\n }\r\n }\r\n\r\n levelHandleFilter(value) {\r\n this.levelListFilter = this.levelList.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n async getWeeklyReports() {\r\n this.loading = true;\r\n let result;\r\n const dataRequest = {\r\n Year: this.searchOption.Year,\r\n Week: this.searchOption.Week,\r\n };\r\n\r\n if (this.control.SeeAllRp) {\r\n result = await this.appService.doPOST('api/WeeklyReport/Search', dataRequest);\r\n } else if (this.control.SeeAllByUnit) {\r\n result = await this.appService.doPOST('api/WeeklyReport/GetByUnit', dataRequest);\r\n } else {\r\n result = await this.appService.doPOST('api/WeeklyReport/GetByAccount', dataRequest);\r\n }\r\n if (result && result.Status === 1) {\r\n for (let i = 0; i < result.Data.length; i++) {\r\n if(result.Data[i].FileUrl == null || result.Data[i].FileUrl == \"\"){\r\n result.Data[i].FileUrl = [];\r\n }\r\n else{\r\n result.Data[i].FileUrl = JSON.parse(result.Data[i].FileUrl);\r\n }\r\n\r\n if(result.Data[i].OpinionRegularCt == null || result.Data[i].OpinionRegularCt == \"\"){\r\n result.Data[i].OpinionRegularCt = [];\r\n }\r\n else{\r\n result.Data[i].OpinionRegularCt = JSON.parse(result.Data[i].OpinionRegularCt);\r\n }\r\n\r\n if(result.Data[i].OpinionRegularBy == null || result.Data[i].OpinionRegularBy == \"\"){\r\n result.Data[i].OpinionRegularBy = [];\r\n }\r\n else{\r\n result.Data[i].OpinionRegularBy = JSON.parse(result.Data[i].OpinionRegularBy);\r\n }\r\n }\r\n\r\n this.dataWeeklyReports = result.Data;\r\n this.bindWeeklyReports();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataWeeklyReportSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataWeeklyReports.find((item) => {\r\n return item.ID === this.dataWeeklyReportSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataWeeklyReportSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n async setDefault() { \r\n this.dataWeeklyReportItem = {\r\n viewOnly: false,\r\n IsAdd: true,\r\n ProfessionalWorkByProgram: '',\r\n ProfessionalWorkUnexpected: '',\r\n SupportActive: '',\r\n FocusNextWeek: '',\r\n Offer:'',\r\n // Chairman: '',\r\n Opinion: '',\r\n CreateAt: '',\r\n CreateBy: this.user.UserName,\r\n UpdateAt: '',\r\n UpdateBy: '',\r\n DelFlg: '',\r\n ApproveFlg: false,\r\n FileUrl: [],\r\n UnitID: this.user.UnitID,\r\n FromDate: '',\r\n ToDate: '',\r\n Week: '',\r\n Year: this.currentDay.getFullYear(),\r\n FullName: '',\r\n OpinionBy: '',\r\n OptionTB: '',\r\n OpinionTBBy: '',\r\n OpinionRegularCt: [],\r\n OpinionRegularBy: [],\r\n TBCompleteLevel: null,\r\n SelfCompleteLevel: null,\r\n };\r\n this.opinionRegular = [];\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.dataWeeklyReportSelection = [];\r\n this.filesUpload = [];\r\n this.dataFileUrls = [];\r\n this.dayHour = '';\r\n // this.bindFileUrls();\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n this.filesUploadName = \"\";\r\n }\r\n\r\n //public userLogin = this.user.UserName;\r\n\r\n onPostPageChange(event: PageChangeEvent) {\r\n this.dataWeeklyReportSkip = event.skip;\r\n this.bindWeeklyReports();\r\n }\r\n\r\n async onWeeklyReportselectedKeysChange() {\r\n this.weekCurrent = this.getWeekNumber();\r\n if (this.dataWeeklyReportSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n \r\n if (this.dataWeeklyReportSelection.length > 1) {\r\n \r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataWeeklyReportSelection[0];\r\n const selectedItem = this.dataWeeklyReports.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n\r\n this.selectedItem = Object.assign([], selectedItem);\r\n\r\n selectedItem.IsAdd = false;\r\n selectedItem.viewOnly = false;\r\n selectedItem.PublishAt = selectedItem.PublishAt ? new Date(selectedItem.PublishAt) : null;\r\n this.dataWeeklyReportItem = selectedItem;\r\n\r\n //Get Name OpinionByName and OpinionByNameTB\r\n this.OpinionByName = this.dataWeeklyReportItem.OpinionBy.split(\" - \")[0];\r\n this.OpinionTBByName = this.dataWeeklyReportItem.OpinionTBBy.split(\" - \")[0];\r\n \r\n this.opinionRegular = [];\r\n for(let i = 0; i < this.dataWeeklyReportItem.OpinionRegularCt.length; i++){\r\n this.opinionRegular.push({\r\n Opinion: this.dataWeeklyReportItem.OpinionRegularCt[i] ? this.dataWeeklyReportItem.OpinionRegularCt[i] : '',\r\n OpinionBy: this.dataWeeklyReportItem.OpinionRegularBy[i] ? this.dataWeeklyReportItem.OpinionRegularBy[i] : ''\r\n });\r\n }\r\n if(!this.control.RangeTime){\r\n \r\n if(this.user.UserName != this.dataWeeklyReportItem.CreateBy){\r\n this.isChairman = false;\r\n }\r\n if(this.user.UserName == this.dataWeeklyReportItem.CreateBy || (this.control.Approve && this.user.UnitID == this.dataWeeklyReportItem.UnitID)){\r\n this.isChairman = true;\r\n }\r\n if (this.weekCurrent != this.dataWeeklyReportItem.Week){\r\n this.isChairman = false;\r\n }\r\n }else {\r\n if(this.user.UserName != this.dataWeeklyReportItem.CreateBy){\r\n this.isChairman = false;\r\n }\r\n if(this.user.UserName == this.dataWeeklyReportItem.CreateBy || (this.control.Approve && this.user.UnitID == this.dataWeeklyReportItem.UnitID)){\r\n this.isChairman = true;\r\n }\r\n }\r\n if (selectedItem.UpdateAt){\r\n this.dayHour = this.getHour(selectedItem.UpdateAt);\r\n }\r\n if (this.unitRPList.find(r => r == selectedItem.UnitID)){\r\n this.IsReply = true;\r\n }else {\r\n this.IsReply = false;\r\n }\r\n \r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindWeeklyReports() {\r\n this.dataWeeklyReportGridDataResult = {\r\n data: orderBy(this.dataWeeklyReports, this.dataWeeklyReportSortByField),\r\n total: this.dataWeeklyReports.length\r\n };\r\n\r\n this.dataWeeklyReportGridDataResult = process(this.dataWeeklyReports, this.dataWeeklyReportState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataWeeklyReportGridDataResult = process(this.dataWeeklyReports, this.dataWeeklyReportState);\r\n }\r\n\r\n onWeeklyReportsortChange(sort: SortDescriptor[]): void {\r\n this.dataWeeklyReportSortByField = sort;\r\n this.bindWeeklyReports();\r\n }\r\n\r\n public onPostDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataWeeklyReportSelection = [];\r\n this.dataWeeklyReportState = state;\r\n this.dataWeeklyReportGridDataResult = process(this.dataWeeklyReports, this.dataWeeklyReportState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.Year) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.Year = this.currentDay.getFullYear();\r\n this.searchOption.Week = this.dataWeeklyReportItem.Week;\r\n }\r\n\r\n async initDisplay() {\r\n // nhom bao cao \r\n this.years = [];\r\n this.weeks = [];\r\n for (let i = 2019; i < 2100; i++) {\r\n this.years.push({\r\n ID: i,\r\n Name: i\r\n });\r\n }\r\n for (let i = 1; i <= 52; i++) {\r\n this.weeks.push({\r\n ID: i,\r\n Name: i\r\n }); \r\n }\r\n\r\n this.searchOption = {\r\n Year: 0,\r\n Week: 0\r\n };\r\n this.searchOption.Year = this.currentDay.getFullYear();\r\n this.searchOption.Week = await this.getWeekNumber(); \r\n if (this.searchOption.Week == 1 && this.currentDay.getMonth() != 0){\r\n this.searchOption.Year = this.currentDay.getFullYear() + 1;\r\n } \r\n \r\n const dataRequests = {\r\n id: this.user.UnitID\r\n };\r\n const resultUnit = await this.appService.doGET('api/Unit/SearchUnitByID', dataRequests);\r\n if (resultUnit && resultUnit.Status === 1) {\r\n if(resultUnit.Data){\r\n this.timeReOpenRP = resultUnit.Data.ReOpenFlg;\r\n } \r\n }\r\n\r\n const dataRequest = {\r\n username: this.user.UserName\r\n };\r\n const result = await this.appService.doGET('api/User/GetUnitRpList', dataRequest);\r\n this.unitRPList = [];\r\n if (result && result.Status === 1) {\r\n if(result.Data == null || result.Data == \"\"){\r\n result.Data = [];\r\n }\r\n else{\r\n result.Data = JSON.parse(result.Data);\r\n }\r\n if(result.Data){\r\n for (let i = 0; i < result.Data.length; i ++){\r\n if (result.Data[i] != null){\r\n this.unitRPList.push(result.Data[i]);\r\n } \r\n } \r\n } \r\n } \r\n if (!this.unitRPList.find(r => r == this.user.UnitID)){\r\n this.unitRPList.push(this.user.UnitID);\r\n }\r\n }\r\n\r\n onSearch() {\r\n this.isListed = true;\r\n this.getWeeklyReports();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n async onReload() {\r\n this.getWeeklyReports();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearPost() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n async onAddNewPost() {\r\n this.saveBtnFlg = false;\r\n this.weekCurrent = this.getWeekNumber();\r\n this.setDefault();\r\n this.currentDay = new Date();\r\n this.dataWeeklyReportItem.FromDate = new Date(this.currentDay.setDate(this.currentDay.getDate() - this.currentDay.getDay() + (this.currentDay.getDay() == 0 ? -6:1)));\r\n this.dataWeeklyReportItem.ToDate = new Date(this.currentDay.setDate(this.dataWeeklyReportItem.FromDate.getDate() + 6));\r\n this.dataWeeklyReportItem.Week = this.getWeekNumber(); \r\n this.dataWeeklyReportItem.Year = this.searchOption.Year; \r\n await this.getCloseRpTime();\r\n if (this.closeRpDate){\r\n this.currentDay = new Date();\r\n if(this.timeReOpenRP){\r\n \r\n var timeReOpenRPAfter30 = new Date(this.timeReOpenRP);\r\n timeReOpenRPAfter30.setMinutes(timeReOpenRPAfter30.getMinutes() + 30);\r\n if(this.dataWeeklyReportItem.Week == 1 \r\n && (new Date(this.timeReOpenRP).getTime() <= this.currentDay.getTime() && timeReOpenRPAfter30.getTime() >= this.currentDay.getTime())){\r\n this.searchOption.Week == 52;\r\n this.searchOption.Year = this.currentDay.getFullYear() - 1;\r\n this.dataWeeklyReportItem.FromDate = this.dataWeeklyReportItem.FromDate.setDate(this.dataWeeklyReportItem.FromDate.getDate() - 7);\r\n this.dataWeeklyReportItem.ToDate = this.dataWeeklyReportItem.ToDate.setDate(this.dataWeeklyReportItem.ToDate.getDate() - 7);\r\n } \r\n if ( (this.searchOption.Week == this.dataWeeklyReportItem.Week - 1) \r\n && (new Date(this.timeReOpenRP).getTime() <= this.currentDay.getTime() && timeReOpenRPAfter30.getTime() >= this.currentDay.getTime())){\r\n this.dataWeeklyReportItem.Week = this.searchOption.Week;\r\n this.dataWeeklyReportItem.FromDate = this.dataWeeklyReportItem.FromDate.setDate(this.dataWeeklyReportItem.FromDate.getDate() - 7);\r\n this.dataWeeklyReportItem.ToDate = this.dataWeeklyReportItem.ToDate.setDate(this.dataWeeklyReportItem.ToDate.getDate() - 7);\r\n }else if ( (this.searchOption.Week == this.dataWeeklyReportItem.Week)) {\r\n \r\n }else {\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorRangeTimeRp'), false);\r\n return;\r\n }\r\n }\r\n else if (this.closeRpDate.getTime() < this.currentDay.getTime() || this.weekCurrent != this.searchOption.Week){\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorRangeTimeRp'), false);\r\n return;\r\n }\r\n }else {\r\n return;\r\n }\r\n this.dataWeeklyReportItem.FullName = this.user.FullName\r\n this.infoOpened = true;\r\n }\r\n\r\n async onSavePost() {\r\n if (this.dataWeeklyReportItem.IsAdd) { this.addPost(); } else { this.updatePost(); }\r\n }\r\n\r\n async onSaveWeeklyReports() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataWeeklyReports.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataWeeklyReports[i]));\r\n }\r\n const result = await this.appService.doPOST('api/WeeklyReport/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n this.currentDay = new Date();\r\n if (this.dataWeeklyReportItem.Opinion && this.dataWeeklyReportItem.Opinion !== this.selectedItem.Opinion){\r\n this.dataWeeklyReportItem.OpinionBy = this.user.FullName + \" - \" + this.datePipe.transform(this.currentDay, 'dd/MM/yyyy');\r\n }\r\n if (this.dataWeeklyReportItem.OpinionTB && this.dataWeeklyReportItem.OpinionTB !== this.selectedItem.OpinionTB){\r\n this.dataWeeklyReportItem.OpinionTBBy = this.user.FullName + \" - \" + this.datePipe.transform(this.currentDay, 'dd/MM/yyyy');\r\n }\r\n\r\n this.dataWeeklyReportItem.Year = this.searchOption.Year;\r\n\r\n const temp = data ? data : this.dataWeeklyReportItem;\r\n var files: any[] = [];\r\n if (this.dataWeeklyReportItem.FileUrl) {\r\n for (let i = 0; i < this.dataWeeklyReportItem.FileUrl.length; i++) {\r\n files.push(this.dataWeeklyReportItem.FileUrl[i]);\r\n }\r\n }\r\n \r\n var opinionRegularContent: any[] = [];\r\n var opinionRegularBy: any[] = [];\r\n if(this.opinionRegular){\r\n for(let i = 0; i < this.opinionRegular.length; i ++){\r\n opinionRegularContent.push(this.opinionRegular[i].Opinion)\r\n opinionRegularBy.push(this.opinionRegular[i].OpinionBy)\r\n }\r\n }\r\n this.opinionRegular = [];\r\n return {\r\n ID: temp.ID,\r\n ProfessionalWorkByProgram: temp.ProfessionalWorkByProgram,\r\n ProfessionalWorkUnexpected: temp.ProfessionalWorkUnexpected,\r\n SupportActive: temp.SupportActive,\r\n FocusNextWeek: temp.FocusNextWeek,\r\n Offer: temp.Offer,\r\n // Chairman: temp.Chairman,\r\n Opinion: temp.Opinion,\r\n CreateAt: temp.CreateAt ? this.intl.formatDate(new Date(temp.CreateAt), 'yyyy-MM-ddTHH:mm:ss') : null,\r\n CreateBy: temp.CreateBy,\r\n UpdateAt: temp.UpdateAt ? this.intl.formatDate(new Date(temp.UpdateAt), 'yyyy-MM-ddTHH:mm:ss') : null,\r\n UpdateBy: temp.UpdateBy,\r\n DelFlg: temp.DelFlg,\r\n ApproveFlg: temp.ApproveFlg,\r\n ApproveBy: temp.ApproveBy,\r\n ApproveAt: temp.ApproveAt,\r\n PublicFlg: temp.PublicFlg,\r\n PublicBy: temp.PublicBy,\r\n PublicAt: temp.PublicAt,\r\n FileUrl: JSON.stringify(files),\r\n UnitID: temp.UnitID,\r\n Year: temp.Year,\r\n Week: temp.Week,\r\n FromDate: temp.FromDate ? this.intl.formatDate(new Date(temp.FromDate), 'yyyy-MM-ddTHH:mm:ss') : null,\r\n ToDate: temp.ToDate ? this.intl.formatDate(new Date(temp.ToDate), 'yyyy-MM-ddTHH:mm:ss') : null,\r\n OpinionBy: temp.OpinionBy ? temp.OpinionBy : '',\r\n OpinionTB: temp.OpinionTB,\r\n OpinionTBBy: temp.OpinionTBBy ? temp.OpinionTBBy : '',\r\n OpinionRegularCt: JSON.stringify(opinionRegularContent),\r\n OpinionRegularBy: JSON.stringify(opinionRegularBy),\r\n TBCompleteLevel: temp.TBCompleteLevel,\r\n SelfCompleteLevel: temp.SelfCompleteLevel,\r\n };\r\n }\r\n\r\n onClosePost(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async onEditPost() {\r\n this.saveBtnFlg = false;\r\n this.weekCurrent = this.getWeekNumber();\r\n this.currentDay = new Date();\r\n if(this.dataWeeklyReportItem.ApproveFlg == true && this.dataWeeklyReportItem.PublicFlg != true){\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorEditWeekRp'), false);\r\n return;\r\n }\r\n if (!this.control.RangeTime){\r\n await this.getCloseRpTime();\r\n if (this.closeRpDate){\r\n if(this.closeRpDate.getTime() < this.currentDay.getTime() || this.searchOption.Week != this.weekCurrent){\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorRangeTimeRp'), false);\r\n return;\r\n }\r\n }else {\r\n return;\r\n }\r\n }\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async addPost() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPOST('api/WeeklyReport', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updatePost() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataWeeklyReportItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataWeeklyReportItem);\r\n\r\n const result = await this.appService.doPUT('api/WeeklyReport', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n this.editOpinion = false;\r\n this.editOpinionTB = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeletePost() {\r\n this.weekCurrent = this.getWeekNumber();\r\n this.currentDay = new Date();\r\n if (this.dataWeeklyReportSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n if (!this.control.RangeTime){\r\n await this.getCloseRpTime();\r\n if (this.closeRpDate){\r\n if(this.closeRpDate.getTime() < this.currentDay.getTime() || this.searchOption.Week != this.weekCurrent){\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorRangeTimeRp'), false);\r\n return;\r\n }\r\n }else {\r\n return;\r\n }\r\n }\r\n\r\n for(let i = 0; i < this.dataWeeklyReportSelection.length; i++){\r\n var weeklyRp = this.dataWeeklyReports.find(x => x.ID == this.dataWeeklyReportSelection[i]);\r\n if(weeklyRp.ApproveFlg == true || weeklyRp.PublicFlg == true){\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorDeleteWeekRp'), false);\r\n return;\r\n }\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataWeeklyReportSelection),\r\n FlgRevert: false\r\n };\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/WeeklyReport/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataWeeklyReportSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(file: any) {\r\n const dataRequest = {\r\n url: file\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, this.getFileName(file));\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.splice(i, 1);\r\n break;\r\n }\r\n }\r\n this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataWeeklyReports, {}).data\r\n };\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return;\r\n }\r\n const extension = e.files[0].extension.toLowerCase();\r\n this.allowInsertFile = true;\r\n try {\r\n const fileData = e.files[0]; // await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n // tslint:disable-next-line: max-line-length\r\n if (!extension || (extension.toLowerCase() !== '.doc' && extension.toLowerCase() !== '.docx' && extension.toLowerCase() !== '.pdf'\r\n && extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.zip')) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .doc, .docx, .pdf, .xlsx, .xls, .zip', false);\r\n return false;\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n if (!this.allowInsertFile) {\r\n return;\r\n }\r\n try {\r\n if(this.dataWeeklyReportItem.FileUrl == undefined){\r\n this.dataWeeklyReportItem.FileUrl = [];\r\n }\r\n this.dataWeeklyReportItem.FileUrl.push(`${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n this.dataWeeklyReportItem.FileUrl = [];\r\n this.filesUploadName = '';\r\n this.filesUpload = [];\r\n }\r\n\r\n onRemoveFile(file){\r\n var isExistedInFile = this.dataWeeklyReportItem.FileUrl.findIndex(x => x == file);\r\n if (isExistedInFile != -1) {\r\n this.dataWeeklyReportItem.FileUrl.splice(isExistedInFile, 1);\r\n }\r\n }\r\n\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.onReload();\r\n this.infoOpened = false;\r\n }\r\n\r\n // unitsHandleFilter(value) {\r\n // this.unitsFilter = this.units.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n // }\r\n\r\n getHour(date) {\r\n var current_day = new Date(date);\r\n return ((current_day.getHours() < 10) ? \"0\" : \"\") + current_day.getHours() + \":\" + ((current_day.getMinutes() < 10) ? \"0\" : \"\") + current_day.getMinutes()\r\n }\r\n\r\n getWeekNumber(): number {\r\n const currentdate = new Date();\r\n var d = new Date(Date.UTC(currentdate.getFullYear(), currentdate.getMonth(), currentdate.getDate()));\r\n var dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1)); \r\n if (1 + Math.ceil((((d.valueOf() - yearStart.valueOf()) / 86400000) + 1)/7) == 53 ){\r\n \r\n return 1; \r\n } else {\r\n return 1 + Math.ceil((((d.valueOf() - yearStart.valueOf()) / 86400000) + 1)/7)\r\n }\r\n \r\n }\r\n \r\n getFileName(fileUrls) {\r\n var nameFile = \"\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n\r\n viewReport(dataItem){\r\n this.dataWeeklyReportItem = dataItem;\r\n\r\n this.opinionRegular = [];\r\n for(let i = 0; i < this.dataWeeklyReportItem.OpinionRegularCt.length; i++){\r\n this.opinionRegular.push({\r\n Opinion: this.dataWeeklyReportItem.OpinionRegularCt[i] ? this.dataWeeklyReportItem.OpinionRegularCt[i] : '',\r\n OpinionBy: this.dataWeeklyReportItem.OpinionRegularBy[i] ? this.dataWeeklyReportItem.OpinionRegularBy[i] : ''\r\n });\r\n }\r\n if (!this.control.ViewRPUnapproved && !this.dataWeeklyReportItem.ApproveFlg && this.user.UserName != this.dataWeeklyReportItem.CreateBy){\r\n this.appSwal.showWarning(this.translate.instant('MsgViewApproveWeekRp'), false);\r\n return;\r\n }\r\n this.saveBtnFlg = true;\r\n this.viewOnly = true;\r\n this.enabled = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async onApproved() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataWeeklyReportItem.ID;\r\n\r\n const result = await this.appService.doGET('api/WeeklyReport/Approved', { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onUnApproved() {\r\n if(this.dataWeeklyReportItem.PublicFlg == true){\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorUnApproveWeekRp'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataWeeklyReportItem.ID;\r\n\r\n const result = await this.appService.doGET('api/WeeklyReport/UnApproved', { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onPublic() {\r\n if(this.dataWeeklyReportItem.ApproveFlg != true){\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorPublicWeekRp'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataWeeklyReportItem.ID;\r\n\r\n const result = await this.appService.doGET('api/WeeklyReport/Public', { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onUnPublic() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataWeeklyReportItem.ID;\r\n\r\n const result = await this.appService.doGET('api/WeeklyReport/UnPublic', { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n replyReport() { \r\n this.saveBtnFlg = false;\r\n this.viewOnly = false;\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async getCloseRpTime() {\r\n const result = await this.appService.doGET('api/MailConfig/getCloseRpTime', null);\r\n \r\n if (result && result.Status === 1) {\r\n if(result.Data){\r\n // this.closeRpTime = parseInt(); \r\n this.closeRpDate = new Date(Date.parse(result.Data.Value));\r\n } \r\n else {\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorRangeTimeRpConfig'), false);\r\n return; \r\n }\r\n }else {\r\n this.appSwal.showWarning(this.translate.instant('MsgErrorRangeTimeRpConfig'), false);\r\n }\r\n }\r\n\r\n valueChangeWeekFilter(e :any){\r\n this.onSearch();\r\n }\r\n\r\n valueChangeYearFilter(e :any){\r\n this.onSearch();\r\n }\r\n\r\n getUrlDownload(item) {\r\n let url = this.urlDownload.replace(/\\\"/g, \"\") + item;\r\n url = url.replace(/\\\"/g, '')\r\n return url;\r\n }\r\n\r\n onAddNewOpinion(){\r\n this.infoOpinionOpened = true;\r\n }\r\n\r\n onCloseInfoOpinion(e) {\r\n this.infoOpinionOpened = false;\r\n }\r\n\r\n onSaveOpinionRegular(value){\r\n this.currentDay = new Date();\r\n this.opinionRegular.push({\r\n Opinion: value,\r\n OpinionBy: value ? this.user.FullName + \" - \" + this.datePipe.transform(this.currentDay, 'dd/MM/yyyy') : null\r\n });\r\n this.infoOpinionOpened = false;\r\n }\r\n\r\n onDotsVideoString(string){\r\n if (string){\r\n var width = this.outerWidth;\r\n var txtLength = 75;\r\n if(string.length > 75 && width >= 768){\r\n var orgString = string;\r\n if(orgString.indexOf(\" \", txtLength) == -1 || orgString.indexOf(\" \", txtLength) - txtLength > 10){\r\n txtLength = orgString.lastIndexOf(\" \", txtLength);\r\n }\r\n if(string == string.toUpperCase()){\r\n txtLength = txtLength - 15;\r\n }\r\n var newString = orgString.slice(0,orgString.indexOf(\" \", txtLength)) + \"...\";\r\n return newString;\r\n } else{\r\n return string;\r\n }\r\n }\r\n }\r\n\r\n onExportPost(){\r\n var title = Object.assign({}, this.dataWeeklyReportItem);;\r\n var updatehour = this.dayHour;\r\n var opinions = this.opinionRegular;\r\n const documentCreator = new DocumentCreator(this.datePipe);\r\n const doc = documentCreator.create(\r\n title,\r\n updatehour,\r\n opinions\r\n );\r\n var fileName = \"Báo cáo_\" + title.UnitName + \".docx\";\r\n Packer.toBlob(doc).then(blob => {\r\n FileSaver(blob, fileName);\r\n console.log(\"Document created successfully\");\r\n });\r\n }\r\n\r\n onEditOpinion(){\r\n this.editOpinion = true;\r\n }\r\n\r\n onEditOpinionTB(){\r\n this.editOpinionTB = true;\r\n }\r\n}\r\n\r\n","module.exports = \"body {\\r\\n font-family: 'Open Sans', sans-serif;\\r\\n ;\\r\\n font-style: normal;\\r\\n font-weight: normal;\\r\\n font-size: 14px;\\r\\n color: #71748d;\\r\\n background-color: #efeff6;\\r\\n -webkit-font-smoothing: antialiased;\\r\\n}\\r\\n\\r\\n.user-image,\\r\\n.user-image img {\\r\\n border-radius: 50%;\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n/* #006CB7\\r\\n#006CB7 */\\r\\n\\r\\n.bg-vnpt,\\r\\n.bg-vnpt .dropdown-menu {\\r\\n /* #006CB7!important; */\\r\\n background-color: #006CB7!important;\\r\\n color: #FFFFFF;\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.bg-vnpt {\\r\\n top: 0;\\r\\n position: fixed;\\r\\n z-index: 2;\\r\\n width: 100%;\\r\\n /* box-shadow: 10px 1px 10px 1px #b1a9f5; */\\r\\n}\\r\\n\\r\\n.bg-vnpt .navbar-nav .active>.nav-link,\\r\\n.bg-vnpt .navbar-nav .nav-link.active,\\r\\n.bg-vnpt .navbar-nav .nav-link.show,\\r\\n.bg-vnpt .navbar-nav .show>.nav-link,\\r\\n.bg-vnpt a,\\r\\n.bg-vnpt .n-b {\\r\\n color: inherit !important;\\r\\n /* font-weight: bold !important; */\\r\\n}\\r\\n\\r\\n.bg-vnpt .n-b:hover,\\r\\n.bg-vnpt .dropdown-item:focus,\\r\\n.bg-vnpt .dropdown-item:hover {\\r\\n color: #006CB7 !important;\\r\\n text-decoration: none;\\r\\n background-color: #ffffff !important;\\r\\n}\\r\\n\\r\\n.bg-vnpt .dropdown-menu {\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.bg-vnpt .n-b {\\r\\n background-color: inherit;\\r\\n background: inherit;\\r\\n border-bottom: 1px solid #4479dd;\\r\\n padding: 8px 20px;\\r\\n}\\r\\n\\r\\n.bg-vnpt .navbar-toggler {\\r\\n border: 1px solid #FFFFFF;\\r\\n color: #FFFFFF;\\r\\n background: inherit;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup {\\r\\n left: auto !important;\\r\\n right: 10px;\\r\\n top: 48px;\\r\\n width: 320px;\\r\\n height: auto;\\r\\n box-shadow: 0 2px 10px rgba(0, 0, 0, .2);\\r\\n border: 1px solid #ccc;\\r\\n border-color: rgba(0, 0, 0, .2);\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top {\\r\\n margin: 20px;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.toggle-user .k-popup {\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top .user-image-large,\\r\\n.toggle-user kendo-popup .top .info {\\r\\n display: inline-block;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top .user-image-large {\\r\\n border-radius: 50%;\\r\\n width: 90px;\\r\\n height: 90px;\\r\\n margin-right: 20px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top .user-image-large img {\\r\\n border-radius: 50%;\\r\\n width: 90px;\\r\\n height: 90px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top .employee-name {\\r\\n font-weight: bold;\\r\\n margin: -4px 0 1px 0;\\r\\n text-overflow: ellipsis;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top .role-name {\\r\\n color: #666;\\r\\n text-overflow: ellipsis;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .bottom {\\r\\n background: #f5f5f5;\\r\\n border-top: 1px solid #ccc;\\r\\n border-color: rgba(0, 0, 0, .2);\\r\\n padding: 10px 0;\\r\\n width: 100%;\\r\\n display: table;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .bottom>div {\\r\\n display: table-cell;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .bottom .k-button {\\r\\n margin: 0 20px;\\r\\n white-space: nowrap;\\r\\n background: #f8f8f8;\\r\\n border: 1px solid #c6c6c6;\\r\\n color: #666;\\r\\n cursor: default;\\r\\n text-decoration: none;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .bottom .change-pass {\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .bottom .log-out {\\r\\n text-align: right;\\r\\n}\\r\\n\\r\\n.nav-item-button {\\r\\n margin-right: 4px;\\r\\n}\\r\\n\\r\\n.btn-nav {\\r\\n height: 40px;\\r\\n background: inherit;\\r\\n border: 1px solid #FFFFFF;\\r\\n color: #FFFFFF;\\r\\n}\\r\\n\\r\\n.navbar-brand {\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.item-img {\\r\\n text-align: left;\\r\\n width: 50px;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n.searchdiv {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.xsearchdiv {\\r\\n margin-right: 50px;\\r\\n margin-top: 14px !important;\\r\\n}\\r\\n\\r\\n.xsearchbtn {\\r\\n border-top: 0;\\r\\n margin-left: 5px;\\r\\n margin-right: 5px;\\r\\n height: 38px !important;\\r\\n}\\r\\n\\r\\n.notify {\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n padding: 0;\\r\\n background: inherit;\\r\\n color: #adbddc;\\r\\n border: 0;\\r\\n}\\r\\n\\r\\n.notify span {\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\n.notify-quantity {\\r\\n font-size: 12px;\\r\\n color: #FFFFFF;\\r\\n position: absolute;\\r\\n width: 25px;\\r\\n height: 25px;\\r\\n border-radius: 50%;\\r\\n background: red;\\r\\n text-align: center;\\r\\n padding-top: 4px;\\r\\n margin-left: 19px;\\r\\n z-index: 5;\\r\\n font-weight: bold;\\r\\n margin-top: -5px;\\r\\n}\\r\\n\\r\\n.notify-container {\\r\\n border-bottom: 1px solid #d4e3ee;\\r\\n padding: 7px;\\r\\n height: 73px;\\r\\n}\\r\\n\\r\\n.notify-container:hover {\\r\\n background-color: #006CB7;\\r\\n cursor: pointer;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.notify-container .icon {\\r\\n line-height: 26px;\\r\\n float: left;\\r\\n width: 26px;\\r\\n height: 26px;\\r\\n margin: 0 10px 0 0;\\r\\n text-align: center;\\r\\n border-radius: 50px;\\r\\n color: #fff;\\r\\n border-color: #006CB7;\\r\\n background: #006CB7;\\r\\n}\\r\\n\\r\\n.notify,\\r\\n.notify img {\\r\\n border-radius: 50%;\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup {\\r\\n left: auto !important;\\r\\n right: 70px;\\r\\n top: 48px;\\r\\n width: 380px;\\r\\n max-height: 350px;\\r\\n height: auto;\\r\\n box-shadow: 0 2px 10px rgba(0, 0, 0, .2);\\r\\n border: 1px solid #ccc;\\r\\n border-color: rgba(0, 0, 0, .2);\\r\\n z-index: 4;\\r\\n}\\r\\n\\r\\n.toggle-notify .title {\\r\\n font-size: 14px;\\r\\n font-weight: bold;\\r\\n height: 30px;\\r\\n border-bottom: 1px solid #0051e9;\\r\\n padding: 5px 0px 0px 7px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .top {\\r\\n height: 251px;\\r\\n overflow-y: scroll;\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.toggle-notify .k-popup {\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .top .user-image-large,\\r\\n.toggle-notify kendo-popup .top .info {\\r\\n display: inline-block;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .top .user-image-large {\\r\\n border-radius: 50%;\\r\\n width: 90px;\\r\\n height: 90px;\\r\\n margin-right: 20px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .top .user-image-large img {\\r\\n border-radius: 50%;\\r\\n width: 90px;\\r\\n height: 90px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .top .employee-name {\\r\\n font-weight: bold;\\r\\n margin: -4px 0 1px 0;\\r\\n text-overflow: ellipsis;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .top .role-name {\\r\\n color: #666;\\r\\n text-overflow: ellipsis;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .bottom {\\r\\n background: #f5f5f5;\\r\\n border-top: 1px solid #ccc;\\r\\n border-color: rgba(0, 0, 0, .2);\\r\\n padding: 10px 0;\\r\\n width: 100%;\\r\\n display: table;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .bottom>div {\\r\\n display: table-cell;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .bottom .k-button {\\r\\n margin: 0 20px;\\r\\n white-space: nowrap;\\r\\n background: #f8f8f8;\\r\\n border: 1px solid #c6c6c6;\\r\\n color: #666;\\r\\n cursor: default;\\r\\n text-decoration: none;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .bottom .change-pass {\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.toggle-notify kendo-popup .bottom .log-out {\\r\\n text-align: right;\\r\\n}\\r\\n\\r\\n.time {\\r\\n font-size: 11px;\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.text {\\r\\n height: 22px;\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.text:hover {\\r\\n color: white !important;\\r\\n}\\r\\n\\r\\n.cm {\\r\\n background-color: #006CB7;\\r\\n color: #ffffff;\\r\\n padding: 1px 7px;\\r\\n font-size: 11px;\\r\\n}\\r\\n\\r\\n.row {\\r\\n margin-top: 5px !important;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvaG9tZS9ob21lLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxvQ0FBb0M7O0lBRXBDLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsbUNBQW1DO0FBQ3ZDOztBQUVBOztJQUVJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsWUFBWTtJQUNaLFVBQVU7QUFDZDs7QUFHQTtTQUNTOztBQUVUOztJQUVJLHVCQUF1QjtJQUN2QixtQ0FBbUM7SUFDbkMsY0FBYztJQUNkLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxNQUFNO0lBQ04sZUFBZTtJQUNmLFVBQVU7SUFDVixXQUFXO0lBQ1gsMkNBQTJDO0FBQy9DOztBQUVBOzs7Ozs7SUFNSSx5QkFBeUI7SUFDekIsa0NBQWtDO0FBQ3RDOztBQUVBOzs7SUFHSSx5QkFBeUI7SUFDekIscUJBQXFCO0lBQ3JCLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLFVBQVU7QUFDZDs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixtQkFBbUI7SUFDbkIsZ0NBQWdDO0lBQ2hDLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2QsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0kscUJBQXFCO0lBQ3JCLFdBQVc7SUFDWCxTQUFTO0lBQ1QsWUFBWTtJQUNaLFlBQVk7SUFDWix3Q0FBd0M7SUFDeEMsc0JBQXNCO0lBQ3RCLCtCQUErQjtBQUNuQzs7QUFFQTtJQUNJLFlBQVk7SUFDWixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxZQUFZO0FBQ2hCOztBQUVBOztJQUVJLHFCQUFxQjtJQUNyQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsVUFBVTtBQUNkOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxZQUFZO0lBQ1osVUFBVTtBQUNkOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQix1QkFBdUI7SUFDdkIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksV0FBVztJQUNYLHVCQUF1QjtJQUN2QixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxtQkFBbUI7SUFDbkIsMEJBQTBCO0lBQzFCLCtCQUErQjtJQUMvQixlQUFlO0lBQ2YsV0FBVztJQUNYLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQix5QkFBeUI7SUFDekIsV0FBVztJQUNYLGVBQWU7SUFDZixxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6QixjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQiwyQkFBMkI7QUFDL0I7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLFVBQVU7SUFDVixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLFNBQVM7QUFDYjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsY0FBYztJQUNkLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsVUFBVTtJQUNWLGlCQUFpQjtJQUNqQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxnQ0FBZ0M7SUFDaEMsWUFBWTtJQUNaLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsZUFBZTtJQUNmLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsV0FBVztJQUNYLFdBQVc7SUFDWCxZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsV0FBVztJQUNYLHFCQUFxQjtJQUNyQixtQkFBbUI7QUFDdkI7O0FBRUE7O0lBRUksa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxZQUFZO0lBQ1osVUFBVTtBQUNkOztBQUVBO0lBQ0kscUJBQXFCO0lBQ3JCLFdBQVc7SUFDWCxTQUFTO0lBQ1QsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQixZQUFZO0lBQ1osd0NBQXdDO0lBQ3hDLHNCQUFzQjtJQUN0QiwrQkFBK0I7SUFDL0IsVUFBVTtBQUNkOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixZQUFZO0lBQ1osZ0NBQWdDO0lBQ2hDLHdCQUF3QjtJQUN4QixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLFlBQVk7QUFDaEI7O0FBRUE7O0lBRUkscUJBQXFCO0lBQ3JCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFlBQVk7SUFDWixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLHVCQUF1QjtJQUN2QixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsdUJBQXVCO0lBQ3ZCLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLG1CQUFtQjtJQUNuQiwwQkFBMEI7SUFDMUIsK0JBQStCO0lBQy9CLGVBQWU7SUFDZixXQUFXO0lBQ1gsY0FBYztBQUNsQjs7QUFFQTtJQUNJLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6QixXQUFXO0lBQ1gsZUFBZTtJQUNmLHFCQUFxQjtBQUN6Qjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGVBQWU7SUFDZixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLG1CQUFtQjtJQUNuQixnQkFBZ0I7SUFDaEIsdUJBQXVCO0lBQ3ZCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUIiLCJmaWxlIjoic3JjL2FwcC9ob21lL2hvbWUuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbImJvZHkge1xyXG4gICAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnLCBzYW5zLXNlcmlmO1xyXG4gICAgO1xyXG4gICAgZm9udC1zdHlsZTogbm9ybWFsO1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIGNvbG9yOiAjNzE3NDhkO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZmNjtcclxuICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xyXG59XHJcblxyXG4udXNlci1pbWFnZSxcclxuLnVzZXItaW1hZ2UgaW1nIHtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIHdpZHRoOiA0MHB4O1xyXG4gICAgaGVpZ2h0OiA0MHB4O1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuXHJcbi8qICMwMDZDQjdcclxuIzAwNkNCNyAqL1xyXG5cclxuLmJnLXZucHQsXHJcbi5iZy12bnB0IC5kcm9wZG93bi1tZW51IHtcclxuICAgIC8qICMwMDZDQjchaW1wb3J0YW50OyAqL1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNyFpbXBvcnRhbnQ7XHJcbiAgICBjb2xvcjogI0ZGRkZGRjtcclxuICAgIGJvcmRlcjogbm9uZTtcclxufVxyXG5cclxuLmJnLXZucHQge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgLyogYm94LXNoYWRvdzogMTBweCAxcHggMTBweCAxcHggI2IxYTlmNTsgKi9cclxufVxyXG5cclxuLmJnLXZucHQgLm5hdmJhci1uYXYgLmFjdGl2ZT4ubmF2LWxpbmssXHJcbi5iZy12bnB0IC5uYXZiYXItbmF2IC5uYXYtbGluay5hY3RpdmUsXHJcbi5iZy12bnB0IC5uYXZiYXItbmF2IC5uYXYtbGluay5zaG93LFxyXG4uYmctdm5wdCAubmF2YmFyLW5hdiAuc2hvdz4ubmF2LWxpbmssXHJcbi5iZy12bnB0IGEsXHJcbi5iZy12bnB0IC5uLWIge1xyXG4gICAgY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDtcclxuICAgIC8qIGZvbnQtd2VpZ2h0OiBib2xkICFpbXBvcnRhbnQ7ICovXHJcbn1cclxuXHJcbi5iZy12bnB0IC5uLWI6aG92ZXIsXHJcbi5iZy12bnB0IC5kcm9wZG93bi1pdGVtOmZvY3VzLFxyXG4uYmctdm5wdCAuZHJvcGRvd24taXRlbTpob3ZlciB7XHJcbiAgICBjb2xvcjogIzAwNkNCNyAhaW1wb3J0YW50O1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uYmctdm5wdCAuZHJvcGRvd24tbWVudSB7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG59XHJcblxyXG4uYmctdm5wdCAubi1iIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XHJcbiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM0NDc5ZGQ7XHJcbiAgICBwYWRkaW5nOiA4cHggMjBweDtcclxufVxyXG5cclxuLmJnLXZucHQgLm5hdmJhci10b2dnbGVyIHtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNGRkZGRkY7XHJcbiAgICBjb2xvcjogI0ZGRkZGRjtcclxuICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCB7XHJcbiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7XHJcbiAgICByaWdodDogMTBweDtcclxuICAgIHRvcDogNDhweDtcclxuICAgIHdpZHRoOiAzMjBweDtcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIGJveC1zaGFkb3c6IDAgMnB4IDEwcHggcmdiYSgwLCAwLCAwLCAuMik7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xyXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIC4yKTtcclxufVxyXG5cclxuLnRvZ2dsZS11c2VyIGtlbmRvLXBvcHVwIC50b3Age1xyXG4gICAgbWFyZ2luOiAyMHB4O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxufVxyXG5cclxuLnRvZ2dsZS11c2VyIC5rLXBvcHVwIHtcclxuICAgIGJvcmRlcjogbm9uZTtcclxufVxyXG5cclxuLnRvZ2dsZS11c2VyIGtlbmRvLXBvcHVwIC50b3AgLnVzZXItaW1hZ2UtbGFyZ2UsXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAudG9wIC5pbmZvIHtcclxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAudG9wIC51c2VyLWltYWdlLWxhcmdlIHtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIHdpZHRoOiA5MHB4O1xyXG4gICAgaGVpZ2h0OiA5MHB4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAyMHB4O1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuLnRvZ2dsZS11c2VyIGtlbmRvLXBvcHVwIC50b3AgLnVzZXItaW1hZ2UtbGFyZ2UgaW1nIHtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIHdpZHRoOiA5MHB4O1xyXG4gICAgaGVpZ2h0OiA5MHB4O1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuLnRvZ2dsZS11c2VyIGtlbmRvLXBvcHVwIC50b3AgLmVtcGxveWVlLW5hbWUge1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBtYXJnaW46IC00cHggMCAxcHggMDtcclxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLnRvZ2dsZS11c2VyIGtlbmRvLXBvcHVwIC50b3AgLnJvbGUtbmFtZSB7XHJcbiAgICBjb2xvcjogIzY2NjtcclxuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLnRvZ2dsZS11c2VyIGtlbmRvLXBvcHVwIC5ib3R0b20ge1xyXG4gICAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjO1xyXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIC4yKTtcclxuICAgIHBhZGRpbmc6IDEwcHggMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgZGlzcGxheTogdGFibGU7XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAuYm90dG9tPmRpdiB7XHJcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xyXG59XHJcblxyXG4udG9nZ2xlLXVzZXIga2VuZG8tcG9wdXAgLmJvdHRvbSAuay1idXR0b24ge1xyXG4gICAgbWFyZ2luOiAwIDIwcHg7XHJcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgYmFja2dyb3VuZDogI2Y4ZjhmODtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjNmM2YzY7XHJcbiAgICBjb2xvcjogIzY2NjtcclxuICAgIGN1cnNvcjogZGVmYXVsdDtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxufVxyXG5cclxuLnRvZ2dsZS11c2VyIGtlbmRvLXBvcHVwIC5ib3R0b20gLmNoYW5nZS1wYXNzIHtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAuYm90dG9tIC5sb2ctb3V0IHtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG59XHJcblxyXG4ubmF2LWl0ZW0tYnV0dG9uIHtcclxuICAgIG1hcmdpbi1yaWdodDogNHB4O1xyXG59XHJcblxyXG4uYnRuLW5hdiB7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI0ZGRkZGRjtcclxuICAgIGNvbG9yOiAjRkZGRkZGO1xyXG59XHJcblxyXG4ubmF2YmFyLWJyYW5kIHtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uaXRlbS1pbWcge1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIHdpZHRoOiA1MHB4O1xyXG4gICAgaGVpZ2h0OiA1MHB4O1xyXG59XHJcblxyXG4uc2VhcmNoZGl2IHtcclxuICAgIGZsb2F0OiByaWdodDtcclxufVxyXG5cclxuLnhzZWFyY2hkaXYge1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA1MHB4O1xyXG4gICAgbWFyZ2luLXRvcDogMTRweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ueHNlYXJjaGJ0biB7XHJcbiAgICBib3JkZXItdG9wOiAwO1xyXG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcclxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xyXG4gICAgaGVpZ2h0OiAzOHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5ub3RpZnkge1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgYmFja2dyb3VuZDogaW5oZXJpdDtcclxuICAgIGNvbG9yOiAjYWRiZGRjO1xyXG4gICAgYm9yZGVyOiAwO1xyXG59XHJcblxyXG4ubm90aWZ5IHNwYW4ge1xyXG4gICAgZm9udC1zaXplOiAzMHB4O1xyXG59XHJcblxyXG4ubm90aWZ5LXF1YW50aXR5IHtcclxuICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgIGNvbG9yOiAjRkZGRkZGO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgd2lkdGg6IDI1cHg7XHJcbiAgICBoZWlnaHQ6IDI1cHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICBiYWNrZ3JvdW5kOiByZWQ7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBwYWRkaW5nLXRvcDogNHB4O1xyXG4gICAgbWFyZ2luLWxlZnQ6IDE5cHg7XHJcbiAgICB6LWluZGV4OiA1O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBtYXJnaW4tdG9wOiAtNXB4O1xyXG59XHJcblxyXG4ubm90aWZ5LWNvbnRhaW5lciB7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q0ZTNlZTtcclxuICAgIHBhZGRpbmc6IDdweDtcclxuICAgIGhlaWdodDogNzNweDtcclxufVxyXG5cclxuLm5vdGlmeS1jb250YWluZXI6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNztcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLm5vdGlmeS1jb250YWluZXIgLmljb24ge1xyXG4gICAgbGluZS1oZWlnaHQ6IDI2cHg7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHdpZHRoOiAyNnB4O1xyXG4gICAgaGVpZ2h0OiAyNnB4O1xyXG4gICAgbWFyZ2luOiAwIDEwcHggMCAwO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTBweDtcclxuICAgIGNvbG9yOiAjZmZmO1xyXG4gICAgYm9yZGVyLWNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgYmFja2dyb3VuZDogIzAwNkNCNztcclxufVxyXG5cclxuLm5vdGlmeSxcclxuLm5vdGlmeSBpbWcge1xyXG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG59XHJcblxyXG4udG9nZ2xlLW5vdGlmeSBrZW5kby1wb3B1cCB7XHJcbiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7XHJcbiAgICByaWdodDogNzBweDtcclxuICAgIHRvcDogNDhweDtcclxuICAgIHdpZHRoOiAzODBweDtcclxuICAgIG1heC1oZWlnaHQ6IDM1MHB4O1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIC4yKTtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XHJcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgLjIpO1xyXG4gICAgei1pbmRleDogNDtcclxufVxyXG5cclxuLnRvZ2dsZS1ub3RpZnkgLnRpdGxlIHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgaGVpZ2h0OiAzMHB4O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMwMDUxZTk7XHJcbiAgICBwYWRkaW5nOiA1cHggMHB4IDBweCA3cHg7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuLnRvZ2dsZS1ub3RpZnkga2VuZG8tcG9wdXAgLnRvcCB7XHJcbiAgICBoZWlnaHQ6IDI1MXB4O1xyXG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xyXG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xyXG59XHJcblxyXG4udG9nZ2xlLW5vdGlmeSAuay1wb3B1cCB7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbn1cclxuXHJcbi50b2dnbGUtbm90aWZ5IGtlbmRvLXBvcHVwIC50b3AgLnVzZXItaW1hZ2UtbGFyZ2UsXHJcbi50b2dnbGUtbm90aWZ5IGtlbmRvLXBvcHVwIC50b3AgLmluZm8ge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgdmVydGljYWwtYWxpZ246IHRvcDtcclxufVxyXG5cclxuLnRvZ2dsZS1ub3RpZnkga2VuZG8tcG9wdXAgLnRvcCAudXNlci1pbWFnZS1sYXJnZSB7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICB3aWR0aDogOTBweDtcclxuICAgIGhlaWdodDogOTBweDtcclxuICAgIG1hcmdpbi1yaWdodDogMjBweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi50b2dnbGUtbm90aWZ5IGtlbmRvLXBvcHVwIC50b3AgLnVzZXItaW1hZ2UtbGFyZ2UgaW1nIHtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIHdpZHRoOiA5MHB4O1xyXG4gICAgaGVpZ2h0OiA5MHB4O1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuLnRvZ2dsZS1ub3RpZnkga2VuZG8tcG9wdXAgLnRvcCAuZW1wbG95ZWUtbmFtZSB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIG1hcmdpbjogLTRweCAwIDFweCAwO1xyXG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcblxyXG4udG9nZ2xlLW5vdGlmeSBrZW5kby1wb3B1cCAudG9wIC5yb2xlLW5hbWUge1xyXG4gICAgY29sb3I6ICM2NjY7XHJcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuXHJcbi50b2dnbGUtbm90aWZ5IGtlbmRvLXBvcHVwIC5ib3R0b20ge1xyXG4gICAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjO1xyXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIC4yKTtcclxuICAgIHBhZGRpbmc6IDEwcHggMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgZGlzcGxheTogdGFibGU7XHJcbn1cclxuXHJcbi50b2dnbGUtbm90aWZ5IGtlbmRvLXBvcHVwIC5ib3R0b20+ZGl2IHtcclxuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XHJcbn1cclxuXHJcbi50b2dnbGUtbm90aWZ5IGtlbmRvLXBvcHVwIC5ib3R0b20gLmstYnV0dG9uIHtcclxuICAgIG1hcmdpbjogMCAyMHB4O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIGJhY2tncm91bmQ6ICNmOGY4Zjg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYzZjNmM2O1xyXG4gICAgY29sb3I6ICM2NjY7XHJcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbn1cclxuXHJcbi50b2dnbGUtbm90aWZ5IGtlbmRvLXBvcHVwIC5ib3R0b20gLmNoYW5nZS1wYXNzIHtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbn1cclxuXHJcbi50b2dnbGUtbm90aWZ5IGtlbmRvLXBvcHVwIC5ib3R0b20gLmxvZy1vdXQge1xyXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XHJcbn1cclxuXHJcbi50aW1lIHtcclxuICAgIGZvbnQtc2l6ZTogMTFweDtcclxuICAgIGZsb2F0OiByaWdodDtcclxufVxyXG5cclxuLnRleHQge1xyXG4gICAgaGVpZ2h0OiAyMnB4O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4udGV4dDpob3ZlciB7XHJcbiAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmNtIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjc7XHJcbiAgICBjb2xvcjogI2ZmZmZmZjtcclxuICAgIHBhZGRpbmc6IDFweCA3cHg7XHJcbiAgICBmb250LXNpemU6IDExcHg7XHJcbn1cclxuXHJcbi5yb3cge1xyXG4gICAgbWFyZ2luLXRvcDogNXB4ICFpbXBvcnRhbnQ7XHJcbn0iXX0= */\"","module.exports = \"\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n \"","import { Component, OnInit, Output, Input, EventEmitter, OnDestroy } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AuthenticationService } from '../services/authentication.service';\r\nimport { AppService } from '../services/app.service';\r\nimport { AppComponent } from '../app.component';\r\nimport { AppSwal } from '../services/app.swal';\r\nimport { ResourceLoader } from '@angular/compiler';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Location } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-home',\r\n templateUrl: './home.component.html',\r\n styleUrls: ['./home.component.css']\r\n})\r\nexport class HomeComponent implements OnInit {\r\n @Output() searchChange = new EventEmitter();\r\n @Output() clickNotify = new EventEmitter();\r\n\r\n user: any;\r\n showToggleUser = false;\r\n uploadImageOpened = false;\r\n menus: any;\r\n check: number;\r\n searchOption = {\r\n searchString: ''\r\n };\r\n\r\n notify = {\r\n dispalyFlg: false,\r\n list: []\r\n };\r\n\r\n ngOnInit(): void {\r\n this.check = 0;\r\n }\r\n\r\n constructor(\r\n private router: Router,\r\n private authenticationService: AuthenticationService,\r\n private appService: AppService,\r\n private appComponent: AppComponent,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n public location: Location,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getMenu();\r\n this.getNotify();\r\n }\r\n\r\n async getMenu() {\r\n const roleID = this.user.RoleID;\r\n const result = await this.appService.doGET('api/Page/GetMenu', { roleID });\r\n if (result && result.Status === 1) {\r\n this.menus = result.Data;\r\n } else {\r\n this.appSwal.showError(result.Msg);\r\n }\r\n }\r\n\r\n async getNotify() {\r\n\r\n const result = await this.appService.doGET('api/MeetingNofity/GetNofity', null);\r\n if (result && result.Status === 1) {\r\n this.notify.list = result.Data;\r\n } else {\r\n this.appSwal.showError(result.Msg);\r\n }\r\n // this.notify.list.forEach(r => {\r\n // console.log(r.StartAt);\r\n // console.log(r.Today);\r\n // })\r\n }\r\n\r\n onNotifyClick(notify: any) {\r\n this.notify.dispalyFlg = false;\r\n const pageUrl = this.location.path();\r\n\r\n // if (notify.CommentFlg) {\r\n if (pageUrl && pageUrl.indexOf('data/schedule') < 0) {\r\n this.router.navigate(['data/schedule']);\r\n // , { queryParams: { menuID: notify.MenuID } }\r\n } else {\r\n this.clickNotify.emit(notify.MenuID);\r\n }\r\n // }\r\n\r\n }\r\n\r\n onChangePasswordPage($event) {\r\n this.router.navigate(['change-password']);\r\n }\r\n\r\n onToggleUser() {\r\n this.notify.dispalyFlg = false;\r\n this.showToggleUser = !this.showToggleUser;\r\n }\r\n\r\n onToggleNotify() {\r\n this.showToggleUser = false;\r\n this.notify.dispalyFlg = !this.notify.dispalyFlg;\r\n }\r\n\r\n\r\n onLogOut() {\r\n this.authenticationService.doSignout();\r\n this.router.navigate(['login']);\r\n //window.location.reload();\r\n }\r\n\r\n onClickMenu(pageUrl) {\r\n this.router.navigate([pageUrl]);\r\n }\r\n\r\n onUploadImageClose(status) {\r\n this.uploadImageOpened = false;\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n }\r\n\r\n onUploadImage() {\r\n this.showToggleUser = false;\r\n this.uploadImageOpened = true;\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n onSearch() {\r\n const searchString = this.searchOption.searchString;\r\n this.router.navigate(['wo/issue'], { queryParams: { searchparam: searchString } });\r\n this.emitSearchChange(searchString);\r\n }\r\n\r\n emitSearchChange(searchString) {\r\n this.searchChange.emit(searchString);\r\n }\r\n}\r\n","module.exports = \".bg a>img {\\r\\n height: 40px;\\r\\n width: 50px;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\ndiv.bg a>span {\\r\\n color: white;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n left: 53px;\\r\\n font-size: 24px;\\r\\n font-family: 'Open Sans', sans-serif;\\r\\n ;\\r\\n font-weight: bold;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n}\\r\\n\\r\\n.bg {\\r\\n background-color: #006CB7;\\r\\n background-repeat: no-repeat;\\r\\n background-size: 100% 100%;\\r\\n width: 100%;\\r\\n height: 56px;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\n.login-container {\\r\\n height: 664px;\\r\\n margin-top: -10px !important;\\r\\n}\\r\\n\\r\\nbody {\\r\\n font-size: 50px;\\r\\n}\\r\\n\\r\\nsection {\\r\\n border: 0.5px solid #65656552;\\r\\n border-radius: 40px;\\r\\n position: fixed;\\r\\n height: 300px;\\r\\n max-width: 400px;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n left: 0;\\r\\n margin: auto;\\r\\n background-color: #ffffff;\\r\\n color: black;\\r\\n padding: 0px 30px;\\r\\n}\\r\\n\\r\\ninput {\\r\\n border-bottom-color: whitesmoke;\\r\\n color: #FFFFFF;\\r\\n}\\r\\n\\r\\n.login-button-container {\\r\\n margin-top: 20px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.login-button-container button {\\r\\n padding: 10px 20px;\\r\\n}\\r\\n\\r\\n.languages {\\r\\n position: relative;\\r\\n margin: -13px;\\r\\n top: 42px;\\r\\n background-color: inherit;\\r\\n}\\r\\n\\r\\n.fa-language {\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\n.k-button.k-primary.k-outline {\\r\\n color: rgb(0, 38, 119);\\r\\n}\\r\\n\\r\\nfooter {\\r\\n display: none !important;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvbG9naW4vbG9naW4uY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLFlBQVk7SUFDWixXQUFXO0lBQ1gsTUFBTTtJQUNOLFNBQVM7SUFDVCxZQUFZO0lBQ1osa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixNQUFNO0lBQ04sU0FBUztJQUNULFlBQVk7SUFDWixVQUFVO0lBQ1YsZUFBZTtJQUNmLG9DQUFvQzs7SUFFcEMsaUJBQWlCO0lBQ2pCLDJCQUFtQjtJQUFuQix3QkFBbUI7SUFBbkIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1QiwwQkFBMEI7SUFDMUIsV0FBVztJQUNYLFlBQVk7SUFDWixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsNEJBQTRCO0FBQ2hDOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3QixtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLFlBQVk7SUFDWix5QkFBeUI7SUFDekIsWUFBWTtJQUNaLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLCtCQUErQjtJQUMvQixjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsU0FBUztJQUNULHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSx3QkFBd0I7QUFDNUIiLCJmaWxlIjoic3JjL2FwcC9sb2dpbi9sb2dpbi5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmJnIGE+aW1nIHtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIHdpZHRoOiA1MHB4O1xyXG4gICAgdG9wOiAwO1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG59XHJcblxyXG5kaXYuYmcgYT5zcGFuIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIG1hcmdpbjogYXV0bztcclxuICAgIGxlZnQ6IDUzcHg7XHJcbiAgICBmb250LXNpemU6IDI0cHg7XHJcbiAgICBmb250LWZhbWlseTogJ09wZW4gU2FucycsIHNhbnMtc2VyaWY7XHJcbiAgICA7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGhlaWdodDogZml0LWNvbnRlbnQ7XHJcbn1cclxuXHJcbi5iZyB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDU2cHg7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbn1cclxuXHJcbi5sb2dpbi1jb250YWluZXIge1xyXG4gICAgaGVpZ2h0OiA2NjRweDtcclxuICAgIG1hcmdpbi10b3A6IC0xMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbmJvZHkge1xyXG4gICAgZm9udC1zaXplOiA1MHB4O1xyXG59XHJcblxyXG5zZWN0aW9uIHtcclxuICAgIGJvcmRlcjogMC41cHggc29saWQgIzY1NjU2NTUyO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNDBweDtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIGhlaWdodDogMzAwcHg7XHJcbiAgICBtYXgtd2lkdGg6IDQwMHB4O1xyXG4gICAgdG9wOiAwO1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcclxuICAgIGNvbG9yOiBibGFjaztcclxuICAgIHBhZGRpbmc6IDBweCAzMHB4O1xyXG59XHJcblxyXG5pbnB1dCB7XHJcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZXNtb2tlO1xyXG4gICAgY29sb3I6ICNGRkZGRkY7XHJcbn1cclxuXHJcbi5sb2dpbi1idXR0b24tY29udGFpbmVyIHtcclxuICAgIG1hcmdpbi10b3A6IDIwcHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5sb2dpbi1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XHJcbn1cclxuXHJcbi5sYW5ndWFnZXMge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgbWFyZ2luOiAtMTNweDtcclxuICAgIHRvcDogNDJweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XHJcbn1cclxuXHJcbi5mYS1sYW5ndWFnZSB7XHJcbiAgICBmb250LXNpemU6IDMwcHg7XHJcbn1cclxuXHJcbi5rLWJ1dHRvbi5rLXByaW1hcnkuay1vdXRsaW5lIHtcclxuICAgIGNvbG9yOiByZ2IoMCwgMzgsIDExOSk7XHJcbn1cclxuXHJcbmZvb3RlciB7XHJcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbn0iXX0= */\"","module.exports = \"\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n {{ 'Login' | translate }} \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\"","import { Component, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AuthenticationService } from '../services/authentication.service';\r\nimport { AppService } from '../services/app.service';\r\nimport { URLSearchParams } from '@angular/http';\r\nimport { AppComponent } from '../app.component';\r\nimport { AppLanguage } from '../services/app.language';\r\nimport { AppSwal } from '../services/app.swal';\r\n\r\n@Component({\r\n selector: 'app-login',\r\n templateUrl: './login.component.html',\r\n styleUrls: ['./login.component.css']\r\n})\r\nexport class LoginComponent implements OnInit {\r\n\r\n loginInfo = {\r\n UserName: '',\r\n Password: ''\r\n };\r\n\r\n languageName = '';\r\n\r\n languages: Array = [{\r\n id: 0,\r\n culture: 'vi-VN',\r\n text: 'Tiếng Việt',\r\n click: (dataItem) => {\r\n this.onChangeLanguage(dataItem);\r\n }\r\n }, {\r\n id: 1,\r\n culture: 'en-US',\r\n text: 'English',\r\n click: (dataItem) => {\r\n this.onChangeLanguage(dataItem);\r\n }\r\n }];\r\n\r\n constructor(\r\n private router: Router,\r\n private authenticationService: AuthenticationService,\r\n private appService: AppService,\r\n private appComponent: AppComponent,\r\n private language: AppLanguage,\r\n private appSwal: AppSwal\r\n ) {\r\n this.getLanguageName();\r\n }\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n async onLogin() {\r\n this.appComponent.loading = true;\r\n const result = await this.authenticationService.doSignIn(this.loginInfo.UserName, this.loginInfo.Password);\r\n if (result.Status === 1) {\r\n const pageUrlRollback = localStorage.getItem('PageUrlRollback');\r\n if (pageUrlRollback) {\r\n localStorage.removeItem('PageUrlRollback');\r\n this.router.navigate([pageUrlRollback]);\r\n } else {\r\n this.router.navigate(['dashboard']);\r\n // this.router.navigate(['data/post']);\r\n }\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n onChangeLanguage(dataItem) {\r\n this.appComponent.switchLanguage(dataItem.culture);\r\n this.getLanguageName();\r\n }\r\n\r\n getLanguageName() {\r\n let lang = this.language.get();\r\n if (!lang) {\r\n lang = 'vi-VN';\r\n this.appComponent.switchLanguage(lang);\r\n }\r\n const language = this.languages.find(item => {\r\n return item.culture === lang;\r\n });\r\n\r\n if (language) { this.languageName = language.text; }\r\n }\r\n\r\n onKeyPress(e: any) {\r\n if (e.keyCode === 13) {\r\n this.onLogin();\r\n }\r\n }\r\n}\r\n","module.exports = \".img-grid {\\r\\n width: 30px;\\r\\n height: 24px;\\r\\n margin-right: 20px;\\r\\n}\\r\\n.img-grid:hover,\\r\\n.img-slide:hover {\\r\\n border:1px solid #006CB7;\\r\\n}\\r\\n.img-grid:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n.img-slide {\\r\\n width: 30px;\\r\\n height: 24px;\\r\\n margin-right: 20px;\\r\\n}\\r\\n.img-slide:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n::ng-deep .no-indicators .carousel-indicators {\\r\\n display: none;\\r\\n }\\r\\n/* grid image */\\r\\n.img-detail-small {\\r\\n height: 170px;\\r\\n background-size: cover;\\r\\n background-repeat: no-repeat;\\r\\n background-position: center center;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n.img-detail-medium {\\r\\n height: 225px;\\r\\n background-size: cover;\\r\\n background-repeat: no-repeat;\\r\\n background-position: center center;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n.img-detail-large {\\r\\n height: 280px;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n background-position: center center;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n/* @media only screen and (min-width: 768px) {\\r\\n .no-pl-fist-line {\\r\\n padding-right: 0px;\\r\\n }\\r\\n .no-pl-second-line {\\r\\n padding-right: 0px;\\r\\n padding-left: 0px;\\r\\n }\\r\\n} */\\r\\n.portal .group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n}\\r\\n.btnLink{\\r\\n background-color: DodgerBlue;\\r\\n border: none;\\r\\n color: white;\\r\\n /* padding: 12px 16px; */\\r\\n font-size: 16px;\\r\\n cursor: pointer;\\r\\n position: absolute;\\r\\n right: 15px;\\r\\n z-index: 1;\\r\\n}\\r\\n.btnLink:hover {\\r\\n background-color: RoyalBlue;\\r\\n }\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvbS9tYW5hZ2UtbXVsdGltZWRpYS9tYW5hZ2UtbXVsdGltZWRpYS5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixrQkFBa0I7QUFDdEI7QUFDQTs7SUFFSSx3QkFBd0I7QUFDNUI7QUFFQTtJQUNJLGVBQWU7QUFDbkI7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osa0JBQWtCO0FBQ3RCO0FBQ0E7SUFDSSxlQUFlO0FBQ25CO0FBRUE7SUFDSSxhQUFhO0VBQ2Y7QUFFRixlQUFlO0FBQ2Y7SUFDSSxhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLDRCQUE0QjtJQUM1QixrQ0FBa0M7SUFDbEMsbUJBQW1CO0FBQ3ZCO0FBRUE7SUFDSSxhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLDRCQUE0QjtJQUM1QixrQ0FBa0M7SUFDbEMsbUJBQW1CO0FBQ3ZCO0FBRUE7SUFDSSxhQUFhO0lBQ2Isd0JBQXdCO0lBQ3hCLDRCQUE0QjtJQUM1QixrQ0FBa0M7SUFDbEMsbUJBQW1CO0FBQ3ZCO0FBRUE7Ozs7Ozs7O0dBUUc7QUFFSDtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7QUFDeEI7QUFDQTtJQUNJLDRCQUE0QjtJQUM1QixZQUFZO0lBQ1osWUFBWTtJQUNaLHdCQUF3QjtJQUN4QixlQUFlO0lBQ2YsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsVUFBVTtBQUNkO0FBQ0E7SUFDSSwyQkFBMkI7RUFDN0IiLCJmaWxlIjoic3JjL2FwcC9tL21hbmFnZS1tdWx0aW1lZGlhL21hbmFnZS1tdWx0aW1lZGlhLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuaW1nLWdyaWQge1xyXG4gICAgd2lkdGg6IDMwcHg7XHJcbiAgICBoZWlnaHQ6IDI0cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XHJcbn1cclxuLmltZy1ncmlkOmhvdmVyLFxyXG4uaW1nLXNsaWRlOmhvdmVyIHtcclxuICAgIGJvcmRlcjoxcHggc29saWQgIzAwNkNCNztcclxufVxyXG5cclxuLmltZy1ncmlkOmhvdmVyIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLmltZy1zbGlkZSB7XHJcbiAgICB3aWR0aDogMzBweDtcclxuICAgIGhlaWdodDogMjRweDtcclxuICAgIG1hcmdpbi1yaWdodDogMjBweDtcclxufVxyXG4uaW1nLXNsaWRlOmhvdmVyIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuOjpuZy1kZWVwIC5uby1pbmRpY2F0b3JzIC5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG5cclxuLyogZ3JpZCBpbWFnZSAqL1xyXG4uaW1nLWRldGFpbC1zbWFsbCB7XHJcbiAgICBoZWlnaHQ6IDE3MHB4O1xyXG4gICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcclxuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XHJcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxufVxyXG5cclxuLmltZy1kZXRhaWwtbWVkaXVtIHtcclxuICAgIGhlaWdodDogMjI1cHg7XHJcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG59XHJcblxyXG4uaW1nLWRldGFpbC1sYXJnZSB7XHJcbiAgICBoZWlnaHQ6IDI4MHB4O1xyXG4gICAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG59XHJcblxyXG4vKiBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7XHJcbiAgICAubm8tcGwtZmlzdC1saW5lIHtcclxuICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7XHJcbiAgICB9XHJcbiAgICAubm8tcGwtc2Vjb25kLWxpbmUge1xyXG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDBweDtcclxuICAgICAgICBwYWRkaW5nLWxlZnQ6IDBweDtcclxuICAgIH1cclxufSAqL1xyXG5cclxuLnBvcnRhbCAuZ3JvdXAtaGVhZGVyIHtcclxuICAgIHBhZGRpbmctdG9wOiAxM3B4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEzcHg7XHJcbn1cclxuLmJ0bkxpbmt7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBEb2RnZXJCbHVlO1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgLyogcGFkZGluZzogMTJweCAxNnB4OyAqL1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgcmlnaHQ6IDE1cHg7XHJcbiAgICB6LWluZGV4OiAxO1xyXG59XHJcbi5idG5MaW5rOmhvdmVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IFJveWFsQmx1ZTtcclxuICB9Il19 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
{{item.Name}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n Video không tồn tại\\r\\n \\r\\n
{{item.Name}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, UploadEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AppConsts } from 'src/app/services/app.consts';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { GroupResult, groupBy } from '@progress/kendo-data-query';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ActivatedRoute } from '@angular/router';\r\n\r\n\r\n@Component({\r\n selector: 'app-manage-multimedia',\r\n templateUrl: './manage-multimedia.component.html',\r\n styleUrls: ['./manage-multimedia.component.css']\r\n})\r\n\r\nexport class ManageMultimediaComponent implements OnInit {\r\n \r\n\r\n user: any;\r\n loading = false;\r\n\r\n MenuMutilmedia_ID = '';\r\n\r\n dataFiles = [];\r\n dataFileSelectableSettings: SelectableSettings;\r\n dataFileSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n\r\n dataFileSortByField: SortDescriptor[] = [\r\n ];\r\n\r\n public events: string[] = [];\r\n\r\n\r\n public fileSaveUrl: any;\r\n\r\n\r\n //used for kendo grid\r\n public WORKING_NUM_PAGING_SKIP = 0;\r\n public WORKING_NUM_PAGING_TAKE = 50;\r\n public WORKING_NUM_PAGING_BTN = 5;\r\n public buttonCount = this.WORKING_NUM_PAGING_BTN;\r\n // paging in grid\r\n dataFileSkip = this.WORKING_NUM_PAGING_SKIP;\r\n dataFilePageSize = this.WORKING_NUM_PAGING_TAKE;\r\n\r\n dataFileSelection: string[] = []; //to store track of selected rows by ID\r\n dataFileItem: any; //selected record\r\n myInterval: any; //interval time to do async jobs periodically in Observable\r\n\r\n // vars are used for showed FileUrls file\r\n dataFileIDFileUrl: any;\r\n dataFileIDFileUrls: any[];\r\n\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n // kendo grid\r\n public dataFileState: State = {\r\n skip: this.dataFileSkip,\r\n take: this.dataFileSkip + this.dataFilePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n // data source for kendo grid\r\n dataFileGridDataResult: GridDataResult;\r\n\r\n roles: Array<{ ID: string, Name: string }>;\r\n rolesFilter: Array<{ ID: string, Name: string }>;\r\n\r\n // 'Phân quyền tài liệu' kendo-combobox\r\n AssignUnitsFiles: Array = []; // { ID: string, Name: string, GroupBy : string }\r\n AssignUnitsFilesFilter: Array = [];\r\n AssignUnitsFiles_GroupResult: GroupResult[];\r\n\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n pageName: any;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n filesUpload: Array;\r\n filesUploadName = \"\";\r\n infoOpened = false;\r\n allowInsertFile = false;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n private notification: Notification,\r\n private file: AppFile,\r\n private consts: AppConsts,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appComponent: AppComponent,\r\n private appGuid: AppGuid,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.getPageName();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.get4Type();\r\n this.getSearchMenus();\r\n this.getFileType();\r\n //this.getMenus();\r\n this.onReload();\r\n this.initDisplay();\r\n this.allData = this.allData.bind(this);\r\n }\r\n\r\n // used to export all kendo-grid data(not care for paging) to excel file(s)\r\n public allData(): ExcelExportData {\r\n this.appComponent.loading = true;\r\n const result: ExcelExportData = {\r\n data: process(this.dataFiles, { sort: this.dataFileSortByField }).data\r\n };\r\n this.appComponent.loading = false;\r\n return result;\r\n }\r\n\r\n rolesHandleFilter(value) {\r\n this.rolesFilter = this.roles.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n AssignUnitsFilesHandleFilter(value) {\r\n this.AssignUnitsFilesFilter = this.AssignUnitsFiles.filter((s) => s.ID != null);\r\n this.AssignUnitsFiles_GroupResult = groupBy(this.AssignUnitsFilesFilter, [{ field: \"GroupBy\" }]);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.allowMulti = !this.allowMulti;\r\n this.dataFileSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getFiles() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText,\r\n menuid: this.searchMenuText,\r\n type: 0\r\n };\r\n\r\n const result = await this.appService.doGET('api/File/Search', dataRequest);\r\n if (result) {\r\n this.dataFiles = result.Data;\r\n this.bindFiles();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n for (let i = this.dataFileSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataFiles.find((item) => {\r\n return item.ID === this.dataFileSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataFileSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n public GUID_EMPTY = \"00000000-0000-0000-0000-000000000000\";\r\n dataFileItemtemp: any;\r\n setDefault() {\r\n this.dataFileItem = {\r\n IsAdd: true,\r\n ID: null,\r\n Name: '',\r\n LinkUrl: '',\r\n FileUrl: '',\r\n MenuID: this.GUID_EMPTY,\r\n Type: 0,\r\n HotFlg: false,\r\n ActivedFlg: false,\r\n BannerType: -1,\r\n OrderIdx: 0,\r\n CreateAt: null\r\n };\r\n this.dataFileItemtemp = {\r\n IsAdd: true,\r\n ID: null,\r\n Name: '',\r\n LinkUrl: '',\r\n FileUrl: '',\r\n MenuID: this.GUID_EMPTY,\r\n Type: 0,\r\n HotFlg: false,\r\n ActivedFlg: false,\r\n BannerType: -1,\r\n OrderIdx: 0,\r\n CreateAt: null\r\n };\r\n this.MenuMutilmedia_ID = '';\r\n this.searchMenuText = \"all\";\r\n this.searchFiletype = 0;\r\n this.filesUpload = [];\r\n this.filesUploadName = \"\";\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.dataFileSelection = [];\r\n this.dataFileItemtemp.UserName = this.user.UserName;\r\n }\r\n\r\n bindtemp(item) {\r\n this.dataFileItemtemp.ID = item.ID;\r\n this.dataFileItemtemp.Name = item.Name;\r\n this.dataFileItemtemp.LinkUrl = item.LinkUrl;\r\n this.dataFileItemtemp.FileUrl = item.FileUrl;\r\n this.dataFileItemtemp.ActivedFlg = item.ActivedFlg;\r\n this.dataFileItemtemp.HotFlg = item.HotFlg;\r\n this.dataFileItemtemp.MenuID = item.MenuID;\r\n this.dataFileItemtemp.Type = item.Type;\r\n this.dataFileItemtemp.BannerType = item.BannerType;\r\n this.dataFileItemtemp.OrderIdx = item.OrderIdx;\r\n this.dataFileItemtemp.CreateAt = item.CreateAt;\r\n }\r\n\r\n onFilePageChange(event: PageChangeEvent) {\r\n this.dataFileSkip = event.skip;\r\n this.bindFiles();\r\n }\r\n\r\n // handle event of SelectedKeysChange\r\n async onFileSelectedKeysChange(event) {\r\n if (this.dataFileSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n // flag to check multi-select allowed\r\n if (this.dataFileSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n }\r\n // single select\r\n else {\r\n const selectedID = this.dataFileSelection[0];\r\n const selectedItem = this.dataFiles.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataFileItem = selectedItem;\r\n this.bindtemp(this.dataFileItem);\r\n //show file uploaded\r\n this.filesUpload = [];\r\n this.filesUploadName = this.getFileName(this.dataFileItem.FileUrl);\r\n\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n // rebinding data onto kendo grid based on current page\r\n bindFiles() {\r\n this.dataFileGridDataResult = {\r\n data: orderBy(this.dataFiles, this.dataFileSortByField),\r\n total: this.dataFiles.length\r\n };\r\n\r\n this.dataFileGridDataResult = process(this.dataFiles, this.dataFileState);\r\n }\r\n\r\n onFileSortChange(sort: SortDescriptor[]): void {\r\n this.dataFileSortByField = sort;\r\n this.bindFiles();\r\n }\r\n\r\n public onFileDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataFileSelection = [];\r\n this.dataFileState = state;\r\n this.dataFileGridDataResult = process(this.dataFiles, this.dataFileState);\r\n }\r\n\r\n // column titles of kendo-grid. support for reading .xlsx files\r\n getColumnIndex(name) {\r\n let columns = [];\r\n columns = [\r\n 'Code',\r\n 'SerialNo',\r\n 'Title',\r\n 'Description',\r\n 'UserName',\r\n 'AssignUnits',\r\n 'FileUrls',\r\n 'DelFlg'\r\n ];\r\n return columns.indexOf(name);\r\n }\r\n\r\n // only read the first sheet of .xlsx files and rebind onto kendo grid\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n this.dataFiles = [];\r\n for (let i = 1; i < fileData.length; i++) {\r\n if (fileData[i].length > 1) {\r\n this.dataFiles.push({\r\n IsAdd: false,\r\n Code: fileData[i][this.getColumnIndex('Code')],\r\n SerialNo: fileData[i][this.getColumnIndex('SerialNo')],\r\n Title: fileData[i][this.getColumnIndex('Title')],\r\n Description: fileData[i][this.getColumnIndex('Description')],\r\n UserName: fileData[i][this.getColumnIndex('UserName')],\r\n AssignUnits: fileData[i][this.getColumnIndex('AssignUnits')],\r\n FileUrls: fileData[i][this.getColumnIndex('FileUrls')],\r\n DelFlg: fileData[i][this.getColumnIndex('DelFlg')]\r\n });\r\n }\r\n }\r\n this.dataFileSelection = [];\r\n this.bindFiles();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // Fires when an uploaded .xlsx file is about to be removed\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n\r\n\r\n // handle changed search-text event\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n this.getFiles();\r\n }\r\n\r\n async initDisplay() {\r\n const resultRole = await this.appService.doGET('api/Role', null);\r\n if (resultRole && resultRole.Status === 1) {\r\n this.roles = resultRole.Data;\r\n this.rolesFilter = this.roles.slice();\r\n }\r\n }\r\n\r\n onSearch() {\r\n this.getFiles();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.getFiles();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n // no use\r\n onClearFile() {\r\n this.setDefault();\r\n }\r\n\r\n // handle event of multi-select allowed button\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n // handle button AddNew\r\n onAddNewFile() {\r\n this.setDefault();\r\n\r\n this.infoOpened = true;\r\n }\r\n\r\n onSaveFile() {\r\n if (this.dataFileItem.IsAdd) {\r\n this.addFile();\r\n }\r\n else {\r\n this.updateFile();\r\n }\r\n }\r\n\r\n // store all current data records on kendo grid into db such as data read from .xlsx files\r\n async onSaveFiles() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n for (let i = 0; i < this.dataFiles.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataFiles[i]));\r\n }\r\n const result = await this.appService.doPOST('api/File/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // create request sent to server to add new or update data record\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataFileItemtemp;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n LinkUrl: temp.LinkUrl,\r\n FileUrl: temp.FileUrl,\r\n Type: 0,\r\n //MenuID: temp.MenuID,\r\n MenuID: this.selectedItem,\r\n ActivedFlg: true,\r\n HotFlg: temp.BannerType === 0 || temp.BannerType === 1,\r\n OrderIdx: temp.OrderIdx,\r\n BannerType: temp.BannerType,\r\n CreateAt: temp.CreateAt\r\n };\r\n }\r\n\r\n // handle event of editing selected file\r\n onEditFile() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n\r\n async addFile() {\r\n this.appComponent.loading = true;\r\n this.dataFileItemtemp.ID = this.appGuid.create();\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/File/AddFile', dataRequest);\r\n if (result) {\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewFile();\r\n this.dataFileSelection = [];\r\n this.infoOpened = false;\r\n } else if (result && result.Status !== 1) {\r\n if (typeof (result.Msg) != 'undefined' && result.Msg != null) {\r\n this.appSwal.showError(result.Msg);\r\n }\r\n }\r\n else {\r\n this.appSwal.showError(JSON.stringify(result));\r\n }\r\n } else {\r\n this.appSwal.showError(\"Don't connect server API!\");\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateFile() {\r\n this.appComponent.loading = true;\r\n const id = this.dataFileItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPUT('api/File/UpdateFile', dataRequest, { id });\r\n if (result) {\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewFile();\r\n this.dataFileSelection = [];\r\n this.infoOpened = false;\r\n } else if (result && result.Status !== 1) {\r\n if (typeof (result.Msg) != 'undefined' && result.Msg != null) {\r\n this.appSwal.showError(result.Msg);\r\n }\r\n }\r\n else {\r\n this.appSwal.showError(JSON.stringify(result));\r\n }\r\n } else {\r\n this.appSwal.showError(\"Don't connect server API!\");\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // delete multi data records\r\n async onDeleteFile() {\r\n if (this.dataFileSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataFileSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPUT('api/File/Deletes', dataRequest, null);\r\n // if delete all ok\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.dataFileItem.UserName = '';\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataFileSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n //select file to upload\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return;\r\n }\r\n\r\n const extension = e.files[0].extension.toLowerCase();\r\n\r\n this.allowInsertFile = true;\r\n\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n\r\n // tslint:disable-next-line: max-line-length\r\n if (!extension || (extension.toLowerCase() !== '.png' && extension.toLowerCase() !== '.jpg' && extension.toLowerCase() !== '.jpeg')) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .png, .jpg, .jpeg', false);\r\n // this.dataTemplateFileUrls = [];\r\n // this.bindTemplateFileUrls();\r\n\r\n return false;\r\n }\r\n }\r\n\r\n //remove file to upload\r\n onRemoveFileToUpload() {\r\n this.dataFileItemtemp.FileUrl = '';\r\n this.filesUploadName = '';\r\n this.filesUpload = [];\r\n }\r\n\r\n public uploadRestrictions: FileRestrictions = {\r\n allowedExtensions: ['.jpg', '.jpeg', '.tif', '.gif', '.webm', '.mkv', '.flv', '.vob', '.ogv', '.ogg', '.avi', '.TS', '.mov', '.qt', '.wmv', '.yuv', '.rm', '.rmvb', '.asf', '.amv', '.mp4', '.m4p', '.m4v', '.mpg', '.mp2', '.mpeg', '.mpe', '.mpv', '.m2v', '.3gp', '.3g2', '.svi', '.nsv', '.f4v', '.f4p', '.f4a', '.f4b', '.MTS', '.M2TS', '.png']\r\n };\r\n\r\n //success upload\r\n onSuccessFileToUpload(e: any) {\r\n\r\n if (!this.allowInsertFile) {\r\n return;\r\n }\r\n\r\n try {\r\n if (e.response.body.Data.MediaNm[0].match(/.(jpg|jpeg|tif|png|gif)$/i)) {\r\n this.dataFileItemtemp.Type = 0;\r\n } else if (e.response.body.Data.MediaNm[0].match(/.(webm|mkv|flv|vob|ogv|ogg|avi|TS|mov|qt|wmv|yuv|rm|rmvb|asf|amv|mp4|m4p|m4v|mpg|mp2|mpeg|mpe|mpv|m2v|3gp|3g2|svi|nsv|f4v|f4p|f4a|f4b|MTS|M2TS)$/i)) {\r\n this.dataFileItemtemp.Type = 1;\r\n }\r\n else {\r\n this.filesUpload = [];\r\n this.onRemoveFileToUpload();\r\n this.appSwal.showWarning(this.translate.instant('File_IncorrectFormat'), false);\r\n return;\r\n }\r\n this.dataFileItemtemp.FileUrl = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n } catch {\r\n this.filesUpload = [];\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n getFileName(fileUrls) {\r\n var nameFile = \"temp.txt\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n\r\n parentMenus: Array<{ Name: string, ID: string }>;\r\n parentMenusFilter: Array<{ Name: string, ID: string }>;\r\n\r\n parentMenusHandleFilter(value) {\r\n this.parentMenusFilter = this.parentMenus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n async getMenus() {\r\n this.loading = true;\r\n const dataRequest = {\r\n pageID: 'portal/multimedia'\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/GetMenuMultimedia', null);\r\n if (result) {\r\n this.parentMenus = [];\r\n result.Data.forEach(item => {\r\n this.parentMenus.push(item);\r\n });\r\n this.parentMenusFilter = this.parentMenus.slice();\r\n }\r\n this.loading = false;\r\n }\r\n\r\n Types: Array<{ Name: string, ID: number }>;\r\n TypesFilter: Array<{ Name: string, ID: number }>;\r\n\r\n get4Type() {\r\n this.Types = [\r\n { Name: 'Không hiển thị (Trang chủ)', ID: -1 },\r\n { Name: 'Banner trái (Trang chủ)', ID: 0 },\r\n { Name: 'Banner phải (Trang chủ)', ID: 1 }\r\n ];\r\n this.TypesFilter = this.Types.slice();\r\n this.loading = false;\r\n }\r\n\r\n searchMenus: Array<{ Name: string, ID: string }>;\r\n searchMenusFilter: Array<{ Name: string, ID: string }>;\r\n\r\n searchMenusHandleFilter(value) {\r\n this.searchMenusFilter = this.searchMenus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n async getSearchMenus() {\r\n\r\n this.loading = true;\r\n const dataRequest = {\r\n pageID: 'portal/multimedia'\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/GetMenuMultimedia', null);\r\n if (result) {\r\n this.searchMenus = [];\r\n \r\n const HA = {\r\n PName: 'Hình Ảnh', Type: 1, child: []\r\n };\r\n // const VID = {\r\n // PName: 'Video', Type: 0, child: []\r\n // };\r\n \r\n //this.data = result.Data;\r\n result.Data.forEach(item => {\r\n this.searchMenus.push(item);\r\n if(item.PageID === \"portal/multimedia\"){\r\n const temp = {\r\n PName: item.Name, IDchild: item.ID\r\n };\r\n HA.child.push(temp);\r\n }\r\n else{\r\n const temp = {\r\n PName: item.Name, IDchild: item.ID\r\n };\r\n //VID.child.push(temp)\r\n }\r\n });\r\n this.data.push(HA);\r\n //this.data.push(VID);\r\n console.info(this.data);\r\n this.searchMenusFilter = this.searchMenus.slice();\r\n }\r\n this.loading = false;\r\n }\r\n public data: any[] = [];\r\n public selectedKeys: any[];\r\n public menuID: any;\r\n imagesGrid: any;\r\n imagesSlide: any;\r\n isGridMode = true;\r\n videos: any;\r\n img = false;\r\n vid = false;\r\n async getImages(ID) {\r\n this.menuID = ID;\r\n const dataRequest = {\r\n menuID: this.menuID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/ImageManage', dataRequest);\r\n if (result) {\r\n this.imagesGrid = result.Data;\r\n this.imagesSlide = result.Data.SlideViewData;\r\n }\r\n }\r\n async getVideos(ID) {\r\n this.menuID = ID;\r\n const dataRequest = {\r\n menuID: this.menuID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/Video', dataRequest);\r\n if (result) {\r\n this.videos = result.Data;\r\n }\r\n }\r\n linkVid: any;\r\n public selectedItem;\r\n public handleSelection({ index }: any): void {\r\n this.selectedKeys = [index];\r\n /*Get Parent Node*/\r\n var id = this.selectedKeys.toString();\r\n var idx = id.substring(0, 1);\r\n var Type = this.data[idx].Type;\r\n if(Type == 1){\r\n this.img = true;\r\n this.vid = false;\r\n var tempChild = this.data[idx].child;\r\n\r\n /*Get Child by Parent*/\r\n var child_idx = id.substring(id.length - 1, id.length);\r\n this.MenuMutilmedia_ID = tempChild[child_idx].IDchild;\r\n this.getImages(this.MenuMutilmedia_ID);\r\n this.selectedItem = this.MenuMutilmedia_ID;\r\n this.getMenus();\r\n }\r\n else{\r\n this.img = false;\r\n this.vid = true;\r\n console.info(this.data[idx].child);\r\n var tempChild = this.data[idx].child;\r\n\r\n /*Get Child by Parent*/\r\n var child_idx = id.substring(id.length - 1, id.length);\r\n this.MenuMutilmedia_ID = tempChild[child_idx].IDchild;\r\n this.getVideos(this.MenuMutilmedia_ID);\r\n console.info(this.MenuMutilmedia_ID);\r\n this.dataFileItemtemp.MenuID = this.MenuMutilmedia_ID;\r\n console.info(this.dataFileItemtemp.MenuID);\r\n this.getMenus();\r\n }\r\n }\r\n item_ID: any;\r\n link: any;\r\n async getLink(ID){\r\n this.item_ID = ID;\r\n const dataRequest = {\r\n menuId: this.item_ID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/getLink', dataRequest);\r\n if (result) {\r\n this.link = this.appService.apiRoot + result.Data;\r\n document.addEventListener('copy', (e: ClipboardEvent) => {\r\n e.clipboardData.setData('text/plain', (this.link));\r\n e.preventDefault();\r\n document.removeEventListener('copy', null);\r\n });\r\n document.execCommand('copy');\r\n \r\n }\r\n }\r\n public onGetLink(ID_item){\r\n this.getLink(ID_item);\r\n }\r\n\r\n searchMenuText: string;\r\n searchFiletype: number;\r\n\r\n FileTypes: Array<{ Name: string, ID: number }>;\r\n FileTypesFilter: Array<{ Name: string, ID: number }>;\r\n getFileType() {\r\n var a = [];\r\n a[0] = this.translate.instant('allMenu');\r\n a[1] = this.translate.instant('FileImage');\r\n a[2] = this.translate.instant('FileVideo');\r\n this.FileTypes = [];\r\n for (let i = 0; i < 3; i++) {\r\n this.FileTypes.push({\r\n ID: i,\r\n Name: a[i]\r\n });\r\n }\r\n this.FileTypesFilter = this.FileTypes.slice();\r\n this.loading = false;\r\n }\r\n\r\n searchFileTypesHandleFilter(value) {\r\n this.FileTypesFilter = this.FileTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n}\r\n\r\n","module.exports = \".group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 14px;\\r\\n font-size: 20px;\\r\\n color: #006CB7;\\r\\n font-weight: 500;\\r\\n background-color: #f5f5f5;\\r\\n /* text-transform: capitalize; */\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 60px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 180px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 235px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 190px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n\\r\\n :host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed !important;\\r\\n top: 245px !important;\\r\\n display: block !important;\\r\\n height: auto !important;\\r\\n z-index: 1 !important;\\r\\n width: 97.55% !important;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvbS9tZW51L21lbnUuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsZ0NBQWdDO0FBQ3BDOztBQUVBLG1CQUFtQjs7QUFDbkI7SUFDSSxlQUFlO0lBQ2YsU0FBUztJQUNULGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLFVBQVU7QUFDZDs7QUFFQTtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtBQUNqQjs7QUFDQTtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtBQUNqQjs7QUFDQTtJQUNJO1FBQ0ksZUFBZTtRQUNmLFNBQVM7UUFDVCxjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixVQUFVO0lBQ2Q7O0lBRUE7UUFDSSxlQUFlO1FBQ2YsVUFBVTtRQUNWLGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLFVBQVU7SUFDZDs7SUFFQTtRQUNJLDBCQUEwQjtRQUMxQixxQkFBcUI7UUFDckIseUJBQXlCO1FBQ3pCLHVCQUF1QjtRQUN2QixxQkFBcUI7UUFDckIsd0JBQXdCO0lBQzVCO0FBQ0o7O0FBRUEsbUJBQW1CIiwiZmlsZSI6InNyYy9hcHAvbS9tZW51L21lbnUuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5ncm91cC1oZWFkZXIge1xyXG4gICAgcGFkZGluZy10b3A6IDEzcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMTNweDtcclxuICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwNkNCNztcclxuICAgIHBhZGRpbmctbGVmdDogMTRweDtcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XHJcbiAgICAvKiB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsgKi9cclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiA2MHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk4JTtcclxufVxyXG5cclxuLnN0aWNreS10b29sYmFyLWJ0bntcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMTgwcHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTkuNTUlO1xyXG59XHJcbjpob3N0IDo6bmctZGVlcCAuc3RpY2t5LWhlYWRlci1ncmlkIC5rLWdyaWQgLmstZ3JpZC1oZWFkZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAyMzVweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5Ny41NSU7XHJcbn1cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2OHB4KSB7XHJcbiAgICAuc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogNzZweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTQlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAuc3RpY2t5LXRvb2xiYXItYnRue1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDE5MHB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5OSU7XHJcbiAgICB9XHJcblxyXG4gICAgOmhvc3QgOjpuZy1kZWVwIC5zdGlja3ktaGVhZGVyLWdyaWQgLmstZ3JpZCAuay1ncmlkLWhlYWRlciB7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgdG9wOiAyNDVweCAhaW1wb3J0YW50O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgei1pbmRleDogMSAhaW1wb3J0YW50O1xyXG4gICAgICAgIHdpZHRoOiA5Ny41NSUgIWltcG9ydGFudDtcclxuICAgIH1cclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi8iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
= 0\\\">\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Menu_HomeFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Menu_MenuFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { st } from '@angular/core/src/render3';\r\n\r\n@Component({\r\n selector: 'app-menu',\r\n templateUrl: './menu.component.html',\r\n styleUrls: ['./menu.component.css']\r\n})\r\nexport class MenuComponent implements OnInit, OnDestroy {\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 180;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataMenus = [];\r\n dataMenuSelectableSettings: SelectableSettings;\r\n dataMenuSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataMenuFocus = {\r\n Name: true\r\n };\r\n dataMenuSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrderIdx',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //Config: Constant for paging\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n // dataPageSkip = this.LBM_NUM_PAGING_SKIP;\r\n // dataMenuPageSize = this.LBM_NUM_PAGING_TAKE;\r\n //dataPagePageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataMenuSelection: number[] = [];\r\n //dataPageSelection: number[] = [];\r\n dataMenuItem: any;\r\n dataMenuItemtemp: any;\r\n myInterval: any;\r\n pageName: any;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n // public pageSizes = true;\r\n // public previousNext = true;\r\n public test = false;\r\n\r\n public dataMenuState: State = {\r\n // skip: this.dataPageSkip,\r\n // take: this.dataPageSkip + this.dataMenuPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n group: [{ field: 'ParentName' }]\r\n };\r\n // public dataPageState: State = {\r\n // skip: this.dataPageSkip,\r\n // take: this.dataPageSkip + this.dataMenuPageSize,\r\n // filter: {\r\n // logic: 'and',\r\n // filters: []\r\n // },\r\n // group: [{ field: 'ParentName' }]\r\n // };\r\n dataMenuGridDataResult: GridDataResult;\r\n\r\n parentMenus: Array<{ Name: string, ID: string }>;\r\n parentMenusFilter: Array<{ Name: string, ID: string }>;\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n infoOpened = false;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.getPages();\r\n this.getAllMenus();\r\n this.get4Type();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.getPageName();\r\n }\r\n\r\n parentMenusHandleFilter(value) {\r\n this.parentMenusFilter = this.parentMenus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataMenuSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n public GUID_EMPTY = \"00000000-0000-0000-0000-000000000000\";\r\n async getMenus() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/Search', dataRequest);\r\n if (result) {\r\n this.dataMenus = result.Data;\r\n this.bindMenus();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n async getAllMenus() {\r\n //this.loading = true;\r\n const dataRequest = {\r\n searchText: ''\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/Search', dataRequest);\r\n if (result) {\r\n this.parentMenus = result.Data;\r\n this.parentMenus.splice(0, 0, {\r\n ID: this.GUID_EMPTY,\r\n Name: 'Root'\r\n })\r\n this.parentMenusFilter = this.parentMenus.slice();\r\n }\r\n this.loading = false;\r\n }\r\n async getPageParent() {\r\n const dataRequest = {\r\n searchText: ''\r\n };\r\n const result = await this.appService.doGET('api/Page/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.parentPages = [];\r\n this.parentPages.push({\r\n ID: null,\r\n Name: 'Root'\r\n });\r\n\r\n result.Data.forEach(item => {\r\n if (!item.ParentID) {\r\n this.parentPages.push(item);\r\n }\r\n });\r\n\r\n this.parentPagesFilter = this.parentPages.slice();\r\n }\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataMenuSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataMenus.find((item) => {\r\n return item.ID === this.dataMenuSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataMenuSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n public onPageDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataMenuSelection = [];\r\n this.dataMenuState = state;\r\n this.dataMenuGridDataResult = process(this.dataMenus, this.dataMenuState);\r\n }\r\n\r\n setDefault() {\r\n this.dataMenuItem = {\r\n IsAdd: true,\r\n ID: null,\r\n Name: null,\r\n ParentID: '',\r\n MenuID: this.GUID_EMPTY,\r\n OrderIdx: 0,\r\n MenuFlg: true,\r\n ButtonFlg: false,\r\n DelFlg: false,\r\n UrlPath: ''\r\n };\r\n this.dataMenuItemtemp = Object.assign({}, this.dataMenuItem);\r\n this.dataMenuSelection = [];\r\n this.dataMenuFocus.Name = true;\r\n this.enabled = true;\r\n this.enabledID = true;\r\n }\r\n\r\n bindtemp(item) {\r\n this.dataMenuItemtemp = Object.assign({}, item);\r\n }\r\n\r\n // onMenuPageChange(event: PageChangeEvent) {\r\n // this.dataPageSkip = event.skip;\r\n // this.bindMenus();\r\n // }\r\n\r\n onMenuSelectedKeysChange() {\r\n if (this.dataMenuSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n if (this.dataMenuSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataMenuSelection[0];\r\n const selectedItem = this.dataMenus.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataMenuItem = selectedItem;\r\n this.bindtemp(selectedItem);\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindMenus() {\r\n this.dataMenuGridDataResult = {\r\n data: orderBy(this.dataMenus, this.dataMenuSortByField),\r\n total: this.dataMenus.length\r\n };\r\n this.dataMenuGridDataResult = process(this.dataMenus, this.dataMenuState);\r\n }\r\n\r\n onMenuSortChange(sort: SortDescriptor[]): void {\r\n this.dataMenuSortByField = sort;\r\n this.bindMenus();\r\n }\r\n\r\n public onMenuDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataMenuSelection = [];\r\n this.dataMenuState = state;\r\n this.dataMenuGridDataResult = process(this.dataMenus, this.dataMenuState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n 'NameParentMenu',\r\n 'ParentID',\r\n 'ID',\r\n 'Name',\r\n 'OrderIdx',\r\n 'MenuFlg',\r\n 'ButtonFlg'\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n let parentMenu: any;\r\n this.dataMenus = [];\r\n for (let i = 1; i < fileData.length; i++) {\r\n parentMenu = this.parentMenus.find(item => {\r\n return this.appUtils.compareString(fileData[i][this.getColumnIndex('ParentID')], item.Name, item.ID);\r\n });\r\n\r\n if (fileData[i].indexOf(fileData[i][this.getColumnIndex('NameParentMenu')]) == -1) {\r\n this.dataMenus.push({\r\n IsAdd: false,\r\n ParentID: parentMenu ? parentMenu.ID : null,\r\n ParentName: parentMenu ? parentMenu.Name : null,\r\n ID: fileData[i][this.getColumnIndex('ID')],\r\n Name: fileData[i][this.getColumnIndex('Name')],\r\n OrderIdx: fileData[i][this.getColumnIndex('OrderIdx')],\r\n MenuFlg: fileData[i][this.getColumnIndex('MenuFlg')],\r\n ButtonFlg: fileData[i][this.getColumnIndex('ButtonFlg')]\r\n });\r\n }\r\n }\r\n this.bindMenus();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n this.onReload();\r\n });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n this.getMenus();\r\n }\r\n\r\n onSearch() {\r\n this.getMenus();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.getMenus();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearMenu() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewMenu() {\r\n\r\n this.setDefault();\r\n\r\n this.infoOpened = true;\r\n }\r\n\r\n onSaveMenu() {\r\n if (this.dataMenuItem.IsAdd) { this.addMenu(); } else { this.updateMenu(); }\r\n }\r\n\r\n async onSaveMenus() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n for (let i = 0; i < this.dataMenus.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataMenus[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Menu/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataMenuItemtemp;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n ParentID: temp.ParentID,\r\n PageID: temp.PageID,\r\n MenuID: temp.MenuID,\r\n MenuFlg: temp.MenuFlg,\r\n HomeFlg: temp.HomeFlg,\r\n HomeOrderIdx: temp.HomeOrderIdx,\r\n HomeDisplayType: temp.HomeDisplayType,\r\n ButtonFlg: temp.ButtonFlg,\r\n DelFlg: temp.DelFlg,\r\n OrderIdx: temp.OrderIdx,\r\n OrderIdxInPost: temp.OrderIdxInPost,\r\n WidthBanner: temp.WidthBanner,\r\n HeightBanner: temp.HeightBanner,\r\n UrlPath: temp.UrlPath\r\n };\r\n }\r\n\r\n onCloseMenu(status: any) {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n onEditMenu() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n parentPages: Array<{ Name: string, ID: string }>;\r\n parentPagesFilter: Array<{ Name: string, ID: string }>;\r\n async getPages() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/GetAllPage', null);\r\n if (result) {\r\n this.parentPages = [];\r\n result.Data.forEach(item => {\r\n this.parentPages.push(item);\r\n });\r\n this.parentPagesFilter = this.parentPages.slice();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n parentPagesHandleFilter(value) {\r\n this.parentPagesFilter = this.parentPages.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n async addMenu() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Menu', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.getAllMenus();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateMenu() {\r\n this.appComponent.loading = true;\r\n const id = this.dataMenuItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPUT('api/Menu', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.getAllMenus();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteMenu() {\r\n if (this.dataMenuSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataMenuSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Menu/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewMenu();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataMenuSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n Types: Array<{ Name: string, ID: number }>;\r\n TypesFilter: Array<{ Name: string, ID: number }>;\r\n get4Type() {\r\n var a = [];\r\n a[0] = this.translate.instant('TypeHomepage0');\r\n a[1] = this.translate.instant('TypeHomepage1');\r\n a[2] = this.translate.instant('TypeHomepage2');\r\n a[3] = this.translate.instant('TypeHomepage3');\r\n a[4] = this.translate.instant('TypeHomepage4');\r\n this.Types = [];\r\n for (let i = 0; i < 5; i++) {\r\n this.Types.push({\r\n ID: i,\r\n Name: a[i]\r\n });\r\n }\r\n this.TypesFilter = this.Types.slice();\r\n this.loading = false;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n menuNameChange(e : any){\r\n if (e){\r\n this.dataMenuItemtemp.UrlPath = this.cleanAccents(e);\r\n } \r\n } \r\n cleanAccents (str: string){\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g,\"a\"); \r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g,\"e\"); \r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g,\"i\"); \r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g,\"o\"); \r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g,\"u\"); \r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g,\"y\"); \r\n str = str.replace(/đ/g,\"d\");\r\n str = str.replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, \"A\");\r\n str = str.replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, \"E\");\r\n str = str.replace(/Ì|Í|Ị|Ỉ|Ĩ/g, \"I\");\r\n str = str.replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, \"O\");\r\n str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, \"U\");\r\n str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, \"Y\");\r\n str = str.replace(/Đ/g, \"D\");\r\n // Some system encode vietnamese combining accent as individual utf-8 characters\r\n // Một vài bộ encode coi các dấu mũ, dấu chữ như một kí tự riêng biệt nên thêm hai dòng này\r\n str = str.replace(/\\u0300|\\u0301|\\u0303|\\u0309|\\u0323/g, \"\"); // ̀ ́ ̃ ̉ ̣ huyền, sắc, ngã, hỏi, nặng\r\n str = str.replace(/\\u02C6|\\u0306|\\u031B/g, \"\"); // ˆ ̆ ̛ Â, Ê, Ă, Ơ, Ư \r\n str = str.replace(/[!&\\/\\\\#,+()$~%.'\":*?<>{} ]/g,'-'); \r\n str = str.trim();\r\n return str;\r\n }\r\n}\r\n","module.exports = \".file-uploaded {\\r\\n color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n.f-bold {\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.k-treeview .k-in:hover,\\r\\n.k-treeview .k-in.k-state-hover {\\r\\n border: 0;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 66px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 65%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:767px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n\\r\\n :host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 125px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 90.55% !important\\r\\n }\\r\\n \\r\\n \\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 125px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 63.55%\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvbS9waG90by9waG90by5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0kseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBOztJQUVJLFNBQVM7QUFDYjs7QUFFQSxtQkFBbUI7O0FBQ25CO0lBQ0ksZUFBZTtJQUNmLFNBQVM7SUFDVCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixVQUFVO0FBQ2Q7O0FBR0E7SUFDSTtRQUNJLGVBQWU7UUFDZixTQUFTO1FBQ1QsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkOztJQUVBO1FBQ0ksZUFBZTtRQUNmLFVBQVU7UUFDVixjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVjtJQUNKOzs7QUFHSjs7QUFFQSxtQkFBbUI7O0FBR25CO0lBQ0ksZUFBZTtJQUNmLFVBQVU7SUFDVixjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVjtBQUNKIiwiZmlsZSI6InNyYy9hcHAvbS9waG90by9waG90by5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmZpbGUtdXBsb2FkZWQge1xyXG4gICAgY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmYtYm9sZCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmstdHJlZXZpZXcgLmstaW46aG92ZXIsXHJcbi5rLXRyZWV2aWV3IC5rLWluLmstc3RhdGUtaG92ZXIge1xyXG4gICAgYm9yZGVyOiAwO1xyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqL1xyXG4uc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDY2cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogNjUlO1xyXG59XHJcblxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KSB7XHJcbiAgICAuc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogNzZweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTQlO1xyXG4gICAgfVxyXG5cclxuICAgIDpob3N0IDo6bmctZGVlcCAuc3RpY2t5LWhlYWRlci1ncmlkIC5rLWdyaWQgLmstZ3JpZC1oZWFkZXIge1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDEyNXB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5MC41NSUgIWltcG9ydGFudFxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuXHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnN0aWNreS1oZWFkZXItZ3JpZCAuay1ncmlkIC5rLWdyaWQtaGVhZGVyIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMTI1cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogNjMuNTUlXHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.Name}} \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.BannerType === -1 ? 'Không hiển thị (Trang chủ)' : dataItem.BannerType === 0 ? 'Banner phía trên (Trang chủ)' : dataItem.BannerType === 2 ? 'Banner các đơn vị trực thuộc (Trang chủ)' : dataItem.BannerType === 3 ? ' Ảnh nền Footer' : dataItem.BannerType\\r\\n === 4 ? ' Ảnh tin bài' : dataItem.BannerType === 5 ? 'Ảnh banner huy chương' : dataItem.BannerType === 6 ? 'Ảnh banner logo' : dataItem.BannerType === 7 ? 'Ảnh banner bên phải' : dataItem.BannerType === 8 ? 'Banner phần tin bài trang chủ' : 'Album ảnh'}}\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n Video\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n Hiển thị ở trang chủ\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n\\r\\n \\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, UploadEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AppConsts } from 'src/app/services/app.consts';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { GroupResult, groupBy } from '@progress/kendo-data-query';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport * as FileSaver from 'file-saver';\r\n\r\n@Component({\r\n selector: 'app-photo',\r\n templateUrl: './photo.component.html',\r\n styleUrls: ['./photo.component.css']\r\n})\r\nexport class PhotoComponent implements OnInit {\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n\r\n dataFiles = [];\r\n dataFileSelectableSettings: SelectableSettings;\r\n dataFileSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n\r\n dataFileSortByField: SortDescriptor[] = [\r\n ];\r\n\r\n public events: string[] = [];\r\n imgImageDefault: any;\r\n public imageDef = '../../assets/images/default-02.png';\r\n\r\n public fileSaveUrl: any;\r\n\r\n\r\n //used for kendo grid\r\n public WORKING_NUM_PAGING_SKIP = 0;\r\n public WORKING_NUM_PAGING_TAKE = 50;\r\n public WORKING_NUM_PAGING_BTN = 5;\r\n public buttonCount = this.WORKING_NUM_PAGING_BTN;\r\n // paging in grid\r\n dataFileSkip = this.WORKING_NUM_PAGING_SKIP;\r\n dataFilePageSize = this.WORKING_NUM_PAGING_TAKE;\r\n\r\n dataFileSelection: string[] = []; //to store track of selected rows by ID\r\n dataFileItem: any; //selected record\r\n myInterval: any; //interval time to do async jobs periodically in Observable\r\n\r\n // vars are used for showed FileUrls file\r\n dataFileIDFileUrl: any;\r\n dataFileIDFileUrls: any[];\r\n\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n // kendo grid\r\n public dataFileState: State = {\r\n skip: this.dataFileSkip,\r\n take: this.dataFileSkip + this.dataFilePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n // data source for kendo grid\r\n dataFileGridDataResult: GridDataResult;\r\n\r\n roles: Array<{ ID: string, Name: string }>;\r\n rolesFilter: Array<{ ID: string, Name: string }>;\r\n\r\n // 'Phân quyền tài liệu' kendo-combobox\r\n AssignUnitsFiles: Array = []; // { ID: string, Name: string, GroupBy : string }\r\n AssignUnitsFilesFilter: Array = [];\r\n AssignUnitsFiles_GroupResult: GroupResult[];\r\n\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n pageName: any;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n filesUpload: Array;\r\n filesUploadName = \"\";\r\n infoOpened = false;\r\n allowInsertFile = false;\r\n result = [];\r\n menuIDSelected = null;\r\n\r\n isWatch = false;\r\n\r\n public menus: any;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n private notification: Notification,\r\n private file: AppFile,\r\n private consts: AppConsts,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appComponent: AppComponent,\r\n private appGuid: AppGuid\r\n ) {\r\n this.imgImageDefault = [\r\n this.imageDef,\r\n // this.imageDef,\r\n // this.imageDef,\r\n ];\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.getPageName();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.get4Type();\r\n this.getSearchMenus();\r\n this.getFileType();\r\n this.getMenus();\r\n this.onReload();\r\n this.initDisplay();\r\n this.allData = this.allData.bind(this);\r\n }\r\n\r\n // used to export all kendo-grid data(not care for paging) to excel file(s)\r\n public allData(): ExcelExportData {\r\n this.appComponent.loading = true;\r\n const result: ExcelExportData = {\r\n data: process(this.dataFiles, { sort: this.dataFileSortByField }).data\r\n };\r\n this.appComponent.loading = false;\r\n return result;\r\n }\r\n\r\n rolesHandleFilter(value) {\r\n this.rolesFilter = this.roles.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n AssignUnitsFilesHandleFilter(value) {\r\n this.AssignUnitsFilesFilter = this.AssignUnitsFiles.filter((s) => s.ID != null);\r\n this.AssignUnitsFiles_GroupResult = groupBy(this.AssignUnitsFilesFilter, [{ field: \"GroupBy\" }]);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.allowMulti = !this.allowMulti;\r\n this.dataFileSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getFiles() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText,\r\n menuid: this.menuIDSelected\r\n //type: 0\r\n };\r\n\r\n const result = await this.appService.doGET('api/File/Search', dataRequest);\r\n if (result) {\r\n this.dataFiles = result.Data;\r\n this.bindFiles();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n for (let i = this.dataFileSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataFiles.find((item) => {\r\n return item.ID === this.dataFileSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataFileSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n public GUID_EMPTY = \"00000000-0000-0000-0000-000000000000\";\r\n dataFileItemtemp: any;\r\n setDefault() {\r\n if (!this.infoOpened) {\r\n this.dataFileItem = {\r\n IsAdd: true,\r\n ID: null,\r\n Name: '',\r\n LinkUrl: '',\r\n FileUrl: '',\r\n MenuID: this.menuIDSelected ? this.menuIDSelected : this.GUID_EMPTY,\r\n Type: false,\r\n HotFlg: false,\r\n ActivedFlg: false,\r\n BannerType: -1,\r\n OrderIdx: 0,\r\n CreateAt: null,\r\n DisplayFlg: false\r\n };\r\n this.dataFileItemtemp = Object.assign({}, this.dataFileItem);\r\n } else {\r\n this.dataFileItem = {\r\n IsAdd: true,\r\n ID: null,\r\n Name: '',\r\n LinkUrl: '',\r\n FileUrl: '',\r\n MenuID: this.dataFileItemtemp.MenuID ? this.dataFileItemtemp.MenuID : '',\r\n Type: false,\r\n HotFlg: false,\r\n ActivedFlg: false,\r\n BannerType: this.dataFileItemtemp.BannerType ? this.dataFileItemtemp.BannerType : '',\r\n OrderIdx: 0,\r\n CreateAt: null,\r\n DisplayFlg: false\r\n };\r\n this.dataFileItemtemp = Object.assign({}, this.dataFileItem);\r\n }\r\n\r\n this.searchMenuText = \"all\";\r\n this.searchFiletype = 0;\r\n this.filesUpload = [];\r\n this.filesUploadName = \"\";\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.dataFileSelection = [];\r\n this.dataFileItemtemp.UserName = this.user.UserName;\r\n }\r\n\r\n bindtemp(item) {\r\n this.dataFileItemtemp = Object.assign({}, item);\r\n }\r\n\r\n onFilePageChange(event: PageChangeEvent) {\r\n this.dataFileSkip = event.skip;\r\n this.bindFiles();\r\n }\r\n\r\n // handle event of SelectedKeysChange\r\n async onFileSelectedKeysChange(event) {\r\n if (this.dataFileSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n // flag to check multi-select allowed\r\n if (this.dataFileSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n }\r\n // single select\r\n else {\r\n const selectedID = this.dataFileSelection[0];\r\n const selectedItem = this.dataFiles.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataFileItem = selectedItem;\r\n this.bindtemp(this.dataFileItem);\r\n //show file uploaded\r\n this.filesUpload = [];\r\n this.filesUploadName = this.getFileName(this.dataFileItem.FileUrl);\r\n\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n // rebinding data onto kendo grid based on current page\r\n bindFiles() {\r\n this.dataFileGridDataResult = {\r\n data: orderBy(this.dataFiles, this.dataFileSortByField),\r\n total: this.dataFiles.length\r\n };\r\n\r\n this.dataFileGridDataResult = process(this.dataFiles, this.dataFileState);\r\n }\r\n\r\n onFileSortChange(sort: SortDescriptor[]): void {\r\n this.dataFileSortByField = sort;\r\n this.bindFiles();\r\n }\r\n\r\n public onFileDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataFileSelection = [];\r\n this.dataFileState = state;\r\n this.dataFileGridDataResult = process(this.dataFiles, this.dataFileState);\r\n }\r\n\r\n // column titles of kendo-grid. support for reading .xlsx files\r\n getColumnIndex(name) {\r\n let columns = [];\r\n columns = [\r\n 'Code',\r\n 'SerialNo',\r\n 'Title',\r\n 'Description',\r\n 'UserName',\r\n 'AssignUnits',\r\n 'FileUrls',\r\n 'DelFlg'\r\n ];\r\n return columns.indexOf(name);\r\n }\r\n\r\n // only read the first sheet of .xlsx files and rebind onto kendo grid\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n this.dataFiles = [];\r\n for (let i = 1; i < fileData.length; i++) {\r\n if (fileData[i].length > 1) {\r\n this.dataFiles.push({\r\n IsAdd: false,\r\n Code: fileData[i][this.getColumnIndex('Code')],\r\n SerialNo: fileData[i][this.getColumnIndex('SerialNo')],\r\n Title: fileData[i][this.getColumnIndex('Title')],\r\n Description: fileData[i][this.getColumnIndex('Description')],\r\n UserName: fileData[i][this.getColumnIndex('UserName')],\r\n AssignUnits: fileData[i][this.getColumnIndex('AssignUnits')],\r\n FileUrls: fileData[i][this.getColumnIndex('FileUrls')],\r\n DelFlg: fileData[i][this.getColumnIndex('DelFlg')]\r\n });\r\n }\r\n }\r\n this.dataFileSelection = [];\r\n this.bindFiles();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // Fires when an uploaded .xlsx file is about to be removed\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n\r\n // handle changed search-text event\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n this.getFiles();\r\n }\r\n\r\n async initDisplay() {\r\n const resultRole = await this.appService.doGET('api/Role', null);\r\n if (resultRole && resultRole.Status === 1) {\r\n this.roles = resultRole.Data;\r\n this.rolesFilter = this.roles.slice();\r\n }\r\n }\r\n\r\n onSearch() {\r\n this.getFiles();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.getFiles();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n // no use\r\n onClearFile() {\r\n this.setDefault();\r\n }\r\n\r\n // handle event of multi-select allowed button\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n // handle button AddNew\r\n onAddNewFile() {\r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n onSaveFile() {\r\n if (this.dataFileItem.IsAdd) {\r\n this.addFile();\r\n }\r\n else {\r\n this.updateFile();\r\n }\r\n }\r\n\r\n // store all current data records on kendo grid into db such as data read from .xlsx files\r\n async onSaveFiles() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n for (let i = 0; i < this.dataFiles.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataFiles[i]));\r\n }\r\n const result = await this.appService.doPOST('api/File/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // create request sent to server to add new or update data record\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataFileItemtemp;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n LinkUrl: temp.LinkUrl,\r\n FileUrl: temp.FileUrl,\r\n Type: temp.Type,\r\n MenuID: temp.MenuID,\r\n ActivedFlg: true,\r\n HotFlg: temp.BannerType === 0 || temp.BannerType === 1,\r\n OrderIdx: temp.OrderIdx,\r\n BannerType: temp.BannerType,\r\n CreateAt: temp.CreateAt,\r\n DisplayFlg: temp.DisplayFlg\r\n };\r\n }\r\n\r\n // handle event of editing selected file\r\n onEditFile() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n\r\n async addFile() {\r\n this.appComponent.loading = true;\r\n this.dataFileItemtemp.ID = this.appGuid.create();\r\n\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/File/AddFile', dataRequest);\r\n if (result) {\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.dataFileSelection = [];\r\n } else if (result && result.Status !== 1) {\r\n if (typeof (result.Msg) != 'undefined' && result.Msg != null) {\r\n this.appSwal.showError(result.Msg);\r\n }\r\n }\r\n else {\r\n this.appSwal.showError(JSON.stringify(result));\r\n }\r\n } else {\r\n this.appSwal.showError(\"Don't connect server API!\");\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateFile() {\r\n this.appComponent.loading = true;\r\n const id = this.dataFileItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPUT('api/File/UpdateFile', dataRequest, { id });\r\n if (result) {\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.dataFileSelection = [];\r\n } else if (result && result.Status !== 1) {\r\n if (typeof (result.Msg) != 'undefined' && result.Msg != null) {\r\n this.appSwal.showError(result.Msg);\r\n }\r\n }\r\n else {\r\n this.appSwal.showError(JSON.stringify(result));\r\n }\r\n } else {\r\n this.appSwal.showError(\"Don't connect server API!\");\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // delete multi data records\r\n async onDeleteFile() {\r\n if (this.dataFileSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataFileSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPUT('api/File/Deletes', dataRequest, null);\r\n // if delete all ok\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.dataFileItem.UserName = '';\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataFileSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n //select file to upload\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n\r\n const extension = e.files[0].extension.toLowerCase();\r\n\r\n this.allowInsertFile = true;\r\n\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n\r\n // tslint:disable-next-line: max-line-length\r\n if (!extension || (extension.toLowerCase() !== '.png' &&\r\n extension.toLowerCase() !== '.jpg' &&\r\n extension.toLowerCase() !== '.jpeg' &&\r\n extension.toLowerCase() !== '.JPEG' &&\r\n extension.toLowerCase() !== '.JPG' &&\r\n extension.toLowerCase() !== '.PNG' &&\r\n extension.toLowerCase() !== '.mp4' &&\r\n extension.toLowerCase() !== '.avi' &&\r\n extension.toLowerCase() !== '.3gp' &&\r\n extension.toLowerCase() !== '.gif')) {\r\n\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .png, .jpg, .jpeg, .mp4, .avi, .3gp, .gif', false);\r\n // this.dataTemplateFileUrls = [];\r\n // this.bindTemplateFileUrls();\r\n\r\n return false;\r\n }\r\n // tslint:disable-next-line: max-line-length\r\n if (e.files[0].extension !== '.jpg' && \r\n e.files[0].extension !== '.png' && \r\n e.files[0].extension !== '.gif' && \r\n e.files[0].extension !== '.jpeg' &&\r\n e.files[0].extension !== '.mp4' &&\r\n e.files[0].extension !== '.avi' &&\r\n e.files[0].extension !== '.3gp') {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(this.translate.instant('MsgImgOnly'), false);\r\n return false;\r\n }\r\n }\r\n\r\n //remove file to upload\r\n onRemoveFileToUpload() {\r\n this.dataFileItemtemp.FileUrl = '';\r\n this.filesUploadName = '';\r\n this.filesUpload = [];\r\n }\r\n\r\n public uploadRestrictions: FileRestrictions = {\r\n allowedExtensions: ['.jpg', '.jpeg', '.tif', '.gif', '.webm', '.mkv', '.flv', '.vob', '.ogv', '.ogg', '.avi', '.TS', '.mov', '.qt', '.wmv', '.yuv', '.rm', '.rmvb', '.asf', '.amv', '.mp4', '.m4p', '.m4v', '.mpg', '.mp2', '.mpeg', '.mpe', '.mpv', '.m2v', '.3gp', '.3g2', '.svi', '.nsv', '.f4v', '.f4p', '.f4a', '.f4b', '.MTS', '.M2TS', '.png']\r\n };\r\n\r\n //success upload\r\n onSuccessFileToUpload(e: any) {\r\n\r\n if (!this.allowInsertFile) {\r\n return;\r\n }\r\n\r\n try {\r\n if (e.response.body.Data.MediaNm[0].match(/.(jpg|jpeg|tif|png|gif)$/i)) {\r\n this.dataFileItemtemp.Type = 0;\r\n } else if (e.response.body.Data.MediaNm[0].match(/.(webm|mkv|flv|vob|ogv|ogg|avi|TS|mov|qt|wmv|yuv|rm|rmvb|asf|amv|mp4|m4p|m4v|mpg|mp2|mpeg|mpe|mpv|m2v|3gp|3g2|svi|nsv|f4v|f4p|f4a|f4b|MTS|M2TS)$/i)) {\r\n this.dataFileItemtemp.Type = 1;\r\n } else {\r\n this.filesUpload = [];\r\n this.onRemoveFileToUpload();\r\n this.appSwal.showWarning(this.translate.instant('File_IncorrectFormat'), false);\r\n return;\r\n }\r\n // e.response.body.Data.MediaNm[0] = e.response.body.Data.MediaNm[0].replace(/\\s/g,'');\r\n this.dataFileItemtemp.FileUrl = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n } catch {\r\n this.filesUpload = [];\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n getFileName(fileUrls) {\r\n var nameFile = \"temp.txt\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n\r\n parentMenus: Array<{ Name: string, ID: string }>;\r\n parentMenusFilter: Array<{ Name: string, ID: string }>;\r\n\r\n parentMenusHandleFilter(value) {\r\n this.parentMenusFilter = this.parentMenus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n async getMenus() {\r\n this.loading = true;\r\n const dataRequest = {\r\n pageID: 'portal/multimedia'\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/GetMenuByPageID', dataRequest);\r\n if (result) {\r\n this.parentMenus = [];\r\n const menuParentIDNull = [];\r\n result.Data.forEach(item => {\r\n this.parentMenus.push(item);\r\n if (!item.ParentID) {\r\n menuParentIDNull.push(item);\r\n }\r\n });\r\n this.parentMenusFilter = this.parentMenus.slice();\r\n\r\n this.getMenuTree(null, menuParentIDNull);\r\n }\r\n this.loading = false;\r\n }\r\n\r\n menuHandleSelection(e: any) {\r\n this.menuIDSelected = e.dataItem.ID;\r\n if (e.dataItem.Name.toLowerCase().indexOf('tin bài') >= 0){ \r\n this.searchOption.SearchText = 'Tin bài';\r\n this.getFiles();\r\n this.isEnabledSaveAll = false;\r\n }else {\r\n this.onReload();\r\n }\r\n \r\n }\r\n\r\n async onGetLink() {\r\n const dataRequest = {\r\n menuId: this.dataFileItem.ID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/getLink', dataRequest);\r\n if (result) {\r\n const link = this.appService.apiRoot + result.Data;\r\n document.addEventListener('copy', (e: ClipboardEvent) => {\r\n e.clipboardData.setData('text/plain', (link));\r\n e.preventDefault();\r\n document.removeEventListener('copy', null);\r\n });\r\n document.execCommand('copy');\r\n\r\n }\r\n }\r\n\r\n iconClass(dataItem: any) {\r\n if (this.menuIDSelected === dataItem.ID) {\r\n return 'fa fa-folder-open-o';\r\n } else {\r\n return 'fa fa-folder-o';\r\n }\r\n }\r\n\r\n fontClass(dataItem: any) {\r\n if (this.menuIDSelected === dataItem.ID) {\r\n return 'f-bold';\r\n } else {\r\n return 'f-noraml';\r\n }\r\n }\r\n\r\n getMenuTree(parent, menuParentIDNull) {\r\n for (let i = 0; i < menuParentIDNull.length; i++) {\r\n\r\n const item = {\r\n ID: menuParentIDNull[i].ID,\r\n Name: menuParentIDNull[i].Name,\r\n Items: []\r\n };\r\n\r\n if (!parent) {\r\n this.result.push(item);\r\n this.getMenuTree(item, this.parentMenus);\r\n } else {\r\n if (parent.ID === menuParentIDNull[i].ParentID) {\r\n parent.Items.push(item);\r\n this.getMenuTree(item, this.parentMenus);\r\n }\r\n }\r\n }\r\n }\r\n\r\n Types: Array<{ Name: string, ID: number }>;\r\n TypesFilter: Array<{ Name: string, ID: number }>;\r\n\r\n get4Type() {\r\n this.Types = [\r\n { Name: 'Không hiển thị (Trang chủ)', ID: -1 },\r\n { Name: 'Banner phía trên (Trang chủ)', ID: 0 },\r\n { Name: 'Album ảnh', ID: 1 },\r\n { Name: 'Banner các đơn vị trực thuộc (Trang chủ)', ID: 2 },\r\n { Name: 'Ảnh Footer', ID: 3 },\r\n { Name: 'Banner Fly-in', ID: 4},\r\n { Name: 'Ảnh banner huy chương', ID: 5},\r\n { Name: 'Ảnh banner logo', ID: 6},\r\n { Name: 'Ảnh banner bên phải', ID: 7},\r\n { Name: 'Banner phần tin bài trang chủ', ID: 8 } \r\n ];\r\n this.TypesFilter = this.Types.slice();\r\n this.loading = false;\r\n }\r\n\r\n searchMenus: Array<{ Name: string, ID: string }>;\r\n searchMenusFilter: Array<{ Name: string, ID: string }>;\r\n\r\n searchMenusHandleFilter(value) {\r\n this.searchMenusFilter = this.searchMenus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n async getSearchMenus() {\r\n\r\n this.loading = true;\r\n const dataRequest = {\r\n pageID: 'portal/multimedia'\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/GetMenuByPageID', dataRequest);\r\n if (result) {\r\n this.searchMenus = [];\r\n result.Data.forEach(item => {\r\n this.searchMenus.push(item);\r\n });\r\n this.searchMenusFilter = this.searchMenus.slice();\r\n }\r\n this.loading = false;\r\n }\r\n\r\n searchMenuText: string;\r\n searchFiletype: number;\r\n\r\n MenuSearchChange(value: any) {\r\n if (value == undefined) {\r\n this.searchMenuText = \"all\";\r\n } else {\r\n this.searchMenuText = value;\r\n }\r\n this.getFiles();\r\n }\r\n\r\n FileTypeSearchChange(value: any) {\r\n if (value == undefined) {\r\n this.searchFiletype = 0;\r\n } else {\r\n this.searchFiletype = value;\r\n }\r\n\r\n this.getFiles();\r\n }\r\n\r\n FileTypes: Array<{ Name: string, ID: number }>;\r\n FileTypesFilter: Array<{ Name: string, ID: number }>;\r\n getFileType() {\r\n var a = [];\r\n a[0] = this.translate.instant('allMenu');\r\n a[1] = this.translate.instant('FileImage');\r\n a[2] = this.translate.instant('FileVideo');\r\n this.FileTypes = [];\r\n for (let i = 0; i < 3; i++) {\r\n this.FileTypes.push({\r\n ID: i,\r\n Name: a[i]\r\n });\r\n }\r\n this.FileTypesFilter = this.FileTypes.slice();\r\n this.loading = false;\r\n }\r\n\r\n searchFileTypesHandleFilter(value) {\r\n this.FileTypesFilter = this.FileTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n onWatch(){\r\n this.isWatch = true;\r\n }\r\n\r\n onCloseWatch(e){\r\n this.setDefault();\r\n this.isWatch = false;\r\n }\r\n\r\n}\r\n","module.exports = \".group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 14px;\\r\\n font-size: 20px;\\r\\n color: #006CB7;\\r\\n font-weight: 500;\\r\\n background-color: #f5f5f5;\\r\\n /* text-transform: capitalize; */\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 199px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 199px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvbS90eXBlL3R5cGUuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQix5QkFBeUI7SUFDekIsZ0NBQWdDO0FBQ3BDOztBQUVBLG1CQUFtQjs7QUFDbkI7SUFDSSxlQUFlO0lBQ2YsU0FBUztJQUNULGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLFVBQVU7QUFDZDs7QUFFQTtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtBQUNqQjs7QUFFQTtJQUNJO1FBQ0ksZUFBZTtRQUNmLFNBQVM7UUFDVCxjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixVQUFVO0lBQ2Q7O0lBRUE7UUFDSSxlQUFlO1FBQ2YsVUFBVTtRQUNWLGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLFVBQVU7SUFDZDtBQUNKOztBQUVBLG1CQUFtQiIsImZpbGUiOiJzcmMvYXBwL20vdHlwZS90eXBlLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuZ3JvdXAtaGVhZGVyIHtcclxuICAgIHBhZGRpbmctdG9wOiAxM3B4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEzcHg7XHJcbiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDZDQjc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDE0cHg7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xyXG4gICAgLyogdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7ICovXHJcbn1cclxuXHJcbi8qIHN0aWNreSB0b29sYmFyICovXHJcbi5zdGlja3ktZ3JvdXAtc2VhcmNoIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogNzZweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OCU7XHJcbn1cclxuXHJcbi5zdGlja3ktdG9vbGJhci1idG57XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDE5OXB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk5LjU1JTtcclxufVxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2OHB4KSB7XHJcbiAgICAuc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogNzZweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTQlO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAuc3RpY2t5LXRvb2xiYXItYnRue1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDE5OXB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5OSU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qIHN0aWNreSB0b29sYmFyICovIl19 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{'Type0' | translate}} \\r\\n {{'Type1' | translate}} \\r\\n {{'Type2' | translate}} \\r\\n {{'Type3' | translate}} \\r\\n {{'Type4' | translate}} \\r\\n {{'Type6' | translate}} \\r\\n {{'Type7' | translate}} \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Type_DefaultFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\n\r\n\r\n@Component({\r\n selector: 'app-type',\r\n templateUrl: './type.component.html',\r\n styleUrls: ['./type.component.css']\r\n})\r\nexport class TypeComponent implements OnInit, OnDestroy {\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataTypes = [];\r\n dataTypeSelectableSettings: SelectableSettings;\r\n dataTypeSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataTypeFocus = {\r\n Name: true\r\n };\r\n dataTypeSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //Config: Constant for paging\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataPageSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataTypePageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataTypeSelection: number[] = [];\r\n dataTypeItem: any;\r\n dataTypeItemtemp: any;\r\n myInterval: any;\r\n pageName: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataTypeState: State = {\r\n skip: this.dataPageSkip,\r\n take: this.dataPageSkip + this.dataTypePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n dataTypeGridDataResult: GridDataResult;\r\n\r\n parentTypes: Array<{ Name: string, ID: string }>;\r\n parentTypesFilter: Array<{ Name: string, ID: string }>;\r\n\r\n Types: Array<{ Name: string, ID: number }>;\r\n TypesFilter: Array<{ Name: string, ID: number }>;\r\n\r\n PageOffices: Array<{ Name: string, ID: number }>;\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.get4Type();\r\n this.getPageByOffice();\r\n this.getAllTypes();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.getPageName();\r\n }\r\n\r\n parentTypesHandleFilter(value) {\r\n this.parentTypesFilter = this.parentTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataTypeSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n public GUID_EMPTY = \"00000000-0000-0000-0000-000000000000\";\r\n async getTypes() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/Type/Search', dataRequest);\r\n if (result) {\r\n this.dataTypes = result.Data;\r\n this.bindTypes();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n async getAllTypes() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: ''\r\n };\r\n\r\n const result = await this.appService.doGET('api/Type/Search', dataRequest);\r\n if (result) {\r\n\r\n this.parentTypes = [];\r\n this.parentTypes.push({\r\n ID: this.GUID_EMPTY,\r\n Name: this.translate.instant('TypeRoot')\r\n });\r\n result.Data.forEach(item => {\r\n this.parentTypes.push(item);\r\n });\r\n this.parentTypesFilter = this.parentTypes.slice();\r\n }\r\n this.loading = false;\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataTypeSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataTypes.find((item) => {\r\n return item.ID === this.dataTypeSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataTypeSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataTypeItem = {\r\n IsAdd: true,\r\n ID: this.GUID_EMPTY,\r\n Name: null,\r\n ParentID: this.GUID_EMPTY,\r\n Type: 0,\r\n LinkUrl: '',\r\n DelFlg: false,\r\n DefaultFlg: false,\r\n PageID: '',\r\n OrdinalNumber: null\r\n };\r\n this.dataTypeItemtemp = Object.assign({}, this.dataTypeItem);\r\n this.dataTypeSelection = [];\r\n this.dataTypeFocus.Name = true;\r\n this.enabled = true;\r\n this.enabledID = true;\r\n }\r\n\r\n bindtemp(item) {\r\n this.dataTypeItemtemp = Object.assign({}, item);\r\n }\r\n\r\n onTypePageChange(event: PageChangeEvent) {\r\n this.dataPageSkip = event.skip;\r\n this.bindTypes();\r\n }\r\n\r\n onTypeSelectedKeysChange() {\r\n\r\n if (this.dataTypeSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataTypeSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataTypeSelection[0];\r\n const selectedItem = this.dataTypes.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataTypeItem = selectedItem;\r\n this.bindtemp(selectedItem);\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindTypes() {\r\n this.dataTypeGridDataResult = {\r\n data: orderBy(this.dataTypes, this.dataTypeSortByField),\r\n total: this.dataTypes.length\r\n };\r\n\r\n this.dataTypeGridDataResult = process(this.dataTypes, this.dataTypeState);\r\n }\r\n\r\n onTypeSortChange(sort: SortDescriptor[]): void {\r\n this.dataTypeSortByField = sort;\r\n this.bindTypes();\r\n }\r\n\r\n public onTypeDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataTypeSelection = [];\r\n this.dataTypeState = state;\r\n this.dataTypeGridDataResult = process(this.dataTypes, this.dataTypeState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n 'NameParentType',\r\n 'ParentID',\r\n 'ID',\r\n 'Name',\r\n 'OrdinalNumber',\r\n 'TypeFlg',\r\n 'ButtonFlg'\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n let parentType: any;\r\n this.dataTypes = [];\r\n for (let i = 1; i < fileData.length; i++) {\r\n parentType = this.parentTypes.find(item => {\r\n return this.appUtils.compareString(fileData[i][this.getColumnIndex('ParentID')], item.Name, item.ID);\r\n });\r\n\r\n if (fileData[i].indexOf(fileData[i][this.getColumnIndex('NameParentType')]) == -1) {\r\n this.dataTypes.push({\r\n IsAdd: false,\r\n ParentID: parentType ? parentType.ID : null,\r\n ParentName: parentType ? parentType.Name : null,\r\n ID: fileData[i][this.getColumnIndex('ID')],\r\n Name: fileData[i][this.getColumnIndex('Name')],\r\n OrdinalNumber: fileData[i][this.getColumnIndex('OrdinalNumber')],\r\n TypeFlg: fileData[i][this.getColumnIndex('TypeFlg')],\r\n ButtonFlg: fileData[i][this.getColumnIndex('ButtonFlg')],\r\n });\r\n }\r\n }\r\n this.bindTypes();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n this.onReload();\r\n });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n this.getTypes();\r\n }\r\n\r\n onSearch() {\r\n this.getTypes();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.getTypes();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearType() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewType() {\r\n\r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n onSaveType() {\r\n if (this.dataTypeItem.IsAdd) { this.addType(); } else { this.updateType(); }\r\n }\r\n\r\n async onSaveTypes() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n for (let i = 0; i < this.dataTypes.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataTypes[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Type/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n \r\n const temp = data ? data : this.dataTypeItemtemp;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n ParentID: temp.ParentID,\r\n LinkUrl: temp.LinkUrl,\r\n Type: temp.Type,\r\n DelFLgFlg: temp.DelFLgFlg,\r\n DefaultFlg: temp.DefaultFlg,\r\n PageID: temp.PageID,\r\n OrdinalNumber: temp.OrdinalNumber\r\n };\r\n }\r\n\r\n onCloseType(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n onEditType() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async get4Type() {\r\n const result = await this.appService.doGET('api/Enum/GetETypeType', null);\r\n if (result && result.Status === 1) {\r\n this.Types = result.Data;\r\n this.TypesFilter = this.Types.slice();\r\n }\r\n }\r\n\r\n async getPageByOffice() {\r\n const result = await this.appService.doGET('api/Type/GetPageByOffice', null);\r\n if (result && result.Status === 1) {\r\n this.PageOffices = result.Data;\r\n }\r\n\r\n }\r\n\r\n TypesHandleFilter(value) {\r\n this.TypesFilter = this.Types.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n async addType() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Type', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateType() {\r\n this.appComponent.loading = true;\r\n const id = this.dataTypeItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPUT('api/Type', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewType();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteType() {\r\n if (this.dataTypeSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataTypeSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Type/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewType();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataTypeSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n}\r\n","module.exports = \":host ::ng-deep .k-tabstrip>.k-content {\\r\\n background-color: #f6f6f6 !important;\\r\\n}\\r\\n\\r\\n.dialog-post {\\r\\n z-index: 1000 !important;\\r\\n}\\r\\n\\r\\npre {\\r\\n font-family: -apple-system,BlinkMacSystemFont,\\\"Segoe UI\\\",Roboto,\\\"Helvetica Neue\\\",Arial,\\\"Noto Sans\\\",sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\",\\\"Segoe UI Symbol\\\",\\\"Noto Color Emoji\\\";\\r\\n white-space: pre-wrap;\\r\\n margin-bottom: 0;\\r\\n color: navy;\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 76px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 94%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn-user{\\r\\n position: fixed;\\r\\n top: 193px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 300px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvbS91bml0L3VuaXQuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLHdCQUF3QjtBQUM1Qjs7QUFFQTtJQUNJLHVMQUF1TDtJQUN2TCxxQkFBcUI7SUFDckIsZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxlQUFlO0FBQ25COztBQUVBLG1CQUFtQjs7QUFDbkI7SUFDSSxlQUFlO0lBQ2YsU0FBUztJQUNULGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLFVBQVU7QUFDZDs7QUFFQTtJQUNJLGVBQWU7SUFDZixVQUFVO0lBQ1YsY0FBYztJQUNkLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtBQUNqQjs7QUFFQTtJQUNJO1FBQ0ksZUFBZTtRQUNmLFNBQVM7UUFDVCxjQUFjO1FBQ2QsWUFBWTtRQUNaLFVBQVU7UUFDVixVQUFVO0lBQ2Q7O0lBRUE7UUFDSSxlQUFlO1FBQ2YsVUFBVTtRQUNWLGNBQWM7UUFDZCxZQUFZO1FBQ1osVUFBVTtRQUNWLFVBQVU7SUFDZDtBQUNKOztBQUVBLG1CQUFtQjs7QUFFbkI7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakIiLCJmaWxlIjoic3JjL2FwcC9tL3VuaXQvdW5pdC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiOmhvc3QgOjpuZy1kZWVwIC5rLXRhYnN0cmlwPi5rLWNvbnRlbnQge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjZmNiAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uZGlhbG9nLXBvc3Qge1xyXG4gICAgei1pbmRleDogMTAwMCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG5wcmUge1xyXG4gICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LFwiU2Vnb2UgVUlcIixSb2JvdG8sXCJIZWx2ZXRpY2EgTmV1ZVwiLEFyaWFsLFwiTm90byBTYW5zXCIsc2Fucy1zZXJpZixcIkFwcGxlIENvbG9yIEVtb2ppXCIsXCJTZWdvZSBVSSBFbW9qaVwiLFwiU2Vnb2UgVUkgU3ltYm9sXCIsXCJOb3RvIENvbG9yIEVtb2ppXCI7XHJcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbn1cclxuXHJcbi8qIHN0aWNreSB0b29sYmFyICovXHJcbi5zdGlja3ktZ3JvdXAtc2VhcmNoIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogNzZweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OCU7XHJcbn1cclxuXHJcbi5zdGlja3ktdG9vbGJhci1idG4tdXNlcntcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMTkzcHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTkuNTUlO1xyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY4cHgpIHtcclxuICAgIC5zdGlja3ktZ3JvdXAtc2VhcmNoIHtcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiA3NnB4O1xyXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIHdpZHRoOiA5NCU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5zdGlja3ktdG9vbGJhci1idG4tdXNlcntcclxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICAgICAgdG9wOiAxOTNweDtcclxuICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICB3aWR0aDogOTklO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqL1xyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5zdGlja3ktaGVhZGVyLWdyaWQgLmstZ3JpZCAuay1ncmlkLWhlYWRlciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDMwMHB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk3LjU1JTtcclxufSJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'DelFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { saveAs } from '@progress/kendo-file-saver';\r\nimport { Http } from '@angular/http';\r\nimport { KendoButtonService } from '@progress/kendo-angular-buttons/dist/es2015/button/button.service';\r\nimport { DataSource } from '@angular/cdk/table';\r\nimport * as DecoupledEditor from '@ckeditor/ckeditor5-build-decoupled-document';\r\n\r\n@Component({\r\n selector: 'app-unit',\r\n templateUrl: './unit.component.html',\r\n styleUrls: ['./unit.component.css']\r\n})\r\nexport class UnitComponent implements OnInit, OnDestroy {\r\n\r\n isStickySearch = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isStickySearch = window.pageYOffset >= 140;\r\n }\r\n\r\n user: any;\r\n loading = false;\r\n dataUnits = [];\r\n dataUnitSelectableSettings: SelectableSettings;\r\n dataUnitSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataUnitFocus = {\r\n Name: true\r\n };\r\n dataUnitSortByField: SortDescriptor[] = [];\r\n\r\n public WORKING_NUM_PAGING_SKIP = 0;\r\n public WORKING_NUM_PAGING_TAKE = 50;\r\n public WORKING_NUM_PAGING_BTN = 5;\r\n\r\n dataUnitSkip = this.WORKING_NUM_PAGING_SKIP;\r\n dataUnitPageSize = this.WORKING_NUM_PAGING_TAKE;\r\n dataUnitSelection: number[] = [];\r\n dataUnitItem: any;\r\n dataUnitItemEnLanguage: any;\r\n dataUnitItemtemp: any;\r\n myInterval: any;\r\n infoOpened = false;\r\n\r\n public buttonCount = this.WORKING_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataUnitState: State = {\r\n skip: this.dataUnitSkip,\r\n take: this.dataUnitSkip + this.dataUnitPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n dataUnitGridDataResult: GridDataResult;\r\n\r\n units: Array<{ Name: string, ID: string }>;\r\n unitsFilter: Array<{ Name: string, ID: string }>;\r\n unitfile: Array<{ Name: string, ID: string }>;\r\n\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n pageName: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n InputingFile = false;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n public Editor = DecoupledEditor;\r\n config = {\r\n toolbar: ['heading',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'link',\r\n 'bulletedList',\r\n 'numberedList',\r\n '|',\r\n 'indent',\r\n 'outdent',\r\n '|',\r\n 'insertTable',\r\n 'mediaEmbed',\r\n 'undo',\r\n 'redo']\r\n }\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private http: Http,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.onReload();\r\n this.initDisplay();\r\n this.getPageName();\r\n }\r\n\r\n unitsHandleFilter(value) {\r\n this.unitsFilter = this.units.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.allowMulti = !this.allowMulti;\r\n if (this.InputingFile === true) {\r\n this.allowMulti = false;\r\n this.dataUnitSelectableSettings = {\r\n enabled: false,\r\n mode: 'single'\r\n };\r\n } else {\r\n this.dataUnitSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n }\r\n\r\n setSelectableSettingsFile(): void {\r\n this.dataUnitSelectableSettings = {\r\n enabled: true,\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getUnits() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText\r\n };\r\n\r\n const result = await this.appService.doGET('api/Unit/Search', dataRequest);\r\n if (result && result.Status) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < result.Data.length; i++) {\r\n if (result.Data[i].ParentID !== '') {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let j = 0; j < result.Data.length; j++) {\r\n if (result.Data[i].ParentID === result.Data[j].ID) {\r\n result.Data[i].ParentName = result.Data[j].Name\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.dataUnits = result.Data;\r\n this.bindUnits();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n\r\n this.getUnitParent();\r\n }\r\n\r\n async getUnitParent() {\r\n const result = await this.appService.doGET('api/Unit', null);\r\n if (result && result.Status) {\r\n this.units = result.Data;\r\n this.unitsFilter = this.units.slice();\r\n }\r\n }\r\n\r\n checkSelectionID() {\r\n for (let i = this.dataUnitSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataUnits.find((item) => {\r\n return item.ID === this.dataUnitSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataUnitSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataUnitItem = {\r\n IsAdd: true,\r\n ID: '',\r\n Name: '',\r\n ParentID: '',\r\n ParentName: '',\r\n DelFlg: false,\r\n OrderIdx: 0,\r\n Description: ''\r\n };\r\n this.dataUnitItemEnLanguage = {\r\n ID: null,\r\n UnitID: null,\r\n Name: null,\r\n Description: null,\r\n CreateAt: null,\r\n CreateBy: null,\r\n UpdateAt: null,\r\n UpdateBy: null,\r\n LanguageID: null,\r\n };\r\n this.dataUnitItemtemp = Object.assign({}, this.dataUnitItem);\r\n\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.dataUnitSelection = [];\r\n }\r\n bindtemp(item) {\r\n this.dataUnitItemtemp = Object.assign({}, item);\r\n }\r\n\r\n onUnitPageChange(event: PageChangeEvent) {\r\n this.dataUnitSkip = event.skip;\r\n this.bindUnits();\r\n }\r\n\r\n async onUnitSelectedKeysChange() {\r\n if (this.dataUnitSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n if (this.dataUnitSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n if (this.dataUnits.length > 0 && this.InputingFile === false) {\r\n const selectedID = this.dataUnitSelection[0];\r\n const selectedItem = this.dataUnits.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataUnitItem = selectedItem;\r\n this.bindtemp(this.dataUnitItem);\r\n }\r\n }\r\n }\r\n\r\n bindUnits() {\r\n this.dataUnitGridDataResult = {\r\n data: orderBy(this.dataUnits, this.dataUnitSortByField),\r\n total: this.dataUnits.length\r\n };\r\n\r\n this.dataUnitGridDataResult = process(this.dataUnits, this.dataUnitState);\r\n }\r\n\r\n onUnitSortChange(sort: SortDescriptor[]): void {\r\n this.dataUnitSortByField = sort;\r\n this.bindUnits();\r\n }\r\n\r\n public onUnitDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataUnitSelection = [];\r\n this.dataUnitState = state;\r\n this.dataUnitGridDataResult = process(this.dataUnits, this.dataUnitState);\r\n }\r\n\r\n getColumnIndex(name) {\r\n const columns = [\r\n // 'ID',\r\n 'Name',\r\n 'ParentID',\r\n 'OrderIdx',\r\n 'Description'\r\n ];\r\n\r\n return columns.indexOf(name);\r\n }\r\n\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n const extension = e.files[0].extension.toLowerCase();\r\n if (!extension || (extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.pdf')) {\r\n\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .xlsx, .xls.', false);\r\n\r\n return false;\r\n }\r\n\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n this.InputingFile = true;\r\n this.setSelectableSettings();\r\n this.dataUnits = [];\r\n const unitListTemp = this.units.slice();\r\n\r\n const parentIdx = this.getColumnIndex('ParentID');\r\n let checkUnit;\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 1; i < fileData.length; i++) {\r\n checkUnit = unitListTemp.find(x => x.ID === fileData[i][parentIdx] || x.Name === fileData[i][parentIdx]);\r\n\r\n const obj = {\r\n IsAdd: false,\r\n Name: fileData[i][this.getColumnIndex('Name')],\r\n ParentID: checkUnit ? checkUnit.ID : null,\r\n ParentName: checkUnit ? checkUnit.Name : null,\r\n OrderIdx: fileData[i][this.getColumnIndex('OrderIdx')],\r\n Description: fileData[i][this.getColumnIndex('Description')]\r\n };\r\n\r\n this.dataUnits.push(obj);\r\n }\r\n this.bindUnits();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n this.getUnits();\r\n }\r\n\r\n async initDisplay() {\r\n\r\n }\r\n\r\n onSearch() {\r\n this.getUnits();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.InputingFile = false;\r\n this.setSelectableSettingsFile();\r\n this.searchOption.SearchText = '';\r\n this.getUnits();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearUnit() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n async getUnit() {\r\n const result = await this.appService.doGET('api/Unit', null);\r\n if (result.Status) {\r\n this.unitfile = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < result.Data.length; i++) {\r\n this.unitfile.push({\r\n ID: result.Data[i].ID,\r\n Name: result.Data[i].Name\r\n });\r\n }\r\n }\r\n }\r\n\r\n async onAddNewUnit() {\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.setDefault();\r\n this.infoOpened = true;\r\n const resultUnit = await this.appService.doGET('api/Unit', null);\r\n if (resultUnit && resultUnit.Status === 1) {\r\n this.units = resultUnit.Data;\r\n this.unitsFilter = this.units.slice();\r\n }\r\n\r\n }\r\n\r\n onSaveUnit() {\r\n if (this.dataUnitItem.IsAdd) {\r\n this.addUnit();\r\n } else {\r\n this.updateUnit();\r\n }\r\n\r\n }\r\n\r\n async onSaveUnits() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataUnits.length; i++) {\r\n // check duplicate data\r\n let unit = this.dataUnits[i];\r\n const dataRequest = {\r\n searchText: unit.Name\r\n };\r\n const resultUnitListFromServer = await this.appService.doGET('api/Part/Search', dataRequest);\r\n let isDuplicate = false;\r\n if (resultUnitListFromServer && resultUnitListFromServer.Data &&\r\n resultUnitListFromServer.Data.length > 0) {\r\n resultUnitListFromServer.Data.forEach(element => {\r\n if (element.Name == unit.Name) {\r\n isDuplicate = true;\r\n }\r\n });\r\n }\r\n if (isDuplicate == false) {\r\n dataRequests.push(this.createDataRequest(this.dataUnits[i]));\r\n }\r\n }\r\n const result = await this.appService.doPOST('api/Unit/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataUnitItemtemp;\r\n const tempEnLanguage = this.dataUnitItemEnLanguage;\r\n return {\r\n Unit: {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n ParentID: temp.ParentID,\r\n ParentName: temp.ParentName,\r\n DelFlg: temp.DelFlg,\r\n OrderIdx: temp.OrderIdx,\r\n Description: temp.Description\r\n },\r\n EnLanguage: {\r\n ID: tempEnLanguage.ID,\r\n UnitID: tempEnLanguage.UnitID,\r\n Name: tempEnLanguage.Name,\r\n Description: tempEnLanguage.Description,\r\n CreateAt: tempEnLanguage.CreateAt,\r\n CreateBy: tempEnLanguage.CreateBy,\r\n UpdateAt: tempEnLanguage.UpdateAt,\r\n UpdateBy: tempEnLanguage.UpdateBy,\r\n LanguageID: 'en-US'\r\n }\r\n \r\n };\r\n }\r\n\r\n onEditUnit() {\r\n this.infoOpened = true;\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.getLanguage();\r\n }\r\n\r\n async addUnit() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Unit', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateUnit() {\r\n this.appComponent.loading = true;\r\n const id = this.dataUnitItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPUT('api/Unit', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteUnit() {\r\n if (this.dataUnitSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataUnitSelection),\r\n FlgRevert: false\r\n };\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Unit/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataUnitSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n async getLanguage(){\r\n var k = 0;\r\n if(this.dataUnitItem.ID != null){\r\n const dataRequest = {\r\n id: this.dataUnitItem.ID\r\n }\r\n const result = await this.appService.doGET('api/Unit/GetUnitLanguage', dataRequest);\r\n if (result && result.Status == 1) {\r\n for(let i = 0; i < result.Data.length; i++){\r\n if(result.Data[i].LanguageID == \"en-US\"){\r\n this.dataUnitItemEnLanguage = result.Data[i];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public onTabSelect(e) {\r\n \r\n }\r\n\r\n async onReOpenRp(){\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataUnitItem.ID;\r\n\r\n const result = await this.appService.doGET('api/Unit/ReOpenRp', { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL20vdmlkZW8vdmlkZW8uY29tcG9uZW50LmNzcyJ9 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n Your browser does not support the video tag.\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n {{dataItem.HotFlg === 1 ? 'Hiển thị (Trang chủ)' : 'Không hiển thị (Trang chủ)'}}\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Hiển thị ra trang chủ' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, UploadEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { AppConsts } from 'src/app/services/app.consts';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { GroupResult, groupBy } from '@progress/kendo-data-query';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport * as FileSaver from 'file-saver';\r\n\r\n@Component({\r\n selector: 'app-video',\r\n templateUrl: './video.component.html',\r\n styleUrls: ['./video.component.css']\r\n})\r\nexport class VideoComponent implements OnInit {\r\n\r\n user: any;\r\n loading = false;\r\n\r\n dataFiles = [];\r\n dataFileSelectableSettings: SelectableSettings;\r\n dataFileSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n\r\n dataFileSortByField: SortDescriptor[] = [\r\n ];\r\n\r\n public events: string[] = [];\r\n\r\n\r\n public fileSaveUrl: any;\r\n\r\n\r\n //used for kendo grid\r\n public WORKING_NUM_PAGING_SKIP = 0;\r\n public WORKING_NUM_PAGING_TAKE = 50;\r\n public WORKING_NUM_PAGING_BTN = 5;\r\n public buttonCount = this.WORKING_NUM_PAGING_BTN;\r\n // paging in grid\r\n dataFileSkip = this.WORKING_NUM_PAGING_SKIP;\r\n dataFilePageSize = this.WORKING_NUM_PAGING_TAKE;\r\n\r\n dataFileSelection: string[] = []; //to store track of selected rows by ID\r\n dataFileItem: any; //selected record\r\n myInterval: any; //interval time to do async jobs periodically in Observable\r\n\r\n // vars are used for showed FileUrls file\r\n dataFileIDFileUrl: any;\r\n dataFileIDFileUrls: any[];\r\n\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n // kendo grid\r\n public dataFileState: State = {\r\n skip: this.dataFileSkip,\r\n take: this.dataFileSkip + this.dataFilePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n // data source for kendo grid\r\n dataFileGridDataResult: GridDataResult;\r\n\r\n roles: Array<{ ID: string, Name: string }>;\r\n rolesFilter: Array<{ ID: string, Name: string }>;\r\n\r\n // 'Phân quyền tài liệu' kendo-combobox\r\n AssignUnitsFiles: Array = []; // { ID: string, Name: string, GroupBy : string }\r\n AssignUnitsFilesFilter: Array = [];\r\n AssignUnitsFiles_GroupResult: GroupResult[];\r\n\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n pageName: any;\r\n\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n\r\n filesUpload: Array;\r\n filesUploadName = \"\";\r\n infoOpened = false;\r\n allowInsertFile = false;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n private notification: Notification,\r\n private file: AppFile,\r\n private consts: AppConsts,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appComponent: AppComponent,\r\n private appGuid: AppGuid\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.getControl();\r\n this.getPageName();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.get4Type();\r\n this.getSearchMenus();\r\n this.getFileType();\r\n this.getMenus();\r\n this.onReload();\r\n this.initDisplay();\r\n this.allData = this.allData.bind(this);\r\n }\r\n\r\n // used to export all kendo-grid data(not care for paging) to excel file(s)\r\n public allData(): ExcelExportData {\r\n this.appComponent.loading = true;\r\n const result: ExcelExportData = {\r\n data: process(this.dataFiles, { sort: this.dataFileSortByField }).data\r\n };\r\n this.appComponent.loading = false;\r\n return result;\r\n }\r\n\r\n rolesHandleFilter(value) {\r\n this.rolesFilter = this.roles.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n AssignUnitsFilesHandleFilter(value) {\r\n this.AssignUnitsFilesFilter = this.AssignUnitsFiles.filter((s) => s.ID != null);\r\n this.AssignUnitsFiles_GroupResult = groupBy(this.AssignUnitsFilesFilter, [{ field: \"GroupBy\" }]);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.allowMulti = !this.allowMulti;\r\n this.dataFileSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getFiles() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText,\r\n menuid: this.searchMenuText,\r\n type: 1\r\n };\r\n\r\n const result = await this.appService.doGET('api/File/Search', dataRequest);\r\n if (result) {\r\n this.dataFiles = result.Data;\r\n this.bindFiles();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n for (let i = this.dataFileSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataFiles.find((item) => {\r\n return item.ID === this.dataFileSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataFileSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n public GUID_EMPTY = \"00000000-0000-0000-0000-000000000000\";\r\n dataFileItemtemp: any;\r\n setDefault() {\r\n this.dataFileItem = {\r\n IsAdd: true,\r\n ID: null,\r\n Name: '',\r\n LinkUrl: '',\r\n FileUrl: '',\r\n MenuID: this.GUID_EMPTY,\r\n Type: 1,\r\n HotFlg: false,\r\n ActivedFlg: false,\r\n BannerType: -1,\r\n OrderIdx: 0,\r\n CreateAt: null\r\n };\r\n this.dataFileItemtemp = {\r\n IsAdd: true,\r\n ID: null,\r\n Name: '',\r\n LinkUrl: '',\r\n FileUrl: '',\r\n MenuID: this.GUID_EMPTY,\r\n Type: 1,\r\n HotFlg: false,\r\n ActivedFlg: false,\r\n BannerType: -1,\r\n OrderIdx: 0,\r\n CreateAt: null\r\n };\r\n this.searchMenuText = this.GUID_EMPTY;\r\n this.searchFiletype = 0;\r\n this.filesUpload = [];\r\n this.filesUploadName = \"\";\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.dataFileItemtemp.UserName = this.user.UserName;\r\n this.dataFileSelection = [];\r\n }\r\n\r\n bindtemp(item) {\r\n this.dataFileItemtemp.ID = item.ID;\r\n this.dataFileItemtemp.Name = item.Name;\r\n this.dataFileItemtemp.LinkUrl = item.LinkUrl;\r\n this.dataFileItemtemp.FileUrl = item.FileUrl;\r\n this.dataFileItemtemp.ActivedFlg = item.ActivedFlg;\r\n this.dataFileItemtemp.HotFlg = item.HotFlg;\r\n this.dataFileItemtemp.MenuID = item.MenuID;\r\n this.dataFileItemtemp.Type = item.Type;\r\n this.dataFileItemtemp.BannerType = item.BannerType;\r\n this.dataFileItemtemp.OrderIdx = item.OrderIdx;\r\n this.dataFileItemtemp.CreateAt = item.CreateAt;\r\n }\r\n\r\n onFilePageChange(event: PageChangeEvent) {\r\n this.dataFileSkip = event.skip;\r\n this.bindFiles();\r\n }\r\n\r\n // handle event of SelectedKeysChange\r\n async onFileSelectedKeysChange(event) {\r\n if (this.dataFileSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n // flag to check multi-select allowed\r\n if (this.dataFileSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n }\r\n // single select\r\n else {\r\n const selectedID = this.dataFileSelection[0];\r\n const selectedItem = this.dataFiles.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n this.dataFileItem = selectedItem;\r\n this.bindtemp(this.dataFileItem);\r\n //show file uploaded\r\n this.filesUpload = [];\r\n this.filesUploadName = this.getFileName(this.dataFileItem.FileUrl);\r\n\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n // rebinding data onto kendo grid based on current page\r\n bindFiles() {\r\n this.dataFileGridDataResult = {\r\n data: orderBy(this.dataFiles, this.dataFileSortByField),\r\n total: this.dataFiles.length\r\n };\r\n\r\n this.dataFileGridDataResult = process(this.dataFiles, this.dataFileState);\r\n }\r\n\r\n onFileSortChange(sort: SortDescriptor[]): void {\r\n this.dataFileSortByField = sort;\r\n this.bindFiles();\r\n }\r\n\r\n public onFileDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataFileSelection = [];\r\n this.dataFileState = state;\r\n this.dataFileGridDataResult = process(this.dataFiles, this.dataFileState);\r\n }\r\n\r\n // column titles of kendo-grid. support for reading .xlsx files\r\n getColumnIndex(name) {\r\n let columns = [];\r\n columns = [\r\n 'Code',\r\n 'SerialNo',\r\n 'Title',\r\n 'Description',\r\n 'UserName',\r\n 'AssignUnits',\r\n 'FileUrls',\r\n 'DelFlg'\r\n ];\r\n return columns.indexOf(name);\r\n }\r\n\r\n // only read the first sheet of .xlsx files and rebind onto kendo grid\r\n async selectEventHandler(e: SelectEvent) {\r\n this.appComponent.loading = true;\r\n const fileData = (await this.file.readXLSX(e.files[0].rawFile)) as Array;\r\n this.dataFiles = [];\r\n for (let i = 1; i < fileData.length; i++) {\r\n if (fileData[i].length > 1) {\r\n this.dataFiles.push({\r\n IsAdd: false,\r\n Code: fileData[i][this.getColumnIndex('Code')],\r\n SerialNo: fileData[i][this.getColumnIndex('SerialNo')],\r\n Title: fileData[i][this.getColumnIndex('Title')],\r\n Description: fileData[i][this.getColumnIndex('Description')],\r\n UserName: fileData[i][this.getColumnIndex('UserName')],\r\n AssignUnits: fileData[i][this.getColumnIndex('AssignUnits')],\r\n FileUrls: fileData[i][this.getColumnIndex('FileUrls')],\r\n DelFlg: fileData[i][this.getColumnIndex('DelFlg')]\r\n });\r\n }\r\n }\r\n this.dataFileSelection = [];\r\n this.bindFiles();\r\n this.isEnabledSaveAll = true;\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // Fires when an uploaded .xlsx file is about to be removed\r\n removeEventHandler() {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n\r\n\r\n // handle changed search-text event\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n this.getFiles();\r\n }\r\n\r\n async initDisplay() {\r\n const resultRole = await this.appService.doGET('api/Role', null);\r\n if (resultRole && resultRole.Status === 1) {\r\n this.roles = resultRole.Data;\r\n this.rolesFilter = this.roles.slice();\r\n }\r\n }\r\n\r\n onSearch() {\r\n this.getFiles();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.getFiles();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n // no use\r\n onClearFile() {\r\n this.setDefault();\r\n }\r\n\r\n // handle event of multi-select allowed button\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n // handle button AddNew\r\n onAddNewFile() {\r\n this.setDefault();\r\n\r\n this.infoOpened = true;\r\n }\r\n\r\n onSaveFile() {\r\n if (this.dataFileItem.IsAdd) {\r\n this.addFile();\r\n }\r\n else {\r\n this.updateFile();\r\n }\r\n }\r\n\r\n // store all current data records on kendo grid into db such as data read from .xlsx files\r\n async onSaveFiles() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n for (let i = 0; i < this.dataFiles.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataFiles[i]));\r\n }\r\n const result = await this.appService.doPOST('api/File/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // create request sent to server to add new or update data record\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataFileItemtemp;\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n LinkUrl: temp.LinkUrl,\r\n FileUrl: temp.FileUrl,\r\n Type: 1,\r\n MenuID: temp.MenuID,\r\n ActivedFlg: true,\r\n HotFlg: temp.HotFlg,\r\n OrderIdx: temp.OrderIdx,\r\n BannerType: 0,\r\n CreateAt: temp.CreateAt\r\n };\r\n }\r\n\r\n // handle event of editing selected file\r\n onEditFile() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n\r\n async addFile() {\r\n this.appComponent.loading = true;\r\n this.dataFileItemtemp.ID = this.appGuid.create();\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/File/AddFile', dataRequest);\r\n if (result) {\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewFile();\r\n this.dataFileSelection = [];\r\n this.infoOpened = false;\r\n } else if (result && result.Status !== 1) {\r\n if (typeof (result.Msg) != 'undefined' && result.Msg != null) {\r\n this.appSwal.showError(result.Msg);\r\n }\r\n }\r\n else {\r\n this.appSwal.showError(JSON.stringify(result));\r\n }\r\n } else {\r\n this.appSwal.showError(\"Don't connect server API!\");\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateFile() {\r\n this.appComponent.loading = true;\r\n const id = this.dataFileItem.ID;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPUT('api/File/UpdateFile', dataRequest, { id });\r\n if (result) {\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewFile();\r\n this.dataFileSelection = [];\r\n this.infoOpened = false;\r\n } else if (result && result.Status !== 1) {\r\n if (typeof (result.Msg) != 'undefined' && result.Msg != null) {\r\n this.appSwal.showError(result.Msg);\r\n }\r\n }\r\n else {\r\n this.appSwal.showError(JSON.stringify(result));\r\n }\r\n } else {\r\n this.appSwal.showError(\"Don't connect server API!\");\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n // delete multi data records\r\n async onDeleteFile() {\r\n if (this.dataFileSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataFileSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPUT('api/File/Deletes', dataRequest, null);\r\n // if delete all ok\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.dataFileItem.UserName = '';\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataFileSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n //select file to upload\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return;\r\n }\r\n\r\n const extension = e.files[0].extension.toLowerCase();\r\n\r\n this.allowInsertFile = true;\r\n\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n // this.dataTemplateFileUrls = [];\r\n // this.bindTemplateFileUrls();\r\n }\r\n } catch {\r\n }\r\n\r\n // tslint:disable-next-line: max-line-length\r\n if (!extension || (extension.toLowerCase() !== '.mp4')) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .mp4', false);\r\n // this.dataTemplateFileUrls = [];\r\n // this.bindTemplateFileUrls();\r\n\r\n return false;\r\n }\r\n }\r\n\r\n //remove file to upload\r\n onRemoveFileToUpload() {\r\n this.dataFileItemtemp.FileUrl = '';\r\n this.filesUploadName = '';\r\n this.filesUpload = [];\r\n }\r\n\r\n // public uploadRestrictions: FileRestrictions = {\r\n // //allowedExtensions: ['.jpg', '.jpeg', '.tif', '.gif', '.webm', '.mkv', '.flv', '.vob', '.ogv', '.ogg', '.avi', '.TS', '.mov', '.qt', '.wmv', '.yuv', '.rm', '.rmvb', '.asf', '.amv', '.mp4', '.m4p', '.m4v', '.mpg', '.mp2', '.mpeg', '.mpe', '.mpv', '.m2v', '.3gp', '.3g2', '.svi', '.nsv', '.f4v', '.f4p', '.f4a', '.f4b', '.MTS', '.M2TS', '.png']\r\n // allowedExtensions: ['.mp4']\r\n // };\r\n\r\n //success upload\r\n onSuccessFileToUpload(e: any) {\r\n\r\n if (!this.allowInsertFile) {\r\n return;\r\n }\r\n\r\n try {\r\n if (e.response.body.Data.MediaNm[0].match(/.(jpg|jpeg|tif|png|gif)$/i)) {\r\n this.dataFileItemtemp.Type = 0;\r\n } else if (e.response.body.Data.MediaNm[0].match(/.(webm|mkv|flv|vob|ogv|ogg|avi|TS|mov|qt|wmv|yuv|rm|rmvb|asf|amv|mp4|m4p|m4v|mpg|mp2|mpeg|mpe|mpv|m2v|3gp|3g2|svi|nsv|f4v|f4p|f4a|f4b|MTS|M2TS)$/i)) {\r\n this.dataFileItemtemp.Type = 1;\r\n }\r\n else {\r\n this.filesUpload = [];\r\n this.onRemoveFileToUpload();\r\n this.appSwal.showWarning(this.translate.instant('File_IncorrectFormat'), false);\r\n return;\r\n }\r\n this.dataFileItemtemp.FileUrl = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n } catch {\r\n this.filesUpload = [];\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n getFileName(fileUrls) {\r\n var nameFile = \"temp.txt\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n\r\n parentMenus: Array<{ Name: string, ID: string }>;\r\n parentMenusFilter: Array<{ Name: string, ID: string }>;\r\n\r\n parentMenusHandleFilter(value) {\r\n this.parentMenusFilter = this.parentMenus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n async getMenus() {\r\n this.loading = true;\r\n const dataRequest = {\r\n pageID: 'portal/videos'\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/GetMenuByPageID', dataRequest);\r\n if (result) {\r\n this.parentMenus = [];\r\n result.Data.forEach(item => {\r\n this.parentMenus.push(item);\r\n });\r\n this.parentMenusFilter = this.parentMenus.slice();\r\n }\r\n this.loading = false;\r\n }\r\n\r\n Types: Array<{ Name: string, ID: number }>;\r\n TypesFilter: Array<{ Name: string, ID: number }>;\r\n\r\n get4Type() {\r\n this.Types = [\r\n { Name: 'Không hiển thị (Trang chủ)', ID: -1 },\r\n { Name: 'Banner trái (Trang chủ)', ID: 0 },\r\n { Name: 'Banner phải (Trang chủ)', ID: 1 }\r\n ];\r\n this.TypesFilter = this.Types.slice();\r\n this.loading = false;\r\n }\r\n\r\n searchMenus: Array<{ Name: string, ID: string }>;\r\n searchMenusFilter: Array<{ Name: string, ID: string }>;\r\n\r\n searchMenusHandleFilter(value) {\r\n this.searchMenusFilter = this.searchMenus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n async getSearchMenus() {\r\n\r\n this.loading = true;\r\n const dataRequest = {\r\n pageID: 'portal/videos'\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/GetMenuByPageID', dataRequest);\r\n if (result) {\r\n this.searchMenus = [];\r\n result.Data.forEach(item => {\r\n this.searchMenus.push(item);\r\n });\r\n this.searchMenusFilter = this.searchMenus.slice();\r\n }\r\n this.loading = false;\r\n }\r\n\r\n searchMenuText: string;\r\n searchFiletype: number;\r\n\r\n MenuSearchChange(value: any) {\r\n if (value == undefined) {\r\n this.searchMenuText = \"all\";\r\n } else {\r\n this.searchMenuText = value;\r\n }\r\n this.getFiles();\r\n }\r\n\r\n FileTypeSearchChange(value: any) {\r\n if (value == undefined) {\r\n this.searchFiletype = 0;\r\n } else {\r\n this.searchFiletype = value;\r\n }\r\n\r\n this.getFiles();\r\n }\r\n\r\n FileTypes: Array<{ Name: string, ID: number }>;\r\n FileTypesFilter: Array<{ Name: string, ID: number }>;\r\n getFileType() {\r\n var a = [];\r\n a[0] = this.translate.instant('allMenu');\r\n a[1] = this.translate.instant('FileImage');\r\n a[2] = this.translate.instant('FileVideo');\r\n this.FileTypes = [];\r\n for (let i = 0; i < 3; i++) {\r\n this.FileTypes.push({\r\n ID: i,\r\n Name: a[i]\r\n });\r\n }\r\n this.FileTypesFilter = this.FileTypes.slice();\r\n this.loading = false;\r\n }\r\n\r\n searchFileTypesHandleFilter(value) {\r\n this.FileTypesFilter = this.FileTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n}\r\n","module.exports = \"\\r\\n.table {\\r\\n /* width: 750px; */\\r\\n /* phong */\\r\\n border:1px solid lightgray;\\r\\n}\\r\\n\\r\\n.columnTitle {\\r\\n font-size: 16px;\\r\\n font-weight: bold;\\r\\n padding-top: 20px;\\r\\n padding-bottom: 20px;\\r\\n padding-left: 10px;\\r\\n padding-right: 10px;\\r\\n align-self: center;\\r\\n}\\r\\n\\r\\n.content {\\r\\n font-size: 14px;\\r\\n padding-top: 20px;\\r\\n padding-bottom: 20px;\\r\\n padding-left: 10px;\\r\\n padding-right: 10px;\\r\\n align-self: center;\\r\\n border-left:1px solid lightgray;\\r\\n}\\r\\n\\r\\n.title {\\r\\n padding-left:20px; \\r\\n margin-top:30px; \\r\\n margin-bottom: 30px;\\r\\n padding-top:10px;\\r\\n padding-bottom: 10px;\\r\\n border-left: 5px solid #006CB7;\\r\\n font-size: 20px;\\r\\n font-weight: bold;\\r\\n color: black;\\r\\n /* width: 750px; */\\r\\n /* phong */\\r\\n background: #F9F9F9;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL2FkbWktcHJvYy1kZXRhaWwvYWRtaS1wcm9jLWRldGFpbC5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQTtJQUNJLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsK0JBQStCO0FBQ25DOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtJQUNwQiw4QkFBOEI7SUFDOUIsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVixtQkFBbUI7QUFDdkIiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvYWRtaS1wcm9jLWRldGFpbC9hZG1pLXByb2MtZGV0YWlsLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLnRhYmxlIHtcclxuICAgIC8qIHdpZHRoOiA3NTBweDsgKi9cclxuICAgIC8qIHBob25nICovXHJcbiAgICBib3JkZXI6MXB4IHNvbGlkIGxpZ2h0Z3JheTtcclxufVxyXG5cclxuLmNvbHVtblRpdGxlIHtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgcGFkZGluZy10b3A6IDIwcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMjBweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XHJcbiAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5jb250ZW50IHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIHBhZGRpbmctdG9wOiAyMHB4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDIwcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xyXG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xyXG4gICAgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkIGxpZ2h0Z3JheTtcclxufVxyXG5cclxuLnRpdGxlIHtcclxuICAgIHBhZGRpbmctbGVmdDoyMHB4OyBcclxuICAgIG1hcmdpbi10b3A6MzBweDsgXHJcbiAgICBtYXJnaW4tYm90dG9tOiAzMHB4O1xyXG4gICAgcGFkZGluZy10b3A6MTBweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xyXG4gICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA2Q0I3O1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbiAgICAvKiB3aWR0aDogNzUwcHg7ICovXHJcbiAgICAvKiBwaG9uZyAqL1xyXG4gICAgYmFja2dyb3VuZDogI0Y5RjlGOTtcclxufSJdfQ== */\"","module.exports = \" \\r\\n\"","import { Component, OnInit, HostListener } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { AppService } from '../../services/app.service';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'app-admi-proc-detail',\r\n templateUrl: './admi-proc-detail.component.html',\r\n styleUrls: ['./admi-proc-detail.component.css']\r\n})\r\nexport class AdmiProcDetailComponent implements OnInit {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n dataAdProcDetail = null;\r\n loading = false;\r\n tableTest = [\r\n {\"Name\" : '12345',\r\n \"Content\": \"This is content\"\r\n },\r\n {\"Name\" : '12345',\r\n \"Content\": \"This is content2\"\r\n },\r\n {\"Name\" : '12345',\r\n \"Content\": \"This is content3\"\r\n },\r\n {\"Name\" : '12345',\r\n \"Content\": \"This is content4\"\r\n },\r\n {\"Name\" : '12345',\r\n \"Content\": \"This is content5\"\r\n },\r\n {\"Name\" : '12345',\r\n \"Content\": \"This is content6\"\r\n }\r\n ]\r\n constructor(\r\n private activatedRoute: ActivatedRoute,\r\n private appService: AppService,\r\n public domSanitizer: DomSanitizer,\r\n ) {\r\n this.activatedRoute.queryParams.subscribe((p: any) => {\r\n if (p && p.id) {\r\n this.getAdProcDetail(p.id);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getAdProcDetail(id) {\r\n this.loading = true;\r\n const dataRequest = {\r\n id: id\r\n };\r\n const result = await this.appService.doGET('api/AdProcedure', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataAdProcDetail = result.Data;\r\n }\r\n this.loading = false;\r\n \r\n }\r\n\r\n getUrlDownload(fileUrl) {\r\n let url = this.appService.apiRoot.replace(\"\\\"\",\"\") + fileUrl;\r\n url = url.replace(\"\\\"\", '')\r\n return url;\r\n }\r\n\r\n}\r\n","module.exports = \"\\r\\n/* .page {\\r\\n margin-top: 30px;\\r\\n margin-bottom: 30px; */\\r\\n /* margin-left: 113px; */\\r\\n /* margin-right: 30px;\\r\\n padding:20px; */\\r\\n /* width: 750px; */\\r\\n /* phong */\\r\\n /* } */\\r\\n /* .div {\\r\\n padding-left: 0px;\\r\\n padding-right: 0px;\\r\\n margin-left: 0px;\\r\\n margin-right: 0px;\\r\\n} */\\r\\n .searchTable {\\r\\n height: 100px;\\r\\n background: red;\\r\\n}\\r\\n .dropdown {\\r\\n background: white;\\r\\n width: 100%;\\r\\n /* height: 30px; */\\r\\n /* border: 0.5px solid #707070; */\\r\\n}\\r\\n .searchButton{\\r\\n width: 109px !important;\\r\\n height: 46px;\\r\\n border: none !important;\\r\\n background-color: #006CB7;\\r\\n color: white; \\r\\n float: right;\\r\\n}\\r\\n .officeName {\\r\\n font-size: 14px;\\r\\n color: black;\\r\\n font-weight: bold;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n .officeSumary {\\r\\n font-size: 14px;\\r\\n font-weight: normal;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n .officeButton {\\r\\n height: 30px;\\r\\n background-color: #006CB7;\\r\\n color: white;\\r\\n width: 100px;\\r\\n margin-right: 5px;\\r\\n border: none !important;\\r\\n}\\r\\n .title {\\r\\n padding-left:20px; \\r\\n margin-top:5px; \\r\\n padding-top:10px;\\r\\n padding-bottom: 10px;\\r\\n border-left: 5px solid #006CB7;\\r\\n font-size: 20px;\\r\\n font-weight: bold;\\r\\n color: black;\\r\\n margin-bottom: 30px;\\r\\n /* width: 750px; */\\r\\n /* phong */\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL2FkbWktcHJvYy9hZG1pLXByb2MuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0E7OzBCQUUwQjtJQUN0Qix3QkFBd0I7SUFDeEI7bUJBQ2U7SUFDZixrQkFBa0I7SUFDbEIsVUFBVTtJQUNkLE1BQU07SUFFTjs7Ozs7R0FLRztJQUVIO0lBQ0ksYUFBYTtJQUNiLGVBQWU7QUFDbkI7SUFFQTtJQUNJLGlCQUFpQjtJQUNqQixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLGlDQUFpQztBQUNyQztJQUVBO0lBQ0ksdUJBQXVCO0lBQ3ZCLFlBQVk7SUFDWix1QkFBdUI7SUFDdkIseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWixZQUFZO0FBQ2hCO0lBRUE7SUFDSSxlQUFlO0lBQ2YsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQixtQkFBbUI7QUFDdkI7SUFFQTtJQUNJLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsbUJBQW1CO0FBQ3ZCO0lBRUE7SUFDSSxZQUFZO0lBQ1oseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLHVCQUF1QjtBQUMzQjtJQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLDhCQUE4QjtJQUM5QixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLFVBQVU7QUFDZCIsImZpbGUiOiJzcmMvYXBwL3BvcnRhbC9hZG1pLXByb2MvYWRtaS1wcm9jLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyogLnBhZ2Uge1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDMwcHg7ICovXHJcbiAgICAvKiBtYXJnaW4tbGVmdDogMTEzcHg7ICovXHJcbiAgICAvKiBtYXJnaW4tcmlnaHQ6IDMwcHg7XHJcbiAgICBwYWRkaW5nOjIwcHg7ICovXHJcbiAgICAvKiB3aWR0aDogNzUwcHg7ICovXHJcbiAgICAvKiBwaG9uZyAqL1xyXG4vKiB9ICovXHJcblxyXG4vKiAuZGl2IHtcclxuICAgIHBhZGRpbmctbGVmdDogMHB4O1xyXG4gICAgcGFkZGluZy1yaWdodDogMHB4O1xyXG4gICAgbWFyZ2luLWxlZnQ6IDBweDtcclxuICAgIG1hcmdpbi1yaWdodDogMHB4O1xyXG59ICovXHJcblxyXG4uc2VhcmNoVGFibGUge1xyXG4gICAgaGVpZ2h0OiAxMDBweDtcclxuICAgIGJhY2tncm91bmQ6IHJlZDtcclxufVxyXG5cclxuLmRyb3Bkb3duIHtcclxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICAvKiBoZWlnaHQ6IDMwcHg7ICovXHJcbiAgICAvKiBib3JkZXI6IDAuNXB4IHNvbGlkICM3MDcwNzA7ICovXHJcbn1cclxuXHJcbi5zZWFyY2hCdXR0b257XHJcbiAgICB3aWR0aDogMTA5cHggIWltcG9ydGFudDtcclxuICAgIGhlaWdodDogNDZweDtcclxuICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNztcclxuICAgIGNvbG9yOiB3aGl0ZTsgXHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbn1cclxuXHJcbi5vZmZpY2VOYW1lIHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIGNvbG9yOiBibGFjaztcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxufVxyXG5cclxuLm9mZmljZVN1bWFyeSB7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxufVxyXG5cclxuLm9mZmljZUJ1dHRvbiB7XHJcbiAgICBoZWlnaHQ6IDMwcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgd2lkdGg6IDEwMHB4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XHJcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLnRpdGxlIHtcclxuICAgIHBhZGRpbmctbGVmdDoyMHB4OyBcclxuICAgIG1hcmdpbi10b3A6NXB4OyBcclxuICAgIHBhZGRpbmctdG9wOjEwcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcclxuICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwNkNCNztcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgY29sb3I6IGJsYWNrO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMzBweDtcclxuICAgIC8qIHdpZHRoOiA3NTBweDsgKi9cclxuICAgIC8qIHBob25nICovXHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'AdProcedure_PostalServiceFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Adminis_Label_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \"","import { Component, OnInit, HostListener } from '@angular/core';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Router } from '@angular/router';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\n@Component({\r\n selector: 'app-admi-proc',\r\n templateUrl: './admi-proc.component.html',\r\n styleUrls: ['./admi-proc.component.css']\r\n})\r\nexport class AdmiProcComponent implements OnInit {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n docTypeFilter: Array<{ Name: string, ID: string }> = [];\r\n dataAdProcedureGridDataResult: GridDataResult;\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n\r\n placeActives: Array<{ Name: string, ID: number }>;\r\n publicServices: Array<{ Name: string, ID: number }>;\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n dataOfficeSelection: number[] = [];\r\n dataOfficeItem: any;\r\n myInterval: any;\r\n\r\n dataFileUrls: any[];\r\n\r\n type: 0;\r\n\r\n dataAdProcedureSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataAdProcedurePageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataAdProcedureSelection: number[] = [];\r\n dataAdProcedureItem: any;\r\n\r\n dataAdProcedureSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataAdProcedureFocus = {\r\n Name: true\r\n };\r\n dataAdProcedureSortByField: SortDescriptor[] = [\r\n ];\r\n public dataAdProcedureState: State = {\r\n skip: this.dataAdProcedureSkip,\r\n take: this.dataAdProcedureSkip + this.dataAdProcedurePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n FieldTypeID: null,\r\n PlaceActive: -1,\r\n PublicService: -1,\r\n PostalServiceFlg: null\r\n };\r\n\r\n dataAdProcedures = [];\r\n adProceduresFilter = [];\r\n\r\n fieldTypes: Array<{ Name: string, ID: string }>;\r\n fieldTypesFilter: Array<{ Name: string, ID: string }>;\r\n fieldTypesSearch: Array<{ Name: string, ID: string }>;\r\n\r\n templateTypes: Array<{ Name: string, ID: string }> = [];\r\n templateTypesFilter: Array<{ Name: string, ID: string }> = [];\r\n\r\n baseJuridicalTypes: Array<{ Name: string, ID: string }> = [];\r\n baseJuridicalTypesFilter: Array<{ Name: string, ID: string }> = [];\r\n\r\n urlDownload = this.appService.apiRoot;\r\n constructor(\r\n private appService: AppService,\r\n public intl: IntlService,\r\n private router: Router,\r\n private appSwal: AppSwal,\r\n private translate: TranslateService\r\n ) {\r\n this.initDisplay();\r\n this.onSearch();\r\n }\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n bindAdProcedures() {\r\n this.dataAdProcedureGridDataResult = {\r\n data: orderBy(this.dataAdProcedures, this.dataAdProcedureSortByField),\r\n total: this.dataAdProcedures.length\r\n };\r\n\r\n this.dataAdProcedureGridDataResult = process(this.dataAdProcedures, this.dataAdProcedureState);\r\n }\r\n\r\n onAdProcedureselectedKeysChange(e) {\r\n if (this.dataAdProcedureSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n const selectedID = this.dataAdProcedureSelection[0];\r\n // navigate to detail\r\n // this.onGoToDetail(selectedID);\r\n }\r\n\r\n onAdProceduresortChange(sort: SortDescriptor[]): void {\r\n this.dataAdProcedureSortByField = sort;\r\n this.bindAdProcedures();\r\n }\r\n\r\n public onPostDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataAdProcedureSelection = [];\r\n this.dataAdProcedureState = state;\r\n this.dataAdProcedureGridDataResult = process(this.dataAdProcedures, this.dataAdProcedureState);\r\n }\r\n\r\n onSearch() {\r\n this.getAdProcedures();\r\n // this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n //this.searchOption.SearchText = '';\r\n this.getAdProcedures();\r\n // this.isEnabledSaveAll = false;\r\n }\r\n\r\n async initDisplay() {\r\n\r\n // mau don, to khai\r\n const resultTemplateType = await this.appService.doGET('api/AdProcedure/GetTemplateType', null);\r\n if (resultTemplateType && resultTemplateType.Status === 1) {\r\n this.templateTypes = resultTemplateType.Data;\r\n this.templateTypesFilter = this.templateTypes.slice();\r\n }\r\n\r\n // can cu phap ly\r\n const resultBaseJuridicalType = await this.appService.doGET('api/AdProcedure/GetBaseJuridicalType', null);\r\n if (resultBaseJuridicalType && resultBaseJuridicalType.Status === 1) {\r\n this.baseJuridicalTypes = resultBaseJuridicalType.Data;\r\n this.baseJuridicalTypesFilter = this.baseJuridicalTypes.slice();\r\n }\r\n\r\n // linh vuc\r\n const resultFieldType = await this.appService.doGET('api/AdProcedure/GetFieldType', null);\r\n if (resultFieldType && resultFieldType.Status === 1) {\r\n this.fieldTypes = resultFieldType.Data;\r\n this.fieldTypesFilter = this.fieldTypes.slice();\r\n this.fieldTypesSearch = this.fieldTypes.slice();\r\n }\r\n\r\n this.placeActives = [\r\n { Name: 'Tất cả', ID: -1 },\r\n { Name: 'UBND quận', ID: 0 },\r\n { Name: 'UBND phường', ID: 1 }\r\n ];\r\n\r\n this.publicServices = [\r\n { Name: 'Tất cả', ID: -1 },\r\n { Name: 'Mức độ 2', ID: 2 },\r\n { Name: 'Mức độ 3', ID: 3 },\r\n { Name: 'Mức độ 4', ID: 4 }\r\n ];\r\n }\r\n\r\n async getAdProcedures() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n FieldTypeID: this.searchOption.FieldTypeID,\r\n PlaceActive: this.searchOption.PlaceActive,\r\n PublicService: this.searchOption.PublicService,\r\n PostalServiceFlg: this.searchOption.PostalServiceFlg\r\n };\r\n\r\n const result = await this.appService.doPOST('api/AdProcedure/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataAdProcedures = result.Data;\r\n this.adProceduresFilter = this.dataAdProcedures.slice();\r\n this.bindAdProcedures();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataAdProcedureSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataAdProcedures.find((item) => {\r\n return item.ID === this.dataAdProcedureSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataAdProcedureSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n onFieldTypeHandleFilter(value) {\r\n this.fieldTypesFilter = this.fieldTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onFieldTypeSearchHandleFilter(value) {\r\n this.fieldTypesSearch = this.fieldTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onTemplateTypesHandleFilter(value) {\r\n this.templateTypesFilter = this.templateTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onBaseJuridicalTypesHandleFilter(value) {\r\n this.baseJuridicalTypesFilter = this.baseJuridicalTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onAdProceduresHandleFilter(value) {\r\n this.adProceduresFilter = this.dataAdProcedures.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onTypeSearchHandleFilter(value) {\r\n this.onReload();\r\n }\r\n\r\n // onTabChanged(event) {\r\n // this.searchOption.Type = event.index;\r\n // this.onSearch();\r\n // }\r\n\r\n // downloadFile(fileUrl) {\r\n // let data = this.urlDownload + fileUrl;\r\n // const blob = new Blob([data], { type: 'text/csv' });\r\n // const url= window.URL.createObjectURL(blob);\r\n // window.open(url);\r\n // }\r\n\r\n onGoToDetail(id) {\r\n this.router.navigate(['portal/admi-proc-detail'], { queryParams: { id } });\r\n }\r\n\r\n}\r\n","module.exports = \".bg a>img {\\r\\n height: 40px;\\r\\n width: 50px;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\ndiv.bg a>span {\\r\\n color: white;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n left: 53px;\\r\\n font-size: 24px;\\r\\n font-family: 'Open Sans', sans-serif;\\r\\n ;\\r\\n font-weight: bold;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n}\\r\\n\\r\\n.bg {\\r\\n background-color: #006CB7;\\r\\n background-repeat: no-repeat;\\r\\n background-size: 100% 100%;\\r\\n width: 100%;\\r\\n height: 56px;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\n.login-container {\\r\\n height: 350px;\\r\\n margin-top: -10px !important;\\r\\n}\\r\\n\\r\\nbody {\\r\\n font-size: 50px;\\r\\n}\\r\\n\\r\\nsection {\\r\\n border: 0.5px solid #65656552;\\r\\n border-radius: 40px;\\r\\n position: fixed;\\r\\n height: 370px;\\r\\n max-width: 400px;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n left: 0;\\r\\n margin: auto;\\r\\n background-color: #ffffff;\\r\\n color: black;\\r\\n padding: 0px 30px;\\r\\n margin-top: 167px;\\r\\n}\\r\\n\\r\\ninput {\\r\\n border-bottom-color: whitesmoke;\\r\\n color: #FFFFFF;\\r\\n}\\r\\n\\r\\n.login-button-container {\\r\\n margin-top: 20px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.login-button-container button {\\r\\n padding: 10px 20px;\\r\\n}\\r\\n\\r\\n.languages {\\r\\n position: relative;\\r\\n margin: -13px;\\r\\n top: 42px;\\r\\n background-color: inherit;\\r\\n}\\r\\n\\r\\n.fa-language {\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\n.k-button.k-primary.k-outline {\\r\\n color: rgb(0, 38, 119);\\r\\n}\\r\\n\\r\\nfooter {\\r\\n display: none !important;\\r\\n}\\r\\n\\r\\n.changePage:hover{\\r\\n cursor: pointer;\\r\\n color: blue;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL2NoYW5nZS1hY2NvdW50LXBhc3N3b3JkL2NoYW5nZS1hY2NvdW50LXBhc3N3b3JkLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxZQUFZO0lBQ1osV0FBVztJQUNYLE1BQU07SUFDTixTQUFTO0lBQ1QsWUFBWTtJQUNaLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsTUFBTTtJQUNOLFNBQVM7SUFDVCxZQUFZO0lBQ1osVUFBVTtJQUNWLGVBQWU7SUFDZixvQ0FBb0M7O0lBRXBDLGlCQUFpQjtJQUNqQiwyQkFBbUI7SUFBbkIsd0JBQW1CO0lBQW5CLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6Qiw0QkFBNEI7SUFDNUIsMEJBQTBCO0lBQzFCLFdBQVc7SUFDWCxZQUFZO0lBQ1osa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLDRCQUE0QjtBQUNoQzs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSw2QkFBNkI7SUFDN0IsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLE1BQU07SUFDTixTQUFTO0lBQ1QsUUFBUTtJQUNSLE9BQU87SUFDUCxZQUFZO0lBQ1oseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksK0JBQStCO0lBQy9CLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixTQUFTO0lBQ1QseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLHNCQUFzQjtBQUMxQjs7QUFFQTtJQUNJLHdCQUF3QjtBQUM1Qjs7QUFFQTtJQUNJLGVBQWU7SUFDZixXQUFXO0FBQ2YiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvY2hhbmdlLWFjY291bnQtcGFzc3dvcmQvY2hhbmdlLWFjY291bnQtcGFzc3dvcmQuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5iZyBhPmltZyB7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICB3aWR0aDogNTBweDtcclxuICAgIHRvcDogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIG1hcmdpbjogYXV0bztcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxufVxyXG5cclxuZGl2LmJnIGE+c3BhbiB7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbiAgICBsZWZ0OiA1M3B4O1xyXG4gICAgZm9udC1zaXplOiAyNHB4O1xyXG4gICAgZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnLCBzYW5zLXNlcmlmO1xyXG4gICAgO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBoZWlnaHQ6IGZpdC1jb250ZW50O1xyXG59XHJcblxyXG4uYmcge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNztcclxuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XHJcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiA1NnB4O1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG59XHJcblxyXG4ubG9naW4tY29udGFpbmVyIHtcclxuICAgIGhlaWdodDogMzUwcHg7XHJcbiAgICBtYXJnaW4tdG9wOiAtMTBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG5ib2R5IHtcclxuICAgIGZvbnQtc2l6ZTogNTBweDtcclxufVxyXG5cclxuc2VjdGlvbiB7XHJcbiAgICBib3JkZXI6IDAuNXB4IHNvbGlkICM2NTY1NjU1MjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDQwcHg7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBoZWlnaHQ6IDM3MHB4O1xyXG4gICAgbWF4LXdpZHRoOiA0MDBweDtcclxuICAgIHRvcDogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIG1hcmdpbjogYXV0bztcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbiAgICBwYWRkaW5nOiAwcHggMzBweDtcclxuICAgIG1hcmdpbi10b3A6IDE2N3B4O1xyXG59XHJcblxyXG5pbnB1dCB7XHJcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZXNtb2tlO1xyXG4gICAgY29sb3I6ICNGRkZGRkY7XHJcbn1cclxuXHJcbi5sb2dpbi1idXR0b24tY29udGFpbmVyIHtcclxuICAgIG1hcmdpbi10b3A6IDIwcHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5sb2dpbi1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XHJcbn1cclxuXHJcbi5sYW5ndWFnZXMge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgbWFyZ2luOiAtMTNweDtcclxuICAgIHRvcDogNDJweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XHJcbn1cclxuXHJcbi5mYS1sYW5ndWFnZSB7XHJcbiAgICBmb250LXNpemU6IDMwcHg7XHJcbn1cclxuXHJcbi5rLWJ1dHRvbi5rLXByaW1hcnkuay1vdXRsaW5lIHtcclxuICAgIGNvbG9yOiByZ2IoMCwgMzgsIDExOSk7XHJcbn1cclxuXHJcbmZvb3RlciB7XHJcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5jaGFuZ2VQYWdlOmhvdmVye1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgY29sb3I6IGJsdWU7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n\\r\\n\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n {{ 'Change_Ask_Password' | translate }} \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\"","import { Component, OnInit, HostListener } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppComponent } from 'src/app/app.component';\r\nimport { AppService } from 'src/app/services/app.service';\r\nimport { AppLanguage } from 'src/app/services/app.language';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\n\r\n@Component({\r\n selector: 'app-change-account-password',\r\n templateUrl: './change-account-password.component.html',\r\n styleUrls: ['./change-account-password.component.css']\r\n})\r\nexport class ChangeAccountPasswordComponent implements OnInit {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n loginInfo = {\r\n UserName: '',\r\n Password: ''\r\n\r\n };\r\n dataRequest = {\r\n UserName: '',\r\n NewPassword: '',\r\n ConfirmPassword: '',\r\n Email: '',\r\n };\r\n languageName = '';\r\n\r\n languages: Array = [{\r\n id: 0,\r\n culture: 'vi-VN',\r\n text: 'Tiếng Việt',\r\n click: (dataItem) => {\r\n this.onChangeLanguage(dataItem);\r\n }\r\n }, {\r\n id: 1,\r\n culture: 'en-US',\r\n text: 'English',\r\n click: (dataItem) => {\r\n this.onChangeLanguage(dataItem);\r\n }\r\n }];\r\n\r\n constructor(\r\n private router: Router,\r\n private authenticationService: AuthenticationService,\r\n private appService: AppService,\r\n private appComponent: AppComponent,\r\n private language: AppLanguage,\r\n private appSwal: AppSwal\r\n ) {\r\n this.getLanguageName();\r\n }\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n async changPass() {\r\n const id = this.dataRequest.UserName;\r\n const result = await this.appService.doPUT('api/LoginAsk/ChangePassword', this.dataRequest, {id} );\r\n if (result && result.Status === 1) {\r\n this.appSwal.showSuccess(result.Msg, false);\r\n this.router.navigate(['portal/login-ask']);\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n AddNew(){\r\n this.router.navigate(['portal/create-account']);\r\n }\r\n\r\n ChangePass(){\r\n this.router.navigate(['portal/change-account-password']);\r\n }\r\n\r\n onChangeLanguage(dataItem) {\r\n this.appComponent.switchLanguage(dataItem.culture);\r\n this.getLanguageName();\r\n }\r\n\r\n getLanguageName() {\r\n let lang = this.language.get();\r\n if (!lang) {\r\n lang = 'vi-VN';\r\n this.appComponent.switchLanguage(lang);\r\n }\r\n const language = this.languages.find(item => {\r\n return item.culture === lang;\r\n });\r\n\r\n if (language) { this.languageName = language.text; }\r\n }\r\n\r\n onKeyPress(e: any) {\r\n if (e.keyCode === 13) {\r\n //this.onLogin();\r\n }\r\n }\r\n}\r\n","module.exports = \".titleBottom {\\r\\n padding-top: 10px;\\r\\n padding-bottom: 10px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 10px;\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.commentTitleItem {\\r\\n font-size: 16px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.txtCountSearchCmt {\\r\\n font-size: 16px;\\r\\n color: navy;\\r\\n font-weight: bold;\\r\\n /* margin-bottom: 20px; */\\r\\n margin-top: 30px;\\r\\n}\\r\\n\\r\\n.itemRow {\\r\\n padding-top: 20px;\\r\\n padding-bottom: 20px;\\r\\n ;\\r\\n}\\r\\n\\r\\n.titleSearchPage {\\r\\n margin-top: 30px;\\r\\n margin-bottom: 20px !important;\\r\\n font-size: 18px;\\r\\n color: black !important;\\r\\n}\\r\\n\\r\\n.label {\\r\\n font-size: 16px;\\r\\n font-weight: bold;\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.content {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.img-comment-reply {\\r\\n width: 50px;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n.img-logo {\\r\\n width: 35px;\\r\\n height: 30px;\\r\\n float: left;\\r\\n padding-right: 10px;\\r\\n}\\r\\n\\r\\n.comment-item {\\r\\n align-self: center;\\r\\n font-weight: 500;\\r\\n padding: 11px 20px;\\r\\n}\\r\\n\\r\\n.comment-often:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.dropdown {\\r\\n background: white;\\r\\n width: 100%;\\r\\n /* height: 30px; */\\r\\n /* border: 0.5px solid #707070; */\\r\\n}\\r\\n\\r\\n.searchButton {\\r\\n width: 109px !important;\\r\\n height: 46px;\\r\\n border: none !important;\\r\\n background-color: #006CB7;\\r\\n color: white;\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.officeName {\\r\\n font-size: 14px;\\r\\n color: black;\\r\\n font-weight: bold;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.officeSumary {\\r\\n font-size: 14px;\\r\\n font-weight: normal;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.officeButton {\\r\\n height: 30px;\\r\\n background-color: #006CB7;\\r\\n color: white;\\r\\n width: 100px;\\r\\n margin-right: 5px;\\r\\n border: none !important;\\r\\n}\\r\\n\\r\\n.res {\\r\\n float: right;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.res-num {\\r\\n color: red;\\r\\n}\\r\\n\\r\\n.Border {\\r\\n border: 1px solid gray;\\r\\n width: -webkit-fit-content;\\r\\n width: -moz-fit-content;\\r\\n width: fit-content;\\r\\n}\\r\\n\\r\\n.Reply {\\r\\n overflow: hidden;\\r\\n white-space: unset;\\r\\n}\\r\\n\\r\\n.group-body-border strong {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\na:hover {\\r\\n cursor: pointer;\\r\\n color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n.account-info-login:hover {\\r\\n cursor: pointer;\\r\\n color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n.account-info-login {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.xdivcol11 {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.xdivcol12 {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n height: 46px;\\r\\n}\\r\\n\\r\\n.xdiv {\\r\\n border: 0.1px solid rgb(184, 184, 184);\\r\\n background-color: white;\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.xbutton {\\r\\n background-color: red;\\r\\n color: white;\\r\\n background: red;\\r\\n /* width: 100%; */\\r\\n font-size: 25px !important;\\r\\n}\\r\\n\\r\\n.dialog-info-login {\\r\\n width: 400px !important;\\r\\n height: 400px !important;\\r\\n z-index: 1060 !important;\\r\\n}\\r\\n\\r\\n.dialog-info-ask-info {\\r\\n width: 80% !important;\\r\\n max-width: 600px;\\r\\n height: 600px !important;\\r\\n z-index: 1060 !important;\\r\\n}\\r\\n\\r\\n.btn-send-ask {\\r\\n color: navy;\\r\\n background-color: #ffffff;\\r\\n padding: 7px 12px;\\r\\n float: right;\\r\\n border: 1px solid navy !important;\\r\\n font-size: 16px;\\r\\n float: right;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.btn-send-ask:hover {\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n.ask-reply-area {\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.text-align-cmt {\\r\\n text-align: left;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL2NvbW1lbnQtbGlzdC9jb21tZW50LWxpc3QuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsWUFBWTtJQUNaLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGVBQWU7SUFDZixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsV0FBVztJQUNYLGlCQUFpQjtJQUNqQix5QkFBeUI7SUFDekIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLG9CQUFvQjs7QUFFeEI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLGVBQWU7SUFDZix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLFdBQVc7SUFDWCxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsV0FBVztJQUNYLGtCQUFrQjtJQUNsQixpQ0FBaUM7QUFDckM7O0FBRUE7SUFDSSx1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLHVCQUF1QjtJQUN2Qix5QkFBeUI7SUFDekIsWUFBWTtJQUNaLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsbUJBQW1CO0lBQ25CLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLFlBQVk7SUFDWix5QkFBeUI7SUFDekIsWUFBWTtJQUNaLFlBQVk7SUFDWixpQkFBaUI7SUFDakIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLFdBQVc7QUFDZjs7QUFFQTtJQUNJLFVBQVU7QUFDZDs7QUFFQTtJQUNJLHNCQUFzQjtJQUN0QiwwQkFBa0I7SUFBbEIsdUJBQWtCO0lBQWxCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxlQUFlO0lBQ2YseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGFBQWE7SUFDYixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxzQ0FBc0M7SUFDdEMsdUJBQXVCO0lBQ3ZCLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxxQkFBcUI7SUFDckIsWUFBWTtJQUNaLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksdUJBQXVCO0lBQ3ZCLHdCQUF3QjtJQUN4Qix3QkFBd0I7QUFDNUI7O0FBRUE7SUFDSSxxQkFBcUI7SUFDckIsZ0JBQWdCO0lBQ2hCLHdCQUF3QjtJQUN4Qix3QkFBd0I7QUFDNUI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gseUJBQXlCO0lBQ3pCLGlCQUFpQjtJQUNqQixZQUFZO0lBQ1osaUNBQWlDO0lBQ2pDLGVBQWU7SUFDZixZQUFZO0lBQ1osZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksY0FBYztBQUNsQjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEIiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvY29tbWVudC1saXN0L2NvbW1lbnQtbGlzdC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnRpdGxlQm90dG9tIHtcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDZDQjc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xyXG59XHJcblxyXG4uY29tbWVudFRpdGxlSXRlbSB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuLnR4dENvdW50U2VhcmNoQ210IHtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAvKiBtYXJnaW4tYm90dG9tOiAyMHB4OyAqL1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxufVxyXG5cclxuLml0ZW1Sb3cge1xyXG4gICAgcGFkZGluZy10b3A6IDIwcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMjBweDtcclxuICAgIDtcclxufVxyXG5cclxuLnRpdGxlU2VhcmNoUGFnZSB7XHJcbiAgICBtYXJnaW4tdG9wOiAzMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweCAhaW1wb3J0YW50O1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG4gICAgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5sYWJlbCB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGNvbG9yOiBibGFjaztcclxufVxyXG5cclxuLmNvbnRlbnQge1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG59XHJcblxyXG4uaW1nLWNvbW1lbnQtcmVwbHkge1xyXG4gICAgd2lkdGg6IDUwcHg7XHJcbiAgICBoZWlnaHQ6IDUwcHg7XHJcbn1cclxuXHJcbi5pbWctbG9nbyB7XHJcbiAgICB3aWR0aDogMzVweDtcclxuICAgIGhlaWdodDogMzBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgcGFkZGluZy1yaWdodDogMTBweDtcclxufVxyXG5cclxuLmNvbW1lbnQtaXRlbSB7XHJcbiAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XHJcbiAgICBmb250LXdlaWdodDogNTAwO1xyXG4gICAgcGFkZGluZzogMTFweCAyMHB4O1xyXG59XHJcblxyXG4uY29tbWVudC1vZnRlbjpob3ZlciB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5kcm9wZG93biB7XHJcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgLyogaGVpZ2h0OiAzMHB4OyAqL1xyXG4gICAgLyogYm9yZGVyOiAwLjVweCBzb2xpZCAjNzA3MDcwOyAqL1xyXG59XHJcblxyXG4uc2VhcmNoQnV0dG9uIHtcclxuICAgIHdpZHRoOiAxMDlweCAhaW1wb3J0YW50O1xyXG4gICAgaGVpZ2h0OiA0NnB4O1xyXG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG59XHJcblxyXG4ub2ZmaWNlTmFtZSB7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XHJcbn1cclxuXHJcbi5vZmZpY2VTdW1hcnkge1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XHJcbn1cclxuXHJcbi5vZmZpY2VCdXR0b24ge1xyXG4gICAgaGVpZ2h0OiAzMHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNztcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIHdpZHRoOiAxMDBweDtcclxuICAgIG1hcmdpbi1yaWdodDogNXB4O1xyXG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5yZXMge1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbi5yZXMtbnVtIHtcclxuICAgIGNvbG9yOiByZWQ7XHJcbn1cclxuXHJcbi5Cb3JkZXIge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTtcclxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcclxufVxyXG5cclxuLlJlcGx5IHtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB3aGl0ZS1zcGFjZTogdW5zZXQ7XHJcbn1cclxuXHJcbi5ncm91cC1ib2R5LWJvcmRlciBzdHJvbmcge1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbmE6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmFjY291bnQtaW5mby1sb2dpbjpob3ZlciB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBjb2xvcjogIzAwNkNCNyAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uYWNjb3VudC1pbmZvLWxvZ2luIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4ueGRpdmNvbDExIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG59XHJcblxyXG4ueGRpdmNvbDEyIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgaGVpZ2h0OiA0NnB4O1xyXG59XHJcblxyXG4ueGRpdiB7XHJcbiAgICBib3JkZXI6IDAuMXB4IHNvbGlkIHJnYigxODQsIDE4NCwgMTg0KTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgbWFyZ2luLXRvcDogMHB4O1xyXG59XHJcblxyXG4ueGJ1dHRvbiB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgICBiYWNrZ3JvdW5kOiByZWQ7XHJcbiAgICAvKiB3aWR0aDogMTAwJTsgKi9cclxuICAgIGZvbnQtc2l6ZTogMjVweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uZGlhbG9nLWluZm8tbG9naW4ge1xyXG4gICAgd2lkdGg6IDQwMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICBoZWlnaHQ6IDQwMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICB6LWluZGV4OiAxMDYwICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5kaWFsb2ctaW5mby1hc2staW5mbyB7XHJcbiAgICB3aWR0aDogODAlICFpbXBvcnRhbnQ7XHJcbiAgICBtYXgtd2lkdGg6IDYwMHB4O1xyXG4gICAgaGVpZ2h0OiA2MDBweCAhaW1wb3J0YW50O1xyXG4gICAgei1pbmRleDogMTA2MCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uYnRuLXNlbmQtYXNrIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcclxuICAgIHBhZGRpbmc6IDdweCAxMnB4O1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgbmF2eSAhaW1wb3J0YW50O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgbWFyZ2luLXRvcDogMTBweDtcclxufVxyXG5cclxuLmJ0bi1zZW5kLWFzazpob3ZlciB7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxufVxyXG5cclxuLmFzay1yZXBseS1hcmVhIHtcclxuICAgIG1hcmdpbi10b3A6IDBweDtcclxufVxyXG5cclxuLnRleHQtYWxpZ24tY210IHtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Gửi câu hỏi' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n {{'Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n Tất cả Tổng số {{dataComments.length}} kết quả\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
Câu hỏi xem nhiều \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
Câu hỏi mới nhất \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n {{dataCommentDetail.Description}} \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n Trả lời: \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n {{i+1}}. {{ getFileName(file) }} \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n {{i+1}}. {{ getFileName(file) }} \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Comment_Send' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, Renderer2, NgZone, AfterViewInit, OnInit, OnDestroy, ViewEncapsulation, ViewChild, ElementRef, Output, EventEmitter, Input, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay, map } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { FormGroup, FormBuilder } from '@angular/forms';\r\nimport * as DecoupledEditor from '@ckeditor/ckeditor5-build-decoupled-document';\r\nimport { WebSocketService } from 'src/app/websocket.service';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-comment-list',\r\n templateUrl: './comment-list.component.html',\r\n styleUrls: ['./comment-list.component.css']\r\n})\r\nexport class CommentListComponent implements OnInit, OnDestroy {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n //codeimage\r\n commentInput = null;\r\n\r\n myRestrictions: FileRestrictions = {\r\n maxFileSize: 1024 * 1024 * 120\r\n };\r\n\r\n\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n dataComments = [];\r\n dataCommentsLatest = [];\r\n dataCommentMostView = [];\r\n dataCommentDetail = null;\r\n dataCommentSelectableSettings: SelectableSettings;\r\n dataCommentSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataCommentFocus = {\r\n Name: true\r\n };\r\n dataCommentSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataCommentSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataCommentPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataCommentSelection: number[] = [];\r\n dataCommentItem: any;\r\n myInterval: any;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public commentFlg = false;\r\n\r\n public dataCommentState: State = {\r\n skip: this.dataCommentSkip,\r\n take: this.dataCommentSkip + this.dataCommentPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n dataCommentGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n filesUpload: Array;\r\n filesUploadName = \"\";\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n isReplyPage = false;\r\n tabIndex = 0;\r\n menuNames = '';\r\n searchOption = {\r\n SearchText: '',\r\n FromDate: null,\r\n ToDate: null,\r\n UrlPath: '',\r\n Status: 0\r\n };\r\n\r\n\r\n askInfoOpened = false;\r\n loginOpened = false;\r\n accountInfoPortal = {\r\n UserName: '',\r\n FullName: ''\r\n };\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router\r\n ) {\r\n\r\n this.activatedRoute.queryParams.subscribe((params: any) => {\r\n if (params && params.title) {\r\n this.searchOption.UrlPath = params.title;\r\n }\r\n this.initDisplay();\r\n });\r\n \r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n //this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.allData = this.allData.bind(this);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n ngOnInit() {\r\n this.checkLogin(false);\r\n }\r\n\r\n public checkLogin(required) {\r\n const account = localStorage.getItem('accountInfoPortal');\r\n if (account) {\r\n this.accountInfoPortal = JSON.parse(account);\r\n this.loginOpened = false;\r\n return true;\r\n } else if (required) {\r\n this.loginOpened = true;\r\n return false;\r\n }\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n async getMenuName() {\r\n const dataRequest = {\r\n urlPath: this.searchOption.UrlPath,\r\n };\r\n const result = await this.appService.doGET('api/Menu', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.menuNames = result.Data.Name;\r\n }\r\n }\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataCommentSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n // if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n // this.onSearch();\r\n // }\r\n }\r\n\r\n\r\n\r\n async getComments() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n urlPath: this.searchOption.UrlPath,\r\n Status: 1\r\n };\r\n\r\n const result = await this.appService.doPOST('api/Comment/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataComments = result.Data;\r\n this.bindComments();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n async getCommentsLastest() {\r\n\r\n this.loading = true;\r\n const dataRequest = {\r\n urlPath: this.searchOption.UrlPath,\r\n };\r\n const result = await this.appService.doGET('api/Comment/GetCommentLatest', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataCommentsLatest = result.Data;\r\n }\r\n this.loading = false;\r\n }\r\n\r\n async getCommentsMostView() {\r\n\r\n this.loading = true;\r\n const dataRequest = {\r\n urlPath: this.searchOption.UrlPath,\r\n };\r\n const result = await this.appService.doGET('api/Comment/GetCommentMostView', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataCommentMostView = result.Data;\r\n }\r\n this.loading = false;\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataCommentSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataComments.find((item) => {\r\n return item.ID === this.dataCommentSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataCommentSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n onClickNotify(e: any) {\r\n const menuID = e;\r\n this.searchOption.UrlPath = menuID;\r\n this.onReload();\r\n }\r\n\r\n setDefault() {\r\n this.dataCommentItem = {\r\n viewOnly: false,\r\n IsAdd: true,\r\n UrlPath: this.searchOption.UrlPath,\r\n FullName: null,\r\n Address: null,\r\n Phone: null,\r\n Phone1: null,\r\n Email: null,\r\n Title: null,\r\n PostID: null,\r\n Description: null,\r\n ApprovedFlg: null,\r\n Type: null,\r\n CreateAt: null,\r\n FeedbackContent: null,\r\n FeedbackBy: null,\r\n FeedbackAt: null,\r\n OftenFlg: false,\r\n PortalFlg: true,\r\n FileUrl: null\r\n };\r\n\r\n this.dataCommentSelection = [];\r\n this.filesUpload = [];\r\n this.filesUploadName = '';\r\n this.dataFileUrls = [];\r\n this.bindFileUrls();\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=portal&typeData=files&checkFileSize=true`;\r\n }\r\n\r\n\r\n onCommentPageChange(event: PageChangeEvent) {\r\n this.dataCommentSkip = event.skip;\r\n this.bindComments();\r\n }\r\n\r\n async onCommentselectedKeysChange() {\r\n\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataCommentSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n //const selectedID = this.dataCommentSelection[0];\r\n //const selectedItem = this.dataComments.find((item) => {\r\n // return item.ID === selectedID;\r\n //});\r\n //selectedItem.IsAdd = false;\r\n //selectedItem.PublishAt = selectedItem.PublishAt ? new Date(selectedItem.PublishAt) : null;\r\n\r\n //this.dataCommentItem = selectedItem;\r\n }\r\n }\r\n\r\n bindComments() {\r\n this.dataCommentGridDataResult = {\r\n data: orderBy(this.dataComments, this.dataCommentSortByField),\r\n total: this.dataComments.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n onCommentsortChange(sort: SortDescriptor[]): void {\r\n this.dataCommentSortByField = sort;\r\n this.bindComments();\r\n }\r\n\r\n public onCommentDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataCommentSelection = [];\r\n this.dataCommentState = state;\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n this.onReload();\r\n }\r\n\r\n onSearch() {\r\n this.getComments();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.setDefault();\r\n //this.searchOption.SearchText = '';\r\n this.getComments();\r\n this.getMenuName();\r\n this.getCommentsLastest();\r\n this.getCommentsMostView();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearComment() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewComment() {\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.setDefault();\r\n }\r\n\r\n async onSaveComment() {\r\n this.addComment();\r\n // if (this.dataCommentItem.IsAdd) { } else { this.updateComment(); }\r\n }\r\n\r\n async onSaveComments() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataComments.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataComments[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Comment/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataCommentItem;\r\n\r\n // let fileName = '';\r\n // if (this.dataFileUrls.length > 0) {\r\n // fileName = this.dataFileUrls[0].Url;\r\n // }\r\n\r\n //\r\n\r\n var files: any[] = [];\r\n if (this.dataCommentItem.FileUrl) {\r\n for (let i = 0; i < this.dataCommentItem.FileUrl.length; i++) {\r\n files.push(this.dataCommentItem.FileUrl[i]);\r\n }\r\n }\r\n return {\r\n ID: temp.ID,\r\n //PublishAt: temp.PublishAt ? this.intl.formatDate(new Date(temp.PublishAt), 'yyyy-MM-ddT00:00:00') : null,\r\n UserAsk: this.accountInfoPortal.UserName,\r\n UrlPath: temp.UrlPath,\r\n FullName: temp.FullName,\r\n Address: temp.Address,\r\n Phone: temp.Phone,\r\n Phone1: temp.Phone1,\r\n Email: temp.Email,\r\n Title: temp.Title,\r\n PostID: temp.PostID,\r\n Description: temp.Description,\r\n ApprovedFlg: temp.ApprovedFlg,\r\n Type: temp.Type,\r\n CreateAt: temp.CreateAt,\r\n FeedbackContent: temp.FeedbackContent,\r\n FeedbackBy: temp.FeedbackBy,\r\n FeedbackAt: temp.FeedbackAt,\r\n OftenFlg: temp.OftenFlg,\r\n PortalFlg: true,\r\n FileUrl: JSON.stringify(files),\r\n };\r\n }\r\n\r\n onCloseComment(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n\r\n onEditComment() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n }\r\n\r\n async addComment() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Comment/PostQues', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.appSwal.showSuccess('Hỏi đáp đã được gửi thành công, Chúng tôi sẽ phản hồi trong thời gian sớm nhất!', false);\r\n // this.onReload();\r\n this.onAddNewComment();\r\n this.askInfoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n\r\n\r\n async updateComment() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataCommentItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataCommentItem);\r\n\r\n const result = await this.appService.doPUT('api/Comment', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteComment() {\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataCommentSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Comment/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewComment();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataCommentSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(dataItem: any) {\r\n\r\n const dataRequest = {\r\n url: dataItem.Url\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, dataItem.Name);\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataComments, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n try {\r\n const fileData = await this.file.readFile(e.files[0].rawFile);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n try {\r\n if(e != null && e.response.body != null) {\r\n if(e.response.body.Status != 0) {\r\n if (this.dataCommentItem.FileUrl == undefined) {\r\n this.dataCommentItem.FileUrl = [];\r\n }\r\n this.dataCommentItem.FileUrl.push(`${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`);\r\n } else {\r\n this.appSwal.showError(e.response.body.Msg);\r\n }\r\n } \r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n this.dataCommentItem.FileUrl = [];\r\n this.filesUploadName = '';\r\n this.filesUpload = [];\r\n }\r\n\r\n onRemoveFile(file){\r\n var isExistedInFile = this.dataCommentItem.FileUrl.findIndex(x => x == file);\r\n if (isExistedInFile != -1) {\r\n this.dataCommentItem.FileUrl.splice(isExistedInFile, 1);\r\n }\r\n }\r\n\r\n getFileName(fileUrls) {\r\n var nameFile = \"\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n\r\n onTabChanged(event) {\r\n this.tabIndex = event.index;\r\n if (this.tabIndex == 1) {\r\n this.checkLogin(true);\r\n } else {\r\n // this.onSearch();\r\n this.getComments();\r\n }\r\n this.isReplyPage = false;\r\n }\r\n manageOpen = false;\r\n async Count() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataCommentItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataCommentItem);\r\n\r\n const result = await this.appService.doPUT('api/Comment', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onClickLastestComment(item) {\r\n this.dataCommentDetail = item;\r\n // this.isReplyPage = true;\r\n // this.tabIndex = 1;\r\n // window.scrollTo(0, 0);\r\n const id = this.dataCommentDetail.ID;\r\n const dataRequest = this.createDataRequest(this.dataCommentDetail);\r\n const result = await this.appService.doPUT('api/Comment/Count', dataRequest, { id });\r\n this.manageOpen = true;\r\n }\r\n public onCloseManage() {\r\n this.manageOpen = false;\r\n }\r\n\r\n public onCloseLogin() {\r\n this.loginOpened = false;\r\n }\r\n\r\n onClickCreateCommentBtn() {\r\n this.isReplyPage = false;\r\n this.tabIndex = 0;\r\n }\r\n\r\n onClickFreQuestion() {\r\n // this.router.navigate(['portal/comment-often'], { queryParams: { menuID: this.searchOption.MenuID } });\r\n }\r\n\r\n Logout() {\r\n localStorage.removeItem('accountInfoPortal');\r\n window.location.reload();\r\n }\r\n\r\n Login() {\r\n this.loginOpened = true;\r\n }\r\n\r\n loginSuccess() {\r\n this.checkLogin(false);\r\n this.askInfoOpened = true;\r\n }\r\n\r\n onAskInfo() {\r\n if (this.accountInfoPortal && this.accountInfoPortal.UserName) {\r\n this.askInfoOpened = true;\r\n } else {\r\n this.checkLogin(true);\r\n }\r\n }\r\n\r\n onCloseAsk() {\r\n this.askInfoOpened = false;\r\n }\r\n}\r\n\r\n","module.exports = \".titleBottom {\\r\\n padding-top: 10px;\\r\\n padding-bottom: 10px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 10px;\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.commentTitleItem {\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.txtCountSearchCmt {\\r\\n font-size: 16px;\\r\\n color:black;\\r\\n font-weight: bold;\\r\\n /* margin-bottom: 20px; */\\r\\n margin-top:30px;\\r\\n}\\r\\n\\r\\n.itemRow {\\r\\n padding-top:20px;\\r\\n padding-bottom: 20px;;\\r\\n}\\r\\n\\r\\n.titleSearchPage {\\r\\n margin-top:30px;\\r\\n margin-bottom:20px !important;\\r\\n font-size: 18px;\\r\\n color:black !important;\\r\\n}\\r\\n\\r\\n.label {\\r\\n font-size: 16px;\\r\\n font-weight: bold;\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.content {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.img-comment-reply {\\r\\n width: 50px;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n.img-logo {\\r\\n width: 100px;\\r\\n height: 100px;\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.comment-item {\\r\\n align-self: center; \\r\\n font-weight: 500; \\r\\n padding: 11px 20px;\\r\\n}\\r\\n\\r\\n.comment-often:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL2NvbW1lbnQtb2Z0ZW4vY29tbWVudC1vZnRlbi5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQiw4QkFBOEI7SUFDOUIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixZQUFZO0lBQ1osbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsV0FBVztJQUNYLGlCQUFpQjtJQUNqQix5QkFBeUI7SUFDekIsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsNkJBQTZCO0lBQzdCLGVBQWU7SUFDZixzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osYUFBYTtJQUNiLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQiIsImZpbGUiOiJzcmMvYXBwL3BvcnRhbC9jb21tZW50LW9mdGVuL2NvbW1lbnQtb2Z0ZW4uY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi50aXRsZUJvdHRvbSB7XHJcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xyXG4gICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA2Q0I3O1xyXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY29sb3I6IGJsYWNrO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcclxufVxyXG5cclxuLmNvbW1lbnRUaXRsZUl0ZW0ge1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY29sb3I6IGJsYWNrO1xyXG59XHJcblxyXG4udHh0Q291bnRTZWFyY2hDbXQge1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY29sb3I6YmxhY2s7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIC8qIG1hcmdpbi1ib3R0b206IDIwcHg7ICovXHJcbiAgICBtYXJnaW4tdG9wOjMwcHg7XHJcbn1cclxuXHJcbi5pdGVtUm93IHtcclxuICAgIHBhZGRpbmctdG9wOjIwcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMjBweDs7XHJcbn1cclxuXHJcbi50aXRsZVNlYXJjaFBhZ2Uge1xyXG4gICAgbWFyZ2luLXRvcDozMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbToyMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICBmb250LXNpemU6IDE4cHg7XHJcbiAgICBjb2xvcjpibGFjayAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ubGFiZWwge1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbn1cclxuXHJcbi5jb250ZW50IHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxufVxyXG5cclxuLmltZy1jb21tZW50LXJlcGx5IHtcclxuICAgIHdpZHRoOiA1MHB4O1xyXG4gICAgaGVpZ2h0OiA1MHB4O1xyXG59XHJcblxyXG4uaW1nLWxvZ28ge1xyXG4gICAgd2lkdGg6IDEwMHB4O1xyXG4gICAgaGVpZ2h0OiAxMDBweDtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG59XHJcblxyXG4uY29tbWVudC1pdGVtIHtcclxuICAgIGFsaWduLXNlbGY6IGNlbnRlcjsgXHJcbiAgICBmb250LXdlaWdodDogNTAwOyBcclxuICAgIHBhZGRpbmc6IDExcHggMjBweDtcclxufVxyXG5cclxuLmNvbW1lbnQtb2Z0ZW46aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59Il19 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n Câu Hỏi Thường Gặp\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ActivatedRoute, Router, NavigationEnd } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-comment-often',\r\n templateUrl: './comment-often.component.html',\r\n styleUrls: ['./comment-often.component.css']\r\n})\r\nexport class CommentOftenComponent implements OnInit, OnDestroy {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n //codeimage\r\n commentInput = null;\r\n\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n dataComments = [];\r\n dataCommentsLatest = [];\r\n dataCommentDetail = null;\r\n dataCommentSelectableSettings: SelectableSettings;\r\n dataCommentSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataCommentFocus = {\r\n Name: true\r\n };\r\n dataCommentSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataCommentSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataCommentPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataCommentSelection: number[] = [];\r\n dataCommentItem: any;\r\n myInterval: any;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public commentFlg = false;\r\n\r\n public dataCommentState: State = {\r\n skip: this.dataCommentSkip,\r\n take: this.dataCommentSkip + this.dataCommentPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n dataCommentGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n isReplyPage = false;\r\n tabIndex = 0;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n FromDate: null,\r\n ToDate: null,\r\n MenuID: 0,\r\n Status: 0\r\n };\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router,\r\n ) {\r\n\r\n this.activatedRoute.queryParams.subscribe((params: any) => {\r\n if (params && params.menuID) {\r\n this.searchOption.MenuID = params.menuID;\r\n }\r\n this.initDisplay();\r\n });\r\n\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n //this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.allData = this.allData.bind(this);\r\n //this.getCommentsLastest();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataCommentSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n\r\n onSearchKeyPress(e: any) {\r\n // if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n // this.onSearch();\r\n // }\r\n }\r\n\r\n async getComments() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n MenuID: this.searchOption.MenuID,\r\n Status: 1,\r\n OftenFlg: 1\r\n };\r\n\r\n const result = await this.appService.doPOST('api/Comment/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataComments = result.Data;\r\n this.bindComments();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n async getCommentsLastest() {\r\n\r\n this.loading = true;\r\n const dataRequest = {\r\n menuID: this.searchOption.MenuID,\r\n };\r\n const result = await this.appService.doGET('api/Comment/GetCommentLatest', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataCommentsLatest = result.Data;\r\n }\r\n this.loading = false;\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataCommentSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataComments.find((item) => {\r\n return item.ID === this.dataCommentSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataCommentSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n onClickNotify(e: any) {\r\n const menuID = e;\r\n this.searchOption.MenuID = menuID;\r\n this.onReload();\r\n }\r\n\r\n setDefault() {\r\n this.dataCommentItem = {\r\n IsAdd: true,\r\n MenuID: this.searchOption.MenuID,\r\n FullName: null,\r\n Address: null,\r\n Phone: null,\r\n Phone1: null,\r\n Email: null,\r\n Title: null,\r\n PostID: null,\r\n Description: null,\r\n ApprovedFlg: null,\r\n Type: null,\r\n CreateAt: null,\r\n FeedbackContent: null,\r\n FeedbackBy: null,\r\n FeedbackAt: null,\r\n OftenFlg: false,\r\n PortalFlg: true\r\n };\r\n\r\n this.dataCommentSelection = [];\r\n this.filesUpload = [];\r\n this.dataFileUrls = [];\r\n this.bindFileUrls();\r\n // this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n }\r\n\r\n onCommentPageChange(event: PageChangeEvent) {\r\n this.dataCommentSkip = event.skip;\r\n this.bindComments();\r\n }\r\n\r\n async onCommentselectedKeysChange() {\r\n\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataCommentSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n //const selectedID = this.dataCommentSelection[0];\r\n //const selectedItem = this.dataComments.find((item) => {\r\n // return item.ID === selectedID;\r\n //});\r\n //selectedItem.IsAdd = false;\r\n //selectedItem.PublishAt = selectedItem.PublishAt ? new Date(selectedItem.PublishAt) : null;\r\n\r\n //this.dataCommentItem = selectedItem;\r\n }\r\n }\r\n\r\n bindComments() {\r\n this.dataCommentGridDataResult = {\r\n data: orderBy(this.dataComments, this.dataCommentSortByField),\r\n total: this.dataComments.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n onCommentsortChange(sort: SortDescriptor[]): void {\r\n this.dataCommentSortByField = sort;\r\n this.bindComments();\r\n }\r\n\r\n public onCommentDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataCommentSelection = [];\r\n this.dataCommentState = state;\r\n this.dataCommentGridDataResult = process(this.dataComments, this.dataCommentState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n this.onReload();\r\n }\r\n\r\n onSearch() {\r\n this.getComments();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.setDefault();\r\n //this.searchOption.SearchText = '';\r\n this.getComments();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearComment() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewComment() {\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.setDefault();\r\n }\r\n\r\n async onSaveComment() {\r\n if (this.dataCommentItem.IsAdd) { this.addComment(); } else { this.updateComment(); }\r\n }\r\n\r\n async onSaveComments() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataComments.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataComments[i]));\r\n }\r\n const result = await this.appService.doPOST('api/Comment/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataCommentItem;\r\n\r\n // let fileName = '';\r\n // if (this.dataFileUrls.length > 0) {\r\n // fileName = this.dataFileUrls[0].Url;\r\n // }\r\n\r\n //\r\n return {\r\n ID: temp.ID,\r\n //PublishAt: temp.PublishAt ? this.intl.formatDate(new Date(temp.PublishAt), 'yyyy-MM-ddT00:00:00') : null,\r\n\r\n MenuID: temp.MenuID,\r\n FullName: temp.FullName,\r\n Address: temp.Address,\r\n Phone: temp.Phone,\r\n Phone1: temp.Phone1,\r\n Email: temp.Email,\r\n Title: temp.Title,\r\n PostID: temp.PostID,\r\n Description: temp.Description,\r\n ApprovedFlg: temp.ApprovedFlg,\r\n Type: temp.Type,\r\n CreateAt: temp.CreateAt,\r\n FeedbackContent: temp.FeedbackContent,\r\n FeedbackBy: temp.FeedbackBy,\r\n FeedbackAt: temp.FeedbackAt,\r\n OftenFlg: temp.OftenFlg,\r\n PortalFlg: true\r\n };\r\n }\r\n\r\n onCloseComment(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n\r\n onEditComment() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n }\r\n\r\n async addComment() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPOST('api/Comment', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewComment();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updateComment() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataCommentItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataCommentItem);\r\n\r\n const result = await this.appService.doPUT('api/Comment', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeleteComment() {\r\n if (this.dataCommentSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataCommentSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Comment/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewComment();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataCommentSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(dataItem: any) {\r\n\r\n const dataRequest = {\r\n url: dataItem.Url\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, dataItem.Name);\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataComments, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = await this.file.readFile(e.files[0].rawFile);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n try {\r\n this.dataFileUrls = [];\r\n const k = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n this.dataFileUrls.push({\r\n Name: this.getNameByUrl(k),\r\n Url: k\r\n });\r\n\r\n this.bindFileUrls();\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n\r\n }\r\n\r\n onTabChanged(event) {\r\n this.tabIndex = event.index;\r\n // this.onSearch();\r\n this.getComments();\r\n this.isReplyPage = false;\r\n }\r\n\r\n onClickLastestComment(item) {\r\n this.dataCommentDetail = item;\r\n this.isReplyPage = true;\r\n this.tabIndex = 1;\r\n window.scrollTo(0, 0);\r\n }\r\n\r\n onClickCreateCommentBtn() {\r\n this.isReplyPage = false;\r\n this.tabIndex = 0;\r\n }\r\n\r\n onClickFreQuestion() {\r\n this.isReplyPage = false;\r\n }\r\n}\r\n\r\n","module.exports = \".titleBottom {\\r\\n padding-top: 10px;\\r\\n padding-bottom: 10px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 10px;\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.commentTitleItem {\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.txtCountSearchCmt {\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n font-weight: bold;\\r\\n /* margin-bottom: 20px; */\\r\\n margin-top: 30px;\\r\\n}\\r\\n\\r\\n.itemRow {\\r\\n padding-top: 20px;\\r\\n padding-bottom: 20px;\\r\\n ;\\r\\n}\\r\\n\\r\\n.titleSearchPage {\\r\\n margin-top: 30px;\\r\\n margin-bottom: 20px !important;\\r\\n font-size: 18px;\\r\\n color: black !important;\\r\\n}\\r\\n\\r\\n.label {\\r\\n font-size: 16px;\\r\\n font-weight: bold;\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.content {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.img-comment-reply {\\r\\n width: 50px;\\r\\n height: 50px;\\r\\n}\\r\\n\\r\\n.img-logo {\\r\\n width: 35px;\\r\\n height: 30px;\\r\\n float: left;\\r\\n padding-right: 10px;\\r\\n}\\r\\n\\r\\n.comment-item {\\r\\n align-self: center;\\r\\n font-weight: 500;\\r\\n padding: 11px 20px;\\r\\n}\\r\\n\\r\\n.comment-often:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.dropdown {\\r\\n background: white;\\r\\n width: 100%;\\r\\n /* height: 30px; */\\r\\n /* border: 0.5px solid #707070; */\\r\\n}\\r\\n\\r\\n.searchButton {\\r\\n width: 109px !important;\\r\\n height: 46px;\\r\\n border: none !important;\\r\\n background-color: #006CB7;\\r\\n color: white;\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.officeName {\\r\\n font-size: 14px;\\r\\n color: black;\\r\\n font-weight: bold;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.officeSumary {\\r\\n font-size: 14px;\\r\\n font-weight: normal;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.officeButton {\\r\\n height: 30px;\\r\\n background-color: #006CB7;\\r\\n color: white;\\r\\n width: 100px;\\r\\n margin-right: 5px;\\r\\n border: none !important;\\r\\n}\\r\\n\\r\\n.res {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.res-num {\\r\\n color: red;\\r\\n}\\r\\n\\r\\n.Border {\\r\\n border: 1px solid gray;\\r\\n width: -webkit-fit-content;\\r\\n width: -moz-fit-content;\\r\\n width: fit-content;\\r\\n}\\r\\n\\r\\n.Reply {\\r\\n overflow: hidden;\\r\\n white-space: unset;\\r\\n}\\r\\n\\r\\n.info-box {\\r\\n max-width: 700px;\\r\\n padding: 15px;\\r\\n left: 0;\\r\\n right: 0;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.otp-box {\\r\\n background: #eff0f0;\\r\\n}\\r\\n\\r\\n.btn-other .btn:hover {\\r\\n cursor: pointer;\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n.btn-other .btn {\\r\\n color: navy;\\r\\n text-decoration: underline;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL2NyZWF0ZS1hY2NvdW50L2NyZWF0ZS1hY2NvdW50LmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLDhCQUE4QjtJQUM5QixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLFlBQVk7SUFDWixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGVBQWU7SUFDZixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLHlCQUF5QjtJQUN6QixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0JBQW9COztBQUV4Qjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsZUFBZTtJQUNmLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osV0FBVztJQUNYLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLGlDQUFpQztBQUNyQzs7QUFFQTtJQUNJLHVCQUF1QjtJQUN2QixZQUFZO0lBQ1osdUJBQXVCO0lBQ3ZCLHlCQUF5QjtJQUN6QixZQUFZO0lBQ1osWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGVBQWU7SUFDZixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLHlCQUF5QjtJQUN6QixZQUFZO0lBQ1osWUFBWTtJQUNaLGlCQUFpQjtJQUNqQix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksVUFBVTtBQUNkOztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLDBCQUFrQjtJQUFsQix1QkFBa0I7SUFBbEIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsT0FBTztJQUNQLFFBQVE7SUFDUixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsMEJBQTBCO0FBQzlCIiwiZmlsZSI6InNyYy9hcHAvcG9ydGFsL2NyZWF0ZS1hY2NvdW50L2NyZWF0ZS1hY2NvdW50LmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIudGl0bGVCb3R0b20ge1xyXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcclxuICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzAwNkNCNztcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGNvbG9yOiBibGFjaztcclxuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XHJcbn1cclxuXHJcbi5jb21tZW50VGl0bGVJdGVtIHtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGNvbG9yOiBibGFjaztcclxufVxyXG5cclxuLnR4dENvdW50U2VhcmNoQ210IHtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGNvbG9yOiBibGFjaztcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgLyogbWFyZ2luLWJvdHRvbTogMjBweDsgKi9cclxuICAgIG1hcmdpbi10b3A6IDMwcHg7XHJcbn1cclxuXHJcbi5pdGVtUm93IHtcclxuICAgIHBhZGRpbmctdG9wOiAyMHB4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDIwcHg7XHJcbiAgICA7XHJcbn1cclxuXHJcbi50aXRsZVNlYXJjaFBhZ2Uge1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDIwcHggIWltcG9ydGFudDtcclxuICAgIGZvbnQtc2l6ZTogMThweDtcclxuICAgIGNvbG9yOiBibGFjayAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ubGFiZWwge1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbn1cclxuXHJcbi5jb250ZW50IHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxufVxyXG5cclxuLmltZy1jb21tZW50LXJlcGx5IHtcclxuICAgIHdpZHRoOiA1MHB4O1xyXG4gICAgaGVpZ2h0OiA1MHB4O1xyXG59XHJcblxyXG4uaW1nLWxvZ28ge1xyXG4gICAgd2lkdGg6IDM1cHg7XHJcbiAgICBoZWlnaHQ6IDMwcHg7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XHJcbn1cclxuXHJcbi5jb21tZW50LWl0ZW0ge1xyXG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgIHBhZGRpbmc6IDExcHggMjBweDtcclxufVxyXG5cclxuLmNvbW1lbnQtb2Z0ZW46aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4uZHJvcGRvd24ge1xyXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIC8qIGhlaWdodDogMzBweDsgKi9cclxuICAgIC8qIGJvcmRlcjogMC41cHggc29saWQgIzcwNzA3MDsgKi9cclxufVxyXG5cclxuLnNlYXJjaEJ1dHRvbiB7XHJcbiAgICB3aWR0aDogMTA5cHggIWltcG9ydGFudDtcclxuICAgIGhlaWdodDogNDZweDtcclxuICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNztcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGZsb2F0OiByaWdodDtcclxufVxyXG5cclxuLm9mZmljZU5hbWUge1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgY29sb3I6IGJsYWNrO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG59XHJcblxyXG4ub2ZmaWNlU3VtYXJ5IHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG59XHJcblxyXG4ub2ZmaWNlQnV0dG9uIHtcclxuICAgIGhlaWdodDogMzBweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjc7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgICB3aWR0aDogMTAwcHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcclxuICAgIGJvcmRlcjogbm9uZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ucmVzIHtcclxuICAgIGZsb2F0OiByaWdodDtcclxufVxyXG5cclxuLnJlcy1udW0ge1xyXG4gICAgY29sb3I6IHJlZDtcclxufVxyXG5cclxuLkJvcmRlciB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBncmF5O1xyXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xyXG59XHJcblxyXG4uUmVwbHkge1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHdoaXRlLXNwYWNlOiB1bnNldDtcclxufVxyXG5cclxuLmluZm8tYm94IHtcclxuICAgIG1heC13aWR0aDogNzAwcHg7XHJcbiAgICBwYWRkaW5nOiAxNXB4O1xyXG4gICAgbGVmdDogMDtcclxuICAgIHJpZ2h0OiAwO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG59XHJcblxyXG4ub3RwLWJveCB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjZWZmMGYwO1xyXG59XHJcblxyXG4uYnRuLW90aGVyIC5idG46aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgY29sb3I6ICMwMDZDQjc7XHJcbn1cclxuXHJcbi5idG4tb3RoZXIgLmJ0biB7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xyXG59Il19 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n Tiếp Tục \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'InputOTP' | translate}} \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ActivatedRoute, Router, NavigationEnd } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-create-account',\r\n templateUrl: './create-account.component.html',\r\n styleUrls: ['./create-account.component.css']\r\n})\r\nexport class CreateAccountComponent implements OnInit {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n\r\n otpCode = '';\r\n isOpenOtp = false;\r\n isEdit = true;\r\n dataCommentItem: any;\r\n title: any;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router\r\n ) {\r\n this.getPageName();\r\n this.setDefault();\r\n\r\n this.activatedRoute.queryParams.subscribe((params: any) => {\r\n if (params && params.title) {\r\n this.title = params.title;\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n pageName: any;\r\n\r\n setDefault() {\r\n this.dataCommentItem = {\r\n FullName: null,\r\n Password: null,\r\n UserName: null,\r\n Address: null,\r\n Phone: null,\r\n PhoneOffice: null,\r\n Email: null,\r\n otpCode: '',\r\n };\r\n this.isOpenOtp = false;\r\n this.isEdit = true;\r\n // this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataCommentItem;\r\n return {\r\n FullName: temp.FullName,\r\n Password: temp.Password,\r\n UserName: temp.UserName,\r\n Address: temp.Address,\r\n Phone: temp.Phone,\r\n PhoneOffice: temp.PhoneOffice,\r\n Email: temp.Email,\r\n };\r\n }\r\n\r\n createDataRequestMail(data) {\r\n const temp = data ? data : this.dataCommentItem;\r\n return {\r\n email: temp.Email\r\n };\r\n }\r\n\r\n async getOTP() {\r\n const dataRequest = this.createDataRequest(null);\r\n const email = this.createDataRequestMail(null);\r\n //var email = this.dataCommentItem.Email;\r\n const result = await this.appService.doPOST('api/LoginAsk/OTP', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.otpCode = result.Data;\r\n this.isOpenOtp = true;\r\n this.isEdit = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n async addUser() {\r\n if (this.dataCommentItem.otpCode == this.otpCode) {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/LoginAsk/addNew', dataRequest);\r\n if (result && result.Status === 1) {\r\n // this.notification.showSuccess(result.Msg);\r\n // this.onAddNewComment();\r\n const accountInfo = {\r\n UserName: dataRequest.UserName,\r\n FullName: dataRequest.FullName\r\n };\r\n localStorage.setItem('accountInfoPortal', JSON.stringify(accountInfo));\r\n\r\n this.router.navigate(['portal/comment-list'], { queryParams: { title: this.title } });\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n else {\r\n this.appSwal.showWarning(\"Mã OTP Không Chính Xác\", false);\r\n }\r\n\r\n }\r\n\r\n onAddNewComment() {\r\n this.setDefault();\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n onBack() {\r\n this.isOpenOtp = false;\r\n this.isEdit = true;\r\n this.dataCommentItem.otpCode = '';\r\n }\r\n}\r\n","module.exports = \"footer {\\r\\n background-color: #006CB7 !important;\\r\\n margin-top: 20px;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.footer {\\r\\n text-align: left;\\r\\n /* max-width: 300px; */\\r\\n /* color: white; */\\r\\n font-size: 13px;\\r\\n /* max-width: 1140px; */\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.footer img {\\r\\n width: 170px;\\r\\n}\\r\\n\\r\\n.content {\\r\\n width: 100%;\\r\\n float: left;\\r\\n /* margin-top: 30px; */\\r\\n}\\r\\n\\r\\n.designer {\\r\\n text-align: right;\\r\\n /* max-width: 300px; */\\r\\n color: white;\\r\\n font-size: 15px;\\r\\n /* max-width: 1140px; */\\r\\n /* margin: auto;\\r\\n position: absolute;\\r\\n right: 0px;\\r\\n top: 30px; */\\r\\n}\\r\\n\\r\\nh4 {\\r\\n font-weight: bold;\\r\\n font-size: 15px;\\r\\n}\\r\\n\\r\\n.infoUser {\\r\\n /* text-align: right; */\\r\\n max-width: 300px;\\r\\n color: white;\\r\\n font-size: 13px;\\r\\n max-width: 1140px;\\r\\n margin: auto;\\r\\n margin-top: 30px;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n footer {\\r\\n height: 100%;\\r\\n }\\r\\n .designer {\\r\\n text-align: left;\\r\\n }\\r\\n .infoUser {\\r\\n text-align: left;\\r\\n }\\r\\n .footer-content {\\r\\n line-height: 1 !important;\\r\\n line-break: auto;\\r\\n padding-left: 15px !important;\\r\\n padding-right: 15px !important;\\r\\n }\\r\\n}\\r\\n\\r\\n.bold-footer {\\r\\n height: 12px;\\r\\n padding-left: 0px;\\r\\n padding-right: 0px;\\r\\n background-color: #005995 !important\\r\\n}\\r\\n\\r\\n.onl-count {\\r\\n background-color: #1860A8;\\r\\n padding: 1px 5px 3px 5px;\\r\\n border-radius: 5px;\\r\\n margin-left: 1px;\\r\\n margin-right: 1px;\\r\\n}\\r\\n\\r\\n.background_footer {\\r\\n background-size: 100% 100%;\\r\\n background-repeat: no-repeat;\\r\\n}\\r\\n\\r\\n.line_span_footer {\\r\\n margin: 15px\\r\\n}\\r\\n\\r\\n.fa-arrow-up:before {\\r\\n color: #D0E27C;\\r\\n}\\r\\n\\r\\n.btn-ontop {\\r\\n padding: 0px 30px 10px;\\r\\n margin-left: 10px;\\r\\n background: url('on_top.png') no-repeat;\\r\\n background-size: 100%;\\r\\n white-space: nowrap;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.footer-content {\\r\\n line-height: 0;\\r\\n /* padding: 0px !important; */\\r\\n margin-top: 15px;\\r\\n}\\r\\n\\r\\n.margin-new-row {\\r\\n margin-top: 0px !important;\\r\\n}\\r\\n\\r\\n.btn-ontop:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.footer-style{\\r\\n text-align: right;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL2Zvb3Rlci9mb290ZXIuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLG9DQUFvQztJQUNwQyxnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsdUJBQXVCO0lBQ3ZCLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFdBQVc7SUFDWCxzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsc0JBQXNCO0lBQ3RCLFlBQVk7SUFDWixlQUFlO0lBQ2YsdUJBQXVCO0lBQ3ZCOzs7Z0JBR1k7QUFDaEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLHVCQUF1QjtJQUN2QixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsWUFBWTtJQUNaLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJO1FBQ0ksWUFBWTtJQUNoQjtJQUNBO1FBQ0ksZ0JBQWdCO0lBQ3BCO0lBQ0E7UUFDSSxnQkFBZ0I7SUFDcEI7SUFDQTtRQUNJLHlCQUF5QjtRQUN6QixnQkFBZ0I7UUFDaEIsNkJBQTZCO1FBQzdCLDhCQUE4QjtJQUNsQztBQUNKOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEI7QUFDSjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6Qix3QkFBd0I7SUFDeEIsa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSwwQkFBMEI7SUFDMUIsNEJBQTRCO0FBQ2hDOztBQUVBO0lBQ0k7QUFDSjs7QUFFQTtJQUNJLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxzQkFBc0I7SUFDdEIsaUJBQWlCO0lBQ2pCLHVDQUE4RDtJQUM5RCxxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxjQUFjO0lBQ2QsNkJBQTZCO0lBQzdCLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckIiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvZm9vdGVyL2Zvb3Rlci5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiZm9vdGVyIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxuICAgIG1hcmdpbi10b3A6IDIwcHg7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxufVxyXG5cclxuLmZvb3RlciB7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gICAgLyogbWF4LXdpZHRoOiAzMDBweDsgKi9cclxuICAgIC8qIGNvbG9yOiB3aGl0ZTsgKi9cclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIC8qIG1heC13aWR0aDogMTE0MHB4OyAqL1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG59XHJcblxyXG4uZm9vdGVyIGltZyB7XHJcbiAgICB3aWR0aDogMTcwcHg7XHJcbn1cclxuXHJcbi5jb250ZW50IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICAvKiBtYXJnaW4tdG9wOiAzMHB4OyAqL1xyXG59XHJcblxyXG4uZGVzaWduZXIge1xyXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XHJcbiAgICAvKiBtYXgtd2lkdGg6IDMwMHB4OyAqL1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgLyogbWF4LXdpZHRoOiAxMTQwcHg7ICovXHJcbiAgICAvKiBtYXJnaW46IGF1dG87XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICByaWdodDogMHB4O1xyXG4gICAgdG9wOiAzMHB4OyAqL1xyXG59XHJcblxyXG5oNCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGZvbnQtc2l6ZTogMTVweDtcclxufVxyXG5cclxuLmluZm9Vc2VyIHtcclxuICAgIC8qIHRleHQtYWxpZ246IHJpZ2h0OyAqL1xyXG4gICAgbWF4LXdpZHRoOiAzMDBweDtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG1heC13aWR0aDogMTE0MHB4O1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxufVxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2OHB4KSB7XHJcbiAgICBmb290ZXIge1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgIH1cclxuICAgIC5kZXNpZ25lciB7XHJcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIH1cclxuICAgIC5pbmZvVXNlciB7XHJcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIH1cclxuICAgIC5mb290ZXItY29udGVudCB7XHJcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDtcclxuICAgICAgICBsaW5lLWJyZWFrOiBhdXRvO1xyXG4gICAgICAgIHBhZGRpbmctbGVmdDogMTVweCAhaW1wb3J0YW50O1xyXG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDE1cHggIWltcG9ydGFudDtcclxuICAgIH1cclxufVxyXG5cclxuLmJvbGQtZm9vdGVyIHtcclxuICAgIGhlaWdodDogMTJweDtcclxuICAgIHBhZGRpbmctbGVmdDogMHB4O1xyXG4gICAgcGFkZGluZy1yaWdodDogMHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNTk5NSAhaW1wb3J0YW50XHJcbn1cclxuXHJcbi5vbmwtY291bnQge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzE4NjBBODtcclxuICAgIHBhZGRpbmc6IDFweCA1cHggM3B4IDVweDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcclxuICAgIG1hcmdpbi1sZWZ0OiAxcHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDFweDtcclxufVxyXG5cclxuLmJhY2tncm91bmRfZm9vdGVyIHtcclxuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxufVxyXG5cclxuLmxpbmVfc3Bhbl9mb290ZXIge1xyXG4gICAgbWFyZ2luOiAxNXB4XHJcbn1cclxuXHJcbi5mYS1hcnJvdy11cDpiZWZvcmUge1xyXG4gICAgY29sb3I6ICNEMEUyN0M7XHJcbn1cclxuXHJcbi5idG4tb250b3Age1xyXG4gICAgcGFkZGluZzogMHB4IDMwcHggMTBweDtcclxuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xyXG4gICAgYmFja2dyb3VuZDogdXJsKFwiLi4vLi4vLi4vYXNzZXRzL2ltYWdlcy9vbl90b3AucG5nXCIpIG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJTtcclxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5mb290ZXItY29udGVudCB7XHJcbiAgICBsaW5lLWhlaWdodDogMDtcclxuICAgIC8qIHBhZGRpbmc6IDBweCAhaW1wb3J0YW50OyAqL1xyXG4gICAgbWFyZ2luLXRvcDogMTVweDtcclxufVxyXG5cclxuLm1hcmdpbi1uZXctcm93IHtcclxuICAgIG1hcmdpbi10b3A6IDBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uYnRuLW9udG9wOmhvdmVyIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLmZvb3Rlci1zdHlsZXtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG59Il19 */\"","module.exports = \"\"","import { Component, OnInit, OnDestroy } from '@angular/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { Observable } from 'rxjs-compat/Observable';\r\nimport { t } from '@angular/core/src/render3';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'app-footer',\r\n templateUrl: './footer.component.html',\r\n styleUrls: ['./footer.component.css']\r\n})\r\nexport class FooterComponent implements OnInit,OnDestroy {\r\n\r\n public OnlineCnt: number;\r\n public AccessCnt: number;\r\n\r\n myIntervalIdea: any;\r\n\r\n FooterImg: any;\r\n footerphoto: any;\r\n\r\n AccessCntArr: Array;\r\n FooterMenu : Array;\r\n FooterContent : Array;\r\n\r\n constructor(\r\n private appService: AppService,\r\n private domSanitizer: DomSanitizer,\r\n ) { \r\n this.OnlineCnt = 0;\r\n this.AccessCnt = 0;\r\n this.getAccessSysTimes();\r\n // this.getFooterImg();\r\n // this.getTypeFooter()\r\n // this.getFooterContent();\r\n // this.myIntervalIdea = Observable.interval(5000).subscribe(() => {\r\n // this.getAccessSysTimes();\r\n // });\r\n }\r\n\r\n ngOnInit() {\r\n \r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.myIntervalIdea) { this.myIntervalIdea.unsubscribe(); }\r\n this.closeAccessSys();\r\n }\r\n\r\n async getAccessSysTimes() {\r\n var accessID = sessionStorage.getItem(\"AccessID\");\r\n const dataRequest = {\r\n AccessID:(typeof accessID !== 'undefined' && accessID != null)?accessID:\"\",\r\n Page: window.location.origin\r\n };\r\n\r\n const result = await this.appService.doGET('api/Footer/GetAccessSysTimes', dataRequest);\r\n if (result && result.Status === 1 && result.Data) {\r\n sessionStorage.setItem(\"AccessID\",result.Data.AccessID);\r\n this.OnlineCnt = (typeof result.Data.OnlineCnt !== 'undefined' && result.Data.OnlineCnt != null)?result.Data.OnlineCnt:0;\r\n this.AccessCnt = (typeof result.Data.AccessCnt !== 'undefined' && result.Data.AccessCnt != null)?result.Data.AccessCnt:0;\r\n if (result.Data.FooterContent && result.Data.FooterContent.Description){\r\n this.FooterContent = result.Data.FooterContent;\r\n }\r\n this.FooterMenu = result.Data.FooterMenu;\r\n if (result.Data.FooterImg){\r\n this.FooterImg = result.Data.FooterImg;\r\n this.footerphoto = this.appService.apiRoot + this.FooterImg.FileUrl;\r\n } \r\n \r\n }\r\n if(this.AccessCnt.toString().length > 1 ){\r\n this.AccessCntArr = this.AccessCnt.toString(10).replace(/\\D/g, '0').split('').map(Number);\r\n }\r\n }\r\n\r\n async closeAccessSys() {\r\n var accessID = sessionStorage.getItem(\"AccessID\");\r\n const dataRequest = {\r\n AccessID:(typeof accessID !== 'undefined' && accessID != null)?accessID:\"\"\r\n };\r\n const result = await this.appService.doGET('api/Footer/CloseAccessSys', dataRequest);\r\n }\r\n\r\n // async getFooterImg() {\r\n // const resultImage = await this.appService.doGET('api/File/GetFooterImg', null);\r\n \r\n // if (resultImage && resultImage.Status === 1) {\r\n // if(resultImage.Data.Item){\r\n // this.FooterImg = resultImage.Data.Item;\r\n // this.footerphoto = this.appService.apiRoot + this.FooterImg.FileUrl;\r\n // }\r\n // }\r\n // }\r\n\r\n // async getTypeFooter() {\r\n // const resutl = await this.appService.doGET('api/Type/GetTypeFooter', null);\r\n \r\n // if (resutl && resutl.Status === 1) {\r\n // if(resutl.Data){\r\n // this.FooterMenu = resutl.Data;\r\n // }\r\n // }\r\n // }\r\n\r\n scrollTop(){\r\n window.scrollTo(0, 0);\r\n }\r\n\r\n // async getFooterContent() {\r\n // const resutl = await this.appService.doGET('api/MailConfig/getFooterContent', null);\r\n \r\n // if (resutl && resutl.Status === 1) {\r\n // if(resutl.Data){\r\n // if(resutl.Data.Description){\r\n // this.FooterContent = resutl.Data;\r\n // }\r\n // }\r\n // }\r\n \r\n // }\r\n}\r\n","module.exports = \"body {\\r\\n font-style: normal;\\r\\n font-weight: normal;\\r\\n font-size: 14px;\\r\\n color: #71748d;\\r\\n background-color: #FFFFFF;\\r\\n -webkit-font-smoothing: antialiased;\\r\\n font-family: 'Open Sans', sans-serif !important;\\r\\n}\\r\\n\\r\\n.user-image,\\r\\n.user-image img {\\r\\n border-radius: 50%;\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n/* #006CB7\\r\\n#006CB7 */\\r\\n\\r\\n.bg-vnpt,\\r\\n.bg-vnpt .dropdown-menu {\\r\\n background-color: #006CB7 !important;\\r\\n color: #FFFFFF;\\r\\n border: none;\\r\\n text-transform: capitalize;\\r\\n}\\r\\n\\r\\n.bg-vnpt {\\r\\n top: 0;\\r\\n z-index: 2;\\r\\n max-width: 1140px;\\r\\n padding: 0px;\\r\\n margin: auto;\\r\\n /* height: 42px; */\\r\\n}\\r\\n\\r\\n.bg-vnpt .navbar-nav .active>.nav-link,\\r\\n.bg-vnpt .navbar-nav .nav-link.active,\\r\\n.bg-vnpt .navbar-nav .nav-link.show,\\r\\n.bg-vnpt .navbar-nav .show>.nav-link,\\r\\n.bg-vnpt a,\\r\\n.bg-vnpt .n-b {\\r\\n color: inherit !important;\\r\\n /* font-weight: bold !important; */\\r\\n}\\r\\n\\r\\n.bg-vnpt .n-b:hover,\\r\\n.bg-vnpt .dropdown-item:focus,\\r\\n.bg-vnpt .dropdown-item:hover {\\r\\n color: #FFFFFF !important;\\r\\n text-decoration: none;\\r\\n background-color: #006CB7 !important;\\r\\n /* font-weight: bold; */\\r\\n}\\r\\n\\r\\n.bg-vnpt .dropdown-menu {\\r\\n left: 0px;\\r\\n top: auto;\\r\\n padding: 0;\\r\\n /* color: #000000; */\\r\\n color: navy;\\r\\n min-width: 250px;\\r\\n visibility: visible;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\n.bg-vnpt .n-b {\\r\\n background-color: #ffffff;\\r\\n background: #ffffff;\\r\\n border: 1px solid #80808038;\\r\\n padding: 8px 20px;\\r\\n min-width: -webkit-max-content;\\r\\n min-width: -moz-max-content;\\r\\n min-width: max-content;\\r\\n margin-top: -1px;\\r\\n /* min-width: 400px; */\\r\\n}\\r\\n\\r\\n.bg-vnpt .navbar-toggler {\\r\\n border: 1px solid #FFFFFF;\\r\\n color: #FFFFFF;\\r\\n background: inherit;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup {\\r\\n left: auto !important;\\r\\n right: 10px;\\r\\n top: 48px;\\r\\n width: 320px;\\r\\n height: auto;\\r\\n box-shadow: 0 2px 10px rgba(0, 0, 0, .2);\\r\\n border: 1px solid #ccc;\\r\\n border-color: rgba(0, 0, 0, .2);\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top {\\r\\n margin: 20px;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.toggle-user .k-popup {\\r\\n border: none;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top .user-image-large,\\r\\n.toggle-user kendo-popup .top .info {\\r\\n display: inline-block;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top .user-image-large {\\r\\n border-radius: 50%;\\r\\n width: 90px;\\r\\n height: 90px;\\r\\n margin-right: 20px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top .user-image-large img {\\r\\n border-radius: 50%;\\r\\n width: 90px;\\r\\n height: 90px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top .employee-name {\\r\\n font-weight: bold;\\r\\n margin: -4px 0 1px 0;\\r\\n text-overflow: ellipsis;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .top .role-name {\\r\\n color: #666;\\r\\n text-overflow: ellipsis;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .bottom {\\r\\n background: #f5f5f5;\\r\\n border-top: 1px solid #ccc;\\r\\n border-color: rgba(0, 0, 0, .2);\\r\\n padding: 10px 0;\\r\\n width: 100%;\\r\\n display: table;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .bottom>div {\\r\\n display: table-cell;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .bottom .k-button {\\r\\n margin: 0 20px;\\r\\n white-space: nowrap;\\r\\n background: #f8f8f8;\\r\\n border: 1px solid #c6c6c6;\\r\\n color: #666;\\r\\n cursor: default;\\r\\n text-decoration: none;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .bottom .change-pass {\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.toggle-user kendo-popup .bottom .log-out {\\r\\n text-align: right;\\r\\n}\\r\\n\\r\\n.nav-item-button {\\r\\n margin-right: 4px;\\r\\n}\\r\\n\\r\\n.btn-nav {\\r\\n height: 40px;\\r\\n background: inherit;\\r\\n border: 1px solid #FFFFFF;\\r\\n color: #FFFFFF;\\r\\n}\\r\\n\\r\\n.navbar-brand {\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.searchdiv {\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.xsearchdiv {\\r\\n margin-right: 50px;\\r\\n margin-top: 14px !important;\\r\\n}\\r\\n\\r\\n.xsearchbtn {\\r\\n border-top: 0;\\r\\n margin-left: 5px;\\r\\n margin-right: 5px;\\r\\n height: 38px !important;\\r\\n}\\r\\n\\r\\n.header-block {\\r\\n position: relative;\\r\\n width: 100%;\\r\\n margin: 0;\\r\\n padding: 0px;\\r\\n text-align: center;\\r\\n z-index: 2;\\r\\n margin-top: -10px;\\r\\n}\\r\\n\\r\\n.logo-block {\\r\\n text-align: unset;\\r\\n display: inline-block;\\r\\n max-width: 1140px;\\r\\n background-color: #F2F2F2;\\r\\n}\\r\\n\\r\\n/* .logo-block .item-img{\\r\\n text-align: left;\\r\\n width: 135px;\\r\\n height: 120px;\\r\\n} */\\r\\n\\r\\n.logo-block .item-img {\\r\\n /* text-align: left; */\\r\\n width: 100px;\\r\\n height: 100px;\\r\\n /* padding-top: 10px; */\\r\\n}\\r\\n\\r\\n.logo-block .item-img-1 {\\r\\n width: 120px;\\r\\n height: 120px;\\r\\n}\\r\\n\\r\\n/* .column .banner-block{\\r\\n text-align: right;\\r\\n display: inline-block;\\r\\n width: 486px;\\r\\n height: 124px;\\r\\n max-height: 124px;\\r\\n} */\\r\\n\\r\\n.menu-block {\\r\\n display: inline-block;\\r\\n width: 100%;\\r\\n background-color: #006CB7;\\r\\n font-size: 15px;\\r\\n color: #FFFFFF !important;\\r\\n font-weight: bold;\\r\\n position: -webkit-sticky;\\r\\n position: sticky;\\r\\n height: 42px;\\r\\n}\\r\\n\\r\\n.item-menu {\\r\\n padding-right: 50px;\\r\\n}\\r\\n\\r\\n.item-menu-Last {\\r\\n padding-right: 0px !important;\\r\\n}\\r\\n\\r\\n.item-menu:hover>.dropdown-menu {\\r\\n display: block !important;\\r\\n}\\r\\n\\r\\n.dropdown-item:hover>.menu-child {\\r\\n display: block !important;\\r\\n}\\r\\n\\r\\n.item-menu:hover>.dropdown-toggle::after {\\r\\n visibility: hidden;\\r\\n}\\r\\n\\r\\n.menu-hover {\\r\\n padding-left: 22px !important;\\r\\n padding-right: 22px !important;\\r\\n}\\r\\n\\r\\n.menu-hover:hover {\\r\\n background-color: #005995 !important;\\r\\n}\\r\\n\\r\\n.search-menu {\\r\\n position: absolute;\\r\\n right: 70px;\\r\\n}\\r\\n\\r\\n.search-block {\\r\\n text-align: left;\\r\\n width: 200px;\\r\\n position: relative;\\r\\n font-size: 16px !important;\\r\\n}\\r\\n\\r\\n.search-block-txt>input {\\r\\n width: 168px;\\r\\n height: 35px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.search-block-btn {\\r\\n position: absolute;\\r\\n top: 0px;\\r\\n left: 165px;\\r\\n}\\r\\n\\r\\n.search-block-btn>button {\\r\\n width: 35px;\\r\\n height: 35px;\\r\\n}\\r\\n\\r\\n.bg-vnpt .menu-child {\\r\\n position: absolute;\\r\\n left: 100%;\\r\\n top: -1px;\\r\\n color: navy;\\r\\n background: #FFFFFF;\\r\\n font-weight: normal;\\r\\n width: 100%;\\r\\n visibility: visible;\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.menu-level {\\r\\n position: relative;\\r\\n white-space: normal;\\r\\n}\\r\\n\\r\\n.menu-level-child {\\r\\n border: 1px solid #c6c6c6;\\r\\n padding: 8px 20px;\\r\\n white-space: normal;\\r\\n min-width: -webkit-max-content;\\r\\n min-width: -moz-max-content;\\r\\n min-width: max-content;\\r\\n margin-top: -1px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.menu-level-child:hover {\\r\\n color: #FFFFFF;\\r\\n background: #006CB7;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.list-menu-cus {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.icon-child-menu {\\r\\n position: absolute;\\r\\n right: 0%;\\r\\n top: 12px;\\r\\n}\\r\\n\\r\\n.loading {\\r\\n display: none !important;\\r\\n}\\r\\n\\r\\n.logo-block:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.dropdown-menu a {\\r\\n font-family: 'open sans' sans-serif;\\r\\n font-size: 14px;\\r\\n /* margin-left: -13px; */\\r\\n}\\r\\n\\r\\n.header-text {\\r\\n font: Roboto;\\r\\n font-size: 15px;\\r\\n font-weight: bold;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.header-text-2 {\\r\\n font: Roboto;\\r\\n font-size: 20px;\\r\\n color: #005995;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.header-text-3 {\\r\\n font: Roboto;\\r\\n font-size: 15px;\\r\\n color: #950000;\\r\\n}\\r\\n\\r\\n.column {\\r\\n float: left;\\r\\n width: 50%;\\r\\n}\\r\\n\\r\\n.banner_block {\\r\\n text-align: right;\\r\\n display: inline-block;\\r\\n width: 100%;\\r\\n height: 124px;\\r\\n}\\r\\n\\r\\n/* .title {\\r\\n overflow: hidden;\\r\\n text-align: justify;\\r\\n padding-top: 10px;\\r\\n float: right;\\r\\n width: 55%;\\r\\n /* width: calc(100% - 135px);\\r\\n padding-left: 10px;\\r\\n left: 0;\\r\\n right: 0;\\r\\n margin: auto;\\r\\n} */\\r\\n\\r\\nli a [aria-expanded=\\\"true\\\"] {\\r\\n background-color: #005995 !important;\\r\\n}\\r\\n\\r\\n.dropdown-toggle::after {\\r\\n display: block;\\r\\n visibility: hidden;\\r\\n margin-left: .255em;\\r\\n content: \\\"\\\";\\r\\n border-top: .3em solid;\\r\\n border-right: .3em solid transparent;\\r\\n border-bottom: 0;\\r\\n border-left: .3em solid transparent;\\r\\n width: 10px;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.row-margin {\\r\\n margin-top: 0px !important;\\r\\n /* min-height: 128px; */\\r\\n}\\r\\n\\r\\n.active {\\r\\n background-color: #666;\\r\\n}\\r\\n\\r\\n.img-header {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.lang-div {\\r\\n margin-top: 3px;\\r\\n float: left;\\r\\n margin-right: 10px;\\r\\n}\\r\\n\\r\\n.chosen-lang {\\r\\n cursor: default !important;\\r\\n -webkit-filter: brightness(1) !important;\\r\\n filter: brightness(1) !important;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:992px) {\\r\\n .lang-div {\\r\\n padding-left: 0px !important;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:1030px) {\\r\\n /* .logo-block .item-img {\\r\\n width: 65px;\\r\\n height: 65px;\\r\\n } */\\r\\n .header-text,\\r\\n .header-text-3 {\\r\\n font-size: 12px;\\r\\n }\\r\\n .header-text-2 {\\r\\n font-size: 16px;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:910px) {\\r\\n .logo-block .item-img {\\r\\n width: 80px;\\r\\n height: 80px;\\r\\n }\\r\\n .header-text,\\r\\n .header-text-3 {\\r\\n font-size: 10px;\\r\\n }\\r\\n .header-text-2 {\\r\\n font-size: 15px;\\r\\n }\\r\\n .logo-block .item-img-1 {\\r\\n width: 80px;\\r\\n height: 80px;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .logo-block .item-img {\\r\\n width: 80px;\\r\\n height: 80px;\\r\\n }\\r\\n .header-text,\\r\\n .header-text-3 {\\r\\n font-size: 10px;\\r\\n }\\r\\n .header-text-2 {\\r\\n font-size: 15px;\\r\\n }\\r\\n .logo-block .item-img-1 {\\r\\n width: 80px;\\r\\n height: 80px;\\r\\n }\\r\\n .menu-child {\\r\\n position: inherit;\\r\\n width: inherit;\\r\\n left: 0px;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:496px) {\\r\\n .logo-block .item-img {\\r\\n width: 65px;\\r\\n height: 65px;\\r\\n }\\r\\n .header-text,\\r\\n .header-text-3 {\\r\\n font-size: 8px;\\r\\n }\\r\\n .header-text-2 {\\r\\n font-size: 12px;\\r\\n }\\r\\n .logo-block .item-img-1 {\\r\\n width: 65px;\\r\\n height: 65px;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (max-width: 991px) {\\r\\n /*600px*/\\r\\n .bg-vnpt {\\r\\n top: 0;\\r\\n z-index: 2;\\r\\n width: 100%;\\r\\n /* padding: 8px 12px; */\\r\\n padding-left: 8px;\\r\\n }\\r\\n .bg-vnpt .n-b {\\r\\n background-color: #ffffff;\\r\\n background: #ffffff;\\r\\n border: 1px solid #80808038;\\r\\n padding: 8px 20px;\\r\\n width: 100%;\\r\\n min-width: 100%;\\r\\n }\\r\\n .item-menu {\\r\\n padding-right: 0px;\\r\\n }\\r\\n .menu-block {\\r\\n /* display: inline-block; */\\r\\n width: 100%;\\r\\n /* background-color: #006CB7; */\\r\\n /* font-size: 15px; */\\r\\n /* color: #FFFFFF !important; */\\r\\n /* font-weight: bold; */\\r\\n padding: 6px 0px;\\r\\n }\\r\\n .logo-block {\\r\\n text-align: left;\\r\\n display: inline-block;\\r\\n width: 100%;\\r\\n background-color: #F2F2F2;\\r\\n }\\r\\n .logo-block>img {\\r\\n width: 50%;\\r\\n height: auto;\\r\\n }\\r\\n .search-menu {\\r\\n position: absolute;\\r\\n left: auto;\\r\\n right: 80px;\\r\\n top: 3px;\\r\\n }\\r\\n .menu-child {\\r\\n /* position: inherit;\\r\\n left: 0px; */\\r\\n position: inherit !important;\\r\\n width: inherit !important;\\r\\n left: 0px !important;\\r\\n }\\r\\n .menu-level-child {\\r\\n /* width: 100%;\\r\\n border: 0px solid #c6c6c6; */\\r\\n border: 0 solid #c6c6c6;\\r\\n white-space: normal!important;\\r\\n width: inherit;\\r\\n min-width: 100%;\\r\\n padding: 8px 0 8px 20px;\\r\\n }\\r\\n .list-menu-cus {\\r\\n width: 90%;\\r\\n margin-top: 10px;\\r\\n }\\r\\n .column {\\r\\n float: left;\\r\\n width: 50%;\\r\\n }\\r\\n .icon-child-menu {\\r\\n position: absolute;\\r\\n right: 1%;\\r\\n top: 11px;\\r\\n }\\r\\n .banner-general{\\r\\n visibility: hidden;\\r\\n width: 100%;\\r\\n height: 176px;\\r\\n background-color: #f1f1f1;\\r\\n }\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:991px) {\\r\\n .bg-vnpt .dropdown-menu {\\r\\n left: 0px;\\r\\n top: 44px;\\r\\n padding: 0;\\r\\n color: navy;\\r\\n min-width: 250px;\\r\\n visibility: visible;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n text-align: center;\\r\\n }\\r\\n .item-menu {\\r\\n padding-right: unset !important;\\r\\n }\\r\\n}\\r\\n\\r\\n.top-left {\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n /* margin: auto; */\\r\\n display: flex;\\r\\n padding-right: 0 !important;\\r\\n}\\r\\n\\r\\n.top-left>div:nth-child(1) {\\r\\n float: left;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.top-left>div:nth-child(2) {\\r\\n float: left;\\r\\n margin: auto;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n overflow: hidden;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.top-left>div:nth-child(3) {\\r\\n float: right;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.menu-name {\\r\\n position: inherit;\\r\\n padding-top: 2px;\\r\\n}\\r\\n\\r\\n.language-changer {\\r\\n position: absolute;\\r\\n text-align: right;\\r\\n width: 1140px;\\r\\n z-index: 1;\\r\\n left: 0;\\r\\n right: 0;\\r\\n margin: auto;\\r\\n font-weight: bold;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.header-date {\\r\\n text-align: left;\\r\\n margin-left: 2%;\\r\\n font-size: 13px;\\r\\n color: #939393;\\r\\n}\\r\\n\\r\\n.mat-elevation-z5 {\\r\\n position: relative;\\r\\n height: 0;\\r\\n display: contents;\\r\\n padding: 0px !important;\\r\\n font: menu;\\r\\n}\\r\\n\\r\\n.sticky {\\r\\n position: fixed;\\r\\n top: 0px;\\r\\n display: block;\\r\\n height: auto;\\r\\n}\\r\\n\\r\\n.search-block-txt .k-combobox{ \\r\\n width: 100% !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .search-block-txt input{\\r\\n font-size: 15px !important;\\r\\n font-weight: 400 !important;\\r\\n}\\r\\n\\r\\n.banner-general{\\r\\n visibility: hidden;\\r\\n width: 100%;\\r\\n height: 140px;\\r\\n background-color: #f1f1f1;\\r\\n}\\r\\n\\r\\n.menu-temp-style{\\r\\n visibility: hidden;\\r\\n width: 100%;\\r\\n height: 42px;\\r\\n background-color: #f1f1f1;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL2hlYWRlci9oZWFkZXIuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLGNBQWM7SUFDZCx5QkFBeUI7SUFDekIsbUNBQW1DO0lBQ25DLCtDQUErQztBQUNuRDs7QUFFQTs7SUFFSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFlBQVk7SUFDWixVQUFVO0FBQ2Q7O0FBR0E7U0FDUzs7QUFFVDs7SUFFSSxvQ0FBb0M7SUFDcEMsY0FBYztJQUNkLFlBQVk7SUFDWiwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxNQUFNO0lBQ04sVUFBVTtJQUNWLGlCQUFpQjtJQUNqQixZQUFZO0lBQ1osWUFBWTtJQUNaLGtCQUFrQjtBQUN0Qjs7QUFFQTs7Ozs7O0lBTUkseUJBQXlCO0lBQ3pCLGtDQUFrQztBQUN0Qzs7QUFFQTs7O0lBR0kseUJBQXlCO0lBQ3pCLHFCQUFxQjtJQUNyQixvQ0FBb0M7SUFDcEMsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1Ysb0JBQW9CO0lBQ3BCLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QixtQkFBbUI7SUFDbkIsMkJBQTJCO0lBQzNCLGlCQUFpQjtJQUNqQiw4QkFBc0I7SUFBdEIsMkJBQXNCO0lBQXRCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxxQkFBcUI7SUFDckIsV0FBVztJQUNYLFNBQVM7SUFDVCxZQUFZO0lBQ1osWUFBWTtJQUNaLHdDQUF3QztJQUN4QyxzQkFBc0I7SUFDdEIsK0JBQStCO0FBQ25DOztBQUVBO0lBQ0ksWUFBWTtJQUNaLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLFlBQVk7QUFDaEI7O0FBRUE7O0lBRUkscUJBQXFCO0lBQ3JCLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFlBQVk7SUFDWixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLHVCQUF1QjtJQUN2QixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsdUJBQXVCO0lBQ3ZCLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLG1CQUFtQjtJQUNuQiwwQkFBMEI7SUFDMUIsK0JBQStCO0lBQy9CLGVBQWU7SUFDZixXQUFXO0lBQ1gsY0FBYztBQUNsQjs7QUFFQTtJQUNJLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6QixXQUFXO0lBQ1gsZUFBZTtJQUNmLHFCQUFxQjtBQUN6Qjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIseUJBQXlCO0lBQ3pCLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLDJCQUEyQjtBQUMvQjs7QUFFQTtJQUNJLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsU0FBUztJQUNULFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixxQkFBcUI7SUFDckIsaUJBQWlCO0lBQ2pCLHlCQUF5QjtBQUM3Qjs7QUFHQTs7OztJQUlJOztBQUVKO0lBQ0ksc0JBQXNCO0lBQ3RCLFlBQVk7SUFDWixhQUFhO0lBQ2IsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGFBQWE7QUFDakI7O0FBR0E7Ozs7OztHQU1HOztBQUVIO0lBQ0kscUJBQXFCO0lBQ3JCLFdBQVc7SUFDWCx5QkFBeUI7SUFDekIsZUFBZTtJQUNmLHlCQUF5QjtJQUN6QixpQkFBaUI7SUFDakIsd0JBQWdCO0lBQWhCLGdCQUFnQjtJQUNoQixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksNkJBQTZCO0FBQ2pDOztBQUVBO0lBQ0kseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0kseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksNkJBQTZCO0lBQzdCLDhCQUE4QjtBQUNsQzs7QUFFQTtJQUNJLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQiwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osWUFBWTtJQUNaLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsV0FBVztBQUNmOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFNBQVM7SUFDVCxXQUFXO0lBQ1gsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixXQUFXO0lBQ1gsbUJBQW1CO0lBQ25CLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGlCQUFpQjtJQUNqQixtQkFBbUI7SUFDbkIsOEJBQXNCO0lBQXRCLDJCQUFzQjtJQUF0QixzQkFBc0I7SUFDdEIsZ0JBQWdCO0lBQ2hCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksV0FBVztBQUNmOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLFNBQVM7SUFDVCxTQUFTO0FBQ2I7O0FBRUE7SUFDSSx3QkFBd0I7QUFDNUI7O0FBRUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksbUNBQW1DO0lBQ25DLGVBQWU7SUFDZix3QkFBd0I7QUFDNUI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxZQUFZO0lBQ1osZUFBZTtJQUNmLGNBQWM7SUFDZCxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osZUFBZTtJQUNmLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsVUFBVTtBQUNkOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLHFCQUFxQjtJQUNyQixXQUFXO0lBQ1gsYUFBYTtBQUNqQjs7QUFHQTs7Ozs7Ozs7Ozs7R0FXRzs7QUFFSDtJQUNJLG9DQUFvQztBQUN4Qzs7QUFFQTtJQUNJLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxzQkFBc0I7SUFDdEIsb0NBQW9DO0lBQ3BDLGdCQUFnQjtJQUNoQixtQ0FBbUM7SUFDbkMsV0FBVztJQUNYLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSwwQkFBMEI7SUFDMUIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsV0FBVztJQUNYLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLDBCQUEwQjtJQUMxQix3Q0FBZ0M7WUFBaEMsZ0NBQWdDO0FBQ3BDOztBQUVBO0lBQ0k7UUFDSSw0QkFBNEI7SUFDaEM7QUFDSjs7QUFFQTtJQUNJOzs7T0FHRztJQUNIOztRQUVJLGVBQWU7SUFDbkI7SUFDQTtRQUNJLGVBQWU7SUFDbkI7QUFDSjs7QUFFQTtJQUNJO1FBQ0ksV0FBVztRQUNYLFlBQVk7SUFDaEI7SUFDQTs7UUFFSSxlQUFlO0lBQ25CO0lBQ0E7UUFDSSxlQUFlO0lBQ25CO0lBQ0E7UUFDSSxXQUFXO1FBQ1gsWUFBWTtJQUNoQjtBQUNKOztBQUVBO0lBQ0k7UUFDSSxXQUFXO1FBQ1gsWUFBWTtJQUNoQjtJQUNBOztRQUVJLGVBQWU7SUFDbkI7SUFDQTtRQUNJLGVBQWU7SUFDbkI7SUFDQTtRQUNJLFdBQVc7UUFDWCxZQUFZO0lBQ2hCO0lBQ0E7UUFDSSxpQkFBaUI7UUFDakIsY0FBYztRQUNkLFNBQVM7SUFDYjtBQUNKOztBQUVBO0lBQ0k7UUFDSSxXQUFXO1FBQ1gsWUFBWTtJQUNoQjtJQUNBOztRQUVJLGNBQWM7SUFDbEI7SUFDQTtRQUNJLGVBQWU7SUFDbkI7SUFDQTtRQUNJLFdBQVc7UUFDWCxZQUFZO0lBQ2hCO0FBQ0o7O0FBRUE7SUFDSSxRQUFRO0lBQ1I7UUFDSSxNQUFNO1FBQ04sVUFBVTtRQUNWLFdBQVc7UUFDWCx1QkFBdUI7UUFDdkIsaUJBQWlCO0lBQ3JCO0lBQ0E7UUFDSSx5QkFBeUI7UUFDekIsbUJBQW1CO1FBQ25CLDJCQUEyQjtRQUMzQixpQkFBaUI7UUFDakIsV0FBVztRQUNYLGVBQWU7SUFDbkI7SUFDQTtRQUNJLGtCQUFrQjtJQUN0QjtJQUNBO1FBQ0ksMkJBQTJCO1FBQzNCLFdBQVc7UUFDWCwrQkFBK0I7UUFDL0IscUJBQXFCO1FBQ3JCLCtCQUErQjtRQUMvQix1QkFBdUI7UUFDdkIsZ0JBQWdCO0lBQ3BCO0lBQ0E7UUFDSSxnQkFBZ0I7UUFDaEIscUJBQXFCO1FBQ3JCLFdBQVc7UUFDWCx5QkFBeUI7SUFDN0I7SUFDQTtRQUNJLFVBQVU7UUFDVixZQUFZO0lBQ2hCO0lBQ0E7UUFDSSxrQkFBa0I7UUFDbEIsVUFBVTtRQUNWLFdBQVc7UUFDWCxRQUFRO0lBQ1o7SUFDQTtRQUNJO29CQUNZO1FBQ1osNEJBQTRCO1FBQzVCLHlCQUF5QjtRQUN6QixvQkFBb0I7SUFDeEI7SUFDQTtRQUNJO29DQUM0QjtRQUM1Qix1QkFBdUI7UUFDdkIsNkJBQTZCO1FBQzdCLGNBQWM7UUFDZCxlQUFlO1FBQ2YsdUJBQXVCO0lBQzNCO0lBQ0E7UUFDSSxVQUFVO1FBQ1YsZ0JBQWdCO0lBQ3BCO0lBQ0E7UUFDSSxXQUFXO1FBQ1gsVUFBVTtJQUNkO0lBQ0E7UUFDSSxrQkFBa0I7UUFDbEIsU0FBUztRQUNULFNBQVM7SUFDYjtJQUNBO1FBQ0ksa0JBQWtCO1FBQ2xCLFdBQVc7UUFDWCxhQUFhO1FBQ2IseUJBQXlCO0lBQzdCO0FBQ0o7O0FBRUE7SUFDSTtRQUNJLFNBQVM7UUFDVCxTQUFTO1FBQ1QsVUFBVTtRQUNWLFdBQVc7UUFDWCxnQkFBZ0I7UUFDaEIsbUJBQW1CO1FBQ25CLGtCQUFrQjtRQUNsQixRQUFRO1FBQ1Isa0JBQWtCO0lBQ3RCO0lBQ0E7UUFDSSwrQkFBK0I7SUFDbkM7QUFDSjs7QUFFQTtJQUNJLE1BQU07SUFDTixTQUFTO0lBQ1Qsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYiwyQkFBMkI7QUFDL0I7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsTUFBTTtJQUNOLFNBQVM7SUFDVCxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixNQUFNO0lBQ04sU0FBUztJQUNULFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLE1BQU07SUFDTixTQUFTO0lBQ1QsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLGFBQWE7SUFDYixVQUFVO0lBQ1YsT0FBTztJQUNQLFFBQVE7SUFDUixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsZUFBZTtJQUNmLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsU0FBUztJQUNULGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsVUFBVTtBQUNkOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFFBQVE7SUFDUixjQUFjO0lBQ2QsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLHNCQUFzQjtBQUMxQjs7QUFFQTtJQUNJLDBCQUEwQjtJQUMxQiwyQkFBMkI7QUFDL0I7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLGFBQWE7SUFDYix5QkFBeUI7QUFDN0I7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFlBQVk7SUFDWix5QkFBeUI7QUFDN0IiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvaGVhZGVyL2hlYWRlci5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiYm9keSB7XHJcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XHJcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgY29sb3I6ICM3MTc0OGQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO1xyXG4gICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XHJcbiAgICBmb250LWZhbWlseTogJ09wZW4gU2FucycsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcclxufVxyXG5cclxuLnVzZXItaW1hZ2UsXHJcbi51c2VyLWltYWdlIGltZyB7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICB3aWR0aDogNDBweDtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcblxyXG4vKiAjMDA2Q0I3XHJcbiMwMDZDQjcgKi9cclxuXHJcbi5iZy12bnB0LFxyXG4uYmctdm5wdCAuZHJvcGRvd24tbWVudSB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3ICFpbXBvcnRhbnQ7XHJcbiAgICBjb2xvcjogI0ZGRkZGRjtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xyXG59XHJcblxyXG4uYmctdm5wdCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgbWF4LXdpZHRoOiAxMTQwcHg7XHJcbiAgICBwYWRkaW5nOiAwcHg7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbiAgICAvKiBoZWlnaHQ6IDQycHg7ICovXHJcbn1cclxuXHJcbi5iZy12bnB0IC5uYXZiYXItbmF2IC5hY3RpdmU+Lm5hdi1saW5rLFxyXG4uYmctdm5wdCAubmF2YmFyLW5hdiAubmF2LWxpbmsuYWN0aXZlLFxyXG4uYmctdm5wdCAubmF2YmFyLW5hdiAubmF2LWxpbmsuc2hvdyxcclxuLmJnLXZucHQgLm5hdmJhci1uYXYgLnNob3c+Lm5hdi1saW5rLFxyXG4uYmctdm5wdCBhLFxyXG4uYmctdm5wdCAubi1iIHtcclxuICAgIGNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7XHJcbiAgICAvKiBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50OyAqL1xyXG59XHJcblxyXG4uYmctdm5wdCAubi1iOmhvdmVyLFxyXG4uYmctdm5wdCAuZHJvcGRvd24taXRlbTpmb2N1cyxcclxuLmJnLXZucHQgLmRyb3Bkb3duLWl0ZW06aG92ZXIge1xyXG4gICAgY29sb3I6ICNGRkZGRkYgIWltcG9ydGFudDtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxuICAgIC8qIGZvbnQtd2VpZ2h0OiBib2xkOyAqL1xyXG59XHJcblxyXG4uYmctdm5wdCAuZHJvcGRvd24tbWVudSB7XHJcbiAgICBsZWZ0OiAwcHg7XHJcbiAgICB0b3A6IGF1dG87XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgLyogY29sb3I6ICMwMDAwMDA7ICovXHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIG1pbi13aWR0aDogMjUwcHg7XHJcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG59XHJcblxyXG4uYmctdm5wdCAubi1iIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XHJcbiAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgIzgwODA4MDM4O1xyXG4gICAgcGFkZGluZzogOHB4IDIwcHg7XHJcbiAgICBtaW4td2lkdGg6IG1heC1jb250ZW50O1xyXG4gICAgbWFyZ2luLXRvcDogLTFweDtcclxuICAgIC8qIG1pbi13aWR0aDogNDAwcHg7ICovXHJcbn1cclxuXHJcbi5iZy12bnB0IC5uYXZiYXItdG9nZ2xlciB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjRkZGRkZGO1xyXG4gICAgY29sb3I6ICNGRkZGRkY7XHJcbiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0O1xyXG59XHJcblxyXG4udG9nZ2xlLXVzZXIga2VuZG8tcG9wdXAge1xyXG4gICAgbGVmdDogYXV0byAhaW1wb3J0YW50O1xyXG4gICAgcmlnaHQ6IDEwcHg7XHJcbiAgICB0b3A6IDQ4cHg7XHJcbiAgICB3aWR0aDogMzIwcHg7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICBib3gtc2hhZG93OiAwIDJweCAxMHB4IHJnYmEoMCwgMCwgMCwgLjIpO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYztcclxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAuMik7XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAudG9wIHtcclxuICAgIG1hcmdpbjogMjBweDtcclxuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciAuay1wb3B1cCB7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAudG9wIC51c2VyLWltYWdlLWxhcmdlLFxyXG4udG9nZ2xlLXVzZXIga2VuZG8tcG9wdXAgLnRvcCAuaW5mbyB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xyXG59XHJcblxyXG4udG9nZ2xlLXVzZXIga2VuZG8tcG9wdXAgLnRvcCAudXNlci1pbWFnZS1sYXJnZSB7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICB3aWR0aDogOTBweDtcclxuICAgIGhlaWdodDogOTBweDtcclxuICAgIG1hcmdpbi1yaWdodDogMjBweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAudG9wIC51c2VyLWltYWdlLWxhcmdlIGltZyB7XHJcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICB3aWR0aDogOTBweDtcclxuICAgIGhlaWdodDogOTBweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAudG9wIC5lbXBsb3llZS1uYW1lIHtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgbWFyZ2luOiAtNHB4IDAgMXB4IDA7XHJcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAudG9wIC5yb2xlLW5hbWUge1xyXG4gICAgY29sb3I6ICM2NjY7XHJcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAuYm90dG9tIHtcclxuICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2NjYztcclxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAuMik7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGRpc3BsYXk6IHRhYmxlO1xyXG59XHJcblxyXG4udG9nZ2xlLXVzZXIga2VuZG8tcG9wdXAgLmJvdHRvbT5kaXYge1xyXG4gICAgZGlzcGxheTogdGFibGUtY2VsbDtcclxufVxyXG5cclxuLnRvZ2dsZS11c2VyIGtlbmRvLXBvcHVwIC5ib3R0b20gLmstYnV0dG9uIHtcclxuICAgIG1hcmdpbjogMCAyMHB4O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIGJhY2tncm91bmQ6ICNmOGY4Zjg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYzZjNmM2O1xyXG4gICAgY29sb3I6ICM2NjY7XHJcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbn1cclxuXHJcbi50b2dnbGUtdXNlciBrZW5kby1wb3B1cCAuYm90dG9tIC5jaGFuZ2UtcGFzcyB7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG59XHJcblxyXG4udG9nZ2xlLXVzZXIga2VuZG8tcG9wdXAgLmJvdHRvbSAubG9nLW91dCB7XHJcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcclxufVxyXG5cclxuLm5hdi1pdGVtLWJ1dHRvbiB7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcclxufVxyXG5cclxuLmJ0bi1uYXYge1xyXG4gICAgaGVpZ2h0OiA0MHB4O1xyXG4gICAgYmFja2dyb3VuZDogaW5oZXJpdDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNGRkZGRkY7XHJcbiAgICBjb2xvcjogI0ZGRkZGRjtcclxufVxyXG5cclxuLm5hdmJhci1icmFuZCB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLnNlYXJjaGRpdiB7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbn1cclxuXHJcbi54c2VhcmNoZGl2IHtcclxuICAgIG1hcmdpbi1yaWdodDogNTBweDtcclxuICAgIG1hcmdpbi10b3A6IDE0cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLnhzZWFyY2hidG4ge1xyXG4gICAgYm9yZGVyLXRvcDogMDtcclxuICAgIG1hcmdpbi1sZWZ0OiA1cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcclxuICAgIGhlaWdodDogMzhweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uaGVhZGVyLWJsb2NrIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIG1hcmdpbi10b3A6IC0xMHB4O1xyXG59XHJcblxyXG4ubG9nby1ibG9jayB7XHJcbiAgICB0ZXh0LWFsaWduOiB1bnNldDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIG1heC13aWR0aDogMTE0MHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0YyRjJGMjtcclxufVxyXG5cclxuXHJcbi8qIC5sb2dvLWJsb2NrIC5pdGVtLWltZ3tcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICB3aWR0aDogMTM1cHg7XHJcbiAgICBoZWlnaHQ6IDEyMHB4O1xyXG59ICAqL1xyXG5cclxuLmxvZ28tYmxvY2sgLml0ZW0taW1nIHtcclxuICAgIC8qIHRleHQtYWxpZ246IGxlZnQ7ICovXHJcbiAgICB3aWR0aDogMTAwcHg7XHJcbiAgICBoZWlnaHQ6IDEwMHB4O1xyXG4gICAgLyogcGFkZGluZy10b3A6IDEwcHg7ICovXHJcbn1cclxuXHJcbi5sb2dvLWJsb2NrIC5pdGVtLWltZy0xIHtcclxuICAgIHdpZHRoOiAxMjBweDtcclxuICAgIGhlaWdodDogMTIwcHg7XHJcbn1cclxuXHJcblxyXG4vKiAuY29sdW1uIC5iYW5uZXItYmxvY2t7XHJcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcclxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIHdpZHRoOiA0ODZweDtcclxuICAgIGhlaWdodDogMTI0cHg7XHJcbiAgICBtYXgtaGVpZ2h0OiAxMjRweDtcclxufSAqL1xyXG5cclxuLm1lbnUtYmxvY2sge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgY29sb3I6ICNGRkZGRkYgIWltcG9ydGFudDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgcG9zaXRpb246IHN0aWNreTtcclxuICAgIGhlaWdodDogNDJweDtcclxufVxyXG5cclxuLml0ZW0tbWVudSB7XHJcbiAgICBwYWRkaW5nLXJpZ2h0OiA1MHB4O1xyXG59XHJcblxyXG4uaXRlbS1tZW51LUxhc3Qge1xyXG4gICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5pdGVtLW1lbnU6aG92ZXI+LmRyb3Bkb3duLW1lbnUge1xyXG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmRyb3Bkb3duLWl0ZW06aG92ZXI+Lm1lbnUtY2hpbGQge1xyXG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcclxufVxyXG5cclxuLml0ZW0tbWVudTpob3Zlcj4uZHJvcGRvd24tdG9nZ2xlOjphZnRlciB7XHJcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbn1cclxuXHJcbi5tZW51LWhvdmVyIHtcclxuICAgIHBhZGRpbmctbGVmdDogMjJweCAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZy1yaWdodDogMjJweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ubWVudS1ob3Zlcjpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA1OTk1ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5zZWFyY2gtbWVudSB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICByaWdodDogNzBweDtcclxufVxyXG5cclxuLnNlYXJjaC1ibG9jayB7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gICAgd2lkdGg6IDIwMHB4O1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgZm9udC1zaXplOiAxNnB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5zZWFyY2gtYmxvY2stdHh0PmlucHV0IHtcclxuICAgIHdpZHRoOiAxNjhweDtcclxuICAgIGhlaWdodDogMzVweDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4uc2VhcmNoLWJsb2NrLWJ0biB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB0b3A6IDBweDtcclxuICAgIGxlZnQ6IDE2NXB4O1xyXG59XHJcblxyXG4uc2VhcmNoLWJsb2NrLWJ0bj5idXR0b24ge1xyXG4gICAgd2lkdGg6IDM1cHg7XHJcbiAgICBoZWlnaHQ6IDM1cHg7XHJcbn1cclxuXHJcbi5iZy12bnB0IC5tZW51LWNoaWxkIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIGxlZnQ6IDEwMCU7XHJcbiAgICB0b3A6IC0xcHg7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIGJhY2tncm91bmQ6ICNGRkZGRkY7XHJcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLm1lbnUtbGV2ZWwge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcclxufVxyXG5cclxuLm1lbnUtbGV2ZWwtY2hpbGQge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI2M2YzZjNjtcclxuICAgIHBhZGRpbmc6IDhweCAyMHB4O1xyXG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcclxuICAgIG1pbi13aWR0aDogbWF4LWNvbnRlbnQ7XHJcbiAgICBtYXJnaW4tdG9wOiAtMXB4O1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbi5tZW51LWxldmVsLWNoaWxkOmhvdmVyIHtcclxuICAgIGNvbG9yOiAjRkZGRkZGO1xyXG4gICAgYmFja2dyb3VuZDogIzAwNkNCNztcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4ubGlzdC1tZW51LWN1cyB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLmljb24tY2hpbGQtbWVudSB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICByaWdodDogMCU7XHJcbiAgICB0b3A6IDEycHg7XHJcbn1cclxuXHJcbi5sb2FkaW5nIHtcclxuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmxvZ28tYmxvY2s6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4uZHJvcGRvd24tbWVudSBhIHtcclxuICAgIGZvbnQtZmFtaWx5OiAnb3BlbiBzYW5zJyBzYW5zLXNlcmlmO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgLyogbWFyZ2luLWxlZnQ6IC0xM3B4OyAqL1xyXG59XHJcblxyXG4uaGVhZGVyLXRleHQge1xyXG4gICAgZm9udDogUm9ib3RvO1xyXG4gICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuLmhlYWRlci10ZXh0LTIge1xyXG4gICAgZm9udDogUm9ib3RvO1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgY29sb3I6ICMwMDU5OTU7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmhlYWRlci10ZXh0LTMge1xyXG4gICAgZm9udDogUm9ib3RvO1xyXG4gICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgY29sb3I6ICM5NTAwMDA7XHJcbn1cclxuXHJcbi5jb2x1bW4ge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICB3aWR0aDogNTAlO1xyXG59XHJcblxyXG4uYmFubmVyX2Jsb2NrIHtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEyNHB4O1xyXG59XHJcblxyXG5cclxuLyogLnRpdGxlIHtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5O1xyXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgICB3aWR0aDogNTUlO1xyXG4gICAgLyogd2lkdGg6IGNhbGMoMTAwJSAtIDEzNXB4KTtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICByaWdodDogMDtcclxuICAgIG1hcmdpbjogYXV0bztcclxufSAqL1xyXG5cclxubGkgYSBbYXJpYS1leHBhbmRlZD1cInRydWVcIl0ge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNTk5NSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uZHJvcGRvd24tdG9nZ2xlOjphZnRlciB7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcclxuICAgIG1hcmdpbi1sZWZ0OiAuMjU1ZW07XHJcbiAgICBjb250ZW50OiBcIlwiO1xyXG4gICAgYm9yZGVyLXRvcDogLjNlbSBzb2xpZDtcclxuICAgIGJvcmRlci1yaWdodDogLjNlbSBzb2xpZCB0cmFuc3BhcmVudDtcclxuICAgIGJvcmRlci1ib3R0b206IDA7XHJcbiAgICBib3JkZXItbGVmdDogLjNlbSBzb2xpZCB0cmFuc3BhcmVudDtcclxuICAgIHdpZHRoOiAxMHB4O1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG59XHJcblxyXG4ucm93LW1hcmdpbiB7XHJcbiAgICBtYXJnaW4tdG9wOiAwcHggIWltcG9ydGFudDtcclxuICAgIC8qIG1pbi1oZWlnaHQ6IDEyOHB4OyAqL1xyXG59XHJcblxyXG4uYWN0aXZlIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM2NjY7XHJcbn1cclxuXHJcbi5pbWctaGVhZGVyIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG59XHJcblxyXG4ubGFuZy1kaXYge1xyXG4gICAgbWFyZ2luLXRvcDogM3B4O1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XHJcbn1cclxuXHJcbi5jaG9zZW4tbGFuZyB7XHJcbiAgICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcclxuICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxKSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6OTkycHgpIHtcclxuICAgIC5sYW5nLWRpdiB7XHJcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAwcHggIWltcG9ydGFudDtcclxuICAgIH1cclxufVxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjEwMzBweCkge1xyXG4gICAgLyogLmxvZ28tYmxvY2sgLml0ZW0taW1nIHtcclxuICAgICAgICB3aWR0aDogNjVweDtcclxuICAgICAgICBoZWlnaHQ6IDY1cHg7XHJcbiAgICB9ICovXHJcbiAgICAuaGVhZGVyLXRleHQsXHJcbiAgICAuaGVhZGVyLXRleHQtMyB7XHJcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgfVxyXG4gICAgLmhlYWRlci10ZXh0LTIge1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIH1cclxufVxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjkxMHB4KSB7XHJcbiAgICAubG9nby1ibG9jayAuaXRlbS1pbWcge1xyXG4gICAgICAgIHdpZHRoOiA4MHB4O1xyXG4gICAgICAgIGhlaWdodDogODBweDtcclxuICAgIH1cclxuICAgIC5oZWFkZXItdGV4dCxcclxuICAgIC5oZWFkZXItdGV4dC0zIHtcclxuICAgICAgICBmb250LXNpemU6IDEwcHg7XHJcbiAgICB9XHJcbiAgICAuaGVhZGVyLXRleHQtMiB7XHJcbiAgICAgICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgfVxyXG4gICAgLmxvZ28tYmxvY2sgLml0ZW0taW1nLTEge1xyXG4gICAgICAgIHdpZHRoOiA4MHB4O1xyXG4gICAgICAgIGhlaWdodDogODBweDtcclxuICAgIH1cclxufVxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2OHB4KSB7XHJcbiAgICAubG9nby1ibG9jayAuaXRlbS1pbWcge1xyXG4gICAgICAgIHdpZHRoOiA4MHB4O1xyXG4gICAgICAgIGhlaWdodDogODBweDtcclxuICAgIH1cclxuICAgIC5oZWFkZXItdGV4dCxcclxuICAgIC5oZWFkZXItdGV4dC0zIHtcclxuICAgICAgICBmb250LXNpemU6IDEwcHg7XHJcbiAgICB9XHJcbiAgICAuaGVhZGVyLXRleHQtMiB7XHJcbiAgICAgICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgfVxyXG4gICAgLmxvZ28tYmxvY2sgLml0ZW0taW1nLTEge1xyXG4gICAgICAgIHdpZHRoOiA4MHB4O1xyXG4gICAgICAgIGhlaWdodDogODBweDtcclxuICAgIH1cclxuICAgIC5tZW51LWNoaWxkIHtcclxuICAgICAgICBwb3NpdGlvbjogaW5oZXJpdDtcclxuICAgICAgICB3aWR0aDogaW5oZXJpdDtcclxuICAgICAgICBsZWZ0OiAwcHg7XHJcbiAgICB9XHJcbn1cclxuXHJcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo0OTZweCkge1xyXG4gICAgLmxvZ28tYmxvY2sgLml0ZW0taW1nIHtcclxuICAgICAgICB3aWR0aDogNjVweDtcclxuICAgICAgICBoZWlnaHQ6IDY1cHg7XHJcbiAgICB9XHJcbiAgICAuaGVhZGVyLXRleHQsXHJcbiAgICAuaGVhZGVyLXRleHQtMyB7XHJcbiAgICAgICAgZm9udC1zaXplOiA4cHg7XHJcbiAgICB9XHJcbiAgICAuaGVhZGVyLXRleHQtMiB7XHJcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xyXG4gICAgfVxyXG4gICAgLmxvZ28tYmxvY2sgLml0ZW0taW1nLTEge1xyXG4gICAgICAgIHdpZHRoOiA2NXB4O1xyXG4gICAgICAgIGhlaWdodDogNjVweDtcclxuICAgIH1cclxufVxyXG5cclxuQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTFweCkge1xyXG4gICAgLyo2MDBweCovXHJcbiAgICAuYmctdm5wdCB7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgLyogcGFkZGluZzogOHB4IDEycHg7ICovXHJcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA4cHg7XHJcbiAgICB9XHJcbiAgICAuYmctdm5wdCAubi1iIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xyXG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7XHJcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzgwODA4MDM4O1xyXG4gICAgICAgIHBhZGRpbmc6IDhweCAyMHB4O1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIG1pbi13aWR0aDogMTAwJTtcclxuICAgIH1cclxuICAgIC5pdGVtLW1lbnUge1xyXG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDBweDtcclxuICAgIH1cclxuICAgIC5tZW51LWJsb2NrIHtcclxuICAgICAgICAvKiBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7ICovXHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgLyogYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNzsgKi9cclxuICAgICAgICAvKiBmb250LXNpemU6IDE1cHg7ICovXHJcbiAgICAgICAgLyogY29sb3I6ICNGRkZGRkYgIWltcG9ydGFudDsgKi9cclxuICAgICAgICAvKiBmb250LXdlaWdodDogYm9sZDsgKi9cclxuICAgICAgICBwYWRkaW5nOiA2cHggMHB4O1xyXG4gICAgfVxyXG4gICAgLmxvZ28tYmxvY2sge1xyXG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGMkYyRjI7XHJcbiAgICB9XHJcbiAgICAubG9nby1ibG9jaz5pbWcge1xyXG4gICAgICAgIHdpZHRoOiA1MCU7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgfVxyXG4gICAgLnNlYXJjaC1tZW51IHtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgbGVmdDogYXV0bztcclxuICAgICAgICByaWdodDogODBweDtcclxuICAgICAgICB0b3A6IDNweDtcclxuICAgIH1cclxuICAgIC5tZW51LWNoaWxkIHtcclxuICAgICAgICAvKiBwb3NpdGlvbjogaW5oZXJpdDtcclxuICAgICAgICBsZWZ0OiAwcHg7ICovXHJcbiAgICAgICAgcG9zaXRpb246IGluaGVyaXQgIWltcG9ydGFudDtcclxuICAgICAgICB3aWR0aDogaW5oZXJpdCAhaW1wb3J0YW50O1xyXG4gICAgICAgIGxlZnQ6IDBweCAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG4gICAgLm1lbnUtbGV2ZWwtY2hpbGQge1xyXG4gICAgICAgIC8qIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGJvcmRlcjogMHB4IHNvbGlkICNjNmM2YzY7ICovXHJcbiAgICAgICAgYm9yZGVyOiAwIHNvbGlkICNjNmM2YzY7XHJcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbCFpbXBvcnRhbnQ7XHJcbiAgICAgICAgd2lkdGg6IGluaGVyaXQ7XHJcbiAgICAgICAgbWluLXdpZHRoOiAxMDAlO1xyXG4gICAgICAgIHBhZGRpbmc6IDhweCAwIDhweCAyMHB4O1xyXG4gICAgfVxyXG4gICAgLmxpc3QtbWVudS1jdXMge1xyXG4gICAgICAgIHdpZHRoOiA5MCU7XHJcbiAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcclxuICAgIH1cclxuICAgIC5jb2x1bW4ge1xyXG4gICAgICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgICAgIHdpZHRoOiA1MCU7XHJcbiAgICB9XHJcbiAgICAuaWNvbi1jaGlsZC1tZW51IHtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgcmlnaHQ6IDElO1xyXG4gICAgICAgIHRvcDogMTFweDtcclxuICAgIH1cclxuICAgIC5iYW5uZXItZ2VuZXJhbHtcclxuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgaGVpZ2h0OiAxNzZweDtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xyXG4gICAgfVxyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6OTkxcHgpIHtcclxuICAgIC5iZy12bnB0IC5kcm9wZG93bi1tZW51IHtcclxuICAgICAgICBsZWZ0OiAwcHg7XHJcbiAgICAgICAgdG9wOiA0NHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgICAgY29sb3I6IG5hdnk7XHJcbiAgICAgICAgbWluLXdpZHRoOiAyNTBweDtcclxuICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICByaWdodDogMDtcclxuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICB9XHJcbiAgICAuaXRlbS1tZW51IHtcclxuICAgICAgICBwYWRkaW5nLXJpZ2h0OiB1bnNldCAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG59XHJcblxyXG4udG9wLWxlZnQge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgLyogbWFyZ2luOiBhdXRvOyAqL1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDAgIWltcG9ydGFudDtcclxufVxyXG5cclxuLnRvcC1sZWZ0PmRpdjpudGgtY2hpbGQoMSkge1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBib3R0b206IDA7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbn1cclxuXHJcbi50b3AtbGVmdD5kaXY6bnRoLWNoaWxkKDIpIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbn1cclxuXHJcbi50b3AtbGVmdD5kaXY6bnRoLWNoaWxkKDMpIHtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICAgIHRvcDogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIG1hcmdpbjogYXV0bztcclxufVxyXG5cclxuLm1lbnUtbmFtZSB7XHJcbiAgICBwb3NpdGlvbjogaW5oZXJpdDtcclxuICAgIHBhZGRpbmctdG9wOiAycHg7XHJcbn1cclxuXHJcbi5sYW5ndWFnZS1jaGFuZ2VyIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgd2lkdGg6IDExNDBweDtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBtYXJnaW46IGF1dG87XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4uaGVhZGVyLWRhdGUge1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIG1hcmdpbi1sZWZ0OiAyJTtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIGNvbG9yOiAjOTM5MzkzO1xyXG59XHJcblxyXG4ubWF0LWVsZXZhdGlvbi16NSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBoZWlnaHQ6IDA7XHJcbiAgICBkaXNwbGF5OiBjb250ZW50cztcclxuICAgIHBhZGRpbmc6IDBweCAhaW1wb3J0YW50O1xyXG4gICAgZm9udDogbWVudTtcclxufVxyXG5cclxuLnN0aWNreSB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDBweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG59XHJcblxyXG4uc2VhcmNoLWJsb2NrLXR4dCAuay1jb21ib2JveHsgICAgXHJcbiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnNlYXJjaC1ibG9jay10eHQgaW5wdXR7XHJcbiAgICBmb250LXNpemU6IDE1cHggIWltcG9ydGFudDtcclxuICAgIGZvbnQtd2VpZ2h0OiA0MDAgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmJhbm5lci1nZW5lcmFse1xyXG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDE0MHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTtcclxufVxyXG5cclxuLm1lbnUtdGVtcC1zdHlsZXtcclxuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiA0MnB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTtcclxufSJdfQ== */\"","module.exports = \"\"","import { Component, OnInit, Output, Input, EventEmitter, OnDestroy, HostListener } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { AuthenticationService } from '../../services/authentication.service';\r\nimport { AppService } from '../../services/app.service';\r\nimport { AppComponent } from '../../app.component';\r\nimport { AppSwal } from '../../services/app.swal';\r\nimport { ResourceLoader } from '@angular/compiler';\r\n\r\n@Component({\r\n selector: 'app-header',\r\n templateUrl: './header.component.html',\r\n styleUrls: ['./header.component.css']\r\n})\r\nexport class HeaderComponent implements OnInit {\r\n @Output() searchChange = new EventEmitter();\r\n @Output() reloadPosts = new EventEmitter();\r\n @Input() isSticky = false;\r\n user: any;\r\n showToggleUser = false;\r\n uploadImageOpened = false;\r\n menus: any;\r\n check: number;\r\n searchOption = {\r\n searchString: ''\r\n };\r\n acrive = true;\r\n selectedID: '';\r\n searchTxt: '';\r\n\r\n isCollapsed = false;\r\n isDropDown = false;\r\n\r\n languageName = '';\r\n\r\n currentDate = new Date();\r\n\r\n BaneerImg: any;\r\n BannerMedalPhoto: any;\r\n BannerLogoPhoto: any;\r\n BannerRightPhoto: any;\r\n\r\n references: Array<{ Name: string, Content: string, NumPost: number }>;\r\n referenceFilter: Array<{ Name: string, Content: string, NumPost: number }>;\r\n\r\n ngOnInit(): void {\r\n this.check = 0;\r\n }\r\n\r\n constructor(\r\n private router: Router,\r\n private authenticationService: AuthenticationService,\r\n private appService: AppService,\r\n private appComponent: AppComponent,\r\n private appSwal: AppSwal,\r\n private activatedRoute: ActivatedRoute,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.activatedRoute.url.subscribe(activeUrl =>{\r\n if (activeUrl && activeUrl.length > 0){\r\n if (activeUrl[1].path == 'post-result'){\r\n this.activatedRoute.queryParams.subscribe((params: any) => {\r\n if (params) { \r\n this.searchTxt = params.searchparam;\r\n } \r\n });\r\n }\r\n } \r\n });\r\n \r\n this.getMenu();\r\n // this.getReference();\r\n this.getLanguageName();\r\n // this.getBannerImg();\r\n }\r\n\r\n async getMenu() {\r\n\r\n const result = await this.appService.doGET('api/Menu/GetMenu', null);\r\n if (result && result.Status === 1 && result.Data) {\r\n this.menus = result.Data.Pages;\r\n if (result.Data.References){\r\n this.references = result.Data.References.filter(r => r.NumPost > 0);;\r\n for (let i = 0; i < this.references.length; i ++){\r\n this.references[i].Content = this.references[i].Name +\"(\"+ this.references[i].NumPost + \")\";\r\n }\r\n this.referenceFilter = this.references.slice();\r\n if (result.Data.BannerImage){\r\n for(let i = 0; i < result.Data.BannerImage.length; i ++){\r\n if(result.Data.BannerImage[i].Item){\r\n switch (result.Data.BannerImage[i].Item.BannerType) {\r\n case 5:\r\n this.BannerMedalPhoto = this.appService.apiRoot + result.Data.BannerImage[i].Item.FileUrl;\r\n break;\r\n case 6: \r\n this.BannerLogoPhoto = this.appService.apiRoot + result.Data.BannerImage[i].Item.FileUrl;\r\n break;\r\n case 7: \r\n this.BannerRightPhoto = this.appService.apiRoot + result.Data.BannerImage[i].Item.FileUrl;\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n \r\n } \r\n } else {\r\n this.appSwal.showError(result.Msg);\r\n }\r\n }\r\n\r\n onChangePasswordPage($event) {\r\n this.router.navigate(['change-password']);\r\n }\r\n\r\n onToggleUser() {\r\n this.showToggleUser = !this.showToggleUser;\r\n }\r\n\r\n onLogOut() {\r\n this.authenticationService.doSignout();\r\n this.router.navigate(['portal']);\r\n window.location.reload();\r\n }\r\n\r\n onClickMenu(menu, level) {\r\n // if((typeof(childrens) != \"undefined\") && childrens != null && childrens.length > 0) {\r\n // this.selectedID = pageUrl;\r\n // } else {\r\n // this.router.navigate([pageUrl]);\r\n // }\r\n this.acrive = true;\r\n let drop = document.getElementsByClassName('dropdown-menu') as HTMLCollectionOf;\r\n var flag = false;\r\n // if ((menu.Childrens && menu.Childrens.length > 0)) {\r\n // return;\r\n // }\r\n if (menu.PageID) {\r\n if (menu.PageID.indexOf('http') >= 0) {\r\n window.open(menu.PageID, '_blank');\r\n } else {\r\n if (menu.ID == '3c8ecfb0-76ba-4629-a022-89777d156935') {\r\n window.location.href = '';\r\n } else {\r\n this.changeMenu();\r\n if (drop.length != 0) {\r\n for (let i = 0; i < drop.length; i++) {\r\n drop[i].style.visibility = \"hidden\";\r\n }\r\n flag = true;\r\n }\r\n try {\r\n this.router.navigate([menu.PageID], { queryParams: { title: menu.UrlPath } });\r\n if (menu.PageID.indexOf('portal/post-list')) {\r\n this.reloadPosts.emit(menu.UrlPath);\r\n }\r\n } catch{\r\n this.router.navigate([menu.PageID], { queryParams: { title: menu.UrlPath } });\r\n }\r\n }\r\n }\r\n }\r\n // if(flag == true){\r\n // for(let i = 0; i < drop.length ; i++){\r\n // drop[i].style.visibility = \"visibility\";\r\n // }\r\n // flag = true;\r\n // }\r\n this.acrive = false;\r\n this.getMenu();\r\n }\r\n\r\n onMouseOver(ID, childrens) {\r\n if ((typeof (childrens) != \"undefined\") && childrens != null && childrens.length > 0) {\r\n this.selectedID = ID;\r\n } else {\r\n this.selectedID = \"\";\r\n }\r\n }\r\n\r\n onUploadImageClose(status) {\r\n this.uploadImageOpened = false;\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n }\r\n\r\n onUploadImage() {\r\n this.showToggleUser = false;\r\n this.uploadImageOpened = true;\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n onSearch() {\r\n const searchString = this.searchTxt;\r\n this.router.navigate(['portal/post-result'], { queryParams: { searchparam: searchString } });\r\n this.emitSearchChange(searchString);\r\n }\r\n\r\n emitSearchChange(searchString) {\r\n this.searchChange.emit(searchString);\r\n }\r\n\r\n async changeMenu() {\r\n this.isCollapsed = !this.isCollapsed;\r\n var k = 0;\r\n }\r\n\r\n onGoHome() {\r\n {\r\n this.router.navigate(['portal']);\r\n // window.location.href = '';\r\n }\r\n }\r\n\r\n\r\n async changeLanguage(languageID) {\r\n if (this.languageName != languageID) {\r\n this.languageName = languageID;\r\n localStorage.setItem('currentLanguage', `${languageID}`);\r\n window.location.reload();\r\n }\r\n }\r\n\r\n getLanguageName() {\r\n let lang = localStorage.getItem('currentLanguage');\r\n if (lang == null || lang == undefined) {\r\n lang = \"vi-VN\";\r\n }\r\n this.languageName = lang;\r\n }\r\n\r\n getDayInWeek() {\r\n var day_name = '';\r\n switch (this.currentDate.getDay()) {\r\n case 0:\r\n day_name = \"Chủ nhật\";\r\n break;\r\n case 1:\r\n day_name = \"Thứ hai\";\r\n break;\r\n case 2:\r\n day_name = \"Thứ ba\";\r\n break;\r\n case 3:\r\n day_name = \"Thứ tư\";\r\n break;\r\n case 4:\r\n day_name = \"Thứ năm\";\r\n break;\r\n case 5:\r\n day_name = \"Thứ sáu\";\r\n break;\r\n case 6:\r\n day_name = \"Thứ bảy\";\r\n }\r\n return day_name\r\n }\r\n\r\n // async getBannerImg() {\r\n // const resultImage = await this.appService.doGET('api/File/GetBannerImg', null);\r\n // if (resultImage && resultImage.Status === 1) {\r\n // for(let i = 0; i < resultImage.Data.length; i ++){\r\n // if(resultImage.Data[i].Item){\r\n // switch (resultImage.Data[i].Item.BannerType) {\r\n // case 5:\r\n // this.BannerMedalPhoto = this.appService.apiRoot + resultImage.Data[i].Item.FileUrl;\r\n // break;\r\n // case 6: \r\n // this.BannerLogoPhoto = this.appService.apiRoot + resultImage.Data[i].Item.FileUrl;\r\n // break;\r\n // case 7: \r\n // this.BannerRightPhoto = this.appService.apiRoot + resultImage.Data[i].Item.FileUrl;\r\n // break;\r\n // default:\r\n // break;\r\n // }\r\n // }\r\n // } \r\n // }\r\n // }\r\n\r\n referenceHandleFilter(value) {\r\n this.referenceFilter = this.references.filter((s) => s.Content.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n // async getReference() {\r\n // const result = await this.appService.doGET('api/Type/GetReference', null);\r\n // if (result && result.Data) {\r\n // this.references = result.Data.filter(r => r.NumPost > 0);;\r\n // for (let i = 0; i < this.references.length; i ++){\r\n // this.references[i].Content = this.references[i].Name +\"(\"+ this.references[i].NumPost + \")\";\r\n // }\r\n // this.referenceFilter = this.references.slice();\r\n // }\r\n // } \r\n}\r\n","module.exports = \".img-banner-top {\\r\\n width: 100%;\\r\\n height: 150px;\\r\\n padding-left: 10px;\\r\\n padding-right: 10px;\\r\\n}\\r\\n\\r\\n.img-logo {\\r\\n width: 100%;\\r\\n height: 377px;\\r\\n padding-left: 0px !important;\\r\\n padding-right: 0px !important;\\r\\n /* object-fit: cover; */\\r\\n}\\r\\n\\r\\n.banner {\\r\\n width: 500px;\\r\\n height: 500px;\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.no-indicators {\\r\\n display: block;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.banner-title {\\r\\n /* max-height: 100px; */\\r\\n overflow: hidden;\\r\\n text-align: left;\\r\\n font-weight: 400;\\r\\n padding-bottom: 2px;\\r\\n /* color: #747474; */\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.banner-360 {\\r\\n width: 100%;\\r\\n height: 150px;\\r\\n}\\r\\n\\r\\n.banner-100p {\\r\\n width: 100%;\\r\\n height: 180px;\\r\\n}\\r\\n\\r\\n.group-body-item {\\r\\n padding-bottom: 20px;\\r\\n padding-top: 20px;\\r\\n height: 130px;\\r\\n max-width: 20%;\\r\\n float: left;\\r\\n padding: 10px 15px;\\r\\n}\\r\\n\\r\\n.group-body-item-none-bg {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n}\\r\\n\\r\\n.group-body-item:hover,\\r\\n.group-body-item-none-bg :hover {\\r\\n color: #006CB7;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.portal .group-body-2 {\\r\\n background-color: inherit;\\r\\n}\\r\\n\\r\\n.portal .group-body-2 {\\r\\n padding-top: 0px;\\r\\n}\\r\\n\\r\\nvideo::-webkit-media-controls-play-button {\\r\\n vertical-align: middle;\\r\\n}\\r\\n\\r\\n/* video::-webkit-media-controls-play-button, */\\r\\n\\r\\nvideo::-webkit-media-controls-rewind-button,\\r\\nvideo::-webkit-media-controls-fullscreen-button,\\r\\nvideo::-webkit-media-controls-timeline,\\r\\nvideo::-webkit-media-controls-timeline-container video::-webkit-media-controls-current-time-display,\\r\\nvideo::-webkit-media-controls-time-remaining-display,\\r\\nvideo::-webkit-media-controls-mute-button,\\r\\nvideo::-webkit-media-controls-toggle-closed-captions-button,\\r\\nvideo::-webkit-media-controls-volume-slider {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.k-tabstrip-items .k-state-default .k-link {\\r\\n text-transform: capitalize;\\r\\n}\\r\\n\\r\\n.progress {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.column {\\r\\n float: left;\\r\\n width: 20%;\\r\\n padding: 20px;\\r\\n height: 184px;\\r\\n}\\r\\n\\r\\n#bot-banner-img {\\r\\n width: 198px;\\r\\n height: 198px;\\r\\n text-align: -webkit-center;\\r\\n box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\\r\\n}\\r\\n\\r\\n.picsum-img-wrapper {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n#top-banner-img {\\r\\n width: 1140px;\\r\\n height: 180px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n#top-button-left {\\r\\n background-image: url(/assets/images/next.png);\\r\\n background-color: #006CB7;\\r\\n border-radius: 10%;\\r\\n opacity: 1;\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n margin-right: 135px;\\r\\n}\\r\\n\\r\\n#top-button-right {\\r\\n background-image: url(/assets/images/next.png);\\r\\n background-color: #006CB7;\\r\\n border-radius: 10%;\\r\\n opacity: 1;\\r\\n transform: rotate(180deg);\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n margin-left: 135px;\\r\\n}\\r\\n\\r\\n.carousel-indicators li {\\r\\n width: 11px;\\r\\n height: 11px;\\r\\n border-radius: 100%;\\r\\n margin-bottom: -32px;\\r\\n color: gray;\\r\\n}\\r\\n\\r\\n#bottom-button-left {\\r\\n background-image: url(/assets/images/previous-bot.png);\\r\\n background-color: #FFFFFF;\\r\\n border-radius: 10%;\\r\\n opacity: 1;\\r\\n width: 31px;\\r\\n height: 21px;\\r\\n margin-right: 135px;\\r\\n}\\r\\n\\r\\n#bottom-button-right {\\r\\n background-image: url(/assets/images/previous-bot.png);\\r\\n background-color: #FFFFFF;\\r\\n border-radius: 10%;\\r\\n opacity: 1;\\r\\n transform: rotate(180deg);\\r\\n width: 31px;\\r\\n height: 21px;\\r\\n margin-left: 135px;\\r\\n}\\r\\n\\r\\n:root {\\r\\n --crsl-bg: transparent;\\r\\n --box-bg: #1e272e;\\r\\n --box-shadow: #0000001c;\\r\\n --box-shadow-border: #0000000f;\\r\\n --box-border: #fff\\r\\n}\\r\\n\\r\\n.item-img-home {\\r\\n width: 192px;\\r\\n height: 115px;\\r\\n}\\r\\n\\r\\n.title-carousel-active {\\r\\n overflow: hidden;\\r\\n padding-top: 10px;\\r\\n text-align: left;\\r\\n font-weight: bold;\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n.image-propaganda {\\r\\n /* border: solid 0.5px navy; */\\r\\n width: 280px;\\r\\n height: 96px;\\r\\n padding-bottom: 1px;\\r\\n /* margin-top: 2px; */\\r\\n}\\r\\n\\r\\n.image-propaganda:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.unit-item {\\r\\n width: 217px;\\r\\n height: 222px;\\r\\n left: 0;\\r\\n right: 0;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.unit-item:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.img-banner-bottom {\\r\\n width: 100%;\\r\\n height: 159px;\\r\\n}\\r\\n\\r\\n.unit-item .img {\\r\\n width: 206px;\\r\\n height: 190px;\\r\\n margin: 16px 5px;\\r\\n box-shadow: 0px 2px 5px 2px #e7e9ec;\\r\\n}\\r\\n\\r\\n.ui-carousel-items-content {\\r\\n background: red;\\r\\n}\\r\\n\\r\\n/* post new css */\\r\\n\\r\\n.content {\\r\\n background: #f0f0f0;\\r\\n border-bottom: 1px solid #fff;\\r\\n padding: 5px;\\r\\n margin-top: 0px !important;\\r\\n}\\r\\n\\r\\n.box_content {\\r\\n margin-top: 0px !important;\\r\\n width: calc(100% - 638px);\\r\\n padding-left: 2px !important;\\r\\n padding-right: 2px !important;\\r\\n}\\r\\n\\r\\n.img-post {\\r\\n width: 80px;\\r\\n padding: 0px !important;\\r\\n height: 64.75px;\\r\\n}\\r\\n\\r\\n.img-post img {\\r\\n border: 0;\\r\\n font-size: 0;\\r\\n line-height: 0;\\r\\n max-width: 80px;\\r\\n vertical-align: middle;\\r\\n height: 64px;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.text-content-post {\\r\\n width: calc(100% - 80px);\\r\\n font-size: 12px;\\r\\n overflow: hidden;\\r\\n display: inline-block;\\r\\n text-overflow: ellipsis;\\r\\n margin: 0;\\r\\n height: 54px;\\r\\n vertical-align: top;\\r\\n padding: 0px !important;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.text-content-post a {\\r\\n color: navy;\\r\\n line-height: 18px;\\r\\n display: block;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.box_content :hover {\\r\\n background-color: #ffff;\\r\\n}\\r\\n\\r\\n.row :hover a {\\r\\n text-decoration: none;\\r\\n}\\r\\n\\r\\n.group-header-notify {\\r\\n padding-top: 4px;\\r\\n /* border-bottom: 2px solid #EB1924 !important; */\\r\\n padding-left: 0px;\\r\\n font-size: 15px;\\r\\n color: white;\\r\\n font-weight: 500;\\r\\n background-color: white;\\r\\n text-transform: capitalize;\\r\\n}\\r\\n\\r\\n.group-header-notify>span:first-child {\\r\\n background-color: #EB1924 !important;\\r\\n padding: 5px 10px 4px 10px\\r\\n}\\r\\n\\r\\n.margin-new-docx {\\r\\n margin-top: 0px !important;\\r\\n}\\r\\n\\r\\n.scrollbars {\\r\\n width: 280px;\\r\\n height: 160px;\\r\\n overflow-y: scroll;\\r\\n}\\r\\n\\r\\n.scrollbars::-webkit-scrollbar {\\r\\n width: 0px;\\r\\n}\\r\\n\\r\\n/* Track */\\r\\n\\r\\n.scrollbars::-webkit-scrollbar-track {\\r\\n background: #f1f1f1;\\r\\n}\\r\\n\\r\\n/* Handle */\\r\\n\\r\\n.scrollbars::-webkit-scrollbar-thumb {\\r\\n background: #888;\\r\\n}\\r\\n\\r\\n/* Handle on hover */\\r\\n\\r\\n.scrollbars::-webkit-scrollbar-thumb:hover {\\r\\n background: #555;\\r\\n}\\r\\n\\r\\n.ul-notify {\\r\\n background-color: #FBE1C6\\r\\n}\\r\\n\\r\\n.ul-notify ul {\\r\\n /* list-style-type: none;\\r\\n padding: 0px;\\r\\n margin: 0px;\\r\\n background-color: #FBE1C6;\\r\\n display: block;\\r\\n position: relative;\\r\\n animation: scroll 10s linear infinite; */\\r\\n padding: 0px;\\r\\n margin: 0px;\\r\\n width: -webkit-fit-content;\\r\\n width: -moz-fit-content;\\r\\n width: fit-content;\\r\\n display: block;\\r\\n position: relative;\\r\\n transform: translate3d(0, var(--move-initial), 0);\\r\\n}\\r\\n\\r\\n.ul-notify{\\r\\n position: relative;\\r\\n overflow: hidden;\\r\\n width: 280px; \\r\\n}\\r\\n\\r\\n.ul-notify ul li {\\r\\n list-style-type: none;\\r\\n padding: 10px;\\r\\n border-bottom: 1px dotted #bbb;\\r\\n /* animation: scroll 10s linear infinite; */\\r\\n}\\r\\n\\r\\n.ul-notify-scroll {\\r\\n background-color: #FBE1C6\\r\\n}\\r\\n\\r\\n.ul-notify-scroll ul {\\r\\n /* list-style-type: none;\\r\\n padding: 0px;\\r\\n margin: 0px;\\r\\n background-color: #FBE1C6;\\r\\n display: block;\\r\\n position: relative;\\r\\n animation: scroll 10s linear infinite; */\\r\\n padding: 0px;\\r\\n margin: 0px;\\r\\n width: -webkit-fit-content;\\r\\n width: -moz-fit-content;\\r\\n width: fit-content;\\r\\n display: block;\\r\\n position: relative;\\r\\n transform: translate3d(0, var(--move-initial), 0);\\r\\n -webkit-animation: marquee 30s linear infinite;\\r\\n animation: marquee 30s linear infinite;\\r\\n -webkit-animation-play-state: running;\\r\\n animation-play-state: running;\\r\\n}\\r\\n\\r\\n.ul-notify-scroll{\\r\\n position: relative;\\r\\n overflow: hidden;\\r\\n width: 280px;\\r\\n --move-initial: calc(-20% );\\r\\n --move-final: calc(-30% );\\r\\n}\\r\\n\\r\\n.ul-notify-scroll ul li {\\r\\n list-style-type: none;\\r\\n padding: 10px;\\r\\n border-bottom: 1px dotted #bbb;\\r\\n /* animation: scroll 10s linear infinite; */\\r\\n}\\r\\n\\r\\n.ul-notify-scroll ul:hover {\\r\\n -webkit-animation-play-state: paused;\\r\\n animation-play-state: paused\\r\\n}\\r\\n\\r\\n/* @keyframes scroll {\\r\\n 0% {\\r\\n top: 100%;\\r\\n }\\r\\n 100% {\\r\\n top: -150%;\\r\\n }\\r\\n} */\\r\\n\\r\\n@-webkit-keyframes marquee {\\r\\n 0% {\\r\\n transform: translate3d(0, var(--move-initial), 0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n transform: translate3d(0, var(--move-final), 0);\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes marquee {\\r\\n 0% {\\r\\n transform: translate3d(0, var(--move-initial), 0);\\r\\n }\\r\\n\\r\\n 100% {\\r\\n transform: translate3d(0, var(--move-final), 0);\\r\\n }\\r\\n}\\r\\n\\r\\n.text-content-notify {\\r\\n font-size: 13px;\\r\\n overflow: hidden;\\r\\n display: inline-block;\\r\\n text-overflow: ellipsis;\\r\\n margin: 0;\\r\\n height: 80px;\\r\\n vertical-align: top;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.text-content-notify a {\\r\\n color: navy;\\r\\n line-height: 17px;\\r\\n display: block;\\r\\n font-size: 13px;\\r\\n margin-left: 10px;\\r\\n}\\r\\n\\r\\n.icon-bookmark {\\r\\n position: absolute;\\r\\n color: #EB1924;\\r\\n left: 0;\\r\\n top: 10px;\\r\\n transform: rotate(270deg);\\r\\n margin-left: 1px;\\r\\n}\\r\\n\\r\\n.fa-bullhorn:before {\\r\\n margin-right: 5px !important;\\r\\n}\\r\\n\\r\\n.block-post-right {\\r\\n padding: 0px !important;\\r\\n}\\r\\n\\r\\n.sroll-views-style {\\r\\n padding: 0px !important;\\r\\n padding-left: 20px !important;\\r\\n}\\r\\n\\r\\n/* post new css thinh*/\\r\\n\\r\\n/* banner bottom */\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .img-banner-bottom {\\r\\n width: 100%;\\r\\n height: auto;\\r\\n }\\r\\n .box_content {\\r\\n display: none;\\r\\n }\\r\\n .block-post-right {\\r\\n padding: 15px 0px !important;\\r\\n }\\r\\n .scrollbars {\\r\\n width: 100% !important;\\r\\n }\\r\\n .sroll-views-style {\\r\\n padding: 0px !important;\\r\\n height: 340px;\\r\\n padding-left: 0px !important;\\r\\n padding-right: 10px !important;\\r\\n }\\r\\n .image-propaganda {\\r\\n width: 100%;\\r\\n padding-bottom: 1px;\\r\\n }\\r\\n .image-propaganda-phone {\\r\\n width: 100%;\\r\\n }\\r\\n .post-new-home {\\r\\n padding: 0px !important;\\r\\n }\\r\\n .img-logo {\\r\\n width: 100%;\\r\\n height: 350px;\\r\\n padding-left: 5px !important;\\r\\n padding-right: 0px !important;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n }\\r\\n .ul-notify {\\r\\n width: 100%;\\r\\n }\\r\\n\\r\\n .banner-posts img{\\r\\n width: 100% !important;\\r\\n height: auto !important;\\r\\n }\\r\\n\\r\\n .portal .group-body-2 {\\r\\n padding-top: 0px;\\r\\n }\\r\\n\\r\\n .scroll-view-temp{\\r\\n height: 100px !important;\\r\\n }\\r\\n\\r\\n .carousel-temp{\\r\\n height: 350px !important;\\r\\n }\\r\\n \\r\\n\\r\\n}\\r\\n\\r\\n/* banner bottom */\\r\\n\\r\\n.margin-scrollview {\\r\\n margin-top: 5px !important;\\r\\n margin-bottom: 5px !important;\\r\\n}\\r\\n\\r\\n.Fly-in-Banner {\\r\\n position: fixed;\\r\\n z-index: 1;\\r\\n bottom: 5px;\\r\\n float: right;\\r\\n right: 0;\\r\\n}\\r\\n\\r\\n.flyinBanner {\\r\\n /* height: 159px; */\\r\\n z-index: 1;\\r\\n position: relative;\\r\\n right: 0px;\\r\\n bottom: 0px;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.flyinBanner:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.Fly-in-Banner .btnLink {\\r\\n background-color: DodgerBlue;\\r\\n border: none;\\r\\n color: white;\\r\\n /* padding: 12px 16px; */\\r\\n cursor: pointer;\\r\\n position: absolute;\\r\\n right: 0;\\r\\n top: 0;\\r\\n z-index: 2;\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.notify-animation {\\r\\n -webkit-animation: mynotify 1s infinite;\\r\\n animation: mynotify 1s infinite;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes mynotify {\\r\\n 0% {\\r\\n color: #ea4335;\\r\\n }\\r\\n 25% {\\r\\n color: yellow;\\r\\n }\\r\\n 50% {\\r\\n color: blue;\\r\\n }\\r\\n 100% {\\r\\n color: white;\\r\\n }\\r\\n}\\r\\n\\r\\n@keyframes mynotify {\\r\\n 0% {\\r\\n color: #ea4335;\\r\\n }\\r\\n 25% {\\r\\n color: yellow;\\r\\n }\\r\\n 50% {\\r\\n color: blue;\\r\\n }\\r\\n 100% {\\r\\n color: white;\\r\\n }\\r\\n}\\r\\n\\r\\n.no-scrollbars {\\r\\n padding-right: 5px;\\r\\n}\\r\\n\\r\\n.post-cursor{\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.banner-posts{\\r\\n margin-left: 10px ;\\r\\n margin-right: 10px ;\\r\\n}\\r\\n\\r\\n.banner-posts img{\\r\\n width: 100%;\\r\\n height: 150px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.scroll-view-temp{\\r\\n width: 100%;\\r\\n height: 200px;\\r\\n background-color: #f1f1f1;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .scroll-view-temp kendo-scrollview.k-scrollview-wrap{\\r\\n background-color: #f1f1f1;\\r\\n}\\r\\n\\r\\n.carousel-temp{\\r\\n width: 100%;\\r\\n height: 250px;\\r\\n background-color: #f1f1f1;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .carousel-temp kendo-scrollview.k-scrollview-wrap{\\r\\n background-color: #f1f1f1;\\r\\n}\\r\\n\\r\\n.post-new-temp{\\r\\n width: 100%;\\r\\n height: 250px;\\r\\n background-color: #f1f1f1;\\r\\n border-left:solid 5px white;\\r\\n}\\r\\n\\r\\n.new-oc-temp{\\r\\n width: 100%;\\r\\n height: 250px;\\r\\n background-color: #f1f1f1;\\r\\n border-left:solid 5px white;\\r\\n}\\r\\n\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL2hvbWVwYWdlL2hvbWVwYWdlLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLDRCQUE0QjtJQUM1Qiw2QkFBNkI7SUFDN0IsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGFBQWE7SUFDYixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxjQUFjO0lBQ2QsV0FBVztJQUNYLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSx1QkFBdUI7SUFDdkIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLG9CQUFvQjtJQUNwQixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixhQUFhO0lBQ2IsY0FBYztJQUNkLFdBQVc7SUFDWCxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxvQkFBb0I7SUFDcEIsaUJBQWlCO0FBQ3JCOztBQUVBOztJQUVJLGNBQWM7SUFDZCxlQUFlO0FBQ25COztBQUVBO0lBQ0kseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksc0JBQXNCO0FBQzFCOztBQUdBLCtDQUErQzs7QUFFL0M7Ozs7Ozs7O0lBUUksYUFBYTtBQUNqQjs7QUFFQTtJQUNJLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsVUFBVTtJQUNWLGFBQWE7SUFDYixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGFBQWE7SUFDYiwwQkFBMEI7SUFDMUIsNEVBQTRFO0FBQ2hGOztBQUVBO0lBQ0ksa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLGFBQWE7SUFDYixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSw4Q0FBOEM7SUFDOUMseUJBQXlCO0lBQ3pCLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsV0FBVztJQUNYLFlBQVk7SUFDWixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSw4Q0FBOEM7SUFDOUMseUJBQXlCO0lBQ3pCLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YseUJBQXlCO0lBQ3pCLFdBQVc7SUFDWCxZQUFZO0lBQ1osa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLHNEQUFzRDtJQUN0RCx5QkFBeUI7SUFDekIsa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVixXQUFXO0lBQ1gsWUFBWTtJQUNaLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLHNEQUFzRDtJQUN0RCx5QkFBeUI7SUFDekIsa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVix5QkFBeUI7SUFDekIsV0FBVztJQUNYLFlBQVk7SUFDWixrQkFBa0I7QUFDdEI7O0FBRUM7SUFDRyxzQkFBc0I7SUFDdEIsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2Qiw4QkFBOEI7SUFDOUI7QUFDSjs7QUFFQTtJQUNJLFlBQVk7SUFDWixhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSw4QkFBOEI7SUFDOUIsWUFBWTtJQUNaLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLFlBQVk7SUFDWixhQUFhO0lBQ2IsT0FBTztJQUNQLFFBQVE7SUFDUixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsbUNBQW1DO0FBQ3ZDOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFHQSxpQkFBaUI7O0FBRWpCO0lBQ0ksbUJBQW1CO0lBQ25CLDZCQUE2QjtJQUM3QixZQUFZO0lBQ1osMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksMEJBQTBCO0lBQzFCLHlCQUF5QjtJQUN6Qiw0QkFBNEI7SUFDNUIsNkJBQTZCO0FBQ2pDOztBQUVBO0lBQ0ksV0FBVztJQUNYLHVCQUF1QjtJQUN2QixlQUFlO0FBQ25COztBQUVBO0lBQ0ksU0FBUztJQUNULFlBQVk7SUFDWixjQUFjO0lBQ2QsZUFBZTtJQUNmLHNCQUFzQjtJQUN0QixZQUFZO0lBQ1osb0JBQWlCO09BQWpCLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLHdCQUF3QjtJQUN4QixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQix1QkFBdUI7SUFDdkIsU0FBUztJQUNULFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsY0FBYztJQUNkLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSx1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxxQkFBcUI7QUFDekI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsaURBQWlEO0lBQ2pELGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQix1QkFBdUI7SUFDdkIsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDO0FBQ0o7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osYUFBYTtJQUNiLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLFVBQVU7QUFDZDs7QUFHQSxVQUFVOztBQUVWO0lBQ0ksbUJBQW1CO0FBQ3ZCOztBQUdBLFdBQVc7O0FBRVg7SUFDSSxnQkFBZ0I7QUFDcEI7O0FBR0Esb0JBQW9COztBQUVwQjtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJO0FBQ0o7O0FBRUE7SUFDSTs7Ozs7OzRDQU13QztJQUN4QyxZQUFZO0lBQ1osV0FBVztJQUNYLDBCQUFrQjtJQUFsQix1QkFBa0I7SUFBbEIsa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsaURBQWlEO0FBQ3JEOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixZQUFZO0FBQ2hCOztBQUVBO0lBQ0kscUJBQXFCO0lBQ3JCLGFBQWE7SUFDYiw4QkFBOEI7SUFDOUIsMkNBQTJDO0FBQy9DOztBQUdBO0lBQ0k7QUFDSjs7QUFFQTtJQUNJOzs7Ozs7NENBTXdDO0lBQ3hDLFlBQVk7SUFDWixXQUFXO0lBQ1gsMEJBQWtCO0lBQWxCLHVCQUFrQjtJQUFsQixrQkFBa0I7SUFDbEIsY0FBYztJQUNkLGtCQUFrQjtJQUNsQixpREFBaUQ7SUFDakQsOENBQXNDO1lBQXRDLHNDQUFzQztJQUN0QyxxQ0FBNkI7WUFBN0IsNkJBQTZCO0FBQ2pDOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1osMkJBQTJCO0lBQzNCLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLHFCQUFxQjtJQUNyQixhQUFhO0lBQ2IsOEJBQThCO0lBQzlCLDJDQUEyQztBQUMvQzs7QUFFQTtJQUNJLG9DQUEyQjtZQUEzQjtBQUNKOztBQUdBOzs7Ozs7O0dBT0c7O0FBRUg7SUFDSTtRQUNJLGlEQUFpRDtJQUNyRDs7SUFFQTtRQUNJLCtDQUErQztJQUNuRDtBQUNKOztBQVJBO0lBQ0k7UUFDSSxpREFBaUQ7SUFDckQ7O0lBRUE7UUFDSSwrQ0FBK0M7SUFDbkQ7QUFDSjs7QUFFQTtJQUNJLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIscUJBQXFCO0lBQ3JCLHVCQUF1QjtJQUN2QixTQUFTO0lBQ1QsWUFBWTtJQUNaLG1CQUFtQjtJQUNuQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxPQUFPO0lBQ1AsU0FBUztJQUNULHlCQUF5QjtJQUN6QixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSw0QkFBNEI7QUFDaEM7O0FBRUE7SUFDSSx1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSx1QkFBdUI7SUFDdkIsNkJBQTZCO0FBQ2pDOztBQUdBLHNCQUFzQjs7QUFHdEIsa0JBQWtCOztBQUVsQjtJQUNJO1FBQ0ksV0FBVztRQUNYLFlBQVk7SUFDaEI7SUFDQTtRQUNJLGFBQWE7SUFDakI7SUFDQTtRQUNJLDRCQUE0QjtJQUNoQztJQUNBO1FBQ0ksc0JBQXNCO0lBQzFCO0lBQ0E7UUFDSSx1QkFBdUI7UUFDdkIsYUFBYTtRQUNiLDRCQUE0QjtRQUM1Qiw4QkFBOEI7SUFDbEM7SUFDQTtRQUNJLFdBQVc7UUFDWCxtQkFBbUI7SUFDdkI7SUFDQTtRQUNJLFdBQVc7SUFDZjtJQUNBO1FBQ0ksdUJBQXVCO0lBQzNCO0lBQ0E7UUFDSSxXQUFXO1FBQ1gsYUFBYTtRQUNiLDRCQUE0QjtRQUM1Qiw2QkFBNkI7UUFDN0Isb0JBQWlCO1dBQWpCLGlCQUFpQjtJQUNyQjtJQUNBO1FBQ0ksV0FBVztJQUNmOztJQUVBO1FBQ0ksc0JBQXNCO1FBQ3RCLHVCQUF1QjtJQUMzQjs7SUFFQTtRQUNJLGdCQUFnQjtJQUNwQjs7SUFFQTtRQUNJLHdCQUF3QjtJQUM1Qjs7SUFFQTtRQUNJLHdCQUF3QjtJQUM1Qjs7O0FBR0o7O0FBR0Esa0JBQWtCOztBQUVsQjtJQUNJLDBCQUEwQjtJQUMxQiw2QkFBNkI7QUFDakM7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLFdBQVc7SUFDWCxZQUFZO0lBQ1osUUFBUTtBQUNaOztBQUVBO0lBQ0ksbUJBQW1CO0lBQ25CLFVBQVU7SUFDVixrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksNEJBQTRCO0lBQzVCLFlBQVk7SUFDWixZQUFZO0lBQ1osd0JBQXdCO0lBQ3hCLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLE1BQU07SUFDTixVQUFVO0lBQ1YsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLHVDQUErQjtZQUEvQiwrQkFBK0I7QUFDbkM7O0FBRUE7SUFDSTtRQUNJLGNBQWM7SUFDbEI7SUFDQTtRQUNJLGFBQWE7SUFDakI7SUFDQTtRQUNJLFdBQVc7SUFDZjtJQUNBO1FBQ0ksWUFBWTtJQUNoQjtBQUNKOztBQWJBO0lBQ0k7UUFDSSxjQUFjO0lBQ2xCO0lBQ0E7UUFDSSxhQUFhO0lBQ2pCO0lBQ0E7UUFDSSxXQUFXO0lBQ2Y7SUFDQTtRQUNJLFlBQVk7SUFDaEI7QUFDSjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGFBQWE7SUFDYixlQUFlO0FBQ25COztBQUVBO0lBQ0ksV0FBVztJQUNYLGFBQWE7SUFDYix5QkFBeUI7QUFDN0I7O0FBRUE7SUFDSSx5QkFBeUI7QUFDN0I7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0lBQ2IseUJBQXlCO0lBQ3pCLDJCQUEyQjtBQUMvQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0lBQ2IseUJBQXlCO0lBQ3pCLDJCQUEyQjtBQUMvQiIsImZpbGUiOiJzcmMvYXBwL3BvcnRhbC9ob21lcGFnZS9ob21lcGFnZS5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmltZy1iYW5uZXItdG9wIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxNTBweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XHJcbn1cclxuXHJcbi5pbWctbG9nbyB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMzc3cHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDBweCAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICAvKiBvYmplY3QtZml0OiBjb3ZlcjsgKi9cclxufVxyXG5cclxuLmJhbm5lciB7XHJcbiAgICB3aWR0aDogNTAwcHg7XHJcbiAgICBoZWlnaHQ6IDUwMHB4O1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbn1cclxuXHJcbi5uby1pbmRpY2F0b3JzIHtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbn1cclxuXHJcbi5iYW5uZXItdGl0bGUge1xyXG4gICAgLyogbWF4LWhlaWdodDogMTAwcHg7ICovXHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMnB4O1xyXG4gICAgLyogY29sb3I6ICM3NDc0NzQ7ICovXHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuLmJhbm5lci0zNjAge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDE1MHB4O1xyXG59XHJcblxyXG4uYmFubmVyLTEwMHAge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDE4MHB4O1xyXG59XHJcblxyXG4uZ3JvdXAtYm9keS1pdGVtIHtcclxuICAgIHBhZGRpbmctYm90dG9tOiAyMHB4O1xyXG4gICAgcGFkZGluZy10b3A6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDEzMHB4O1xyXG4gICAgbWF4LXdpZHRoOiAyMCU7XHJcbiAgICBmbG9hdDogbGVmdDtcclxuICAgIHBhZGRpbmc6IDEwcHggMTVweDtcclxufVxyXG5cclxuLmdyb3VwLWJvZHktaXRlbS1ub25lLWJnIHtcclxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xyXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XHJcbn1cclxuXHJcbi5ncm91cC1ib2R5LWl0ZW06aG92ZXIsXHJcbi5ncm91cC1ib2R5LWl0ZW0tbm9uZS1iZyA6aG92ZXIge1xyXG4gICAgY29sb3I6ICMwMDZDQjc7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5wb3J0YWwgLmdyb3VwLWJvZHktMiB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xyXG59XHJcblxyXG4ucG9ydGFsIC5ncm91cC1ib2R5LTIge1xyXG4gICAgcGFkZGluZy10b3A6IDBweDtcclxufVxyXG5cclxudmlkZW86Oi13ZWJraXQtbWVkaWEtY29udHJvbHMtcGxheS1idXR0b24ge1xyXG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxufVxyXG5cclxuXHJcbi8qIHZpZGVvOjotd2Via2l0LW1lZGlhLWNvbnRyb2xzLXBsYXktYnV0dG9uLCAqL1xyXG5cclxudmlkZW86Oi13ZWJraXQtbWVkaWEtY29udHJvbHMtcmV3aW5kLWJ1dHRvbixcclxudmlkZW86Oi13ZWJraXQtbWVkaWEtY29udHJvbHMtZnVsbHNjcmVlbi1idXR0b24sXHJcbnZpZGVvOjotd2Via2l0LW1lZGlhLWNvbnRyb2xzLXRpbWVsaW5lLFxyXG52aWRlbzo6LXdlYmtpdC1tZWRpYS1jb250cm9scy10aW1lbGluZS1jb250YWluZXIgdmlkZW86Oi13ZWJraXQtbWVkaWEtY29udHJvbHMtY3VycmVudC10aW1lLWRpc3BsYXksXHJcbnZpZGVvOjotd2Via2l0LW1lZGlhLWNvbnRyb2xzLXRpbWUtcmVtYWluaW5nLWRpc3BsYXksXHJcbnZpZGVvOjotd2Via2l0LW1lZGlhLWNvbnRyb2xzLW11dGUtYnV0dG9uLFxyXG52aWRlbzo6LXdlYmtpdC1tZWRpYS1jb250cm9scy10b2dnbGUtY2xvc2VkLWNhcHRpb25zLWJ1dHRvbixcclxudmlkZW86Oi13ZWJraXQtbWVkaWEtY29udHJvbHMtdm9sdW1lLXNsaWRlciB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4uay10YWJzdHJpcC1pdGVtcyAuay1zdGF0ZS1kZWZhdWx0IC5rLWxpbmsge1xyXG4gICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XHJcbn1cclxuXHJcbi5wcm9ncmVzcyB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG4uY29sdW1uIHtcclxuICAgIGZsb2F0OiBsZWZ0O1xyXG4gICAgd2lkdGg6IDIwJTtcclxuICAgIHBhZGRpbmc6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDE4NHB4O1xyXG59XHJcblxyXG4jYm90LWJhbm5lci1pbWcge1xyXG4gICAgd2lkdGg6IDE5OHB4O1xyXG4gICAgaGVpZ2h0OiAxOThweDtcclxuICAgIHRleHQtYWxpZ246IC13ZWJraXQtY2VudGVyO1xyXG4gICAgYm94LXNoYWRvdzogMCA0cHggOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpLCAwIDZweCAyMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE5KTtcclxufVxyXG5cclxuLnBpY3N1bS1pbWctd3JhcHBlciB7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbiN0b3AtYmFubmVyLWltZyB7XHJcbiAgICB3aWR0aDogMTE0MHB4O1xyXG4gICAgaGVpZ2h0OiAxODBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuI3RvcC1idXR0b24tbGVmdCB7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoL2Fzc2V0cy9pbWFnZXMvbmV4dC5wbmcpO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNkNCNztcclxuICAgIGJvcmRlci1yYWRpdXM6IDEwJTtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICB3aWR0aDogMzJweDtcclxuICAgIGhlaWdodDogMzJweDtcclxuICAgIG1hcmdpbi1yaWdodDogMTM1cHg7XHJcbn1cclxuXHJcbiN0b3AtYnV0dG9uLXJpZ2h0IHtcclxuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgvYXNzZXRzL2ltYWdlcy9uZXh0LnBuZyk7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTAlO1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XHJcbiAgICB3aWR0aDogMzJweDtcclxuICAgIGhlaWdodDogMzJweDtcclxuICAgIG1hcmdpbi1sZWZ0OiAxMzVweDtcclxufVxyXG5cclxuLmNhcm91c2VsLWluZGljYXRvcnMgbGkge1xyXG4gICAgd2lkdGg6IDExcHg7XHJcbiAgICBoZWlnaHQ6IDExcHg7XHJcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogLTMycHg7XHJcbiAgICBjb2xvcjogZ3JheTtcclxufVxyXG5cclxuI2JvdHRvbS1idXR0b24tbGVmdCB7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoL2Fzc2V0cy9pbWFnZXMvcHJldmlvdXMtYm90LnBuZyk7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGO1xyXG4gICAgYm9yZGVyLXJhZGl1czogMTAlO1xyXG4gICAgb3BhY2l0eTogMTtcclxuICAgIHdpZHRoOiAzMXB4O1xyXG4gICAgaGVpZ2h0OiAyMXB4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAxMzVweDtcclxufVxyXG5cclxuI2JvdHRvbS1idXR0b24tcmlnaHQge1xyXG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC9hc3NldHMvaW1hZ2VzL3ByZXZpb3VzLWJvdC5wbmcpO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDEwJTtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xyXG4gICAgd2lkdGg6IDMxcHg7XHJcbiAgICBoZWlnaHQ6IDIxcHg7XHJcbiAgICBtYXJnaW4tbGVmdDogMTM1cHg7XHJcbn1cclxuXHJcbiA6cm9vdCB7XHJcbiAgICAtLWNyc2wtYmc6IHRyYW5zcGFyZW50O1xyXG4gICAgLS1ib3gtYmc6ICMxZTI3MmU7XHJcbiAgICAtLWJveC1zaGFkb3c6ICMwMDAwMDAxYztcclxuICAgIC0tYm94LXNoYWRvdy1ib3JkZXI6ICMwMDAwMDAwZjtcclxuICAgIC0tYm94LWJvcmRlcjogI2ZmZlxyXG59XHJcblxyXG4uaXRlbS1pbWctaG9tZSB7XHJcbiAgICB3aWR0aDogMTkycHg7XHJcbiAgICBoZWlnaHQ6IDExNXB4O1xyXG59XHJcblxyXG4udGl0bGUtY2Fyb3VzZWwtYWN0aXZlIHtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG59XHJcblxyXG4uaW1hZ2UtcHJvcGFnYW5kYSB7XHJcbiAgICAvKiBib3JkZXI6IHNvbGlkIDAuNXB4IG5hdnk7ICovXHJcbiAgICB3aWR0aDogMjgwcHg7XHJcbiAgICBoZWlnaHQ6IDk2cHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMXB4O1xyXG4gICAgLyogbWFyZ2luLXRvcDogMnB4OyAqL1xyXG59XHJcblxyXG4uaW1hZ2UtcHJvcGFnYW5kYTpob3ZlciB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi51bml0LWl0ZW0ge1xyXG4gICAgd2lkdGg6IDIxN3B4O1xyXG4gICAgaGVpZ2h0OiAyMjJweDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICByaWdodDogMDtcclxuICAgIG1hcmdpbjogYXV0bztcclxufVxyXG5cclxuLnVuaXQtaXRlbTpob3ZlciB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5pbWctYmFubmVyLWJvdHRvbSB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTU5cHg7XHJcbn1cclxuXHJcbi51bml0LWl0ZW0gLmltZyB7XHJcbiAgICB3aWR0aDogMjA2cHg7XHJcbiAgICBoZWlnaHQ6IDE5MHB4O1xyXG4gICAgbWFyZ2luOiAxNnB4IDVweDtcclxuICAgIGJveC1zaGFkb3c6IDBweCAycHggNXB4IDJweCAjZTdlOWVjO1xyXG59XHJcblxyXG4udWktY2Fyb3VzZWwtaXRlbXMtY29udGVudCB7XHJcbiAgICBiYWNrZ3JvdW5kOiByZWQ7XHJcbn1cclxuXHJcblxyXG4vKiBwb3N0IG5ldyBjc3MgKi9cclxuXHJcbi5jb250ZW50IHtcclxuICAgIGJhY2tncm91bmQ6ICNmMGYwZjA7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmZjtcclxuICAgIHBhZGRpbmc6IDVweDtcclxuICAgIG1hcmdpbi10b3A6IDBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uYm94X2NvbnRlbnQge1xyXG4gICAgbWFyZ2luLXRvcDogMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICB3aWR0aDogY2FsYygxMDAlIC0gNjM4cHgpO1xyXG4gICAgcGFkZGluZy1sZWZ0OiAycHggIWltcG9ydGFudDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDJweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uaW1nLXBvc3Qge1xyXG4gICAgd2lkdGg6IDgwcHg7XHJcbiAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcclxuICAgIGhlaWdodDogNjQuNzVweDtcclxufVxyXG5cclxuLmltZy1wb3N0IGltZyB7XHJcbiAgICBib3JkZXI6IDA7XHJcbiAgICBmb250LXNpemU6IDA7XHJcbiAgICBsaW5lLWhlaWdodDogMDtcclxuICAgIG1heC13aWR0aDogODBweDtcclxuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbiAgICBoZWlnaHQ6IDY0cHg7XHJcbiAgICBvYmplY3QtZml0OiBjb3ZlcjtcclxufVxyXG5cclxuLnRleHQtY29udGVudC1wb3N0IHtcclxuICAgIHdpZHRoOiBjYWxjKDEwMCUgLSA4MHB4KTtcclxuICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGhlaWdodDogNTRweDtcclxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XHJcbiAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbn1cclxuXHJcbi50ZXh0LWNvbnRlbnQtcG9zdCBhIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxufVxyXG5cclxuLmJveF9jb250ZW50IDpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZjtcclxufVxyXG5cclxuLnJvdyA6aG92ZXIgYSB7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbn1cclxuXHJcbi5ncm91cC1oZWFkZXItbm90aWZ5IHtcclxuICAgIHBhZGRpbmctdG9wOiA0cHg7XHJcbiAgICAvKiBib3JkZXItYm90dG9tOiAycHggc29saWQgI0VCMTkyNCAhaW1wb3J0YW50OyAqL1xyXG4gICAgcGFkZGluZy1sZWZ0OiAwcHg7XHJcbiAgICBmb250LXNpemU6IDE1cHg7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgICBmb250LXdlaWdodDogNTAwO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcclxufVxyXG5cclxuLmdyb3VwLWhlYWRlci1ub3RpZnk+c3BhbjpmaXJzdC1jaGlsZCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUIxOTI0ICFpbXBvcnRhbnQ7XHJcbiAgICBwYWRkaW5nOiA1cHggMTBweCA0cHggMTBweFxyXG59XHJcblxyXG4ubWFyZ2luLW5ldy1kb2N4IHtcclxuICAgIG1hcmdpbi10b3A6IDBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uc2Nyb2xsYmFycyB7XHJcbiAgICB3aWR0aDogMjgwcHg7XHJcbiAgICBoZWlnaHQ6IDE2MHB4O1xyXG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xyXG59XHJcblxyXG4uc2Nyb2xsYmFyczo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gICAgd2lkdGg6IDBweDtcclxufVxyXG5cclxuXHJcbi8qIFRyYWNrICovXHJcblxyXG4uc2Nyb2xsYmFyczo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sge1xyXG4gICAgYmFja2dyb3VuZDogI2YxZjFmMTtcclxufVxyXG5cclxuXHJcbi8qIEhhbmRsZSAqL1xyXG5cclxuLnNjcm9sbGJhcnM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcclxuICAgIGJhY2tncm91bmQ6ICM4ODg7XHJcbn1cclxuXHJcblxyXG4vKiBIYW5kbGUgb24gaG92ZXIgKi9cclxuXHJcbi5zY3JvbGxiYXJzOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kOiAjNTU1O1xyXG59XHJcblxyXG4udWwtbm90aWZ5IHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGQkUxQzZcclxufVxyXG5cclxuLnVsLW5vdGlmeSB1bCB7XHJcbiAgICAvKiBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XHJcbiAgICBwYWRkaW5nOiAwcHg7XHJcbiAgICBtYXJnaW46IDBweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGQkUxQzY7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIGFuaW1hdGlvbjogc2Nyb2xsIDEwcyBsaW5lYXIgaW5maW5pdGU7ICovXHJcbiAgICBwYWRkaW5nOiAwcHg7XHJcbiAgICBtYXJnaW46IDBweDtcclxuICAgIHdpZHRoOiBmaXQtY29udGVudDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCB2YXIoLS1tb3ZlLWluaXRpYWwpLCAwKTtcclxufVxyXG5cclxuLnVsLW5vdGlmeXtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB3aWR0aDogMjgwcHg7ICAgXHJcbn1cclxuXHJcbi51bC1ub3RpZnkgdWwgbGkge1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG4gICAgcGFkZGluZzogMTBweDtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgI2JiYjtcclxuICAgIC8qIGFuaW1hdGlvbjogc2Nyb2xsIDEwcyBsaW5lYXIgaW5maW5pdGU7ICovXHJcbn1cclxuXHJcblxyXG4udWwtbm90aWZ5LXNjcm9sbCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkJFMUM2XHJcbn1cclxuXHJcbi51bC1ub3RpZnktc2Nyb2xsIHVsIHtcclxuICAgIC8qIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcclxuICAgIHBhZGRpbmc6IDBweDtcclxuICAgIG1hcmdpbjogMHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZCRTFDNjtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgYW5pbWF0aW9uOiBzY3JvbGwgMTBzIGxpbmVhciBpbmZpbml0ZTsgKi9cclxuICAgIHBhZGRpbmc6IDBweDtcclxuICAgIG1hcmdpbjogMHB4O1xyXG4gICAgd2lkdGg6IGZpdC1jb250ZW50O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIHZhcigtLW1vdmUtaW5pdGlhbCksIDApO1xyXG4gICAgYW5pbWF0aW9uOiBtYXJxdWVlIDMwcyBsaW5lYXIgaW5maW5pdGU7XHJcbiAgICBhbmltYXRpb24tcGxheS1zdGF0ZTogcnVubmluZztcclxufVxyXG5cclxuLnVsLW5vdGlmeS1zY3JvbGx7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgd2lkdGg6IDI4MHB4O1xyXG4gICAgLS1tb3ZlLWluaXRpYWw6IGNhbGMoLTIwJSApO1xyXG4gICAgLS1tb3ZlLWZpbmFsOiBjYWxjKC0zMCUgKTtcclxufVxyXG5cclxuLnVsLW5vdGlmeS1zY3JvbGwgdWwgbGkge1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG4gICAgcGFkZGluZzogMTBweDtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgI2JiYjtcclxuICAgIC8qIGFuaW1hdGlvbjogc2Nyb2xsIDEwcyBsaW5lYXIgaW5maW5pdGU7ICovXHJcbn1cclxuXHJcbi51bC1ub3RpZnktc2Nyb2xsIHVsOmhvdmVyIHtcclxuICAgIGFuaW1hdGlvbi1wbGF5LXN0YXRlOiBwYXVzZWRcclxufVxyXG5cclxuXHJcbi8qIEBrZXlmcmFtZXMgc2Nyb2xsIHtcclxuICAgIDAlIHtcclxuICAgICAgICB0b3A6IDEwMCU7XHJcbiAgICB9XHJcbiAgICAxMDAlIHtcclxuICAgICAgICB0b3A6IC0xNTAlO1xyXG4gICAgfVxyXG59ICovXHJcblxyXG5Aa2V5ZnJhbWVzIG1hcnF1ZWUge1xyXG4gICAgMCUge1xyXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgdmFyKC0tbW92ZS1pbml0aWFsKSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgMTAwJSB7XHJcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCB2YXIoLS1tb3ZlLWZpbmFsKSwgMCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi50ZXh0LWNvbnRlbnQtbm90aWZ5IHtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGhlaWdodDogODBweDtcclxuICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG59XHJcblxyXG4udGV4dC1jb250ZW50LW5vdGlmeSBhIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG4gICAgbGluZS1oZWlnaHQ6IDE3cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xyXG59XHJcblxyXG4uaWNvbi1ib29rbWFyayB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICBjb2xvcjogI0VCMTkyNDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB0b3A6IDEwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xyXG4gICAgbWFyZ2luLWxlZnQ6IDFweDtcclxufVxyXG5cclxuLmZhLWJ1bGxob3JuOmJlZm9yZSB7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDVweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uYmxvY2stcG9zdC1yaWdodCB7XHJcbiAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLnNyb2xsLXZpZXdzLXN0eWxlIHtcclxuICAgIHBhZGRpbmc6IDBweCAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZy1sZWZ0OiAyMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcblxyXG4vKiBwb3N0IG5ldyBjc3MgdGhpbmgqL1xyXG5cclxuXHJcbi8qIGJhbm5lciBib3R0b20gKi9cclxuXHJcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjhweCkge1xyXG4gICAgLmltZy1iYW5uZXItYm90dG9tIHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB9XHJcbiAgICAuYm94X2NvbnRlbnQge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB9XHJcbiAgICAuYmxvY2stcG9zdC1yaWdodCB7XHJcbiAgICAgICAgcGFkZGluZzogMTVweCAwcHggIWltcG9ydGFudDtcclxuICAgIH1cclxuICAgIC5zY3JvbGxiYXJzIHtcclxuICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG4gICAgLnNyb2xsLXZpZXdzLXN0eWxlIHtcclxuICAgICAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcclxuICAgICAgICBoZWlnaHQ6IDM0MHB4O1xyXG4gICAgICAgIHBhZGRpbmctbGVmdDogMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgcGFkZGluZy1yaWdodDogMTBweCAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG4gICAgLmltYWdlLXByb3BhZ2FuZGEge1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAxcHg7XHJcbiAgICB9XHJcbiAgICAuaW1hZ2UtcHJvcGFnYW5kYS1waG9uZSB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcbiAgICAucG9zdC1uZXctaG9tZSB7XHJcbiAgICAgICAgcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcbiAgICAuaW1nLWxvZ28ge1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGhlaWdodDogMzUwcHg7XHJcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHggIWltcG9ydGFudDtcclxuICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudDtcclxuICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjtcclxuICAgIH1cclxuICAgIC51bC1ub3RpZnkge1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC5iYW5uZXItcG9zdHMgaW1ne1xyXG4gICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLnBvcnRhbCAuZ3JvdXAtYm9keS0yIHtcclxuICAgICAgICBwYWRkaW5nLXRvcDogMHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5zY3JvbGwtdmlldy10ZW1we1xyXG4gICAgICAgIGhlaWdodDogMTAwcHggIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuY2Fyb3VzZWwtdGVtcHtcclxuICAgICAgICBoZWlnaHQ6IDM1MHB4ICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcbiAgICBcclxuXHJcbn1cclxuXHJcblxyXG4vKiBiYW5uZXIgYm90dG9tICovXHJcblxyXG4ubWFyZ2luLXNjcm9sbHZpZXcge1xyXG4gICAgbWFyZ2luLXRvcDogNXB4ICFpbXBvcnRhbnQ7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA1cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLkZseS1pbi1CYW5uZXIge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIGJvdHRvbTogNXB4O1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgcmlnaHQ6IDA7XHJcbn1cclxuXHJcbi5mbHlpbkJhbm5lciB7XHJcbiAgICAvKiBoZWlnaHQ6IDE1OXB4OyAqL1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHJpZ2h0OiAwcHg7XHJcbiAgICBib3R0b206IDBweDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uZmx5aW5CYW5uZXI6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4uRmx5LWluLUJhbm5lciAuYnRuTGluayB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBEb2RnZXJCbHVlO1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgLyogcGFkZGluZzogMTJweCAxNnB4OyAqL1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICB0b3A6IDA7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG59XHJcblxyXG4ubm90aWZ5LWFuaW1hdGlvbiB7XHJcbiAgICBhbmltYXRpb246IG15bm90aWZ5IDFzIGluZmluaXRlO1xyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIG15bm90aWZ5IHtcclxuICAgIDAlIHtcclxuICAgICAgICBjb2xvcjogI2VhNDMzNTtcclxuICAgIH1cclxuICAgIDI1JSB7XHJcbiAgICAgICAgY29sb3I6IHllbGxvdztcclxuICAgIH1cclxuICAgIDUwJSB7XHJcbiAgICAgICAgY29sb3I6IGJsdWU7XHJcbiAgICB9XHJcbiAgICAxMDAlIHtcclxuICAgICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi5uby1zY3JvbGxiYXJzIHtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcclxufVxyXG5cclxuLnBvc3QtY3Vyc29ye1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4uYmFubmVyLXBvc3Rze1xyXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHggO1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAxMHB4IDtcclxufVxyXG5cclxuLmJhbm5lci1wb3N0cyBpbWd7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTUwcHg7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5zY3JvbGwtdmlldy10ZW1we1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDIwMHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5zY3JvbGwtdmlldy10ZW1wIGtlbmRvLXNjcm9sbHZpZXcuay1zY3JvbGx2aWV3LXdyYXB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xyXG59XHJcblxyXG4uY2Fyb3VzZWwtdGVtcHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAyNTBweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWYxZjE7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuY2Fyb3VzZWwtdGVtcCBrZW5kby1zY3JvbGx2aWV3Lmstc2Nyb2xsdmlldy13cmFwe1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjFmMTtcclxufVxyXG5cclxuLnBvc3QtbmV3LXRlbXB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMjUwcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xyXG4gICAgYm9yZGVyLWxlZnQ6c29saWQgNXB4IHdoaXRlO1xyXG59XHJcblxyXG4ubmV3LW9jLXRlbXB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMjUwcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xyXG4gICAgYm9yZGVyLWxlZnQ6c29saWQgNXB4IHdoaXRlO1xyXG59XHJcbiJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
2 ? 'ul-notify-scroll' : 'ul-notify'\\\">\\r\\n
2 ? 'scrollbars' : 'no-scrollbars'\\\">\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, Output, Input, EventEmitter, OnDestroy, ElementRef, ViewChild, Renderer2, HostListener } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AuthenticationService } from '../../services/authentication.service';\r\nimport { AppService } from '../../services/app.service';\r\nimport { AppComponent } from '../../app.component';\r\nimport { AppSwal } from '../../services/app.swal';\r\nimport { ResourceLoader } from '@angular/compiler';\r\n\r\n\r\nimport { AppLanguage } from '../../services/app.language';\r\n\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport * as FileSaver from 'file-saver';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { forEach } from '@angular/router/src/utils/collection';\r\nimport { AfterViewInit } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { t } from '@angular/core/src/render3';\r\n\r\n@Component({\r\n selector: 'app-homepage',\r\n templateUrl: './homepage.component.html',\r\n styleUrls: ['./homepage.component.css']\r\n})\r\nexport class HomepageComponent implements OnInit {\r\n\r\n @Output() reloadPosts = new EventEmitter();\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n @ViewChild('scrollview') scrollView;\r\n @ViewChild('scrollAutomation') scrollNotify;\r\n @ViewChild('carouselID') carouselID;\r\n @ViewChild('carousel') carousel;\r\n user: any;\r\n searchOption = {\r\n HotFlg: false\r\n };\r\n\r\n dataHome = {\r\n PostHots: null,\r\n BannerTops: null,\r\n BannerBottoms: null,\r\n PostByMenus: null,\r\n PostByNotify: null,\r\n NewDoc: null,\r\n ImagePropaganda: null,\r\n PostHotsTemp: null,\r\n };\r\n dataTopBanner = {\r\n SlideViewData: null,\r\n GridViewData: null\r\n };\r\n dataBottomBanner = {\r\n SlideViewData: null,\r\n GridViewData: null\r\n }\r\n\r\n public width = '100%';\r\n public height = '200px';\r\n responsiveOptions: any;\r\n public FlyinBanner: any;\r\n\r\n positions = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\r\n postByMenuIdx = 0;\r\n public imageDef = '../../assets/images/default-02.png';\r\n public posterImg = '../../assets/images/poster.png';\r\n\r\n screen = {\r\n w: 0,\r\n h: 0\r\n };\r\n\r\n public autoplay = 0;\r\n\r\n private interval;\r\n\r\n public flyinBanner = true;\r\n public isMobileDevice = false;\r\n public widthPostHot = '100%';\r\n public heightPostHot = '100%';\r\n public endlessPostHot = true;\r\n constructor(\r\n private router: Router,\r\n private authenticationService: AuthenticationService,\r\n public appService: AppService,\r\n private appComponent: AppComponent,\r\n private appSwal: AppSwal\r\n ) {\r\n\r\n if(window.innerWidth <= 768) {\r\n this.isMobileDevice = true;\r\n }\r\n this.responsiveOptions = [\r\n {\r\n breakpoint: '1024px',\r\n numVisible: 3,\r\n numScroll: 3\r\n },\r\n {\r\n breakpoint: '768px',\r\n numVisible: 2,\r\n numScroll: 2\r\n },\r\n {\r\n breakpoint: '560px',\r\n numVisible: 2,\r\n numScroll: 2\r\n }\r\n ];\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.onReload();\r\n // this.TopBanner();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.autoplay = 5000;\r\n this.screen.h = window.innerHeight;\r\n this.screen.w = window.innerWidth;\r\n this.getScreenSize();\r\n // this.scrollAutomation();\r\n }\r\n\r\n\r\n getScreenSize() {\r\n try {\r\n const h = (this.screen.w - 34) / 5.6;\r\n this.height = `${h > 200 ? 200 : h}px`;\r\n } catch {\r\n\r\n }\r\n }\r\n\r\n onResize(event) {\r\n this.screen.w = event.target.innerWidth;\r\n this.screen.h = event.target.innerHeight;\r\n this.getScreenSize();\r\n }\r\n\r\n \r\n\r\n async onReload() {\r\n const resultPost = await this.appService.doGET('api/Post/GetByHome', null);\r\n // this.getNewDoc();\r\n // this.getImageAtHome();\r\n if (resultPost && resultPost.Status === 1 && resultPost.Data) {\r\n if (resultPost.Data.PostHots){\r\n this.dataHome.PostHots = resultPost.Data.PostHots;\r\n }\r\n if (resultPost.Data.BannerTops){\r\n this.dataHome.BannerTops = resultPost.Data.BannerTops;\r\n }\r\n if (resultPost.Data.PostByMenus){\r\n this.dataHome.PostByNotify = resultPost.Data.PostByMenus.filter((r) => r.DATA_MENU.HomeDisplayType === 0);\r\n }\r\n if (resultPost.Data.BannerBottoms){\r\n this.dataHome.BannerBottoms = resultPost.Data.BannerBottoms;\r\n for (let i = 0; i < this.dataHome.BannerBottoms.length; i++) {\r\n this.dataHome.BannerBottoms[i].Idx = i;\r\n }\r\n }\r\n if (resultPost.Data.PostHots){\r\n this.dataHome.PostHotsTemp = resultPost.Data.PostHots;\r\n }\r\n if (resultPost.Data.PostByMenus){\r\n \r\n if (this.isMobileDevice){\r\n\r\n this.dataHome.PostByMenus = resultPost.Data.PostByMenus;\r\n }else {\r\n this.dataHome.PostByMenus = resultPost.Data.PostByMenus;\r\n // for (let i = 0; i < this.dataHome.PostByMenus.length ; i++) {\r\n // if (this.dataHome.PostByMenus[i].Posts && this.dataHome.PostByMenus[i].Posts.length > 5){\r\n // var postsTemp = this.dataHome.PostByMenus[i].Posts\r\n // this.dataHome.PostByMenus[i].Posts = [];\r\n // for (let j = 0; j < postsTemp.length -1 ; j++) {\r\n // this.dataHome.PostByMenus[i].Posts[j] = postsTemp[j];\r\n // }\r\n // } \r\n // }\r\n }\r\n }\r\n if (this.dataHome.BannerBottoms){\r\n if(this.dataHome.BannerBottoms.length >= 6){\r\n let n = 0;\r\n let bannerNum = this.dataHome.BannerBottoms.length;\r\n while (n <= 100){\r\n this.dataHome.BannerBottoms[n] = this.dataHome.BannerBottoms[n % bannerNum]\r\n n++;\r\n }\r\n }\r\n } \r\n this.dataHome.ImagePropaganda = resultPost.Data.ResultAlbumPhoto;\r\n this.FlyinBanner = resultPost.Data.FlyinBanner;\r\n this.dataTopBanner.SlideViewData = resultPost.Data.dataForSlideViewTop;\r\n this.dataTopBanner.GridViewData = resultPost.Data.dataForGridViewTop;\r\n this.dataBottomBanner.SlideViewData = resultPost.Data.dataForSlideViewBottom;\r\n this.dataBottomBanner.GridViewData = resultPost.Data.dataForGridViewBottom;\r\n\r\n this.dataHome.NewDoc = resultPost.Data.NewDoc;\r\n if (this.dataHome.NewDoc){\r\n if(this.dataHome.NewDoc.length > 2){\r\n let n = 0;\r\n let bannerNum = this.dataHome.NewDoc.length;\r\n while (n <= 200){\r\n this.dataHome.NewDoc[n] = this.dataHome.NewDoc[n % bannerNum]\r\n n++;\r\n }\r\n }\r\n }\r\n }\r\n \r\n }\r\n\r\n // async TopBanner() {\r\n // const result = await this.appService.doGET('api/Multimedia/Picture', null);\r\n // if (result && result.Status === 1 && result.Data) {\r\n // this.dataTopBanner.SlideViewData = result.Data.dataForSlideViewTop;\r\n // this.dataTopBanner.GridViewData = result.Data.dataForGridViewTop;\r\n // this.dataBottomBanner.SlideViewData = result.Data.dataForSlideViewBottom;\r\n // this.dataBottomBanner.GridViewData = result.Data.dataForGridViewBottom;\r\n // }\r\n // } \r\n\r\n async getNewDoc() {\r\n const dataRequest = {\r\n dataRequestType: 1\r\n };\r\n const resultNewDoc = await this.appService.doGET('api/Office/GetOfficeDisplayHome', dataRequest);\r\n if (resultNewDoc && resultNewDoc.Status === 1) {\r\n this.dataHome.NewDoc = resultNewDoc.Data;\r\n if (this.dataHome.NewDoc){\r\n if(this.dataHome.NewDoc.length > 2){\r\n let n = 0;\r\n let bannerNum = this.dataHome.NewDoc.length;\r\n while (n <= 200){\r\n this.dataHome.NewDoc[n] = this.dataHome.NewDoc[n % bannerNum]\r\n n++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n async getImageAtHome() {\r\n const resultImage = await this.appService.doGET('api/File/GetImageAtHome', null); \r\n if (resultImage && resultImage.Status === 1) {\r\n if (resultImage.Data){ \r\n this.dataHome.ImagePropaganda = resultImage.Data.ResultAlbumPhoto;\r\n this.FlyinBanner = resultImage.Data.FlyinBanner;\r\n } \r\n }\r\n }\r\n\r\n onClickOfficeItem(item) {\r\n this.router.navigate(['portal/office-detail'], { queryParams: { title: item.UrlPath } });\r\n }\r\n\r\n onClickPostItem(item) {\r\n this.router.navigate(['portal/post-detail'], { queryParams: { title: item.UrlPath } });\r\n }\r\n\r\n onClickImagePropaganda(item) {\r\n if(item.LinkUrl){\r\n window.location.href = item.LinkUrl;\r\n }else {\r\n this.router.navigate(['portal/multimedia'], { queryParams: { menuID: item.MenuID } });\r\n }\r\n\r\n }\r\n\r\n pageNum = 0;\r\n setPage(e: any) {\r\n this.pageNum = e.page;\r\n }\r\n\r\n clickBannerBottom(linkUrl) {\r\n if (linkUrl) {\r\n window.open(linkUrl);\r\n }\r\n }\r\n public ngAfterViewInit() { \r\n this.interval = setInterval(() => {\r\n this.scrollView.next();\r\n }, 6000);\r\n this.interval = setInterval(() => {\r\n this.carousel.next();\r\n }, 5000); \r\n }\r\n\r\n // public scrollAutomation() {\r\n // this.interval = setInterval(() => {\r\n // this.scrollNotify.scrollTo(0, 0);\r\n // }, 3000);\r\n // }\r\n\r\n public mouseoverHotPost(item){\r\n this.dataHome.PostHots = [];\r\n this.dataHome.PostHots.push(item);\r\n this.endlessPostHot = false;\r\n }\r\n \r\n public mouseoutHotPost(){\r\n this.dataHome.PostHots = this.dataHome.PostHotsTemp;\r\n this.endlessPostHot = true;\r\n }\r\n\r\n public mouseover(e: any){\r\n this.carouselID.stopAutoplay();\r\n }\r\n public mouseout(e: any){\r\n this.carouselID.startAutoplay();\r\n }\r\n\r\n public offBanner(){\r\n this.FlyinBanner = false;\r\n }\r\n\r\n public onClickTitlePost(id){\r\n this.router.navigate(['portal/post-list'], { queryParams: { title: id } });\r\n this.reloadPosts.emit(id);\r\n }\r\n \r\n\r\n}\r\n","module.exports = \".bg a>img {\\r\\n height: 40px;\\r\\n width: 50px;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\ndiv.bg a>span {\\r\\n color: white;\\r\\n position: absolute;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n margin: auto;\\r\\n left: 53px;\\r\\n font-size: 24px;\\r\\n font-family: 'Open Sans', sans-serif;\\r\\n ;\\r\\n font-weight: bold;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n}\\r\\n\\r\\n.bg {\\r\\n background-color: #006CB7;\\r\\n background-repeat: no-repeat;\\r\\n background-size: 100% 100%;\\r\\n width: 100%;\\r\\n height: 56px;\\r\\n position: absolute;\\r\\n}\\r\\n\\r\\n.login-container {\\r\\n height: 283px;\\r\\n margin-top: -10px !important;\\r\\n}\\r\\n\\r\\nbody {\\r\\n font-size: 50px;\\r\\n}\\r\\n\\r\\nsection {\\r\\n border: 0.5px solid #65656552;\\r\\n border-radius: 40px;\\r\\n position: fixed;\\r\\n height: 270px;\\r\\n max-width: 400px;\\r\\n top: 0;\\r\\n bottom: 0;\\r\\n right: 0;\\r\\n left: 0;\\r\\n margin: auto;\\r\\n background-color: #ffffff;\\r\\n color: black;\\r\\n padding: 0px 30px;\\r\\n margin-top: 193px;\\r\\n}\\r\\n\\r\\n/* input {\\r\\n border-bottom-color: whitesmoke;\\r\\n color: #FFFFFF;\\r\\n} */\\r\\n\\r\\n.login-button-container {\\r\\n margin-top: 20px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.login-button-container button {\\r\\n padding: 10px 20px;\\r\\n}\\r\\n\\r\\n.languages {\\r\\n position: relative;\\r\\n margin: -13px;\\r\\n top: 42px;\\r\\n background-color: inherit;\\r\\n}\\r\\n\\r\\n.fa-language {\\r\\n font-size: 30px;\\r\\n}\\r\\n\\r\\n.k-button.k-primary.k-outline {\\r\\n color: rgb(0, 38, 119);\\r\\n}\\r\\n\\r\\nfooter {\\r\\n display: none !important;\\r\\n}\\r\\n\\r\\n.btn-other .btn:hover {\\r\\n cursor: pointer;\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n.btn-other .btn {\\r\\n color: navy;\\r\\n text-decoration: underline;\\r\\n}\\r\\n\\r\\n.btn-other {\\r\\n margin-top: 20px;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL2xvZ2luLWFzay9sb2dpbi1hc2suY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLFlBQVk7SUFDWixXQUFXO0lBQ1gsTUFBTTtJQUNOLFNBQVM7SUFDVCxZQUFZO0lBQ1osa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixNQUFNO0lBQ04sU0FBUztJQUNULFlBQVk7SUFDWixVQUFVO0lBQ1YsZUFBZTtJQUNmLG9DQUFvQzs7SUFFcEMsaUJBQWlCO0lBQ2pCLDJCQUFtQjtJQUFuQix3QkFBbUI7SUFBbkIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1QiwwQkFBMEI7SUFDMUIsV0FBVztJQUNYLFlBQVk7SUFDWixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxhQUFhO0lBQ2IsNEJBQTRCO0FBQ2hDOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLDZCQUE2QjtJQUM3QixtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsT0FBTztJQUNQLFlBQVk7SUFDWix5QkFBeUI7SUFDekIsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQixpQkFBaUI7QUFDckI7O0FBR0E7OztHQUdHOztBQUVIO0lBQ0ksZ0JBQWdCO0lBQ2hCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsU0FBUztJQUNULHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSx3QkFBd0I7QUFDNUI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsY0FBYztBQUNsQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxnQkFBZ0I7QUFDcEIiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvbG9naW4tYXNrL2xvZ2luLWFzay5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmJnIGE+aW1nIHtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIHdpZHRoOiA1MHB4O1xyXG4gICAgdG9wOiAwO1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG59XHJcblxyXG5kaXYuYmcgYT5zcGFuIHtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHRvcDogMDtcclxuICAgIGJvdHRvbTogMDtcclxuICAgIG1hcmdpbjogYXV0bztcclxuICAgIGxlZnQ6IDUzcHg7XHJcbiAgICBmb250LXNpemU6IDI0cHg7XHJcbiAgICBmb250LWZhbWlseTogJ09wZW4gU2FucycsIHNhbnMtc2VyaWY7XHJcbiAgICA7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGhlaWdodDogZml0LWNvbnRlbnQ7XHJcbn1cclxuXHJcbi5iZyB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDU2cHg7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbn1cclxuXHJcbi5sb2dpbi1jb250YWluZXIge1xyXG4gICAgaGVpZ2h0OiAyODNweDtcclxuICAgIG1hcmdpbi10b3A6IC0xMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbmJvZHkge1xyXG4gICAgZm9udC1zaXplOiA1MHB4O1xyXG59XHJcblxyXG5zZWN0aW9uIHtcclxuICAgIGJvcmRlcjogMC41cHggc29saWQgIzY1NjU2NTUyO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNDBweDtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIGhlaWdodDogMjcwcHg7XHJcbiAgICBtYXgtd2lkdGg6IDQwMHB4O1xyXG4gICAgdG9wOiAwO1xyXG4gICAgYm90dG9tOiAwO1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgbWFyZ2luOiBhdXRvO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcclxuICAgIGNvbG9yOiBibGFjaztcclxuICAgIHBhZGRpbmc6IDBweCAzMHB4O1xyXG4gICAgbWFyZ2luLXRvcDogMTkzcHg7XHJcbn1cclxuXHJcblxyXG4vKiBpbnB1dCB7XHJcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB3aGl0ZXNtb2tlO1xyXG4gICAgY29sb3I6ICNGRkZGRkY7XHJcbn0gKi9cclxuXHJcbi5sb2dpbi1idXR0b24tY29udGFpbmVyIHtcclxuICAgIG1hcmdpbi10b3A6IDIwcHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbn1cclxuXHJcbi5sb2dpbi1idXR0b24tY29udGFpbmVyIGJ1dHRvbiB7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XHJcbn1cclxuXHJcbi5sYW5ndWFnZXMge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgbWFyZ2luOiAtMTNweDtcclxuICAgIHRvcDogNDJweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7XHJcbn1cclxuXHJcbi5mYS1sYW5ndWFnZSB7XHJcbiAgICBmb250LXNpemU6IDMwcHg7XHJcbn1cclxuXHJcbi5rLWJ1dHRvbi5rLXByaW1hcnkuay1vdXRsaW5lIHtcclxuICAgIGNvbG9yOiByZ2IoMCwgMzgsIDExOSk7XHJcbn1cclxuXHJcbmZvb3RlciB7XHJcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5idG4tb3RoZXIgLmJ0bjpob3ZlciB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxufVxyXG5cclxuLmJ0bi1vdGhlciAuYnRuIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XHJcbn1cclxuXHJcbi5idG4tb3RoZXIge1xyXG4gICAgbWFyZ2luLXRvcDogMjBweDtcclxufSJdfQ== */\"","module.exports = \"\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n{{ 'Login' | translate }} \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
Đăng ký tài khoản mới
\\r\\n
\\r\\n \\r\\n
\"","import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppComponent } from 'src/app/app.component';\r\nimport { AppService } from 'src/app/services/app.service';\r\nimport { AppLanguage } from 'src/app/services/app.language';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\n\r\n@Component({\r\n selector: 'app-login-ask',\r\n templateUrl: './login-ask.component.html',\r\n styleUrls: ['./login-ask.component.css']\r\n})\r\nexport class LoginAskComponent implements OnInit {\r\n\r\n @Input() urlPath = '';\r\n @Output() loginSuccess = new EventEmitter();\r\n\r\n loginInfo = {\r\n UserName: '',\r\n Password: ''\r\n };\r\n dataRequest = {\r\n UserName: '',\r\n Password: ''\r\n };\r\n languageName = '';\r\n\r\n searchOption = {\r\n UrlPath: ''\r\n };\r\n\r\n languages: Array = [{\r\n id: 0,\r\n culture: 'vi-VN',\r\n text: 'Tiếng Việt',\r\n click: (dataItem) => {\r\n this.onChangeLanguage(dataItem);\r\n }\r\n }, {\r\n id: 1,\r\n culture: 'en-US',\r\n text: 'English',\r\n click: (dataItem) => {\r\n this.onChangeLanguage(dataItem);\r\n }\r\n }];\r\n\r\n constructor(\r\n private router: Router,\r\n private authenticationService: AuthenticationService,\r\n private appService: AppService,\r\n private appComponent: AppComponent,\r\n private language: AppLanguage,\r\n private activatedRoute: ActivatedRoute,\r\n private appSwal: AppSwal\r\n ) {\r\n // this.activatedRoute.queryParams.subscribe((params: any) => {\r\n // if (params && params.menuID) {\r\n // this.searchOption.MenuID = params.menuID;\r\n // }\r\n // });\r\n this.getLanguageName();\r\n }\r\n\r\n ngOnInit() {\r\n this.searchOption.UrlPath = this.urlPath;\r\n }\r\n\r\n // async onLogin() {\r\n // this.appComponent.loading = true;\r\n // const result = await this.authenticationService.doSignIn(this.loginInfo.UserName, this.loginInfo.Password);\r\n // if (result.Status === 1) {\r\n // this.router.navigate(['portal/comment-list']);\r\n // } else {\r\n // this.appSwal.showWarning(result.Msg, false);\r\n // }\r\n // this.appComponent.loading = false;\r\n // }\r\n\r\n async onLogin() {\r\n this.appComponent.loading = true;\r\n const result = await this.appService.doPOST(\"api/LoginAsk/doLogin\", this.dataRequest);\r\n if (result.Status === 1) {\r\n const accountInfo = {\r\n UserName: this.dataRequest.UserName,\r\n FullName: result.Data\r\n };\r\n localStorage.setItem('accountInfoPortal', JSON.stringify(accountInfo));\r\n this.loginSuccess.emit();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n AddNew(){\r\n this.router.navigate(['portal/create-account'], { queryParams: { title: this.searchOption.UrlPath } });\r\n }\r\n\r\n ChangePass(){\r\n this.router.navigate(['portal/change-account-password']);\r\n }\r\n\r\n onChangeLanguage(dataItem) {\r\n this.appComponent.switchLanguage(dataItem.culture);\r\n this.getLanguageName();\r\n }\r\n\r\n getLanguageName() {\r\n let lang = this.language.get();\r\n if (!lang) {\r\n lang = 'vi-VN';\r\n this.appComponent.switchLanguage(lang);\r\n }\r\n const language = this.languages.find(item => {\r\n return item.culture === lang;\r\n });\r\n\r\n if (language) { this.languageName = language.text; }\r\n }\r\n\r\n onKeyPress(e: any) {\r\n if (e.keyCode === 13) {\r\n this.onLogin();\r\n }\r\n }\r\n}\r\n","module.exports = \".k-grid {\\r\\n color: navy;\\r\\n background-color: #fff;\\r\\n}\\r\\n\\r\\n.title-color-grid {\\r\\n color: navy;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.descrip-color-grid {\\r\\n /* color: rgb(10, 154, 190); */\\r\\n color: blue\\r\\n}\\r\\n\\r\\n.member-color-grid {\\r\\n color: rgb(146, 23, 23);\\r\\n}\\r\\n\\r\\n.k-grid-content {\\r\\n overflow: hidden !important;\\r\\n}\\r\\n\\r\\n.td-border {\\r\\n border-top: 1px solid;\\r\\n}\\r\\n\\r\\npre {\\r\\n font-family: \\\"Times New Roman\\\", sans-serif;\\r\\n white-space: pre-wrap;\\r\\n margin-bottom: 0;\\r\\n color: navy;\\r\\n font-size: 12px;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL21lZXRpbmctd2Vlay1ncmlkL21lZXRpbmctd2Vlay1ncmlkLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxXQUFXO0lBQ1gsc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLDhCQUE4QjtJQUM5QjtBQUNKOztBQUVBO0lBQ0ksdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksMkJBQTJCO0FBQy9COztBQUVBO0lBQ0kscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0ksMENBQTBDO0lBQzFDLHFCQUFxQjtJQUNyQixnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLGVBQWU7QUFDbkIiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvbWVldGluZy13ZWVrLWdyaWQvbWVldGluZy13ZWVrLWdyaWQuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5rLWdyaWQge1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xyXG59XHJcblxyXG4udGl0bGUtY29sb3ItZ3JpZCB7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4uZGVzY3JpcC1jb2xvci1ncmlkIHtcclxuICAgIC8qIGNvbG9yOiByZ2IoMTAsIDE1NCwgMTkwKTsgKi9cclxuICAgIGNvbG9yOiBibHVlXHJcbn1cclxuXHJcbi5tZW1iZXItY29sb3ItZ3JpZCB7XHJcbiAgICBjb2xvcjogcmdiKDE0NiwgMjMsIDIzKTtcclxufVxyXG5cclxuLmstZ3JpZC1jb250ZW50IHtcclxuICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcclxufVxyXG5cclxuLnRkLWJvcmRlciB7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQ7XHJcbn1cclxuXHJcbnByZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIiwgc2Fucy1zZXJpZjtcclxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcclxuICAgIG1hcmdpbi1ib3R0b206IDA7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIGZvbnQtc2l6ZTogMTJweDtcclxufSJdfQ== */\"","module.exports = \"\\r\\n \\r\\n \\r\\n \\r\\n
{{dataItem.DayName}}
\\r\\n
{{dataItem.StartAtRp | date:'dd/MM/yyyy'}}
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
{{dataItem.DayHour}}
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
{{dataItem.Name}}
\\r\\n
\\r\\n
Chủ trì: {{dataItem.ShowAdmin}}
\\r\\n
TP: {{dataItem.ShowMembers}}
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
{{dataItem.RoomMeetingName}}
\\r\\n
\\r\\n \\r\\n \\r\\n \"","import { Component, OnInit, Input } from '@angular/core';\r\nimport { GridDataResult } from '@progress/kendo-angular-grid';\r\n\r\n@Component({\r\n selector: 'app-meeting-week-grid',\r\n templateUrl: './meeting-week-grid.component.html',\r\n styleUrls: ['./meeting-week-grid.component.css']\r\n})\r\nexport class MeetingWeekGridComponent implements OnInit {\r\n\r\n @Input() data: GridDataResult;\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","module.exports = \".img-grid {\\r\\n width: 30px;\\r\\n height: 24px;\\r\\n margin-right: 20px;\\r\\n}\\r\\n\\r\\n.img-grid:hover,\\r\\n.img-slide:hover {\\r\\n border: 1px solid #006CB7;\\r\\n}\\r\\n\\r\\n.img-grid:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.img-slide {\\r\\n width: 30px;\\r\\n height: 24px;\\r\\n margin-right: 20px;\\r\\n}\\r\\n\\r\\n.img-slide:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n::ng-deep .no-indicators .carousel-indicators {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n/* grid image */\\r\\n\\r\\n.img-detail-small {\\r\\n height: 170px;\\r\\n background-size: cover;\\r\\n background-repeat: no-repeat;\\r\\n background-position: center center;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.img-detail-medium {\\r\\n height: 225px;\\r\\n background-size: cover;\\r\\n background-repeat: no-repeat;\\r\\n background-position: center center;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.img-detail-large {\\r\\n height: 280px;\\r\\n background-size: contain;\\r\\n background-repeat: no-repeat;\\r\\n background-position: center center;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n/* @media only screen and (min-width: 768px) {\\r\\n .no-pl-fist-line {\\r\\n padding-right: 0px;\\r\\n }\\r\\n .no-pl-second-line {\\r\\n padding-right: 0px;\\r\\n padding-left: 0px;\\r\\n }\\r\\n} */\\r\\n\\r\\n/* image grid */\\r\\n\\r\\n.row {\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n padding: 0 4px;\\r\\n}\\r\\n\\r\\n/* Create four equal columns that sits next to each other */\\r\\n\\r\\n.column {\\r\\n flex: 25%;\\r\\n max-width: 25%;\\r\\n padding: 0 4px;\\r\\n}\\r\\n\\r\\n.column img {\\r\\n margin-top: 8px;\\r\\n vertical-align: middle;\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n/* Responsive layout - makes a two column-layout instead of four columns */\\r\\n\\r\\n@media screen and (max-width: 800px) {\\r\\n .column {\\r\\n flex: 50%;\\r\\n max-width: 50%;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Responsive layout - makes the two columns stack on top of each other instead of next to each other */\\r\\n\\r\\n@media screen and (max-width: 600px) {\\r\\n .column {\\r\\n flex: 100%;\\r\\n max-width: 100%;\\r\\n }\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL211bHRpbWVkaWEvbXVsdGltZWRpYS5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksV0FBVztJQUNYLFlBQVk7SUFDWixrQkFBa0I7QUFDdEI7O0FBRUE7O0lBRUkseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBR0EsZUFBZTs7QUFFZjtJQUNJLGFBQWE7SUFDYixzQkFBc0I7SUFDdEIsNEJBQTRCO0lBQzVCLGtDQUFrQztJQUNsQyxtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxhQUFhO0lBQ2Isc0JBQXNCO0lBQ3RCLDRCQUE0QjtJQUM1QixrQ0FBa0M7SUFDbEMsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLHdCQUF3QjtJQUN4Qiw0QkFBNEI7SUFDNUIsa0NBQWtDO0lBQ2xDLG1CQUFtQjtBQUN2Qjs7QUFHQTs7Ozs7Ozs7R0FRRzs7QUFHSCxlQUFlOztBQUVmO0lBQ0ksYUFBYTtJQUNiLGVBQWU7SUFDZixjQUFjO0FBQ2xCOztBQUdBLDJEQUEyRDs7QUFFM0Q7SUFDSSxTQUFTO0lBQ1QsY0FBYztJQUNkLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxlQUFlO0lBQ2Ysc0JBQXNCO0lBQ3RCLFdBQVc7QUFDZjs7QUFHQSwwRUFBMEU7O0FBRTFFO0lBQ0k7UUFDSSxTQUFTO1FBQ1QsY0FBYztJQUNsQjtBQUNKOztBQUdBLHVHQUF1Rzs7QUFFdkc7SUFDSTtRQUNJLFVBQVU7UUFDVixlQUFlO0lBQ25CO0FBQ0oiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvbXVsdGltZWRpYS9tdWx0aW1lZGlhLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuaW1nLWdyaWQge1xyXG4gICAgd2lkdGg6IDMwcHg7XHJcbiAgICBoZWlnaHQ6IDI0cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XHJcbn1cclxuXHJcbi5pbWctZ3JpZDpob3ZlcixcclxuLmltZy1zbGlkZTpob3ZlciB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjMDA2Q0I3O1xyXG59XHJcblxyXG4uaW1nLWdyaWQ6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4uaW1nLXNsaWRlIHtcclxuICAgIHdpZHRoOiAzMHB4O1xyXG4gICAgaGVpZ2h0OiAyNHB4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAyMHB4O1xyXG59XHJcblxyXG4uaW1nLXNsaWRlOmhvdmVyIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuOjpuZy1kZWVwIC5uby1pbmRpY2F0b3JzIC5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcblxyXG4vKiBncmlkIGltYWdlICovXHJcblxyXG4uaW1nLWRldGFpbC1zbWFsbCB7XHJcbiAgICBoZWlnaHQ6IDE3MHB4O1xyXG4gICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcclxuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XHJcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxufVxyXG5cclxuLmltZy1kZXRhaWwtbWVkaXVtIHtcclxuICAgIGhlaWdodDogMjI1cHg7XHJcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG59XHJcblxyXG4uaW1nLWRldGFpbC1sYXJnZSB7XHJcbiAgICBoZWlnaHQ6IDI4MHB4O1xyXG4gICAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG59XHJcblxyXG5cclxuLyogQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkge1xyXG4gICAgLm5vLXBsLWZpc3QtbGluZSB7XHJcbiAgICAgICAgcGFkZGluZy1yaWdodDogMHB4O1xyXG4gICAgfVxyXG4gICAgLm5vLXBsLXNlY29uZC1saW5lIHtcclxuICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7XHJcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAwcHg7XHJcbiAgICB9XHJcbn0gKi9cclxuXHJcblxyXG4vKiBpbWFnZSBncmlkICovXHJcblxyXG4ucm93IHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LXdyYXA6IHdyYXA7XHJcbiAgICBwYWRkaW5nOiAwIDRweDtcclxufVxyXG5cclxuXHJcbi8qIENyZWF0ZSBmb3VyIGVxdWFsIGNvbHVtbnMgdGhhdCBzaXRzIG5leHQgdG8gZWFjaCBvdGhlciAqL1xyXG5cclxuLmNvbHVtbiB7XHJcbiAgICBmbGV4OiAyNSU7XHJcbiAgICBtYXgtd2lkdGg6IDI1JTtcclxuICAgIHBhZGRpbmc6IDAgNHB4O1xyXG59XHJcblxyXG4uY29sdW1uIGltZyB7XHJcbiAgICBtYXJnaW4tdG9wOiA4cHg7XHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcblxyXG4vKiBSZXNwb25zaXZlIGxheW91dCAtIG1ha2VzIGEgdHdvIGNvbHVtbi1sYXlvdXQgaW5zdGVhZCBvZiBmb3VyIGNvbHVtbnMgKi9cclxuXHJcbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDgwMHB4KSB7XHJcbiAgICAuY29sdW1uIHtcclxuICAgICAgICBmbGV4OiA1MCU7XHJcbiAgICAgICAgbWF4LXdpZHRoOiA1MCU7XHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG4vKiBSZXNwb25zaXZlIGxheW91dCAtIG1ha2VzIHRoZSB0d28gY29sdW1ucyBzdGFjayBvbiB0b3Agb2YgZWFjaCBvdGhlciBpbnN0ZWFkIG9mIG5leHQgdG8gZWFjaCBvdGhlciAqL1xyXG5cclxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjAwcHgpIHtcclxuICAgIC5jb2x1bW4ge1xyXG4gICAgICAgIGZsZXg6IDEwMCU7XHJcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG59Il19 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \"","import { Component, OnInit, HostListener } from '@angular/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\n\r\n@Component({\r\n selector: 'app-multimedia',\r\n templateUrl: './multimedia.component.html',\r\n styleUrls: ['./multimedia.component.css']\r\n})\r\nexport class MultimediaComponent implements OnInit {\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n constructor (\r\n public appService: AppService,\r\n private route: ActivatedRoute,\r\n private appControls: AppControls\r\n ) { }\r\n\r\nimagesGrid: any;\r\nimagesSlide: any;\r\nvideos: any;\r\n\r\nisImagePage: boolean;\r\n\r\nsrcGrid = '../assets/images/icon-grid-active.png';\r\nsrcSlide = '../assets/images/icon-slide-inactive.png';\r\n\r\nmenuID;\r\n\r\nisGridMode = true;\r\npageName: any;\r\n\r\nngOnInit() {\r\n this.menuID = this.route.snapshot.queryParamMap.get('menuID');\r\n\r\n this.isImagePage = true;\r\n this.getImages();\r\n this.getMenuName();\r\n}\r\n\r\nasync getMenuName() {\r\n const dataRequest = {\r\n id: this.menuID,\r\n };\r\n const result = await this.appService.doGET('api/Menu', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.pageName = result.Data.Name;\r\n }\r\n}\r\n\r\nimgGridClicked() {\r\n this.srcGrid = '../assets/images/icon-grid-active.png';\r\n this.srcSlide = '../assets/images/icon-slide-inactive.png';\r\n\r\n this.isGridMode = true;\r\n}\r\nimgSlideClicked() {\r\n this.srcGrid = '../assets/images/icon-grid-inactive.png';\r\n this.srcSlide = '../assets/images/icon-slide-active.png';\r\n\r\n this.isGridMode = false;\r\n}\r\n\r\nasync getImages() {\r\n const dataRequest = {\r\n menuID: this.menuID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/Image', dataRequest);\r\n if (result) {\r\n this.imagesGrid = result.Data.SlideViewData;\r\n this.imagesSlide = result.Data.SlideViewData;\r\n }\r\n}\r\n\r\nasync getVideos() {\r\n const dataRequest = {\r\n menuID: this.menuID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/Video', dataRequest);\r\n if (result) {\r\n this.videos = result.Data;\r\n }\r\n}\r\n\r\n}\r\n","module.exports = \".titleBottom {\\r\\n padding-top: 10px;\\r\\n padding-bottom: 10px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 10px;\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.txtCountSearchCmt {\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n font-weight: bold;\\r\\n /* margin-bottom: 20px; */\\r\\n margin-top: 30px;\\r\\n}\\r\\n\\r\\n.itemRow {\\r\\n padding-top: 20px;\\r\\n padding-bottom: 20px;\\r\\n}\\r\\n\\r\\n.titleSearchPage {\\r\\n margin-top: 30px;\\r\\n margin-bottom: 20px !important;\\r\\n font-size: 18px;\\r\\n color: black !important;\\r\\n}\\r\\n\\r\\n.label {\\r\\n font-size: 16px;\\r\\n font-weight: bold;\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.content {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.img-logo {\\r\\n width: 100%;\\r\\n /* height: 166px; */\\r\\n}\\r\\n\\r\\n.post-item {\\r\\n align-self: center;\\r\\n font-weight: 500;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.post-item .title:hover {\\r\\n color: #006CB7 !important;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.post-item .title1:hover {\\r\\n color: #006CB7 !important;\\r\\n cursor: pointer;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.post-item .title {\\r\\n /* height: 22px; */\\r\\n /* white-space: nowrap; */\\r\\n /* overflow: hidden; */\\r\\n /* text-overflow: ellipsis; */\\r\\n padding-left: 30px;\\r\\n color: #006CB7;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\n.post-item .title1 {\\r\\n font-size: 16px;\\r\\n /* white-space: nowrap; */\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n /* margin-top: 10px; */\\r\\n max-height: 70px;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n padding: 0px !important;\\r\\n}\\r\\n\\r\\n.nld-title {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.nld-title:hover {\\r\\n cursor: pointer;\\r\\n color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n.post-item .summaray {\\r\\n /* margin-top: 10px; */\\r\\n font-size: 13px;\\r\\n overflow: hidden;\\r\\n text-overflow: inherit;\\r\\n max-height: 96px;\\r\\n color: navy;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n}\\r\\n\\r\\n.post-item .summaray:hover {\\r\\n cursor: pointer;\\r\\n color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n.group-body-item {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n height: 130px;\\r\\n}\\r\\n\\r\\n.group-body-item-none-bg {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n}\\r\\n\\r\\n.group-body-item:hover,\\r\\n.group-body-item-none-bg :hover {\\r\\n color: #006CB7;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.portal .group-body-2 {\\r\\n background-color: #F5F5F5;\\r\\n padding: 10px 20px;\\r\\n}\\r\\n\\r\\n.k-dropdown .k-dropdown-wrap:hover,\\r\\n.k-dropdowntree .k-dropdown-wrap:hover,\\r\\n.k-dropdown .k-dropdown-wrap.k-state-hover,\\r\\n.k-dropdowntree .k-dropdown-wrap.k-state-hover {\\r\\n color: navy !important;\\r\\n}\\r\\n\\r\\n.post-item .summaray1 {\\r\\n padding: 0px !important;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL25sZG5ld3MvbmxkbmV3cy5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQiw4QkFBOEI7SUFDOUIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixZQUFZO0lBQ1osbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFlBQVk7SUFDWixpQkFBaUI7SUFDakIseUJBQXlCO0lBQ3pCLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7QUFDeEI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsOEJBQThCO0lBQzlCLGVBQWU7SUFDZix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLFlBQVk7QUFDaEI7O0FBRUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksV0FBVztJQUNYLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsZUFBZTtJQUNmLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIseUJBQXlCO0lBQ3pCLHNCQUFzQjtJQUN0Qiw2QkFBNkI7SUFDN0Isa0JBQWtCO0lBQ2xCLGNBQWM7SUFDZCxlQUFlO0FBQ25COztBQUVBO0lBQ0ksZUFBZTtJQUNmLHlCQUF5QjtJQUN6QixnQkFBZ0I7SUFDaEIsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsMkJBQW1CO0lBQW5CLHdCQUFtQjtJQUFuQixtQkFBbUI7SUFDbkIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksV0FBVztBQUNmOztBQUVBO0lBQ0ksZUFBZTtJQUNmLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLHNCQUFzQjtJQUN0QixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLDJCQUFtQjtJQUFuQix3QkFBbUI7SUFBbkIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLG9CQUFvQjtJQUNwQixpQkFBaUI7SUFDakIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLG9CQUFvQjtJQUNwQixpQkFBaUI7QUFDckI7O0FBRUE7O0lBRUksY0FBYztJQUNkLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsa0JBQWtCO0FBQ3RCOztBQUVBOzs7O0lBSUksc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksdUJBQXVCO0FBQzNCIiwiZmlsZSI6InNyYy9hcHAvcG9ydGFsL25sZG5ld3MvbmxkbmV3cy5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnRpdGxlQm90dG9tIHtcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDZDQjc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xyXG59XHJcblxyXG4udHh0Q291bnRTZWFyY2hDbXQge1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY29sb3I6IGJsYWNrO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAvKiBtYXJnaW4tYm90dG9tOiAyMHB4OyAqL1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxufVxyXG5cclxuLml0ZW1Sb3cge1xyXG4gICAgcGFkZGluZy10b3A6IDIwcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMjBweDtcclxufVxyXG5cclxuLnRpdGxlU2VhcmNoUGFnZSB7XHJcbiAgICBtYXJnaW4tdG9wOiAzMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweCAhaW1wb3J0YW50O1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG4gICAgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5sYWJlbCB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGNvbG9yOiBibGFjaztcclxufVxyXG5cclxuLmNvbnRlbnQge1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG59XHJcblxyXG4uaW1nLWxvZ28ge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICAvKiBoZWlnaHQ6IDE2NnB4OyAqL1xyXG59XHJcblxyXG4ucG9zdC1pdGVtIHtcclxuICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcclxuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG59XHJcblxyXG4ucG9zdC1pdGVtIC50aXRsZTpob3ZlciB7XHJcbiAgICBjb2xvcjogIzAwNkNCNyAhaW1wb3J0YW50O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4ucG9zdC1pdGVtIC50aXRsZTE6aG92ZXIge1xyXG4gICAgY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxufVxyXG5cclxuLnBvc3QtaXRlbSAudGl0bGUge1xyXG4gICAgLyogaGVpZ2h0OiAyMnB4OyAqL1xyXG4gICAgLyogd2hpdGUtc3BhY2U6IG5vd3JhcDsgKi9cclxuICAgIC8qIG92ZXJmbG93OiBoaWRkZW47ICovXHJcbiAgICAvKiB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgKi9cclxuICAgIHBhZGRpbmctbGVmdDogMzBweDtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG59XHJcblxyXG4ucG9zdC1pdGVtIC50aXRsZTEge1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgLyogd2hpdGUtc3BhY2U6IG5vd3JhcDsgKi9cclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICAgIC8qIG1hcmdpbi10b3A6IDEwcHg7ICovXHJcbiAgICBtYXgtaGVpZ2h0OiA3MHB4O1xyXG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcclxuICAgIHBhZGRpbmc6IDBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ubmxkLXRpdGxlIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4ubmxkLXRpdGxlOmhvdmVyIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGNvbG9yOiAjMDA2Q0I3ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5wb3N0LWl0ZW0gLnN1bW1hcmF5IHtcclxuICAgIC8qIG1hcmdpbi10b3A6IDEwcHg7ICovXHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgdGV4dC1vdmVyZmxvdzogaW5oZXJpdDtcclxuICAgIG1heC1oZWlnaHQ6IDk2cHg7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIGhlaWdodDogZml0LWNvbnRlbnQ7XHJcbn1cclxuXHJcbi5wb3N0LWl0ZW0gLnN1bW1hcmF5OmhvdmVyIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGNvbG9yOiAjMDA2Q0I3ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5ncm91cC1ib2R5LWl0ZW0ge1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcclxuICAgIGhlaWdodDogMTMwcHg7XHJcbn1cclxuXHJcbi5ncm91cC1ib2R5LWl0ZW0tbm9uZS1iZyB7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG59XHJcblxyXG4uZ3JvdXAtYm9keS1pdGVtOmhvdmVyLFxyXG4uZ3JvdXAtYm9keS1pdGVtLW5vbmUtYmcgOmhvdmVyIHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4ucG9ydGFsIC5ncm91cC1ib2R5LTIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjVGNTtcclxuICAgIHBhZGRpbmc6IDEwcHggMjBweDtcclxufVxyXG5cclxuLmstZHJvcGRvd24gLmstZHJvcGRvd24td3JhcDpob3ZlcixcclxuLmstZHJvcGRvd250cmVlIC5rLWRyb3Bkb3duLXdyYXA6aG92ZXIsXHJcbi5rLWRyb3Bkb3duIC5rLWRyb3Bkb3duLXdyYXAuay1zdGF0ZS1ob3ZlcixcclxuLmstZHJvcGRvd250cmVlIC5rLWRyb3Bkb3duLXdyYXAuay1zdGF0ZS1ob3ZlciB7XHJcbiAgICBjb2xvcjogbmF2eSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ucG9zdC1pdGVtIC5zdW1tYXJheTEge1xyXG4gICAgcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
Không có nội dung nào được hiển thị\\r\\n
\\r\\n
\\r\\n Số Bài Viết Hiển Thị:\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ActivatedRoute, Router, NavigationEnd } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-nldnews',\r\n templateUrl: './nldnews.component.html',\r\n styleUrls: ['./nldnews.component.css']\r\n})\r\nexport class NLDNewsComponent implements OnInit {\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router\r\n ) {\r\n this.getNewsNLD(5);\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n NLDNews: any = [];\r\n nld: any = [];\r\n sanitizedUrl;\r\n public numPost = [5, 10, 15, 20, 25, 30];\r\n public selectedItem = this.numPost[0];\r\n\r\n sanitize(url: string) {\r\n return this.domSanitizer.bypassSecurityTrustUrl(url);\r\n }\r\n\r\n async getNewsNLD(num: any) {\r\n this.NLDNews = [];\r\n this.nld = [];\r\n const result = await this.appService.doGET('api/NLDNews/getNews', null);\r\n if (result && result.Status === 1) {\r\n var count = 0;\r\n for (let data of result.Data) {\r\n this.nld.push(data);\r\n count = count + 1;\r\n if (count == num) {\r\n break;\r\n }\r\n }\r\n this.NLDNews = this.nld;\r\n }\r\n }\r\n\r\n public selectionChange(value: any){\r\n this.getNewsNLD(value);\r\n }\r\n\r\n}\r\n","module.exports = \"\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzcmMvYXBwL3BvcnRhbC9vZmZpY2UtZHJ0Mi9vZmZpY2UtZHJ0Mi5jb21wb25lbnQuY3NzIn0= */\"","module.exports = \" \"","import { Component, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-office-drt2',\r\n templateUrl: './office-drt2.component.html',\r\n styleUrls: ['./office-drt2.component.css']\r\n})\r\nexport class OfficeDrt2Component implements OnInit {\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","module.exports = \".hr-style {\\r\\n border: 1px solid blue;\\r\\n}\\r\\n\\r\\n.org-chart {\\r\\n margin-top: auto;\\r\\n}\\r\\n\\r\\n.org-rotate-chart {\\r\\n transform: rotate(270deg) !important;\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.dialog-style {\\r\\n margin: 0 auto;\\r\\n text-align: center;\\r\\n font-size: 16px;\\r\\n padding: 20px;\\r\\n}\\r\\n\\r\\n.detail .avatar {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.detail .avatar img {\\r\\n width: 190px;\\r\\n height: 220px;\\r\\n}\\r\\n\\r\\n.detail .label {\\r\\n color: navy;\\r\\n font-weight: 500;\\r\\n}\\r\\n\\r\\n.org-chart-containerx{\\r\\n width: 100% !important;\\r\\n overflow-x: auto;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .mui-oc-name {\\r\\n min-height: 35px;\\r\\n padding-top: 7px;\\r\\n padding-bottom: 7px;\\r\\n padding-left: 5px;\\r\\n padding-right: 5px;\\r\\n white-space: break-spaces;\\r\\n }\\r\\n\\r\\n:host ::ng-deep .mui-oc-border {\\r\\n background-color: #007FFF;\\r\\n }\\r\\n\\r\\n:host ::ng-deep .mui-oc-box {\\r\\n color: #007FFF;\\r\\n width: 308px;\\r\\n background-color: #FFF2CC;\\r\\n margin-top: 10px;\\r\\n margin-bottom: 10px;\\r\\n font-weight: bolder;\\r\\n min-height: 40px;\\r\\n }\\r\\n\\r\\n.mainchart{\\r\\n border: 1px black;\\r\\n background-color: cornsilk;\\r\\n }\\r\\n\\r\\n:host ::ng-deep .mui-oc-connector-horizontal {\\r\\n height: 1px;\\r\\n background-color: #007FFF;\\r\\n width: 20px;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .mui-oc-box {\\r\\n display: block !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .mui-oc-connector-container-horizontal {\\r\\n width: 1px;\\r\\n}\\r\\n\\r\\n/* :host ::ng-deep .mui-oc-connector-container-vertical {\\r\\n width: 3px;\\r\\n height: 3px;\\r\\n background-color: blue;\\r\\n} \\r\\n:host ::ng-deep .mui-oc-connector-container {\\r\\n background-color: blue;\\r\\n} */\\r\\n\\r\\n.mui-oc-connector-container-horizontal {\\r\\n width: 3px;\\r\\n height: 3px;\\r\\n background-color: #007FFF;\\r\\n}\\r\\n\\r\\n.mui-oc-connector-container-vertical {\\r\\n width: 3px;\\r\\n height: 3px;\\r\\n background-color: #007FFF;\\r\\n}\\r\\n\\r\\n:host ::ng-deep div[style] {\\r\\n background-color: white !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .topCss {\\r\\n background-color: #FFD966 !important;\\r\\n width: 180px !important;\\r\\n height: 160px !important;\\r\\n padding-top: 50px !important;\\r\\n padding-bottom: 50px !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .firstSub {\\r\\n background-image: linear-gradient(#FFCD28, #FFA500) !important;\\r\\n color: white !important;\\r\\n width: 200px !important;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .secondSub {\\r\\n background-image: linear-gradient(#FFF2CC, #FFD966) !important;\\r\\n}\\r\\n\\r\\n\\r\\n\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL29yZ2FuaXphdGlvbi9vcmdhbml6ZS1jaGFydC9vcmdhbml6ZS1jaGFydC5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksb0NBQW9DO0lBQ3BDLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osYUFBYTtBQUNqQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxzQkFBc0I7SUFDdEIsZ0JBQWdCO0FBQ3BCOztBQUdFO0lBQ0UsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQix5QkFBeUI7RUFDM0I7O0FBRUE7SUFDRSx5QkFBeUI7RUFDM0I7O0FBRUE7SUFDRSxjQUFjO0lBQ2QsWUFBWTtJQUNaLHlCQUF5QjtJQUN6QixnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixnQkFBZ0I7RUFDbEI7O0FBRUE7TUFDSSxpQkFBaUI7TUFDakIsMEJBQTBCO0VBQzlCOztBQUVDO0lBQ0MsV0FBVztJQUNYLHlCQUF5QjtJQUN6QixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSx5QkFBeUI7QUFDN0I7O0FBRUE7SUFDSSxVQUFVO0FBQ2Q7O0FBSUE7Ozs7Ozs7SUFPSTs7QUFHSjtJQUNJLFVBQVU7SUFDVixXQUFXO0lBQ1gseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksVUFBVTtJQUNWLFdBQVc7SUFDWCx5QkFBeUI7QUFDN0I7O0FBQ0E7SUFDSSxrQ0FBa0M7QUFDdEM7O0FBRUE7SUFDSSxvQ0FBb0M7SUFDcEMsdUJBQXVCO0lBQ3ZCLHdCQUF3QjtJQUN4Qiw0QkFBNEI7SUFDNUIsK0JBQStCO0FBQ25DOztBQUlBO0lBQ0ksOERBQThEO0lBQzlELHVCQUF1QjtJQUN2Qix1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSw4REFBOEQ7QUFDbEUiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvb3JnYW5pemF0aW9uL29yZ2FuaXplLWNoYXJ0L29yZ2FuaXplLWNoYXJ0LmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuaHItc3R5bGUge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgYmx1ZTtcclxufVxyXG5cclxuLm9yZy1jaGFydCB7XHJcbiAgICBtYXJnaW4tdG9wOiBhdXRvO1xyXG59XHJcblxyXG4ub3JnLXJvdGF0ZS1jaGFydCB7XHJcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpICFpbXBvcnRhbnQ7XHJcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XHJcbn1cclxuXHJcbi5kaWFsb2ctc3R5bGUge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBwYWRkaW5nOiAyMHB4O1xyXG59XHJcblxyXG4uZGV0YWlsIC5hdmF0YXIge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG4uZGV0YWlsIC5hdmF0YXIgaW1nIHtcclxuICAgIHdpZHRoOiAxOTBweDtcclxuICAgIGhlaWdodDogMjIwcHg7XHJcbn1cclxuXHJcbi5kZXRhaWwgLmxhYmVsIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcclxufVxyXG5cclxuLm9yZy1jaGFydC1jb250YWluZXJ4e1xyXG4gICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcclxuICAgIG92ZXJmbG93LXg6IGF1dG87XHJcbn1cclxuXHJcbiAgXHJcbiAgOmhvc3QgOjpuZy1kZWVwIC5tdWktb2MtbmFtZSB7XHJcbiAgICBtaW4taGVpZ2h0OiAzNXB4O1xyXG4gICAgcGFkZGluZy10b3A6IDdweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiA3cHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDVweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDVweDtcclxuICAgIHdoaXRlLXNwYWNlOiBicmVhay1zcGFjZXM7XHJcbiAgfVxyXG5cclxuICA6aG9zdCA6Om5nLWRlZXAgLm11aS1vYy1ib3JkZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwN0ZGRjtcclxuICB9XHJcbiAgXHJcbiAgOmhvc3QgOjpuZy1kZWVwIC5tdWktb2MtYm94IHtcclxuICAgIGNvbG9yOiAjMDA3RkZGO1xyXG4gICAgd2lkdGg6IDMwOHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRjJDQztcclxuICAgIG1hcmdpbi10b3A6IDEwcHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcclxuICAgIG1pbi1oZWlnaHQ6IDQwcHg7XHJcbiAgfVxyXG4gIFxyXG4gIC5tYWluY2hhcnR7XHJcbiAgICAgIGJvcmRlcjogMXB4IGJsYWNrO1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBjb3Juc2lsaztcclxuICB9XHJcblxyXG4gICA6aG9zdCA6Om5nLWRlZXAgLm11aS1vYy1jb25uZWN0b3ItaG9yaXpvbnRhbCB7XHJcbiAgICBoZWlnaHQ6IDFweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDdGRkY7XHJcbiAgICB3aWR0aDogMjBweDtcclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5tdWktb2MtYm94IHtcclxuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbjpob3N0IDo6bmctZGVlcCAubXVpLW9jLWNvbm5lY3Rvci1jb250YWluZXItaG9yaXpvbnRhbCB7XHJcbiAgICB3aWR0aDogMXB4O1xyXG59IFxyXG5cclxuXHJcblxyXG4vKiA6aG9zdCA6Om5nLWRlZXAgLm11aS1vYy1jb25uZWN0b3ItY29udGFpbmVyLXZlcnRpY2FsIHtcclxuICAgIHdpZHRoOiAzcHg7XHJcbiAgICBoZWlnaHQ6IDNweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IGJsdWU7XHJcbn0gXHJcbjpob3N0IDo6bmctZGVlcCAubXVpLW9jLWNvbm5lY3Rvci1jb250YWluZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogYmx1ZTtcclxufSAgKi9cclxuXHJcblxyXG4ubXVpLW9jLWNvbm5lY3Rvci1jb250YWluZXItaG9yaXpvbnRhbCB7XHJcbiAgICB3aWR0aDogM3B4O1xyXG4gICAgaGVpZ2h0OiAzcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA3RkZGO1xyXG59XHJcblxyXG4ubXVpLW9jLWNvbm5lY3Rvci1jb250YWluZXItdmVydGljYWwge1xyXG4gICAgd2lkdGg6IDNweDtcclxuICAgIGhlaWdodDogM3B4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwN0ZGRjtcclxufVxyXG46aG9zdCA6Om5nLWRlZXAgZGl2W3N0eWxlXSB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnRvcENzcyB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZEOTY2ICFpbXBvcnRhbnQ7XHJcbiAgICB3aWR0aDogMTgwcHggIWltcG9ydGFudDtcclxuICAgIGhlaWdodDogMTYwcHggIWltcG9ydGFudDtcclxuICAgIHBhZGRpbmctdG9wOiA1MHB4ICFpbXBvcnRhbnQ7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogNTBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG5cclxuXHJcbjpob3N0IDo6bmctZGVlcCAuZmlyc3RTdWIge1xyXG4gICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KCNGRkNEMjgsICNGRkE1MDApICFpbXBvcnRhbnQ7XHJcbiAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDtcclxuICAgIHdpZHRoOiAyMDBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG46aG9zdCA6Om5nLWRlZXAgLnNlY29uZFN1YiB7XHJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI0ZGRjJDQywgI0ZGRDk2NikgIWltcG9ydGFudDtcclxufVxyXG5cclxuXHJcbiJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n Họ tên: \\r\\n Name: \\r\\n {{accountDetail.Name}} \\r\\n
\\r\\n
\\r\\n Chức vụ: \\r\\n Role: \\r\\n {{accountDetail.PartName}} \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n Tiểu sử tóm tắt:\\r\\n \\r\\n
\\r\\n Summary:\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n {{unitDetail.Name}}\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit,OnDestroy, HostListener } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppService } from 'src/app/services/app.service';\r\nimport { AppComponent } from 'src/app/app.component';\r\nimport { AppLanguage } from '../../../services/app.language';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\n\r\n@Component({\r\n selector: 'app-organize-chart',\r\n templateUrl: './organize-chart.component.html',\r\n styleUrls: ['./organize-chart.component.css']\r\n})\r\nexport class OrganizeChartComponent implements OnInit, OnDestroy {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n user: any;\r\n loading = false;\r\n dataUnits = [];\r\n content = '';\r\n dataAccounts = [];\r\n searchOption = {\r\n SearchText: ''\r\n };\r\n unitDetail = {\r\n Name: '',\r\n Description: ''\r\n }\r\n accountDetail = {\r\n AvatarUrl: '',\r\n Name: '',\r\n PartName: '',\r\n Description: '',\r\n DisplayFlg: false\r\n };\r\n\r\n nameAcc = '';\r\n presidentName = '';\r\n\r\n\r\n data = {\r\n type: 'OrgChart',\r\n title: '',\r\n accounts: [],\r\n units: [],\r\n columnNames: [\"Name\", \"Manager\", \"Tooltip\"],\r\n options: {\r\n allowHtml: true,\r\n nodeClass: 'org-chart-style',\r\n orientation: 'vertical',\r\n },\r\n options1: {\r\n allowHtml: true,\r\n nodeClass: 'org-chart-style1',\r\n },\r\n // width: 100%,\r\n height: 900,\r\n\r\n }\r\n\r\n languageName = '';\r\n\r\n languages: Array = [{\r\n id: 0,\r\n culture: 'vi-VN',\r\n text: 'Tiếng Việt'\r\n }, {\r\n id: 1,\r\n culture: 'en-US',\r\n text: 'English'\r\n }];\r\n\r\n public opened = false;\r\n public openedUnitDialog = false;\r\n\r\n contentFlg = false;\r\n\r\n constructor(\r\n private router: Router,\r\n private authenticationService: AuthenticationService,\r\n public appService: AppService,\r\n private appComponent: AppComponent,\r\n private appSwal: AppSwal,\r\n private language: AppLanguage\r\n ) {\r\n this.authenticationService.getUser();\r\n this.getLanguageName();\r\n this.user = this.authenticationService.user;\r\n }\r\n\r\n topEmployee: any = {\r\n name: 'Janis Martin',\r\n cssClass: 'mainchart',\r\n subordinates: [\r\n {\r\n name: 'Matthew Wikes',\r\n subordinates: [\r\n {\r\n name: 'Tina Landry',\r\n subordinates: []\r\n }\r\n\r\n ]\r\n },\r\n {\r\n name: 'Patricia Lyons',\r\n subordinates: [\r\n {\r\n name: 'Dylan Wilson',\r\n subordinates: []\r\n },\r\n {\r\n name: 'Deb Curtis',\r\n subordinates: []\r\n }\r\n ]\r\n },\r\n {\r\n name: 'Larry Phung',\r\n subordinates: []\r\n }\r\n ]\r\n };\r\n async getUnits(languageID) {\r\n this.loading = true;\r\n const dataRequest = {\r\n langID: languageID\r\n };\r\n const result = await this.appService.doGET('api/Unit/GetUnitByLanguage', dataRequest);\r\n if (result && result.Status) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < result.Data.length; i++) {\r\n if (result.Data[i].ParentID !== '') {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let j = 0; j < result.Data.length; j++) {\r\n if (result.Data[i].ParentID === result.Data[j].ID) {\r\n result.Data[i].ParentID = result.Data[j].ID\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.data.units = [];\r\n this.dataUnits = result.Data;\r\n var listUnit = [];\r\n var listTop = this.dataUnits.filter((x) => x.ParentID == null);\r\n for(let i = 0; i < listTop.length; i++){\r\n listUnit.push({\r\n id: listTop[i].ID,\r\n name: listTop[i].Name,\r\n parentID: listTop[i].ParentID,\r\n subordinates: this.getSubordinates(listTop[i].ID, this.dataUnits, 1),\r\n cssClass: 'topCss'\r\n });\r\n var k = 0;\r\n // var CountObj = {\r\n // countMax: 0,\r\n // endFlg: false\r\n // }\r\n // var tempCount = 0\r\n // var unitItem = null;\r\n // do {\r\n // var tempUnit = null;\r\n // if(unitItem == null || unitItem == undefined){\r\n // unitItem = this.dataUnits.find(x => x.ParentID == listTop[i].ID);\r\n // tempUnit = unitItem;\r\n // } else{\r\n // tempUnit = this.dataUnits.find(x => x.ParentID == unitItem.ID);\r\n // unitItem = tempUnit;\r\n // }\r\n \r\n // if(unitItem != null && unitItem != undefined){\r\n // tempCount++;\r\n // } else{\r\n // CountObj.endFlg == true;\r\n // if(CountObj.countMax < tempCount){\r\n // CountObj.countMax = tempCount\r\n // }\r\n // break;\r\n // }\r\n // } while(CountObj.endFlg == false);\r\n // var j = 0;\r\n }\r\n this.data.units = listUnit[0];\r\n var j = this.topEmployee;\r\n // for (let i = 0; i < this.dataUnits.length; i++) {\r\n // let item = this.dataUnits[i];\r\n // this.data.units.push(\r\n // [{ v: item.ID, f: '' + item.Name + ' ' },\r\n // item.ParentID, item.ID]\r\n // );\r\n // }\r\n }\r\n this.loading = false;\r\n }\r\n\r\n getSubordinates(id, unitList, level){\r\n var result = [];\r\n var childList = unitList.filter((x) => x.ParentID == id);\r\n if(childList != null && childList != undefined && childList.length > 0){\r\n for(let i = 0; i < childList.length; i++){\r\n result.push({\r\n id: childList[i].ID,\r\n name: childList[i].Name,\r\n parentID: childList[i].ParentID,\r\n subordinates: this.getSubordinates(childList[i].ID, unitList, level + 1),\r\n cssClass: level == 1 ? 'firstSub': level == 2 ? 'secondSub': null\r\n })\r\n }\r\n return result;\r\n } else{\r\n return null;\r\n }\r\n \r\n }\r\n\r\n async getAccounts(languageID) {\r\n this.loading = true;\r\n const dataRequest = {\r\n langID: languageID\r\n };\r\n const result = await this.appService.doGET('api/Account/getAccountChart', dataRequest);\r\n if (result && result.Status) {\r\n this.data.accounts = [];\r\n this.dataAccounts = result.Data;\r\n for (let i = 0; i < this.dataAccounts.length; i++) {\r\n let item = this.dataAccounts[i];\r\n this.data.accounts.push(\r\n [{ v: item.ID, f: ' ' + item.PartName + '
' + item.Name + '
' },\r\n item.ParentID, item.ID]\r\n );\r\n }\r\n }\r\n this.loading = false;\r\n }\r\n\r\n getUnitDetail(id){\r\n const dataUnitDetail = this.dataUnits.find((item) => {\r\n return item.ID === id;\r\n });\r\n this.unitDetail = dataUnitDetail;\r\n }\r\n\r\n getAccountDetail(id) {\r\n const data = this.dataAccounts.find((item) => {\r\n return item.ID === id;\r\n });\r\n\r\n this.accountDetail = data;\r\n }\r\n\r\n async getMissionOperator(languageID) {\r\n this.loading = true;\r\n const dataRequest = {\r\n langID: languageID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Post/getMissionOperator', dataRequest);\r\n if (result.Data) {\r\n this.content = result.Data.Description;\r\n this.contentFlg = result.Data.HotFlg;\r\n }\r\n this.loading = false;\r\n }\r\n\r\n\r\n onSelectAcc(event) {\r\n if(event.length != 0){\r\n this.nameAcc = '';\r\n \r\n const { row, column } = event[0];\r\n const id = this.data.accounts[row][2];\r\n this.getAccountDetail(id);\r\n if(this.accountDetail.DisplayFlg){\r\n this.opened = true;\r\n }\r\n }\r\n }\r\n\r\n onSelectUnit(event) {\r\n this.nameAcc = '';\r\n this.openedUnitDialog = true;\r\n this.getUnitDetail(event.id);\r\n\r\n }\r\n public closeDialog(status) {\r\n this.opened = false;\r\n this.openedUnitDialog = false;\r\n }\r\n\r\n \r\n\r\n onReload() {\r\n this.getUnits(this.languageName);\r\n this.getAccounts(this.languageName);\r\n this.getMissionOperator(this.languageName);\r\n }\r\n\r\n ngOnInit(): void {\r\n \r\n }\r\n\r\n ngOnDestroy(){\r\n var datalanguage = {\r\n id: 0,\r\n culture: 'vi-VN',\r\n text: 'Tiếng Việt'\r\n }\r\n this.onChangeLanguage(datalanguage);\r\n }\r\n \r\n\r\n onChangeLanguage(e: any) {\r\n this.languageName = e;\r\n this.onReload();\r\n }\r\n \r\n getLanguageName() {\r\n let lang = localStorage.getItem('currentLanguage');\r\n if(lang == null || lang == undefined){\r\n lang = \"vi-VN\";\r\n }\r\n this.languageName = lang;\r\n this.onReload();\r\n }\r\n\r\n}\r\n","module.exports = \".schedule-editor .k-window{\\r\\n width: 57%px;\\r\\n height: 500px;\\r\\n}\\r\\n\\r\\n.label-scheduler{\\r\\n padding-bottom: 5px;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.placeholer-color{\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.text-box{\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.deleted{\\r\\n text-decoration: line-through;\\r\\n}\\r\\n\\r\\n.changed{\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.publiced{\\r\\n background-color: mediumturquoise;\\r\\n}\\r\\n\\r\\n.approved{\\r\\n background-color: rgb(25, 214, 116);\\r\\n}\\r\\n\\r\\n.text-center{\\r\\n padding-top: 10px;\\r\\n width: 100%;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.xpre{\\r\\n white-space: pre-wrap; \\r\\n word-break: break-word;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3BvcnRhbC1tZWV0aW5nL3BvcnRhbC1tZWV0aW5nLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxZQUFZO0lBQ1osYUFBYTtBQUNqQjs7QUFFQTtJQUNJLG1CQUFtQjtJQUNuQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksV0FBVztBQUNmOztBQUVBO0lBQ0ksNkJBQTZCO0FBQ2pDOztBQUVBO0lBQ0ksaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksaUNBQWlDO0FBQ3JDOztBQUVBO0lBQ0ksbUNBQW1DO0FBQ3ZDOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLFdBQVc7SUFDWCxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0FBQzFCIiwiZmlsZSI6InNyYy9hcHAvcG9ydGFsL3BvcnRhbC1tZWV0aW5nL3BvcnRhbC1tZWV0aW5nLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuc2NoZWR1bGUtZWRpdG9yIC5rLXdpbmRvd3tcclxuICAgIHdpZHRoOiA1NyVweDtcclxuICAgIGhlaWdodDogNTAwcHg7XHJcbn1cclxuXHJcbi5sYWJlbC1zY2hlZHVsZXJ7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogNXB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcclxufVxyXG5cclxuLnBsYWNlaG9sZXItY29sb3J7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbn1cclxuXHJcbi50ZXh0LWJveHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG59XHJcblxyXG4uZGVsZXRlZHtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xyXG59XHJcblxyXG4uY2hhbmdlZHtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG59XHJcblxyXG4ucHVibGljZWR7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBtZWRpdW10dXJxdW9pc2U7XHJcbn1cclxuXHJcbi5hcHByb3ZlZHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNSwgMjE0LCAxMTYpO1xyXG59XHJcblxyXG4udGV4dC1jZW50ZXJ7XHJcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG4ueHByZXtcclxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgXHJcbiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkO1xyXG59Il19 */\"","module.exports = \" \\r\\n\\r\\n\\r\\n \\r\\n \\r\\n event.dataItem.publicat\\r\\n }\\\">\\r\\n \\r\\n
{{event.title}}
\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n {{'Room_Meeting' | translate}} \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{'Unit_Meeting' | translate}} \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{'Admin_Meeting' | translate}} \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n {{'Member_Meeting' | translate}} \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{'Date_Meeting' | translate}} \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{'Start_Meeting' | translate}} \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{'End_Meeting' | translate}} \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n {{'Title_Meeting' | translate}} \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n {{'Content_Meeting' | translate}} \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n {{'File_Meeting' | translate}} \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \"","import { Component, OnInit, Renderer2, HostListener } from '@angular/core';\r\nimport { SchedulerEvent, CreateFormGroupArgs, EditMode } from '@progress/kendo-angular-scheduler';\r\nimport { FormGroup, FormBuilder, Validators, ValidatorFn } from '@angular/forms';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { AppService } from 'src/app/services/app.service';\r\nimport { AppComponent } from 'src/app/app.component';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { isBuffer } from 'util';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport * as FileSaver from 'file-saver';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\n\r\nconst intersects = (startTime1: Date, endTime1: Date, startTime2: Date, endTime2: Date) =>\r\n (startTime1 < startTime2 && endTime1 > endTime2) ||\r\n (startTime2 <= startTime1 && startTime1 < endTime2) ||\r\n (startTime2 < endTime1 && endTime1 <= endTime2);\r\n\r\n@Component({\r\n selector: 'app-portal-meeting',\r\n templateUrl: './portal-meeting.component.html',\r\n styleUrls: ['./portal-meeting.component.css']\r\n})\r\nexport class PortalMeetingComponent implements OnInit {\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n //public startTime = '07:00';\r\n isFile = false;\r\n dataMeetingItem: any;\r\n dataMeetingItemtemp: any;\r\n meetingRoom: Array<{ Name: string, ID: string }>;\r\n dataRoomID: any[];\r\n infoOpened = false;\r\n isAdd = true;\r\n public selectedDate: Date = new Date(Date.now());\r\n public formGroup: FormGroup;\r\n\r\n members: Array<{ FullName: string, UserName: string }> = [];\r\n membersFilter: Array<{ FullName: string, UserName: string }> = [];\r\n\r\n\r\n\r\n dataScheduler: any[] = [];\r\n user: any;\r\n\r\n public eventsArr: SchedulerEvent[] = [];\r\n public events: SchedulerEvent[] = [];\r\n\r\n constructor(\r\n private formBuilder: FormBuilder,\r\n private appGuid: AppGuid,\r\n public appService: AppService,\r\n private appComponent: AppComponent,\r\n private appSwal: AppSwal,\r\n private notification: Notification,\r\n public intl: IntlService,\r\n private appUtils: AppUtils,\r\n //private renderer: Renderer2,\r\n private domSanitizer: DomSanitizer,\r\n ) {\r\n this.getMeeting();\r\n this.createFormGroup = this.createFormGroup.bind(this);\r\n this.getRoom();\r\n this.setDefault();\r\n }\r\n\r\n setDefault() {\r\n\r\n this.dataMeetingItem = {\r\n ID: '',\r\n Name: '',\r\n RoomMeetingID: null,\r\n RoomOther: null,\r\n Room: '',\r\n StartAt: '',\r\n EndAt: '',\r\n MeetingDate: null,\r\n CreateAt: null,\r\n ApproveFlg: null,\r\n DelFlg: null,\r\n Description: '',\r\n FileUrl: null,\r\n Unit: '',\r\n Admin: '',\r\n Member: ''\r\n };\r\n this.dataMeetingItemtemp = {\r\n ID: '',\r\n Name: '',\r\n RoomMeetingID: null,\r\n RoomOther: null,\r\n StartAt: '',\r\n EndAt: '',\r\n MeetingDate: null,\r\n CreateAt: null,\r\n ApproveFlg: null,\r\n DelFlg: null,\r\n Description: '',\r\n FileUrl: null,\r\n Unit: '',\r\n Admin: '',\r\n Member: ''\r\n }\r\n }\r\n\r\n async getRoom() {\r\n const result = await this.appService.doGET('api/Meeting/GetMeetingRoom', null);\r\n this.meetingRoom = result.Data;\r\n }\r\n\r\n async getMeeting() {\r\n const result = await this.appService.doGET('api/Meeting/GetMeeting', null);\r\n if (result) {\r\n if (result && result.Status === 1) {\r\n\r\n this.dataScheduler = result.Data;\r\n result.Data.forEach(item => {\r\n var tempStart = this.intl.formatDate(new Date(item.StartAt), 'HH:mm');\r\n var tempEnd = this.intl.formatDate(new Date(item.EndAt), 'HH:mm');\r\n const event = {\r\n id: item.ID,\r\n title: item.Name + \"-\" + tempStart + \"-\" + tempEnd,\r\n start: new Date(item.StartAt),\r\n end: new Date(item.EndAt),\r\n readonly: true,\r\n delflg: item.DelFlg,\r\n approveflg: item.ApproveFlg,\r\n publicflg: item.PublicFlg,\r\n publicat: new Date(item.PublicAt),\r\n updateat: new Date(item.UpdateAt),\r\n fileurl: item.FileUrl\r\n }\r\n this.eventsArr.push(event);\r\n });\r\n this.events = this.eventsArr;\r\n }\r\n }\r\n }\r\n\r\n\r\n ngOnInit() {\r\n }\r\n\r\n membersHandleFilter(value) {\r\n this.membersFilter = this.members.filter((s) => s.FullName.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n args: CreateFormGroupArgs;\r\n\r\n public createFormGroup(args: CreateFormGroupArgs): FormGroup {\r\n\r\n const dataItem = args.dataItem;\r\n this.setDefault();\r\n this.formGroup = this.formBuilder.group({\r\n 'id': args.isNew ? this.getNextId() : dataItem.id,\r\n 'start': [dataItem.start, Validators.required],\r\n 'end': [dataItem.end, Validators.required],\r\n 'startTimezone': [dataItem.startTimezone],\r\n 'endTimezone': [dataItem.endTimezone],\r\n 'isAllDay': dataItem.isAllDay,\r\n 'title': dataItem.title,\r\n 'RoomMeetingID': dataItem.RoomMeetingID,\r\n 'RoomOther': dataItem.RoomOther\r\n\r\n });\r\n this.dataMeetingItem.Name = dataItem.title;\r\n this.dataMeetingItem.MeetingDate = dataItem.start;\r\n this.dataMeetingItem.StartAt = dataItem.start;\r\n this.dataMeetingItem.EndAt = dataItem.end;\r\n this.dataMeetingItem.ID = dataItem.id;\r\n\r\n for (let item of this.dataScheduler) {\r\n if (this.dataMeetingItem.ID == item.ID) {\r\n var t = JSON.parse(item.Member);\r\n // for (let y of t) {\r\n // console.log(y.FullName);\r\n // }\r\n //this.dataMeetingItem.RoomMeetingID = item.RoomMeeting;\r\n //this.dataMeetingItem.RoomOther = item.RoomOther;\r\n this.dataMeetingItem.DelFlg = item.DelFlg;\r\n this.dataMeetingItem.ApproveFlg = item.ApproveFlg;\r\n this.dataMeetingItem.Description = item.Description;\r\n this.dataMeetingItem.FileUrl = item.FileUrl;\r\n //this.dataMeetingItem.Unit = item.Unit;\r\n //this.dataMeetingItem.Admin = item.Admin;\r\n\r\n var listMember = JSON.parse(item.Member);\r\n var listAdmin = JSON.parse(item.Admin);\r\n var listUnit = JSON.parse(item.Unit);\r\n var listRoom = JSON.parse(item.Room)\r\n var countMem = 0;\r\n var countAd = 0;\r\n var countUnit = 0;\r\n var countRooom = 0;\r\n //lấy member\r\n for (let member of listMember) {\r\n this.dataMeetingItem.Member = this.dataMeetingItem.Member + member.FullName;\r\n countMem = countMem + 1;\r\n if (countMem != listMember.length) {\r\n this.dataMeetingItem.Member = this.dataMeetingItem.Member + '; ';\r\n }\r\n }\r\n //lấy Admin\r\n for (let admin of listAdmin) {\r\n this.dataMeetingItem.Admin = this.dataMeetingItem.Admin + admin.FullName;\r\n countAd = countAd + 1;\r\n if (countAd != listAdmin.length) {\r\n this.dataMeetingItem.Admin = this.dataMeetingItem.Admin + '; ';\r\n }\r\n }\r\n //lấy Unit\r\n for (let unit of listUnit) {\r\n this.dataMeetingItem.Unit = this.dataMeetingItem.Unit + unit.Name;\r\n countUnit = countUnit + 1;\r\n if (countUnit != listUnit.length) {\r\n this.dataMeetingItem.Unit = this.dataMeetingItem.Unit + '; ';\r\n }\r\n }\r\n //lấy Room\r\n for (let room of listRoom) {\r\n this.dataMeetingItem.Room = this.dataMeetingItem.Room + room.Name;\r\n countRooom = countRooom + 1;\r\n if (countRooom != listRoom.length) {\r\n this.dataMeetingItem.Room = this.dataMeetingItem.Room + '; ';\r\n }\r\n }\r\n //kiểm tra File\r\n this.isFile = false;\r\n if (this.dataMeetingItem.FileUrl) {\r\n this.isFile = true;\r\n }\r\n break;\r\n }\r\n }\r\n return this.formGroup;\r\n }\r\n\r\n public isEditingSeries(editMode: EditMode): boolean {\r\n return editMode === EditMode.Series;\r\n }\r\n\r\n public getNextId(): number {\r\n const len = this.events.length;\r\n\r\n return (len === 0) ? 1 : this.events[this.events.length - 1].id + 1;\r\n }\r\n\r\n getUrlDownload(fileUrl) {\r\n let url = this.appService.apiRoot.replace(\"\\\"\", \"\") + fileUrl;\r\n url = url.replace(\"\\\"\", '')\r\n return url;\r\n }\r\n\r\n async downloadFile(fileUrl) {\r\n const dataRequest = {\r\n url: fileUrl\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, this.appUtils.getNameByUrl(fileUrl));\r\n }\r\n }\r\n\r\n private occupiedSlot(args: any): boolean {\r\n let occupied = false;\r\n\r\n this.events.find(e => {\r\n if (e !== args.dataItem && intersects(args.start, args.end, e.start, e.end)) {\r\n occupied = true;\r\n return true;\r\n }\r\n });\r\n\r\n return occupied;\r\n }\r\n\r\n public onDragStart(args: any): void {\r\n this.preventReadonly(args);\r\n }\r\n\r\n public onDrag(args: any): void {\r\n if (this.occupiedSlot(args)) {\r\n args.setHintClass('invalid');\r\n }\r\n }\r\n\r\n public onDragEnd(args: any): void {\r\n if (this.occupiedSlot(args)) {\r\n args.preventDefault();\r\n }\r\n }\r\n\r\n private preventReadonly(args: any): void {\r\n if (args.dataItem.readonly) {\r\n args.preventDefault();\r\n }\r\n }\r\n\r\n public ngAfterViewChecked() {\r\n //this.renderer.setStyle(document.querySelector(\"multi-day-view .k-scheduler-pane\"), \"display\", \"none\");\r\n }\r\n}\r\n","module.exports = \".hr-style-1 {\\r\\n width: 55%;\\r\\n border-top: 1px solid navy;\\r\\n margin-top: 2px;\\r\\n}\\r\\n\\r\\n.hr-style-2 {\\r\\n width: 55%;\\r\\n border-top: 1px solid navy;\\r\\n margin-top: 2px;\\r\\n}\\r\\n\\r\\n@font-face {\\r\\n font-family: \\\"Times New Roman\\\";\\r\\n src: url('/assets/font/Times\\\\ New\\\\ Roman\\\\ 400.ttf') format(\\\"truetype\\\");\\r\\n}\\r\\n\\r\\n@font-face {\\r\\n font-family: \\\"Times New Roman\\\";\\r\\n font-weight: bold;\\r\\n src: url('/assets/font/Times\\\\ New\\\\ Roman\\\\ Gras\\\\ 700.ttf') format(\\\"truetype\\\");\\r\\n}\\r\\n\\r\\n@font-face {\\r\\n font-family: \\\"Times New Roman\\\";\\r\\n font-style: italic;\\r\\n src: url('/assets/font/Times\\\\ New\\\\ Roman\\\\ Gras\\\\ Italique\\\\ 700.ttf') format(\\\"truetype\\\");\\r\\n}\\r\\n\\r\\n@font-face {\\r\\n font-family: \\\"Times New Roman\\\";\\r\\n font-weight: bold;\\r\\n font-style: italic;\\r\\n src: url('/assets/font/Times\\\\ New\\\\ Roman\\\\ Italique\\\\ 400.ttf') format(\\\"truetype\\\");\\r\\n}\\r\\n\\r\\nkendo-pdf-export {\\r\\n font-family: \\\"Times New Roman\\\", sans-serif;\\r\\n font-size: 12px !important;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.meeting-week {\\r\\n left: 0;\\r\\n right: 0;\\r\\n margin: auto;\\r\\n}\\r\\n\\r\\n.meeting-week .meeting-week-hidden {\\r\\n max-width: 595px;\\r\\n}\\r\\n\\r\\n.rp-name {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.note {\\r\\n font-style: italic;\\r\\n}\\r\\n\\r\\n.meeting-week-hidden {\\r\\n position: absolute;\\r\\n top: -200%;\\r\\n left: -200%;\\r\\n}\\r\\n\\r\\n.description {\\r\\n font-weight: bold;\\r\\n font-size: 12pt;\\r\\n}\\r\\n\\r\\npre {\\r\\n font-family: \\\"Times New Roman\\\", sans-serif;\\r\\n white-space: pre-wrap;\\r\\n margin-bottom: 0;\\r\\n color: navy;\\r\\n font-size: 12px;\\r\\n padding-left: 15px;\\r\\n}\\r\\n\\r\\n.meeting-week-display-text {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3BvcnRhbF9tZWV0aW5nX3dlZWsvbWVldGluZy13ZWVrL21lZXRpbmctd2Vlay5jb21wb25lbnQuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0lBQ0ksVUFBVTtJQUNWLDBCQUEwQjtJQUMxQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksVUFBVTtJQUNWLDBCQUEwQjtJQUMxQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksOEJBQThCO0lBQzlCLHNFQUFzRTtBQUMxRTs7QUFFQTtJQUNJLDhCQUE4QjtJQUM5QixpQkFBaUI7SUFDakIsNEVBQTRFO0FBQ2hGOztBQUVBO0lBQ0ksOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixzRkFBc0Y7QUFDMUY7O0FBRUE7SUFDSSw4QkFBOEI7SUFDOUIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixnRkFBZ0Y7QUFDcEY7O0FBRUE7SUFDSSwwQ0FBMEM7SUFDMUMsMEJBQTBCO0lBQzFCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLE9BQU87SUFDUCxRQUFRO0lBQ1IsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixlQUFlO0FBQ25COztBQUVBO0lBQ0ksMENBQTBDO0lBQzFDLHFCQUFxQjtJQUNyQixnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLGVBQWU7SUFDZixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxXQUFXO0FBQ2YiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvcG9ydGFsX21lZXRpbmdfd2Vlay9tZWV0aW5nLXdlZWsvbWVldGluZy13ZWVrLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuaHItc3R5bGUtMSB7XHJcbiAgICB3aWR0aDogNTUlO1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIG5hdnk7XHJcbiAgICBtYXJnaW4tdG9wOiAycHg7XHJcbn1cclxuXHJcbi5oci1zdHlsZS0yIHtcclxuICAgIHdpZHRoOiA1NSU7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgbmF2eTtcclxuICAgIG1hcmdpbi10b3A6IDJweDtcclxufVxyXG5cclxuQGZvbnQtZmFjZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIjtcclxuICAgIHNyYzogdXJsKCcvYXNzZXRzL2ZvbnQvVGltZXNcXCBOZXdcXCBSb21hblxcIDQwMC50dGYnKSBmb3JtYXQoXCJ0cnVldHlwZVwiKTtcclxufVxyXG5cclxuQGZvbnQtZmFjZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIjtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgc3JjOiB1cmwoJy9hc3NldHMvZm9udC9UaW1lc1xcIE5ld1xcIFJvbWFuXFwgR3Jhc1xcIDcwMC50dGYnKSBmb3JtYXQoXCJ0cnVldHlwZVwiKTtcclxufVxyXG5cclxuQGZvbnQtZmFjZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIjtcclxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcclxuICAgIHNyYzogdXJsKCcvYXNzZXRzL2ZvbnQvVGltZXNcXCBOZXdcXCBSb21hblxcIEdyYXNcXCBJdGFsaXF1ZVxcIDcwMC50dGYnKSBmb3JtYXQoXCJ0cnVldHlwZVwiKTtcclxufVxyXG5cclxuQGZvbnQtZmFjZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIjtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgZm9udC1zdHlsZTogaXRhbGljO1xyXG4gICAgc3JjOiB1cmwoJy9hc3NldHMvZm9udC9UaW1lc1xcIE5ld1xcIFJvbWFuXFwgSXRhbGlxdWVcXCA0MDAudHRmJykgZm9ybWF0KFwidHJ1ZXR5cGVcIik7XHJcbn1cclxuXHJcbmtlbmRvLXBkZi1leHBvcnQge1xyXG4gICAgZm9udC1mYW1pbHk6IFwiVGltZXMgTmV3IFJvbWFuXCIsIHNhbnMtc2VyaWY7XHJcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4ubWVldGluZy13ZWVrIHtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICByaWdodDogMDtcclxuICAgIG1hcmdpbjogYXV0bztcclxufVxyXG5cclxuLm1lZXRpbmctd2VlayAubWVldGluZy13ZWVrLWhpZGRlbiB7XHJcbiAgICBtYXgtd2lkdGg6IDU5NXB4O1xyXG59XHJcblxyXG4ucnAtbmFtZSB7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbn1cclxuXHJcbi5ub3RlIHtcclxuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcclxufVxyXG5cclxuLm1lZXRpbmctd2Vlay1oaWRkZW4ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgdG9wOiAtMjAwJTtcclxuICAgIGxlZnQ6IC0yMDAlO1xyXG59XHJcblxyXG4uZGVzY3JpcHRpb24ge1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBmb250LXNpemU6IDEycHQ7XHJcbn1cclxuXHJcbnByZSB7XHJcbiAgICBmb250LWZhbWlseTogXCJUaW1lcyBOZXcgUm9tYW5cIiwgc2Fucy1zZXJpZjtcclxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcclxuICAgIG1hcmdpbi1ib3R0b206IDA7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTVweDtcclxufVxyXG5cclxuLm1lZXRpbmctd2Vlay1kaXNwbGF5LXRleHQge1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuIl19 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n Tải về (.pdf) \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
{{'Weekly_Banner_Left_top' | translate}}
\\r\\n
{{'Weekly_Banner_Left_bottom' | translate}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{'Weekly_Banner_right_top' | translate}}
\\r\\n
{{'Weekly_Banner_right_bottom' | translate}}
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n {{'Weekly_Name_RP' | translate}} {{this.WeekNo}} \\r\\n (Từ {{ this.searchOption.FromDate | date: 'dd/MM/yyyy'}} đến {{ this.searchOption.ToDate | date: 'dd/MM/yyyy'}}) \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
Nội dung trọng tâm:
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n Lịch tuần thay giấy mời đối với nội bộ cơ quan Liên đoàn Lao động Thành phố. \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{'Weekly_Name_RP' | translate}} {{this.WeekNo}} \\r\\n (Từ {{ this.searchOption.FromDate | date: 'dd/MM/yyyy'}} đến {{ this.searchOption.ToDate | date: 'dd/MM/yyyy'}}) \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
Nội dung trọng tâm:
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n\\r\\n
0\\\" #ngcarousel [showNavigationArrows]=\\\"false\\\" [interval]=\\\"5000\\\" class=\\\"no-indicators\\\" data-interval=\\\"false\\\" [pauseOnHover]=\\\"true\\\" [keyboard]=\\\"true\\\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
1\\\">\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, HostListener, ViewChild } from '@angular/core';\r\nimport { AppService } from 'src/app/services/app.service';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { GridDataResult, SelectableSettings, DataStateChangeEvent, PageChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { SortDescriptor, State, orderBy, process } from '@progress/kendo-data-query';\r\nimport { NgbCarousel } from '@ng-bootstrap/ng-bootstrap';\r\n\r\n@Component({\r\n selector: 'app-meeting-week',\r\n templateUrl: './meeting-week.component.html',\r\n styleUrls: ['./meeting-week.component.css']\r\n})\r\nexport class MeetingWeekComponent implements OnInit {\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n dataMeetingGridDataResult: GridDataResult;\r\n dataMeetings = [];\r\n dataMeetingSelectableSettings: SelectableSettings;\r\n dataMeetingSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n infoOpened = false;\r\n loading = false;\r\n dataMeetingSortByField: SortDescriptor[] = [];\r\n dataMeetingSelection: number[] = [];\r\n dataMeetingItem: any;\r\n dataMeetingItemTemp: any;\r\n public dataMeetingState: State = {\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n };\r\n\r\n currentDay = new Date();\r\n WeekNo: number;\r\n centralContent = '';\r\n searchOption = {\r\n SearchText: '',\r\n ApproveFlg: -1,\r\n PublicFlg: -1,\r\n FromDate: null,\r\n ToDate: null\r\n };\r\n\r\n pageName: any;\r\n\r\n public widthSlide = '100%';\r\n public heightSlide = '100%';\r\n public slideDayOfWeek : Array<{ Ob: any, ID: string, ObGrid: GridDataResult }> = [];\r\n responsiveOptions: any;\r\n @ViewChild('ngcarousel') ngCarousel: NgbCarousel;\r\n\r\n\r\n constructor(\r\n private appService: AppService,\r\n public intl: IntlService,\r\n private router: Router,\r\n private appUtils: AppUtils,\r\n private appControls: AppControls,\r\n private appSwal: AppSwal,\r\n private activatedRoute: ActivatedRoute\r\n ) {\r\n this.setSelectableSettings();\r\n this.setDefault();\r\n this.initDisplay();\r\n this.responsiveOptions = [\r\n {\r\n breakpoint: '1024px',\r\n numVisible: 1,\r\n numScroll: 1\r\n },\r\n {\r\n breakpoint: '768px',\r\n numVisible: 1,\r\n numScroll: 1\r\n },\r\n {\r\n breakpoint: '560px',\r\n numVisible: 1,\r\n numScroll: 1\r\n }\r\n ];\r\n }\r\n\r\n ngOnInit() {\r\n this.activatedRoute.queryParams.subscribe((p: any) => {\r\n this.getMenuName(p.menuID);\r\n });\r\n }\r\n\r\n async getMenuName(menuID) {\r\n const dataRequest = {\r\n id: menuID,\r\n };\r\n const result = await this.appService.doGET('api/Menu', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.pageName = result.Data.Name;\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataMeetingItem = {\r\n viewOnly: true,\r\n IsAdd: true,\r\n Name: '',\r\n Admin: null,\r\n Address: '',\r\n MeetingDate: null,\r\n StartAt: null,\r\n EndAt: null,\r\n ApproveFlg: false,\r\n FileUrl: [],\r\n Description: ''\r\n };\r\n this.dataMeetingItemTemp = {\r\n viewOnly: true,\r\n IsAdd: true,\r\n Name: '',\r\n Admin: null,\r\n Address: '',\r\n MeetingDate: null,\r\n StartAt: null,\r\n EndAt: null,\r\n ApproveFlg: false,\r\n FileUrl: [],\r\n Description: ''\r\n };\r\n this.dataMeetingSelection = [];\r\n }\r\n\r\n bindMeetings() {\r\n this.dataMeetingGridDataResult = {\r\n data: orderBy(this.dataMeetings, this.dataMeetingSortByField),\r\n total: this.dataMeetings.length\r\n };\r\n \r\n this.dataMeetingGridDataResult = process(this.dataMeetings, this.dataMeetingState);\r\n }\r\n\r\n onMeetingsortChange(sort: SortDescriptor[]): void {\r\n this.dataMeetingSortByField = sort;\r\n this.bindMeetings();\r\n }\r\n\r\n onMeetingPageChange(event: PageChangeEvent) {\r\n this.bindMeetings();\r\n }\r\n\r\n setSelectableSettings(): void {\r\n this.dataMeetingSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n public onMeetingDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataMeetingSelection = [];\r\n this.dataMeetingState = state;\r\n this.dataMeetingGridDataResult = process(this.dataMeetings, this.dataMeetingState);\r\n }\r\n\r\n async onMeetingselectedKeysChange() {\r\n\r\n const selectedID = this.dataMeetingSelection[0];\r\n const selectedItem = this.dataMeetings.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n selectedItem.MeetingDate = selectedItem.MeetingDate ? new Date(selectedItem.MeetingDate) : null;\r\n selectedItem.StartAt = selectedItem.StartAt ? new Date(selectedItem.StartAt) : null;\r\n selectedItem.EndAt = selectedItem.EndAt ? new Date(selectedItem.EndAt) : null;\r\n this.dataMeetingItem = selectedItem;\r\n this.bindTemp(this.dataMeetingItem);\r\n this.infoOpened = true;\r\n }\r\n\r\n bindTemp(data) {\r\n this.dataMeetingItemTemp = Object.assign({}, data);\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataMeetingSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataMeetings.find((item) => {\r\n return item.ID === this.dataMeetingSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataMeetingSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n async initDisplay() {\r\n this.getWeekMeeting();\r\n //this.getCentralContent();\r\n }\r\n\r\n // async getCentralContent() {\r\n // this.WeekNo = this.getWeekNumber(this.searchOption.FromDate);\r\n // const dataRequest = {\r\n // ID: this.WeekNo,\r\n // };\r\n // const result = await this.appService.doGET('api/CentralContent', dataRequest);\r\n // if (result && result.Status === 1) {\r\n // console.log(result.Data);\r\n // for (let i = 0; i < result.Data.length; i++) {\r\n // this.centralContent = result.Data[0].Description;\r\n // }\r\n // }\r\n // }\r\n\r\n async getWeekMeeting() {\r\n this.getFirstLastDay();\r\n this.WeekNo = this.getWeekNumber(this.searchOption.FromDate);\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n ApproveFlg: this.searchOption.ApproveFlg,\r\n PublicFlg: this.searchOption.PublicFlg,\r\n FromDate: this.searchOption.FromDate ? this.intl.formatDate(new Date(this.searchOption.FromDate), 'yyyy-MM-ddT00:00:00') : null,\r\n ToDate: this.searchOption.ToDate ? this.intl.formatDate(new Date(this.searchOption.ToDate), 'yyyy-MM-ddT00:00:00') : null\r\n };\r\n const result = await this.appService.doPOST('api/Meeting/SearchWeekly', dataRequest);\r\n if (result && result.Status === 1) { \r\n const meetings = [];\r\n const dayOfWeek = [];\r\n this.slideDayOfWeek = [];\r\n let idxDayofWeek = \"\";\r\n for (let i = 0; i < result.Data.length; i++) {\r\n result.Data[i].UnitList = JSON.parse(result.Data[i].UnitString);\r\n result.Data[i].Admin = JSON.parse(result.Data[i].AdminString);\r\n for(let k = 0; k < result.Data[i].Admin.length; k++){\r\n if(result.Data[i].ShowAdmin == undefined){\r\n result.Data[i].ShowAdmin = \"\";\r\n }\r\n if(k != result.Data[i].Admin.length - 1){\r\n result.Data[i].ShowAdmin = result.Data[i].ShowAdmin + \" \" + result.Data[i].Admin[k].FullName + \",\";\r\n } else{\r\n result.Data[i].ShowAdmin = result.Data[i].ShowAdmin + \" \" + result.Data[i].Admin[k].FullName;\r\n }\r\n }\r\n result.Data[i].RoomMeetingList = JSON.parse(result.Data[i].RoomMeetingString);\r\n if (result.Data[i].RoomMeetingList){\r\n for(let j = 0; j < result.Data[i].RoomMeetingList.length; j++){\r\n if(result.Data[i].RoomMeetingName == undefined){\r\n result.Data[i].RoomMeetingName = \"\";\r\n }\r\n if(j != result.Data[i].RoomMeetingList.length - 1){\r\n result.Data[i].RoomMeetingName = result.Data[i].RoomMeetingName + \" \" + result.Data[i].RoomMeetingList[j].Name + \",\";\r\n } else{\r\n result.Data[i].RoomMeetingName = result.Data[i].RoomMeetingName + \" \" + result.Data[i].RoomMeetingList[j].Name;\r\n }\r\n }\r\n } \r\n result.Data[i].MemberList = JSON.parse(result.Data[i].MemberString);\r\n for (let j = 0; j < result.Data[i].MemberList.length; j++) {\r\n if (result.Data[i].ShowMembers == undefined) {\r\n result.Data[i].ShowMembers = \"\";\r\n }\r\n if (j != result.Data[i].MemberList.length - 1) {\r\n result.Data[i].ShowMembers = result.Data[i].ShowMembers + \" \" + result.Data[i].MemberList[j].FullName + \",\";\r\n } else {\r\n result.Data[i].ShowMembers = result.Data[i].ShowMembers + \" \" + result.Data[i].MemberList[j].FullName;\r\n }\r\n }\r\n result.Data[i].MeetingDayName = this.getDayInWeek(result.Data[i].MeetingDate);\r\n result.Data[i].DayName = this.getDayInWeek(result.Data[i].StartAt);\r\n result.Data[i].DayHour = this.getHour(result.Data[i].StartAt);\r\n result.Data[i].StartAtRp = result.Data[i].StartAt;\r\n if (result.Data[i].FileUrl == null || result.Data[i].FileUrl == \"\") {\r\n result.Data[i].FileUrl = [];\r\n }\r\n else {\r\n result.Data[i].FileUrl = JSON.parse(result.Data[i].FileUrl);\r\n }\r\n \r\n if (idxDayofWeek != result.Data[i].DayName){\r\n idxDayofWeek = result.Data[i].DayName; \r\n this.slideDayOfWeek.push({\r\n ID: idxDayofWeek,\r\n Ob: [result.Data[i]],\r\n ObGrid: null\r\n })\r\n }else {\r\n if(this.slideDayOfWeek.length > 0){\r\n this.slideDayOfWeek[this.slideDayOfWeek.indexOf(this.slideDayOfWeek.find(r=> r.ID == idxDayofWeek))].Ob.push(result.Data[i])\r\n } \r\n }\r\n\r\n if (dayOfWeek.find(dayItem => {\r\n return dayItem === result.Data[i].DayName;\r\n\r\n })) {\r\n result.Data[i].DayName = '';\r\n result.Data[i].StartAtRp = null;\r\n } else {\r\n dayOfWeek.push(result.Data[i].DayName);\r\n }\r\n\r\n if (meetings){\r\n meetings.push(result.Data[i]);\r\n }\r\n \r\n }\r\n // this.dataMeetingGridDataResult = result.Data\r\n this.dataMeetings = meetings;\r\n \r\n this.slideDayOfWeek.forEach(r => {\r\n r.ObGrid = {\r\n data: orderBy(r.Ob, this.dataMeetingSortByField),\r\n total: r.Ob.length\r\n };\r\n \r\n r.ObGrid = process(r.Ob, this.dataMeetingState);\r\n });\r\n this.bindMeetings();\r\n } else if (result && result.Status !== 1) {\r\n if (typeof (result.Msg) != 'undefined' && result.Msg != null) {\r\n this.appSwal.showError(result.Msg);\r\n }\r\n }\r\n this.checkSelectionID();\r\n }\r\n\r\n getHour(date) {\r\n var current_day = new Date(date);\r\n\r\n return ((current_day.getHours() < 10) ? \"0\" : \"\") + current_day.getHours() + \":\" + ((current_day.getMinutes() < 10) ? \"0\" : \"\") + current_day.getMinutes()\r\n }\r\n\r\n getDayInWeek(date) {\r\n var current_day = new Date(date);\r\n var day_name = '';\r\n switch (current_day.getDay()) {\r\n case 0:\r\n day_name = \"Chủ nhật\";\r\n break;\r\n case 1:\r\n day_name = \"Thứ hai\";\r\n break;\r\n case 2:\r\n day_name = \"Thứ ba\";\r\n break;\r\n case 3:\r\n day_name = \"Thứ tư\";\r\n break;\r\n case 4:\r\n day_name = \"Thứ năm\";\r\n break;\r\n case 5:\r\n day_name = \"Thứ sáu\";\r\n break;\r\n case 6:\r\n day_name = \"Thứ bảy\";\r\n }\r\n return day_name\r\n }\r\n\r\n getFirstLastDay() {\r\n this.searchOption.FromDate = new Date(this.currentDay.setDate(this.currentDay.getDate() - this.currentDay.getDay() + 1));\r\n this.searchOption.ToDate = new Date(this.currentDay.setDate(this.searchOption.FromDate.getDate() + 6));;\r\n }\r\n\r\n getWeekNumber(date): number {\r\n const today = new Date(date);\r\n const firstDayOfYear = new Date(today.getFullYear(), 0, 1);\r\n const pastDaysOfYear = (today.valueOf() - firstDayOfYear.valueOf()) / 86400000;\r\n return Math.ceil((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7);\r\n }\r\n\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n onExportPdf(pdf: any) {\r\n pdf.saveAs('Lich cong tac tuan.pdf');\r\n }\r\n\r\n // Move to previous slide\r\n getToPrev() {\r\n this.ngCarousel.prev();\r\n }\r\n\r\n // Move to next slide\r\n goToNext() {\r\n this.ngCarousel.next();\r\n }\r\n\r\n // Pause slide\r\n stopCarousel() {\r\n this.ngCarousel.pause();\r\n }\r\n\r\n}\r\n","module.exports = \".ngBL {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.ndBL {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.img-banner {\\r\\n width: 100%;\\r\\n /* max-height: 500px; */\\r\\n}\\r\\n\\r\\n.title {\\r\\n font-size: 28px;\\r\\n font-weight: bold;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.group-body-item {\\r\\n height: 110px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.group-body-item-none-bg {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n}\\r\\n\\r\\n.description {\\r\\n text-align: left;\\r\\n color: navy;\\r\\n word-break: break-word;\\r\\n}\\r\\n\\r\\n.description img {\\r\\n width: 100% !important;\\r\\n}\\r\\n\\r\\n.summary {\\r\\n font-weight: 500;\\r\\n text-align: left;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.img-comment {\\r\\n width: 75px;\\r\\n height: 75px;\\r\\n float: left;\\r\\n}\\r\\n\\r\\n.group-body-item:hover,\\r\\n.group-body-item-none-bg :hover {\\r\\n color: #006CB7 !important;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.portal .group-body-2 {\\r\\n background-color: #F5F5F5;\\r\\n padding: 10px 20px;\\r\\n}\\r\\n\\r\\n.TLQ {\\r\\n width: 100%;\\r\\n /* background-color: crimson; */\\r\\n border-bottom: crimson;\\r\\n}\\r\\n\\r\\n.Border {\\r\\n border-bottom: crimson;\\r\\n}\\r\\n\\r\\n.languages {\\r\\n position: relative;\\r\\n margin: -13px;\\r\\n top: 42px;\\r\\n background-color: inherit;\\r\\n}\\r\\n\\r\\n.title-child{\\r\\n font-size: 14px;\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n.reference{\\r\\n float: right;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.menu-name{\\r\\n font-size: 15px;\\r\\n font-weight: bold;\\r\\n color: #006CB7;\\r\\n}\\r\\n\\r\\n.temp-style-menu {\\r\\n color: #f1f1f1 ;\\r\\n background-color: #f1f1f1;\\r\\n width: 400px ;\\r\\n height: 20px ;\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n.temp-style-title {\\r\\n color: #f1f1f1 ;\\r\\n background-color: #f1f1f1;\\r\\n width: 100% ;\\r\\n height: 20px;\\r\\n margin-bottom: 5px;\\r\\n}\\r\\n\\r\\n.temp-style-img {\\r\\n color: #f1f1f1 ;\\r\\n background-color: #f1f1f1;\\r\\n width: 720px ;\\r\\n height: 400px ;\\r\\n margin-left: 10px;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3Bvc3QtZGV0YWlsL3Bvc3QtZGV0YWlsLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCx1QkFBdUI7QUFDM0I7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGFBQWE7SUFDYixXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxvQkFBb0I7SUFDcEIsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSxzQkFBc0I7QUFDMUI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLFdBQVc7QUFDZjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osV0FBVztBQUNmOztBQUVBOztJQUVJLHlCQUF5QjtJQUN6QixlQUFlO0FBQ25COztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLFdBQVc7SUFDWCwrQkFBK0I7SUFDL0Isc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixTQUFTO0lBQ1QseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osV0FBVztBQUNmOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixjQUFjO0FBQ2xCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLHlCQUF5QjtJQUN6QixhQUFhO0lBQ2IsYUFBYTtJQUNiLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLGVBQWU7SUFDZix5QkFBeUI7SUFDekIsWUFBWTtJQUNaLFlBQVk7SUFDWixrQkFBa0I7QUFDdEI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLGFBQWE7SUFDYixjQUFjO0lBQ2QsaUJBQWlCO0FBQ3JCIiwiZmlsZSI6InNyYy9hcHAvcG9ydGFsL3Bvc3QtZGV0YWlsL3Bvc3QtZGV0YWlsLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIubmdCTCB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbi5uZEJMIHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxufVxyXG5cclxuLmltZy1iYW5uZXIge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICAvKiBtYXgtaGVpZ2h0OiA1MDBweDsgKi9cclxufVxyXG5cclxuLnRpdGxlIHtcclxuICAgIGZvbnQtc2l6ZTogMjhweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbi5ncm91cC1ib2R5LWl0ZW0ge1xyXG4gICAgaGVpZ2h0OiAxMTBweDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4uZ3JvdXAtYm9keS1pdGVtLW5vbmUtYmcge1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcclxufVxyXG5cclxuLmRlc2NyaXB0aW9uIHtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XHJcbn1cclxuXHJcbi5kZXNjcmlwdGlvbiBpbWcge1xyXG4gICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLnN1bW1hcnkge1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuLmltZy1jb21tZW50IHtcclxuICAgIHdpZHRoOiA3NXB4O1xyXG4gICAgaGVpZ2h0OiA3NXB4O1xyXG4gICAgZmxvYXQ6IGxlZnQ7XHJcbn1cclxuXHJcbi5ncm91cC1ib2R5LWl0ZW06aG92ZXIsXHJcbi5ncm91cC1ib2R5LWl0ZW0tbm9uZS1iZyA6aG92ZXIge1xyXG4gICAgY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLnBvcnRhbCAuZ3JvdXAtYm9keS0yIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XHJcbn1cclxuXHJcbi5UTFEge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICAvKiBiYWNrZ3JvdW5kLWNvbG9yOiBjcmltc29uOyAqL1xyXG4gICAgYm9yZGVyLWJvdHRvbTogY3JpbXNvbjtcclxufVxyXG5cclxuLkJvcmRlciB7XHJcbiAgICBib3JkZXItYm90dG9tOiBjcmltc29uO1xyXG59XHJcblxyXG4ubGFuZ3VhZ2VzIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIG1hcmdpbjogLTEzcHg7XHJcbiAgICB0b3A6IDQycHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0O1xyXG59XHJcblxyXG4udGl0bGUtY2hpbGR7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxufVxyXG5cclxuLnJlZmVyZW5jZXtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4ubWVudS1uYW1le1xyXG4gICAgZm9udC1zaXplOiAxNXB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxufVxyXG5cclxuLnRlbXAtc3R5bGUtbWVudSB7XHJcbiAgICBjb2xvcjogI2YxZjFmMSA7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xyXG4gICAgd2lkdGg6IDQwMHB4IDtcclxuICAgIGhlaWdodDogMjBweCA7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XHJcbn1cclxuXHJcbi50ZW1wLXN0eWxlLXRpdGxlIHtcclxuICAgIGNvbG9yOiAjZjFmMWYxIDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWYxZjE7XHJcbiAgICB3aWR0aDogMTAwJSA7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA1cHg7XHJcbn1cclxuXHJcbi50ZW1wLXN0eWxlLWltZyB7XHJcbiAgICBjb2xvcjogI2YxZjFmMSA7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xyXG4gICAgd2lkdGg6IDcyMHB4IDtcclxuICAgIGhlaWdodDogNDAwcHggO1xyXG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
{{postItem.Title}}
\\r\\n
\\r\\n No English Data\\r\\n
\\r\\n
{{getDayInWeek()}}, {{postItem.ApprovedAt | date: 'dd/MM/yyyy'}} \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
0\\\">\\r\\n
{{'FileUploadFileUrls' | translate}}:
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{postNLD.Title}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n \"","import { Component, OnInit, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { AppService } from '../../services/app.service';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { AppComponent } from '../../app.component';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport * as FileSaver from 'file-saver';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { ActivatedRoute, Router, NavigationEnd } from '@angular/router';\r\nimport { forEach } from '@angular/router/src/utils/collection';\r\nimport { ElementRef, AfterViewInit, Input } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'app-post-detail',\r\n templateUrl: './post-detail.component.html',\r\n styleUrls: ['./post-detail.component.css']\r\n})\r\nexport class PostDetailComponent implements OnInit {\r\n\r\n @Input() url = window.location.href;\r\n @Input() url_g = window.location.href;\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n\r\n public imageDef = '../../assets/images/default-02.png';\r\n\r\n public apiRoot;\r\n public dataPageItem: any;\r\n public dataPages = [];\r\n public listComment: any[];\r\n public listPostLQ: any[];\r\n public listPostViewMore: any[];\r\n public listPostRelates: any[];\r\n mySubscription: any;\r\n\r\n postItem: any;\r\n postItemEnLanguage: any;\r\n postNLD: any;\r\n commentItem: any;\r\n param = {\r\n urlPath: '',\r\n menuId: ''\r\n };\r\n\r\n isNLD = false;\r\n\r\n languages: Array = [{\r\n id: 0,\r\n culture: 'vi-VN',\r\n text: 'Tiếng Việt'\r\n }, {\r\n id: 1,\r\n culture: 'en-US',\r\n text: 'English'\r\n }];\r\n\r\n languageName = '';\r\n urlDownload = this.appService.apiRoot;\r\n hasData = false;\r\n\r\n constructor(\r\n private language: AppLanguage,\r\n public appControls: AppControls,\r\n public appService: AppService,\r\n public intl: IntlService,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router,\r\n public domSanitizer: DomSanitizer,\r\n private appComponent: AppComponent,\r\n private authenticationService: AuthenticationService,\r\n ) {\r\n this.apiRoot = this.appService.apiRoot;\r\n this.setCommentDefault();\r\n this.setPostDefault();\r\n this.setPostNLD();\r\n this.getLanguageName();\r\n this.activatedRoute.queryParams.subscribe((p: any) => {\r\n this.param.urlPath = p.title;\r\n this.param.menuId = p.menuId\r\n this.getPostItem();\r\n });\r\n\r\n this.router.routeReuseStrategy.shouldReuseRoute = function () {\r\n return false;\r\n };\r\n this.mySubscription = this.router.events.subscribe((event) => {\r\n if (event instanceof NavigationEnd) {\r\n this.router.navigated = false;\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.mySubscription) {\r\n this.mySubscription.unsubscribe();\r\n }\r\n }\r\n\r\n sanitize(url: string) {\r\n return this.domSanitizer.bypassSecurityTrustUrl(url);\r\n }\r\n\r\n setPostDefault() {\r\n this.postItem = {\r\n ImageUrls: '',\r\n Summary: '',\r\n Title: '',\r\n MenuName: '',\r\n ApprovedAt: new Date(),\r\n CountView: 0,\r\n Description: '',\r\n UrlPath: '',\r\n Reference: ''\r\n };\r\n }\r\n\r\n setPostNLD() {\r\n this.postNLD = {\r\n Title: '',\r\n Description: '',\r\n Link: '',\r\n Guid: '',\r\n PubDate: ''\r\n };\r\n }\r\n\r\n setCommentDefault() {\r\n this.commentItem = {\r\n FullName: '',\r\n Phone: '',\r\n Summary: '',\r\n Description: ''\r\n };\r\n }\r\n isUploadFromServe = false;\r\n\r\n public changeLinkVid(des){\r\n var content = des;\r\n try {\r\n var require = content.indexOf(\"= 0) {\r\n while (content.indexOf(\"= 0) {\r\n var st_Index = content.indexOf(\"\")\r\n var sub1 = content.substring(st_Index, end_Index + \" \".length);\r\n\r\n var st_key = sub1.indexOf(\"?v=\"); var end_key = sub1.indexOf('\">');\r\n var key = sub1.substring(st_key + \"?v=\".length, end_key);\r\n\r\n var mainLinkVidYTB = \"//www.youtube.com/embed/\" + key;\r\n var vidLink = this.domSanitizer.bypassSecurityTrustResourceUrl(mainLinkVidYTB);\r\n var replace = '';\r\n\r\n des = des.replace(sub1, replace);\r\n content = des;\r\n } \r\n }\r\n return content;\r\n } catch{\r\n content = des;\r\n return content;\r\n\r\n }\r\n }\r\n\r\n async getPostItem() {\r\n this.hasData = false;\r\n if (this.param.menuId == \"nld\") {\r\n const result = await this.appService.doGET('api/NLDNews/getNewsDetail', this.param);\r\n this.isNLD = true;\r\n this.postNLD = result.Data;\r\n }\r\n else {\r\n const dataRequest = {\r\n urlPath: this.param.urlPath,\r\n languageID: this.languageName\r\n }\r\n const resultPostItem = await this.appService.doGET('api/Post/GetPostDetail', dataRequest);\r\n if (resultPostItem && resultPostItem.Status === 1) {\r\n if (resultPostItem.Data.PostItem){\r\n if(resultPostItem.Data.PostItem.FileUrl == null || resultPostItem.Data.PostItem.FileUrl == \"\"){\r\n resultPostItem.Data.PostItem.FileUrl = [];\r\n }\r\n else{\r\n resultPostItem.Data.PostItem.FileUrl = JSON.parse(resultPostItem.Data.PostItem.FileUrl);\r\n }\r\n // if(resultPostItem.Data.PostItem.Reference == null || resultPostItem.Data.PostItem.Reference == \"\"){\r\n // resultPostItem.Data.PostItem.Reference = \"\";\r\n // }\r\n // else{\r\n // resultPostItem.Data.PostItem.Reference = JSON.parse(resultPostItem.Data.PostItem.Reference);\r\n // resultPostItem.Data.PostItem.Reference = (resultPostItem.Data.PostItem.Reference).join(\";\") \r\n // }\r\n if (resultPostItem.Data.PostItem.MenuName){\r\n resultPostItem.Data.PostItem.MenuTemp = [];\r\n resultPostItem.Data.PostItem.MenuName = resultPostItem.Data.PostItem.MenuName.split(\";\")\r\n if (resultPostItem.Data.PostItem.UrlPathMenu){\r\n resultPostItem.Data.PostItem.UrlPathMenu = resultPostItem.Data.PostItem.UrlPathMenu.split(\";\")\r\n }\r\n for (let i = 0; i < resultPostItem.Data.PostItem.MenuName.length; i++){\r\n resultPostItem.Data.PostItem.MenuTemp.push({\r\n MenuName: resultPostItem.Data.PostItem.MenuName[i],\r\n UrlPathMenu: resultPostItem.Data.PostItem.UrlPathMenu.length > 0 ? resultPostItem.Data.PostItem.UrlPathMenu[i].trim() : ''\r\n })\r\n } \r\n }\r\n } \r\n this.hasData = true;\r\n this.postItem = resultPostItem.Data.PostItem;\r\n this.listPostViewMore = resultPostItem.Data.PostViewMores;\r\n this.listPostRelates = resultPostItem.Data.PostRelates;\r\n if (!this.postItem.ImageUrls) {\r\n this.postItem.ImageUrls = \"\";\r\n }\r\n this.postItem.Description = this.changeLinkVid(this.postItem.Description);\r\n var content = this.postItem.Description;\r\n //check màu đổi sang navy -> Duy\r\n try {\r\n var check = \"hsl(0,0%,0%)\";\r\n var require = content.indexOf(check);\r\n if (require >= 0) {\r\n while (content.indexOf(check) >= 0) {\r\n this.postItem.Description = this.postItem.Description.replace(check, \"navy !important\");\r\n content = this.postItem.Description;\r\n }\r\n }\r\n } catch{\r\n content = this.postItem.Description;\r\n }\r\n this.postItem.Description = this.domSanitizer.bypassSecurityTrustHtml(this.postItem.Description);\r\n try {\r\n if (this.postItem.ImageUrls.indexOf(\"Multimedia\") > 0) {\r\n this.isUploadFromServe = true;\r\n }\r\n } catch{\r\n this.isUploadFromServe = false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.commentItem;\r\n return {\r\n Title: this.postItem.Title,\r\n PostID: this.postItem.ID,\r\n FullName: temp.FullName,\r\n Phone: temp.Phone,\r\n Description: temp.Description,\r\n PortalFlg: true\r\n };\r\n }\r\n\r\n async onSendComment() {\r\n\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPOST('api/Comment/SendByPost', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.setCommentDefault();\r\n }\r\n }\r\n\r\n public onGoToDetail(id: any) {\r\n this.router.navigate(['portal/post-detail'], { queryParams: { id } });\r\n }\r\n\r\n\r\n onClickPostItem(item) {\r\n this.router.navigate(['portal/post-detail'], { queryParams: { title: item.UrlPath } });\r\n }\r\n\r\n onChangeLanguage(e: any) {\r\n this.languageName = e;\r\n }\r\n\r\n getLanguageName() {\r\n let lang = localStorage.getItem('currentLanguage');\r\n if (lang == null || lang == undefined) {\r\n lang = \"vi-VN\";\r\n }\r\n this.languageName = lang;\r\n }\r\n\r\n getUrlDownload(item) {\r\n let url = this.urlDownload.replace(/\\\"/g, \"\") + item;\r\n url = url.replace(/\\\"/g, '')\r\n return url;\r\n }\r\n\r\n getDayInWeek() {\r\n var day_name = '';\r\n if (this.postItem && this.postItem.ApprovedAt){\r\n var date = new Date(this.postItem.ApprovedAt);\r\n switch (date.getDay()) {\r\n case 0:\r\n day_name = \"Chủ nhật\";\r\n break;\r\n case 1:\r\n day_name = \"Thứ hai\";\r\n break;\r\n case 2:\r\n day_name = \"Thứ ba\";\r\n break;\r\n case 3:\r\n day_name = \"Thứ tư\";\r\n break;\r\n case 4:\r\n day_name = \"Thứ năm\";\r\n break;\r\n case 5:\r\n day_name = \"Thứ sáu\";\r\n break;\r\n case 6:\r\n day_name = \"Thứ bảy\";\r\n }\r\n }\r\n \r\n return day_name\r\n }\r\n}\r\n","module.exports = \".titleBottom {\\r\\n padding-top: 10px;\\r\\n padding-bottom: 10px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 10px;\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.txtCountSearchCmt {\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n font-weight: bold;\\r\\n /* margin-bottom: 20px; */\\r\\n margin-top: 30px;\\r\\n}\\r\\n\\r\\n.itemRow {\\r\\n padding-top: 20px;\\r\\n padding-bottom: 20px;\\r\\n}\\r\\n\\r\\n.titleSearchPage {\\r\\n margin-top: 30px;\\r\\n margin-bottom: 20px !important;\\r\\n font-size: 18px;\\r\\n color: black !important;\\r\\n}\\r\\n\\r\\n.label {\\r\\n font-size: 16px;\\r\\n font-weight: bold;\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.content {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.img-logo {\\r\\n width: 100%;\\r\\n height: 183px;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.post-item {\\r\\n align-self: center;\\r\\n font-weight: 500;\\r\\n}\\r\\n\\r\\n.post-item .title:hover {\\r\\n color: #006CB7;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.post-item .title1:hover {\\r\\n /* color: #006CB7; */\\r\\n cursor: pointer;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.post-item .title {\\r\\n /* height: 22px; */\\r\\n /* white-space: nowrap; */\\r\\n /* overflow: hidden; */\\r\\n /* text-overflow: ellipsis; */\\r\\n padding-left: 30px;\\r\\n color: #006CB7;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\n.post-item .title1 {\\r\\n font-size: 16px;\\r\\n /* white-space: nowrap; */\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n /* margin-top: 10px; */\\r\\n max-height: 70px;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n text-align: left;\\r\\n padding: 0px !important;\\r\\n}\\r\\n\\r\\n.post-title {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.post-title:hover {\\r\\n cursor: pointer;\\r\\n color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n.no-data {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.post-item .summaray {\\r\\n margin-top: 10px;\\r\\n font-size: 13px;\\r\\n overflow: hidden;\\r\\n text-overflow: inherit;\\r\\n max-height: 96px;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.post-item .summaray:hover {\\r\\n cursor: pointer;\\r\\n color: #006CB7 !important;\\r\\n}\\r\\n\\r\\n.group-body-item {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n height: 130px;\\r\\n}\\r\\n\\r\\n.group-body-item-none-bg {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n}\\r\\n\\r\\n.group-body-item:hover,\\r\\n.group-body-item-none-bg :hover {\\r\\n color: #006CB7;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.portal .group-body-2 {\\r\\n background-color: #F5F5F5;\\r\\n padding: 10px 20px;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .img-logo {\\r\\n width: 100%;\\r\\n height: 100px;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n }\\r\\n .post-image-temp{\\r\\n width: 100%;\\r\\n height: 100px;\\r\\n background-color: #f1f1f1;\\r\\n }\\r\\n}\\r\\n\\r\\n.margin-new-docx {\\r\\n margin-top: 0px !important;\\r\\n}\\r\\n\\r\\n.post-image-temp{\\r\\n width: 100%;\\r\\n height: 200px;\\r\\n background-color: #f1f1f1;\\r\\n}\\r\\n\\r\\n.post-list-temp{\\r\\n width: 100%;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3Bvc3QtbGlzdC9wb3N0LWxpc3QuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsOEJBQThCO0lBQzlCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsWUFBWTtJQUNaLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLGVBQWU7SUFDZixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCLHlCQUF5QjtJQUN6QixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0JBQW9CO0FBQ3hCOztBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLDhCQUE4QjtJQUM5QixlQUFlO0lBQ2YsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksZUFBZTtBQUNuQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0lBQ2Isb0JBQWlCO09BQWpCLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxjQUFjO0lBQ2QsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2YsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQix5QkFBeUI7SUFDekIsc0JBQXNCO0lBQ3RCLDZCQUE2QjtJQUM3QixrQkFBa0I7SUFDbEIsY0FBYztJQUNkLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLGdCQUFnQjtJQUNoQix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLGdCQUFnQjtJQUNoQiwyQkFBbUI7SUFBbkIsd0JBQW1CO0lBQW5CLG1CQUFtQjtJQUNuQixnQkFBZ0I7SUFDaEIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0ksV0FBVztBQUNmOztBQUVBO0lBQ0ksZUFBZTtJQUNmLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsMkJBQW1CO0lBQW5CLHdCQUFtQjtJQUFuQixtQkFBbUI7SUFDbkIsV0FBVztBQUNmOztBQUVBO0lBQ0ksZUFBZTtJQUNmLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLG9CQUFvQjtJQUNwQixpQkFBaUI7SUFDakIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLG9CQUFvQjtJQUNwQixpQkFBaUI7QUFDckI7O0FBRUE7O0lBRUksY0FBYztJQUNkLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0k7UUFDSSxXQUFXO1FBQ1gsYUFBYTtRQUNiLG9CQUFpQjtXQUFqQixpQkFBaUI7SUFDckI7SUFDQTtRQUNJLFdBQVc7UUFDWCxhQUFhO1FBQ2IseUJBQXlCO0lBQzdCO0FBQ0o7O0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLHlCQUF5QjtBQUM3Qjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxtQkFBbUI7QUFDdkIiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvcG9zdC1saXN0L3Bvc3QtbGlzdC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnRpdGxlQm90dG9tIHtcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDZDQjc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xyXG59XHJcblxyXG4udHh0Q291bnRTZWFyY2hDbXQge1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY29sb3I6IGJsYWNrO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAvKiBtYXJnaW4tYm90dG9tOiAyMHB4OyAqL1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxufVxyXG5cclxuLml0ZW1Sb3cge1xyXG4gICAgcGFkZGluZy10b3A6IDIwcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMjBweDtcclxufVxyXG5cclxuLnRpdGxlU2VhcmNoUGFnZSB7XHJcbiAgICBtYXJnaW4tdG9wOiAzMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweCAhaW1wb3J0YW50O1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG4gICAgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5sYWJlbCB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGNvbG9yOiBibGFjaztcclxufVxyXG5cclxuLmNvbnRlbnQge1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG59XHJcblxyXG4uaW1nLWxvZ28ge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDE4M3B4O1xyXG4gICAgb2JqZWN0LWZpdDogY292ZXI7XHJcbn1cclxuXHJcbi5wb3N0LWl0ZW0ge1xyXG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcclxufVxyXG5cclxuLnBvc3QtaXRlbSAudGl0bGU6aG92ZXIge1xyXG4gICAgY29sb3I6ICMwMDZDQjc7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5wb3N0LWl0ZW0gLnRpdGxlMTpob3ZlciB7XHJcbiAgICAvKiBjb2xvcjogIzAwNkNCNzsgKi9cclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxufVxyXG5cclxuLnBvc3QtaXRlbSAudGl0bGUge1xyXG4gICAgLyogaGVpZ2h0OiAyMnB4OyAqL1xyXG4gICAgLyogd2hpdGUtc3BhY2U6IG5vd3JhcDsgKi9cclxuICAgIC8qIG92ZXJmbG93OiBoaWRkZW47ICovXHJcbiAgICAvKiB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgKi9cclxuICAgIHBhZGRpbmctbGVmdDogMzBweDtcclxuICAgIGNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG59XHJcblxyXG4ucG9zdC1pdGVtIC50aXRsZTEge1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgLyogd2hpdGUtc3BhY2U6IG5vd3JhcDsgKi9cclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICAgIC8qIG1hcmdpbi10b3A6IDEwcHg7ICovXHJcbiAgICBtYXgtaGVpZ2h0OiA3MHB4O1xyXG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLnBvc3QtdGl0bGUge1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbi5wb3N0LXRpdGxlOmhvdmVyIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGNvbG9yOiAjMDA2Q0I3ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5uby1kYXRhIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4ucG9zdC1pdGVtIC5zdW1tYXJheSB7XHJcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIHRleHQtb3ZlcmZsb3c6IGluaGVyaXQ7XHJcbiAgICBtYXgtaGVpZ2h0OiA5NnB4O1xyXG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4ucG9zdC1pdGVtIC5zdW1tYXJheTpob3ZlciB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBjb2xvcjogIzAwNkNCNyAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uZ3JvdXAtYm9keS1pdGVtIHtcclxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xyXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XHJcbiAgICBoZWlnaHQ6IDEzMHB4O1xyXG59XHJcblxyXG4uZ3JvdXAtYm9keS1pdGVtLW5vbmUtYmcge1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcclxufVxyXG5cclxuLmdyb3VwLWJvZHktaXRlbTpob3ZlcixcclxuLmdyb3VwLWJvZHktaXRlbS1ub25lLWJnIDpob3ZlciB7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLnBvcnRhbCAuZ3JvdXAtYm9keS0yIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7XHJcbn1cclxuXHJcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjhweCkge1xyXG4gICAgLmltZy1sb2dvIHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBoZWlnaHQ6IDEwMHB4O1xyXG4gICAgICAgIG9iamVjdC1maXQ6IGNvdmVyO1xyXG4gICAgfVxyXG4gICAgLnBvc3QtaW1hZ2UtdGVtcHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBoZWlnaHQ6IDEwMHB4O1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWYxZjE7XHJcbiAgICB9XHJcbn1cclxuXHJcbi5tYXJnaW4tbmV3LWRvY3gge1xyXG4gICAgbWFyZ2luLXRvcDogMHB4ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5wb3N0LWltYWdlLXRlbXB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMjAwcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmMWYxO1xyXG59XHJcblxyXG4ucG9zdC1saXN0LXRlbXB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
Không có nội dung nào được hiển thị
\\r\\n
No Records to show
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ActivatedRoute, Router, NavigationEnd } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-post-list',\r\n templateUrl: './post-list.component.html',\r\n styleUrls: ['./post-list.component.css']\r\n})\r\nexport class PostListComponent implements OnInit {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n //codeimage\r\n postNewInput = null;\r\n\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n dataPostNews = [];\r\n dataPostNewsLatest = [];\r\n dataPostNewDetail = null;\r\n dataPostNewSelectableSettings: SelectableSettings;\r\n dataPostNewSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataPostNewFocus = {\r\n Name: true\r\n };\r\n dataPostNewSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataPostNewSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataPostNewPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataPostNewSelection: number[] = [];\r\n dataPostNewItem: any;\r\n myInterval: any;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public postNewFlg = false;\r\n\r\n public dataPostNewState: State = {\r\n skip: this.dataPostNewSkip,\r\n take: this.dataPostNewSkip + this.dataPostNewPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n dataPostNewGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n mySubscription: any;\r\n\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n isReplyPage = false;\r\n tabIndex = 0;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n FromDate: null,\r\n ToDate: null,\r\n UrlPath: 0,\r\n Status: 0\r\n };\r\n\r\n languageName = '';\r\n\r\n languages: Array = [{\r\n id: 0,\r\n culture: 'vi-VN',\r\n text: 'Tiếng Việt'\r\n }, {\r\n id: 1,\r\n culture: 'en-US',\r\n text: 'English'\r\n }];\r\n\r\n public imageDef = '../../assets/images/default-02.png';\r\n listPostViewMore: any[];\r\n listPostRelates: any[];\r\n dataPostNewsTemp = [1, 2, 3,4,5,6,7,8];\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router,\r\n ) {\r\n\r\n this.activatedRoute.queryParams.subscribe((params: any) => {\r\n if (params && params.title) {\r\n this.searchOption.UrlPath = params.title;\r\n this.onReload();\r\n }\r\n });\r\n //window.location.reload();\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.setSelectableSettings();\r\n this.getLanguageName();\r\n //this.onChangeLanguage('vi-VN');\r\n //this.onReload();\r\n\r\n this.router.routeReuseStrategy.shouldReuseRoute = function () {\r\n return false;\r\n };\r\n this.mySubscription = this.router.events.subscribe((event) => {\r\n if (event instanceof NavigationEnd) {\r\n this.router.navigated = false;\r\n }\r\n });\r\n }\r\n\r\n\r\n\r\n ngOnInit() {\r\n }\r\n\r\n\r\n ngOnDestroy() {\r\n if (this.mySubscription) {\r\n this.mySubscription.unsubscribe();\r\n }\r\n }\r\n\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataPostNewSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n\r\n onSearchKeyPress(e: any) {\r\n // if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n // this.onSearch();\r\n // }\r\n }\r\n isUploadFromServe = false;\r\n async getPostNews() {\r\n this.loading = true;\r\n const dataRequest = {\r\n urlPath: this.searchOption.UrlPath,\r\n };\r\n\r\n const result = await this.appService.doGET('api/Post/GetPostList', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataPostNews = result.Data.PostNews;\r\n this.dataPostNewsTemp = null;\r\n this.listPostViewMore = result.Data.PostViewMores;\r\n this.listPostRelates = result.Data.PostRelates; \r\n this.bindPostNews();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataPostNewSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataPostNews.find((item) => {\r\n return item.ID === this.dataPostNewSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataPostNewSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n onPostNewPageChange(event: PageChangeEvent) {\r\n this.dataPostNewSkip = event.skip;\r\n this.bindPostNews();\r\n }\r\n\r\n bindPostNews() {\r\n this.dataPostNewGridDataResult = {\r\n data: orderBy(this.dataPostNews, this.dataPostNewSortByField),\r\n total: this.dataPostNews.length\r\n };\r\n\r\n this.dataPostNewGridDataResult = process(this.dataPostNews, this.dataPostNewState);\r\n }\r\n\r\n onPostNewsortChange(sort: SortDescriptor[]): void {\r\n this.dataPostNewSortByField = sort;\r\n this.bindPostNews();\r\n }\r\n\r\n public onPostNewDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataPostNewSelection = [];\r\n this.dataPostNewState = state;\r\n this.dataPostNewGridDataResult = process(this.dataPostNews, this.dataPostNewState);\r\n }\r\n\r\n onReload() {\r\n this.getPostNews();\r\n }\r\n\r\n onReloadPost(e: any) {\r\n let drop = document.getElementsByClassName('dropdown-menu') as HTMLCollectionOf;\r\n // for(let i = 0; i < drop.length ; i++){\r\n // drop[i].style.visibility = null;\r\n // }\r\n this.searchOption.UrlPath = e;\r\n this.getPostNews();\r\n }\r\n\r\n onClickPostNew(dataItem) {\r\n this.router.navigate(['portal/post-detail'], { queryParams: { title: dataItem.UrlPath, menuId: dataItem.MenuID } });\r\n }\r\n\r\n onChangeLanguage(e: any) {\r\n this.languageName = e;\r\n }\r\n\r\n getLanguageName() {\r\n let lang = localStorage.getItem('currentLanguage');\r\n if (lang == null || lang == undefined) {\r\n lang = \"vi-VN\";\r\n }\r\n this.languageName = lang;\r\n }\r\n}\r\n\r\n","module.exports = \".titleBottom {\\r\\n padding-top: 10px;\\r\\n padding-bottom: 10px;\\r\\n border-left: 5px solid #006CB7;\\r\\n padding-left: 10px;\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n margin-bottom: 20px;\\r\\n}\\r\\n\\r\\n.txtCountSearchCmt {\\r\\n font-size: 16px;\\r\\n color: black;\\r\\n font-weight: bold;\\r\\n /* margin-bottom: 20px; */\\r\\n margin-top: 30px;\\r\\n}\\r\\n\\r\\n.itemRow {\\r\\n padding-top: 20px;\\r\\n padding-bottom: 20px;\\r\\n}\\r\\n\\r\\n.titleSearchPage {\\r\\n margin-top: 30px;\\r\\n margin-bottom: 20px !important;\\r\\n font-size: 18px;\\r\\n color: black !important;\\r\\n}\\r\\n\\r\\n.label {\\r\\n font-size: 16px;\\r\\n font-weight: bold;\\r\\n color: black;\\r\\n}\\r\\n\\r\\n.content {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.img-logo {\\r\\n width: 100%;\\r\\n height: 183px;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.post-item {\\r\\n align-self: center;\\r\\n font-weight: 500;\\r\\n}\\r\\n\\r\\n.post-item .title:hover {\\r\\n color: #006CB7 !important;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.post-item .title1:hover {\\r\\n color: #006CB7 !important;\\r\\n cursor: pointer;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.post-item .summaray:hover {\\r\\n color: #006CB7 !important;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.post-item .title {\\r\\n /* height: 22px; */\\r\\n /* white-space: nowrap; */\\r\\n /* overflow: hidden; */\\r\\n /* text-overflow: ellipsis; */\\r\\n padding-left: 30px;\\r\\n color: #006CB7;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\n.post-item .title1 {\\r\\n font-size: 16px;\\r\\n /* white-space: nowrap; */\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n margin-top: 10px;\\r\\n color: navy;\\r\\n max-height: 70px;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n}\\r\\n\\r\\n.post-item .summaray {\\r\\n margin-top: 10px;\\r\\n font-size: 13px;\\r\\n overflow: hidden;\\r\\n text-overflow: inherit;\\r\\n max-height: 96px;\\r\\n color: navy;\\r\\n height: -webkit-fit-content;\\r\\n height: -moz-fit-content;\\r\\n height: fit-content;\\r\\n}\\r\\n\\r\\n.group-body-item {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n height: 130px;\\r\\n}\\r\\n\\r\\n.group-body-item-none-bg {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n}\\r\\n\\r\\n.group-body-item:hover,\\r\\n.group-body-item-none-bg :hover {\\r\\n color: #006CB7;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.portal .group-body-2 {\\r\\n background-color: #F5F5F5;\\r\\n padding: 10px 20px;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .img-logo {\\r\\n width: 100%;\\r\\n height: 100px;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n }\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3Bvc3QtcmVzdWx0L3Bvc3QtcmVzdWx0LmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLDhCQUE4QjtJQUM5QixrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLFlBQVk7SUFDWixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQix5QkFBeUI7SUFDekIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLG9CQUFvQjtBQUN4Qjs7QUFFQTtJQUNJLGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsZUFBZTtJQUNmLHVCQUF1QjtBQUMzQjs7QUFFQTtJQUNJLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtJQUNiLG9CQUFpQjtPQUFqQixpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxrQkFBa0I7SUFDbEIsZ0JBQWdCO0FBQ3BCOztBQUVBO0lBQ0kseUJBQXlCO0lBQ3pCLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsZUFBZTtJQUNmLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGtCQUFrQjtJQUNsQix5QkFBeUI7SUFDekIsc0JBQXNCO0lBQ3RCLDZCQUE2QjtJQUM3QixrQkFBa0I7SUFDbEIsY0FBYztJQUNkLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YseUJBQXlCO0lBQ3pCLGdCQUFnQjtJQUNoQix1QkFBdUI7SUFDdkIsZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsMkJBQW1CO0lBQW5CLHdCQUFtQjtJQUFuQixtQkFBbUI7QUFDdkI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsZ0JBQWdCO0lBQ2hCLFdBQVc7SUFDWCwyQkFBbUI7SUFBbkIsd0JBQW1CO0lBQW5CLG1CQUFtQjtBQUN2Qjs7QUFFQTtJQUNJLG9CQUFvQjtJQUNwQixpQkFBaUI7SUFDakIsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLG9CQUFvQjtJQUNwQixpQkFBaUI7QUFDckI7O0FBRUE7O0lBRUksY0FBYztJQUNkLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0k7UUFDSSxXQUFXO1FBQ1gsYUFBYTtRQUNiLG9CQUFpQjtXQUFqQixpQkFBaUI7SUFDckI7QUFDSiIsImZpbGUiOiJzcmMvYXBwL3BvcnRhbC9wb3N0LXJlc3VsdC9wb3N0LXJlc3VsdC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnRpdGxlQm90dG9tIHtcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMDZDQjc7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xyXG59XHJcblxyXG4udHh0Q291bnRTZWFyY2hDbXQge1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY29sb3I6IGJsYWNrO1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAvKiBtYXJnaW4tYm90dG9tOiAyMHB4OyAqL1xyXG4gICAgbWFyZ2luLXRvcDogMzBweDtcclxufVxyXG5cclxuLml0ZW1Sb3cge1xyXG4gICAgcGFkZGluZy10b3A6IDIwcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMjBweDtcclxufVxyXG5cclxuLnRpdGxlU2VhcmNoUGFnZSB7XHJcbiAgICBtYXJnaW4tdG9wOiAzMHB4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMjBweCAhaW1wb3J0YW50O1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG4gICAgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5sYWJlbCB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGNvbG9yOiBibGFjaztcclxufVxyXG5cclxuLmNvbnRlbnQge1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG59XHJcblxyXG4uaW1nLWxvZ28ge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDE4M3B4O1xyXG4gICAgb2JqZWN0LWZpdDogY292ZXI7XHJcbn1cclxuXHJcbi5wb3N0LWl0ZW0ge1xyXG4gICAgYWxpZ24tc2VsZjogY2VudGVyO1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcclxufVxyXG5cclxuLnBvc3QtaXRlbSAudGl0bGU6aG92ZXIge1xyXG4gICAgY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxufVxyXG5cclxuLnBvc3QtaXRlbSAudGl0bGUxOmhvdmVyIHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3ICFpbXBvcnRhbnQ7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbi5wb3N0LWl0ZW0gLnN1bW1hcmF5OmhvdmVyIHtcclxuICAgIGNvbG9yOiAjMDA2Q0I3ICFpbXBvcnRhbnQ7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5wb3N0LWl0ZW0gLnRpdGxlIHtcclxuICAgIC8qIGhlaWdodDogMjJweDsgKi9cclxuICAgIC8qIHdoaXRlLXNwYWNlOiBub3dyYXA7ICovXHJcbiAgICAvKiBvdmVyZmxvdzogaGlkZGVuOyAqL1xyXG4gICAgLyogdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7ICovXHJcbiAgICBwYWRkaW5nLWxlZnQ6IDMwcHg7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxufVxyXG5cclxuLnBvc3QtaXRlbSAudGl0bGUxIHtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIC8qIHdoaXRlLXNwYWNlOiBub3dyYXA7ICovXHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbiAgICBtYXgtaGVpZ2h0OiA3MHB4O1xyXG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcclxufVxyXG5cclxuLnBvc3QtaXRlbSAuc3VtbWFyYXkge1xyXG4gICAgbWFyZ2luLXRvcDogMTBweDtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB0ZXh0LW92ZXJmbG93OiBpbmhlcml0O1xyXG4gICAgbWF4LWhlaWdodDogOTZweDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG4gICAgaGVpZ2h0OiBmaXQtY29udGVudDtcclxufVxyXG5cclxuLmdyb3VwLWJvZHktaXRlbSB7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgaGVpZ2h0OiAxMzBweDtcclxufVxyXG5cclxuLmdyb3VwLWJvZHktaXRlbS1ub25lLWJnIHtcclxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xyXG4gICAgcGFkZGluZy10b3A6IDEwcHg7XHJcbn1cclxuXHJcbi5ncm91cC1ib2R5LWl0ZW06aG92ZXIsXHJcbi5ncm91cC1ib2R5LWl0ZW0tbm9uZS1iZyA6aG92ZXIge1xyXG4gICAgY29sb3I6ICMwMDZDQjc7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbn1cclxuXHJcbi5wb3J0YWwgLmdyb3VwLWJvZHktMiB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY1O1xyXG4gICAgcGFkZGluZzogMTBweCAyMHB4O1xyXG59XHJcblxyXG5AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY4cHgpIHtcclxuICAgIC5pbWctbG9nbyB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDBweDtcclxuICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjtcclxuICAgIH1cclxufSJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
Không có nội dung nào được hiển thị
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{dataItem.Title}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-post-result',\r\n templateUrl: './post-result.component.html',\r\n styleUrls: ['./post-result.component.css']\r\n})\r\nexport class PostResultComponent implements OnInit, OnDestroy {\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n //codeimage\r\n postNewInput = null;\r\n\r\n searchTxtInput= '';\r\n\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n dataPostNews = [];\r\n dataPostNewsLatest = [];\r\n dataPostNewDetail = null;\r\n dataPostNewSelectableSettings: SelectableSettings;\r\n dataPostNewSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataPostNewFocus = {\r\n Name: true\r\n };\r\n dataPostNewSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'ParentName',\r\n // dir: 'asc'\r\n // }, {\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataPostNewSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataPostNewPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataPostNewSelection: number[] = [];\r\n dataPostNewItem: any;\r\n myInterval: any;\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public postNewFlg = false;\r\n\r\n public dataPostNewState: State = {\r\n skip: this.dataPostNewSkip,\r\n take: this.dataPostNewSkip + this.dataPostNewPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n dataPostNewGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n isReplyPage = false;\r\n tabIndex = 0;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n FromDate: null,\r\n ToDate: null,\r\n MenuID: 0,\r\n Status: 0\r\n };\r\n\r\n public imageDef = '../../assets/images/default-02.png';\r\n listPostViewMore: any[];\r\n listPostRelates: any[];\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n private activatedRoute: ActivatedRoute,\r\n private router: Router,\r\n ) {\r\n\r\n this.activatedRoute.queryParams.subscribe((params: any) => {\r\n if (params) {\r\n this.searchTxtInput = params.searchparam;\r\n this.onSearchChange(this.searchTxtInput);\r\n }\r\n \r\n });\r\n\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.language.default();\r\n this.setSelectableSettings();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataPostNewSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n\r\n onSearchKeyPress(e: any) {\r\n // if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n // this.onSearch();\r\n // }\r\n }\r\n isUploadFromServe = false;\r\n async getPostNews() {\r\n this.loading = true;\r\n const dataRequest = {\r\n menuID: this.searchOption.MenuID,\r\n };\r\n\r\n const result = await this.appService.doGET('api/Post/GetPostList', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataPostNews = result.Data.PostNews;\r\n this.listPostViewMore = result.Data.PostViewMores;\r\n this.listPostRelates = result.Data.PostRelates;\r\n\r\n if (this.dataPostNews.length == 1) {\r\n this.router.navigate(['portal/post-detail'], { queryParams: { title: this.dataPostNews[0].UrlPath } });\r\n }\r\n\r\n this.bindPostNews();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataPostNewSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataPostNews.find((item) => {\r\n return item.ID === this.dataPostNewSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataPostNewSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n onPostNewPageChange(event: PageChangeEvent) {\r\n this.dataPostNewSkip = event.skip;\r\n this.bindPostNews();\r\n }\r\n\r\n bindPostNews() {\r\n this.dataPostNewGridDataResult = {\r\n data: orderBy(this.dataPostNews, this.dataPostNewSortByField),\r\n total: this.dataPostNews.length\r\n };\r\n\r\n this.dataPostNewGridDataResult = process(this.dataPostNews, this.dataPostNewState);\r\n }\r\n\r\n onPostNewsortChange(sort: SortDescriptor[]): void {\r\n this.dataPostNewSortByField = sort;\r\n this.bindPostNews();\r\n }\r\n\r\n public onPostNewDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataPostNewSelection = [];\r\n this.dataPostNewState = state;\r\n this.dataPostNewGridDataResult = process(this.dataPostNews, this.dataPostNewState);\r\n }\r\n\r\n onReload() {\r\n this.getPostNews();\r\n }\r\n\r\n onClickPostNew(dataItem) {\r\n this.router.navigate(['portal/post-detail'], { queryParams: { title: dataItem.UrlPath } });\r\n }\r\n\r\n async onSearchChange(e: any) {\r\n const dataRequest = {\r\n searchText: e ? e : ''\r\n };\r\n\r\n const result = await this.appService.doGET('api/Post/SearchText', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataPostNews = result.Data.PostNews;\r\n this.bindPostNews();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n}\r\n","module.exports = \".banner-right {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n}\\r\\n\\r\\n.portal .group-body-2 {\\r\\n background-color: #F5F5F5;\\r\\n padding: 10px 20px\\r\\n}\\r\\n\\r\\n.group-body-item {\\r\\n padding-bottom: 10px;\\r\\n padding-top: 10px;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3JpZ2h0L3JpZ2h0LmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLHlCQUF5QjtJQUN6QjtBQUNKOztBQUVBO0lBQ0ksb0JBQW9CO0lBQ3BCLGlCQUFpQjtBQUNyQiIsImZpbGUiOiJzcmMvYXBwL3BvcnRhbC9yaWdodC9yaWdodC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLmJhbm5lci1yaWdodCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMjA2cHg7XHJcbn1cclxuXHJcbi5wb3J0YWwgLmdyb3VwLWJvZHktMiB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY1O1xyXG4gICAgcGFkZGluZzogMTBweCAyMHB4XHJcbn1cclxuXHJcbi5ncm91cC1ib2R5LWl0ZW0ge1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcclxufSJdfQ== */\"","module.exports = \"\"","import { Component, OnInit } from '@angular/core';\r\nimport { AppService } from 'src/app/services/app.service';\r\n\r\n@Component({\r\n selector: 'app-right',\r\n templateUrl: './right.component.html',\r\n styleUrls: ['./right.component.css']\r\n})\r\nexport class RightComponent implements OnInit {\r\n\r\n listBanners: any[];\r\n\r\n constructor(\r\n public appService: AppService\r\n ) {\r\n this.onReload();\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async onReload() {\r\n const resultBanner = await this.appService.doGET('api/Post/GetBannerRight', null);\r\n if (resultBanner && resultBanner.Status === 1) {\r\n this.listBanners = resultBanner.Data;\r\n }\r\n }\r\n\r\n}\r\n","module.exports = \"\\r\\n::-moz-selection {\\r\\n background: rgba(2,139,255,1);\\r\\n color: #fff;\\r\\n text-shadow: none;\\r\\n}\\r\\n::selection {\\r\\n background: rgba(2,139,255,1);\\r\\n color: #fff;\\r\\n text-shadow: none;\\r\\n}\\r\\n.col-sm-6 {\\r\\n width: 50%;\\r\\n}\\r\\n.home-top-box .box {\\r\\n text-align: center;\\r\\n padding: 50px 10%;\\r\\n background-color: #fff;\\r\\n border: 1px solid #F3F3F3;\\r\\n transition: all 0.3s ease-out 0s;\\r\\n margin: 0 0 20px 0;\\r\\n}\\r\\n.home-top-box .box i {\\r\\n text-align: center;\\r\\n font-size: 42px;\\r\\n color: #006CB7;\\r\\n transition: all 0.3s ease-out 0s;\\r\\n}\\r\\n.home-top-box .box h4 {\\r\\n color: #333;\\r\\n padding: 15px 0px;\\r\\n position: relative;\\r\\n text-transform: capitalize;\\r\\n font-size: 20px;\\r\\n font-weight: 500;\\r\\n}\\r\\n.fa, .fas {\\r\\n font-weight: 500;\\r\\n}\\r\\n.home-top-box .box:hover {\\r\\n background: #006CB7;\\r\\n}\\r\\n.home-top-box .box:hover i {\\r\\n color: #fff;\\r\\n}\\r\\n.home-top-box .box:hover h4 {\\r\\n color: #fff;\\r\\n}\\r\\na, u {\\r\\n text-decoration: none;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3NlcnZpY2Utb25saW5lL3NlcnZpY2Utb25saW5lLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBO0lBQ0ksNkJBQTZCO0lBQzdCLFdBQVc7SUFDWCxpQkFBaUI7QUFDckI7QUFKQTtJQUNJLDZCQUE2QjtJQUM3QixXQUFXO0lBQ1gsaUJBQWlCO0FBQ3JCO0FBQ0E7SUFDSSxVQUFVO0FBQ2Q7QUFDQTtJQUNJLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsc0JBQXNCO0lBQ3RCLHlCQUF5QjtJQUt6QixnQ0FBZ0M7SUFDaEMsa0JBQWtCO0FBQ3RCO0FBQ0E7SUFDSSxrQkFBa0I7SUFDbEIsZUFBZTtJQUNmLGNBQWM7SUFLZCxnQ0FBZ0M7QUFDcEM7QUFDQTtJQUNJLFdBQVc7SUFDWCxpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLDBCQUEwQjtJQUMxQixlQUFlO0lBQ2YsZ0JBQWdCO0FBQ3BCO0FBQ0E7SUFDSSxnQkFBZ0I7QUFDcEI7QUFDQTtJQUNJLG1CQUFtQjtBQUN2QjtBQUNBO0lBQ0ksV0FBVztBQUNmO0FBQ0E7SUFDSSxXQUFXO0FBQ2Y7QUFDQTtJQUNJLHFCQUFxQjtBQUN6QiIsImZpbGUiOiJzcmMvYXBwL3BvcnRhbC9zZXJ2aWNlLW9ubGluZS9zZXJ2aWNlLW9ubGluZS5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbjo6c2VsZWN0aW9uIHtcclxuICAgIGJhY2tncm91bmQ6IHJnYmEoMiwxMzksMjU1LDEpO1xyXG4gICAgY29sb3I6ICNmZmY7XHJcbiAgICB0ZXh0LXNoYWRvdzogbm9uZTtcclxufVxyXG4uY29sLXNtLTYge1xyXG4gICAgd2lkdGg6IDUwJTtcclxufVxyXG4uaG9tZS10b3AtYm94IC5ib3gge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgcGFkZGluZzogNTBweCAxMCU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgI0YzRjNGMztcclxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZS1vdXQgMHM7XHJcbiAgICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2Utb3V0IDBzO1xyXG4gICAgLW1zLXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2Utb3V0IDBzO1xyXG4gICAgLW8tdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZS1vdXQgMHM7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlLW91dCAwcztcclxuICAgIG1hcmdpbjogMCAwIDIwcHggMDtcclxufVxyXG4uaG9tZS10b3AtYm94IC5ib3ggaSB7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBmb250LXNpemU6IDQycHg7XHJcbiAgICBjb2xvcjogIzAwNkNCNztcclxuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZS1vdXQgMHM7XHJcbiAgICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2Utb3V0IDBzO1xyXG4gICAgLW1zLXRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2Utb3V0IDBzO1xyXG4gICAgLW8tdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZS1vdXQgMHM7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlLW91dCAwcztcclxufVxyXG4uaG9tZS10b3AtYm94IC5ib3ggaDQge1xyXG4gICAgY29sb3I6ICMzMzM7XHJcbiAgICBwYWRkaW5nOiAxNXB4IDBweDtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplO1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcclxufVxyXG4uZmEsIC5mYXMge1xyXG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcclxufVxyXG4uaG9tZS10b3AtYm94IC5ib3g6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZDogIzAwNkNCNztcclxufVxyXG4uaG9tZS10b3AtYm94IC5ib3g6aG92ZXIgaSB7XHJcbiAgICBjb2xvcjogI2ZmZjtcclxufVxyXG4uaG9tZS10b3AtYm94IC5ib3g6aG92ZXIgaDQge1xyXG4gICAgY29sb3I6ICNmZmY7XHJcbn1cclxuYSwgdSB7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \"","import { Component, OnInit, HostListener } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-service-online',\r\n templateUrl: './service-online.component.html',\r\n styleUrls: ['./service-online.component.css']\r\n})\r\nexport class ServiceOnlineComponent implements OnInit {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","module.exports = \"\\r\\n.table {\\r\\n /* width: 750px; */\\r\\n /* phong */\\r\\n border:1px solid lightgray;\\r\\n}\\r\\n\\r\\n.columnTitle {\\r\\n border-right:1px solid lightgray;\\r\\n font-size: 16px;\\r\\n font-weight: bold;\\r\\n padding-top: 20px;\\r\\n padding-bottom: 20px;\\r\\n padding-left: 10px;\\r\\n padding-right: 10px;\\r\\n align-self: center;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.content {\\r\\n font-size: 14px;\\r\\n padding-top: 20px;\\r\\n padding-bottom: 20px;\\r\\n padding-left: 10px;\\r\\n padding-right: 10px;\\r\\n align-self: center;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.title {\\r\\n padding-left:20px; \\r\\n margin-top:30px; \\r\\n margin-bottom: 30px;\\r\\n padding-top:10px;\\r\\n padding-bottom: 10px;\\r\\n border-left: 5px solid #006CB7;\\r\\n font-size: 20px;\\r\\n font-weight: bold;\\r\\n color: black;\\r\\n /* width: 750px; */\\r\\n /* phong */\\r\\n background: #F9F9F9;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3VzZXItb2ZmaWNlLWRldGFpbC91c2VyLW9mZmljZS1kZXRhaWwuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0E7SUFDSSxrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLDBCQUEwQjtBQUM5Qjs7QUFFQTtJQUNJLGdDQUFnQztJQUNoQyxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsV0FBVztBQUNmOztBQUVBO0lBQ0ksZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsV0FBVztBQUNmOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsZ0JBQWdCO0lBQ2hCLG9CQUFvQjtJQUNwQiw4QkFBOEI7SUFDOUIsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQixZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVixtQkFBbUI7QUFDdkIiLCJmaWxlIjoic3JjL2FwcC9wb3J0YWwvdXNlci1vZmZpY2UtZGV0YWlsL3VzZXItb2ZmaWNlLWRldGFpbC5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbi50YWJsZSB7XHJcbiAgICAvKiB3aWR0aDogNzUwcHg7ICovXHJcbiAgICAvKiBwaG9uZyAqL1xyXG4gICAgYm9yZGVyOjFweCBzb2xpZCBsaWdodGdyYXk7XHJcbn1cclxuXHJcbi5jb2x1bW5UaXRsZSB7XHJcbiAgICBib3JkZXItcmlnaHQ6MXB4IHNvbGlkIGxpZ2h0Z3JheTtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgcGFkZGluZy10b3A6IDIwcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMjBweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XHJcbiAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuLmNvbnRlbnQge1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgcGFkZGluZy10b3A6IDIwcHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogMjBweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XHJcbiAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuLnRpdGxlIHtcclxuICAgIHBhZGRpbmctbGVmdDoyMHB4OyBcclxuICAgIG1hcmdpbi10b3A6MzBweDsgXHJcbiAgICBtYXJnaW4tYm90dG9tOiAzMHB4O1xyXG4gICAgcGFkZGluZy10b3A6MTBweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xyXG4gICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDA2Q0I3O1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICBjb2xvcjogYmxhY2s7XHJcbiAgICAvKiB3aWR0aDogNzUwcHg7ICovXHJcbiAgICAvKiBwaG9uZyAqL1xyXG4gICAgYmFja2dyb3VuZDogI0Y5RjlGOTtcclxufSJdfQ== */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Office_SerialNumber' | translate}} \\r\\n {{dataOfficeDetail?.SerialNumber}} \\r\\n \\r\\n \\r\\n {{'Office_OfficeTypeID' | translate}} \\r\\n {{dataOfficeDetail?.OfficeTypeName}} \\r\\n \\r\\n \\r\\n {{'Office_PublishAt' | translate}} \\r\\n {{dataOfficeDetail?.PublishAt | date: 'dd/MM/yyyy'}} \\r\\n \\r\\n \\r\\n {{'Office_PublishTypeID' | translate}} \\r\\n {{dataOfficeDetail?.PublishTypeName}} \\r\\n \\r\\n \\r\\n {{'Office_FieldTypeID' | translate}} \\r\\n {{dataOfficeDetail?.FieldTypeName}} \\r\\n \\r\\n \\r\\n {{'Office_Summary' | translate}} \\r\\n {{dataOfficeDetail?.Summary}} \\r\\n \\r\\n \\r\\n {{'Office_FileUrl' | translate}} \\r\\n \\r\\n \\r\\n {{item.substring(item.indexOf(\\\"_\\\")+1, item.length)}} \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \"","import { Component, OnInit, HostListener } from '@angular/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-user-office-detail',\r\n templateUrl: './user-office-detail.component.html',\r\n styleUrls: ['./user-office-detail.component.css']\r\n})\r\n\r\nexport class UserOfficeDetailComponent implements OnInit {\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >0;\r\n }\r\n dataOfficeDetail : any;\r\n FileUrlUI :string;\r\n arrayFile: string[];\r\n urlDownload = this.appService.apiRoot;\r\n loading = false;\r\n constructor(\r\n private appService: AppService,\r\n private activatedRoute: ActivatedRoute\r\n ) {\r\n this.activatedRoute.queryParams.subscribe((p: any) => {\r\n if (p && p.title) {\r\n this.getOffices(p.title);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n async getOffices(title) {\r\n this.loading = true;\r\n const dataRequest = {\r\n urlPath: title\r\n };\r\n\r\n // const dataRequest = {\r\n // imagePath: `${listurlArr[0]}`\r\n // };\r\n // const result = await this.appService.doGET('api/RpResultByUnit/GetBase64ImageResult', dataRequest);\r\n const result = await this.appService.doGET('api/Office', dataRequest);\r\n if (result && result.Status === 1) {\r\n\r\n this.FileUrlUI = result.Data.FileUrl;\r\n this.dataOfficeDetail = result.Data;\r\n\r\n }\r\n // this.FileUrlUI =this.FileUrlUI.slice(1, result.Data.FileUrl.lastIndexOf(\"]\"));\r\n \r\n this.arrayFile = this.FileUrlUI ? JSON.parse(this.FileUrlUI) : [];\r\n \r\n this.loading = false;\r\n // this.checkSelectionID();\r\n }\r\n\r\n getUrlDownload(item) {\r\n // return \"http://localhost:8080/Upload/Office/tax.docx\";\r\n let url = this.urlDownload.replace(/\\\"/g,\"\") + item;\r\n url = url.replace(/\\\"/g, '')\r\n return url;\r\n }\r\n}\r\n","module.exports = \"/* .div {\\r\\n padding-left: 0px;\\r\\n padding-right: 0px;\\r\\n margin-left: 0px;\\r\\n margin-right: 0px;\\r\\n} */\\r\\n\\r\\n.searchTable {\\r\\n height: 100px;\\r\\n background: red;\\r\\n}\\r\\n\\r\\n.dropdown {\\r\\n background: white;\\r\\n width: 100%;\\r\\n /* height: 30px; */\\r\\n /* border: 0.5px solid #707070; */\\r\\n}\\r\\n\\r\\n.searchButton {\\r\\n width: 109px !important;\\r\\n height: 46px;\\r\\n border: none !important;\\r\\n background-color: #006CB7;\\r\\n color: white;\\r\\n float: right;\\r\\n}\\r\\n\\r\\n.officeName {\\r\\n font-size: 14px;\\r\\n color: navy;\\r\\n font-weight: bold;\\r\\n margin-bottom: 10px;\\r\\n min-width: 700px;\\r\\n}\\r\\n\\r\\n.office-sumary {\\r\\n font-size: 14px;\\r\\n font-weight: bold;\\r\\n color: navy;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.btn-office {\\r\\n padding: 7px 12px;\\r\\n background-color: #006CB7;\\r\\n color: white;\\r\\n margin-right: 20px;\\r\\n border: none !important;\\r\\n}\\r\\n\\r\\n.office {\\r\\n border: 1px solid #ebebeb !important\\r\\n}\\r\\n\\r\\n.k-grid tr.k-alt {\\r\\n background-color: #FFFFFF !important\\r\\n}\\r\\n\\r\\n.office td {\\r\\n border-bottom: 1px solid #ebebeb;\\r\\n}\\r\\n\\r\\n.xbutton {\\r\\n background-color: #0067b2;\\r\\n color: white;\\r\\n background: #0067b2;\\r\\n border-radius: 25%;\\r\\n font-size: 25px !important;\\r\\n}\\r\\n\\r\\n.xleft-button {\\r\\n position: fixed;\\r\\n left: 5px;\\r\\n z-index: 4444;\\r\\n}\\r\\n\\r\\n.k-i-zoom-in::before {\\r\\n font-size: 20px !important;\\r\\n}\\r\\n\\r\\n.k-i-zoom-out::before {\\r\\n font-size: 20px !important;\\r\\n}\\r\\n\\r\\n/* cong tac chi dao */\\r\\n\\r\\n.block-body {\\r\\n margin: 20px 20px 0px 20px;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.block-body-nm {\\r\\n font-weight: bold;\\r\\n font-size: 17px;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.block-body-content {\\r\\n cursor: pointer !important;\\r\\n}\\r\\n\\r\\n.item-title-w {\\r\\n border: 1px solid navy;\\r\\n background-color: #e5f1ff;\\r\\n display: flex;\\r\\n color: navy;\\r\\n margin-top: -1px;\\r\\n}\\r\\n\\r\\n.item-title-content {\\r\\n margin-left: 20px;\\r\\n}\\r\\n\\r\\n.item-title-icon {\\r\\n border-right: 1px solid navy;\\r\\n padding-left: 10px;\\r\\n padding-right: 10px;\\r\\n color: #9B9B9B;\\r\\n}\\r\\n\\r\\n.padding-cus {\\r\\n padding-top: 7px;\\r\\n padding-bottom: 7px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.item-childs {\\r\\n padding-top: 10px;\\r\\n padding-bottom: 10px;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.item-childs>a {\\r\\n color: #005995;\\r\\n margin-left: 20px;\\r\\n}\\r\\n\\r\\n#hover-a a {\\r\\n margin-left: 10px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n#hover-a:hover {\\r\\n color: #005995 !important;\\r\\n}\\r\\n\\r\\n.block-body-nm {\\r\\n font-weight: bold;\\r\\n font-size: 17px;\\r\\n margin-bottom: 10px;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.group .no-record {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.nav-item {\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n.active,\\r\\n.nav-item:hover {\\r\\n color: #005995;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.office-file {\\r\\n margin-top: 7px;\\r\\n}\\r\\n\\r\\n.office-item {\\r\\n padding: 0px 15px 15px;\\r\\n}\\r\\n\\r\\n.new-office {\\r\\n background-color: #e5f1ff;\\r\\n}\\r\\n\\r\\n/* .new-office-title {\\r\\n color: red;\\r\\n animation: mynotify 2s infinite;\\r\\n}\\r\\n\\r\\n@keyframes mynotify {\\r\\n 0% {\\r\\n color: red;\\r\\n }\\r\\n 100% {\\r\\n color: navy;\\r\\n }\\r\\n} */\\r\\n\\r\\n.new-office-title {\\r\\n\\tcolor: navy;\\r\\n\\tbackground-image: -webkit-linear-gradient(92deg, #f35626, #feab3a);\\r\\n\\t-webkit-background-clip: text;\\r\\n\\t-webkit-animation: hue 10s infinite linear;\\r\\n}\\r\\n\\r\\n@-webkit-keyframes hue {\\r\\n from {\\r\\n -webkit-filter: hue-rotate(0deg);\\r\\n }\\r\\n to {\\r\\n -webkit-filter: hue-rotate(-360deg);\\r\\n }\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3VzZXItb2ZmaWNlL3VzZXItb2ZmaWNlLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7O0FBRUg7SUFDSSxhQUFhO0lBQ2IsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLGlDQUFpQztBQUNyQzs7QUFFQTtJQUNJLHVCQUF1QjtJQUN2QixZQUFZO0lBQ1osdUJBQXVCO0lBQ3ZCLHlCQUF5QjtJQUN6QixZQUFZO0lBQ1osWUFBWTtBQUNoQjs7QUFFQTtJQUNJLGVBQWU7SUFDZixXQUFXO0lBQ1gsaUJBQWlCO0lBQ2pCLG1CQUFtQjtJQUNuQixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLFdBQVc7SUFDWCxnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsdUJBQXVCO0FBQzNCOztBQUVBO0lBQ0k7QUFDSjs7QUFFQTtJQUNJO0FBQ0o7O0FBRUE7SUFDSSxnQ0FBZ0M7QUFDcEM7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsWUFBWTtJQUNaLG1CQUFtQjtJQUNuQixrQkFBa0I7SUFDbEIsMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksZUFBZTtJQUNmLFNBQVM7SUFDVCxhQUFhO0FBQ2pCOztBQUVBO0lBQ0ksMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksMEJBQTBCO0FBQzlCOztBQUdBLHFCQUFxQjs7QUFFckI7SUFDSSwwQkFBMEI7SUFDMUIsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksMEJBQTBCO0FBQzlCOztBQUVBO0lBQ0ksc0JBQXNCO0lBQ3RCLHlCQUF5QjtJQUN6QixhQUFhO0lBQ2IsV0FBVztJQUNYLGdCQUFnQjtBQUNwQjs7QUFFQTtJQUNJLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLDRCQUE0QjtJQUM1QixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLGNBQWM7QUFDbEI7O0FBRUE7SUFDSSxnQkFBZ0I7SUFDaEIsbUJBQW1CO0lBQ25CLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsZUFBZTtBQUNuQjs7QUFFQTtJQUNJLGNBQWM7SUFDZCxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsV0FBVztBQUNmOztBQUVBO0lBQ0kseUJBQXlCO0FBQzdCOztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsV0FBVztBQUNmOztBQUVBO0lBQ0ksV0FBVztBQUNmOztBQUVBO0lBQ0ksV0FBVztBQUNmOztBQUVBOztJQUVJLGNBQWM7SUFDZCxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSxlQUFlO0FBQ25COztBQUVBO0lBQ0ksc0JBQXNCO0FBQzFCOztBQUVBO0lBQ0kseUJBQXlCO0FBQzdCOztBQUVBOzs7Ozs7Ozs7Ozs7R0FZRzs7QUFFSDtDQUNDLFdBQVc7Q0FDWCxrRUFBa0U7Q0FDbEUsNkJBQTZCO0NBQzdCLDBDQUEwQztBQUMzQzs7QUFFQTtFQUNFO0lBQ0UsZ0NBQWdDO0VBQ2xDO0VBQ0E7SUFDRSxtQ0FBbUM7RUFDckM7QUFDRiIsImZpbGUiOiJzcmMvYXBwL3BvcnRhbC91c2VyLW9mZmljZS91c2VyLW9mZmljZS5jb21wb25lbnQuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogLmRpdiB7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDBweDtcclxuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDBweDtcclxufSAqL1xyXG5cclxuLnNlYXJjaFRhYmxlIHtcclxuICAgIGhlaWdodDogMTAwcHg7XHJcbiAgICBiYWNrZ3JvdW5kOiByZWQ7XHJcbn1cclxuXHJcbi5kcm9wZG93biB7XHJcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgLyogaGVpZ2h0OiAzMHB4OyAqL1xyXG4gICAgLyogYm9yZGVyOiAwLjVweCBzb2xpZCAjNzA3MDcwOyAqL1xyXG59XHJcblxyXG4uc2VhcmNoQnV0dG9uIHtcclxuICAgIHdpZHRoOiAxMDlweCAhaW1wb3J0YW50O1xyXG4gICAgaGVpZ2h0OiA0NnB4O1xyXG4gICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Q0I3O1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG59XHJcblxyXG4ub2ZmaWNlTmFtZSB7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxuICAgIG1pbi13aWR0aDogNzAwcHg7XHJcbn1cclxuXHJcbi5vZmZpY2Utc3VtYXJ5IHtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG59XHJcblxyXG4uYnRuLW9mZmljZSB7XHJcbiAgICBwYWRkaW5nOiA3cHggMTJweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDZDQjc7XHJcbiAgICBjb2xvcjogd2hpdGU7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XHJcbiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcclxufVxyXG5cclxuLm9mZmljZSB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWJlYmViICFpbXBvcnRhbnRcclxufVxyXG5cclxuLmstZ3JpZCB0ci5rLWFsdCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGICFpbXBvcnRhbnRcclxufVxyXG5cclxuLm9mZmljZSB0ZCB7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ViZWJlYjtcclxufVxyXG5cclxuLnhidXR0b24ge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNjdiMjtcclxuICAgIGNvbG9yOiB3aGl0ZTtcclxuICAgIGJhY2tncm91bmQ6ICMwMDY3YjI7XHJcbiAgICBib3JkZXItcmFkaXVzOiAyNSU7XHJcbiAgICBmb250LXNpemU6IDI1cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLnhsZWZ0LWJ1dHRvbiB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBsZWZ0OiA1cHg7XHJcbiAgICB6LWluZGV4OiA0NDQ0O1xyXG59XHJcblxyXG4uay1pLXpvb20taW46OmJlZm9yZSB7XHJcbiAgICBmb250LXNpemU6IDIwcHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLmstaS16b29tLW91dDo6YmVmb3JlIHtcclxuICAgIGZvbnQtc2l6ZTogMjBweCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG5cclxuLyogY29uZyB0YWMgY2hpIGRhbyAqL1xyXG5cclxuLmJsb2NrLWJvZHkge1xyXG4gICAgbWFyZ2luOiAyMHB4IDIwcHggMHB4IDIwcHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbi5ibG9jay1ib2R5LW5tIHtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgZm9udC1zaXplOiAxN3B4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxufVxyXG5cclxuLmJsb2NrLWJvZHktY29udGVudCB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXIgIWltcG9ydGFudDtcclxufVxyXG5cclxuLml0ZW0tdGl0bGUtdyB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBuYXZ5O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2U1ZjFmZjtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBjb2xvcjogbmF2eTtcclxuICAgIG1hcmdpbi10b3A6IC0xcHg7XHJcbn1cclxuXHJcbi5pdGVtLXRpdGxlLWNvbnRlbnQge1xyXG4gICAgbWFyZ2luLWxlZnQ6IDIwcHg7XHJcbn1cclxuXHJcbi5pdGVtLXRpdGxlLWljb24ge1xyXG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgbmF2eTtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XHJcbiAgICBjb2xvcjogIzlCOUI5QjtcclxufVxyXG5cclxuLnBhZGRpbmctY3VzIHtcclxuICAgIHBhZGRpbmctdG9wOiA3cHg7XHJcbiAgICBwYWRkaW5nLWJvdHRvbTogN3B4O1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbi5pdGVtLWNoaWxkcyB7XHJcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG59XHJcblxyXG4uaXRlbS1jaGlsZHM+YSB7XHJcbiAgICBjb2xvcjogIzAwNTk5NTtcclxuICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xyXG59XHJcblxyXG4jaG92ZXItYSBhIHtcclxuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbiNob3Zlci1hOmhvdmVyIHtcclxuICAgIGNvbG9yOiAjMDA1OTk1ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5ibG9jay1ib2R5LW5tIHtcclxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgZm9udC1zaXplOiAxN3B4O1xyXG4gICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4uZ3JvdXAgLm5vLXJlY29yZCB7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuLm5hdi1pdGVtIHtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4uYWN0aXZlLFxyXG4ubmF2LWl0ZW06aG92ZXIge1xyXG4gICAgY29sb3I6ICMwMDU5OTU7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLm9mZmljZS1maWxlIHtcclxuICAgIG1hcmdpbi10b3A6IDdweDtcclxufVxyXG5cclxuLm9mZmljZS1pdGVtIHtcclxuICAgIHBhZGRpbmc6IDBweCAxNXB4IDE1cHg7XHJcbn1cclxuXHJcbi5uZXctb2ZmaWNlIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICNlNWYxZmY7XHJcbn1cclxuXHJcbi8qIC5uZXctb2ZmaWNlLXRpdGxlIHtcclxuICAgIGNvbG9yOiByZWQ7XHJcbiAgICBhbmltYXRpb246IG15bm90aWZ5IDJzIGluZmluaXRlO1xyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIG15bm90aWZ5IHtcclxuICAgIDAlIHtcclxuICAgICAgICBjb2xvcjogcmVkO1xyXG4gICAgfVxyXG4gICAgMTAwJSB7XHJcbiAgICAgICAgY29sb3I6IG5hdnk7XHJcbiAgICB9XHJcbn0gKi9cclxuXHJcbi5uZXctb2ZmaWNlLXRpdGxlIHtcclxuXHRjb2xvcjogbmF2eTtcclxuXHRiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCg5MmRlZywgI2YzNTYyNiwgI2ZlYWIzYSk7XHJcblx0LXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6IHRleHQ7XHJcblx0LXdlYmtpdC1hbmltYXRpb246IGh1ZSAxMHMgaW5maW5pdGUgbGluZWFyO1xyXG59XHJcblxyXG5ALXdlYmtpdC1rZXlmcmFtZXMgaHVlIHtcclxuICBmcm9tIHtcclxuICAgIC13ZWJraXQtZmlsdGVyOiBodWUtcm90YXRlKDBkZWcpO1xyXG4gIH1cclxuICB0byB7XHJcbiAgICAtd2Via2l0LWZpbHRlcjogaHVlLXJvdGF0ZSgtMzYwZGVnKTtcclxuICB9XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Adminis_Label_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n {{ItemParent.Name}} \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
{{categoryTypeName}} \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
{{notifyNoRecord}}
\\r\\n
0\\\">\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n {{dataItem.Summary}} \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, Input, HostListener } from '@angular/core';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Router } from '@angular/router';\r\nimport * as FileSaver from 'file-saver';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\n@Component({\r\n selector: 'app-user-office',\r\n templateUrl: './user-office.component.html',\r\n styleUrls: ['./user-office.component.css']\r\n})\r\nexport class UserOfficeComponent implements OnInit {\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n @Input() officeDrt = 0;\r\n\r\n docTypeFilter: Array<{ Name: string, ID: string }> = [];\r\n dataOfficeGridDataResult: GridDataResult;\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataTreeListType = [];\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 20;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n dataOfficeSelection: number[] = [];\r\n dataOfficeItem: any;\r\n myInterval: any;\r\n\r\n dataFileUrls: any[];\r\n\r\n type: 0;\r\n dataOfficeSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n dataOfficeSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataOfficePageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataOffices = [];\r\n dataOfficeSortByField: SortDescriptor[] = [\r\n ];\r\n public dataOfficeState: State = {\r\n skip: this.dataOfficeSkip,\r\n take: this.dataOfficeSkip + this.dataOfficePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n\r\n user: any;\r\n loading = false;\r\n IDActive = \"\";\r\n\r\n searchOption = {\r\n SearchText: '',\r\n OfficeTypeID: null,\r\n PublishTypeID: null,\r\n CategoryTypeID: null,\r\n FieldTypeID: null,\r\n FromDate: null,\r\n ToDate: null,\r\n Type: 0\r\n };\r\n\r\n officeTypes: Array<{ Name: string, ID: string }>;\r\n officeTypesFilter: Array<{ Name: string, ID: string }>;\r\n officeTypesSearch: Array<{ Name: string, ID: string }>;\r\n\r\n publishTypes: Array<{ Name: string, ID: string }>;\r\n publishTypesFilter: Array<{ Name: string, ID: string }>;\r\n publishTypesSearch: Array<{ Name: string, ID: string }>;\r\n\r\n fieldTypes: Array<{ Name: string, ID: string }>;\r\n fieldTypesFilter: Array<{ Name: string, ID: string }>;\r\n fieldTypesSearch: Array<{ Name: string, ID: string }>;\r\n\r\n urlDownload = this.appService.apiRoot;\r\n pageName: any;\r\n\r\n isSearchBox = false;\r\n //isSearchBoxCommand = true;\r\n //isSearchCommon = false;\r\n\r\n categoryTypeName = '';\r\n notifyNoRecord = '';\r\n currentDate = new Date();\r\n\r\n constructor(\r\n private appService: AppService,\r\n public intl: IntlService,\r\n private router: Router,\r\n private appUtils: AppUtils,\r\n private appControls: AppControls,\r\n private appSwal: AppSwal,\r\n private translate: TranslateService\r\n ) {\r\n }\r\n\r\n async ngOnInit() {\r\n this.searchOption.Type = this.officeDrt;\r\n this.getPageName();\r\n \r\n await this.initDisplay();\r\n if (this.officeDrt == 1) {\r\n // this.onSearchOfficesDrt(this.searchOption.CategoryTypeID, null);\r\n this.getOffLastTwoMonth(this.IDActive);\r\n }\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n if(this.pageName.toLowerCase() == \"thư viện điện tử\"){ \r\n this.notifyNoRecord = this.translate.instant('UpdatingRecords');\r\n }else {\r\n this.notifyNoRecord = this.translate.instant('NoRecords');\r\n }\r\n }\r\n\r\n bindOffices() {\r\n this.dataOfficeGridDataResult = {\r\n data: orderBy(this.dataOffices, this.dataOfficeSortByField),\r\n total: this.dataOffices.length\r\n };\r\n this.dataOfficeGridDataResult = process(this.dataOffices, this.dataOfficeState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataOfficeGridDataResult = process(this.dataOffices, this.dataOfficeState);\r\n }\r\n\r\n public onPostDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataOfficeSelection = [];\r\n this.dataOfficeState = state;\r\n this.dataOfficeGridDataResult = process(this.dataOffices, this.dataOfficeState);\r\n }\r\n\r\n onSearch() {\r\n this.searchOption.CategoryTypeID = null;\r\n this.categoryTypeName = '';\r\n this.getOffices();\r\n }\r\n\r\n onSearchOfficesDrt(categoryTypeID, categoryTypeName) {\r\n \r\n this.searchOption.CategoryTypeID = categoryTypeID;\r\n\r\n this.searchOption.SearchText = \"\";\r\n this.searchOption.ToDate = null;\r\n this.searchOption.FromDate = null;\r\n this.searchOption.OfficeTypeID = null;\r\n this.searchOption.FieldTypeID = null;\r\n this.searchOption.PublishTypeID = null;\r\n if (categoryTypeName) {\r\n this.categoryTypeName = categoryTypeName;\r\n }\r\n this.dataOfficeSkip = 0;\r\n this.dataOfficeState = {\r\n skip: this.dataOfficeSkip,\r\n take: this.dataOfficeSkip + this.dataOfficePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n };\r\n this.getOffices();\r\n }\r\n\r\n onReload() {\r\n //this.searchOption.SearchText = '';\r\n this.getOffices();\r\n\r\n // this.isEnabledSaveAll = false;\r\n }\r\n\r\n async initDisplay() {\r\n \r\n if (this.searchOption.Type == 1) {\r\n await this.getTreeViewTypes();\r\n }\r\n\r\n // loai van ban\r\n // const dataRequest = {\r\n // pageID: this.appControls.getPage()\r\n // }\r\n const resultOfficeType = await this.appService.doGET('api/Office/GetOfficeType', null);\r\n if (resultOfficeType && resultOfficeType.Status === 1) {\r\n this.officeTypes = resultOfficeType.Data;\r\n this.officeTypesFilter = this.officeTypes.slice();\r\n this.officeTypesSearch = this.officeTypes.slice();\r\n }\r\n\r\n // co quan ban hanh\r\n const resultPublishType = await this.appService.doGET('api/Office/GetPublishType', null);\r\n if (resultPublishType && resultPublishType.Status === 1) {\r\n this.publishTypes = resultPublishType.Data;\r\n this.publishTypesFilter = this.publishTypes.slice();\r\n this.publishTypesSearch = this.publishTypes.slice();\r\n }\r\n\r\n // linh vuc\r\n const resultFieldType = await this.appService.doGET('api/Office/GetFieldType', null);\r\n if (resultFieldType && resultFieldType.Status === 1) {\r\n this.fieldTypes = resultFieldType.Data;\r\n this.fieldTypesFilter = this.fieldTypes.slice();\r\n this.fieldTypesSearch = this.fieldTypes.slice();\r\n }\r\n }\r\n\r\n async getOffices() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n OfficeTypeID: this.searchOption.OfficeTypeID,\r\n CategoryTypeID: this.searchOption.CategoryTypeID,\r\n PublishTypeID: this.searchOption.PublishTypeID,\r\n FieldTypeID: this.searchOption.FieldTypeID,\r\n FromDate: this.searchOption.FromDate ? this.intl.formatDate(new Date(this.searchOption.FromDate), 'yyyy-MM-ddT00:00:00') : null,\r\n ToDate: this.searchOption.ToDate ? this.intl.formatDate(new Date(this.searchOption.ToDate), 'yyyy-MM-ddT00:00:00') : null,\r\n Type: this.searchOption.Type\r\n };\r\n\r\n const result = await this.appService.doPOST('api/Office/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n for (let k = 0; k < result.Data.length; k++) {\r\n\r\n if (result.Data[k].FileUrl == null || result.Data.FileUrl == \"\") {\r\n result.Data[k].FileUrl = [];\r\n }\r\n else {\r\n result.Data[k].FileUrl = JSON.parse(result.Data[k].FileUrl);\r\n }\r\n if (result.Data[k].CreateAt){\r\n result.Data[k].CreateAtTime = this.currentDate.getTime() - new Date(result.Data[k].CreateAt).getTime();\r\n }\r\n }\r\n this.dataOffices = result.Data;\r\n this.bindOffices();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataOfficeSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataOffices.find((item) => {\r\n return item.ID === this.dataOfficeSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataOfficeSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n onTabChanged(event) {\r\n this.searchOption.Type = event.index;\r\n this.onSearch();\r\n }\r\n\r\n onOfficeTypeSearchHandleFilter(value) {\r\n this.officeTypesSearch = this.officeTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onPublishTypeSearchHandleFilter(value) {\r\n this.publishTypesSearch = this.publishTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onFieldTypeSearchHandleFilter(value) {\r\n this.fieldTypesSearch = this.fieldTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n async downloadFile(fileUrl) {\r\n const dataRequest = {\r\n url: fileUrl\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result && result.Status == undefined) {\r\n FileSaver.saveAs(result, this.appUtils.getNameByUrl(fileUrl));\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n getUrlDownload(item) {\r\n // return \"http://localhost:8080/Upload/Office/tax.docx\";\r\n let url = this.urlDownload.replace(/\\\"/g, \"\") + item;\r\n url = url.replace(/\\\"/g, '')\r\n return url;\r\n }\r\n\r\n onGoToDetail(dataItem) {\r\n // this.router.navigate(['portal/admi-proc-detail']);\r\n // { queryParams: { searchparam: searchString } }\r\n this.router.navigate(['portal/office-detail'], { queryParams: { title: dataItem.UrlPath } });\r\n }\r\n\r\n onOpenSearch() {\r\n this.isSearchBox = !this.isSearchBox;\r\n }\r\n\r\n async getTreeViewTypes() {\r\n this.loading = true;\r\n // const dataRequest = {\r\n // pageID: this.appControls.getPage()\r\n // };\r\n const result = await this.appService.doGET('api/Type/getTypeTreeView', null);\r\n if (result && result.Status === 1) {\r\n this.dataTreeListType = result.Data.List;\r\n this.IDActive = result.Data.List[result.Data.List.length - 1].ID;\r\n }\r\n \r\n this.loading = false;\r\n }\r\n\r\n\r\n showLinkUrl(itemSelected) {\r\n this.IDActive = itemSelected.ID;\r\n this.loading = true;\r\n this.getOffLastTwoMonth(itemSelected.ID);\r\n }\r\n async getOffLastTwoMonth(id){\r\n const dataRequest = {\r\n OfficeTypeID: id,\r\n Type: this.searchOption.Type,\r\n };\r\n this.dataOfficeSkip = 0;\r\n this.dataOfficeState = {\r\n skip: this.dataOfficeSkip,\r\n take: this.dataOfficeSkip + this.dataOfficePageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n };\r\n const result = await this.appService.doPOST('api/Office/SearchLastTwoMonth', dataRequest);\r\n if (result && result.Status === 1) {\r\n for (let k = 0; k < result.Data.length; k++) {\r\n\r\n if (result.Data[k].FileUrl == null || result.Data.FileUrl == \"\") {\r\n result.Data[k].FileUrl = [];\r\n }\r\n else {\r\n result.Data[k].FileUrl = JSON.parse(result.Data[k].FileUrl);\r\n }\r\n if (result.Data[k].CreateAt){\r\n result.Data[k].CreateAtTime = this.currentDate.getTime() - new Date(result.Data[k].CreateAt).getTime();\r\n }\r\n }\r\n this.dataOffices = result.Data;\r\n this.bindOffices();\r\n }\r\n this.loading = false;\r\n this.categoryTypeName = '';\r\n this.checkSelectionID();\r\n }\r\n\r\n onOfficePageChange(event: PageChangeEvent) {\r\n this.dataOfficeSkip = event.skip;\r\n this.bindOffices();\r\n }\r\n\r\n}\r\n","module.exports = \".img-grid {\\r\\n width: 30px;\\r\\n height: 24px;\\r\\n margin-right: 20px;\\r\\n}\\r\\n.img-grid:hover,\\r\\n.img-slide:hover {\\r\\n border:1px solid #006CB7;\\r\\n}\\r\\n.img-grid:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n.img-slide {\\r\\n width: 30px;\\r\\n height: 24px;\\r\\n margin-right: 20px;\\r\\n}\\r\\n.img-slide:hover {\\r\\n cursor: pointer;\\r\\n}\\r\\n::ng-deep .no-indicators .carousel-indicators {\\r\\n display: none;\\r\\n }\\r\\n/* grid image */\\r\\n.img-detail-small {\\r\\n height: 170px;\\r\\n background-size: cover;\\r\\n background-repeat: no-repeat;\\r\\n background-position: center center;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n.img-detail-medium {\\r\\n height: 225px;\\r\\n background-size: cover;\\r\\n background-repeat: no-repeat;\\r\\n background-position: center center;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n.img-detail-large {\\r\\n height: 280px;\\r\\n background-size: cover;\\r\\n background-repeat: no-repeat;\\r\\n background-position: center center;\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n/* @media only screen and (min-width: 768px) {\\r\\n .no-pl-fist-line {\\r\\n padding-right: 0px;\\r\\n }\\r\\n .no-pl-second-line {\\r\\n padding-right: 0px;\\r\\n padding-left: 0px;\\r\\n }\\r\\n} */\\r\\n.portal .group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3ZpZGVvcy92aWRlb3MuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLFdBQVc7SUFDWCxZQUFZO0lBQ1osa0JBQWtCO0FBQ3RCO0FBQ0E7O0lBRUksd0JBQXdCO0FBQzVCO0FBRUE7SUFDSSxlQUFlO0FBQ25CO0FBRUE7SUFDSSxXQUFXO0lBQ1gsWUFBWTtJQUNaLGtCQUFrQjtBQUN0QjtBQUNBO0lBQ0ksZUFBZTtBQUNuQjtBQUVBO0lBQ0ksYUFBYTtFQUNmO0FBRUYsZUFBZTtBQUNmO0lBQ0ksYUFBYTtJQUNiLHNCQUFzQjtJQUN0Qiw0QkFBNEI7SUFDNUIsa0NBQWtDO0lBQ2xDLG1CQUFtQjtBQUN2QjtBQUVBO0lBQ0ksYUFBYTtJQUNiLHNCQUFzQjtJQUN0Qiw0QkFBNEI7SUFDNUIsa0NBQWtDO0lBQ2xDLG1CQUFtQjtBQUN2QjtBQUVBO0lBQ0ksYUFBYTtJQUNiLHNCQUFzQjtJQUN0Qiw0QkFBNEI7SUFDNUIsa0NBQWtDO0lBQ2xDLG1CQUFtQjtBQUN2QjtBQUVBOzs7Ozs7OztHQVFHO0FBRUg7SUFDSSxpQkFBaUI7SUFDakIsb0JBQW9CO0FBQ3hCIiwiZmlsZSI6InNyYy9hcHAvcG9ydGFsL3ZpZGVvcy92aWRlb3MuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5pbWctZ3JpZCB7XHJcbiAgICB3aWR0aDogMzBweDtcclxuICAgIGhlaWdodDogMjRweDtcclxuICAgIG1hcmdpbi1yaWdodDogMjBweDtcclxufVxyXG4uaW1nLWdyaWQ6aG92ZXIsXHJcbi5pbWctc2xpZGU6aG92ZXIge1xyXG4gICAgYm9yZGVyOjFweCBzb2xpZCAjMDA2Q0I3O1xyXG59XHJcblxyXG4uaW1nLWdyaWQ6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG4uaW1nLXNsaWRlIHtcclxuICAgIHdpZHRoOiAzMHB4O1xyXG4gICAgaGVpZ2h0OiAyNHB4O1xyXG4gICAgbWFyZ2luLXJpZ2h0OiAyMHB4O1xyXG59XHJcbi5pbWctc2xpZGU6aG92ZXIge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG59XHJcblxyXG46Om5nLWRlZXAgLm5vLWluZGljYXRvcnMgLmNhcm91c2VsLWluZGljYXRvcnMge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcblxyXG4vKiBncmlkIGltYWdlICovXHJcbi5pbWctZGV0YWlsLXNtYWxsIHtcclxuICAgIGhlaWdodDogMTcwcHg7XHJcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG59XHJcblxyXG4uaW1nLWRldGFpbC1tZWRpdW0ge1xyXG4gICAgaGVpZ2h0OiAyMjVweDtcclxuICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XHJcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcclxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XHJcbn1cclxuXHJcbi5pbWctZGV0YWlsLWxhcmdlIHtcclxuICAgIGhlaWdodDogMjgwcHg7XHJcbiAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xyXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcclxuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XHJcbiAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xyXG59XHJcblxyXG4vKiBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7XHJcbiAgICAubm8tcGwtZmlzdC1saW5lIHtcclxuICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7XHJcbiAgICB9XHJcbiAgICAubm8tcGwtc2Vjb25kLWxpbmUge1xyXG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDBweDtcclxuICAgICAgICBwYWRkaW5nLWxlZnQ6IDBweDtcclxuICAgIH1cclxufSAqL1xyXG5cclxuLnBvcnRhbCAuZ3JvdXAtaGVhZGVyIHtcclxuICAgIHBhZGRpbmctdG9wOiAxM3B4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEzcHg7XHJcbn0iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
0\\\">\\r\\n
\\r\\n
\\r\\n \\r\\n Video không tồn tại\\r\\n \\r\\n
{{videos[0].Name}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
= 1 && i <= 3\\\">\\r\\n
\\r\\n \\r\\n Video không tồn tại\\r\\n \\r\\n
{{item.Name}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
= 4\\\">\\r\\n
\\r\\n \\r\\n Video không tồn tại\\r\\n \\r\\n
{{item.Name}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n \"","import { Component, OnInit, HostListener } from '@angular/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { ActivatedRoute } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-videos',\r\n templateUrl: './videos.component.html',\r\n styleUrls: ['./videos.component.css']\r\n})\r\nexport class VideosComponent implements OnInit {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n constructor(public appService: AppService, private route: ActivatedRoute) { }\r\n\r\n imagesGrid: any;\r\n imagesSlide: any;\r\n videos: any;\r\n\r\n isImagePage: boolean;\r\n\r\n srcGrid = '../assets/images/icon-grid-active.png';\r\n srcSlide = '../assets/images/icon-slide-inactive.png';\r\n\r\n menuID;\r\n\r\n isGridMode = true;\r\n\r\n ngOnInit() {\r\n this.menuID = this.route.snapshot.queryParamMap.get('menuID');\r\n\r\n this.isImagePage = false;\r\n this.getVideos();\r\n }\r\n\r\n imgGridClicked() {\r\n this.srcGrid = '../assets/images/icon-grid-active.png';\r\n this.srcSlide = '../assets/images/icon-slide-inactive.png';\r\n\r\n this.isGridMode = true;\r\n }\r\n imgSlideClicked() {\r\n this.srcGrid = '../assets/images/icon-grid-inactive.png';\r\n this.srcSlide = '../assets/images/icon-slide-active.png';\r\n\r\n this.isGridMode = false;\r\n }\r\n\r\n async getImages() {\r\n const dataRequest = {\r\n menuID: this.menuID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/Image', dataRequest);\r\n if (result) {\r\n this.imagesGrid = result.Data.GridViewData;\r\n this.imagesSlide = result.Data.SlideViewData;\r\n }\r\n }\r\n\r\n async getVideos() {\r\n const dataRequest = {\r\n menuID: this.menuID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/Video', dataRequest);\r\n if (result) {\r\n this.videos = result.Data;\r\n }\r\n }\r\n\r\n}\r\n","module.exports = \".group-body-border {\\r\\n background-color: #ffffff !important;\\r\\n padding: 0px !important;\\r\\n border: 1px solid #BBBBBB !important;\\r\\n padding-bottom: 20px !important\\r\\n}\\r\\n.block-body {\\r\\n margin: 20px 20px 0px 20px;\\r\\n font-size: 16px;\\r\\n}\\r\\n.block-body-nm {\\r\\n font-weight: bold;\\r\\n font-size: 17px;\\r\\n margin-bottom: 10px;\\r\\n color: navy;\\r\\n}\\r\\n.block-body-content{\\r\\n cursor: pointer !important;\\r\\n}\\r\\n.item-title-w {\\r\\n border: 1px solid #BBBBBB;\\r\\n background-color: #F8F8F8;\\r\\n display: flex;\\r\\n}\\r\\n.item-title-content {\\r\\n margin-left: 20px;\\r\\n color: navy;\\r\\n}\\r\\n.item-title-icon {\\r\\n border-right: 1px solid #bbbbbb;\\r\\n padding-left: 10px;\\r\\n padding-right: 10px;\\r\\n color: #9B9B9B;\\r\\n}\\r\\n.padding-cus {\\r\\n padding-top: 7px;\\r\\n padding-bottom: 7px;\\r\\n}\\r\\n.item-childs {\\r\\n padding-top: 10px;\\r\\n padding-bottom: 10px;\\r\\n font-size: 16px;\\r\\n}\\r\\n.item-childs >a {\\r\\n color: #005995;\\r\\n margin-left: 20px;\\r\\n}\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcG9ydGFsL3dlZWtseS1yZXBvcnQtcG9ydGFsL3dlZWtseS1yZXBvcnQtcG9ydGFsLmNvbXBvbmVudC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7SUFDSSxvQ0FBb0M7SUFDcEMsdUJBQXVCO0lBQ3ZCLHFDQUFxQztJQUNyQztBQUNKO0FBQ0E7SUFDSSwwQkFBMEI7SUFDMUIsZUFBZTtBQUNuQjtBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsV0FBVztBQUNmO0FBRUE7SUFDSSwwQkFBMEI7QUFDOUI7QUFFQTtJQUNJLHlCQUF5QjtJQUN6Qix5QkFBeUI7SUFDekIsYUFBYTtBQUNqQjtBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLFdBQVc7QUFDZjtBQUVBO0lBQ0ksK0JBQStCO0lBQy9CLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsY0FBYztBQUNsQjtBQUVBO0lBQ0ksZ0JBQWdCO0lBQ2hCLG1CQUFtQjtBQUN2QjtBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixlQUFlO0FBQ25CO0FBRUE7SUFDSSxjQUFjO0lBQ2QsaUJBQWlCO0FBQ3JCIiwiZmlsZSI6InNyYy9hcHAvcG9ydGFsL3dlZWtseS1yZXBvcnQtcG9ydGFsL3dlZWtseS1yZXBvcnQtcG9ydGFsLmNvbXBvbmVudC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIuZ3JvdXAtYm9keS1ib3JkZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjQkJCQkJCICAhaW1wb3J0YW50O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDIwcHggIWltcG9ydGFudFxyXG59XHJcbi5ibG9jay1ib2R5IHtcclxuICAgIG1hcmdpbjogMjBweCAyMHB4IDBweCAyMHB4O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG59XHJcblxyXG4uYmxvY2stYm9keS1ubSB7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIGZvbnQtc2l6ZTogMTdweDtcclxuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XHJcbiAgICBjb2xvcjogbmF2eTtcclxufVxyXG5cclxuLmJsb2NrLWJvZHktY29udGVudHtcclxuICAgIGN1cnNvcjogcG9pbnRlciAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4uaXRlbS10aXRsZS13IHtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkICNCQkJCQkI7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOEY4O1xyXG4gICAgZGlzcGxheTogZmxleDtcclxufVxyXG5cclxuLml0ZW0tdGl0bGUtY29udGVudCB7XHJcbiAgICBtYXJnaW4tbGVmdDogMjBweDtcclxuICAgIGNvbG9yOiBuYXZ5O1xyXG59XHJcblxyXG4uaXRlbS10aXRsZS1pY29uIHtcclxuICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNiYmJiYmI7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcbiAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4O1xyXG4gICAgY29sb3I6ICM5QjlCOUI7XHJcbn1cclxuXHJcbi5wYWRkaW5nLWN1cyB7XHJcbiAgICBwYWRkaW5nLXRvcDogN3B4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDdweDtcclxufVxyXG5cclxuLml0ZW0tY2hpbGRzIHtcclxuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xyXG4gICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbi5pdGVtLWNoaWxkcyA+YSB7XHJcbiAgICBjb2xvcjogIzAwNTk5NTtcclxuICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xyXG59Il19 */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{dataItem.GroupTypeName}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{itemChild.Name}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, Input, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\n\r\n@Component({\r\n selector: 'app-weekly-report-portal',\r\n templateUrl: './weekly-report-portal.component.html',\r\n styleUrls: ['./weekly-report-portal.component.css']\r\n})\r\nexport class WeeklyReportPortalComponent implements OnInit, OnDestroy {\r\n\r\n isSticky: boolean = false;\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset > 0;\r\n }\r\n commentInput = null;\r\n\r\n user: any;\r\n loading = false;\r\n dataWeeklyReportPortals = [];\r\n dataWeeklyReportPortalSelectableSettings: SelectableSettings;\r\n dataWeeklyReportPortalSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataWeeklyReportPortalFocus = {\r\n Name: true\r\n };\r\n dataWeeklyReportPortalSortByField: SortDescriptor[] = [\r\n ];\r\n\r\n public SETTING_NUM_PAGING_SKIP = 0;\r\n public SETTING_NUM_PAGING_TAKE = 50;\r\n public SETTING_NUM_PAGING_BTN = 5;\r\n\r\n dataWeeklyReportPortalSkip = this.SETTING_NUM_PAGING_SKIP;\r\n dataWeeklyReportPortalPageSize = this.SETTING_NUM_PAGING_TAKE;\r\n dataWeeklyReportPortalSelection: number[] = [];\r\n dataWeeklyReportPortalItem: any;\r\n myInterval: any;\r\n pageName: any;\r\n infoOpened = false;\r\n IDActive = \"\";\r\n\r\n public buttonCount = this.SETTING_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataWeeklyReportPortalState: State = {\r\n skip: this.dataWeeklyReportPortalSkip,\r\n take: this.dataWeeklyReportPortalSkip + this.dataWeeklyReportPortalPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n }\r\n };\r\n dataWeeklyReportPortalGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.SETTING_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.SETTING_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n groupTypes: Array<{ Name: string, ID: string }>;\r\n groupTypesFilter: Array<{ Name: string, ID: string }>;\r\n groupTypesSearch: Array<{ Name: string, ID: string }>;\r\n\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n allowInsertFile = true;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n GroupTypeID: null,\r\n FromDate: null,\r\n ToDate: null\r\n };\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n private appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appComponent: AppComponent,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n }\r\n\r\n ngOnInit() {\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.initDisplay();\r\n this.getPageName();\r\n this.onReload();\r\n this.allData = this.allData.bind(this);\r\n \r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataWeeklyReportPortalSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onGroupTypeHandleFilter(value) {\r\n this.groupTypesFilter = this.groupTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onGroupTypeSearchHandleFilter(value) {\r\n this.groupTypesSearch = this.groupTypes.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onTypeSearchHandleFilter(value) {\r\n this.onReload();\r\n }\r\n\r\n\r\n onSearchKeyPress(e: any) {\r\n\r\n }\r\n\r\n showLinkUrl(itemSelected) {\r\n this.IDActive = itemSelected.ID;\r\n }\r\n\r\n async getWeeklyReportPortals() {\r\n this.loading = true;\r\n const dataRequest = {\r\n SearchText: this.searchOption.SearchText,\r\n GroupTypeID: this.searchOption.GroupTypeID,\r\n GroupFlg: true\r\n };\r\n const result = await this.appService.doPOST('api/WeeklyReport/Search', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataWeeklyReportPortals = result.Data;\r\n this.bindWeeklyReportPortals();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataWeeklyReportPortalSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataWeeklyReportPortals.find((item) => {\r\n return item.ID === this.dataWeeklyReportPortalSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataWeeklyReportPortalSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataWeeklyReportPortalItem = {\r\n IsAdd: true,\r\n Name: '',\r\n Description: null,\r\n LinkUrl: '',\r\n CreateAt: '',\r\n CreateBy: null,\r\n UpdateAt: '',\r\n UpdateBy: '',\r\n DelFlg: '',\r\n GroupTypeID: null\r\n };\r\n this.enabled = true;\r\n this.enabledID = true;\r\n this.dataWeeklyReportPortalSelection = [];\r\n this.filesUpload = [];\r\n this.dataFileUrls = [];\r\n this.bindFileUrls();\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files`;\r\n }\r\n\r\n onPostPageChange(event: PageChangeEvent) {\r\n this.dataWeeklyReportPortalSkip = event.skip;\r\n this.bindWeeklyReportPortals();\r\n }\r\n\r\n async onWeeklyReportPortalselectedKeysChange() {\r\n\r\n if (this.dataWeeklyReportPortalSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataWeeklyReportPortalSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataWeeklyReportPortalSelection[0];\r\n const selectedItem = this.dataWeeklyReportPortals.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false;\r\n selectedItem.PublishAt = selectedItem.PublishAt ? new Date(selectedItem.PublishAt) : null;\r\n\r\n this.dataWeeklyReportPortalItem = selectedItem;\r\n\r\n const fileUrl = selectedItem.FileUrl;\r\n this.dataFileUrls = [];\r\n if (fileUrl) {\r\n this.dataFileUrls.push({\r\n Name: this.getNameByUrl(selectedItem.FileUrl),\r\n Url: selectedItem.FileUrl\r\n });\r\n }\r\n this.bindFileUrls();\r\n\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindWeeklyReportPortals() {\r\n this.dataWeeklyReportPortalGridDataResult = {\r\n data: orderBy(this.dataWeeklyReportPortals, this.dataWeeklyReportPortalSortByField),\r\n total: this.dataWeeklyReportPortals.length\r\n };\r\n\r\n this.dataWeeklyReportPortalGridDataResult = process(this.dataWeeklyReportPortals, this.dataWeeklyReportPortalState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataWeeklyReportPortalGridDataResult = process(this.dataWeeklyReportPortals, this.dataWeeklyReportPortalState);\r\n }\r\n\r\n onWeeklyReportPortalsortChange(sort: SortDescriptor[]): void {\r\n this.dataWeeklyReportPortalSortByField = sort;\r\n this.bindWeeklyReportPortals();\r\n }\r\n\r\n public onPostDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataWeeklyReportPortalSelection = [];\r\n this.dataWeeklyReportPortalState = state;\r\n this.dataWeeklyReportPortalGridDataResult = process(this.dataWeeklyReportPortals, this.dataWeeklyReportPortalState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n // nhom bao cao\r\n const resultPublishType = await this.appService.doGET('api/WeeklyReport/GetGroupType', null);\r\n if (resultPublishType && resultPublishType.Status === 1) {\r\n this.groupTypes = resultPublishType.Data;\r\n this.groupTypesFilter = this.groupTypes.slice();\r\n this.groupTypesSearch = this.groupTypes.slice();\r\n }\r\n }\r\n\r\n onSearch() {\r\n this.getWeeklyReportPortals();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.getWeeklyReportPortals();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearPost() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewPost() {\r\n\r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n async onSavePost() {\r\n if (this.dataWeeklyReportPortalItem.IsAdd) { this.addPost(); } else { this.updatePost(); }\r\n }\r\n\r\n async onSaveWeeklyReportPortals() {\r\n this.appComponent.loading = true;\r\n const dataRequests = [];\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataWeeklyReportPortals.length; i++) {\r\n dataRequests.push(this.createDataRequest(this.dataWeeklyReportPortals[i]));\r\n }\r\n const result = await this.appService.doPOST('api/WeeklyReport/Saves', dataRequests);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.isEnabledSaveAll = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataWeeklyReportPortalItem;\r\n\r\n // let fileName = '';\r\n // if (this.dataFileUrls.length > 0) {\r\n // fileName = this.dataFileUrls[0].Url;\r\n // }\r\n\r\n //\r\n return {\r\n ID: temp.ID,\r\n Name: temp.Name,\r\n Description: temp.Description,\r\n LinkUrl: temp.LinkUrl,\r\n CreateAt: temp.CreateAt,\r\n CreateBy: temp.CreateBy,\r\n UpdateAt: temp.UpdateAt,\r\n UpdateBy: temp.UpdateBy,\r\n DelFlg: temp.DelFlg,\r\n GroupTypeID: temp.GroupTypeID\r\n };\r\n }\r\n\r\n onClosePost(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n onEditPost() {\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async addPost() {\r\n this.appComponent.loading = true;\r\n const dataRequest = this.createDataRequest(null);\r\n\r\n const result = await this.appService.doPOST('api/WeeklyReport', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updatePost() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n const id = this.dataWeeklyReportPortalItem.ID;\r\n const dataRequest = this.createDataRequest(this.dataWeeklyReportPortalItem);\r\n\r\n const result = await this.appService.doPUT('api/WeeklyReport', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.infoOpened = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onDeletePost() {\r\n if (this.dataWeeklyReportPortalSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataWeeklyReportPortalSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/WeeklyReport/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.setDefault();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataWeeklyReportPortalSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(dataItem: any) {\r\n\r\n const dataRequest = {\r\n url: dataItem.Url\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, dataItem.Name);\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataWeeklyReportPortals, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return;\r\n }\r\n\r\n const extension = e.files[0].extension.toLowerCase();\r\n\r\n this.allowInsertFile = true;\r\n\r\n try {\r\n const fileData = e.files[0]; // await this.file.readFile(e.files[0].rawFile);\r\n\r\n const maxMB = 30;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n }\r\n } catch {\r\n }\r\n\r\n // tslint:disable-next-line: max-line-length\r\n if (!extension || (extension.toLowerCase() !== '.doc' && extension.toLowerCase() !== '.docx' && extension.toLowerCase() !== '.pdf')) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .doc, .docx, .pdf', false);\r\n\r\n return false;\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n\r\n if (!this.allowInsertFile) {\r\n return;\r\n }\r\n\r\n try {\r\n this.dataFileUrls = [];\r\n const k = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n this.dataFileUrls.push({\r\n Name: this.getNameByUrl(k),\r\n Url: k\r\n });\r\n\r\n this.bindFileUrls();\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n}\r\n\r\n","module.exports = \".bra-name {\\r\\n color: blue;\\r\\n}\\r\\n\\r\\n[_nghost-c0] .k-panelbar>.k-item>.k-link.k-state-selected {\\r\\n background-color: #7c9bb7 !important;\\r\\n}\\r\\n\\r\\n.banner-element,\\r\\n.video-element {\\r\\n display: inline-block;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n.banner-element {\\r\\n width: 100%;\\r\\n height: 156px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.banner-element img {\\r\\n width: 100%;\\r\\n height: 156px;\\r\\n}\\r\\n\\r\\n.video-element {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.video-element img {\\r\\n width: 100%;\\r\\n height: 206px;\\r\\n}\\r\\n\\r\\n.image-element {\\r\\n width: 210px;\\r\\n height: 140px;\\r\\n padding: 0;\\r\\n margin-left: 17px;\\r\\n margin-right: 17px;\\r\\n}\\r\\n\\r\\n.image-element img {\\r\\n width: 100px;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\n.custom-list {\\r\\n width: 40%;\\r\\n display: contents;\\r\\n}\\r\\n\\r\\n.custom-list-status {\\r\\n width: 50%;\\r\\n display: contents;\\r\\n}\\r\\n\\r\\n.custom-list-status input {\\r\\n margin-top: 4px;\\r\\n}\\r\\n\\r\\n.custom-list-child {\\r\\n display: block;\\r\\n margin-left: 20px;\\r\\n}\\r\\n\\r\\n.element-search {\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.element-search {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.image-upload-cus {\\r\\n display: contents;\\r\\n width: 100%;\\r\\n height: 100px;\\r\\n}\\r\\n\\r\\nagm-map {\\r\\n height: 506px;\\r\\n}\\r\\n\\r\\n.file-uploaded {\\r\\n color: #006CB7 !important;\\r\\n width: 182px;\\r\\n float: right;\\r\\n margin-top: 36px;\\r\\n}\\r\\n\\r\\n.xdialogchat {\\r\\n width: 90% !important;\\r\\n height: 90% !important;\\r\\n max-width: 800px !important;\\r\\n max-height: 600px !important;\\r\\n}\\r\\n\\r\\n.page {\\r\\n width: 100%;\\r\\n}\\r\\n\\r\\n.title {\\r\\n font-size: 28px;\\r\\n font-weight: bold;\\r\\n}\\r\\n\\r\\n.img-banner {\\r\\n width: 100%;\\r\\n max-height: 500px;\\r\\n}\\r\\n\\r\\n.description {\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n/* .cke_contents{\\r\\n height: 750px;\\r\\n}\\r\\n.cke_reset{\\r\\n height: 750px;\\r\\n} */\\r\\n\\r\\n#cke_2_contents {\\r\\n height: 750px;\\r\\n}\\r\\n\\r\\n.portal .group-header {\\r\\n padding-top: 13px;\\r\\n padding-bottom: 13px;\\r\\n}\\r\\n\\r\\n.btnLink {\\r\\n background-color: DodgerBlue;\\r\\n border: none;\\r\\n color: white;\\r\\n /* padding: 12px 16px; */\\r\\n font-size: 16px;\\r\\n cursor: pointer;\\r\\n position: absolute;\\r\\n right: 15px;\\r\\n z-index: 1;\\r\\n}\\r\\n\\r\\n.btnLink:hover {\\r\\n background-color: RoyalBlue;\\r\\n}\\r\\n\\r\\n:host ::ng-deep .k-tabstrip>.k-content {\\r\\n background-color: #f6f6f6 !important;\\r\\n}\\r\\n\\r\\n.editor-height {\\r\\n min-height: 300px;\\r\\n}\\r\\n\\r\\n.dialog-post {\\r\\n z-index: 1000 !important;\\r\\n}\\r\\n\\r\\n.reference{\\r\\n float: right;\\r\\n color: navy;\\r\\n}\\r\\n\\r\\n/* begin upload file */\\r\\n\\r\\n.xdivcol11 {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.xdiv {\\r\\n border: 0.1px solid rgb(184, 184, 184);\\r\\n background-color: white;\\r\\n margin-top: 0px;\\r\\n}\\r\\n\\r\\n.xdivcol1 {\\r\\n padding-left: 0px;\\r\\n padding-right: 0px;\\r\\n}\\r\\n\\r\\n.xbutton {\\r\\n background-color: red;\\r\\n color: white !important;\\r\\n background: red;\\r\\n width: 100%;\\r\\n font-size: 25px !important;\\r\\n}\\r\\n\\r\\n/* end upload file */\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n.sticky-group-search {\\r\\n position: fixed;\\r\\n top: 65px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 98%;\\r\\n}\\r\\n\\r\\n.sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 199px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99.55%;\\r\\n}\\r\\n\\r\\n@media only screen and (max-width:768px) {\\r\\n .sticky-group-search {\\r\\n position: fixed;\\r\\n top: 65px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n margin-left: -25px;\\r\\n width: 99%;\\r\\n }\\r\\n \\r\\n .sticky-toolbar-btn{\\r\\n position: fixed;\\r\\n top: 199px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 99%;\\r\\n }\\r\\n}\\r\\n\\r\\n:host ::ng-deep .sticky-header-grid .k-grid .k-grid-header {\\r\\n position: fixed;\\r\\n top: 125px;\\r\\n display: block;\\r\\n height: auto;\\r\\n z-index: 1;\\r\\n width: 97.55%;\\r\\n}\\r\\n\\r\\n/* sticky toolbar */\\r\\n\\r\\n\\r\\n\\r\\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9hcHAvcy9wb3N0L3Bvc3QuY29tcG9uZW50LmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLG9DQUFvQztBQUN4Qzs7QUFFQTs7SUFFSSxxQkFBcUI7SUFDckIsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGFBQWE7SUFDYixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxXQUFXO0lBQ1gsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLFdBQVc7SUFDWCxhQUFhO0lBQ2IsVUFBVTtBQUNkOztBQUVBO0lBQ0ksV0FBVztJQUNYLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osYUFBYTtJQUNiLFVBQVU7SUFDVixpQkFBaUI7SUFDakIsa0JBQWtCO0FBQ3RCOztBQUVBO0lBQ0ksWUFBWTtJQUNaLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxVQUFVO0lBQ1YsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksVUFBVTtJQUNWLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGVBQWU7QUFDbkI7O0FBRUE7SUFDSSxjQUFjO0lBQ2QsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksY0FBYztBQUNsQjs7QUFFQTtJQUNJLFdBQVc7QUFDZjs7QUFFQTtJQUNJLGlCQUFpQjtJQUNqQixXQUFXO0lBQ1gsYUFBYTtBQUNqQjs7QUFFQTtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSx5QkFBeUI7SUFDekIsWUFBWTtJQUNaLFlBQVk7SUFDWixnQkFBZ0I7QUFDcEI7O0FBRUE7SUFDSSxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDJCQUEyQjtJQUMzQiw0QkFBNEI7QUFDaEM7O0FBRUE7SUFDSSxXQUFXO0FBQ2Y7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsaUJBQWlCO0FBQ3JCOztBQUVBO0lBQ0ksV0FBVztJQUNYLGlCQUFpQjtBQUNyQjs7QUFFQTtJQUNJLGdCQUFnQjtBQUNwQjs7QUFHQTs7Ozs7R0FLRzs7QUFFSDtJQUNJLGFBQWE7QUFDakI7O0FBRUE7SUFDSSxpQkFBaUI7SUFDakIsb0JBQW9CO0FBQ3hCOztBQUVBO0lBQ0ksNEJBQTRCO0lBQzVCLFlBQVk7SUFDWixZQUFZO0lBQ1osd0JBQXdCO0lBQ3hCLGVBQWU7SUFDZixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxVQUFVO0FBQ2Q7O0FBRUE7SUFDSSwyQkFBMkI7QUFDL0I7O0FBRUM7SUFDRyxvQ0FBb0M7QUFDeEM7O0FBRUE7SUFDSSxpQkFBaUI7QUFDckI7O0FBRUE7SUFDSSx3QkFBd0I7QUFDNUI7O0FBRUE7SUFDSSxZQUFZO0lBQ1osV0FBVztBQUNmOztBQUVBLHNCQUFzQjs7QUFFdEI7SUFDSSxhQUFhO0lBQ2IsbUJBQW1CO0FBQ3ZCOztBQUVBO0lBQ0ksc0NBQXNDO0lBQ3RDLHVCQUF1QjtJQUN2QixlQUFlO0FBQ25COztBQUVBO0lBQ0ksaUJBQWlCO0lBQ2pCLGtCQUFrQjtBQUN0Qjs7QUFFQTtJQUNJLHFCQUFxQjtJQUNyQix1QkFBdUI7SUFDdkIsZUFBZTtJQUNmLFdBQVc7SUFDWCwwQkFBMEI7QUFDOUI7O0FBRUEsb0JBQW9COztBQUVwQixtQkFBbUI7O0FBQ25CO0lBQ0ksZUFBZTtJQUNmLFNBQVM7SUFDVCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFVBQVU7SUFDVixVQUFVO0FBQ2Q7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakI7O0FBRUE7SUFDSTtRQUNJLGVBQWU7UUFDZixTQUFTO1FBQ1QsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1Ysa0JBQWtCO1FBQ2xCLFVBQVU7SUFDZDs7SUFFQTtRQUNJLGVBQWU7UUFDZixVQUFVO1FBQ1YsY0FBYztRQUNkLFlBQVk7UUFDWixVQUFVO1FBQ1YsVUFBVTtJQUNkO0FBQ0o7O0FBRUE7SUFDSSxlQUFlO0lBQ2YsVUFBVTtJQUNWLGNBQWM7SUFDZCxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7QUFDakI7O0FBRUEsbUJBQW1CIiwiZmlsZSI6InNyYy9hcHAvcy9wb3N0L3Bvc3QuY29tcG9uZW50LmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi5icmEtbmFtZSB7XHJcbiAgICBjb2xvcjogYmx1ZTtcclxufVxyXG5cclxuW19uZ2hvc3QtYzBdIC5rLXBhbmVsYmFyPi5rLWl0ZW0+LmstbGluay5rLXN0YXRlLXNlbGVjdGVkIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6ICM3YzliYjcgIWltcG9ydGFudDtcclxufVxyXG5cclxuLmJhbm5lci1lbGVtZW50LFxyXG4udmlkZW8tZWxlbWVudCB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xyXG59XHJcblxyXG4uYmFubmVyLWVsZW1lbnQge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDE1NnB4O1xyXG4gICAgcGFkZGluZzogMDtcclxufVxyXG5cclxuLmJhbm5lci1lbGVtZW50IGltZyB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTU2cHg7XHJcbn1cclxuXHJcbi52aWRlby1lbGVtZW50IHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAyMDZweDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi52aWRlby1lbGVtZW50IGltZyB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMjA2cHg7XHJcbn1cclxuXHJcbi5pbWFnZS1lbGVtZW50IHtcclxuICAgIHdpZHRoOiAyMTBweDtcclxuICAgIGhlaWdodDogMTQwcHg7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgbWFyZ2luLWxlZnQ6IDE3cHg7XHJcbiAgICBtYXJnaW4tcmlnaHQ6IDE3cHg7XHJcbn1cclxuXHJcbi5pbWFnZS1lbGVtZW50IGltZyB7XHJcbiAgICB3aWR0aDogMTAwcHg7XHJcbiAgICBoZWlnaHQ6IDEwMHB4O1xyXG59XHJcblxyXG4uY3VzdG9tLWxpc3Qge1xyXG4gICAgd2lkdGg6IDQwJTtcclxuICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xyXG59XHJcblxyXG4uY3VzdG9tLWxpc3Qtc3RhdHVzIHtcclxuICAgIHdpZHRoOiA1MCU7XHJcbiAgICBkaXNwbGF5OiBjb250ZW50cztcclxufVxyXG5cclxuLmN1c3RvbS1saXN0LXN0YXR1cyBpbnB1dCB7XHJcbiAgICBtYXJnaW4tdG9wOiA0cHg7XHJcbn1cclxuXHJcbi5jdXN0b20tbGlzdC1jaGlsZCB7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xyXG59XHJcblxyXG4uZWxlbWVudC1zZWFyY2gge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuXHJcbi5lbGVtZW50LXNlYXJjaCB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxufVxyXG5cclxuLmltYWdlLXVwbG9hZC1jdXMge1xyXG4gICAgZGlzcGxheTogY29udGVudHM7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwcHg7XHJcbn1cclxuXHJcbmFnbS1tYXAge1xyXG4gICAgaGVpZ2h0OiA1MDZweDtcclxufVxyXG5cclxuLmZpbGUtdXBsb2FkZWQge1xyXG4gICAgY29sb3I6ICMwMDZDQjcgIWltcG9ydGFudDtcclxuICAgIHdpZHRoOiAxODJweDtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICAgIG1hcmdpbi10b3A6IDM2cHg7XHJcbn1cclxuXHJcbi54ZGlhbG9nY2hhdCB7XHJcbiAgICB3aWR0aDogOTAlICFpbXBvcnRhbnQ7XHJcbiAgICBoZWlnaHQ6IDkwJSAhaW1wb3J0YW50O1xyXG4gICAgbWF4LXdpZHRoOiA4MDBweCAhaW1wb3J0YW50O1xyXG4gICAgbWF4LWhlaWdodDogNjAwcHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLnBhZ2Uge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbn1cclxuXHJcbi50aXRsZSB7XHJcbiAgICBmb250LXNpemU6IDI4cHg7XHJcbiAgICBmb250LXdlaWdodDogYm9sZDtcclxufVxyXG5cclxuLmltZy1iYW5uZXIge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBtYXgtaGVpZ2h0OiA1MDBweDtcclxufVxyXG5cclxuLmRlc2NyaXB0aW9uIHtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbn1cclxuXHJcblxyXG4vKiAuY2tlX2NvbnRlbnRze1xyXG4gICAgaGVpZ2h0OiA3NTBweDtcclxufVxyXG4uY2tlX3Jlc2V0e1xyXG4gICAgaGVpZ2h0OiA3NTBweDtcclxufSAqL1xyXG5cclxuI2NrZV8yX2NvbnRlbnRzIHtcclxuICAgIGhlaWdodDogNzUwcHg7XHJcbn1cclxuXHJcbi5wb3J0YWwgLmdyb3VwLWhlYWRlciB7XHJcbiAgICBwYWRkaW5nLXRvcDogMTNweDtcclxuICAgIHBhZGRpbmctYm90dG9tOiAxM3B4O1xyXG59XHJcblxyXG4uYnRuTGluayB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBEb2RnZXJCbHVlO1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgY29sb3I6IHdoaXRlO1xyXG4gICAgLyogcGFkZGluZzogMTJweCAxNnB4OyAqL1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgcmlnaHQ6IDE1cHg7XHJcbiAgICB6LWluZGV4OiAxO1xyXG59XHJcblxyXG4uYnRuTGluazpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBSb3lhbEJsdWU7XHJcbn1cclxuXHJcbiA6aG9zdCA6Om5nLWRlZXAgLmstdGFic3RyaXA+LmstY29udGVudCB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjZmNmY2ICFpbXBvcnRhbnQ7XHJcbn1cclxuXHJcbi5lZGl0b3ItaGVpZ2h0IHtcclxuICAgIG1pbi1oZWlnaHQ6IDMwMHB4O1xyXG59XHJcblxyXG4uZGlhbG9nLXBvc3Qge1xyXG4gICAgei1pbmRleDogMTAwMCAhaW1wb3J0YW50O1xyXG59XHJcblxyXG4ucmVmZXJlbmNle1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gICAgY29sb3I6IG5hdnk7XHJcbn1cclxuXHJcbi8qIGJlZ2luIHVwbG9hZCBmaWxlICovXHJcblxyXG4ueGRpdmNvbDExIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG59XHJcblxyXG4ueGRpdiB7XHJcbiAgICBib3JkZXI6IDAuMXB4IHNvbGlkIHJnYigxODQsIDE4NCwgMTg0KTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgbWFyZ2luLXRvcDogMHB4O1xyXG59XHJcblxyXG4ueGRpdmNvbDEge1xyXG4gICAgcGFkZGluZy1sZWZ0OiAwcHg7XHJcbiAgICBwYWRkaW5nLXJpZ2h0OiAwcHg7XHJcbn1cclxuXHJcbi54YnV0dG9uIHtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IHJlZDtcclxuICAgIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xyXG4gICAgYmFja2dyb3VuZDogcmVkO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBmb250LXNpemU6IDI1cHggIWltcG9ydGFudDtcclxufVxyXG5cclxuLyogZW5kIHVwbG9hZCBmaWxlICovXHJcblxyXG4vKiBzdGlja3kgdG9vbGJhciAqL1xyXG4uc3RpY2t5LWdyb3VwLXNlYXJjaCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDY1cHg7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIGhlaWdodDogYXV0bztcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB3aWR0aDogOTglO1xyXG59XHJcblxyXG4uc3RpY2t5LXRvb2xiYXItYnRue1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAxOTlweDtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHdpZHRoOiA5OS41NSU7XHJcbn1cclxuXHJcbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjhweCkge1xyXG4gICAgLnN0aWNreS1ncm91cC1zZWFyY2gge1xyXG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgICAgICB0b3A6IDY1cHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgbWFyZ2luLWxlZnQ6IC0yNXB4O1xyXG4gICAgICAgIHdpZHRoOiA5OSU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC5zdGlja3ktdG9vbGJhci1idG57XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICAgIHRvcDogMTk5cHg7XHJcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgd2lkdGg6IDk5JTtcclxuICAgIH1cclxufVxyXG5cclxuOmhvc3QgOjpuZy1kZWVwIC5zdGlja3ktaGVhZGVyLWdyaWQgLmstZ3JpZCAuay1ncmlkLWhlYWRlciB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDEyNXB4O1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgd2lkdGg6IDk3LjU1JTtcclxufVxyXG5cclxuLyogc3RpY2t5IHRvb2xiYXIgKi9cclxuXHJcblxyXG4iXX0= */\"","module.exports = \" \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n {{'Label_Btn_Search' | translate}} \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
{{postTemp.Title}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
0\\\">\\r\\n
{{'FileUploadFileUrls' | translate}}:
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n {{'Post_HotFlg' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n (*) \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
{{item.Name}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n Video không tồn tại\\r\\n \\r\\n
{{item.Name}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \"","import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\nimport { AppLanguage } from '../../services/app.language';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { AppService } from '../../services/app.service';\r\nimport { SelectableSettings, PageChangeEvent, GridDataResult, DataStateChangeEvent } from '@progress/kendo-angular-grid';\r\nimport { State, process, SortDescriptor, orderBy } from '@progress/kendo-data-query';\r\nimport { AppSwal } from 'src/app/services/app.swal';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\nimport { Notification } from '../../services/app.notification';\r\nimport { ExcelExportData } from '@progress/kendo-angular-excel-export';\r\nimport { Observable } from 'rxjs/Observable';\r\nimport 'rxjs/add/observable/interval';\r\nimport { AppGuid } from 'src/app/services/app.guid';\r\nimport { NullInjector } from '@angular/core/src/di/injector';\r\nimport { FileRestrictions, SelectEvent, ClearEvent, RemoveEvent, FileInfo } from '@progress/kendo-angular-upload';\r\nimport * as XLSX from 'xlsx';\r\nimport { AppFile } from 'src/app/services/app.file';\r\nimport { nullSafeIsEquivalent } from '@angular/compiler/src/output/output_ast';\r\nimport { AuthenticationService } from 'src/app/services/authentication.service';\r\nimport { AppControls } from 'src/app/services/app.controls';\r\nimport { AppUtils } from 'src/app/services/app.utils';\r\nimport { AppComponent } from '../../app.component';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpProgressEvent, HttpEventType, HttpResponse } from '@angular/common/http';\r\nimport { of, concat } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport * as FileSaver from 'file-saver';\r\nimport { ConfigComponent } from 'src/app/ad/config/config.component';\r\n// import * as ClassicEditor from '@ckeditor/ckeditor5-build-classic';\r\nimport * as DecoupledEditor from '@ckeditor/ckeditor5-build-decoupled-document';\r\n//import CKFinder from '@ckeditor/ckeditor5-ckfinder/src/ckfinder';\r\ndeclare var CKEDITOR: any;\r\n\r\n@Component({\r\n selector: 'app-post',\r\n templateUrl: './post.component.html',\r\n styleUrls: ['./post.component.css']\r\n})\r\n\r\n\r\n\r\nexport class PostComponent implements OnInit {\r\n\r\n isSticky = false\r\n @HostListener('window:scroll', ['$event'])\r\n checkScroll() {\r\n this.isSticky = window.pageYOffset >= 10;\r\n }\r\n\r\n //codeimage\r\n commentInput = null;\r\n uploadFlag = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n public uploadFlgDefault = {\r\n banner: false,\r\n image: false,\r\n video: false,\r\n };\r\n\r\n public Editor = DecoupledEditor;\r\n\r\n uploadFlg = this.uploadFlgDefault;\r\n public websiteDefault = null;\r\n websiteLink = this.websiteDefault;\r\n public bannerDef = '../../assets/images/default-01.png';\r\n public imageDef = '../../assets/images/default-02.png';\r\n bannerUrl: any;\r\n public imgSaveUrl: any;\r\n imgImageDefault: any;\r\n imgImageMain: any;\r\n //\r\n dateNow = new Date();\r\n\r\n user: any;\r\n loading = false;\r\n dataPosts = [];\r\n dataPostSelectableSettings: SelectableSettings;\r\n dataPostSort = {\r\n allowUnsort: true,\r\n mode: 'multiple'\r\n };\r\n public dataPostFocus = {\r\n Name: true\r\n };\r\n dataPostSortByField: SortDescriptor[] = [\r\n // {\r\n // field: 'OrderIdx',\r\n // dir: 'asc'\r\n // }\r\n // field: 'OrdinalNumber',\r\n // dir: 'asc'\r\n // }\r\n ];\r\n\r\n dataLogPostSelectableSettings: SelectableSettings;\r\n logPostOpened = false;\r\n reViewOpened = false;\r\n postTemp = {\r\n MenuName: '',\r\n Title: '',\r\n Description: '',\r\n ImageUrls: '',\r\n FileUrl: [],\r\n Reference: ''\r\n };\r\n //imagesUploadName = \"\";\r\n\r\n public LBM_NUM_PAGING_SKIP = 0;\r\n public LBM_NUM_PAGING_TAKE = 50;\r\n public LBM_NUM_PAGING_BTN = 5;\r\n\r\n dataPostSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataPostPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataPostSelection: number[] = [];\r\n dataPostItem: any;\r\n dataPostItemTemp: any;\r\n dataPostItemEnLanguage: any;\r\n myInterval: any;\r\n infoOpened = false;\r\n isReviewDialog = false;\r\n\r\n\r\n\r\n public buttonCount = this.LBM_NUM_PAGING_BTN;\r\n public info = true;\r\n public type: 'numeric' | 'input' = 'numeric';\r\n public pageSizes = true;\r\n public previousNext = true;\r\n\r\n public dataPostState: State = {\r\n skip: this.dataPostSkip,\r\n take: this.dataPostSkip + this.dataPostPageSize,\r\n filter: {\r\n logic: 'and',\r\n filters: []\r\n },\r\n\r\n //group: [{ field: 'TypeName' }]\r\n };\r\n\r\n\r\n\r\n dataPostGridDataResult: GridDataResult;\r\n\r\n dataFileUrlsGridDataResult: GridDataResult;\r\n dataFileUrlsSelectableSettings: SelectableSettings;\r\n dataFileUrlsSkip = this.LBM_NUM_PAGING_SKIP;\r\n dataFileUrlsPageSize = this.LBM_NUM_PAGING_TAKE;\r\n dataFileUrlsSelection: number[] = [];\r\n\r\n dataLogPostGridDataResult: GridDataResult;\r\n dataLogPosts: any[];\r\n\r\n dataMenuID: any[];\r\n pageName: any;\r\n\r\n menus: Array<{ Name: string, ID: string }>;\r\n menusFilter: Array<{ Name: string, ID: string }>;\r\n menusFilterSearch: Array<{ Name: string, ID: string }>;\r\n filesUpload: Array;\r\n dataFileUrls: any[];\r\n public fileSaveUrl: any;\r\n\r\n public uploadSaveUrl = 'saveUrl';\r\n public uploadRemoveUrl = 'removeUrl';\r\n public enabled = false;\r\n public enabledID = false;\r\n isEnabledSaveAll = false;\r\n control: any;\r\n controlDefault = true;\r\n allowMulti = true;\r\n\r\n searchOption = {\r\n SearchText: '',\r\n PortalId: 14,\r\n MenuID: ''\r\n };\r\n\r\n portalIds: any[];\r\n ckeConfig: any;\r\n editorOptions = { theme: 'vs-dark', language: 'javascript' };\r\n //CKEDITOR: any;\r\n urlDownload = this.appService.apiRoot;\r\n allowInsertFile = true;\r\n filesUploadName = \"\";\r\n typeReferences: Array<{ Name: string, ID: string }>;\r\n typeReferenceFilter: Array<{ Name: string, ID: string }>;\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n private language: AppLanguage,\r\n public appService: AppService,\r\n private appSwal: AppSwal,\r\n public intl: IntlService,\r\n private notification: Notification,\r\n private guid: AppGuid,\r\n private file: AppFile,\r\n private authenticationService: AuthenticationService,\r\n public appControls: AppControls,\r\n private appUtils: AppUtils,\r\n private appComponent: AppComponent,\r\n private domSanitizer: DomSanitizer,\r\n ) {\r\n this.authenticationService.getUser();\r\n this.user = this.authenticationService.user;\r\n this.imgSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=image`;\r\n this.getControl();\r\n this.setDefault();\r\n this.language.default();\r\n this.setSelectableSettings();\r\n this.initDisplay();\r\n this.allData = this.allData.bind(this);\r\n this.getPageName();\r\n this.get4Type();\r\n this.getSearchMenus();\r\n this.getMenus();\r\n\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // if (this.myInterval) { this.myInterval.unsubscribe(); }\r\n }\r\n\r\n\r\n ngOnInit() {\r\n this.ckeConfig = {\r\n allowedContent: true,\r\n extraPlugins: 'divarea',\r\n forcePasteAsPlainText: true\r\n };\r\n }\r\n\r\n onReady(eventData) {\r\n eventData.plugins.get('FileRepository').createUploadAdapter = function (loader) {\r\n console.log('loader : ', loader)\r\n console.log(btoa(loader.file));\r\n return new UploadAdapter(loader);\r\n };\r\n eventData.ui.getEditableElement().parentElement.insertBefore(\r\n eventData.ui.view.toolbar.element,\r\n eventData.ui.getEditableElement()\r\n );\r\n }\r\n public ckeditorContent: string = \"\";\r\n\r\n // ngOnInit(): void {\r\n // // Set The Name of ckEditor\r\n // CKEDITOR.on(\"instanceCreated\", function(event, data) {\r\n // var editor = event.editor,\r\n // element = editor.element;\r\n // editor.name = \"content\";\r\n // });\r\n // }\r\n\r\n getData() {\r\n console.log(CKEDITOR.instances.content.getData());\r\n }\r\n\r\n async getPageName() {\r\n this.pageName = await this.appControls.getPageName();\r\n }\r\n\r\n async getControl() {\r\n this.control = await this.appControls.getControls(this.user.RoleID);\r\n this.controlDefault = false;\r\n }\r\n\r\n setSelectableSettings(): void {\r\n\r\n this.allowMulti = !this.allowMulti;\r\n this.dataPostSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: this.allowMulti ? 'multiple' : 'single'\r\n };\r\n\r\n this.dataFileUrlsSelectableSettings = {\r\n checkboxOnly: false,\r\n mode: 'single'\r\n };\r\n }\r\n\r\n onMenusHandleFilter(value) {\r\n this.menusFilter = this.menus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onMenusSearchHandleFilter(value) {\r\n this.menusFilterSearch = this.menus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onTypeRefHandleFilter(value) {\r\n this.typeReferenceFilter = this.typeReferences.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n onSearchKeyPress(e: any) {\r\n if (e.keyCode === 13 && this.searchOption.SearchText) {\r\n this.onSearch();\r\n }\r\n }\r\n\r\n async getPosts() {\r\n this.loading = true;\r\n const dataRequest = {\r\n searchText: this.searchOption.SearchText,\r\n menuID: this.searchOption.MenuID ? this.searchOption.MenuID : ''\r\n };\r\n\r\n const result = await this.appService.doGET('api/Post/Search', dataRequest);\r\n var menus = []\r\n if (result && result.Data) {\r\n for (let i = 0; i < result.Data.length; i++) {\r\n if(result.Data[i].FileUrl == null || result.Data[i].FileUrl == \"\"){\r\n result.Data[i].FileUrl = [];\r\n }\r\n else{\r\n result.Data[i].FileUrl = JSON.parse(result.Data[i].FileUrl);\r\n }\r\n\r\n // if(result.Data[i].Reference == null || result.Data[i].Reference == \"\"){\r\n // result.Data[i].Reference = \"\";\r\n // }\r\n // else{\r\n // result.Data[i].Reference = JSON.parse(result.Data[i].Reference);\r\n // result.Data[i].Reference = (result.Data[i].Reference).join(\";\")\r\n // }\r\n menus = []\r\n menus =this.menus.filter((s) => result.Data[i].MenuID.indexOf(s.ID.toString()) !== -1);\r\n \r\n result.Data[i].menuNames = [];\r\n for(let j = 0; j < menus.length; j++) {\r\n result.Data[i].menuNames.push(menus[j].Name);\r\n } \r\n result.Data[i].menuNames = result.Data[i].menuNames.join(\"; \");\r\n }\r\n this.dataPosts = result.Data;\r\n this.bindPosts();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n async onGetPost15p() {\r\n this.loading = true;\r\n const dataRequest = {\r\n id: this.searchOption.PortalId\r\n };\r\n\r\n const result = await this.appService.doGET('api/Post/GetPost15p', dataRequest);\r\n if (result) {\r\n \r\n this.dataPosts = result.Data;\r\n this.bindPosts();\r\n }\r\n this.loading = false;\r\n this.checkSelectionID();\r\n }\r\n\r\n onTabChanged(e) {\r\n if (e.index === 0) {\r\n this.onReload();\r\n } else {\r\n this.onGetPost15p();\r\n }\r\n }\r\n\r\n checkSelectionID() {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = this.dataPostSelection.length - 1; i >= 0; i--) {\r\n const selectedItem = this.dataPosts.find((item) => {\r\n return item.ID === this.dataPostSelection[i];\r\n });\r\n if (!selectedItem) {\r\n this.dataPostSelection.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n setDefault() {\r\n this.dataPostItem = {\r\n IsAdd: true,\r\n ID: null,\r\n MenuID: null,\r\n Title: null,\r\n Summary: null,\r\n Description: null,\r\n ImageUrls: null,\r\n FileUrls: null,\r\n CreateAt: new Date(),\r\n UpdateAt: new Date(),\r\n MobileFlg: null,\r\n ApprovedFlg: null,\r\n ApprovedAt: null,\r\n ApprovedBy: null,\r\n OrderIdx: 0,\r\n HotFlg: false,\r\n FileUrl: [],\r\n Note: '',\r\n UrlPath: '',\r\n Reference: ''\r\n };\r\n this.dataPostItemTemp = {\r\n IsAdd: true,\r\n ID: null,\r\n MenuID: null,\r\n Title: null,\r\n Summary: null,\r\n Description: null,\r\n ImageUrls: null,\r\n FileUrls: null,\r\n CreateAt: new Date(),\r\n UpdateAt: new Date(),\r\n MobileFlg: null,\r\n ApprovedFlg: null,\r\n ApprovedAt: null,\r\n ApprovedBy: null,\r\n OrderIdx: 0,\r\n HotFlg: false,\r\n FileUrl: [],\r\n Note: '',\r\n UrlPath: '',\r\n Reference: ''\r\n };\r\n this.dataPostItemEnLanguage = {\r\n ID: null,\r\n PostID: null,\r\n Title: null,\r\n Summary: null,\r\n Description: null,\r\n CreateAt: null,\r\n CreateBy: null,\r\n UpdateAt: null,\r\n UpdateBy: null,\r\n LanguageID: null,\r\n };\r\n this.imageDef = '../../assets/images/default-02.png';\r\n this.imgImageDefault = [\r\n this.imageDef,\r\n // this.imageDef,\r\n // this.imageDef,\r\n ];\r\n //this.imagesUploadName = \"\";\r\n this.imgImageMain = [''];\r\n this.uploadFlg = this.uploadFlgDefault;\r\n this.websiteLink = this.websiteDefault;\r\n this.enabled = true;\r\n this.enabledID = true;\r\n\r\n this.dataMenuID = [];\r\n this.dataPostSelection = [];\r\n this.filesUpload = [];\r\n this.dataFileUrls = [];\r\n this.postTemp = {\r\n MenuName: '',\r\n Title: '',\r\n Description: '',\r\n ImageUrls: '',\r\n FileUrl: [],\r\n Reference: ''\r\n };\r\n //this.bindFileUrls();\r\n this.fileSaveUrl = `${this.appService.apiRoot}api/Upload/MediaWeb?accountID=${this.user.UserName}&typeData=files&checkFileSize=true`;\r\n this.filesUploadName = \"\";\r\n }\r\n\r\n bindTemp(data) {\r\n this.dataPostItemTemp = Object.assign({}, data);\r\n }\r\n\r\n async onImageUrlSelectEventHandler(e: SelectEvent, index) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = e.files[0];// await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n return false;\r\n }\r\n\r\n // tslint:disable-next-line: max-line-length\r\n if (e.files[0].extension !== '.jpg' &&\r\n e.files[0].extension !== '.png' &&\r\n e.files[0].extension !== '.gif' &&\r\n e.files[0].extension !== '.jpeg' &&\r\n e.files[0].extension !== '.JPEG' &&\r\n e.files[0].extension !== '.GIF' &&\r\n e.files[0].extension !== '.PNG' &&\r\n e.files[0].extension !== '.JPG') {\r\n this.appSwal.showWarning(this.translate.instant('MsgImgOnly'), false);\r\n return false;\r\n }\r\n\r\n const fileData = await this.file.readImage(e.files[0].rawFile);\r\n const base64 = `${fileData}`;\r\n this.imgImageDefault[index] = this.domSanitizer.bypassSecurityTrustResourceUrl(base64);\r\n this.imgImageDefault.push(this.imageDef);\r\n //this.imagesUploadName = e.files[0].rawFile.name;\r\n }\r\n\r\n onImageUrlSuccessEventHandle(e: any, index) {\r\n try {\r\n this.uploadFlg.image = true;\r\n this.imgImageMain[index] = e.response.body.Data.MediaNm[0];\r\n } catch {\r\n this.uploadFlg.image = false;\r\n // this.imgImageDefault[index] = this.imageDef;\r\n }\r\n }\r\n\r\n onImageUrlRemoveEventHandler(index) {\r\n this.imgImageMain[index] = '';\r\n }\r\n\r\n onPostPageChange(event: PageChangeEvent) {\r\n this.dataPostSkip = event.skip;\r\n this.bindPosts();\r\n }\r\n\r\n async onPostSelectedKeysChange() {\r\n\r\n if (this.dataPostSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n\r\n if (this.dataPostSelection.length > 1) {\r\n if (this.allowMulti) {\r\n return;\r\n }\r\n this.appSwal.showWarning(this.translate.instant('SelectSingle'), false);\r\n } else {\r\n const selectedID = this.dataPostSelection[0];\r\n const selectedItem = this.dataPosts.find((item) => {\r\n return item.ID === selectedID;\r\n });\r\n selectedItem.IsAdd = false; \r\n this.dataPostItem = selectedItem; \r\n\r\n this.uploadFlg.image = false;\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n }\r\n\r\n bindPosts() {\r\n this.dataPostGridDataResult = {\r\n data: orderBy(this.dataPosts, this.dataPostSortByField),\r\n total: this.dataPosts.length\r\n };\r\n\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n bindFileUrls() {\r\n this.dataFileUrlsGridDataResult = {\r\n data: this.dataFileUrls,\r\n total: this.dataFileUrls.length\r\n };\r\n\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n bindLogPosts() {\r\n this.dataLogPostGridDataResult = {\r\n data: this.dataLogPosts,\r\n total: this.dataLogPosts.length\r\n };\r\n\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n onPostSortChange(sort: SortDescriptor[]): void {\r\n this.dataPostSortByField = sort;\r\n this.bindPosts();\r\n }\r\n\r\n public onPostDataStateChange(state: DataStateChangeEvent): void {\r\n this.dataPostSelection = [];\r\n this.dataPostState = state;\r\n this.dataPostGridDataResult = process(this.dataPosts, this.dataPostState);\r\n }\r\n\r\n removeEventHandler(index) {\r\n this.isEnabledSaveAll = false;\r\n this.imgImageMain[index] = '',\r\n this.onReload();\r\n }\r\n\r\n doInterval() {\r\n // this.myInterval = Observable.interval(this.appService.timeInterval).subscribe(() => {\r\n // this.onReload();\r\n // });\r\n }\r\n\r\n onSearchTextChange(e: any) {\r\n if (!this.searchOption.SearchText) {\r\n this.onReload();\r\n }\r\n }\r\n\r\n onRemoveSearchText() {\r\n this.searchOption.SearchText = '';\r\n\r\n }\r\n\r\n async initDisplay() {\r\n const resultPost = await this.appService.doGET('api/Post/GetMenu', null);\r\n if (resultPost && resultPost.Status === 1) {\r\n this.menus = resultPost.Data.filter((r) => 'portal/post-list;chucnangnhiemvu'.indexOf(r.PageID) >= 0);\r\n this.menusFilter = this.menus.slice();\r\n this.menusFilterSearch = this.menus.slice();\r\n\r\n if (!this.searchOption.MenuID && this.menus.length > 0) {\r\n this.searchOption.MenuID = '';\r\n }\r\n this.onReload();\r\n }\r\n\r\n this.portalIds = [\r\n { Name: 'Phường 1 Quận 10', ID: 14 },\r\n { Name: 'Phường 2 Quận 10', ID: 15 },\r\n { Name: 'Phường 3 Quận 10', ID: 16 },\r\n { Name: 'Phường 4 Quận 10', ID: 2 },\r\n { Name: 'Phường 5 Quận 10', ID: 17 },\r\n { Name: 'Phường 6 Quận 10', ID: 18 },\r\n { Name: 'Phường 7 Quận 10', ID: 19 },\r\n { Name: 'Phường 8 Quận 10', ID: 20 },\r\n { Name: 'Phường 9 Quận 10', ID: 10 },\r\n { Name: 'Phường 10 Quận 10', ID: 21 },\r\n { Name: 'Phường 11 Quận 10', ID: 22 },\r\n { Name: 'Phường 12 Quận 10', ID: 23 },\r\n { Name: 'Phường 13 Quận 10', ID: 24 },\r\n { Name: 'Phường 14 Quận 10', ID: 11 },\r\n { Name: 'Phường 15 Quận 10', ID: 7 }\r\n ];\r\n\r\n const resultReference = await this.appService.doGET('api/Type/GetReferenceFilter', null);\r\n if (resultReference && resultReference.Status === 1) {\r\n this.typeReferences = resultReference.Data\r\n this.typeReferenceFilter = this.typeReferences.slice(); \r\n }\r\n }\r\n\r\n onSearch() {\r\n this.getPosts();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onReload() {\r\n this.searchOption.SearchText = '';\r\n this.getPosts();\r\n this.isEnabledSaveAll = false;\r\n }\r\n\r\n onClearPost() {\r\n this.setDefault();\r\n }\r\n\r\n onAllowSelectMulti() {\r\n this.setSelectableSettings();\r\n }\r\n\r\n onAddNewPost() {\r\n this.setDefault();\r\n this.infoOpened = true;\r\n }\r\n\r\n async onSavePost() {\r\n if (this.dataPostItem.IsAdd) { this.addPost(); } else { this.updatePost(); }\r\n }\r\n\r\n async onSendPost() {\r\n\r\n if (this.dataPostSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataPostSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning('Bạn có chắc chắn muốn xuất tin bài này không?', true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Post/Send', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataPostSelection = [];\r\n this.allowMulti = false;\r\n \r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async onViewLogPost() {\r\n\r\n const dataRequest = {\r\n id: this.dataPostItem.ID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Post/GetLog', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataLogPosts = result.Data;\r\n this.bindLogPosts();\r\n\r\n this.logPostOpened = true;\r\n\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n\r\n onCloseLogPost(e) {\r\n this.logPostOpened = false;\r\n }\r\n\r\n onCloseReViewPost(e) {\r\n this.reViewOpened = false;\r\n \r\n if (this.isReviewDialog) {\r\n this.infoOpened = true;\r\n } else {\r\n this.infoOpened = false;\r\n }\r\n }\r\n\r\n onReviewPost() {\r\n this.reViewOpened = true;\r\n this.infoOpened = false;\r\n this.getPostTemp();\r\n }\r\n\r\n onReviewPostDialog() {\r\n this.getPostsByIdReview(this.dataPostItem.ID);\r\n }\r\n isUploadFromServe = false;\r\n getPostTemp() {\r\n const menuIDJSON: any[] = [];\r\n if (this.dataMenuID.length > 0) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataMenuID.length; i++) {\r\n menuIDJSON.push(this.dataMenuID[i].Name);\r\n }\r\n }\r\n this.postTemp.ImageUrls = this.dataPostItemTemp.ImageUrls;\r\n //var content = document.getElementById(\"content\").outerHTML;\r\n this.postTemp.MenuName = this.dataPostItem.IsAdd ? menuIDJSON.join(';') : this.dataPostItem.MenuName;\r\n this.postTemp.Title = this.dataPostItem.Title;\r\n this.postTemp.Description = this.dataPostItemTemp.Description;\r\n this.postTemp.FileUrl = this.dataPostItemTemp.FileUrl;\r\n this.postTemp.Reference = this.dataPostItemTemp.Reference;\r\n var content = this.postTemp.Description;\r\n try {\r\n var require = content.indexOf(\"= 0) {\r\n while (content.indexOf(\"= 0) {\r\n var st_Index = content.indexOf(\"\")\r\n var sub1 = content.substring(st_Index, end_Index + \" \".length);\r\n\r\n var st_key = sub1.indexOf(\"?v=\"); var end_key = sub1.indexOf('\">');\r\n var key = sub1.substring(st_key + \"?v=\".length, end_key);\r\n\r\n var replace = '';\r\n \r\n //`${}0${}`\r\n this.postTemp.Description = this.postTemp.Description.replace(sub1, replace);\r\n content = this.postTemp.Description;\r\n }\r\n }\r\n } catch{\r\n content = this.postTemp.Description;\r\n }\r\n try {\r\n if (this.postTemp.ImageUrls.indexOf(\"Multimedia\") >= 0) {\r\n this.isUploadFromServe = true;\r\n }\r\n } catch{\r\n this.isUploadFromServe = false;\r\n }\r\n }\r\n\r\n async onCancelPost() {\r\n\r\n const dataRequest = {\r\n ID: this.dataPostItem.ID\r\n };\r\n\r\n const option = await this.appSwal.showWarning('Bạn có chắc chắn muốn hủy xuất tin bài này không?', true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Post/Send', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.dataPostItem.ApprovedFlg = false;\r\n this.dataPostItem.ApprovedAt = null;\r\n this.dataPostItem.ApprovedBy = null;\r\n\r\n this.notification.showSuccess(result.Msg);\r\n\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n }\r\n\r\n\r\n // async onSavePosts() {\r\n // this.appComponent.loading = true;\r\n // const dataRequests = [];\r\n // // tslint:disable-next-line:prefer-for-of\r\n // for (let i = 0; i < this.dataPosts.length; i++) {\r\n // dataRequests.push(this.createDataRequest(this.dataPosts[i]));\r\n // }\r\n // const result = await this.appService.doPOST('api/Post/Saves', dataRequests);\r\n // this.dataPostItem.ImageUrls = (this.uploadFlg.image == true) ? this.parseToArrayTxt(this.imgImageMain) : null;\r\n // if (result && result.Status === 1) {\r\n // this.notification.showSuccess(result.Msg);\r\n // this.onReload();\r\n // this.isEnabledSaveAll = false;\r\n // } else {\r\n // this.appSwal.showWarning(result.Msg, false);\r\n // }\r\n // this.appComponent.loading = false;\r\n // }\r\n\r\n createDataRequest(data) {\r\n const temp = data ? data : this.dataPostItemTemp;\r\n const tempEnLanguage = this.dataPostItemEnLanguage;\r\n // let fileName = '';\r\n // if (this.dataFileUrls.length > 0) {\r\n // fileName = this.dataFileUrls[0].Url;\r\n // }\r\n\r\n const menuIDJSON: any[] = [];\r\n if (this.dataMenuID.length > 0) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.dataMenuID.length; i++) {\r\n menuIDJSON.push(this.dataMenuID[i].ID);\r\n }\r\n }\r\n\r\n var files: any[] = [];\r\n if (this.dataPostItemTemp.FileUrl) {\r\n for (let i = 0; i < this.dataPostItemTemp.FileUrl.length; i++) {\r\n files.push(this.dataPostItemTemp.FileUrl[i]);\r\n }\r\n }\r\n\r\n // var reference: any[] = [];\r\n // reference = temp.Reference.split(\";\")\r\n\r\n return {\r\n Post: {\r\n ID: temp.ID,\r\n MenuID: menuIDJSON.length > 0 ? JSON.stringify(menuIDJSON) : null,\r\n Title: temp.Title,\r\n Summary: temp.Summary,\r\n Description: temp.Description,\r\n ImageUrls: temp.ImageUrls,\r\n FileUrls: null,\r\n CreateAt: temp.CreateAt ? this.intl.formatDate(new Date(temp.CreateAt), 'yyyy-MM-ddTHH:mm:ss') : null,\r\n UpdateAt: temp.UpdateAt,\r\n MobileFlg: temp.MobileFlg,\r\n ApprovedFlg: temp.ApprovedFlg,\r\n ApprovedAt: temp.ApprovedAt,\r\n ApprovedBy: temp.ApprovedBy,\r\n OrderIdx: temp.OrderIdx,\r\n HotFlg: temp.HotFlg,\r\n FileUrl: JSON.stringify(files),\r\n Note: temp.Note,\r\n UrlPath: temp.UrlPath,\r\n Reference: temp.Reference\r\n },\r\n EnLanguage: {\r\n ID: tempEnLanguage.ID,\r\n PostID: tempEnLanguage.PostID,\r\n Title: tempEnLanguage.Title,\r\n Summary: tempEnLanguage.Summary,\r\n Description: tempEnLanguage.Description,\r\n CreateAt: tempEnLanguage.CreateAt,\r\n CreateBy: tempEnLanguage.CreateBy,\r\n UpdateAt: tempEnLanguage.UpdateAt,\r\n UpdateBy: tempEnLanguage.UpdateBy,\r\n LanguageID: 'en-US'\r\n }\r\n };\r\n }\r\n\r\n onClosePost(status: any) {\r\n this.enabled = false;\r\n this.enabledID = false;\r\n }\r\n\r\n onEditPost() {\r\n this.getPostsById(this.dataPostItem.ID);\r\n }\r\n\r\n parseToArrayTxt(arrayObject) {\r\n var arrayTxt = \"\";\r\n for (var i = 0; i < arrayObject.length; i++) {\r\n if (arrayObject[i] != \"\" && arrayObject[i] != null && arrayObject[i] != this.imageDef) {\r\n if (arrayTxt == \"\") {\r\n arrayTxt = \"[\" + \"\\\"\" + arrayObject[i] + \"\\\"\";\r\n } else {\r\n arrayTxt = arrayTxt + \",\" + \"\\\"\" + arrayObject[i] + \"\\\"\";\r\n }\r\n }\r\n }\r\n\r\n if (arrayTxt != \"\") {\r\n arrayTxt = arrayTxt + \"]\";\r\n }\r\n\r\n return arrayTxt;\r\n }\r\n\r\n async addPost() {\r\n this.appComponent.loading = true;\r\n this.dataPostItemTemp.ImageUrls = (this.uploadFlg.image === true && this.imgImageMain && this.imgImageMain.length > 0)\r\n ? this.imgImageMain[0] : null;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPOST('api/Post', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n this.onAddNewPost();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n async updatePost() {\r\n this.appComponent.loading = true;\r\n // tslint:disable-next-line: max-line-length\r\n this.dataPostItemTemp.ImageUrls = (this.uploadFlg.image === true && this.imgImageMain && this.imgImageMain.length > 0)\r\n ? this.imgImageMain[0] : this.dataPostItem.ImageUrls;\r\n const id = this.dataPostItem.ID;\r\n //this.dataPostItem.Description = this.postTemp.Description;\r\n const dataRequest = this.createDataRequest(null);\r\n const result = await this.appService.doPUT('api/Post', dataRequest, { id });\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewPost();\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n //////////////////////\r\n public valueChange(value: any = this.dataPostItem): void {\r\n }\r\n\r\n /////////////////////\r\n async onDeletePost() {\r\n if (this.dataPostSelection.length === 0) {\r\n this.appSwal.showWarning(this.translate.instant('NoRecordSelected'), false);\r\n return;\r\n }\r\n this.appComponent.loading = true;\r\n const dataRequest = {\r\n IDList: JSON.stringify(this.dataPostSelection),\r\n FlgRevert: false\r\n };\r\n\r\n const option = await this.appSwal.showWarning(this.translate.instant('AreYouSure'), true);\r\n if (option) {\r\n const result = await this.appService.doPOST('api/Post/Deletes', dataRequest);\r\n if (result && result.Status === 1) {\r\n this.notification.showSuccess(result.Msg);\r\n this.onReload();\r\n //this.onAddNewPost();\r\n this.enabled = false;\r\n this.enabledID = false;\r\n this.dataPostSelection = [];\r\n this.allowMulti = false;\r\n } else {\r\n this.appSwal.showWarning(result.Msg, false);\r\n }\r\n }\r\n this.appComponent.loading = false;\r\n }\r\n\r\n getPostName(dataItem) {\r\n var nameFile = \"temp.txt\";\r\n var fileUrls = dataItem.ImageUrls;\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var listurlArr = JSON.parse(fileUrls);\r\n if (listurlArr.length > 0) {\r\n var nameObj = listurlArr[0];\r\n var urlArr = nameObj.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return nameFile;\r\n }\r\n\r\n getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n // const lastIdx = fileUrl.lastIndexOf('/');\r\n // if (lastIdx > 0) {\r\n // nameFile = fileUrl.substring(lastIdx + 1);\r\n // }\r\n\r\n return nameFile;\r\n }\r\n\r\n async onDownloadFile(dataItem: any) {\r\n\r\n const dataRequest = {\r\n url: dataItem.Url\r\n };\r\n const result = await this.appService.doDownload('api/Upload/DownloadByUrl', dataRequest);\r\n if (result) {\r\n FileSaver.saveAs(result, dataItem.Name);\r\n }\r\n }\r\n\r\n onDeleteFile(dataItem: any) {\r\n\r\n for (let i = this.dataFileUrls.length - 1; i >= 0; i--) {\r\n if (this.dataFileUrls[i].Url === dataItem.Url) {\r\n this.dataFileUrls.splice(i, 1);\r\n break;\r\n }\r\n }\r\n\r\n this.bindFileUrls();\r\n }\r\n\r\n public allData(): ExcelExportData {\r\n const result: ExcelExportData = {\r\n data: process(this.dataPosts, {}).data\r\n };\r\n\r\n return result;\r\n }\r\n\r\n async onSelectFileToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return false;\r\n }\r\n try {\r\n const fileData = await this.file.readFile(e.files[0].rawFile);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onSuccessFileToUpload(e: any) {\r\n try {\r\n const k = `${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`;\r\n this.dataFileUrls.push({\r\n Name: this.getNameByUrl(k),\r\n Url: k\r\n });\r\n\r\n this.bindFileUrls();\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n onRemoveFileToUpload() {\r\n\r\n }\r\n onCloseInfo(e) {\r\n this.setDefault();\r\n this.infoOpened = false;\r\n }\r\n\r\n manageOpen = false;\r\n parentMenus: Array<{ Name: string, ID: string }>;\r\n parentMenusFilter: Array<{ Name: string, ID: string }>;\r\n\r\n parentMenusHandleFilter(value) {\r\n this.parentMenusFilter = this.parentMenus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n async getMenus() {\r\n this.loading = true;\r\n const dataRequest = {\r\n pageID: 'portal/multimedia'\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/GetMenuMultimedia', null);\r\n if (result) {\r\n this.parentMenus = [];\r\n result.Data.forEach(item => {\r\n this.parentMenus.push(item);\r\n });\r\n this.parentMenusFilter = this.parentMenus.slice();\r\n }\r\n this.loading = false;\r\n }\r\n\r\n Types: Array<{ Name: string, ID: number }>;\r\n TypesFilter: Array<{ Name: string, ID: number }>;\r\n\r\n get4Type() {\r\n this.Types = [\r\n { Name: 'Không hiển thị (Trang chủ)', ID: -1 },\r\n { Name: 'Banner trái (Trang chủ)', ID: 0 },\r\n { Name: 'Banner phải (Trang chủ)', ID: 1 }\r\n ];\r\n this.TypesFilter = this.Types.slice();\r\n this.loading = false;\r\n }\r\n\r\n searchMenus: Array<{ Name: string, ID: string }>;\r\n searchMenusFilter: Array<{ Name: string, ID: string }>;\r\n\r\n searchMenusHandleFilter(value) {\r\n this.searchMenusFilter = this.searchMenus.filter((s) => s.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1);\r\n }\r\n\r\n getNameByList(menuID) {\r\n const menus = this.menus.filter((s) => menuID.indexOf(s.ID.toString()) !== -1);\r\n\r\n const menuNames = [];\r\n for(let i = 0; i < menus.length; i++) {\r\n menuNames.push(menus[i].Name);\r\n }\r\n return menuNames.join(\"; \");\r\n }\r\n async getSearchMenus() {\r\n\r\n this.loading = true;\r\n const dataRequest = {\r\n pageID: 'portal/multimedia'\r\n };\r\n\r\n const result = await this.appService.doGET('api/Menu/GetMenuMultimedia', null);\r\n if (result) {\r\n this.searchMenus = [];\r\n\r\n const HA = {\r\n PName: 'Hình Ảnh', Type: 1, child: []\r\n };\r\n const VID = {\r\n PName: 'Video', Type: 0, child: []\r\n };\r\n\r\n //this.data = result.Data;\r\n result.Data.forEach(item => {\r\n this.searchMenus.push(item);\r\n if (item.PageID === \"portal/multimedia\") {\r\n const temp = {\r\n PName: item.Name, IDchild: item.ID\r\n };\r\n HA.child.push(temp);\r\n }\r\n else {\r\n const temp = {\r\n PName: item.Name, IDchild: item.ID\r\n };\r\n VID.child.push(temp)\r\n }\r\n });\r\n this.data.push(HA);\r\n this.data.push(VID);\r\n this.searchMenusFilter = this.searchMenus.slice();\r\n }\r\n this.loading = false;\r\n }\r\n public data: any[] = [];\r\n public selectedKeys: any[];\r\n public menuID: any;\r\n imagesGrid: any;\r\n imagesSlide: any;\r\n isGridMode = true;\r\n videos: any;\r\n img = false;\r\n vid = false;\r\n async getImages(ID) {\r\n this.menuID = ID;\r\n const dataRequest = {\r\n menuID: this.menuID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/ImageManage', dataRequest);\r\n if (result) {\r\n this.imagesGrid = result.Data;\r\n this.imagesSlide = result.Data.SlideViewData;\r\n }\r\n }\r\n async getVideos(ID) {\r\n this.menuID = ID;\r\n const dataRequest = {\r\n menuID: this.menuID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/Video', dataRequest);\r\n if (result) {\r\n this.videos = result.Data;\r\n }\r\n }\r\n linkVid: any;\r\n\r\n public handleSelection({ index }: any): void {\r\n this.selectedKeys = [index];\r\n /*Get Parent Node*/\r\n var id = this.selectedKeys.toString();\r\n var idx = id.substring(0, 1);\r\n var Type = this.data[idx].Type;\r\n if (Type == 1) {\r\n this.img = true;\r\n this.vid = false;\r\n var tempChild = this.data[idx].child;\r\n\r\n /*Get Child by Parent*/\r\n var child_idx = id.substring(id.length - 1, id.length);\r\n var MenuMutilmedia_ID = tempChild[child_idx].IDchild;\r\n this.getImages(MenuMutilmedia_ID);\r\n }\r\n else {\r\n this.img = false;\r\n this.vid = true;\r\n var tempChild = this.data[idx].child;\r\n\r\n /*Get Child by Parent*/\r\n var child_idx = id.substring(id.length - 1, id.length);\r\n var MenuMutilmedia_ID = tempChild[child_idx].IDchild;\r\n this.getVideos(MenuMutilmedia_ID);\r\n }\r\n }\r\n item_ID: any;\r\n link: any;\r\n main_URL_IMG: any;\r\n async getLink(ID) {\r\n this.item_ID = ID;\r\n const dataRequest = {\r\n menuId: this.item_ID\r\n };\r\n\r\n const result = await this.appService.doGET('api/Multimedia/getLink', dataRequest);\r\n if (result) {\r\n this.link = this.appService.apiRoot + result.Data;\r\n this.uploadFlg.image = true;\r\n this.imgImageDefault[0] = this.link;\r\n this.imgImageMain[0] = this.imgImageDefault[0];\r\n this.manageOpen = false;\r\n }\r\n }\r\n public onGetLink(ID_item) {\r\n this.getLink(ID_item);\r\n }\r\n public onManageOpen() {\r\n this.manageOpen = true;\r\n }\r\n public onCloseManage() {\r\n this.manageOpen = false;\r\n }\r\n\r\n async getLanguage() {\r\n var k = 0;\r\n if (this.dataPostItem.ID != null) {\r\n const dataRequest = {\r\n id: this.dataPostItem.ID\r\n }\r\n const result = await this.appService.doGET('api/Post/GetPostLanguage', dataRequest);\r\n if (result && result.Status == 1) {\r\n for (let i = 0; i < result.Data.length; i++) {\r\n if (result.Data[i].LanguageID == \"en-US\") {\r\n this.dataPostItemEnLanguage = result.Data[i];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public onTabSelect(e) {\r\n }\r\n\r\n async getPostsById(id) {\r\n\r\n const dataRequest = {\r\n id : id\r\n };\r\n\r\n const selectedItem = await this.appService.doGET('api/Post/GetById', dataRequest);\r\n if (selectedItem && selectedItem.Status ===1){\r\n if (selectedItem.Data) {\r\n selectedItem.Data.IsAdd = false;\r\n if(selectedItem.Data.FileUrl == null || selectedItem.Data.FileUrl == \"\"){\r\n selectedItem.Data.FileUrl = [];\r\n }\r\n else{\r\n selectedItem.Data.FileUrl = JSON.parse(selectedItem.Data.FileUrl);\r\n }\r\n\r\n // if(selectedItem.Data.Reference == null || selectedItem.Data.Reference == \"\"){\r\n // selectedItem.Data.Reference = \"\";\r\n // }\r\n // else{\r\n // selectedItem.Data.Reference = JSON.parse(selectedItem.Data.Reference);\r\n // selectedItem.Data.Reference = (selectedItem.Data.Reference).join(\";\") \r\n // }\r\n \r\n this.dataPostItem = selectedItem.Data;\r\n this.dataPostItem.CreateAt = this.dataPostItem.CreateAt ? new Date(this.dataPostItem.CreateAt) : null;\r\n this.bindTemp(this.dataPostItem);\r\n this.imgImageDefault = [];\r\n //call api get base 64 to render image\r\n if (this.dataPostItem.ImageUrls) {\r\n //var listurlArr = JSON.parse();\r\n const dataRequest = {\r\n imagePath: `${this.dataPostItem.ImageUrls}`\r\n };\r\n if (this.dataPostItem.ImageUrls.indexOf(\"Multimedia\") > 0) {\r\n this.imgImageDefault[0] = this.dataPostItem.ImageUrls;\r\n }\r\n else {\r\n const result = await this.appService.doGET('api/Post/GetBase64ImageResult', dataRequest);\r\n if (result && result.Status === 1) {\r\n if (result.Data != null && result.Data.Base64 != null && result.Data.Base64 != \"\") {\r\n const url = result.Data.Base64;\r\n this.imgImageDefault[0] = url;\r\n }\r\n }\r\n }\r\n } else {\r\n this.imageDef = '../../assets/images/default-02.png';\r\n this.imgImageDefault = [\r\n this.imageDef,\r\n ];\r\n }\r\n \r\n const temp = [];\r\n if (selectedItem.Data.MenuID) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.menus.length; i++) {\r\n if (selectedItem.Data.MenuID.indexOf(this.menus[i].ID) >= 0) {\r\n temp.push(this.menus[i]);\r\n }\r\n }\r\n }\r\n this.dataMenuID = temp;\r\n }\r\n }\r\n \r\n await this.getLanguage();\r\n this.enabled = true;\r\n this.enabledID = false;\r\n this.infoOpened = true;\r\n }\r\n\r\n async getPostsByIdReview(id) {\r\n\r\n const dataRequest = {\r\n id : id\r\n };\r\n\r\n const selectedItem = await this.appService.doGET('api/Post/GetById', dataRequest);\r\n \r\n if (selectedItem && selectedItem.Status ===1){\r\n if (selectedItem.Data) {\r\n \r\n selectedItem.Data.IsAdd = false;\r\n if(selectedItem.Data.FileUrl == null || selectedItem.Data.FileUrl == \"\"){\r\n selectedItem.Data.FileUrl = [];\r\n }\r\n else{\r\n selectedItem.Data.FileUrl = JSON.parse(selectedItem.Data.FileUrl);\r\n }\r\n\r\n // if(selectedItem.Data.Reference == null || selectedItem.Data.Reference == \"\"){\r\n // selectedItem.Data.Reference = \"\";\r\n // }\r\n // else{\r\n // selectedItem.Data.Reference = JSON.parse(selectedItem.Data.Reference);\r\n // selectedItem.Data.Reference = (selectedItem.Data.Reference).join(\";\");\r\n // }\r\n\r\n this.dataPostItem = selectedItem.Data;\r\n this.bindTemp(this.dataPostItem);\r\n \r\n this.imgImageDefault = [];\r\n //call api get base 64 to render image\r\n if (this.dataPostItem.ImageUrls) {\r\n //var listurlArr = JSON.parse();\r\n const dataRequest = {\r\n imagePath: `${this.dataPostItem.ImageUrls}`\r\n };\r\n if (this.dataPostItem.ImageUrls.indexOf(\"Multimedia\") > 0) {\r\n this.imgImageDefault[0] = this.dataPostItem.ImageUrls;\r\n }\r\n else {\r\n const result = await this.appService.doGET('api/Post/GetBase64ImageResult', dataRequest);\r\n if (result && result.Status === 1) {\r\n if (result.Data != null && result.Data.Base64 != null && result.Data.Base64 != \"\") {\r\n const url = result.Data.Base64;\r\n this.imgImageDefault[0] = url;\r\n }\r\n }\r\n }\r\n } else {\r\n this.imageDef = '../../assets/images/default-02.png';\r\n this.imgImageDefault = [\r\n this.imageDef,\r\n ];\r\n }\r\n \r\n const temp = [];\r\n if (selectedItem.Data.MenuID) {\r\n // tslint:disable-next-line:prefer-for-of\r\n for (let i = 0; i < this.menus.length; i++) {\r\n if (selectedItem.Data.MenuID.indexOf(this.menus[i].ID) >= 0) {\r\n temp.push(this.menus[i]);\r\n }\r\n }\r\n }\r\n this.dataMenuID = temp;\r\n }\r\n }\r\n \r\n await this.getPostTemp();\r\n this.reViewOpened = true;\r\n this.infoOpened = false;\r\n this.isReviewDialog = true;\r\n }\r\n\r\n getUrlDownload(item) {\r\n let url = this.urlDownload.replace(/\\\"/g, \"\") + item;\r\n url = url.replace(/\\\"/g, '')\r\n return url;\r\n }\r\n\r\n onRemoveFile(file){\r\n var isExistedInFile = this.dataPostItemTemp.FileUrl.findIndex(x => x == file);\r\n if (isExistedInFile != -1) {\r\n this.dataPostItemTemp.FileUrl.splice(isExistedInFile, 1);\r\n }\r\n }\r\n\r\n onSuccessFileDocToUpload(e: any) {\r\n if (!this.allowInsertFile) {\r\n return;\r\n }\r\n try {\r\n if(this.dataPostItemTemp.FileUrl == undefined){\r\n this.dataPostItemTemp.FileUrl = [];\r\n }\r\n this.dataPostItemTemp.FileUrl.push(`${e.response.body.Data.DirMedia}${e.response.body.Data.MediaNm[0]}`);\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n }\r\n\r\n async onSelectFileDocToUpload(e: SelectEvent) {\r\n if (!e.files || e.files.length <= 0) {\r\n return;\r\n }\r\n const extension = e.files[0].extension.toLowerCase();\r\n this.allowInsertFile = true;\r\n try {\r\n const fileData = e.files[0]; // await this.file.readFile(e.files[0].rawFile);\r\n const maxMB = 25;\r\n const maxSizeKB = 1024 * 1024 * maxMB;\r\n if (fileData.size > maxSizeKB) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning(`Kích thước tập tin không được lớn hơn ${maxMB} MB`, false);\r\n return false;\r\n }\r\n } catch {\r\n this.appSwal.showError(e);\r\n }\r\n // tslint:disable-next-line: max-line-length\r\n if (!extension || (extension.toLowerCase() !== '.doc' && extension.toLowerCase() !== '.docx' && extension.toLowerCase() !== '.pdf'\r\n && extension.toLowerCase() !== '.xlsx' && extension.toLowerCase() !== '.xls' && extension.toLowerCase() !== '.zip')) {\r\n this.allowInsertFile = false;\r\n this.appSwal.showWarning('Vui lòng chọn tập tin có định dạng .doc, .docx, .pdf, .xlsx, .xls, .zip', false);\r\n return false;\r\n }\r\n }\r\n\r\n onRemoveFileDocToUpload() {\r\n this.dataPostItemTemp.FileUrl = [];\r\n this.filesUploadName = ''; \r\n this.filesUpload = [];\r\n }\r\n\r\n getFileName(fileUrls) {\r\n var nameFile = \"\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n \r\n titleChange(e : any){\r\n if (e){\r\n this.dataPostItemTemp.UrlPath = this.cleanAccents(e);\r\n } \r\n } \r\n cleanAccents (str: string){\r\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g,\"a\"); \r\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g,\"e\"); \r\n str = str.replace(/ì|í|ị|ỉ|ĩ/g,\"i\"); \r\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g,\"o\"); \r\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g,\"u\"); \r\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g,\"y\"); \r\n str = str.replace(/đ/g,\"d\");\r\n str = str.replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, \"A\");\r\n str = str.replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, \"E\");\r\n str = str.replace(/Ì|Í|Ị|Ỉ|Ĩ/g, \"I\");\r\n str = str.replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, \"O\");\r\n str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, \"U\");\r\n str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, \"Y\");\r\n str = str.replace(/Đ/g, \"D\");\r\n // Some system encode vietnamese combining accent as individual utf-8 characters\r\n // Một vài bộ encode coi các dấu mũ, dấu chữ như một kí tự riêng biệt nên thêm hai dòng này\r\n str = str.replace(/\\u0300|\\u0301|\\u0303|\\u0309|\\u0323/g, \"\"); // ̀ ́ ̃ ̉ ̣ huyền, sắc, ngã, hỏi, nặng\r\n str = str.replace(/\\u02C6|\\u0306|\\u031B/g, \"\"); // ˆ ̆ ̛ Â, Ê, Ă, Ơ, Ư \r\n str = str.trim();\r\n str = str.replace(/[!&\\/\\\\#,+()$~%.'\":*?<>{} ]/g,'-'); \r\n return str;\r\n }\r\n}\r\n\r\nexport class UploadAdapter {\r\n private loader;\r\n constructor(loader: any) {\r\n this.loader = loader;\r\n }\r\n\r\n upload() {\r\n return this.loader.file\r\n .then(file => new Promise((resolve, reject) => {\r\n var myReader = new FileReader();\r\n myReader.onloadend = (e) => {\r\n resolve({ default: myReader.result });\r\n }\r\n\r\n myReader.readAsDataURL(file);\r\n }));\r\n };\r\n \r\n}","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppConsts {\r\n public sessionProjectID = 'ProjectID';\r\n public sessionServiceID = 'ServiceID';\r\n public pageRecord = 50;\r\n}","import { Injectable } from '@angular/core';\r\nimport { Location } from '@angular/common';\r\nimport { AppService } from './app.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppControls {\r\n\r\n constructor(\r\n public location: Location,\r\n private appService: AppService\r\n ) { }\r\n\r\n getPage() {\r\n let pageUrl = this.location.path();\r\n if (!pageUrl) {\r\n return null;\r\n }\r\n\r\n const idx = pageUrl.indexOf('?');\r\n if (idx >= 0) {\r\n pageUrl = pageUrl.substring(0, idx);\r\n }\r\n \r\n pageUrl = pageUrl.substring(1);\r\n\r\n return pageUrl;\r\n }\r\n\r\n async getControls(roleID) {\r\n // let pageUrl = this.location.path();\r\n // if (!pageUrl) {\r\n // return null;\r\n // }\r\n\r\n // const idx = pageUrl.indexOf('?');\r\n // if (idx >= 0) {\r\n // pageUrl = pageUrl.substring(0, idx);\r\n // }\r\n\r\n let controlDefault = ['AddNew', 'Edit', 'Delete', 'SaveAll', 'ExportExcel', 'Save', 'ImportExcel', 'SelectMulti'];\r\n let pageUrl = this.getPage();// pageUrl.substring(1);\r\n if (!pageUrl) {\r\n return null;\r\n }\r\n\r\n switch (pageUrl) {\r\n case 'ad/user-role': {\r\n controlDefault = ['Save'];\r\n break;\r\n }\r\n case 'data/ask-and-reply': {\r\n controlDefault.push('Reply');\r\n controlDefault.push('SendUnit');\r\n break;\r\n }\r\n case 'data/ask-and-reply-feedback': {\r\n controlDefault = ['Reply', 'Save'];\r\n break;\r\n }\r\n case 'data/weekly-report': {\r\n controlDefault.push('Approve');\r\n controlDefault.push('UnApprove');\r\n controlDefault.push('Reply');\r\n controlDefault.push('RangeTime');\r\n controlDefault.push('ViewRPUnapproved');\r\n controlDefault.push('SeeAllRp');\r\n controlDefault.push('SeeAllByUnit');\r\n controlDefault.push('PCTIdea');\r\n controlDefault.push('TTIdea');\r\n break;\r\n }\r\n case 'data/ask-and-reply': {\r\n controlDefault = ['Reply', 'Save', 'Approve', 'UnApprove', 'Send'];\r\n break;\r\n }\r\n case 'data/post': {\r\n controlDefault = ['SelectMulti', 'AddNew', 'Delete', 'Edit', 'ExportExcel', 'Save', 'History', 'WatchFirst'];\r\n break;\r\n }\r\n case 'data/menu': {\r\n controlDefault = ['SelectMulti', 'AddNew', 'Delete', 'Edit', 'Save'];\r\n break;\r\n }\r\n case 'm/type': {\r\n controlDefault = ['SelectMulti', 'AddNew', 'Delete', 'Edit', 'Save'];\r\n break;\r\n }\r\n case 'data/mail-config': {\r\n controlDefault = ['SelectMulti', 'AddNew', 'Delete', 'Edit', 'Save', 'WatchFirst'];\r\n break;\r\n }\r\n case 'data/meeting': {\r\n controlDefault = ['AddNew', 'Save', 'Edit', 'Delete', 'SelectMulti', 'Approve', 'UnApprove', 'Public', 'UnPublic'];\r\n break;\r\n }\r\n case 'data/meeting-info': {\r\n controlDefault = ['Save'];\r\n break;\r\n }\r\n case 'data/schedule': {\r\n controlDefault = ['AddNew', 'Save'];\r\n break;\r\n }\r\n case 'm/unit': {\r\n controlDefault.push('ReOpenRp');\r\n break;\r\n }\r\n case 'data/document-meeting': {\r\n controlDefault = ['AddNew', 'Edit', 'Delete', 'SaveAll', 'ExportExcel', 'Save', 'ImportExcel', 'SelectMulti'];\r\n break;\r\n }\r\n default: {\r\n break;\r\n }\r\n }\r\n\r\n const dataRequest = {\r\n PageUrl: pageUrl,\r\n RoleID: roleID,\r\n Controls: controlDefault\r\n };\r\n const result = await this.appService.doPOST('api/Control/Check', dataRequest);\r\n const control = {};\r\n if (result && result.Data && result.Data.length > 0) {\r\n result.Data.forEach(item => {\r\n control[item.ID] = item.ActiveFlg;\r\n });\r\n }\r\n\r\n return control;\r\n }\r\n\r\n async getPageName() {\r\n let pageUrl = this.location.path();\r\n if (!pageUrl) {\r\n return null;\r\n }\r\n\r\n const idx = pageUrl.indexOf('?');\r\n if (idx >= 0) {\r\n pageUrl = pageUrl.substring(0, idx);\r\n }\r\n\r\n pageUrl = pageUrl.substring(1);\r\n\r\n const dataRequest = {\r\n id: pageUrl\r\n };\r\n const result = await this.appService.doGET('api/Page/GetName', dataRequest);\r\n if (result && result.Status === 1) {\r\n return result.Data;\r\n }\r\n\r\n return '';\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport * as XLSX from 'xlsx';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppFile {\r\n constructor() {\r\n\r\n }\r\n\r\n async readXLSX(rawFile: any) {\r\n const reader: FileReader = new FileReader();\r\n return new Promise((resolve, reject) => {\r\n reader.onerror = () => {\r\n reader.abort();\r\n reject(new DOMException('Problem parsing input file.'));\r\n };\r\n\r\n reader.onload = (e: any) => {\r\n const bstr: string = e.target.result;\r\n const wb: XLSX.WorkBook = XLSX.read(bstr, { type: 'binary' });\r\n const wsname: string = wb.SheetNames[0];\r\n const ws: XLSX.WorkSheet = wb.Sheets[wsname];\r\n const data = XLSX.utils.sheet_to_json(ws, { header: 1 });\r\n resolve(data);\r\n };\r\n reader.readAsBinaryString(rawFile);\r\n });\r\n }\r\n\r\n async readImage(rawFile: any) {\r\n\r\n const reader: FileReader = new FileReader();\r\n return new Promise((resolve, reject) => {\r\n reader.onerror = () => {\r\n reader.abort();\r\n reject(new DOMException('Problem parsing input file.'));\r\n };\r\n\r\n reader.onload = (e: any) => {\r\n const bstr: string = e.target.result;\r\n resolve(bstr);\r\n };\r\n reader.readAsDataURL(rawFile);\r\n });\r\n }\r\n \r\n async read(rawFile: any) {\r\n \r\n const reader: FileReader = new FileReader();\r\n return new Promise((resolve, reject) => {\r\n reader.onerror = () => {\r\n reader.abort();\r\n reject(new DOMException('Problem parsing input file.'));\r\n };\r\n\r\n reader.onload = (e: any) => {\r\n const bstr: string = e.target.result;\r\n resolve(bstr);\r\n };\r\n reader.readAsText(rawFile);\r\n });\r\n }\r\n\r\n async readFile(rawFile: any) {\r\n \r\n const reader: FileReader = new FileReader();\r\n return new Promise((resolve, reject) => {\r\n reader.onerror = () => {\r\n reader.abort();\r\n reject(new DOMException('Problem parsing input file.'));\r\n };\r\n\r\n reader.onload = (e: any) => {\r\n const bstr: string = e.target.result;\r\n resolve(bstr);\r\n };\r\n reader.readAsBinaryString(rawFile);\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppGuid {\r\n empty = '00000000-0000-0000-0000-000000000000';\r\n\r\n create() {\r\n let result: string;\r\n let i: string;\r\n let j: number;\r\n\r\n result = '';\r\n for (j = 0; j < 32; j++) {\r\n if (j === 8 || j === 12 || j === 16 || j === 20) {\r\n result = result + '-';\r\n }\r\n i = Math.floor(Math.random() * 16).toString(16).toUpperCase();\r\n result = result + i;\r\n }\r\n return result;\r\n }\r\n}","import { TranslateService } from '@ngx-translate/core';\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppLanguage {\r\n constructor(\r\n public translate: TranslateService\r\n ) { }\r\n\r\n set(lang: any) {\r\n this.translate.use(lang);\r\n localStorage.setItem('culture', lang);\r\n }\r\n\r\n default() {\r\n let lang = localStorage.getItem('culture');\r\n if (!lang) { lang = 'vi-VN'; }\r\n this.translate.setDefaultLang(lang);\r\n }\r\n\r\n get() {\r\n return localStorage.getItem('culture');\r\n }\r\n}\r\n","import { NotificationService } from '@progress/kendo-angular-notification';\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class Notification {\r\n\r\n private hideAfter = 2000;\r\n\r\n constructor(\r\n private notificationService: NotificationService\r\n ) {}\r\n\r\n showSuccess(msg: any) {\r\n this.notificationService.show({\r\n content: msg,\r\n position: { horizontal: 'right', vertical: 'bottom' },\r\n animation: { type: 'fade', duration: 800 },\r\n type: { style: 'success', icon: true },\r\n hideAfter: this.hideAfter,\r\n });\r\n }\r\n}\r\n","import { Http, Response, Headers, RequestOptions, URLSearchParams, ResponseContentType } from '@angular/http';\r\nimport { Injectable, OnInit } from '@angular/core';\r\nimport { resolve, reject } from 'q';\r\nimport 'rxjs/add/operator/map';\r\nimport { HttpHeaders } from '@angular/common/http';\r\nimport { AppLanguage } from './app.language';\r\nimport { AppSwal } from './app.swal';\r\nimport { Location } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppService implements OnInit {\r\n // apiRoot = 'http://localhost:8080/';\r\n apiRoot = 'http://10.70.55.142:8109/';\r\n // apiRoot = 'http://123.30.158.155:8003/';\r\n // apiRoot = 'http://210.2.93.8:8002/';\r\n \r\n headers: any;\r\n timeInterval = 1000 * 30;\r\n user: any;\r\n domainAPI = '';\r\n ngOnInit(): void {\r\n }\r\n constructor(\r\n private http: Http,\r\n private language: AppLanguage,\r\n private appSwal: AppSwal,\r\n private location: Location,\r\n private router: Router\r\n ) {\r\n // tslint:disable-next-line:no-string-literal\r\n const clientApi = `${this.location['_platformStrategy']._platformLocation.location.origin}/`;\r\n if (clientApi.indexOf('localhost') >= 0) {\r\n this.apiRoot = 'http://localhost:8080/';\r\n \r\n } else if (clientApi.indexOf('https://ldldhcm.hcmtelecom.vn') >= 0){\r\n this.apiRoot = 'https://api-ldldhcm.hcmtelecom.vn/';\r\n }\r\n else if (clientApi.indexOf('10.70.51.34:8102') >= 0){\r\n this.apiRoot = 'http://10.70.51.34:8101/';\r\n }\r\n else if (clientApi.indexOf('210.2.93.8:8002') >= 0){\r\n this.apiRoot = 'http://210.2.93.8:8001/';\r\n }\r\n else {\r\n this.apiRoot = 'https://api.congdoantphochiminh.org.vn/';\r\n }\r\n\r\n this.domainAPI = this.apiRoot;\r\n var startIdx = this.domainAPI.indexOf(\"//\");\r\n this.domainAPI = \"ws:\" + this.domainAPI.substring(startIdx);\r\n }\r\n\r\n getUser(): any {\r\n const result = localStorage.getItem('userInformation5S');\r\n if (result) {\r\n this.user = JSON.parse(result);\r\n }\r\n return this.user;\r\n }\r\n\r\n getUserName() {\r\n if (!this.user || !this.user.UserName || localStorage.getItem('userInformation5S') != this.user ) {\r\n this.getUser();\r\n }\r\n return this.user && this.user.UserName ? this.user.UserName : '';\r\n }\r\n\r\n createHeaders() {\r\n const token = localStorage.getItem('token');\r\n // tslint:disable-next-line: deprecation\r\n this.headers = new Headers();\r\n this.headers.set('Content-Type', 'application/json');\r\n this.headers.set('Authorization', `Bearer ${token}`);\r\n this.headers.set('Accept-Language', this.language.get());\r\n this.headers.set('UserName', this.getUserName());\r\n }\r\n\r\n async doGET(methodUrl: any, params: any) {\r\n this.createHeaders();\r\n const apiURL = `${this.apiRoot}${methodUrl}`;\r\n try {\r\n const data = await this.http.get(apiURL, { headers: this.headers, params })\r\n .toPromise()\r\n .then(res => res.json(), err => {\r\n if (err.statusText === 'Unauthorized') {\r\n this.appSwal.showWarning(this.language.translate.instant('MsgUnauthorized'), false);\r\n this.router.navigate(['login']);\r\n }\r\n return null;\r\n });\r\n return data;\r\n } catch (e) {\r\n console.log(e);\r\n return null;\r\n }\r\n }\r\n\r\n async doPOST(methodUrl: any, dataRequest: any) {\r\n this.createHeaders();\r\n const apiURL = `${this.apiRoot}${methodUrl}`;\r\n try {\r\n const data = await this.http.post(apiURL, dataRequest, { headers: this.headers })\r\n .toPromise()\r\n .then(res => res.json(), err => console.log(err));\r\n return data;\r\n } catch (e) {\r\n console.log(e);\r\n return null;\r\n }\r\n }\r\n\r\n async doPOSTOPTION(methodUrl: any, dataRequest: any, options: any) {\r\n const apiURL = `${this.apiRoot}${methodUrl}`;\r\n try {\r\n const data = await this.http.post(apiURL, dataRequest, options)\r\n .toPromise()\r\n .then(res => res.json(), err => err.json());\r\n return data;\r\n } catch (e) {\r\n console.log(e);\r\n return null;\r\n }\r\n }\r\n\r\n async doPUT(methodUrl: any, dataRequest: any, params: any) {\r\n this.createHeaders();\r\n const apiURL = `${this.apiRoot}${methodUrl}`;\r\n try {\r\n const data = await this.http.put(apiURL, dataRequest, { headers: this.headers, params })\r\n .toPromise()\r\n .then(res => res.json(), err => console.log(err));\r\n return data;\r\n } catch (e) {\r\n console.log(e);\r\n return null;\r\n }\r\n }\r\n\r\n async doDELETE(methodUrl: any, params: any) {\r\n this.createHeaders();\r\n const apiURL = `${this.apiRoot}${methodUrl}`;\r\n try {\r\n const data = await this.http.delete(apiURL, { headers: this.headers, params })\r\n .toPromise()\r\n .then(res => res.json(), err => console.log(err));\r\n return data;\r\n } catch (e) {\r\n console.log(e);\r\n return null;\r\n }\r\n }\r\n\r\n //Edit mark\r\n createHeadersPostMark() {\r\n const token = localStorage.getItem('token');\r\n // tslint:disable-next-line: deprecation\r\n this.headers = new Headers();\r\n this.headers.set('Accept', 'application/json');\r\n this.headers.set('Content-Type', 'application/x-www-form-urlencoded');\r\n this.headers.set('Authorization', `Bearer ${token}`);\r\n this.headers.set('Accept-Language', this.language.get());\r\n }\r\n\r\n async doPOSTMARK(methodUrl: any, dataRequest: any) {\r\n this.createHeadersPostMark();\r\n const apiURL = `${this.apiRoot}${methodUrl}`;\r\n // console.log(apiURL);\r\n // console.log(this.encodeParams(dataRequest));\r\n try {\r\n const data = await this.http.post(apiURL, this.encodeParams(dataRequest), { headers: this.headers })\r\n .toPromise()\r\n .then(res => res.json(), err => console.log(err));\r\n return data;\r\n } catch (e) {\r\n console.log(e);\r\n return null;\r\n }\r\n }\r\n\r\n async doDownload(methodUrl: any, params: any) {\r\n this.createHeaders();\r\n const apiURL = `${this.apiRoot}${methodUrl}`;\r\n try {\r\n const data = await this.http.get(apiURL, { headers: this.headers, params, responseType: ResponseContentType.Blob })\r\n .toPromise()\r\n .then(res => res.json(), err => {\r\n if (err.statusText === 'Unauthorized') {\r\n this.router.navigate(['login']);\r\n }\r\n return null;\r\n });\r\n return data;\r\n } catch (e) {\r\n console.log(e);\r\n return null;\r\n }\r\n }\r\n\r\n encodeParams(params: any): string {\r\n let body = '';\r\n // tslint:disable-next-line:prefer-const\r\n // tslint:disable-next-line:forin\r\n for (const param in params) {\r\n if (body.length) {\r\n body += '&';\r\n }\r\n body = `${body}${param}=`;\r\n body = `${body}${encodeURIComponent(params[param])}`;\r\n }\r\n\r\n return body;\r\n }\r\n}\r\n","import Swal from 'sweetalert2';\r\nimport { Injectable } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AppSwal {\r\n constructor(\r\n private translate: TranslateService\r\n ) {\r\n }\r\n\r\n async showSuccess(msg: any, isShowCancelButton: any) {\r\n\r\n const selectOption = await Swal.fire({\r\n title: msg,\r\n html: '',\r\n //text: \"You won't be able to revert this!\",\r\n customClass: {\r\n popup: 'swal-warning'\r\n },\r\n type: 'success',\r\n showCancelButton: isShowCancelButton,\r\n confirmButtonColor: '#007bff',\r\n cancelButtonColor: '#dc3545',\r\n cancelButtonText: this.translate.instant('Cancel'),\r\n confirmButtonText: this.translate.instant('Ok'),\r\n }).then((result) => {\r\n if (result.value) {\r\n return true;\r\n } else { return false; }\r\n });\r\n\r\n return selectOption;\r\n }\r\n\r\n async showWarning(msg: any, isShowCancelButton: any) {\r\n\r\n const selectOption = await Swal.fire({\r\n title: msg,\r\n html: '',\r\n //text: \"You won't be able to revert this!\",\r\n customClass: {\r\n container: 'swal-container',\r\n popup: 'swal-warning'\r\n },\r\n type: 'warning',\r\n showCancelButton: isShowCancelButton,\r\n confirmButtonColor: '#007bff',\r\n cancelButtonColor: '#dc3545',\r\n cancelButtonText: this.translate.instant('Cancel'),\r\n confirmButtonText: this.translate.instant('Ok'),\r\n }).then((result) => {\r\n if (result.value) {\r\n return true;\r\n } else { return false; }\r\n });\r\n\r\n return selectOption;\r\n }\r\n\r\n async showError(msg: any) {\r\n\r\n const selectOption = await Swal.fire({\r\n title: msg,\r\n html: '',\r\n type: 'error',\r\n showCancelButton: false,\r\n confirmButtonColor: '#007bff',\r\n cancelButtonColor: '#dc3545',\r\n cancelButtonText: this.translate.instant('Cancel'),\r\n confirmButtonText: this.translate.instant('Ok'),\r\n }).then((result) => {\r\n if (result.value) {\r\n return true;\r\n } else { return false; }\r\n });\r\n\r\n return selectOption;\r\n }\r\n\r\n async showOptionAdvance(msg: any, isShowCancelButton: any, html: any) {\r\n\r\n const selectOption = await Swal.fire({\r\n title: msg,\r\n html: html,\r\n customClass: 'swal-wide',\r\n showCancelButton: isShowCancelButton,\r\n confirmButtonColor: '#007bff',\r\n cancelButtonColor: '#dc3545',\r\n cancelButtonText: this.translate.instant('Cancel'),\r\n confirmButtonText: this.translate.instant('Ok'),\r\n }).then((result) => {\r\n if (result.value) {\r\n return true;\r\n } else { return false; }\r\n });\r\n\r\n return selectOption;\r\n }\r\n}\r\n","import { Injectable, OnInit } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\nimport { IntlService } from '@progress/kendo-angular-intl';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppUtils implements OnInit {\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n constructor(\r\n private translate: TranslateService,\r\n public intl: IntlService\r\n ) {\r\n }\r\n\r\n public getDateByPeriod(period: any) {\r\n const result = {\r\n FromDate: new Date(),\r\n ToDate: new Date()\r\n };\r\n\r\n if (period === 6) {\r\n const currentMonth = result.FromDate.getMonth() - 1;\r\n if (currentMonth < 3) {\r\n period = 7;\r\n } else if (currentMonth < 6) {\r\n period = 8;\r\n } else if (currentMonth < 9) {\r\n period = 9;\r\n } else {\r\n period = 10;\r\n }\r\n }\r\n\r\n let day = result.FromDate.getDay();\r\n if (day === 0) {\r\n day = 7;\r\n }\r\n\r\n switch (period) {\r\n // last day\r\n case 0: {\r\n break;\r\n }\r\n // last day\r\n case 1: {\r\n result.FromDate.setDate(result.FromDate.getDate() - 1);\r\n result.ToDate = result.FromDate;\r\n break;\r\n }\r\n // this week\r\n // tslint:disable-next-line:no-switch-case-fall-through\r\n case 2: {\r\n const from = new Date(result.FromDate.setDate(result.FromDate.getDate() - day + 1));\r\n const temp = new Date(from);\r\n const to = new Date(temp.setDate(temp.getDate() + 6));\r\n result.FromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0);\r\n result.ToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59);\r\n break;\r\n }\r\n // last week\r\n // tslint:disable-next-line:no-switch-case-fall-through\r\n case 3: {\r\n result.FromDate = new Date(result.FromDate.setDate(result.FromDate.getDate() - 7));\r\n const from = new Date(result.FromDate.setDate(result.FromDate.getDate() - day + 1));\r\n const temp = new Date(from);\r\n const to = new Date(temp.setDate(temp.getDate() + 6));\r\n result.FromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0);\r\n result.ToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59);\r\n break;\r\n }\r\n // This month\r\n // tslint:disable-next-line:no-switch-case-fall-through\r\n case 4: {\r\n const from = new Date(result.FromDate.getFullYear(), result.FromDate.getMonth(), 1);\r\n const to = new Date(result.FromDate.getFullYear(), result.FromDate.getMonth() + 1, 0);\r\n result.FromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0);\r\n result.ToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59);\r\n break;\r\n }\r\n // Last month\r\n // tslint:disable-next-line:no-switch-case-fall-through\r\n case 5: {\r\n const from = new Date(result.FromDate.getFullYear(), result.FromDate.getMonth() - 1, 1);\r\n const to = new Date(result.FromDate.getFullYear(), result.FromDate.getMonth(), 0);\r\n result.FromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0);\r\n result.ToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59);\r\n break;\r\n }\r\n // 1 Quarter\r\n // tslint:disable-next-line:no-switch-case-fall-through\r\n case 7: {\r\n const from = new Date(result.FromDate.getFullYear(), 0, 1);\r\n const to = new Date(result.FromDate.getFullYear(), 3, 0);\r\n result.FromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0);\r\n result.ToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59);\r\n break;\r\n }\r\n // 2 Quarter\r\n // tslint:disable-next-line:no-switch-case-fall-through\r\n case 8: {\r\n const from = new Date(result.FromDate.getFullYear(), 3, 1);\r\n const to = new Date(result.FromDate.getFullYear(), 6, 0);\r\n result.FromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0);\r\n result.ToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59);\r\n break;\r\n }\r\n // 2 Quarter\r\n // tslint:disable-next-line:no-switch-case-fall-through\r\n case 9: {\r\n const from = new Date(result.FromDate.getFullYear(), 6, 1);\r\n const to = new Date(result.FromDate.getFullYear(), 9, 0);\r\n result.FromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0);\r\n result.ToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59);\r\n break;\r\n }\r\n // 2 Quarter\r\n // tslint:disable-next-line:no-switch-case-fall-through\r\n case 10: {\r\n const from = new Date(result.FromDate.getFullYear(), 9, 1);\r\n const to = new Date(result.FromDate.getFullYear(), 12, 0);\r\n result.FromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0);\r\n result.ToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59);\r\n break;\r\n }\r\n // This year\r\n // tslint:disable-next-line:no-switch-case-fall-through\r\n case 11: {\r\n const from = new Date(result.FromDate.getFullYear(), 0, 1);\r\n const to = new Date(result.FromDate.getFullYear(), 12, 0);\r\n result.FromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0);\r\n result.ToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59);\r\n break;\r\n }\r\n // Last year\r\n // tslint:disable-next-line:no-switch-case-fall-through\r\n case 12: {\r\n const from = new Date(result.FromDate.getFullYear() - 1, 0, 1);\r\n const to = new Date(result.FromDate.getFullYear() - 1, 12, 0);\r\n result.FromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate(), 0, 0, 0);\r\n result.ToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate(), 23, 59, 59);\r\n break;\r\n }\r\n default: {\r\n return null;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public getDate(dataStr: any) {\r\n const result = {\r\n Value: new Date(),\r\n Display: ''\r\n };\r\n\r\n try {\r\n result.Value = this.intl.parseDate(dataStr, this.translate.instant('FormatDate'));\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n\r\n result.Display = this.intl.formatDate(result.Value, this.translate.instant('FormatDate'));\r\n if (!result.Display || result.Display.indexOf('NaN') >= 0) {\r\n result.Display = '';\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public getDate2(dataStr: any) {\r\n const result = {\r\n Value: new Date(),\r\n Display: ''\r\n };\r\n\r\n try {\r\n result.Value = this.intl.parseDate(dataStr, this.translate.instant('FormatDate2'));\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n\r\n result.Display = this.intl.formatDate(result.Value, this.translate.instant('FormatDate2'));\r\n if (!result.Display || result.Display.indexOf('NaN') >= 0) {\r\n result.Display = '';\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public compareString(str1: string, str2: string, str3 = null) {\r\n if (!str1 || !str2) {\r\n return false;\r\n }\r\n\r\n let result = str1.trim().toLowerCase() === str2.trim().toLowerCase();\r\n if (str3 && !result) {\r\n try {\r\n result = str1.trim().toLowerCase() === str3.trim().toLowerCase();\r\n } catch (e) { }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public getNameByList(list: any, id: any) {\r\n\r\n let i: any;\r\n for (i = 0; i < list.length; i++) {\r\n if (list[i].ID === id) {\r\n return list[i].Name;\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n public getObjectByList(list: any, value: any) {\r\n\r\n return list.find(k => k.ID === value || k.Name === value);\r\n }\r\n\r\n public getNameByUrl(fileUrl) {\r\n const nameFile = fileUrl.replace(/^.*[\\\\\\/]/, '');\r\n\r\n return nameFile;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\nimport { AuthService } from './auth.service';\r\nimport { Location } from '@angular/common';\r\nimport { AppService } from './app.service';\r\nimport { AuthenticationService } from './authentication.service';\r\nimport { AppSwal } from './app.swal';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n/**\r\n * Decides if a route can be activated.\r\n */\r\n@Injectable() export class AuthGuard implements CanActivate {\r\n\r\n constructor(\r\n public authService: AuthService,\r\n public router: Router,\r\n public appService: AppService,\r\n public authenticationService: AuthenticationService,\r\n public appSwal: AppSwal,\r\n public location: Location\r\n ) { }\r\n\r\n public async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\r\n\r\n if (this.authService.isAuthenticated()) {\r\n const result = await this.checkRole(route.routeConfig.path);\r\n return result;\r\n }\r\n localStorage.setItem('PageUrlRollback', route.routeConfig.path);\r\n this.router.navigate(['login']);\r\n return false;\r\n }\r\n\r\n async checkRole(url: string) {\r\n this.authenticationService.getUser();\r\n const user = this.authenticationService.user;\r\n const roleID = user.RoleID;\r\n\r\n const result = await this.appService.doGET('api/Page/Check', { roleID, url });\r\n if (result) {\r\n if (result.Status === 1) {\r\n return true;\r\n } else {\r\n await this.appSwal.showError(result.Msg);\r\n this.router.navigate(['']);\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n}","import { Injectable } from '@angular/core';\r\nimport { HttpRequest } from '@angular/common/http';\r\n@Injectable()\r\nexport class AuthService {\r\n cachedRequests: Array> = [];\r\n public getToken(): string {\r\n return localStorage.getItem('token');\r\n }\r\n public isAuthenticated(): boolean {\r\n // get the token\r\n const token = this.getToken();\r\n // return a boolean reflecting \r\n // whether or not the token is expired\r\n return token !== null;\r\n }\r\n public collectFailedRequest(request): void {\r\n this.cachedRequests.push(request);\r\n }\r\n public retryFailedRequests(): void {\r\n // retry the requests. this method can\r\n // be called after the token is refreshed\r\n }\r\n}","import { AppService } from '../services/app.service';\r\nimport { Injectable, OnInit } from '@angular/core';\r\nimport { Http, Response, Headers, RequestOptions, URLSearchParams } from '@angular/http';\r\nimport { AppLanguage } from './app.language';\r\nimport { Location } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AuthenticationService implements OnInit {\r\n\r\n public redirectUrl: string;\r\n public user: any = {};\r\n private headers: Headers;\r\n private options: RequestOptions;\r\n private tokenEndpoint: string;\r\n private clientId: string;\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n constructor(\r\n private http: Http,\r\n private appService: AppService,\r\n private language: AppLanguage,\r\n private location: Location,\r\n private router: Router\r\n ) {\r\n this.decodeToken();\r\n\r\n this.tokenEndpoint = `${this.appService.apiRoot}/Token`;\r\n this.clientId = null;\r\n }\r\n\r\n getUser(): any {\r\n const result = localStorage.getItem('userInformation5S');\r\n if (result) {\r\n this.user = JSON.parse(result);\r\n }\r\n\r\n return this.user;\r\n }\r\n\r\n public async doSignIn(userName: string, password: string) {\r\n\r\n this.headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' });\r\n this.headers.set('Accept-Language', this.language.get());\r\n this.options = new RequestOptions({ headers: this.headers });\r\n\r\n const params: any = {\r\n client_id: this.clientId,\r\n grant_type: 'password',\r\n username: userName,\r\n password\r\n };\r\n\r\n const body: string = this.encodeParams(params);\r\n\r\n const result = await this.appService.doPOSTOPTION('Token', body, this.options);\r\n if (result.access_token) {\r\n this.store(result);\r\n return {\r\n Status: 1\r\n };\r\n } else {\r\n return {\r\n Status: 0,\r\n Msg: result.error_description\r\n };\r\n }\r\n }\r\n\r\n doSignout(): void {\r\n\r\n this.redirectUrl = null;\r\n\r\n if(localStorage.getItem('userInformation5S') != null) {\r\n const user = localStorage.getItem('userInformation5S');\r\n var userinfo = JSON.parse(user);\r\n const dataRequest = {\r\n LoginID: (userinfo.LoginID)?userinfo.LoginID:\"\"\r\n };\r\n const result = this.appService.doGET('api/User/Logout', dataRequest);\r\n }\r\n \r\n localStorage.removeItem('userInformation5S');\r\n this.user = {};\r\n const result = localStorage.getItem('userInformation5S');\r\n this.revokeToken();\r\n }\r\n\r\n public getNewToken(): void {\r\n\r\n const refreshToken: string = localStorage.getItem('refresh_token');\r\n\r\n if (refreshToken) {\r\n const params: any = {\r\n client_id: this.clientId,\r\n grant_type: 'refresh_token',\r\n refresh_token: refreshToken\r\n };\r\n\r\n const body: string = this.encodeParams(params);\r\n\r\n this.http.post(this.tokenEndpoint, body, this.options)\r\n .subscribe(\r\n (res: Response) => {\r\n\r\n const loginInfo: any = res.json();\r\n\r\n if (typeof loginInfo.access_token !== 'undefined') {\r\n this.store(loginInfo);\r\n }\r\n });\r\n }\r\n }\r\n\r\n public revokeToken(): void {\r\n\r\n const token: string = localStorage.getItem('token');\r\n if (token != null) {\r\n localStorage.removeItem('token');\r\n // const revocationEndpoint: string = this.tokenEndpoint;\r\n\r\n // const params: any = {\r\n // client_id: this.clientId,\r\n // token_type_hint: 'access_token',\r\n // token\r\n // };\r\n\r\n // const body: string = this.encodeParams(params);\r\n\r\n // this.http.post(revocationEndpoint, body, this.options)\r\n // .subscribe(\r\n // () => {\r\n\r\n // });\r\n }\r\n }\r\n\r\n public revokeRefreshToken(): void {\r\n\r\n const refreshToken: string = localStorage.getItem('refresh_token');\r\n\r\n if (refreshToken) {\r\n const params: any = {\r\n client_id: this.clientId,\r\n token_type_hint: 'refresh_token',\r\n token: refreshToken\r\n };\r\n\r\n const body: string = this.encodeParams(params);\r\n\r\n this.http.post(this.tokenEndpoint, body, this.options)\r\n .subscribe(\r\n () => {\r\n localStorage.removeItem('refresh_token');\r\n });\r\n }\r\n }\r\n\r\n encodeParams(params: any): string {\r\n\r\n let body = '';\r\n // tslint:disable-next-line:prefer-const\r\n // tslint:disable-next-line:forin\r\n for (const param in params) {\r\n if (body.length) {\r\n body += '&';\r\n }\r\n body = `${body}${param}=`;\r\n body = `${body}${encodeURIComponent(params[param])}`;\r\n }\r\n\r\n return body;\r\n }\r\n\r\n store(body: any): void {\r\n // Stores access token in local storage to keep user signed in.\r\n localStorage.setItem('token', body.access_token);\r\n // Stores refresh token in local storage.\r\n localStorage.setItem('refresh_token', body.refresh_token);\r\n this.setUser(body);\r\n // Decodes the token.\r\n this.decodeToken();\r\n\r\n }\r\n\r\n setUser(data: any) {\r\n if (!data.FilePath ||\r\n (data.FilePath.indexOf('.png') < 0\r\n && data.FilePath.indexOf('.jpg') < 0\r\n && data.FilePath.indexOf('.jpeg') < 0\r\n && data.FilePath.indexOf('.gif') < 0\r\n && data.FilePath.indexOf('.bmp') < 0\r\n )) {\r\n data.FilePath = 'assets/images/userlogo.png';\r\n }\r\n localStorage.setItem('userInformation5S', JSON.stringify({\r\n UserName: data.UserName,\r\n FullName: data.FullName,\r\n RoleID: data.RoleID,\r\n RoleName: data.RoleName,\r\n EmployeeID: data.EmployeeID,\r\n FilePath: data.FilePath,\r\n UnitID: data.UnitID,\r\n LoginID: data.LoginID,\r\n }));\r\n }\r\n\r\n decodeToken(): void {\r\n\r\n // if (tokenNotExpired()) {\r\n\r\n // const token: string = localStorage.getItem('token');\r\n\r\n // const jwtHelper: JwtHelper = new JwtHelper();\r\n // this.user = jwtHelper.decodeToken(token);\r\n\r\n // }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpRequest,\r\n HttpHandler,\r\n HttpEvent,\r\n HttpInterceptor\r\n} from '@angular/common/http';\r\nimport { AuthService } from './auth.service';\r\nimport { Observable } from 'rxjs/Observable';\r\n@Injectable()\r\nexport class TokenInterceptor implements HttpInterceptor {\r\n constructor(public auth: AuthService) { }\r\n intercept(request: HttpRequest, next: HttpHandler): Observable> {\r\n console.log('intercept');\r\n request = request.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${this.auth.getToken()}`\r\n }\r\n });\r\n return next.handle(request);\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs-compat/Observable';\r\n\r\n@Injectable()\r\nexport class WebSocketService {\r\n public ws: WebSocket;\r\n\r\n public createObservableSocket(url: string): Observable {\r\n this.ws = new WebSocket(url);\r\n\r\n return new Observable(observer => {\r\n this.ws.onmessage = event => observer.next(event.data);\r\n this.ws.onerror = event => observer.error(event);\r\n this.ws.onclose = event => observer.complete();\r\n });\r\n\r\n }\r\n\r\n public sendMessage(message: any, url: string) {\r\n var conn = new WebSocket(url);\r\n conn.onmessage = function(e){ console.log(e.data); };\r\n conn.onopen = () => conn.send(message);\r\n }\r\n}","import { Alignment, AlignmentType, Document, HeadingLevel, Packer, Paragraph, TabStopPosition, TabStopType, TextRun, UnderlineType } from \"docx\";\r\nimport { DatePipe } from '@angular/common';\r\nimport { AlignService } from '@progress/kendo-angular-popup';\r\n\r\nexport class DocumentCreator {\r\n constructor(\r\n private datePipe: DatePipe\r\n ) { }\r\n\r\n public create(title, updatehour, opinions) {\r\n const document = new Document();\r\n document.addSection({\r\n children: [\r\n this.createPrefix(),\r\n this.createTitle(title.Week, title.Year, title.FromDate, title.ToDate, updatehour, title.UpdateAt, title.UnitName),\r\n this.createFirstHeading('I. THỰC HIỆN CÔNG TÁC CHUYÊN MÔN', '1. Nội dung công việc theo chương trình công tác, nhiệm vụ chuyên môn', 1000),\r\n this.createDescription(title.ProfessionalWorkByProgram),\r\n this.createSubHeading('2. Nội dung công việc theo phân công đột xuất của Thường trực, Ban Thường vụ', 0),\r\n this.createDescription(title.ProfessionalWorkUnexpected),\r\n this.createHeading('II. THAM GIA DỰ - HỖ TRỢ HOẠT ĐỘNG CƠ SỞ', 200),\r\n this.createDescription(title.SupportActive),\r\n this.createHeading('III. TRỌNG TÂM TUẦN TỚI', 200),\r\n this.createDescription(title.FocusNextWeek),\r\n this.createHeading('IV. ĐỀ XUẤT/KIẾN NGHỊ (nếu có)', 200),\r\n this.createDescription(title.Offer),\r\n this.createReporter(title.UnitName),\r\n this.createCenterHeading('Ý KIẾN CỦA PHÓ CHỦ TỊCH PHỤ TRÁCH', 200),\r\n this.createDescription(title.Opinion),\r\n this.createReporter(title.OpinionBy),\r\n this.createCenterHeading('Ý KIẾN CỦA THƯỜNG TRỰC', 200),\r\n ...opinions.map((opinion) => {\r\n const arr: Paragraph[] = [];\r\n arr.push(this.createComment(opinion.Opinion));\r\n arr.push(this.createCommentator(opinion.OpinionBy));\r\n return arr\r\n \r\n \r\n \r\n \r\n }).reduce((prev, curr) => prev.concat(curr), []),\r\n this.createFileName('Tài liệu đính kèm', title.FileUrl),\r\n \r\n ]\r\n });\r\n return document;\r\n }\r\n\r\n public createTitle(week: string, year: string, fromDate: string, toDate: string, hour: string, updateDate: Date, unitName: string): Paragraph {\r\n if(hour == null || updateDate == null){\r\n return new Paragraph({\r\n spacing: {\r\n before: 400,\r\n after: 0\r\n },\r\n alignment: AlignmentType.CENTER,\r\n heading: HeadingLevel.HEADING_2,\r\n children: [\r\n new TextRun({\r\n text: `BÁO CÁO TUẦN: `,\r\n bold: true,\r\n color: '#000000'\r\n }),\r\n new TextRun({\r\n text: `${week}/${year} - `,\r\n color: '#000000'\r\n }),\r\n new TextRun({\r\n text: `${unitName}`,\r\n bold: true,\r\n color: '#000000'\r\n }),\r\n \r\n new TextRun({\r\n text: `TỪ NGÀY `,\r\n bold: true,\r\n color: '#000000'\r\n }).break(),\r\n new TextRun({\r\n text: `${this.datePipe.transform(new Date(fromDate), 'dd/MM/yyyy')}`,\r\n color: '#000000'\r\n }),\r\n new TextRun({\r\n text: ` ĐẾN NGÀY `,\r\n bold: true,\r\n color: '#000000'\r\n }),\r\n new TextRun({\r\n text: `${this.datePipe.transform(new Date(toDate), 'dd/MM/yyyy')}`,\r\n color: '#000000'\r\n }),\r\n ],\r\n });\r\n } else {\r\n return new Paragraph({\r\n spacing: {\r\n before: 400,\r\n after: 0\r\n },\r\n alignment: AlignmentType.CENTER,\r\n heading: HeadingLevel.HEADING_2,\r\n children: [\r\n new TextRun({\r\n text: `BÁO CÁO TUẦN: `,\r\n bold: true,\r\n color: '#000000'\r\n }),\r\n new TextRun({\r\n text: `${week}/${year} - `,\r\n color: '#000000'\r\n }),\r\n new TextRun({\r\n text: `${unitName}`,\r\n bold: true,\r\n color: '#000000'\r\n }),\r\n \r\n new TextRun({\r\n text: `TỪ NGÀY `,\r\n bold: true,\r\n color: '#000000'\r\n }).break(),\r\n new TextRun({\r\n text: `${this.datePipe.transform(new Date(fromDate), 'dd/MM/yyyy')}`,\r\n color: '#000000'\r\n }),\r\n new TextRun({\r\n text: ` ĐẾN NGÀY `,\r\n bold: true,\r\n color: '#000000'\r\n }),\r\n new TextRun({\r\n text: `${this.datePipe.transform(new Date(toDate), 'dd/MM/yyyy')}`,\r\n color: '#000000'\r\n }),\r\n \r\n new TextRun({\r\n text: `Thời gian cập nhật `,\r\n bold: true,\r\n color: '#000000'\r\n }).break(),\r\n new TextRun({\r\n text: `${hour}, `,\r\n color: '#000000'\r\n }),\r\n new TextRun({\r\n text: `${this.datePipe.transform(new Date(updateDate), 'dd/MM/yyyy')}`,\r\n color: '#000000'\r\n }),\r\n ],\r\n });\r\n }\r\n \r\n }\r\n\r\n public createFirstHeading(text: string, subText: string, before: number): Paragraph {\r\n return new Paragraph({\r\n spacing: {\r\n before: before,\r\n after: 0\r\n },\r\n children: [\r\n new TextRun({\r\n text: `${text}`,\r\n color: '#000000',\r\n italics: false,\r\n bold: true,\r\n size: 26\r\n }),\r\n new TextRun({\r\n text: `${subText}`,\r\n color: '#000000',\r\n italics: false,\r\n bold: true,\r\n size: 26\r\n }).break(),\r\n ]\r\n });\r\n }\r\n\r\n public createHeading(text: string, before: number): Paragraph {\r\n return new Paragraph({\r\n spacing: {\r\n before: before,\r\n after: 0\r\n },\r\n children: [\r\n new TextRun({\r\n text: `${text}`,\r\n color: '#000000',\r\n italics: false,\r\n bold: true,\r\n size: 26\r\n }),\r\n ]\r\n });\r\n }\r\n\r\n public createCenterHeading(text: string, before: number): Paragraph {\r\n return new Paragraph({\r\n alignment: AlignmentType.CENTER,\r\n spacing: {\r\n before: before,\r\n after: 0\r\n },\r\n children: [\r\n new TextRun({\r\n text: `${text}`,\r\n color: '#000000',\r\n italics: false,\r\n bold: true,\r\n size: 26\r\n }),\r\n ]\r\n });\r\n }\r\n\r\n public createReporter(unitName: string): Paragraph {\r\n return new Paragraph({\r\n alignment: AlignmentType.RIGHT,\r\n spacing: {\r\n before: 0,\r\n after: 0\r\n },\r\n children: [\r\n new TextRun({\r\n text: `Người báo cáo`,\r\n color: '#000000',\r\n italics: false,\r\n bold: true,\r\n size: 26\r\n }),\r\n new TextRun({\r\n text: `${unitName}`,\r\n color: '#000000',\r\n italics: false,\r\n size: 26\r\n }).break(),\r\n ]\r\n });\r\n }\r\n\r\n public createCommentator(unitName: string): Paragraph {\r\n return new Paragraph({\r\n\r\n alignment: AlignmentType.RIGHT,\r\n children: [\r\n new TextRun({\r\n text: `Người báo cáo`,\r\n color: '#000000',\r\n italics: false,\r\n bold: true,\r\n size: 26\r\n }),\r\n new TextRun({\r\n text: `${unitName}`,\r\n color: '#000000',\r\n italics: false,\r\n size: 26\r\n }).break(),\r\n ]\r\n });\r\n }\r\n\r\n public createSubHeading(text: string, before: number): Paragraph {\r\n return new Paragraph({\r\n spacing: {\r\n before: before,\r\n after: 0\r\n },\r\n children: [\r\n new TextRun({\r\n text: `${text}`,\r\n color: '#000000',\r\n italics: false,\r\n bold: true,\r\n size: 26\r\n }),\r\n ]\r\n });\r\n }\r\n\r\n\r\n\r\n public createDescription(text: string): Paragraph {\r\n return new Paragraph({\r\n spacing: {\r\n before: 0,\r\n after: 0\r\n },\r\n children: [\r\n new TextRun({\r\n text: `${text}`,\r\n color: '#000000',\r\n size: 24\r\n }),\r\n ]\r\n });\r\n }\r\n\r\n public createComment(text: string): Paragraph {\r\n return new Paragraph({\r\n spacing: {\r\n before: 200,\r\n after: 0\r\n },\r\n children: [\r\n new TextRun({\r\n text: `${text}`,\r\n color: '#000000',\r\n size: 24\r\n }),\r\n ]\r\n });\r\n }\r\n\r\n \r\n public createDescriptionBy(text: string): Paragraph {\r\n return new Paragraph({\r\n alignment: AlignmentType.RIGHT,\r\n children: [\r\n new TextRun({\r\n text: `${text}`,\r\n color: '#000000',\r\n size: 15\r\n }).break(),\r\n ]\r\n });\r\n }\r\n\r\n \r\n\r\n // public createPrefix(): Paragraph {\r\n // return new Paragraph({\r\n // tabStops: [\r\n // {\r\n // type: TabStopType.RIGHT,\r\n // position: TabStopPosition.MAX,\r\n // },\r\n // ],\r\n // children: [\r\n // new TextRun({\r\n // children: [\r\n // new TextRun({\r\n // text: `TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM`,\r\n // color: '#000000',\r\n // size: 20,\r\n // }),\r\n // new TextRun({\r\n // text: `LIÊN ĐOÀN LAO ĐỘNG`,\r\n // color: '#000000',\r\n // size: 20,\r\n // bold: true\r\n // }).break(),\r\n // new TextRun({\r\n // text: `THÀNH PHỐ HỒ CHÍ MINH`,\r\n // color: '#000000',\r\n // size: 20,\r\n // bold: true\r\n // }).break()\r\n // ]\r\n // }),\r\n // new TextRun({\r\n // children: [\r\n // new TextRun({\r\n // text: `CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM`,\r\n // color: '#000000',\r\n // size: 20,\r\n // bold: true\r\n // }),\r\n // new TextRun({\r\n // text: `Độc lập - Tự do - Hạnh phúc`,\r\n // color: '#000000',\r\n // size: 20,\r\n // bold: true\r\n // }).break()\r\n // ]\r\n // }),\r\n // ]\r\n // });\r\n // }\r\n\r\n public createPrefix(): Paragraph {\r\n return new Paragraph({\r\n heading: HeadingLevel.HEADING_2,\r\n indent: {\r\n left: -500,\r\n right: -1000\r\n },\r\n tabStops: [\r\n {\r\n type: TabStopType.RIGHT,\r\n position: TabStopPosition.MAX\r\n },\r\n ],\r\n children: [\r\n new TextRun({\r\n text: `TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM`,\r\n color: '#000000',\r\n characterSpacing: -20\r\n }),\r\n new TextRun({\r\n text: ` CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM`,\r\n bold: true,\r\n color: '#000000',\r\n characterSpacing: -5\r\n }),\r\n new TextRun({\r\n text: ` LIÊN ĐOÀN LAO ĐỘNG `,\r\n color: '#000000',\r\n bold: true,\r\n characterSpacing: -10\r\n }).break(),\r\n new TextRun({\r\n text: `Độc lập - Tự do - Hạnh phúc`,\r\n color: '#000000',\r\n bold: true,\r\n }),\r\n new TextRun({\r\n text: ` THÀNH PHỐ HỒ CHÍ MINH`,\r\n color: '#000000',\r\n bold: true,\r\n characterSpacing: -10,\r\n }).break(),\r\n new TextRun({\r\n text: ` _____________________________________`,\r\n superScript: true,\r\n color: '#000000',\r\n }),\r\n new TextRun({\r\n text: ` _______________`,\r\n superScript: true,\r\n color: '#000000',\r\n }).break(),\r\n ],\r\n });\r\n }\r\n\r\n getFileName(fileUrls) {\r\n var nameFile = \"\";\r\n if (fileUrls != \"\" && fileUrls != null) {\r\n var urlArr = fileUrls.split(\"/\");\r\n if (urlArr.length > 0) {\r\n nameFile = urlArr[urlArr.length - 1];\r\n if (nameFile != \"\" && nameFile != null) {\r\n var indexOfFirst = nameFile.indexOf(\"_\");\r\n nameFile = nameFile.substring(indexOfFirst + 1);\r\n }\r\n }\r\n }\r\n return nameFile;\r\n }\r\n\r\n public createFileName(text, fileUrls): Paragraph{\r\n if(fileUrls != null && fileUrls != undefined && fileUrls != []){\r\n return new Paragraph({\r\n spacing: {\r\n before: 200,\r\n after: 0\r\n },\r\n children: [\r\n new TextRun({\r\n text: `${text}`,\r\n color: '#000000',\r\n italics: false,\r\n bold: true,\r\n size: 26\r\n }),\r\n ...fileUrls.map((fileUrl) => {\r\n var name = this.getFileName(fileUrl);\r\n return new TextRun({\r\n text: `${name}`,\r\n color: '#000000',\r\n italics: false,\r\n size: 24\r\n }).break()\r\n \r\n }),\r\n ]\r\n });\r\n } else {\r\n return new Paragraph({\r\n spacing: {\r\n before: 0,\r\n after: 0\r\n },\r\n children: [\r\n new TextRun({\r\n text: `${text}`,\r\n color: '#000000',\r\n italics: false,\r\n bold: true,\r\n size: 26\r\n }),\r\n ]\r\n });\r\n }\r\n \r\n }\r\n\r\n \r\n\r\n \r\n\r\n}","// This file can be replaced during build by using the `fileReplacements` array.\r\n// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.\r\n// The list of file replacements can be found in `angular.json`.\r\n\r\nexport const environment = {\r\n production: false\r\n};\r\n\r\n/*\r\n * For easier debugging in development mode, you can import the following file\r\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\r\n *\r\n * This import should be commented out in production mode because it will have a negative impact\r\n * on performance if an error is thrown.\r\n */\r\n// import 'zone.js/dist/zone-error'; // Included with Angular CLI.\r\n","import { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic().bootstrapModule(AppModule)\r\n .catch(err => console.error(err));\r\n","/* (ignored) */","/* (ignored) */","/* (ignored) */"],"sourceRoot":""}