Пример #1
0
        public async Task <PagedList <ArticleDto> > Execute(ArticleParams articleParams)
        {
            var articles = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            // TODO: find AutoMapper solution iso projection
            //var articlesDtos = _mapper.Map<IEnumerable<ArticleDto>>(articles);
            var articlesDtos = articles.Select(a => new ArticleDto()
            {
                Id                = a.Id,
                Code              = a.Code,
                Name1             = a.Name1,
                SupplierId        = a.SupplierId,
                SupplierReference = a.SupplierReference,
                PurchasePrice     = a.PurchasePrice,
                Unit              = a.Unit,
                Photos            = a.Photos.Select(p => new ArticlePhotoDto()
                {
                    Id = p.Id, IsMain = p.IsMain, Url = p.Url
                }).ToList(),
                PhotoUrl = a.Photos.Any() ? a.Photos.First().Url : string.Empty
            });


            var articlesToReturn = new PagedList <ArticleDto>(articlesDtos, articles.TotalCount, articles.CurrentPage, articles.PageSize);

            return(articlesToReturn);
        }
        public void SetUp()
        {
            _articlesRepositoryMock = new Mock <IReadOnlyArticleRepository>();
            var articleParams = new ArticleParams();

            _testArticles = ArticleList.GetShortList().AsEnumerable();
        }
Пример #3
0
        public void Setup()
        {
            _articleRepositoryMock = new Mock <IArticleRepository>()
            {
                DefaultValue = DefaultValue.Mock
            };
            _unitOfWorkMock = new Mock <IUnitOfWork>();
            _unitOfWorkMock.Setup(m => m.ArticleRepository).Returns(_articleRepositoryMock.Object);
            _articleParams = new ArticleParams();

            _testArticles = new List <Article>()
            {
                new ArticleBuilder().WithId(1).WithCode("Article1").WithName1("1st article").WithSupplierId("sup1").WithSupplierReference("sup1 ref 1").WithUnit("ST").WithPurchasePrice(10.00M).Build(),
                new ArticleBuilder().WithId(2).WithCode("Article2").WithName1("2nd article").WithSupplierId("sup2").WithSupplierReference("sup1 ref 2").WithUnit("ST").WithPurchasePrice(20.00M).Build(),
                new ArticleBuilder().WithId(3).WithCode("Article3").WithName1("3rd article").WithSupplierId("sup3").WithSupplierReference("sup2 ref 1").WithUnit("ST").WithPurchasePrice(30.00M).Build()
            }.AsEnumerable();
            var articlesPagedList = new PagedList <Article>(items: _testArticles, count: 3, pageNumber: 1, pageSize: 10);

            _articleRepositoryMock
            .Setup(m => m.GetArticlesAsync(_articleParams))
            .ReturnsAsync(articlesPagedList);
            _articleRepositoryMock
            .Setup(m => m.GetArticleByIdAsync(2))
            .ReturnsAsync(articlesPagedList[1]);

            var mapper = new Mapper(new MapperConfiguration(cfg => cfg.AddProfile <AutoMapperProfiles>()));

            _articlesController = new ArticlesController(_listQueryMock.Object, _singleQueryMock.Object, _createCommandMock.Object, _updateCommandMock.Object, _deleteCommandMock.Object);
        }
Пример #4
0
        public async Task <PagedList <Article> > GetArticlesForUser(ArticleParams articleParams)
        {
            var articles = GetArticlesForUser(articleParams.UserId, articleParams.ShowAll);

            articles = articles.OrderByDescending(d => d.Id);

            return(await PagedList <Article> .CreateAsync(articles, articleParams.PageNumber, articleParams.SizePage));
        }
 public void SetUp()
 {
     _articlesRepositoryMock = new Mock <IReadOnlyArticleRepository>();
     _articleParams          = new ArticleParams();
     _testArticles           = ArticleList.GetDefaultList().AsEnumerable();
     _pagedListOfArticles    = new PagedList <Article>(_testArticles, _testArticles.Count(), 1, 10);
     _readMapper             = new Mapper(new MapperConfiguration(cfg => cfg.AddProfile <Helpers.AutoMapperProfiles>()));
 }
        public async Task <ActionResult <IEnumerable <ArticleDto> > > GetArticles(
            [FromQuery] ArticleParams articleParams)
        {
            var articles = await _listQuery.Execute(articleParams);

            Response.AddPaginationHeader(articles.CurrentPage, articles.PageSize, articles.TotalCount, articles.TotalPages);

            return(Ok(articles.AsEnumerable()));
        }
