MeetingMainViewController.swift 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. //
  2. // MeetingMainViewController.swift
  3. // O2Platform
  4. //
  5. // Created by 刘振兴 on 16/8/19.
  6. // Copyright © 2016年 zoneland. All rights reserved.
  7. //
  8. import UIKit
  9. import CVCalendar
  10. import Alamofire
  11. import AlamofireObjectMapper
  12. import SwiftyUserDefaults
  13. import CocoaLumberjack
  14. class MeetingMainViewController: UIViewController {
  15. struct Color {
  16. static let selectedText = UIColor.white
  17. static let text = UIColor.black
  18. static let textDisabled = UIColor.gray
  19. static let selectionBackground = UIColor(red: 0.2, green: 0.2, blue: 1.0, alpha: 1.0)
  20. static let sundayText = UIColor(red: 1.0, green: 0.2, blue: 0.2, alpha: 1.0)
  21. static let sundayTextDisabled = UIColor(red: 1.0, green: 0.6, blue: 0.6, alpha: 1.0)
  22. static let sundaySelectionBackground = sundayText
  23. }
  24. @IBOutlet weak var calendarMenuView: CVCalendarMenuView!
  25. @IBOutlet weak var calendarView: CVCalendarView!
  26. @IBOutlet weak var meetingTableView: ZLBaseTableView!
  27. var button:UIButton?
  28. var window:UIWindow?
  29. var headerTitle:String = ""
  30. /// 指定日期的会议列表
  31. var meetingsForDay:[Meeting] = []
  32. /// 指定月份的会议列表
  33. var meetingsForMonth:[Foundation.Date] = []
  34. override func viewDidLoad() {
  35. super.viewDidLoad()
  36. self.perform(#selector(MeetingMainViewController.createButton), with: nil, afterDelay: 1)
  37. self.calendarMenuView.delegate = self
  38. self.meetingTableView.delegate = self
  39. self.meetingTableView.dataSource = self
  40. self.loadData()
  41. }
  42. func loadData(){
  43. let cvDate = CVDate(date: Foundation.Date(),calendar: Calendar.current)
  44. self.loadMonthMeeting(cvDate.year, month: cvDate.month)
  45. self.loadTheDayMeeting(cvDate.year,month: cvDate.month,day: cvDate.day)
  46. }
  47. override func viewWillAppear(_ animated: Bool) {
  48. self.window?.isHidden = false
  49. }
  50. override func viewWillDisappear(_ animated: Bool) {
  51. self.window?.isHidden = true
  52. }
  53. override var preferredStatusBarStyle : UIStatusBarStyle {
  54. return .lightContent
  55. }
  56. func createButton(){
  57. let width = SCREEN_WIDTH
  58. let height = SCREEN_HEIGHT
  59. self.button = UIButton(frame: CGRect(x: 0,y: 0,width: 40,height: 40))
  60. self.button?.setImage(UIImage(named: "icon_add"), for: UIControlState())
  61. self.button?.addTarget(self, action: #selector(createAction), for: .touchUpInside)
  62. self.window = UIWindow(frame: CGRect(x: width - 60, y: height - 60, width: 40, height: 40))
  63. self.window?.windowLevel = UIWindowLevelAlert + 1
  64. self.window?.backgroundColor = UIColor.red
  65. self.window?.layer.cornerRadius = 20
  66. self.window?.layer.masksToBounds = true
  67. self.window?.addSubview(self.button!)
  68. self.window?.makeKeyAndVisible()
  69. }
  70. override func didReceiveMemoryWarning() {
  71. super.didReceiveMemoryWarning()
  72. // Dispose of any resources that can be recreated.
  73. }
  74. override func viewDidLayoutSubviews() {
  75. super.viewDidLayoutSubviews()
  76. calendarView.commitCalendarViewUpdate()
  77. calendarMenuView.commitMenuViewUpdate()
  78. }
  79. func createAction(){
  80. self.performSegue(withIdentifier: "showCreateMeetingSegue", sender: nil)
  81. }
  82. @IBAction func unCreateMeetingBackMain(_ sender:UIStoryboardSegue){
  83. DDLogDebug("create back")
  84. self.loadData()
  85. }
  86. @IBAction func openAcceptMeetingList(_ sender: UIBarButtonItem) {
  87. self.performSegue(withIdentifier: "showWaitAcceptMeetingSegue", sender: nil)
  88. }
  89. func loadMonthMeeting(_ year:Int,month:Int){
  90. self.title = "\(year)年\(month)月"
  91. self.meetingsForMonth.removeAll(keepingCapacity: true)
  92. let year = StringPrefix(year)
  93. let month = StringPrefix(month)
  94. let url = AppDelegate.o2Collect.generateURLWithAppContextKey(MeetingContext.meetingContextKey, query: MeetingContext.meetingListYearMonthQuery, parameter: ["##year##":year as AnyObject,"##month##":month as AnyObject])
  95. DDLogDebug("monthURL = \(String(describing: url))")
  96. Alamofire.request(url!,method:.get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseArray(keyPath: "data") { (response:DataResponse<[Meeting]>) in
  97. switch response.result {
  98. case .success(let meetings):
  99. self.meetingsForMonth.removeAll(keepingCapacity: true)
  100. meetings.forEachEnumerated({(index,meeting) in
  101. let meetingDate = SharedDateUtil.dateFromString(string: meeting.startTime!, withFormat: SharedDateUtil.kNSDateHelperFormatSQLDateWithTime)
  102. self.meetingsForMonth.append(meetingDate as Date)
  103. })
  104. DispatchQueue.main.async {
  105. self.calendarView.contentController.refreshPresentedMonth()
  106. }
  107. // self.calendarView.commitCalendarViewUpdate()
  108. case .failure(let err):
  109. DDLogError(err.localizedDescription)
  110. }
  111. }
  112. }
  113. func loadTheDayMeeting(_ year:Int,month:Int,day:Int){
  114. let year = StringPrefix(year)
  115. let month = StringPrefix(month)
  116. let day = StringPrefix(day)
  117. self.meetingTableView.emptyTitle = "\(month)月\(day)日没有需要参加的会议"
  118. self.headerTitle = "\(year)年\(month)月\(day)日 会议列表"
  119. let url = AppDelegate.o2Collect.generateURLWithAppContextKey(MeetingContext.meetingContextKey, query: MeetingContext.meetingListYearMonthDayQuery, parameter: ["##year##":year as AnyObject,"##month##":month as AnyObject,"##day##":day as AnyObject])
  120. Alamofire.request(url!,method:.get, parameters: nil, encoding:JSONEncoding.default, headers: nil).responseArray(keyPath:"data") { (response:DataResponse<[Meeting]>) in
  121. switch response.result {
  122. case .success(let meetings):
  123. self.meetingsForDay.removeAll()
  124. self.meetingsForDay.append(contentsOf: meetings)
  125. self.meetingTableView.reloadData()
  126. ProgressHUD.showSuccess("加载完成")
  127. case .failure( let err):
  128. DDLogError(err.localizedDescription)
  129. ProgressHUD.showError("加载失败")
  130. }
  131. }
  132. }
  133. func StringPrefix(_ theNumber:Int) -> String{
  134. if theNumber >= 10 {
  135. return String(theNumber)
  136. }else{
  137. return "0"+String(theNumber)
  138. }
  139. }
  140. @IBAction func backToSuper(_ sender: UIBarButtonItem) {
  141. let backType = Defaults[.appBackType]
  142. if backType == 1 {
  143. self.performSegue(withIdentifier: "backToMain", sender: nil)
  144. }else if backType == 2 {
  145. self.performSegue(withIdentifier: "backToApps", sender: nil)
  146. }
  147. }
  148. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  149. if segue.identifier == "showUpdateMeetingSegue" {
  150. let destVC = segue.destination as! MeetingUpdateViewController
  151. destVC.meeting = sender as? Meeting
  152. }
  153. }
  154. }
  155. // MARK: - 表格数据源及操作代理实现 UITableViewDelegate,UITableViewDataSource
  156. extension MeetingMainViewController:UITableViewDelegate,UITableViewDataSource{
  157. func numberOfSections(in tableView: UITableView) -> Int {
  158. return 1
  159. }
  160. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  161. return self.meetingsForDay.count
  162. }
  163. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  164. let cell = tableView.dequeueReusableCell(withIdentifier: "MeetingListItemCell", for: indexPath) as! MeetingListItemCell
  165. let meeting = self.meetingsForDay[(indexPath as NSIndexPath).row]
  166. cell.meeting = meeting
  167. return cell
  168. }
  169. func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
  170. return self.headerTitle
  171. }
  172. func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
  173. let headerView = UIView(frame: CGRect(x: 0,y: 0,width: SCREEN_WIDTH,height: 20))
  174. let titleLabel = UILabel(frame: headerView.frame)
  175. titleLabel.text = self.headerTitle
  176. titleLabel.textColor = UIColor.white
  177. titleLabel.font = UIFont.boldSystemFont(ofSize: 14)
  178. titleLabel.backgroundColor = RGB(271, g: 71, b: 71)
  179. headerView.addSubview(titleLabel)
  180. return headerView
  181. }
  182. func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
  183. return 20.0
  184. }
  185. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  186. let meeting = self.meetingsForDay[(indexPath as NSIndexPath).row]
  187. self.performSegue(withIdentifier: "showUpdateMeetingSegue", sender: meeting)
  188. }
  189. }
  190. extension MeetingMainViewController:CVCalendarViewDelegate {
  191. func presentationMode() -> CalendarMode {
  192. return .monthView
  193. }
  194. func didShowNextMonthView(_ date: Foundation.Date) {
  195. DDLogDebug("didShowNextMonthView\(date.description)")
  196. let cal = Calendar.current
  197. let theDate = (cal as NSCalendar).date(byAdding: .month, value: 0, to: date, options: [])
  198. DDLogDebug("didShowNextMonthView theDate\(theDate!.description)")
  199. //let cvDate = CVDate(date:theDate!)
  200. let cvDate = CVDate(date: theDate!, calendar: Calendar.current)
  201. self.loadMonthMeeting(cvDate.year,month: cvDate.month)
  202. }
  203. func didShowPreviousMonthView(_ date: Foundation.Date) {
  204. DDLogDebug("didShowPreviousMonthView\(date.description)")
  205. let cal = Calendar.current
  206. let theDate = (cal as NSCalendar).date(byAdding: .month, value: 0, to: date, options: [])
  207. DDLogDebug("didShowPreviousMonthView theDate\(theDate!.description)")
  208. let cvDate = CVDate(date:theDate!,calendar: Calendar.current)
  209. self.loadMonthMeeting(cvDate.year,month: cvDate.month)
  210. }
  211. func shouldShowWeekdaysOut() -> Bool {
  212. return true
  213. }
  214. func shouldAnimateResizing() -> Bool {
  215. return true // Default value is true
  216. }
  217. func shouldSelectDayView(_ dayView: DayView) -> Bool {
  218. //return arc4random_uniform(3) == 0 ? true : false
  219. return true
  220. }
  221. func didSelectDayView(_ dayView: CVCalendarDayView, animationDidFinish: Bool) {
  222. print("\(dayView.date.commonDescription) is selected!")
  223. self.loadTheDayMeeting(dayView.date.year,month: dayView.date.month,day: dayView.date.day)
  224. }
  225. func topMarker(shouldDisplayOnDayView dayView: CVCalendarDayView) -> Bool {
  226. return true
  227. }
  228. func dotMarker(shouldShowOnDayView dayView: CVCalendarDayView) -> Bool {
  229. let dayDate = dayView.date
  230. let year = dayDate?.year
  231. let month = dayDate?.month
  232. let day = dayDate?.day
  233. return self.meetingsForMonth.contains { (tDate:Foundation.Date) -> Bool in
  234. let cvDate = CVDate(date: tDate,calendar: Calendar.current)
  235. if year == cvDate.year && month == cvDate.month && day == cvDate.day {
  236. return true
  237. }else {
  238. return false
  239. }
  240. }
  241. }
  242. func dotMarker(colorOnDayView dayView: CVCalendarDayView) -> [UIColor] {
  243. let color = RGB(251, g: 71, b: 71)
  244. return [color]
  245. //
  246. // let red = CGFloat(arc4random_uniform(600) / 255)
  247. // let green = CGFloat(arc4random_uniform(600) / 255)
  248. // let blue = CGFloat(arc4random_uniform(600) / 255)
  249. //
  250. // let color = UIColor(red: red, green: green, blue: blue, alpha: 1)
  251. //
  252. // let numberOfDots = Int(arc4random_uniform(3) + 1)
  253. // switch(numberOfDots) {
  254. // case 2:
  255. // return [color, color]
  256. // case 3:
  257. // return [color, color, color]
  258. // default:
  259. // return [color] // return 1 dot
  260. // }
  261. }
  262. func dotMarker(shouldMoveOnHighlightingOnDayView dayView: CVCalendarDayView) -> Bool {
  263. return true
  264. }
  265. func dotMarker(sizeOnDayView dayView: DayView) -> CGFloat {
  266. return 13
  267. }
  268. func selectionViewPath() -> ((CGRect) -> (UIBezierPath)) {
  269. return { UIBezierPath(rect: CGRect(x: 0, y: 0, width: $0.width, height: $0.height)) }
  270. }
  271. func shouldShowCustomSingleSelection() -> Bool {
  272. return false
  273. }
  274. func preliminaryView(viewOnDayView dayView: DayView) -> UIView {
  275. let circleView = CVAuxiliaryView(dayView: dayView, rect: dayView.bounds, shape: CVShape.circle)
  276. circleView.fillColor = .colorFromCode(0xCCCCCC)
  277. return circleView
  278. }
  279. func preliminaryView(shouldDisplayOnDayView dayView: DayView) -> Bool {
  280. if (dayView.isCurrentDay) {
  281. return true
  282. }
  283. return false
  284. }
  285. func supplementaryView(viewOnDayView dayView: DayView) -> UIView {
  286. let π = Double.pi
  287. let ringSpacing: CGFloat = 3.0
  288. let ringInsetWidth: CGFloat = 1.0
  289. let ringVerticalOffset: CGFloat = 1.0
  290. var ringLayer: CAShapeLayer!
  291. let ringLineWidth: CGFloat = 4.0
  292. let ringLineColour: UIColor = UIColor.blue
  293. let newView = UIView(frame: dayView.bounds)
  294. let diameter: CGFloat = (newView.bounds.width) - ringSpacing
  295. let radius: CGFloat = diameter / 2.0
  296. let rect = CGRect(x: newView.frame.midX-radius, y: newView.frame.midY-radius-ringVerticalOffset, width: diameter, height: diameter)
  297. ringLayer = CAShapeLayer()
  298. newView.layer.addSublayer(ringLayer)
  299. ringLayer.fillColor = nil
  300. ringLayer.lineWidth = ringLineWidth
  301. ringLayer.strokeColor = ringLineColour.cgColor
  302. let ringLineWidthInset: CGFloat = CGFloat(ringLineWidth/2.0) + ringInsetWidth
  303. let ringRect: CGRect = rect.insetBy(dx: ringLineWidthInset, dy: ringLineWidthInset)
  304. let centrePoint: CGPoint = CGPoint(x: ringRect.midX, y: ringRect.midY)
  305. let startAngle: CGFloat = CGFloat(-π/2.0)
  306. let endAngle: CGFloat = CGFloat(π * 2.0) + startAngle
  307. let ringPath: UIBezierPath = UIBezierPath(arcCenter: centrePoint, radius: ringRect.width/2.0, startAngle: startAngle, endAngle: endAngle, clockwise: true)
  308. ringLayer.path = ringPath.cgPath
  309. ringLayer.frame = newView.layer.bounds
  310. return newView
  311. }
  312. func supplementaryView(shouldDisplayOnDayView dayView: DayView) -> Bool {
  313. if (Int(arc4random_uniform(3)) == 1) {
  314. return false
  315. }
  316. return false
  317. }
  318. func dayOfWeekTextColor(by weekday: Weekday) -> UIColor {
  319. return weekday == .sunday ? UIColor(red: 1.0, green: 0.5, blue: 0.5, alpha: 1.0) : UIColor.white
  320. }
  321. func dayOfWeekBackGroundColor() -> UIColor {
  322. return UIColor.orange
  323. }
  324. }
  325. extension MeetingMainViewController:CVCalendarMenuViewDelegate{
  326. func dayOfWeekTextColor() -> UIColor {
  327. return RGB(12, g: 12, b: 12)
  328. }
  329. func weekdaySymbolType() -> WeekdaySymbolType {
  330. return .veryShort
  331. }
  332. func dayOfWeekFont() -> UIFont {
  333. return UIFont.systemFont(ofSize: 14)
  334. }
  335. func dayOfWeekTextUppercase() -> Bool {
  336. return true
  337. }
  338. func firstWeekday() -> Weekday {
  339. return .sunday
  340. }
  341. }
  342. extension MeetingMainViewController: CVCalendarViewAppearanceDelegate {
  343. func dayLabelPresentWeekdayInitallyBold() -> Bool {
  344. return false
  345. }
  346. func spaceBetweenDayViews() -> CGFloat {
  347. return 2
  348. }
  349. func dayLabelWeekdayFont() -> UIFont {
  350. return UIFont.systemFont(ofSize: 14)
  351. }
  352. }