diff --git a/VAR.Focus.Web/Code/BusinessLogic/Boards.cs b/VAR.Focus.Web/Code/BusinessLogic/Boards.cs new file mode 100644 index 0000000..ae4d430 --- /dev/null +++ b/VAR.Focus.Web/Code/BusinessLogic/Boards.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using VAR.Focus.Web.Code.Entities; + +namespace VAR.Focus.Web.Code.BusinessLogic +{ + public class Boards + { + #region Declarations + + private static Boards _currentInstance = null; + + private List _boards = new List(); + private int _lastIDBoard=0; + + #endregion + + #region Properties + + public static Boards Current + { + get + { + if (_currentInstance == null) + { + _currentInstance = new Boards(); + } + return _currentInstance; + } + set { _currentInstance = value; } + } + + #endregion + + #region Life cycle + + public Boards() + { + LoadData(); + } + + #endregion + + #region Public methods + + public List Boards_GetListForUser(string userName) + { + // FIXME: filter by permissions + return _boards; + } + + public Board Board_GetByIDBoard(int idBoard) + { + foreach (Board board in _boards) + { + if (board.IDBoard == idBoard) + { + return board; + } + } + return null; + } + + public Board Boards_SetBoard(int idBoard, string title, string description, string userName) + { + DateTime currentDate = DateTime.UtcNow; + Board board; + if (idBoard == 0) + { + lock (this) + { + _lastIDBoard++; + board = new Board(); + board.IDBoard = _lastIDBoard; + board.Active = true; + board.CreatedBy = userName; + board.CreatedDate = currentDate; + _boards.Add(board); + } + } + else + { + board = Board_GetByIDBoard(idBoard); + } + + board.Title = title; + board.Description = description; + board.ModifiedBy = userName; + board.ModifiedDate = currentDate; + + SaveData(); + + return board; + } + + #endregion + + #region Private methods + + #region Persistence + + private const string BoardsPersistenceFile = "priv/boards.json"; + + private void LoadData() + { + _boards = Persistence.LoadList(BoardsPersistenceFile); + _lastIDBoard = 0; + foreach (Board board in _boards) + { + if (board.IDBoard > _lastIDBoard) + { + _lastIDBoard = board.IDBoard; + } + } + } + + private void SaveData() + { + Persistence.SaveList(BoardsPersistenceFile, _boards); + } + + #endregion + + #endregion + } +} diff --git a/VAR.Focus.Web/Code/Entities/Board.cs b/VAR.Focus.Web/Code/Entities/Board.cs new file mode 100644 index 0000000..50f7c1b --- /dev/null +++ b/VAR.Focus.Web/Code/Entities/Board.cs @@ -0,0 +1,18 @@ +using System; + +namespace VAR.Focus.Web.Code.Entities +{ + public class Board + { + public int IDBoard { get; set; } + + public string Title { get; set; } + public string Description { get; set; } + + public bool Active { get; set; } + public string CreatedBy { get; set; } + public DateTime CreatedDate { get; set; } + public string ModifiedBy { get; set; } + public DateTime ModifiedDate { get; set; } + } +} diff --git a/VAR.Focus.Web/Pages/FormUtils.cs b/VAR.Focus.Web/Pages/FormUtils.cs index 4289b17..4b3e627 100644 --- a/VAR.Focus.Web/Pages/FormUtils.cs +++ b/VAR.Focus.Web/Pages/FormUtils.cs @@ -6,6 +6,22 @@ namespace VAR.Focus.Web.Pages { public class FormUtils { + public static Control CreatePanel(Control ctrl, string cssClass) + { + Panel pnl = new Panel(); + pnl.Controls.Add(ctrl); + if (string.IsNullOrEmpty(cssClass) == false) + { + pnl.CssClass = cssClass; + } + return pnl; + } + + public static Control CreatePanel(Control ctrl) + { + return CreatePanel(ctrl, null); + } + public static Control CreateField(string label, Control fieldControl) { Panel pnlRow = new Panel(); diff --git a/VAR.Focus.Web/Pages/FrmBoard.cs b/VAR.Focus.Web/Pages/FrmBoard.cs index 9e29775..677e208 100644 --- a/VAR.Focus.Web/Pages/FrmBoard.cs +++ b/VAR.Focus.Web/Pages/FrmBoard.cs @@ -1,12 +1,26 @@ using System; +using System.Collections.Generic; +using System.Web; +using System.Web.UI.WebControls; +using VAR.Focus.Web.Code.BusinessLogic; +using VAR.Focus.Web.Code.Entities; using VAR.Focus.Web.Controls; namespace VAR.Focus.Web.Pages { public class FrmBoard : PageCommon { + #region Declarations + private int _idBoard = 0; + private CTextBox _txtTitle = new CTextBox { ID = "txtTitle", CssClassExtra="width100pc" }; + private CTextBox _txtDescription = new CTextBox { ID = "txtDescription", CssClassExtra = "width100pc" }; + + #endregion + + #region Life cycle + public FrmBoard() { Init += FrmBoard_Init; @@ -14,19 +28,112 @@ namespace VAR.Focus.Web.Pages void FrmBoard_Init(object sender, EventArgs e) { - Title = "Board"; + + string strIDBoard = GetRequestParm(Context, "idBoard"); + if (String.IsNullOrEmpty(strIDBoard) == false) + { + _idBoard = Convert.ToInt32(strIDBoard); + } + if (_idBoard == 0) + { + FrmBoard_InitIndex(); + } + else + { + FrmBoard_InitBoard(); + } + } + + #endregion + + #region UI Events + + void btnAddBoard_Click(object sender, EventArgs e) + { + Board board = Boards.Current.Boards_SetBoard(0, _txtTitle.Text, _txtDescription.Text, CurrentUser.Name); + _idBoard = board.IDBoard; + + Response.Redirect(string.Format("{0}?idBoard={1}", "FrmBoard", _idBoard)); + } + + #endregion + + #region Private methods + + private void FrmBoard_InitIndex() + { + Title = "Boards"; + + List boards = Boards.Current.Boards_GetListForUser(CurrentUser.Name); + + foreach (Board board in boards) + { + var pnlBoardSelector = new Panel { CssClass = "boardBanner" }; + var lnkTitle = new HyperLink + { + NavigateUrl = string.Format("{0}?idBoard={1}", "FrmBoard", board.IDBoard), + }; + var lblTitle = new CLabel + { + Text = board.Title, + CssClass = "title", + }; + lnkTitle.Controls.Add(lblTitle); + var pnlDescription = new Panel(); + var lblDescription = new CLabel + { + Text = board.Description, + CssClass = "description", + }; + pnlDescription.Controls.Add(lblDescription); + pnlBoardSelector.Controls.Add(lnkTitle); + pnlBoardSelector.Controls.Add(pnlDescription); + Controls.Add(pnlBoardSelector); + } + + var pnlBoardAdd = new Panel { CssClass = "boardBanner" }; + var btnAddBoard = new CButton { ID = "btnAddBoard", Text = "AddBoard" }; + btnAddBoard.Click += btnAddBoard_Click; + pnlBoardAdd.Controls.Add(FormUtils.CreatePanel(_txtTitle, "formRow")); + _txtTitle.PlaceHolder = "Title"; + pnlBoardAdd.Controls.Add(FormUtils.CreatePanel(_txtDescription, "formRow")); + _txtDescription.PlaceHolder = "Description"; + pnlBoardAdd.Controls.Add(FormUtils.CreatePanel(btnAddBoard, "formRow")); + Controls.Add(pnlBoardAdd); + + } + + private void FrmBoard_InitBoard() + { + Board board = Boards.Current.Board_GetByIDBoard(_idBoard); + + Title = board.Title; CardBoardControl cardBoardControl = new CardBoardControl(); cardBoardControl.ID = "ctrCardBoard"; - cardBoardControl.IDBoard = _idBoard; + cardBoardControl.IDBoard = board.IDBoard; cardBoardControl.UserName = CurrentUser.Name; Controls.Add(cardBoardControl); ChatControl chatControl = new ChatControl(); chatControl.ID = "ctrChat"; - chatControl.IDBoard = _idBoard; + chatControl.IDBoard = board.IDBoard; chatControl.UserName = CurrentUser.Name; Controls.Add(chatControl); } + + private string GetRequestParm(HttpContext context, string parm) + { + foreach (string key in context.Request.Params.AllKeys) + { + if (string.IsNullOrEmpty(key) == false && key.EndsWith(parm)) + { + return context.Request.Params[key]; + } + } + return string.Empty; + } + + #endregion } } diff --git a/VAR.Focus.Web/Styles/02. Boards.css b/VAR.Focus.Web/Styles/02. Boards.css new file mode 100644 index 0000000..807c604 --- /dev/null +++ b/VAR.Focus.Web/Styles/02. Boards.css @@ -0,0 +1,34 @@ +.boardBanner { + border: solid 1px rgb(32, 32, 32); + border-radius: 5px; + display: inline-block; + width: 300px; + margin: 15px; + padding: 10px; + vertical-align: top; + background-color: rgb(250,250,200); +} + + .boardBanner a { + text-decoration: none; + color: black; + } + + .boardBanner .title { + font-size: 20px; + padding-bottom: 5px; + } + + .boardBanner .description { + font-size: 14px; + } + + .boardBanner .formRow { + margin: 0; + margin-top: 10px; + padding: 0; + } + + .boardBanner .formRow:first-child { + margin: 0; + } diff --git a/VAR.Focus.Web/VAR.Focus.Web.csproj b/VAR.Focus.Web/VAR.Focus.Web.csproj index 8b34272..b82b78f 100644 --- a/VAR.Focus.Web/VAR.Focus.Web.csproj +++ b/VAR.Focus.Web/VAR.Focus.Web.csproj @@ -62,17 +62,20 @@ + + + @@ -115,7 +118,6 @@ - 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)