Пример #7
0
        public async Task <PagedList <ArticleDto> > Execute(ArticleParams articleParams)
        {
            var articles = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            var articlesDtos = _mapper.Map <IEnumerable <ArticleDto> >(articles);

            var articlesToReturn = new PagedList <ArticleDto>(articlesDtos, articles.TotalCount, articles.CurrentPage, articles.PageSize);

            return(articlesToReturn);
        }
Пример #8
0
        public async Task <IActionResult> GetArticles([FromQuery] ArticleParams articleParams)
        {
            int pageSize  = articleParams.PageSize;
            int pageIndex = articleParams.PageIndex;

            var articlesFromRepo = await _repo.GetArticlesAsync(articleParams);

            var articles = _mapper.Map <IEnumerable <ArticleToReturnDto> >(articlesFromRepo);

            return(Ok(new { articles, articleParams.Length }));
        }
Пример #9
0
        // Article
        public async Task <IEnumerable <Article> > GetArticlesAsync(ArticleParams articleParams)
        {
            // Gotta back for implementing orderby date after another migration
            var articles = _context.Articles
                           .Where(a => a.IsDeleted == false)
                           .Include(a => a.Category)
                           .AsQueryable();

            articles = TQuery.ArticleQuery(articleParams, articles);

            return(await articles.ToListAsync());
        }
Пример #10
0
        public async Task GetArticlesAsync_WithDefaultParams_ReturnsArticlesThatMatchCriteria()
        {
            //Arrange
            var articleParams = new ArticleParams();

            //Act
            var result = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            //Assert
            Assert.That(result.GetType(), Is.EqualTo(typeof(PagedList <Article>)));
            Assert.That(result.First().Photos.GetType(), Is.EqualTo(typeof(List <ArticlePhoto>)));
            Assert.That(result.Count, Is.EqualTo(_defaultPageSize));
            Assert.That(result.First().Code, Is.EqualTo("Article01"));
            Assert.That(result[9].Code, Is.EqualTo("Article10"));
        }
        private static IQueryable <Article> OrderByQuery(
            ArticleParams articleParams,
            IQueryable <Article> articles)
        {
            articles = articleParams.OrderBy switch
            {
                ArticleOrderBy.Code => articles.OrderBy(a => a.Code),
                ArticleOrderBy.SupplierReference => articles.OrderBy(a => a.SupplierReference),
                ArticleOrderBy.Name => articles.OrderBy(a => a.Name1),
                _ => articles.OrderBy(a => a.Code)
            };

            return(articles);
        }
    }
        public async Task <PagedList <Article> > GetArticlesAsync(
            ArticleParams articleParams)
        {
            var query = _readOnlyContext.Articles
                        .Include(a => a.Photos)
                        .AsQueryable();

            query = FilterQuery(articleParams, query);
            query = OrderByQuery(articleParams, query);

            return(await PagedList <Article> .CreateAsync(
                       query,
                       articleParams.PageNumber,
                       articleParams.PageSize));
        }
Пример #13
0
        public async Task GetArticlesAsync_WithFilterCodeArt_ReturnsArticlesThatMatchCriteria()
        {
            //Arrange
            var articleParams = new ArticleParams()
            {
                Code = "aRt"
            };

            //Act
            var result = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            //Assert
            Assert.That(result.GetType(), Is.EqualTo(typeof(PagedList <Article>)));
            Assert.That(result.Count, Is.EqualTo(_defaultPageSize));
            Assert.That(result.TotalCount, Is.EqualTo(12));
        }
Пример #14
0
        public async Task GetArticlesAsync_WithFilterName1_ReturnsArticlesThatMatchCriteria()
        {
            //Arrange
            var articleParams = new ArticleParams()
            {
                Name1 = "rd art"
            };

            //Act
            var result = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            //Assert
            Assert.That(result.GetType(), Is.EqualTo(typeof(PagedList <Article>)));
            Assert.That(result.Count, Is.EqualTo(1));
            Assert.That(result.First().Code, Is.EqualTo("Article03"));
        }
        private static IQueryable <Article> OrderByQuery(
            ArticleParams articleParams,
            IQueryable <Article> articles)
        {
            // TODO: use enums instead of magic strings
            articles = articleParams.OrderBy switch
            {
                "code" => articles.OrderBy(a => a.Code),
                "supplierReference" => articles.OrderBy(a => a.SupplierReference),
                "name" => articles.OrderBy(a => a.Name1),
                _ => articles.OrderBy(a => a.Code)
            };

            return(articles);
        }
    }
