alqindiirsyam преди 2 години
родител
ревизия
3a37a15cce

+ 1 - 14
appbuilder-ios/NexilisLite/NexilisLite/Resource/Palio.storyboard

@@ -2277,18 +2277,7 @@
                             <outlet property="delegate" destination="R2K-MM-fCQ" id="KOo-dR-6oe"/>
                         </connections>
                     </tableView>
-                    <navigationItem key="navigationItem" title="Broadcast Message" id="Ruj-Ub-Jyk">
-                        <barButtonItem key="leftBarButtonItem" title="Cancel" id="dTj-9H-wyQ">
-                            <connections>
-                                <action selector="didTapCancelWithSender:" destination="R2K-MM-fCQ" id="SKJ-Py-iRZ"/>
-                            </connections>
-                        </barButtonItem>
-                        <barButtonItem key="rightBarButtonItem" title="Done" id="GlB-rP-5hM">
-                            <connections>
-                                <action selector="submitBroadcast:" destination="R2K-MM-fCQ" id="cF5-iP-OQE"/>
-                            </connections>
-                        </barButtonItem>
-                    </navigationItem>
+                    <navigationItem key="navigationItem" title="Broadcast Message" id="Ruj-Ub-Jyk"/>
                     <connections>
                         <outlet property="addMemberButton" destination="jXj-wl-ncj" id="JLn-Wf-brn"/>
                         <outlet property="attachmentLabel" destination="9Up-Gk-VJQ" id="3rQ-El-iU7"/>
@@ -2298,11 +2287,9 @@
                         <outlet property="broadcastTypeTitle" destination="vy3-7B-AVq" id="bbs-Sb-12O"/>
                         <outlet property="broadcastVariantLabel" destination="eql-YM-OUH" id="drB-OB-paa"/>
                         <outlet property="broadcastVariantTitle" destination="lpV-Iz-jU7" id="pwz-Nk-Oyl"/>
-                        <outlet property="cancelButton" destination="dTj-9H-wyQ" id="IPh-TW-OzV"/>
                         <outlet property="clearAttachButton" destination="6bK-gT-tMC" id="G29-gZ-5K7"/>
                         <outlet property="documentLabel" destination="LTH-tR-4Sf" id="aGl-R7-IrL"/>
                         <outlet property="documentPreview" destination="xJo-k5-w4m" id="Gi1-V9-ur2"/>
-                        <outlet property="doneButton" destination="GlB-rP-5hM" id="lDo-BG-ZGh"/>
                         <outlet property="endTimeCell" destination="f0m-TO-UFt" id="XDa-zB-vuF"/>
                         <outlet property="endTimePicker" destination="7sf-CE-Azt" id="ZTo-r6-nGx"/>
                         <outlet property="endTimeTitle" destination="4av-J4-1eW" id="RO1-dw-qvk"/>

+ 8 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/CoreMessage_TMessageBank.swift

@@ -2397,4 +2397,12 @@ public class CoreMessage_TMessageBank {
         return tmessage;
     }
     
+    public static func pullGroupNoMember() -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.GET_BATCH_GROUP_NO_MEMBERS
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        return tmessage
+    }
+    
 }

+ 3 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/CoreMessage_TMessageCode.swift

