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

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

https://bitbucket.org/mahalowe/bvcms
C# | 971 lines | 946 code | 18 blank | 7 comment | 102 complexity | cbe41b2285d2dd6232ca31c16f699fce MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Apache-2.0, BSD-3-Clause, LGPL-2.1, MPL-2.0-no-copyleft-exception, AGPL-3.0
  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. public static string IdCode(object items, int id)
  281. {
  282. var list = items as IEnumerable<CodeValueItem>;
  283. var ret = (from v in list
  284. where v.Id == id
  285. select v.IdCode).Single();
  286. return ret;
  287. }
  288. DateTime? DateParse(string s)
  289. {
  290. DateTime dt;
  291. if (DateTime.TryParse(s, out dt))
  292. return dt;
  293. return null;
  294. }
  295. int? IntParse(string s)
  296. {
  297. int i;
  298. if (int.TryParse(s, out i))
  299. return i;
  300. return null;
  301. }
  302. string DateString(DateTime? dt)
  303. {
  304. if (dt.HasValue)
  305. return dt.Value.ToShortDateString();
  306. return "";
  307. }
  308. private void UpdateCondition(QueryBuilderClause c)
  309. {
  310. c.Field = ConditionName;
  311. c.Comparison = Comparison;
  312. switch (c.FieldInfo.Type)
  313. {
  314. case FieldType.String:
  315. case FieldType.StringEqual:
  316. c.TextValue = TextValue;
  317. break;
  318. case FieldType.Integer:
  319. case FieldType.IntegerSimple:
  320. case FieldType.IntegerEqual:
  321. case FieldType.NullInteger:
  322. c.TextValue = IntegerValue;
  323. break;
  324. case FieldType.Number:
  325. case FieldType.NullNumber:
  326. c.TextValue = NumberValue;
  327. break;
  328. case FieldType.Date:
  329. case FieldType.DateSimple:
  330. c.DateValue = DateParse(DateValue);
  331. break;
  332. case FieldType.Code:
  333. case FieldType.CodeStr:
  334. case FieldType.DateField:
  335. case FieldType.Bit:
  336. case FieldType.NullBit:
  337. if (c.HasMultipleCodes && CodeValues != null)
  338. c.CodeIdValue = string.Join(";", CodeValues);
  339. else
  340. c.CodeIdValue = CodeValue;
  341. break;
  342. }
  343. c.Program = Program ?? 0;
  344. c.Division = Division ?? 0;
  345. c.Organization = Organization ?? 0;
  346. if (MinistryVisible)
  347. c.Program = Ministry ?? 0;
  348. c.Schedule = Schedule ?? 0;
  349. c.Campus = Campus ?? 0;
  350. c.OrgType = OrgType ?? 0;
  351. c.StartDate = DateParse(StartDate);
  352. c.EndDate = DateParse(EndDate);
  353. c.Days = Days.ToInt();
  354. c.Age = Age.ToInt();
  355. c.Quarters = Quarters;
  356. if (Tags != null)
  357. c.Tags = string.Join(";", Tags);
  358. c.SavedQueryIdDesc = SavedQueryDesc;
  359. Db.SubmitChanges();
  360. }
  361. public void EditCondition()
  362. {
  363. var c = Db.LoadQueryById(SelectedId);
  364. if (c == null)
  365. return;
  366. ConditionName = c.FieldInfo.Name;
  367. SetVisibility();
  368. Comparison = c.Comparison;
  369. switch (c.FieldInfo.Type)
  370. {
  371. case FieldType.String:
  372. case FieldType.StringEqual:
  373. TextValue = c.TextValue;
  374. break;
  375. case FieldType.Integer:
  376. case FieldType.IntegerSimple:
  377. case FieldType.IntegerEqual:
  378. case FieldType.NullInteger:
  379. IntegerValue = c.TextValue;
  380. break;
  381. case FieldType.Number:
  382. case FieldType.NullNumber:
  383. NumberValue = c.TextValue;
  384. break;
  385. case FieldType.Date:
  386. case FieldType.DateSimple:
  387. DateValue = DateString(c.DateValue);
  388. break;
  389. case FieldType.Code:
  390. case FieldType.CodeStr:
  391. case FieldType.DateField:
  392. case FieldType.Bit:
  393. case FieldType.NullBit:
  394. CodeValue = c.CodeIdValue;
  395. if (c.HasMultipleCodes && CodeValue.HasValue())
  396. {
  397. CodeValues = c.CodeIdValue.Split(';');
  398. foreach (var i in CodeData)
  399. i.Selected = CodeValues.Contains(i.Value);
  400. }
  401. break;
  402. }
  403. Program = c.Program;
  404. DivisionData = Divisions(Program).ToList();
  405. Division = c.Division;
  406. OrganizationData = Organizations(Division).ToList();
  407. Organization = c.Organization;
  408. Schedule = c.Schedule;
  409. Campus = c.Campus;
  410. OrgType = c.OrgType;
  411. StartDate = DateString(c.StartDate);
  412. EndDate = DateString(c.EndDate);
  413. SelectMultiple = c.HasMultipleCodes;
  414. AddToGroupEnabled = c.IsGroup;
  415. AddEnabled = !c.IsFirst;
  416. RemoveEnabled = !c.IsFirst;
  417. Days = c.Days.ToString();
  418. Age = c.Age.ToString();
  419. Quarters = c.Quarters;
  420. if (TagsVisible)
  421. {
  422. if (c.Tags != null)
  423. Tags = c.Tags.Split(';');
  424. var cv = new CodeValueModel();
  425. TagData = ConvertToSelect(cv.UserTags(Util.UserPeopleId), "Code");
  426. foreach (var i in TagData)
  427. i.Selected = Tags.Contains(i.Value);
  428. }
  429. if (MinistryVisible)
  430. Ministry = c.Program;
  431. SavedQueryDesc = c.SavedQueryIdDesc;
  432. }
  433. public void SetCodes()
  434. {
  435. SetVisibility();
  436. SelectMultiple = Comparison.EndsWith("OneOf");
  437. }
  438. private void NewCondition(QueryBuilderClause gc, int order)
  439. {
  440. var c = new QueryBuilderClause();
  441. c.ClauseOrder = order;
  442. gc.Clauses.Add(c);
  443. gc.ReorderClauses();
  444. UpdateCondition(c);
  445. }
  446. public void SaveQuery()
  447. {
  448. var saveto = Db.QueryBuilderClauses.FirstOrDefault(c =>
  449. (c.SavedBy == Util.UserName || c.SavedBy == "public") && c.Description == SavedQueryDesc);
  450. if (saveto == null)
  451. {
  452. saveto = new QueryBuilderClause();
  453. Db.QueryBuilderClauses.InsertOnSubmit(saveto);
  454. }
  455. saveto.CopyFromAll(Qb, DbUtil.Db); // save Qb on top of existing
  456. if (saveto.SavedBy != "public")
  457. saveto.SavedBy = Util.UserName;
  458. saveto.Description = SavedQueryDesc;
  459. saveto.IsPublic = IsPublic;
  460. Db.SubmitChanges();
  461. Description = SavedQueryDesc;
  462. }
  463. public void AddConditionToGroup()
  464. {
  465. var c = Db.LoadQueryById(SelectedId);
  466. NewCondition(c, c.MaxClauseOrder() + 1);
  467. }
  468. public void AddConditionAfterCurrent()
  469. {
  470. var c = Db.LoadQueryById(SelectedId);
  471. NewCondition(c.Parent, c.ClauseOrder + 1);
  472. }
  473. public void DeleteCondition()
  474. {
  475. var c = Db.LoadQueryById(SelectedId);
  476. if (c == null)
  477. return;
  478. SelectedId = c.Parent.QueryId;
  479. Db.DeleteQueryBuilderClauseOnSubmit(c);
  480. Db.SubmitChanges();
  481. EditCondition();
  482. }
  483. public void UpdateCondition()
  484. {
  485. var c = Db.LoadQueryById(SelectedId);
  486. if (c == null)
  487. return;
  488. UpdateCondition(c);
  489. }
  490. public void CopyAsNew()
  491. {
  492. var Qb = Db.LoadQueryById(SelectedId).Clone(DbUtil.Db);
  493. if (!Qb.IsGroup)
  494. {
  495. var g = new QueryBuilderClause();
  496. g.SetQueryType(QueryType.Group);
  497. g.SetComparisonType(CompareType.AllTrue);
  498. Qb.Parent = g;
  499. Qb = g;
  500. }
  501. Db.SubmitChanges();
  502. QueryId = Qb.QueryId;
  503. }
  504. public void InsertGroupAbove()
  505. {
  506. var cc = Db.LoadQueryById(SelectedId);
  507. var g = new QueryBuilderClause();
  508. g.SetQueryType(QueryType.Group);
  509. g.SetComparisonType(CompareType.AllTrue);
  510. g.ClauseOrder = cc.ClauseOrder;
  511. if (cc.IsFirst)
  512. cc.Parent = g;
  513. else
  514. {
  515. var currParent = cc.Parent;
  516. // find all clauses from cc down at same level
  517. var q = from c in cc.Parent.Clauses
  518. orderby c.ClauseOrder
  519. where c.ClauseOrder >= cc.ClauseOrder
  520. select c;
  521. foreach (var c in q)
  522. c.Parent = g; // change to new parent
  523. g.Parent = currParent;
  524. }
  525. if (cc.SavedBy.HasValue())
  526. {
  527. g.SavedBy = Util.UserName;
  528. g.Description = cc.Description;
  529. g.CreatedOn = cc.CreatedOn;
  530. cc.IsPublic = false;
  531. cc.Description = null;
  532. cc.SavedBy = null;
  533. }
  534. Db.SubmitChanges();
  535. if (g.IsFirst)
  536. {
  537. Qb = g;
  538. QueryId = g.QueryId;
  539. }
  540. }
  541. public IEnumerable<SelectListItem> Comparisons()
  542. {
  543. return from c in CompareClass.Comparisons
  544. where c.FieldType == fieldMap.Type
  545. select new SelectListItem { Text = c.CompType.ToString(), Value = c.CompType.ToString() };
  546. }
  547. public IEnumerable<SelectListItem> Schedules()
  548. {
  549. var q = from o in DbUtil.Db.Organizations
  550. let sc = o.OrgSchedules.FirstOrDefault() // SCHED
  551. where sc != null
  552. group o by new { ScheduleId = sc.ScheduleId ?? 10800, sc.MeetingTime } into g
  553. orderby g.Key.ScheduleId
  554. select new SelectListItem
  555. {
  556. Value = g.Key.ScheduleId.ToString(),
  557. Text = DbUtil.Db.GetScheduleDesc(g.Key.MeetingTime)
  558. };
  559. var list = q.ToList();
  560. list.Insert(0, new SelectListItem { Text = "(None)", Value = "-1" });
  561. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  562. return list;
  563. }
  564. public IEnumerable<SelectListItem> Campuses()
  565. {
  566. var q = from o in DbUtil.Db.Organizations
  567. where o.CampusId != null
  568. group o by o.CampusId into g
  569. orderby g.Key
  570. select new SelectListItem
  571. {
  572. Value = g.Key.ToString(),
  573. Text = g.First().Campu.Description
  574. };
  575. var list = q.ToList();
  576. list.Insert(0, new SelectListItem { Text = "(None)", Value = "-1" });
  577. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  578. return list;
  579. }
  580. public IEnumerable<SelectListItem> OrgTypes()
  581. {
  582. var q = from t in Db.OrganizationTypes
  583. orderby t.Code
  584. select new SelectListItem
  585. {
  586. Value = t.Id.ToString(),
  587. Text = t.Description
  588. };
  589. var list = q.ToList();
  590. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  591. return list;
  592. }
  593. public IEnumerable<SelectListItem> Programs()
  594. {
  595. var q = from t in Db.Programs
  596. orderby t.Name
  597. select new SelectListItem
  598. {
  599. Value = t.Id.ToString(),
  600. Text = t.Name
  601. };
  602. var list = q.ToList();
  603. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  604. return list;
  605. }
  606. public IEnumerable<SelectListItem> Divisions(int? progid)
  607. {
  608. var q = from div in Db.Divisions
  609. where div.ProgDivs.Any(d => d.ProgId == progid)
  610. orderby div.Name
  611. select new SelectListItem
  612. {
  613. Value = div.Id.ToString(),
  614. Text = div.Name
  615. };
  616. var list = q.ToList();
  617. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  618. return list;
  619. }
  620. public IEnumerable<SelectListItem> Organizations(int? divid)
  621. {
  622. var roles = Db.CurrentRoles();
  623. var q = from ot in Db.DivOrgs
  624. where ot.Organization.LimitToRole == null || roles.Contains(ot.Organization.LimitToRole)
  625. where ot.DivId == divid
  626. && (SqlMethods.DateDiffMonth(ot.Organization.OrganizationClosedDate, Util.Now) < 14
  627. || ot.Organization.OrganizationStatusId == 30)
  628. where (Util2.OrgMembersOnly == false && Util2.OrgLeadersOnly == false) || (ot.Organization.SecurityTypeId != 3)
  629. orderby ot.Organization.OrganizationStatusId, ot.Organization.OrganizationName
  630. select new SelectListItem
  631. {
  632. Value = ot.OrgId.ToString(),
  633. Text = CmsData.Organization.FormatOrgName(ot.Organization.OrganizationName,
  634. ot.Organization.LeaderName, ot.Organization.Location)
  635. };
  636. var list = q.ToList();
  637. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  638. return list;
  639. }
  640. private int level;
  641. public List<QueryClauseDisplay> ConditionList()
  642. {
  643. if (Qb == null)
  644. LoadScratchPad();
  645. level = 0;
  646. return ClauseAndSubs(new List<QueryClauseDisplay>(), Qb);
  647. }
  648. private List<QueryClauseDisplay> ClauseAndSubs(List<QueryClauseDisplay> list, QueryBuilderClause qc)
  649. {
  650. list.Add(new QueryClauseDisplay { Level = (level * 25), Clause = qc });
  651. level++;
  652. var q = qc.Clauses.OrderBy(c => c.ClauseOrder);
  653. foreach (var c in q)
  654. list = ClauseAndSubs(list, c);
  655. level--;
  656. return list;
  657. }
  658. public IEnumerable<CategoryClass> FieldCategories()
  659. {
  660. var q = from c in CategoryClass.Categories
  661. where c.Title != "Grouping"
  662. select c;
  663. return q;
  664. }
  665. public List<SelectListItem> SavedQueries()
  666. {
  667. var cv = new CodeValueModel();
  668. return ConvertToSelect(cv.UserQueries(), "Code");
  669. }
  670. public List<SelectListItem> Ministries()
  671. {
  672. var q = from t in Db.Ministries
  673. orderby t.MinistryDescription
  674. select new SelectListItem
  675. {
  676. Value = t.MinistryId.ToString(),
  677. Text = t.MinistryName
  678. };
  679. var list = q.ToList();
  680. list.Insert(0, new SelectListItem { Text = "(not specified)", Value = "0" });
  681. return list;
  682. }
  683. private IQueryable<Person> query;
  684. public int FetchCount()
  685. {
  686. Db.SetNoLock();
  687. query = PersonQuery();
  688. count = query.Count();
  689. return count ?? 0;
  690. }
  691. public List<PeopleInfo> Results;
  692. public void PopulateResults()
  693. {
  694. query = PersonQuery();
  695. count = query.Count();
  696. query = ApplySort(query);
  697. query = query.Skip(StartRow).Take(PageSize.Value);
  698. Results = FetchPeopleList(query).ToList();
  699. }
  700. public IEnumerable<PeopleInfo> FetchPeopleList()
  701. {
  702. query = ApplySort(query);
  703. query = query.Skip(StartRow).Take(PageSize.Value);
  704. return FetchPeopleList(query);
  705. }
  706. public class MyClass
  707. {
  708. public int Id { get; set; }
  709. public int PeopleId { get; set; }
  710. }
  711. public Tag TagAllIds()
  712. {
  713. query = PersonQuery();
  714. var tag = Db.FetchOrCreateTag(Util.SessionId, Util.UserPeopleId, DbUtil.TagTypeId_Query);
  715. Db.TagAll(query, tag);
  716. return tag;
  717. }
  718. private IQueryable<Person> PersonQuery()
  719. {
  720. if (Qb == null)
  721. LoadScratchPad();
  722. Db.SetNoLock();
  723. var q = Db.People.Where(Qb.Predicate(Db));
  724. if (Qb.ParentsOf)
  725. return Db.PersonQueryParents(q);
  726. return q;
  727. }
  728. public void TagAll(Tag tag = null)
  729. {
  730. if (Qb == null)
  731. LoadScratchPad();
  732. Db.SetNoLock();
  733. var q = Db.People.Where(Qb.Predicate(Db));
  734. if (Qb.ParentsOf)
  735. q = Db.PersonQueryParents(q);
  736. if (tag != null)
  737. Db.TagAll(q, tag);
  738. else
  739. Db.TagAll(q);
  740. }
  741. public void UnTagAll()
  742. {
  743. if (Qb == null)
  744. LoadScratchPad();
  745. Db.SetNoLock();
  746. var q = Db.People.Where(Qb.Predicate(Db));
  747. if (Qb.ParentsOf)
  748. q = Db.PersonQueryParents(q);
  749. Db.UnTagAll(q);
  750. }
  751. private IEnumerable<PeopleInfo> FetchPeopleList(IQueryable<Person> query)
  752. {
  753. if (query == null)
  754. {
  755. Db.SetNoLock();
  756. query = PersonQuery();
  757. count = query.Count();
  758. }
  759. var q = from p in query
  760. select new PeopleInfo
  761. {
  762. PeopleId = p.PeopleId,
  763. Name = p.Name,
  764. BirthDate = Util.FormatBirthday(p.BirthYear, p.BirthMonth, p.BirthDay),
  765. Address = p.PrimaryAddress,
  766. Address2 = p.PrimaryAddress2,
  767. CityStateZip = Util.FormatCSZ(p.PrimaryCity, p.PrimaryState, p.PrimaryZip),
  768. HomePhone = p.HomePhone,
  769. CellPhone = p.CellPhone,
  770. WorkPhone = p.WorkPhone,
  771. PhonePref = p.PhonePrefId,
  772. MemberStatus = p.MemberStatus.Description,
  773. Email = p.EmailAddress,
  774. BFTeacher = p.BFClass.LeaderName,
  775. BFTeacherId = p.BFClass.LeaderId,
  776. Employer = p.EmployerOther,
  777. Age = p.Age.ToString(),
  778. HasTag = p.Tags.Any(t => t.Tag.Name == TagName && t.Tag.PeopleId == TagOwner && t.Tag.TypeId == TagTypeId),
  779. };
  780. return q;
  781. }
  782. private IQueryable<Person> ApplySort(IQueryable<Person> q)
  783. {
  784. if (Sort == null)
  785. Sort = "Name";
  786. if (Direction != "desc")
  787. switch (Sort)
  788. {
  789. case "Name":
  790. q = from p in q
  791. orderby p.LastName,
  792. p.FirstName,
  793. p.PeopleId
  794. select p;
  795. break;
  796. case "Status":
  797. q = from p in q
  798. orderby p.MemberStatus.Code,
  799. p.LastName,
  800. p.FirstName,
  801. p.PeopleId
  802. select p;
  803. break;
  804. case "Address":
  805. q = from p in q
  806. orderby p.PrimaryState,
  807. p.PrimaryCity,
  808. p.PrimaryAddress,
  809. p.PeopleId
  810. select p;
  811. break;
  812. case "Fellowship Leader":
  813. q = from p in q
  814. orderby p.BFClass.LeaderName,
  815. p.LastName,
  816. p.FirstName,
  817. p.PeopleId
  818. select p;
  819. break;
  820. case "Employer":
  821. q = from p in q
  822. orderby p.EmployerOther,
  823. p.LastName,
  824. p.FirstName,
  825. p.PeopleId
  826. select p;
  827. break;
  828. case "Communication":
  829. q = from p in q
  830. orderby p.EmailAddress,
  831. p.LastName,
  832. p.FirstName,
  833. p.PeopleId
  834. select p;
  835. break;
  836. case "DOB":
  837. q = from p in q
  838. orderby p.BirthMonth, p.BirthDay,
  839. p.LastName, p.FirstName
  840. select p;
  841. break;
  842. }
  843. else
  844. switch (Sort)
  845. {
  846. case "Status":
  847. q = from p in q
  848. orderby p.MemberStatus.Code descending,
  849. p.LastName descending,
  850. p.FirstName descending,
  851. p.PeopleId descending
  852. select p;
  853. break;
  854. case "Address":
  855. q = from p in q
  856. orderby p.PrimaryState descending,
  857. p.PrimaryCity descending,
  858. p.PrimaryAddress descending,
  859. p.PeopleId descending
  860. select p;
  861. break;
  862. case "Name":
  863. q = from p in q
  864. orderby p.LastName descending,
  865. p.LastName descending,
  866. p.PeopleId descending
  867. select p;
  868. break;
  869. case "Fellowship Leader":
  870. q = from p in q
  871. orderby p.BFClass.LeaderName descending,
  872. p.LastName descending,
  873. p.FirstName descending,
  874. p.PeopleId descending
  875. select p;
  876. break;
  877. case "Employer":
  878. q = from p in q
  879. orderby p.EmployerOther descending,
  880. p.LastName descending,
  881. p.FirstName descending,
  882. p.PeopleId descending
  883. select p;
  884. break;
  885. case "Communication":
  886. q = from p in q
  887. orderby p.EmailAddress descending,
  888. p.LastName descending,
  889. p.FirstName descending,
  890. p.PeopleId descending
  891. select p;
  892. break;
  893. case "DOB":
  894. q = from p in q
  895. orderby p.BirthMonth descending, p.BirthDay descending,
  896. p.LastName descending, p.FirstName descending
  897. select p;
  898. break;
  899. }
  900. return q;
  901. }
  902. public Dictionary<string, string> Errors;
  903. #region Paging
  904. public bool ShowResults { get; set; }
  905. public string Sort { get; set; }
  906. public string Direction { get; set; }
  907. private int? _Page;
  908. public int? Page
  909. {
  910. get { return _Page ?? 1; }
  911. set { _Page = value; }
  912. }
  913. private int StartRow
  914. {
  915. get { return (Page.Value - 1) * PageSize.Value; }
  916. }
  917. public int? PageSize
  918. {
  919. get { return DbUtil.Db.UserPreference("PageSize", "10").ToInt(); }
  920. set
  921. {
  922. if (value.HasValue)
  923. DbUtil.Db.SetUserPreference("PageSize", value);
  924. }
  925. }
  926. private int? count;
  927. public int Count
  928. {
  929. get
  930. {
  931. return count ?? 0;
  932. }
  933. }
  934. public PagerModel pagerModel()
  935. {
  936. return new PagerModel
  937. {
  938. Page = Page.Value,
  939. PageSize = PageSize.Value,
  940. Action = "List",
  941. Controller = "Task",
  942. Count = Count,
  943. ToggleTarget = true
  944. };
  945. }
  946. #endregion
  947. }
  948. public class QueryClauseDisplay
  949. {
  950. public Unit Level { get; set; }
  951. public QueryBuilderClause Clause;
  952. }
  953. }