Пример #16
0
        public async Task GetArticlesAsync_WithOrderBySupplierRef_ReturnsArticlesThatMatchCriteria()
        {
            //Arrange
            var articleParams = new ArticleParams()
            {
                OrderBy = Common.Enums.ArticleOrderBy.SupplierReference
            };

            //Act
            var result = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            //Assert
            Assert.That(result.GetType(), Is.EqualTo(typeof(PagedList <Article>)));
            Assert.That(result.Count, Is.EqualTo(_defaultPageSize));
            Assert.That(result.First().SupplierReference, Is.EqualTo("sup1 ref 1"));
            Assert.That(result[9].SupplierReference, Is.EqualTo("sup5 ref 2"));
        }
Пример #17
0
        public async Task GetArticlesAsync_WithFilterSupplierReference_ReturnsArticlesThatMatchCriteria()
        {
            //Arrange
            var articleParams = new ArticleParams()
            {
                SupplierReference = "SUP1"
            };

            //Act
            var result = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            //Assert
            Assert.That(result.GetType(), Is.EqualTo(typeof(PagedList <Article>)));
            Assert.That(result.Count, Is.EqualTo(2));
            Assert.That(result.First().Code, Is.EqualTo("Article07"));
            Assert.That(result[1].Code, Is.EqualTo("Article08"));
        }
Пример #18
0
        public async Task GetArticlesAsync_WithFilterUnit_ReturnsArticlesThatMatchCriteria()
        {
            //Arrange
            var articleParams = new ArticleParams()
            {
                Unit = "B"
            };

            //Act
            var result = await _articleRepository.GetArticlesAsync(articleParams);

            //Assert
            Assert.That(result.GetType(), Is.EqualTo(typeof(PagedList <Article>)));
            Assert.That(result.Count, Is.EqualTo(5));
            Assert.That(result.First().Code, Is.EqualTo("Article05"));
            Assert.That(result[4].Code, Is.EqualTo("Article12"));
        }
Пример #19
0
        public async Task GetArticlesAsync_WithOrderByName1_ReturnsArticlesThatMatchCriteria()
        {
            //Arrange
            var articleParams = new ArticleParams()
            {
                OrderBy = Common.Enums.ArticleOrderBy.Name
            };

            //Act
            var result = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            //Assert
            Assert.That(result.GetType(), Is.EqualTo(typeof(PagedList <Article>)));
            Assert.That(result.Count, Is.EqualTo(_defaultPageSize));
            Assert.That(result.First().Name1, Is.EqualTo("10th article"));
            Assert.That(result[9].Name1, Is.EqualTo("7th article"));
        }
Пример #20
0
        public async Task GetArticlesAsync_WithPageSize5TakeLastPage_ReturnsArticlesThatMatchCriteria()
        {
            //Arrange
            var articleParams = new ArticleParams()
            {
                PageSize = 5, PageNumber = 3
            };

            //Act
            var result = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            //Assert
            Assert.That(result.GetType(), Is.EqualTo(typeof(PagedList <Article>)));
            Assert.That(result.Count, Is.EqualTo(2));
            Assert.That(result.First().Code, Is.EqualTo("Article11"));
            Assert.That(result[1].Code, Is.EqualTo("Article12"));
        }
Пример #21
0
        public async Task GetArticlesAsync_WithFilterPurchasePriceMinAndMax_ReturnsArticlesThatMatchCriteria()
        {
            //Arrange
            var articleParams = new ArticleParams()
            {
                PurchasePriceMin = 50.00M, PurchasePriceMax = 80.00M
            };

            //Act
            var result = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            //Assert
            Assert.That(result.GetType(), Is.EqualTo(typeof(PagedList <Article>)));
            Assert.That(result.Count, Is.EqualTo(4));
            Assert.That(result.First().Code, Is.EqualTo("Article05"));
            Assert.That(result[3].Code, Is.EqualTo("Article08"));
        }