@@ -392,6 +392,7 @@ public class CoreMessage_TMessageCode {
     public static let INIT_BATCH_BUDDY = "IBB";
     public static let INIT_FOLLOW = "IBF";
     public static let INIT_BATCH_GROUP = "IBG";
+    public static let INIT_BATCH_GROUP_NO_MEMBERS = "GNM";
     public static let INIT_BATCH_TOPIC = "IBT";
     public static let INIT_PREFS = "ITT";
     public static let INIT_FLAG_FINISH = "IFF";
@@ -760,4 +761,6 @@ public class CoreMessage_TMessageCode {
     public static let SS_ACCEPT_INCOMING = 124;
     public static let SS_REJECT_INCOMING = 125;
     public static let SS_END = 128;
+    
+    public static let GET_BATCH_GROUP_NO_MEMBERS = "GGNM";
 }

+ 23 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/Database.swift

@@ -417,6 +417,29 @@ public class Database {
         "'name' text," +
         "'parent' text," +
         "'level' text)", values: nil)
+        
+        try fmdb.executeUpdate("CREATE TABLE IF NOT EXISTS 'GROUP_NM' (" +
+                                "'_id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
+                                "'group_id' text NOT NULL UNIQUE," +
+                                "'f_name' text," +
+                                "'scope_id' text," +
+                                "'image_id' TEXT," +
+                                "'quote' text," +
+                                "'last_update' text," +
+                                "'created_by' text," +
+                                "'created_date' text," +
+                                "'ex_block' TEXT DEFAULT (0)," +
+                                "'folder_id' TEXT," +
+                                "'chat_modifier' INTEGER DEFAULT 1," +
+                                "'group_type' INTEGER DEFAULT 0," +
+                                "'parent' text," +
+                                "'level' text," +
+                                "'muted' INTEGER DEFAULT 0," +
+                                "'is_open' INTEGER DEFAULT 0," +
+                                "'official' INTEGER DEFAULT 0," +
+                                "'level_edu' INTEGER DEFAULT -1," +
+                                "'materi_edu' INTEGER DEFAULT -1," +
+                                "'is_education' INTEGER DEFAULT 0)", values: nil)
     }
     
     public func executes(fmdb: FMDatabase, queries: [String]) {

+ 114 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/IncomingThread.swift

@@ -66,6 +66,8 @@ class IncomingThread {
             deleteBuddy(message: message)
         } else if message.getCode() == CoreMessage_TMessageCode.INIT_BATCH_GROUP {
             onInitGroupInfoBatch(message: message)
+        } else if message.getCode() == CoreMessage_TMessageCode.INIT_BATCH_GROUP_NO_MEMBERS {
+            onInitGroupInfoBatchNoMember(message: message)
         } else if message.getCode() == CoreMessage_TMessageCode.INIT_BATCH_TOPIC {
             onInitForumInfoBatch(message: message)
         } else if message.getCode() == CoreMessage_TMessageCode.UPLOAD_FILE {
@@ -167,6 +169,8 @@ class IncomingThread {
             saveWorkingArea(message: message)
         } else if message.getCode() == CoreMessage_TMessageCode.ASKING_FOR_END_CALL {
             askingForEndCall(message: message)
+        } else if message.getCode() == CoreMessage_TMessageCode.GET_BATCH_GROUP_NO_MEMBERS {
+            pushGroupNoMembers(message: message)
         } else {
             print("unprocessed code", message.getCode())
             ack(message: message)
@@ -976,6 +980,79 @@ class IncomingThread {
         }
     }
     
+    private func pushGroupNoMembers(message: TMessage) -> Void {
+        let data  = message.getBody(key: CoreMessage_TMessageKey.DATA)
+        if !data.isEmpty {
+            if let jsonArray = try! JSONSerialization.jsonObject(with: data.data(using: String.Encoding.utf8)!, options: JSONSerialization.ReadingOptions()) as? [AnyObject] {
+                Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                    do {
+                        for json in jsonArray {
+                            let group_id = CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.GROUP_ID)
+                            _ = try Database.shared.insertRecord(fmdb: fmdb, table: "GROUP_NM", cvalues: [
+                                "group_id" : group_id,
+                                "f_name" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.GROUP_NAME),
+                                "scope_id" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.MESSAGE_SCOPE_ID),
+                                "image_id": CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.THUMB_ID),
+                                "quote": CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.QUOTE),
+                                "last_update" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.LAST_UPDATE),
+                                "created_by" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.CREATED_BY),
+                                "created_date" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.CREATED_DATE),
+                                "ex_block" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.BLOCK),
+                                "folder_id" : "",
+                                "chat_modifier" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.CHAT_MODIFIER),
+                                "group_type" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.IS_ORGANIZATION),
+                                "parent" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.PARENT_ID),
+                                "level" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.LEVEL),
+                                "is_open" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.IS_OPEN),
+                                "official" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.OFFICIAL_ACCOUNT),
+                                "level_edu" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.LEVEL_EDU),
+                                "materi_edu" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.MATERI_EDU),
+                                "is_education" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.IS_EDUCATION)
+                            ], replace: true)
+                        }
+                        ack(message: message)
+                    } catch {
+                        rollback.pointee = true
+                        print(error)
+                    }
+                })
+            }
+        } else {
+            let group_id = message.getBody(key: CoreMessage_TMessageKey.GROUP_ID)
+            Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                do {
+                    let result = try Database.shared.insertRecord(fmdb: fmdb, table: "GROUP_NM", cvalues: [
+                        "group_id" : group_id,
+                        "f_name" : message.getBody(key: CoreMessage_TMessageKey.GROUP_NAME),
+                        "scope_id" : message.getBody(key: CoreMessage_TMessageKey.MESSAGE_SCOPE_ID),
+                        "image_id": message.getBody(key: CoreMessage_TMessageKey.THUMB_ID),
+                        "quote": message.getBody(key: CoreMessage_TMessageKey.QUOTE),
+                        "last_update" : message.getBody(key: CoreMessage_TMessageKey.LAST_UPDATE),
+                        "created_by" : message.getBody(key: CoreMessage_TMessageKey.CREATED_BY),
+                        "created_date" : message.getBody(key: CoreMessage_TMessageKey.CREATED_DATE),
+                        "ex_block" : message.getBody(key: CoreMessage_TMessageKey.BLOCK),
+                        "folder_id" : "",
+                        "chat_modifier" : message.getBody(key: CoreMessage_TMessageKey.CHAT_MODIFIER),
+                        "group_type" : message.getBody(key: CoreMessage_TMessageKey.IS_ORGANIZATION),
+                        "parent" : message.getBody(key: CoreMessage_TMessageKey.PARENT_ID),
+                        "level" : message.getBody(key: CoreMessage_TMessageKey.LEVEL),
+                        "is_open" : message.getBody(key: CoreMessage_TMessageKey.IS_OPEN),
+                        "official" : message.getBody(key: CoreMessage_TMessageKey.OFFICIAL_ACCOUNT),
+                        "level_edu" : message.getBody(key: CoreMessage_TMessageKey.LEVEL_EDU),
+                        "materi_edu" : message.getBody(key: CoreMessage_TMessageKey.MATERI_EDU),
+                        "is_education" : message.getBody(key: CoreMessage_TMessageKey.IS_EDUCATION)
+                    ], replace: true)
+                    if result > 0 {
+                        ack(message: message)
+                    }
+                } catch {
+                    rollback.pointee = true
+                    print(error)
+                }
+            })
+        }
+    }
+    
     private func receiveMessage(message: TMessage) -> Void {
         let message_id = message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)
         guard let _ = UserDefaults.standard.string(forKey: "status") else {
@@ -1361,6 +1438,43 @@ class IncomingThread {
         }
     }
     
