PageRenderTime 42ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/CmsWeb/Areas/Main/Models/Other/QueryModel.cs

https://bitbucket.org/rbhakser/bvcms
C# | 960 lines | 935 code | 18 blank | 7 comment | 99 complexity | b43d2b69fef3d9bd584e7388b2203348 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Apache-2.0, BSD-3-Clause, AGPL-3.0, MPL-2.0-no-copyleft-exception
  1. /* Author: David Carroll
  2. * Copyright (c) 2008, 2009 Bellevue Baptist Church
  3. * Licensed under the GNU General Public License (GPL v2)
  4. * you may not use this code except in compliance with the License.
  5. * You may obtain a copy of the License at http://bvcms.codeplex.com/license
  6. */
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Data.Linq;
  11. using System.Web;
  12. using System.Web.Mvc;
  13. using CmsData;
  14. using CmsWeb.Code;
  15. using UtilityExtensions;
  16. using System.Data.Linq.SqlClient;
  17. using System.Web.UI.WebControls;
  18. using System.Transactions;
  19. using System.Xml.Linq;
  20. namespace CmsWeb.Models
  21. {
  22. interface IQBUpdateable
  23. {
  24. int? SelectedId { get; set; }
  25. string ConditionName { get; set; }
  26. int? Program { get; set; }
  27. int? Division { get; set; }
  28. int? Organization { get; set; }
  29. int? Schedule { get; set; }
  30. int? Campus { get; set; }
  31. int? OrgType { get; set; }
  32. string Days { get; set; }
  33. string Age { get; set; }
  34. string Quarters { get; set; }
  35. string StartDate { get; set; }
  36. string EndDate { get; set; }
  37. string Comparison { get; set; }
  38. string[] Tags { get; set; }
  39. string CodeValue { get; set; }
  40. string[] CodeValues { get; set; }
  41. string View { get; set; }
  42. string TextValue { get; set; }
  43. string DateValue { get; set; }
  44. string NumberValue { get; set; }
  45. string IntegerValue { get; set; }
  46. int? Ministry { get; set; }
  47. string SavedQueryDesc { get; set; }
  48. string Sort { get; set; }
  49. string Direction { get; set; }
  50. int? Page { get; set; }
  51. int? PageSize { get; set; }
  52. }
  53. public class QueryModel : IQBUpdateable
  54. {
  55. private CMSDataContext Db;
  56. private QueryBuilderClause Qb;
  57. private int TagTypeId { get; set; }
  58. private string TagName { get; set; }
  59. private int? TagOwner { get; set; }
  60. public QueryModel()
  61. {
  62. Db = DbUtil.Db;
  63. ConditionName = "Group";
  64. Direction = "asc";
  65. TagTypeId = DbUtil.TagTypeId_Personal;
  66. TagName = Util2.CurrentTagName;
  67. TagOwner = Util2.CurrentTagOwnerId;
  68. Errors = new Dictionary<string, string>();
  69. }
  70. public string Description { get; set; }
  71. public int? QueryId { get; set; }
  72. public void LoadScratchPad()
  73. {
  74. Qb = Db.QueryBuilderScratchPad();
  75. if (QueryId.HasValue && QueryId.Value != Qb.QueryId)
  76. {
  77. var existing = Db.LoadQueryById(QueryId.Value);
  78. if (existing != null)
  79. {
  80. Qb.CopyFromAll(existing, DbUtil.Db);
  81. Description = Qb.Description;
  82. SavedQueryDesc = Qb.Description;
  83. Qb.Description = Util.ScratchPad;
  84. Db.SubmitChanges();
  85. SelectedId = Qb.QueryId;
  86. EditCondition();
  87. }
  88. }
  89. QueryId = Qb.QueryId;
  90. if (SelectedId == null)
  91. SelectedId = Qb.QueryId;
  92. }
  93. public int? SelectedId { get; set; }
  94. public bool RightPanelVisible { get; set; }
  95. public bool TextVisible { get; set; }
  96. public bool NumberVisible { get; set; }
  97. public bool IntegerVisible { get; set; }
  98. public bool CodeVisible { get; set; }
  99. public bool CodesVisible { get; set; }
  100. public bool DateVisible { get; set; }
  101. public bool ProgramVisible { get; set; }
  102. public bool DivisionVisible { get; set; }
  103. public bool EndDateVisible { get; set; }
  104. public bool StartDateVisible { get; set; }
  105. public bool OrganizationVisible { get; set; }
  106. public bool ScheduleVisible { get; set; }
  107. public bool CampusVisible { get; set; }
  108. public bool OrgTypeVisible { get; set; }
  109. public bool DaysVisible { get; set; }
  110. public bool AgeVisible { get; set; }
  111. public bool SavedQueryVisible { get; set; }
  112. public bool MinistryVisible { get; set; }
  113. public bool QuartersVisible { get; set; }
  114. public bool TagsVisible { get; set; }
  115. public List<SelectListItem> TagData { get; set; }
  116. public IEnumerable<SelectListItem> CodeData { get; set; }
  117. public List<SelectListItem> CompareData { get; set; }
  118. public List<SelectListItem> ProgramData { get; set; }
  119. public List<SelectListItem> DivisionData { get; set; }
  120. public List<SelectListItem> OrganizationData { get; set; }
  121. public List<SelectListItem> ViewData { get; set; }
  122. public int? Program { get; set; }
  123. public int? Division { get; set; }
  124. public int? Organization { get; set; }
  125. public int? Schedule { get; set; }
  126. public int? Campus { get; set; }
  127. public int? OrgType { get; set; }
  128. public string Days { get; set; }
  129. public string Age { get; set; }
  130. public string Quarters { get; set; }
  131. public string QuartersLabel { get; set; }
  132. public string View { get; set; }
  133. public string StartDate { get; set; }
  134. public string EndDate { get; set; }
  135. public string Comparison { get; set; }
  136. public string[] Tags { get; set; }
  137. public int? Ministry { get; set; }
  138. public string SavedQueryDesc { get; set; }
  139. public bool IsPublic { get; set; }
  140. public string CodeValue { get; set; }
  141. public string[] CodeValues { get; set; }
  142. public string TextValue { get; set; }
  143. public string DateValue { get; set; }
  144. public string NumberValue { get; set; }
  145. public string IntegerValue { get; set; }
  146. public bool UpdateEnabled { get; set; }
  147. public bool AddToGroupEnabled { get; set; }
  148. public bool AddEnabled { get; set; }
  149. public bool RemoveEnabled { get; set; }
  150. public bool SelectMultiple { get; set; }
  151. private FieldClass fieldMap;
  152. private string _ConditionName;
  153. public string ConditionName
  154. {
  155. get { return _ConditionName; }
  156. set
  157. {
  158. _ConditionName = value;
  159. fieldMap = FieldClass.Fields[value];
  160. }
  161. }
  162. public string ConditionText { get { return fieldMap.Title; } }
  163. private static List<CodeValueItem> BitCodes =
  164. new List<CodeValueItem>
  165. {
  166. new CodeValueItem { Id = 1, Value = "True", Code = "T" },
  167. new CodeValueItem { Id = 0, Value = "False", Code = "F" },
  168. };
  169. public void SetVisibility()
  170. {
  171. RightPanelVisible = true;
  172. TextVisible = false;
  173. NumberVisible = false;
  174. CodeVisible = false;
  175. CodesVisible = false;
  176. DateVisible = false;
  177. CodeData = null;
  178. ConditionName = ConditionName;
  179. CompareData = Comparisons().ToList();
  180. DivisionVisible = fieldMap.HasParam("Division");
  181. ProgramVisible = fieldMap.HasParam("Program");
  182. OrganizationVisible = fieldMap.HasParam("Organization");
  183. ScheduleVisible = fieldMap.HasParam("Schedule");
  184. CampusVisible = fieldMap.HasParam("Campus");
  185. OrgTypeVisible = fieldMap.HasParam("OrgType");
  186. DaysVisible = fieldMap.HasParam("Days");
  187. AgeVisible = fieldMap.HasParam("Age");
  188. SavedQueryVisible = fieldMap.HasParam("SavedQueryIdDesc");
  189. MinistryVisible = fieldMap.HasParam("Ministry");
  190. QuartersVisible = fieldMap.HasParam("Quarters");
  191. if (QuartersVisible)
  192. QuartersLabel = fieldMap.QuartersTitle;
  193. TagsVisible = fieldMap.HasParam("Tags");
  194. if (TagsVisible)
  195. {
  196. var cv = new CodeValueModel();
  197. TagData = ConvertToSelect(cv.UserTags(Util.UserPeopleId), "Code");
  198. }
  199. StartDateVisible = fieldMap.HasParam("StartDate");
  200. EndDateVisible = fieldMap.HasParam("EndDate");
  201. var cvctl = new CodeValueModel();
  202. switch (fieldMap.Type)
  203. {
  204. case FieldType.Bit:
  205. case FieldType.NullBit:
  206. CodeVisible = true;
  207. CodeData = ConvertToSelect(BitCodes, fieldMap.DataValueField);
  208. break;
  209. case FieldType.String:
  210. case FieldType.StringEqual:
  211. TextVisible = true;
  212. break;
  213. case FieldType.NullNumber:
  214. case FieldType.Number:
  215. NumberVisible = true;
  216. break;
  217. case FieldType.NullInteger:
  218. case FieldType.Integer:
  219. case FieldType.IntegerSimple:
  220. case FieldType.IntegerEqual:
  221. IntegerVisible = true;
  222. break;
  223. case FieldType.Code:
  224. case FieldType.CodeStr:
  225. CodeVisible = true;
  226. if (fieldMap.DataSource == "ExtraValues")
  227. CodeData = StandardExtraValues.ExtraValueCodes();
  228. else if (fieldMap.DataSource == "Campuses")
  229. CodeData = Campuses();
  230. else
  231. CodeData = ConvertToSelect(Util.CallMethod(cvctl, fieldMap.DataSource), fieldMap.DataValueField);
  232. break;
  233. case FieldType.Date:
  234. case FieldType.DateSimple:
  235. DateVisible = true;
  236. break;
  237. case FieldType.DateField:
  238. CodeVisible = true;
  239. CodeData = ConvertToSelect(Util.CallMethod(cvctl, fieldMap.DataSource), fieldMap.DataValueField);
  240. break;
  241. }
  242. var cc = Db.LoadQueryById(SelectedId);
  243. if (cc == null)
  244. return;
  245. if (fieldMap.Type == FieldType.Group)
  246. {
  247. CompareData = Comparisons().ToList();
  248. RightPanelVisible = false;
  249. UpdateEnabled = cc.IsGroup;
  250. return;
  251. }
  252. UpdateEnabled = !cc.IsGroup && !cc.IsFirst;
  253. AddToGroupEnabled = cc.IsGroup;
  254. AddEnabled = !cc.IsFirst;
  255. RemoveEnabled = !cc.IsFirst;
  256. }
  257. public static List<SelectListItem> ConvertToSelect(object items, string valuefield)
  258. {
  259. var list = items as IEnumerable<CodeValueItem>;
  260. List<SelectListItem> list2;
  261. switch (valuefield)
  262. {
  263. case "IdCode":
  264. list2 = list.Select(c => new SelectListItem { Text = c.Value, Value = c.IdCode }).ToList();
  265. break;
  266. case "Id":
  267. list2 = list.Select(c => new SelectListItem { Text = c.Value, Value = c.Id.ToString() }).ToList();
  268. break;
  269. case "Code":
  270. list2 = list.Select(c => new SelectListItem { Text = c.Value, Value = c.Code }).ToList();
  271. break;
  272. default:
  273. list2 = list.Select(c => new SelectListItem { Text = c.Value, Value = c.Value }).ToList();
  274. break;
  275. }
  276. if (list2.Count > 0)
  277. list2[0].Selected = true;
  278. return list2;
  279. }
  280. DateTime? DateParse(string s)
  281. {
  282. DateTime dt;
  283. if (DateTime.TryParse(s, out dt))
  284. return dt;
  285. return null;
  286. }
  287. int? IntParse(string s)
  288. {
  289. int i;
  290. if (int.TryParse(s, out i))
  291. return i;
  292. return null;
  293. }
  294. string DateString(DateTime? dt)
  295. {
  296. if (dt.HasValue)
  297. return dt.Value.ToShortDateString();
  298. return "";
  299. }
  300. private void UpdateCondition(QueryBuilderClause c)
  301. {
  302. c.Field = ConditionName;
  303. c.Comparison = Comparison;
  304. switch (c.FieldInfo.Type)
  305. {
  306. case FieldType.String:
  307. case FieldType.StringEqual:
  308. c.TextValue = TextValue;
  309. break;
  310. case FieldType.Integer:
  311. case FieldType.IntegerSimple:
  312. case FieldType.IntegerEqual:
  313. case FieldType.NullInteger:
  314. c.TextValue = IntegerValue;
  315. break;
  316. case FieldType.Number:
  317. case FieldType.NullNumber:
  318. c.TextValue = NumberValue;
  319. break;
  320. case FieldType.Date:
  321. case FieldType.DateSimple:
  322. c.DateValue = DateParse(DateValue);
  323. break;
  324. case FieldType.Code:
  325. case FieldType.CodeStr:
  326. case FieldType.DateField:
  327. case FieldType.Bit:
  328. case FieldType.NullBit:
  329. if (c.HasMultipleCodes && CodeValues != null)
  330. c.CodeIdValue = string.Join(";", CodeValues);
  331. else
  332. c.CodeIdValue = CodeValue;
  333. break;
  334. }
  335. c.Program = Program ?? 0;
  336. c.Division = Division ?? 0;
  337. c.Organization = Organization ?? 0;
  338. if (MinistryVisible)
  339. c.Program = Ministry ?? 0;
  340. c.Schedule = Schedule ?? 0;
  341. c.Campus = Campus ?? 0;
  342. c.OrgType = OrgType ?? 0;
  343. c.StartDate = DateParse(StartDate);
  344. c.EndDate = DateParse(EndDate);
  345. c.Days = Days.ToInt();
  346. c.Age = Age.ToInt();
  347. c.Quarters = Quarters;
  348. if (Tags != null)
  349. c.Tags = string.Join(";", Tags);
  350. c.SavedQueryIdDesc = SavedQueryDesc;
  351. Db.SubmitChanges();
  352. }
  353. public void EditCondition()
  354. {
  355. var c = Db.LoadQueryById(SelectedId);
  356. if (c == null)
  357. return;
  358. ConditionName = c.FieldInfo.Name;
  359. SetVisibility();
  360. Comparison = c.Comparison;
  361. switch (c.FieldInfo.Type)
  362. {
  363. case FieldType.String:
  364. case FieldType.StringEqual:
  365. TextValue = c.TextValue;
  366. break;
  367. case FieldType.Integer:
  368. case FieldType.IntegerSimple:
  369. case FieldType.IntegerEqual:
  370. case FieldType.NullInteger:
  371. IntegerValue = c.TextValue;
  372. break;
  373. case FieldType.Number:
  374. case FieldType.NullNumber:
  375. NumberValue = c.TextValue;
  376. break;
  377. case FieldType.Date:
  378. case FieldType.DateSimple:
  379. DateValue = DateString(c.DateValue);
  380. break;
  381. case FieldType.Code:
  382. case FieldType.CodeStr:
  383. case FieldType.DateField:
  384. case FieldType.Bit:
  385. case FieldType.NullBit:
  386. CodeValue = c.CodeIdValue;
  387. if (c.HasMultipleCodes && CodeValue.HasValue())
  388. {
  389. CodeValues = c.CodeIdValue.Split(';');
  390. foreach (var i in CodeData)
  391. i.Selected = CodeValues.Contains(i.Value);
  392. }
  393. break;
  394. }
  395. Program = c.Program;
  396. DivisionData = Divisions(Program).ToList();
  397. Division = c.Division;
  398. OrganizationData = Organizations(Division).ToList();
  399. Organization = c.Organization;
  400. Schedule = c.Schedule;
  401. Campus = c.Campus;
  402. OrgType = c.OrgType;
  403. StartDate = DateString(c.StartDate);
  404. EndDate = DateString(c.EndDate);
  405. SelectMultiple = c.HasMultipleCodes;
  406. AddToGroupEnabled = c.IsGroup;
  407. AddEnabled = !c.IsFirst;
  408. RemoveEnabled = !c.IsFirst;
  409. Days = c.Days.ToString();
  410. Age = c.Age.ToString();
  411. Quarters = c.Quarters;
  412. if (TagsVisible)
  413. {
  414. if (c.Tags != null)
  415. Tags = c.Tags.Split(';');
  416. var cv = new CodeValueModel();
  417. TagData = ConvertToSelect(cv.UserTags(Util.UserPeopleId), "Code");
  418. foreach (var i in TagData)
  419. i.Selected = Tags.Contains(i.Value);
  420. }
  421. if (MinistryVisible)
  422. Ministry = c.Program;
  423. SavedQueryDesc = c.SavedQueryIdDesc;
  424. }
  425. public void SetCodes()
  426. {
  427. SetVisibility();
  428. SelectMultiple = Comparison.EndsWith("OneOf");
  429. }
  430. private void NewCondition(QueryBuilderClause gc, int order)
  431. {
  432. var c = new QueryBuilderClause();
  433. c.ClauseOrder = order;
  434. gc.Clauses.Add(c);
  435. gc.ReorderClauses();
  436. UpdateCondition(c);
  437. }
  438. public void SaveQuery()
  439. {
  440. var saveto = Db.QueryBuilderClauses.FirstOrDefault(c =>
  441. (c.SavedBy == Util.UserName || c.SavedBy == "public") && c.Description == SavedQueryDesc);
  442. if (saveto == null)
  443. {
  444. saveto = new QueryBuilderClause();
  445. Db.QueryBuilderClauses.InsertOnSubmit(saveto);
  446. }
  447. saveto.CopyFromAll(Qb, DbUtil.Db); // save Qb on top of existing
  448. if (saveto.SavedBy != "public")
  449. saveto.SavedBy = Util.UserName;
  450. saveto.Description = SavedQueryDesc;
  451. saveto.IsPublic = IsPublic;
  452. Db.SubmitChanges();
  453. Description = SavedQueryDesc;
  454. }
  455. public void AddConditionToGroup()
  456. {
  457. var c = Db.LoadQueryById(SelectedId);
  458. NewCondition(c, c.MaxClauseOrder() + 1);
  459. }
  460. public void AddConditionAfterCurrent()
  461. {
  462. var c = Db.LoadQueryById(SelectedId);
  463. NewCondition(c.Parent, c.ClauseOrder + 1);
  464. }
  465. public void DeleteCondition()
  466. {
  467. var c = Db.LoadQueryById(SelectedId);
  468. if (c == null)
  469. return;
  470. SelectedId = c.Parent.QueryId;
  471. Db.DeleteQueryBuilderClauseOnSubmit(c);
  472. Db.SubmitChanges();
  473. EditCondition();
  474. }
  475. public void UpdateCondition()
  476. {
  477. var c = Db.LoadQueryById(SelectedId);
  478. if (c == null)
  479. return;
  480. UpdateCondition(c);
  481. }
  482. public void CopyAsNew()
  483. {
  484. var Qb = Db.LoadQueryById(SelectedId).Clone(DbUtil.Db);
  485. if (!Qb.IsGroup)
  486. {
  487. var g = new QueryBuilderClause();
  488. g.SetQueryType(QueryType.Group);
  489. g.SetComparisonType(CompareType.AllTrue);
  490. Qb.Parent = g;
  491. Qb = g;
  492. }
  493. Db.SubmitChanges();
  494. QueryId = Qb.QueryId;
  495. }
  496. public void InsertGroupAbove()
  497. {
  498. var cc = Db.LoadQueryById(SelectedId);
  499. var g = new QueryBuilderClause();
  500. g.SetQueryType(QueryType.Group);
  501. g.SetComparisonType(CompareType.AllTrue);
  502. g.ClauseOrder = cc.ClauseOrder;
  503. if (cc.IsFirst)
  504. cc.Parent = g;
  505. else
  506. {
  507. var currParent = cc.Parent;
  508. // find all clauses from cc down at same level
  509. var q = from c in cc.Parent.Clauses
  510. orderby c.ClauseOrder
  511. where c.ClauseOrder >= cc.ClauseOrder
  512. select c;
  513. foreach (var c in q)
  514. c.Parent = g; // change to new parent
  515. g.Parent = currParent;
  516. }
  517. if (cc.SavedBy.HasValue())
  518. {
  519. g.SavedBy = Util.UserName;
  520. g.Description = cc.Description;
  521. g.CreatedOn = cc.CreatedOn;
  522. cc.IsPublic = false;
  523. cc.Description = null;
  524. cc.SavedBy = null;
  525. }
  526. Db.SubmitChanges();
  527. if (g.IsFirst)
  528. {
  529. Qb = g;
  530. QueryId = g.QueryId;
  531. }
  532. }
  533. public IEnumerable<SelectListItem> Comparisons()
  534. {
  535. return from c in CompareClass.Comparisons
  536. where c.FieldType == fieldMap.Type
  537. select new SelectListItem { Text = c.CompType.ToString(), Value = c.CompType.ToString() };
  538. }
  539. public IEnumerable<SelectListItem> Schedules()
  540. {
  541. var q = from o in DbUtil.Db.Organizations
  542. let sc = o.OrgSchedules.FirstOrDefault() // SCHED
  543. where sc != null
  544. group o by new { ScheduleId = sc.ScheduleId ?? 10800, sc.MeetingTime } into g
  545. orderby g.Key.ScheduleId
  546. select new SelectListItem
  547. {
  548. Value = g.Key.ScheduleId.ToString(),
  549. Text = DbUtil.Db.GetScheduleDesc(g.Key.MeetingTime)
  550. };
  551. var list = q.ToList();
  552. list.Insert(0, new SelectListItem { Text = "(None)", Value = "-1" });
  553. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  554. return list;
  555. }
  556. public IEnumerable<SelectListItem> Campuses()
  557. {
  558. var q = from o in DbUtil.Db.Organizations
  559. where o.CampusId != null
  560. group o by o.CampusId into g
  561. orderby g.Key
  562. select new SelectListItem
  563. {
  564. Value = g.Key.ToString(),
  565. Text = g.First().Campu.Description
  566. };
  567. var list = q.ToList();
  568. list.Insert(0, new SelectListItem { Text = "(None)", Value = "-1" });
  569. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  570. return list;
  571. }
  572. public IEnumerable<SelectListItem> OrgTypes()
  573. {
  574. var q = from t in Db.OrganizationTypes
  575. orderby t.Code
  576. select new SelectListItem
  577. {
  578. Value = t.Id.ToString(),
  579. Text = t.Description
  580. };
  581. var list = q.ToList();
  582. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  583. return list;
  584. }
  585. public IEnumerable<SelectListItem> Programs()
  586. {
  587. var q = from t in Db.Programs
  588. orderby t.Name
  589. select new SelectListItem
  590. {
  591. Value = t.Id.ToString(),
  592. Text = t.Name
  593. };
  594. var list = q.ToList();
  595. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  596. return list;
  597. }
  598. public IEnumerable<SelectListItem> Divisions(int? progid)
  599. {
  600. var q = from div in Db.Divisions
  601. where div.ProgDivs.Any(d => d.ProgId == progid)
  602. orderby div.Name
  603. select new SelectListItem
  604. {
  605. Value = div.Id.ToString(),
  606. Text = div.Name
  607. };
  608. var list = q.ToList();
  609. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  610. return list;
  611. }
  612. public IEnumerable<SelectListItem> Organizations(int? divid)
  613. {
  614. var roles = Db.CurrentRoles();
  615. var q = from ot in Db.DivOrgs
  616. where ot.Organization.LimitToRole == null || roles.Contains(ot.Organization.LimitToRole)
  617. where ot.DivId == divid
  618. && (SqlMethods.DateDiffMonth(ot.Organization.OrganizationClosedDate, Util.Now) < 14
  619. || ot.Organization.OrganizationStatusId == 30)
  620. where (Util2.OrgMembersOnly == false && Util2.OrgLeadersOnly == false) || (ot.Organization.SecurityTypeId != 3)
  621. orderby ot.Organization.OrganizationStatusId, ot.Organization.OrganizationName
  622. select new SelectListItem
  623. {
  624. Value = ot.OrgId.ToString(),
  625. Text = CmsData.Organization.FormatOrgName(ot.Organization.OrganizationName,
  626. ot.Organization.LeaderName, ot.Organization.Location)
  627. };
  628. var list = q.ToList();
  629. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  630. return list;
  631. }
  632. private int level;
  633. public List<QueryClauseDisplay> ConditionList()
  634. {
  635. if (Qb == null)
  636. LoadScratchPad();
  637. level = 0;
  638. return ClauseAndSubs(new List<QueryClauseDisplay>(), Qb);
  639. }
  640. private List<QueryClauseDisplay> ClauseAndSubs(List<QueryClauseDisplay> list, QueryBuilderClause qc)
  641. {
  642. list.Add(new QueryClauseDisplay { Level = (level * 25), Clause = qc });
  643. level++;
  644. var q = qc.Clauses.OrderBy(c => c.ClauseOrder);
  645. foreach (var c in q)
  646. list = ClauseAndSubs(list, c);
  647. level--;
  648. return list;
  649. }
  650. public IEnumerable<CategoryClass> FieldCategories()
  651. {
  652. var q = from c in CategoryClass.Categories
  653. where c.Title != "Grouping"
  654. select c;
  655. return q;
  656. }
  657. public List<SelectListItem> SavedQueries()
  658. {
  659. var cv = new CodeValueModel();
  660. return ConvertToSelect(cv.UserQueries(), "Code");
  661. }
  662. public List<SelectListItem> Ministries()
  663. {
  664. var q = from t in Db.Ministries
  665. orderby t.MinistryDescription
  666. select new SelectListItem
  667. {
  668. Value = t.MinistryId.ToString(),
  669. Text = t.MinistryName
  670. };
  671. var list = q.ToList();
  672. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  673. return list;
  674. }
  675. private IQueryable<Person> query;
  676. public int FetchCount()
  677. {
  678. Db.SetNoLock();
  679. query = PersonQuery();
  680. count = query.Count();
  681. return count ?? 0;
  682. }
  683. public List<PeopleInfo> Results;
  684. public void PopulateResults()
  685. {
  686. query = PersonQuery();
  687. count = query.Count();
  688. query = ApplySort(query);
  689. query = query.Skip(StartRow).Take(PageSize.Value);
  690. Results = FetchPeopleList(query).ToList();
  691. }
  692. public IEnumerable<PeopleInfo> FetchPeopleList()
  693. {
  694. query = ApplySort(query);
  695. query = query.Skip(StartRow).Take(PageSize.Value);
  696. return FetchPeopleList(query);
  697. }
  698. public class MyClass
  699. {
  700. public int Id { get; set; }
  701. public int PeopleId { get; set; }
  702. }
  703. public Tag TagAllIds()
  704. {
  705. query = PersonQuery();
  706. var tag = Db.FetchOrCreateTag(Util.SessionId, Util.UserPeopleId, DbUtil.TagTypeId_Query);
  707. Db.TagAll(query, tag);
  708. return tag;
  709. }
  710. private IQueryable<Person> PersonQuery()
  711. {
  712. if (Qb == null)
  713. LoadScratchPad();
  714. Db.SetNoLock();
  715. var q = Db.People.Where(Qb.Predicate(Db));
  716. if (Qb.ParentsOf)
  717. return Db.PersonQueryParents(q);
  718. return q;
  719. }
  720. public void TagAll()
  721. {
  722. if (Qb == null)
  723. LoadScratchPad();
  724. Db.SetNoLock();
  725. var q = Db.People.Where(Qb.Predicate(Db));
  726. if (Qb.ParentsOf)
  727. q = Db.PersonQueryParents(q);
  728. Db.TagAll(q);
  729. }
  730. public void UnTagAll()
  731. {
  732. if (Qb == null)
  733. LoadScratchPad();
  734. Db.SetNoLock();
  735. var q = Db.People.Where(Qb.Predicate(Db));
  736. if (Qb.ParentsOf)
  737. q = Db.PersonQueryParents(q);
  738. Db.UnTagAll(q);
  739. }
  740. private IEnumerable<PeopleInfo> FetchPeopleList(IQueryable<Person> query)
  741. {
  742. if (query == null)
  743. {
  744. Db.SetNoLock();
  745. query = PersonQuery();
  746. count = query.Count();
  747. }
  748. var q = from p in query
  749. select new PeopleInfo
  750. {
  751. PeopleId = p.PeopleId,
  752. Name = p.Name,
  753. BirthDate = Util.FormatBirthday(p.BirthYear, p.BirthMonth, p.BirthDay),
  754. Address = p.PrimaryAddress,
  755. Address2 = p.PrimaryAddress2,
  756. CityStateZip = Util.FormatCSZ(p.PrimaryCity, p.PrimaryState, p.PrimaryZip),
  757. HomePhone = p.HomePhone,
  758. CellPhone = p.CellPhone,
  759. WorkPhone = p.WorkPhone,
  760. PhonePref = p.PhonePrefId,
  761. MemberStatus = p.MemberStatus.Description,
  762. Email = p.EmailAddress,
  763. BFTeacher = p.BFClass.LeaderName,
  764. BFTeacherId = p.BFClass.LeaderId,
  765. Employer = p.EmployerOther,
  766. Age = p.Age.ToString(),
  767. HasTag = p.Tags.Any(t => t.Tag.Name == TagName && t.Tag.PeopleId == TagOwner && t.Tag.TypeId == TagTypeId),
  768. };
  769. return q;
  770. }
  771. private IQueryable<Person> ApplySort(IQueryable<Person> q)
  772. {
  773. if (Sort == null)
  774. Sort = "Name";
  775. if (Direction != "desc")
  776. switch (Sort)
  777. {
  778. case "Name":
  779. q = from p in q
  780. orderby p.LastName,
  781. p.FirstName,
  782. p.PeopleId
  783. select p;
  784. break;
  785. case "Status":
  786. q = from p in q
  787. orderby p.MemberStatus.Code,
  788. p.LastName,
  789. p.FirstName,
  790. p.PeopleId
  791. select p;
  792. break;
  793. case "Address":
  794. q = from p in q
  795. orderby p.PrimaryState,
  796. p.PrimaryCity,
  797. p.PrimaryAddress,
  798. p.PeopleId
  799. select p;
  800. break;
  801. case "Fellowship Leader":
  802. q = from p in q
  803. orderby p.BFClass.LeaderName,
  804. p.LastName,
  805. p.FirstName,
  806. p.PeopleId
  807. select p;
  808. break;
  809. case "Employer":
  810. q = from p in q
  811. orderby p.EmployerOther,
  812. p.LastName,
  813. p.FirstName,
  814. p.PeopleId
  815. select p;
  816. break;
  817. case "Communication":
  818. q = from p in q
  819. orderby p.EmailAddress,
  820. p.LastName,
  821. p.FirstName,
  822. p.PeopleId
  823. select p;
  824. break;
  825. case "DOB":
  826. q = from p in q
  827. orderby p.BirthMonth, p.BirthDay,
  828. p.LastName, p.FirstName
  829. select p;
  830. break;
  831. }
  832. else
  833. switch (Sort)
  834. {
  835. case "Status":
  836. q = from p in q
  837. orderby p.MemberStatus.Code descending,
  838. p.LastName descending,
  839. p.FirstName descending,
  840. p.PeopleId descending
  841. select p;
  842. break;
  843. case "Address":
  844. q = from p in q
  845. orderby p.PrimaryState descending,
  846. p.PrimaryCity descending,
  847. p.PrimaryAddress descending,
  848. p.PeopleId descending
  849. select p;
  850. break;
  851. case "Name":
  852. q = from p in q
  853. orderby p.LastName descending,
  854. p.LastName descending,
  855. p.PeopleId descending
  856. select p;
  857. break;
  858. case "Fellowship Leader":
  859. q = from p in q
  860. orderby p.BFClass.LeaderName descending,
  861. p.LastName descending,
  862. p.FirstName descending,
  863. p.PeopleId descending
  864. select p;
  865. break;
  866. case "Employer":
  867. q = from p in q
  868. orderby p.EmployerOther descending,
  869. p.LastName descending,
  870. p.FirstName descending,
  871. p.PeopleId descending
  872. select p;
  873. break;
  874. case "Communication":
  875. q = from p in q
  876. orderby p.EmailAddress descending,
  877. p.LastName descending,
  878. p.FirstName descending,
  879. p.PeopleId descending
  880. select p;
  881. break;
  882. case "DOB":
  883. q = from p in q
  884. orderby p.BirthMonth descending, p.BirthDay descending,
  885. p.LastName descending, p.FirstName descending
  886. select p;
  887. break;
  888. }
  889. return q;
  890. }
  891. public Dictionary<string, string> Errors;
  892. #region Paging
  893. public bool ShowResults { get; set; }
  894. public string Sort { get; set; }
  895. public string Direction { get; set; }
  896. private int? _Page;
  897. public int? Page
  898. {
  899. get { return _Page ?? 1; }
  900. set { _Page = value; }
  901. }
  902. private int StartRow
  903. {
  904. get { return (Page.Value - 1) * PageSize.Value; }
  905. }
  906. public int? PageSize
  907. {
  908. get { return DbUtil.Db.UserPreference("PageSize", "10").ToInt(); }
  909. set
  910. {
  911. if (value.HasValue)
  912. DbUtil.Db.SetUserPreference("PageSize", value);
  913. }
  914. }
  915. private int? count;
  916. public int Count
  917. {
  918. get
  919. {
  920. return count ?? 0;
  921. }
  922. }
  923. public PagerModel pagerModel()
  924. {
  925. return new PagerModel
  926. {
  927. Page = Page.Value,
  928. PageSize = PageSize.Value,
  929. Action = "List",
  930. Controller = "Task",
  931. Count = Count,
  932. ToggleTarget = true
  933. };
  934. }
  935. #endregion
  936. }
  937. public class QueryClauseDisplay
  938. {
  939. public Unit Level { get; set; }
  940. public QueryBuilderClause Clause;
  941. }
  942. }