Пример #22
0
        public async Task GetArticlesAsync_WithFilterCodeCle1_ReturnsArticlesThatMatchCriteria()
        {
            //Arrange
            var articleParams = new ArticleParams()
            {
                Code = "cLe1"
            };

            //Act
            var result = await _readOnlyArticleRepository.GetArticlesAsync(articleParams);

            //Assert
            Assert.That(result.GetType(), Is.EqualTo(typeof(PagedList <Article>)));
            Assert.That(result.Count, Is.EqualTo(3));
            Assert.That(result.First().Code, Is.EqualTo("Article10"));
            Assert.That(result[1].Code, Is.EqualTo("Article11"));
            Assert.That(result[2].Code, Is.EqualTo("Article12"));
        }
        private static IQueryable <Article> FilterQuery(
            ArticleParams articleParams,
            IQueryable <Article> articles)
        {
            if (!string.IsNullOrEmpty(articleParams.Code))
            {
                articles = articles.Where(a => a.Code.ToUpper().Contains(articleParams.Code.ToUpper()));
            }

            if (!string.IsNullOrEmpty(articleParams.SupplierId))
            {
                articles = articles.Where(a => a.SupplierId.ToUpper().Contains(articleParams.SupplierId.ToUpper()));
            }

            if (!string.IsNullOrEmpty(articleParams.SupplierReference))
            {
                articles = articles.Where(a => a.SupplierReference.ToUpper().Contains(articleParams.SupplierReference.ToUpper()));
            }

            if (!string.IsNullOrEmpty(articleParams.Name1))
            {
                articles = articles.Where(a => a.Name1.ToUpper().Contains(articleParams.Name1.ToUpper()));
            }

            if (!string.IsNullOrEmpty(articleParams.Unit))
            {
                articles = articles.Where(a => a.Unit.ToUpper().Contains(articleParams.Unit.ToUpper()));
            }

            if (articleParams.PurchasePriceMin != null)
            {
                articles = articles.Where(a => a.PurchasePrice >= articleParams.PurchasePriceMin);
            }

            if (articleParams.PurchasePriceMax != null)
            {
                articles = articles.Where(a => a.PurchasePrice <= articleParams.PurchasePriceMax);
            }

            return(articles);
        }