+    private func onInitGroupInfoBatchNoMember(message: TMessage) -> Void {
+        let dataGroup  = message.getBody(key: CoreMessage_TMessageKey.DATA)
+        if let jsonArray = try! JSONSerialization.jsonObject(with: dataGroup.data(using: String.Encoding.utf8)!, options: JSONSerialization.ReadingOptions()) as? [AnyObject] {
+            Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                do {
+                    for json in jsonArray {
+                        _ = try Database.shared.insertRecord(fmdb: fmdb, table: "GROUP_NM", cvalues: [
+                            "group_id" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.GROUP_ID),
+                            "f_name" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.GROUP_NAME),
+                            "scope_id" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.MESSAGE_SCOPE_ID),
+                            "image_id": CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.THUMB_ID),
+                            "quote": CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.QUOTE),
+                            "last_update" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.LAST_UPDATE),
+                            "created_by" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.CREATED_BY),
+                            "created_date" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.CREATED_DATE),
+                            "ex_block" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.BLOCK),
+                            "folder_id" : "",
+                            "chat_modifier" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.CHAT_MODIFIER),
+                            "group_type" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.IS_ORGANIZATION),
+                            "parent" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.PARENT_ID),
+                            "level" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.LEVEL),
+                            "is_open" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.IS_OPEN),
+                            "official" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.OFFICIAL_ACCOUNT),
+                            "level_edu" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.LEVEL_EDU),
+                            "materi_edu" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.MATERI_EDU),
+                            "is_education" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.IS_EDUCATION)
+                        ], replace: true)
+                    }
+                    ack(message: message)
+                } catch {
+                    rollback.pointee = true
+                    print(error)
+                }
+            })
+        }
+    }
+    
     private func onInitForumInfoBatch(message: TMessage, with isDelegate: Bool = false) -> Void {
         let dataForum  = message.getBody(key: CoreMessage_TMessageKey.DATA)
         if let jsonArray = try! JSONSerialization.jsonObject(with: dataForum.data(using: String.Encoding.utf8)!, options: JSONSerialization.ReadingOptions()) as? [AnyObject] {

+ 81 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/Model/Group_NM.swift

@@ -0,0 +1,81 @@
+//
+//  Group_NM.swift
+//  NexilisLite
+//
+//  Created by Akhmad Al Qindi Irsyam on 06/07/23.
+//
+
+import Foundation
+
+public class GroupNM: Model {
+    
+    public let id: String
+    public let name: String
+    public var profile: String
+    public let quote: String
+    public let by: String
+    public let date: String
+    public let parent: String
+    public let chatId: String
+    public var isOpen: String
+    public let official: String
+    public let isEducation: String
+    public let groupType: String
+    public let isLounge: Bool
+    public var childs: [GroupNM] = []
+    public let level: String
+    
+    public var isSelected = false
+    
+    public init(id: String, name: String, profile: String, quote: String, by: String, date: String, parent: String, chatId: String = "", groupType: String, isOpen: String, official: String, isEducation: String = "", isLounge: Bool = false, level: String = "") {
+        self.id = id
+        self.name = name
+        self.profile = profile
+        self.quote = quote
+        self.by = by
+        self.date = date
+        self.parent = parent
+        self.chatId = chatId
+        self.groupType = groupType
+        self.isOpen = isOpen
+        self.official = official
+        self.isEducation = isEducation
+        self.isLounge = isLounge
+        self.level = level
+    }
+    
+    var isInternal: Bool {
+        return isEducation == "2" || isEducation == "3" || isEducation == "4"
+    }
+    
+    public var description: String {
+        return "(\(id), \(name), \(chatId), \(groupType), \(childs)"
+    }
+    
+    public static func == (lhs: GroupNM, rhs: GroupNM) -> Bool {
+        return lhs.id == rhs.id
+    }
+    
+    public static func getData(group_id: String?) -> GroupNM? {
+        guard let group_id = group_id else {
+            return nil
+        }
+        var group: GroupNM?
+        Database.shared.database?.inTransaction({ fmdb, rollback in
+            if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select group_id, f_name, image_id, quote, created_by, created_date, parent, group_type, is_open, official from GROUP_NM where group_id = '\(group_id)'"), cursor.next() {
+                group = GroupNM(id: cursor.string(forColumnIndex: 0) ?? "",
+                              name: cursor.string(forColumnIndex: 1) ?? "",
+                              profile: cursor.string(forColumnIndex: 2) ?? "",
+                              quote: cursor.string(forColumnIndex: 3) ?? "",
+                              by: cursor.string(forColumnIndex: 4) ?? "",
+                              date: cursor.string(forColumnIndex: 5) ?? "",
+                              parent: cursor.string(forColumnIndex: 6) ?? "",
+                              groupType: cursor.string(forColumnIndex: 7) ?? "",
+                              isOpen: cursor.string(forColumnIndex: 8) ?? "",
+                              official: cursor.string(forColumnIndex: 9) ?? "")
+                cursor.close()
+            }
+        })
+        return group
+    }
+}

+ 45 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/Nexilis.swift

@@ -159,6 +159,7 @@ public class Nexilis: NSObject {
                 }
                 getServiceBank()
                 getPullWorkingArea()
+                getPullGroupNoMember()
                 delegate.onSuccess(userId: me)
                 if let response = Nexilis.writeSync(message: getPrefs(key: "default_cc"), timeout: 5000) {
                     if response.mBodies[CoreMessage_TMessageKey.ERRCOD] == "00" {
@@ -215,6 +216,50 @@ public class Nexilis: NSObject {
         return tMessage
     }
     
+    private static func getPullGroupNoMember() {
+        DispatchQueue.global().asyncAfter(deadline: .now(), execute: {
+            if let response = Nexilis.writeSync(message: CoreMessage_TMessageBank.pullGroupNoMember(), timeout: 30 * 1000), response.isOk() {
+                let data = response.getBody(key: CoreMessage_TMessageKey.DATA)
+                print("KUACAU \(data)")
+                if !data.isEmpty {
+                    if let jsonArray = try! JSONSerialization.jsonObject(with: data.data(using: String.Encoding.utf8)!, options: JSONSerialization.ReadingOptions()) as? [AnyObject] {
+                        Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                            do {
+                                for json in jsonArray {
+                                    let group_id = CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.GROUP_ID)
+                                    _ = try Database.shared.insertRecord(fmdb: fmdb, table: "GROUP_NM", cvalues: [
+                                        "group_id" : group_id,
+                                        "f_name" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.GROUP_NAME),
+                                        "scope_id" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.MESSAGE_SCOPE_ID),
+                                        "image_id": CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.THUMB_ID),
+                                        "quote": CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.QUOTE),
+                                        "last_update" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.LAST_UPDATE),
+                                        "created_by" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.CREATED_BY),
+                                        "created_date" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.CREATED_DATE),
+                                        "ex_block" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.BLOCK),
+                                        "folder_id" : "",
+                                        "chat_modifier" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.CHAT_MODIFIER),
+                                        "group_type" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.IS_ORGANIZATION),
+                                        "parent" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.PARENT_ID),
+                                        "level" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.LEVEL),
+                                        "is_open" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.IS_OPEN),
+                                        "official" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.OFFICIAL_ACCOUNT),
+                                        "level_edu" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.LEVEL_EDU),
+                                        "materi_edu" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.MATERI_EDU),
+                                        "is_education" : CoreMessage_TMessageUtil.getString(json: json, key: CoreMessage_TMessageKey.IS_EDUCATION)
+                                    ], replace: true)
+                                }
+                            } catch {
+                                rollback.pointee = true
+                                print(error)
+                            }
+                        })
+                    }
+                }
+            }
+        })
+    }
+    
     private static func getServiceBank() {
         DispatchQueue.global().asyncAfter(deadline: .now(), execute: {
             _ = Nexilis.write(message: CoreMessage_TMessageBank.getServiceBank())

+ 2 - 2
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/AudienceViewController.swift

@@ -55,10 +55,10 @@ class AudienceViewController: UITableViewController {
                 destination.memberCell.isHidden = true
             }
             if(destination.dest == BroadcastViewController.DESTINATION_GROUP){
-                destination.memberListLabel.text = "Groups"
+                destination.memberListLabel.text = "Groups".localized()
             }
             else{
-                destination.memberListLabel.text = "Members"
+                destination.memberListLabel.text = "Members".localized()
             }
             destination.memberTable.reloadData()
             destination.tableView.reloadData()

+ 20 - 66
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/BroadcastMembersTableViewController.swift

@@ -34,6 +34,16 @@ class BroadcastMembersTableViewController: UITableViewController, UISearchContro
         return searchController.isActive && !isSearchBarEmpty
     }
     
+    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
+        searchBar.showsCancelButton = true
+        let cBtn = searchBar.value(forKey: "cancelButton") as! UIButton
+        cBtn.setTitle("Cancel".localized(), for: .normal)
+    }
+    
+    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
+        searchBar.showsCancelButton = false
+    }
+    
     func filterContentForSearchText(_ searchText: String) {
         if(isGroup){
             if(searchText.isEmpty){
@@ -55,6 +65,10 @@ class BroadcastMembersTableViewController: UITableViewController, UISearchContro
         tableView.reloadData()
     }
     
+    override func viewDidDisappear(_ animated: Bool) {
+        UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: .normal)
+    }
+    
 
     override func viewDidLoad() {
         super.viewDidLoad()
@@ -67,6 +81,10 @@ class BroadcastMembersTableViewController: UITableViewController, UISearchContro
         searchController.searchBar.barTintColor = .secondaryColor
         searchController.searchBar.searchTextField.backgroundColor = .secondaryColor
         searchController.obscuresBackgroundDuringPresentation = false
+        searchController.searchBar.searchTextField.attributedPlaceholder = NSAttributedString(string: "Search".localized(), attributes: [NSAttributedString.Key.foregroundColor: UIColor.gray])
+        searchController.searchBar.setMagnifyingGlassColorTo(color: .mainColor)
+        searchController.searchBar.tintColor = .mainColor
+        UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .normal)
         
         navigationItem.searchController = searchController
         navigationItem.hidesSearchBarWhenScrolling = false
@@ -77,12 +95,6 @@ class BroadcastMembersTableViewController: UITableViewController, UISearchContro
         DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
             self.getData()
         })
