diff --git a/AgileWorks/AgileWorks.xcodeproj/project.pbxproj b/AgileWorks/AgileWorks.xcodeproj/project.pbxproj index 37537f6a748b6c5500c5d3f97f57ec99667e9a35..fdb7ab7268c86c26f9439d7b82c82d2963a23dd7 100644 --- a/AgileWorks/AgileWorks.xcodeproj/project.pbxproj +++ b/AgileWorks/AgileWorks.xcodeproj/project.pbxproj @@ -1679,7 +1679,7 @@ COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = "4TWZNUHVN6"; + DEVELOPMENT_TEAM = 4TWZNUHVN6; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1759,7 +1759,7 @@ COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = "4TWZNUHVN6"; + DEVELOPMENT_TEAM = 4TWZNUHVN6; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -1810,7 +1810,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = "4TWZNUHVN6"; + DEVELOPMENT_TEAM = 4TWZNUHVN6; INFOPLIST_FILE = ShareExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/AgileWorks/AgileWorks/App/RootViewController.swift b/AgileWorks/AgileWorks/App/RootViewController.swift index 28df74b682cc9b74b2748f21f4bcad3cb8513980..285463fb4de9afa8475468c77fae7deccbf0d0ed 100644 --- a/AgileWorks/AgileWorks/App/RootViewController.swift +++ b/AgileWorks/AgileWorks/App/RootViewController.swift @@ -123,7 +123,7 @@ extension RootViewController { switch linkType { case .deeplink(let path): - //mainNavigationController.screenPath = path + mainNavigationController.screenPath = path break case .notification(let data): mainNavigationController.notificationData = data diff --git a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift index b0d76e7cf0bba7f0dbaee82ec8acd769cdfcb209..2b38a2de8631903f9d9ea7dc1ce6d92ab8cf60c4 100644 --- a/AgileWorks/AgileWorks/Login/View/LoginViewController.swift +++ b/AgileWorks/AgileWorks/Login/View/LoginViewController.swift @@ -193,9 +193,7 @@ class LoginViewController: UIViewController { presenter.fetch() { result in switch result { case .success: - DispatchQueue.main.async { - AppDelegate.shared.rootViewController.switchToMainScreen() - } + self.setSessionId() case .failure(let error): log.e(error) DispatchQueue.main.async { @@ -207,6 +205,58 @@ class LoginViewController: UIViewController { } } } + + //sessionIdの取得 + private func setSessionId() { + let sessionEndpoint = GetSessionEndpoint() + + Session.send(sessionEndpoint) { result in + switch result { + // セッション情報取得成功 + case .success(let response): + KeychainDataStore().writeSessionID(sessionID: response.sessionId) + DispatchQueue.main.async { + //メイン画面表示 + AppDelegate.shared.rootViewController.switchToMainScreen() + } + // セッション情報取得失敗 + case .failure(let error): + var refreshError = false + log.e(error) + switch error { + case .connectionError(let err): + switch err { + case ResponseError.tokenInvalid: + refreshError = true + default: + break + } + case .requestError(_): + break + case .responseStatusError(_): + break + case .responseError(_): + break + } + // リフレッシュトークン更新エラーの場合 + if refreshError { + DispatchQueue.main.async { + let title = localizadString(key: "RefreshTokenUpdateErrorTitle", comment: "") + let message = localizadString(key: "RefreshTokenUpdateError", comment: "") + let defaultAction = AppDelegate.shared.rootViewController.logoutDefaultAction(title: localizadString(key: "OK", comment: "")) + AppDelegate.shared.rootViewController.showAlertScreen(view: self, title: title, message: message, defaultAction: defaultAction, cancelAction: nil) + } + // その他エラーの場合 + } else { + DispatchQueue.main.async { + let message = localizadString(key: "UnknownNetworkError", comment: "") + let defaultAction = UIAlertAction(title: localizadString(key: "OK", comment: ""), style: .default) { _ in } + AppDelegate.shared.rootViewController.showAlertScreen(view: self, title: "", message: message, defaultAction: defaultAction, cancelAction: nil) + } + } + } + } + } // QRコードリードボタンタップ処理 @IBAction private func qrCodeStartupTapped() { diff --git a/AgileWorks/AgileWorks/Main/View/MainTabBarViewController.swift b/AgileWorks/AgileWorks/Main/View/MainTabBarViewController.swift index a11006b7e48a6ccde4a155e9d9dbf1bc2045f132..5037bd21884d5487869caeb0bc5b141d2bf94bab 100644 --- a/AgileWorks/AgileWorks/Main/View/MainTabBarViewController.swift +++ b/AgileWorks/AgileWorks/Main/View/MainTabBarViewController.swift @@ -13,7 +13,7 @@ class MainTabBarViewController: UITabBarController { var screenPath: String? { didSet { - wireframe.showApprovalDetail(id: (String(self.screenPath!.suffix(1)))) + wireframe.showApprovalDetail(url: (String(self.screenPath!))) } } diff --git a/AgileWorks/AgileWorks/Main/Wireframe/MainTabBarViewWireframe.swift b/AgileWorks/AgileWorks/Main/Wireframe/MainTabBarViewWireframe.swift index 0f3d9aa505ecff2c7fe4dc7693cd42825433975c..368a239128608de05519910d35facab34d04705e 100644 --- a/AgileWorks/AgileWorks/Main/Wireframe/MainTabBarViewWireframe.swift +++ b/AgileWorks/AgileWorks/Main/Wireframe/MainTabBarViewWireframe.swift @@ -9,7 +9,7 @@ import UIKit protocol MainTabBarViewWireframe: AnyObject { - func showApprovalDetail(id: String) + func showApprovalDetail(url: String) func showDocForm(notificationData: NotificationData) } @@ -22,27 +22,22 @@ class MainTabBarViewWireframeImpl { } extension MainTabBarViewWireframeImpl: MainTabBarViewWireframe { - func showApprovalDetail(id: String) { + func showApprovalDetail(url: String) { // ウィジェットからの起動 // 以下、XPoint時のコード - /* - let approvalDetailVC = ApprovalDetailBuilderImpl().build() - approvalDetailVC.detailId = id + let workNum = 1 + viewController.selectedIndex = workNum - let mainTab = viewController.viewControllers.first as? UITabBarController - mainTab?.selectedIndex = 0 + let storyboard = UIStoryboard(name: "WebViewController", bundle: nil) + let view = viewController.children[workNum] as! UINavigationController + let workVC = view.viewControllers[view.viewControllers.count - 1] as! WebViewController - let collection = viewController.traitCollection.horizontalSizeClass - if collection == .compact { - let navigation = mainTab?.viewControllers?.first as? UINavigationController + //ウィジェットから起動する + workVC.openByWidget = true - navigation?.popToRootViewController(animated: false) - navigation?.pushViewController(approvalDetailVC, animated: true) - } else { - let nav = UINavigationController(rootViewController: approvalDetailVC) - viewController.showDetailViewController(nav, sender: self) - } - */ + //viewの読み込み + workVC.loadViewIfNeeded() + workVC.widgetLoadWebView(url: url) } // 通知から書類表示 func showDocForm(notificationData: NotificationData) { diff --git a/AgileWorks/AgileWorks/Strings/Chinese-Simplified.strings b/AgileWorks/AgileWorks/Strings/Chinese-Simplified.strings index 1e27cece92d6cf917cca3a47787f1e9a3fed596f..ad3fde499ef3d452e852fe551a314c0fd5653d29 100644 --- a/AgileWorks/AgileWorks/Strings/Chinese-Simplified.strings +++ b/AgileWorks/AgileWorks/Strings/Chinese-Simplified.strings @@ -177,7 +177,7 @@ "Demand" = "催促あり"; "Share" = "共有した"; "Shared" = "共有された"; -"Circulation" = "回付予定"; +"FuturePass" = "回付予定"; "StatusCheckWidgetName" = "状況確認ウィジェット"; "StatusCheckWidgetDescription" = "状況確認ウィジェットの説明"; diff --git a/AgileWorks/AgileWorks/Strings/Chinese-Traditional.strings b/AgileWorks/AgileWorks/Strings/Chinese-Traditional.strings index 20c8f1f2d088649e800baa9ba3b3d5f2909e223f..5420cc462d0fe6968087f8dbd84c579258ead261 100644 --- a/AgileWorks/AgileWorks/Strings/Chinese-Traditional.strings +++ b/AgileWorks/AgileWorks/Strings/Chinese-Traditional.strings @@ -177,7 +177,7 @@ "Demand" = "催促あり"; "Share" = "共有した"; "Shared" = "共有された"; -"Circulation" = "回付予定"; +"FuturePass" = "回付予定"; "StatusCheckWidgetName" = "状況確認ウィジェット"; "StatusCheckWidgetDescription" = "状況確認ウィジェットの説明"; diff --git a/AgileWorks/AgileWorks/Strings/English.strings b/AgileWorks/AgileWorks/Strings/English.strings index 8591c200664c6eb5f4f002ed909b5a2b1c14572e..61e732b2f00fc5d4ea110a605ce0070d74301e3f 100644 --- a/AgileWorks/AgileWorks/Strings/English.strings +++ b/AgileWorks/AgileWorks/Strings/English.strings @@ -177,7 +177,7 @@ "Demand" = "催促あり"; "Share" = "共有した"; "Shared" = "共有された"; -"Circulation" = "回付予定"; +"FuturePass" = "回付予定"; "StatusCheckWidgetName" = "状況確認ウィジェット"; "StatusCheckWidgetDescription" = "状況確認ウィジェットの説明"; diff --git a/AgileWorks/AgileWorks/Strings/Japanese.strings b/AgileWorks/AgileWorks/Strings/Japanese.strings index b17d165f5bbfad994b7c7e54a5da63b4c32034ce..bc3dba1ac2fb0808c716819dc322b9c7ab46913b 100644 --- a/AgileWorks/AgileWorks/Strings/Japanese.strings +++ b/AgileWorks/AgileWorks/Strings/Japanese.strings @@ -177,7 +177,7 @@ "Demand" = "催促あり"; "Share" = "共有した"; "Shared" = "共有された"; -"Circulation" = "回付予定"; +"FuturePass" = "回付予定"; "StatusCheckWidgetName" = "状況確認ウィジェット"; "StatusCheckWidgetDescription" = "状況確認ウィジェットの説明"; diff --git a/AgileWorks/AgileWorks/Strings/en.lproj/Localizable.strings b/AgileWorks/AgileWorks/Strings/en.lproj/Localizable.strings index 87b9f8bcd7ea034ef7017f41e55b89afc567c62e..f2ac9c256c6a1e61cf4e97715169f6bdde730786 100644 --- a/AgileWorks/AgileWorks/Strings/en.lproj/Localizable.strings +++ b/AgileWorks/AgileWorks/Strings/en.lproj/Localizable.strings @@ -177,7 +177,7 @@ "Demand" = "催促あり"; "Share" = "共有した"; "Shared" = "共有された"; -"Circulation" = "回付予定"; +"FuturePass" = "回付予定"; "StatusCheckWidgetName" = "状況確認ウィジェット"; "StatusCheckWidgetDescription" = "状況確認ウィジェットの説明"; diff --git a/AgileWorks/AgileWorks/Strings/ja.lproj/Localizable.strings b/AgileWorks/AgileWorks/Strings/ja.lproj/Localizable.strings index 2094bb632da398142f82bd360ee3f06a0ba28cda..d2446f2b934694c8f9e2a828ec2f309e0ae20fa1 100644 --- a/AgileWorks/AgileWorks/Strings/ja.lproj/Localizable.strings +++ b/AgileWorks/AgileWorks/Strings/ja.lproj/Localizable.strings @@ -177,7 +177,7 @@ "Demand" = "催促あり"; "Share" = "共有した"; "Shared" = "共有された"; -"Circulation" = "回付予定"; +"FuturePass" = "回付予定"; "StatusCheckWidgetName" = "状況確認ウィジェット"; "StatusCheckWidgetDescription" = "状況確認ウィジェットの説明"; diff --git a/AgileWorks/AgileWorks/Strings/zh-Hans.lproj/Localizable.strings b/AgileWorks/AgileWorks/Strings/zh-Hans.lproj/Localizable.strings index 579f91a87bb8f196e07253760a614257df2fe155..508434f592e0029ea9c72354bfa16ea5bfcd47cb 100644 --- a/AgileWorks/AgileWorks/Strings/zh-Hans.lproj/Localizable.strings +++ b/AgileWorks/AgileWorks/Strings/zh-Hans.lproj/Localizable.strings @@ -177,7 +177,7 @@ "Demand" = "催促あり"; "Share" = "共有した"; "Shared" = "共有された"; -"Circulation" = "回付予定"; +"FuturePass" = "回付予定"; "StatusCheckWidgetName" = "状況確認ウィジェット"; "StatusCheckWidgetDescription" = "状況確認ウィジェットの説明"; diff --git a/AgileWorks/AgileWorks/Strings/zh-Hant.lproj/Localizable.strings b/AgileWorks/AgileWorks/Strings/zh-Hant.lproj/Localizable.strings index 1ae28db570f6e3b2608170f4d892339177fe0490..a35aab6d91ac65a839eb5ce8f96e93a4f57183b5 100644 --- a/AgileWorks/AgileWorks/Strings/zh-Hant.lproj/Localizable.strings +++ b/AgileWorks/AgileWorks/Strings/zh-Hant.lproj/Localizable.strings @@ -177,7 +177,7 @@ "Demand" = "催促あり"; "Share" = "共有した"; "Shared" = "共有された"; -"Circulation" = "回付予定"; +"FuturePass" = "回付予定"; "StatusCheckWidgetName" = "状況確認ウィジェット"; "StatusCheckWidgetDescription" = "状況確認ウィジェットの説明"; diff --git a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift index 4127fc2ea4abbd99e6e8b52b3e8e81957b41029f..bff4bee35bc79160875aa4e7ab02eeec97b1aa35 100644 --- a/AgileWorks/AgileWorks/WebView/View/WebViewController.swift +++ b/AgileWorks/AgileWorks/WebView/View/WebViewController.swift @@ -19,7 +19,6 @@ class WebViewController: UIViewController { @IBOutlet private var menuButton: UIBarButtonItem! var mainWebView: WKWebView! // WebView 表示用 JSESSIONID - var sessionId: String! // 別ウインドウで開いたときの子ウインドウスタック var subViewStack = SubViewStack() var loadURL: String! @@ -33,6 +32,9 @@ class WebViewController: UIViewController { private let queue = DispatchQueue(label: "jp.atled.agileworks") var isShowDoc = false + //widgetから新規タブを開く際のフラグ + var openByWidget = false + // 現在表示中のURL var nowURL: String! @@ -62,8 +64,11 @@ class WebViewController: UIViewController { self.menuButton.isEnabled = true } self.subViewStack.eventDelegate = self - self.updateSession(isInit: true) + //アプリからタブを開く + if !openByWidget { + self.updateSession(isInit: true) + } // ネットワークオフラインView関連セットアップ self.setDisconnectView() self.startNetworkMonitor() @@ -78,7 +83,7 @@ class WebViewController: UIViewController { // WebView セットアップ private func setWebView() { let userContentController = WKUserContentController() - let script = "document.cookie='JSESSIONID=\(sessionId!)'" + let script = "document.cookie='JSESSIONID=\(KeychainDataStore().readSessionID() ?? "")'" let cookieScript = WKUserScript(source: script, injectionTime: .atDocumentStart, forMainFrameOnly: false) userContentController.addUserScript(cookieScript) @@ -120,10 +125,10 @@ class WebViewController: UIViewController { } // WebView ロード処理 - private func loadWebView() { - let sesstionid = "JSESSIONID=" + self.sessionId! + private func loadWebView(url: String) { + let sesstionid = "JSESSIONID=" + KeychainDataStore().readSessionID()! - let url = URL(string: self.loadURL)! + let url = URL(string: url)! var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30.0) request.httpShouldHandleCookies = false request.setValue(sesstionid, forHTTPHeaderField: "Cookie") @@ -133,8 +138,15 @@ class WebViewController: UIViewController { \nHeaders: \(String(describing: request.allHTTPHeaderFields)) \nHTTPBody: \(String(data: request.httpBody ?? Data(), encoding: .utf8)!) """) + mainWebView.load(request) } + + // WidgetからWebView ロード処理 + func widgetLoadWebView(url: String) { + setWebView() + loadWebView(url: url) + } // sessionId を cookie にセット private func setSessionId() { @@ -144,7 +156,7 @@ class WebViewController: UIViewController { HTTPCookiePropertyKey.path: "/AgileWorks", HTTPCookiePropertyKey.secure: true, HTTPCookiePropertyKey.name: "JSESSIONID", - HTTPCookiePropertyKey.value: self.sessionId! + HTTPCookiePropertyKey.value: KeychainDataStore().readSessionID()! ]) let cookieStore = self.mainWebView.configuration.websiteDataStore.httpCookieStore cookieStore.setCookie(cookie!) @@ -166,15 +178,15 @@ class WebViewController: UIViewController { // セッション情報取得成功 case .success(let response): if isInit { - self.sessionId = response.sessionId + KeychainDataStore().writeSessionID(sessionID: response.sessionId) // 画面ロード DispatchQueue.main.async { self.setWebView() - self.loadWebView() + self.loadWebView(url:self.loadURL) } } else { // Cookie 変更 - self.sessionId = response.sessionId + KeychainDataStore().writeSessionID(sessionID: response.sessionId) self.setSessionId() } // セッション情報取得失敗 @@ -409,7 +421,7 @@ extension WebViewController: UITabBarControllerDelegate { } if viewReload { setWebView() - loadWebView() + loadWebView(url: self.loadURL) } } } diff --git a/AgileWorks/WidgetExtension/WidgetExtension.swift b/AgileWorks/WidgetExtension/WidgetExtension.swift index 57662278205fcd529cf39aebe376bedbf05b45e5..9168f3540442e509de7833f0433201d319f4d26a 100644 --- a/AgileWorks/WidgetExtension/WidgetExtension.swift +++ b/AgileWorks/WidgetExtension/WidgetExtension.swift @@ -9,19 +9,29 @@ import WidgetKit import SwiftUI +let draft = "DRAFT" +let requestApplication = "REQUEST_APPLICATION" +let requestApproval = "REQUEST_APPROVAL" +let remand = "REMAND" +let checkReport = "CHECK_REPORT" +let demand = "DEMAND" +let share = "SHARE" +let shared = "SHARED" +let futurePass = "FUTUREPASS" + //ウィジェット選択のプレビュー画面などで表示させる項目 private func previewItems() -> [ApprovalItem]{ var items = [ApprovalItem]() - items.append(ApprovalItem(code: "DRAFT", name: localizadString(key: "Draft", comment: ""), count: 1)) - items.append(ApprovalItem(code: "REQUEST_APPLICATION", name: localizadString(key: "RequestApplication", comment: ""), count: 10)) - items.append(ApprovalItem(code: "REQUEST_APPROVAL", name: localizadString(key: "RequestApproval", comment: ""), count: 35)) - items.append(ApprovalItem(code: "REMAND", name: localizadString(key: "Remand", comment: ""), count: 6)) - items.append(ApprovalItem(code: "CHECK_REPORT", name: localizadString(key: "CheckReport", comment: ""), count: 10)) - items.append(ApprovalItem(code: "DEMAND", name: localizadString(key: "Demand", comment: ""), count: 0)) - items.append(ApprovalItem(code: "SHARE", name: localizadString(key: "Share", comment: ""), count: 0)) - items.append(ApprovalItem(code: "SHARED", name: localizadString(key: "Shared", comment: ""), count: 0)) - items.append(ApprovalItem(code: "CIRCULATION", name: localizadString(key: "Circulation", comment: ""), count: 0)) + items.append(ApprovalItem(code: draft, name: localizadString(key: "Draft", comment: ""), count: 1)) + items.append(ApprovalItem(code: requestApplication, name: localizadString(key: "RequestApplication", comment: ""), count: 10)) + items.append(ApprovalItem(code: requestApproval, name: localizadString(key: "RequestApproval", comment: ""), count: 35)) + items.append(ApprovalItem(code: remand, name: localizadString(key: "Remand", comment: ""), count: 6)) + items.append(ApprovalItem(code: checkReport, name: localizadString(key: "CheckReport", comment: ""), count: 10)) + items.append(ApprovalItem(code: demand, name: localizadString(key: "Demand", comment: ""), count: 0)) + items.append(ApprovalItem(code: share, name: localizadString(key: "Share", comment: ""), count: 0)) + items.append(ApprovalItem(code: shared, name: localizadString(key: "Shared", comment: ""), count: 0)) + items.append(ApprovalItem(code: futurePass, name: localizadString(key: "FuturePass", comment: ""), count: 0)) return items } @@ -101,6 +111,7 @@ struct ApprovalWidgetView : View { if entry.message == nil { if let num = findApproval() { //「承認依頼」項目あり ApprovalItemView(approvalItem: entry.approvalItems[num], message: entry.message) + .widgetURL(URL(string: Configuration.shared.awURL + "/" + (KeychainDataStore().readContextPath() ?? "") + "/Broker/Mobile#docList_" + "RequestApproval")) }else { //「承認依頼」項目なし ApprovalItemView(approvalItem: ApprovalItem(code: "", name: "", count: 0), message: "-") } @@ -139,11 +150,11 @@ struct StatusBoxView : View { ForEach(0.. String{ + var url: String = Configuration.shared.awURL + "/" + (KeychainDataStore().readContextPath() ?? "") + "/Broker/Mobile#docList_" + + switch approvalItem.code { + case draft: + url += "Draft" + case requestApplication: + url += "RequestApplication" + case requestApproval: + url += "RequestApproval" + case remand: + url += "Remand" + case checkReport: + url += "CheckReport" + case demand: + url += "HasDemand" + case share: + url += "Share" + case shared: + url += "Shared" + case futurePass: + url += "FuturePass" + default: + url = Configuration.shared.awURL + "/" + (KeychainDataStore().readContextPath() ?? "") + "/Broker/Mobile#work" + } + return url + } + + var body: some View { + Link(destination: URL(string: statusUrl())!, label: { + ApprovalItemView(approvalItem: approvalItem, message: message) + }) + } +} + //書類状況の内容を表示するビュー struct ApprovalItemView : View { let approvalItem: ApprovalItem @@ -181,15 +233,16 @@ struct ApprovalItemView : View { }else { //APIサーバーエラーの場合の表示 Text(message ?? "-") } - } - Spacer() + Spacer() } - .background(Color.white) - .cornerRadius(20) + .background(Color.white) + .cornerRadius(20) } } + + //エラー文言を表示するビュー struct FailureWidgetView : View { var entry: Provider.Entry