Пример #24
0
        public async Task <IActionResult> GetArticles(int userId, [FromQuery] ArticleParams articleParams)
        {
            articleParams.UserId = userId;

            if (articleParams.UserId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
            {
                return(Unauthorized());
            }

            var articlesFromRepo = await _repo.GetArticlesForUser(articleParams);

            if (articlesFromRepo == null)
            {
                return(NotFound());
            }

            Response.AddPagination(articlesFromRepo.CurrentPage, articlesFromRepo.SizePage,
                                   articlesFromRepo.TotalCount, articlesFromRepo.Total);
            var articleReturn = Mapper.Map <IList <ArticleForListDto> > (articlesFromRepo);

            return(Ok(articleReturn));
        }
        public void Setup()
        {
            _articleParams = new ArticleParams();
            _testArticles  = ArticleList.GetShortList().AsEnumerable();
            var articlesPagedList = new PagedList <Article>(items: _testArticles, count: 3, pageNumber: 1, pageSize: 10);

            _readMapper  = new Mapper(new MapperConfiguration(cfg => cfg.AddProfile <ReadApplication.Helpers.AutoMapperProfiles>()));
            _writeMapper = new Mapper(new MapperConfiguration(cfg => cfg.AddProfile <WriteApplication.Helpers.AutoMapperProfiles>()));

            _listQueryMock     = new Mock <IGetArticlesQuery>();
            _singleQueryMock   = new Mock <IGetArticleQuery>();
            _createCommandMock = new Mock <ICreateArticleCommand>();
            _updateCommandMock = new Mock <IUpdateArticleCommand>();
            _updateCommandMock = new Mock <IUpdateArticleCommand>();
            _deleteCommandMock = new Mock <IDeleteArticleCommand>();

            var articlesDtoList = _readMapper.Map <IEnumerable <ArticleDto> >(articlesPagedList);

            _articlesDtoPagedList = new PagedList <ArticleDto>(articlesDtoList, articlesPagedList.TotalCount, articlesPagedList.CurrentPage, articlesPagedList.PageSize);
            _listQueryMock
            .Setup(m => m.Execute(It.IsAny <ArticleParams>()))
            .Returns(Task.FromResult(_articlesDtoPagedList));

            _unitOfWork        = new Mock <IUnitOfWork>();
            _articleRepository = new Mock <IArticleRepository>();
            _unitOfWork.Setup(uow => uow.ArticleRepository).Returns(_articleRepository.Object);

            _articlesController = new ArticlesController(
                _listQueryMock.Object,
                _singleQueryMock.Object,
                _createCommandMock.Object,
                _updateCommandMock.Object,
                _deleteCommandMock.Object)
            {
                ControllerContext = TestControllerContext
            };
        }
Пример #26
0
    protected void btnSave_Click(object sender, EventArgs e)
    {
        Master.ShowErrorMsg("");

        if (!IsValid)
        {
            return;
        }

        try
        {
            txtArticleAlias.Text       = txtArticleAlias.Text.Trim();
            txtBannerPicFileName.Text  = txtBannerPicFileName.Text.Trim();
            txtLinkUrl.Text            = txtLinkUrl.Text.Trim();
            txtControlName.Text        = txtControlName.Text.Trim();
            txtSubItemControlName.Text = txtSubItemControlName.Text.Trim();
            txtSubItemLinkUrl.Text     = txtSubItemLinkUrl.Text.Trim();

            ArticleParams param = new ArticleParams()
            {
                ArticleAlias                = txtArticleAlias.Text,
                BannerPicFileName           = txtBannerPicFileName.Text,
                LayoutModeId                = Convert.ToInt32(rdolLayoutMode.SelectedValue),
                ShowTypeId                  = Convert.ToInt32(rdolShowType.SelectedValue),
                LinkUrl                     = txtLinkUrl.Text,
                LinkTarget                  = chkIsNewWindow.Checked ? "_blank" : "",
                ControlName                 = txtControlName.Text,
                SubItemControlName          = txtSubItemControlName.Text,
                IsHideSelf                  = chkIsHideSelf.Checked,
                IsHideChild                 = chkIsHideChild.Checked,
                StartDate                   = Convert.ToDateTime(txtStartDate.Text),
                EndDate                     = Convert.ToDateTime(txtEndDate.Text),
                SortNo                      = Convert.ToInt32(txtSortNo.Text),
                DontDelete                  = chkDontDelete.Checked,
                PostAccount                 = c.GetEmpAccount(),
                SubjectAtBannerArea         = chkSubjectAtBannerArea.Checked,
                PublishDate                 = Convert.ToDateTime(txtPublishDate.Text),
                IsShowInUnitArea            = chkIsShowInUnitArea.Checked,
                IsShowInSitemap             = chkIsShowInSitemap.Checked,
                SortFieldOfFrontStage       = hidSortFieldOfFrontStage.Text,
                IsSortDescOfFrontStage      = Convert.ToBoolean(hidIsSortDescOfFrontStage.Text),
                IsListAreaShowInFrontStage  = Convert.ToBoolean(hidIsListAreaShowInFrontStage.Text),
                IsAttAreaShowInFrontStage   = Convert.ToBoolean(hidIsAttAreaShowInFrontStage.Text),
                IsPicAreaShowInFrontStage   = Convert.ToBoolean(hidIsPicAreaShowInFrontStage.Text),
                IsVideoAreaShowInFrontStage = Convert.ToBoolean(hidIsVideoAreaShowInFrontStage.Text),
                SubItemLinkUrl              = txtSubItemLinkUrl.Text
            };

            txtArticleSubjectZhTw.Text = txtArticleSubjectZhTw.Text.Trim();
            txtCkeContextZhTw.Text     = StringUtility.GetSievedHtmlEditorValue(txtCkeContextZhTw.Text);
            txtSubtitleZhTw.Text       = txtSubtitleZhTw.Text.Trim();
            txtPublisherNameZhTw.Text  = txtPublisherNameZhTw.Text.Trim();

            ArticleMultiLangParams paramZhTw = new ArticleMultiLangParams()
            {
                CultureName    = LangManager.CultureNameZHTW,
                ArticleSubject = txtArticleSubjectZhTw.Text,
                ArticleContext = txtCkeContextZhTw.Text,
                IsShowInLang   = chkIsShowInLangZhTw.Checked,
                PostAccount    = c.GetEmpAccount(),
                Subtitle       = txtSubtitleZhTw.Text,
                PublisherName  = txtPublisherNameZhTw.Text,
                TextContext    = StringUtility.RemoveHtmlTag(txtCkeContextZhTw.Text)
            };

            txtArticleSubjectEn.Text = txtArticleSubjectEn.Text.Trim();
            txtCkeContextEn.Text     = StringUtility.GetSievedHtmlEditorValue(txtCkeContextEn.Text);
            txtSubtitleEn.Text       = txtSubtitleEn.Text.Trim();
            txtPublisherNameEn.Text  = txtPublisherNameEn.Text.Trim();

            ArticleMultiLangParams paramEn = new ArticleMultiLangParams()
            {
                CultureName    = LangManager.CultureNameEN,
                ArticleSubject = txtArticleSubjectEn.Text,
                ArticleContext = txtCkeContextEn.Text,
                IsShowInLang   = chkIsShowInLangEn.Checked,
                PostAccount    = c.GetEmpAccount(),
                Subtitle       = txtSubtitleEn.Text,
                PublisherName  = txtPublisherNameEn.Text,
                TextContext    = StringUtility.RemoveHtmlTag(txtCkeContextEn.Text)
            };

            bool result = false;

            if (c.qsAct == ConfigFormAction.add)
            {
                Guid newArticleId = Guid.NewGuid();
                param.ArticleId = newArticleId;
                param.ParentId  = c.qsArtId;

                if (param.ArticleAlias == "")
                {
                    param.ArticleAlias = newArticleId.ToString();
                }

                result = artPub.InsertArticleData(param);

                if (result)
                {
                    //ZhTw
                    if (result && LangManager.IsEnableEditLangZHTW())
                    {
                        paramZhTw.ArticleId = param.ArticleId;
                        result = artPub.InsertArticleMultiLangData(paramZhTw);
                    }

                    //En
                    if (result && LangManager.IsEnableEditLangEN())
                    {
                        paramEn.ArticleId = param.ArticleId;
                        result            = artPub.InsertArticleMultiLangData(paramEn);
                    }

                    if (!result)
                    {
                        Master.ShowErrorMsg(Resources.Lang.ErrMsg_AddMultiLangFailed);
                    }
                }
                else
                {
                    if (param.HasIdBeenUsed)
                    {
                        Master.ShowErrorMsg(Resources.Lang.ErrMsg_ArticleIdHasBeenUsed);
                    }
                    else if (param.HasAliasBeenUsed)
                    {
                        Master.ShowErrorMsg(Resources.Lang.ErrMsg_ArticleAliasHasBeenUsed);
                    }
                    else
                    {
                        Master.ShowErrorMsg(Resources.Lang.ErrMsg_AddFailed);
                    }
                }
            }
            else if (c.qsAct == ConfigFormAction.edit)
            {
                param.ArticleId = c.qsArtId;

                if (param.ArticleAlias == "")
                {
                    param.ArticleAlias = c.qsArtId.ToString();
                }

                result = artPub.UpdateArticleData(param);

                if (result)
                {
                    //ZhTw
                    if (result && LangManager.IsEnableEditLangZHTW())
                    {
                        paramZhTw.ArticleId = param.ArticleId;
                        result = artPub.UpdateArticleMultiLangData(paramZhTw);
                    }

                    //En
                    if (result && LangManager.IsEnableEditLangEN())
                    {
                        paramEn.ArticleId = param.ArticleId;
                        result            = artPub.UpdateArticleMultiLangData(paramEn);
                    }

                    if (!result)
                    {
                        Master.ShowErrorMsg(Resources.Lang.ErrMsg_UpdateMultiLangFailed);
                    }
                }
                else
                {
                    if (param.HasAliasBeenUsed)
                    {
                        Master.ShowErrorMsg(Resources.Lang.ErrMsg_ArticleAliasHasBeenUsed);
                    }
                    else
                    {
                        Master.ShowErrorMsg(Resources.Lang.ErrMsg_AddFailed);
                    }
                }
            }

            if (result)
            {
                if (chkUpdateSearchDataSource.Checked)
                {
                    // call sql server agent job
                    //bool jobResult = artPub.CallSqlServerAgentJob("Update SampleEFCMS SearchDataSource");

                    // sp
                    artPub.BuildSearchDataSource("");
                }

                ClientScript.RegisterStartupScript(this.GetType(), "", StringUtility.GetNoticeOpenerJs("Config"), true);
            }

            //新增後端操作記錄
            string description = string.Format(".{0} .儲存網頁/Save article[{1}][{2}] ArticleId[{3}] 結果/result[{4}]",
                                               Title, txtArticleSubjectZhTw.Text, txtArticleSubjectEn.Text, param.ArticleId, result);

            empAuth.InsertBackEndLogData(new BackEndLogData()
            {
                EmpAccount  = c.GetEmpAccount(),
                Description = description,
                IP          = c.GetClientIP()
            });
        }
        catch (Exception ex)
        {
            c.LoggerOfUI.Error("", ex);
            Master.ShowErrorMsg(ex.Message);
        }
    }