-
-        // Uncomment the following line to preserve selection between presentations
-        // self.clearsSelectionOnViewWillAppear = false
-
-        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
-        // self.navigationItem.rightBarButtonItem = self.editButtonItem
     }
     
     @objc func addFriend(sender: UIBarButtonItem) {
@@ -357,68 +369,10 @@ class BroadcastMembersTableViewController: UITableViewController, UISearchContro
                     destination.contacts.append(contacts[cell.tag])
                 }
             }
-            print("GROUPS")
-            print(destination.groups)
-            print("CONTACTS")
-            print(destination.contacts)
+            print("GROUPS \(destination.groups)")
+            print("CONTACTS \(destination.contacts)")
             destination.memberTable.reloadData()
             destination.tableView.reloadData()
         }
     }
-
-    /*
-    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)
-
-        // Configure the cell...
-
-        return cell
-    }
-    */
-
-    /*
-    // Override to support conditional editing of the table view.
-    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
-        // Return false if you do not want the specified item to be editable.
-        return true
-    }
-    */
-
-    /*
-    // Override to support editing the table view.
-    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
-        if editingStyle == .delete {
-            // Delete the row from the data source
-            tableView.deleteRows(at: [indexPath], with: .fade)
-        } else if editingStyle == .insert {
-            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
-        }    
-    }
-    */
-
-    /*
-    // Override to support rearranging the table view.
-    override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {
-
-    }
-    */
-
-    /*
-    // Override to support conditional rearranging of the table view.
-    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
-        // Return false if you do not want the item to be re-orderable.
-        return true
-    }
-    */
-
-    /*
-    // MARK: - Navigation
-
-    // In a storyboard-based application, you will often want to do a little preparation before navigation
-    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
-        // Get the new view controller using segue.destination.
-        // Pass the selected object to the new view controller.
-    }
-    */
-    
 }

+ 15 - 6
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/BroadcastViewController.swift

@@ -37,8 +37,6 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
     @IBOutlet weak var memberTable: UITableView!
     @IBOutlet weak var memberCell: UITableViewCell!
     @IBOutlet weak var memberListLabel: UILabel!
-    @IBOutlet weak var cancelButton: UIBarButtonItem!
-    @IBOutlet weak var doneButton: UIBarButtonItem!
     @IBOutlet weak var attachmentLabel: UILabel!
     let placeholder = "Message".localized()
     
@@ -92,6 +90,14 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
     
     var loadingView = UIViewController()
     
+    override func viewWillAppear(_ animated: Bool) {
+        let backButton = UIBarButtonItem(title: "Back".localized(), style: .plain, target: nil, action: nil)
+        let attributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
+        
+        backButton.setTitleTextAttributes(attributes, for: .normal)
+        navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
+    }
+    
     override func viewDidLoad() {
         super.viewDidLoad()
         
@@ -111,10 +117,12 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
         UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes, for: .normal)
         let textAttributes = [NSAttributedString.Key.foregroundColor:UIColor.white]
         navigationController?.navigationBar.titleTextAttributes = textAttributes
+        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel".localized(), style: .plain, target: self, action: #selector(didTapCancel))
+        navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .normal)
+        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Submit".localized(), style: .plain,target: self, action: #selector(submitBroadcast))
+        navigationItem.rightBarButtonItem?.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .normal)
         
         title = "Broadcast Message".localized()
-        cancelButton.title = "Cancel".localized()
-        doneButton.title = "Submit".localized()
         
         targetAudienceTitle.text = "Target Audience".localized()
         broadcastTypeTitle.text = "Broadcast Type".localized()
@@ -225,7 +233,7 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
         }
     }
     
-    @IBAction func didTapCancel(sender: AnyObject) {
+    @objc func didTapCancel() {
         navigationController?.dismiss(animated: true, completion: nil)
     }
     
@@ -317,7 +325,7 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
         self.present(loadingView, animated: true)
     }
     
-    @IBAction func submitBroadcast(_ sender: Any) {
+    @objc func submitBroadcast() {
         let startTime = startTimePicker.date.millisecondsSince1970
         var endTime = startTime
         if(!endTimeCell.isHidden){
@@ -654,6 +662,7 @@ class BroadcastViewController: UITableViewController, UITextFieldDelegate, UITex
     }
     
     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+        tableView.deselectRow(at: indexPath, animated: true)
         if(tableView == memberTable){
             deleteMember(index: indexPath.item)
         }

+ 13 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/ImageVideoPicker.swift

@@ -16,6 +16,7 @@ open class ImageVideoPicker: NSObject {
     private let pickerController: UIImagePickerController
     private weak var presentationController: UIViewController?
     private weak var delegate: ImageVideoPickerDelegate?
+    var isBlackCancelButton = false
     
     public init(presentationController: UIViewController, delegate: ImageVideoPickerDelegate) {
         self.pickerController = UIImagePickerController()
@@ -27,6 +28,14 @@ open class ImageVideoPicker: NSObject {
         
         self.pickerController.delegate = self
         self.pickerController.allowsEditing = false
+        
+        if UIBarButtonItem.appearance().titleTextAttributes(for: .normal) != nil {
+            isBlackCancelButton = UIBarButtonItem.appearance().titleTextAttributes(for: .normal)?.values.first as! NSObject == UIColor.black
+        }
+        if !isBlackCancelButton {
+            let cancelButtonAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black]
+            UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes , for: .normal)
+        }
     }
     
     enum Source {
@@ -63,6 +72,10 @@ open class ImageVideoPicker: NSObject {
     }
     
     private func pickerController(_ controller: UIImagePickerController, didSelect imagevideo: Any?) {
+        if !isBlackCancelButton {
+            let cancelButtonAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
+            UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes , for: .normal)
+        }
         controller.dismiss(animated: false, completion: nil)
         self.delegate?.didSelect(imagevideo: imagevideo)
     }