From 134e62ca931b91433697b08c47f205057b3fc5ad Mon Sep 17 00:00:00 2001 From: Matteo Matassoni <4108197+matax87@users.noreply.github.com> Date: Mon, 15 Jan 2024 17:13:05 +0100 Subject: [PATCH 1/3] Updates cached event filters in the app bundle --- NOICommunity/EventShortTypes.json | 73 +------------------------------ 1 file changed, 1 insertion(+), 72 deletions(-) diff --git a/NOICommunity/EventShortTypes.json b/NOICommunity/EventShortTypes.json index 96260c0..e500579 100644 --- a/NOICommunity/EventShortTypes.json +++ b/NOICommunity/EventShortTypes.json @@ -1,72 +1 @@ -[ - { - "Id": "sport", - "Key": "Sport", - "Type": "CustomTagging", - "TypeDesc": { - "de": "Sport", - "en": "Sport", - "it": "Sport" - } - }, - { - "Id": "noicommunity", - "Key": "NOI Community", - "Type": "CustomTagging", - "TypeDesc": { - "de": "NOI Community", - "en": "NOI Community", - "it": "NOI Community" - } - }, - { - "Id": "alpine", - "Key": "Alpine", - "Type": "TechnologyFields", - "TypeDesc": { - "de": "Alpine", - "en": "Alpine", - "it": "Alpine" - } - }, - { - "Id": "automotiveautomation", - "Key": "Automotive/Automation", - "Type": "TechnologyFields", - "TypeDesc": { - "de": "Automotive / Automation", - "en": "Automotive / Automation", - "it": "Automotive / Automation" - } - }, - { - "Id": "digital", - "Key": "Digital", - "Type": "TechnologyFields", - "TypeDesc": { - "de": "Digital", - "en": "Digital", - "it": "Digital" - } - }, - { - "Id": "food", - "Key": "Food", - "Type": "TechnologyFields", - "TypeDesc": { - "de": "Food", - "en": "Food", - "it": "Food" - } - }, - { - "Id": "green", - "Key": "Green", - "Type": "TechnologyFields", - "TypeDesc": { - "de": "Green", - "en": "Green", - "it": "Green" - } - } -] +[{"Id":"sport","Key":"Sport","Type":"CustomTagging","TypeDesc":{"de":"Sport","en":"Sport","it":"Sport"}},{"Id":"noicommunity","Key":"NOI Community","Type":"CustomTagging","TypeDesc":{"de":"NOI Community","en":"NOI Community","it":"NOI Community"}},{"Id":"automotiveautomation","Key":"Automotive/Automation","Type":"TechnologyFields","TypeDesc":{"de":"Automotive / Automation","en":"Automotive / Automation","it":"Automotive / Automation"}},{"Id":"digital","Key":"Digital","Type":"TechnologyFields","TypeDesc":{"de":"Digital","en":"Digital","it":"Digital"}},{"Id":"green","Key":"Green","Type":"TechnologyFields","TypeDesc":{"de":"Green","en":"Green","it":"Green"}},{"Id":"publicengagement","Key":"Public Engagement","Type":"CustomTagging","TypeDesc":{"de":"Public Engagement","en":"Public Engagement","it":"Public Engagement"}},{"Id":"food","Key":"Food","Type":"TechnologyFields","TypeDesc":{"de":"Food & Health","en":"Food & Health","it":"Food & Health"}}] From 1e783a5524c3d72d8aa6803795dc9faa3ebe0afb Mon Sep 17 00:00:00 2001 From: Matteo Matassoni <4108197+matax87@users.noreply.github.com> Date: Mon, 15 Jan 2024 17:41:45 +0100 Subject: [PATCH 2/3] Removes address information and find call to action from person details screen --- NOICommunity.xcodeproj/project.pbxproj | 4 ++ NOICommunity/Helpers/FeatureFlag.swift | 16 +++++++ .../PersonDetailsViewController.swift | 44 ++++++++++++++----- 3 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 NOICommunity/Helpers/FeatureFlag.swift diff --git a/NOICommunity.xcodeproj/project.pbxproj b/NOICommunity.xcodeproj/project.pbxproj index 834ffa0..9c3c4d8 100644 --- a/NOICommunity.xcodeproj/project.pbxproj +++ b/NOICommunity.xcodeproj/project.pbxproj @@ -168,6 +168,7 @@ 31BFAB35283FB49A00EF274D /* MeetConstant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BFAB34283FB49800EF274D /* MeetConstant.swift */; }; 31BFAB39283FB8EC00EF274D /* PersonDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BFAB38283FB8EC00EF274D /* PersonDetailsViewController.swift */; }; 31BFAB3B283FC88A00EF274D /* CALayer+XibConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BFAB3A283FC88A00EF274D /* CALayer+XibConfiguration.swift */; }; + 31C028412B55924B00D851EE /* FeatureFlag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31C028402B55924B00D851EE /* FeatureFlag.swift */; }; 31C14C2327DA3597009AF69D /* UIScrollView+ScrollToView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31C14C2227DA3597009AF69D /* UIScrollView+ScrollToView.swift */; }; 31C2261C270F596E0098A70E /* EventCardContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 315F4BE127034C00001905AF /* EventCardContentView.xib */; }; 31C2261D270F59750098A70E /* EventDetailsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3187667826FB3A9300782FA6 /* EventDetailsViewController.xib */; }; @@ -395,6 +396,7 @@ 31BFAB34283FB49800EF274D /* MeetConstant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeetConstant.swift; sourceTree = ""; }; 31BFAB38283FB8EC00EF274D /* PersonDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonDetailsViewController.swift; sourceTree = ""; }; 31BFAB3A283FC88A00EF274D /* CALayer+XibConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CALayer+XibConfiguration.swift"; sourceTree = ""; }; + 31C028402B55924B00D851EE /* FeatureFlag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureFlag.swift; sourceTree = ""; }; 31C14C2227DA3597009AF69D /* UIScrollView+ScrollToView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScrollView+ScrollToView.swift"; sourceTree = ""; }; 31C28BF52719709B00312A62 /* NOICells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NOICells.swift; sourceTree = ""; }; 31C28BF7271992F500312A62 /* FiltersBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiltersBarView.swift; sourceTree = ""; }; @@ -927,6 +929,7 @@ 31178FCD26F8D7CC00BDCDAA /* Localization.swift */, 31C28BF52719709B00312A62 /* NOICells.swift */, 31C8F52A282522150009BCB7 /* NoiNewsTopic.swift */, + 31C028402B55924B00D851EE /* FeatureFlag.swift */, ); path = Helpers; sourceTree = ""; @@ -1313,6 +1316,7 @@ 31A5F04F27D22ECA00FA20BC /* EventFiltersListViewController.swift in Sources */, 3153010528071D1200471153 /* AuthWelcomePageViewController.swift in Sources */, 316F5615281C166B0075B09F /* MyAccountViewController.swift in Sources */, + 31C028412B55924B00D851EE /* FeatureFlag.swift in Sources */, 31C640B126FE1449004B71A2 /* TabCoordinatorType.swift in Sources */, 31A5F05527D25A9400FA20BC /* EventFiltersViewController.swift in Sources */, 317B6F9A28118950008D07C0 /* ClientFactory.swift in Sources */, diff --git a/NOICommunity/Helpers/FeatureFlag.swift b/NOICommunity/Helpers/FeatureFlag.swift new file mode 100644 index 0000000..5b824cf --- /dev/null +++ b/NOICommunity/Helpers/FeatureFlag.swift @@ -0,0 +1,16 @@ +// SPDX-FileCopyrightText: NOI Techpark +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +// +// FeatureFlag.swift +// NOICommunity +// +// Created by Matteo Matassoni on 15/01/24. +// + +import Foundation + +enum FeatureFlag { + +} diff --git a/NOICommunity/MeetFeature/View Controllers/PersonDetailsViewController.swift b/NOICommunity/MeetFeature/View Controllers/PersonDetailsViewController.swift index 441c645..a76c7b9 100644 --- a/NOICommunity/MeetFeature/View Controllers/PersonDetailsViewController.swift +++ b/NOICommunity/MeetFeature/View Controllers/PersonDetailsViewController.swift @@ -74,7 +74,7 @@ final class PersonDetailsViewController: UIViewController { .configureAsSecondaryActionButton(numberOfLines: 1) .withTitle(.localized("btn_find")) - findButton.isHidden = company?.fullAddress == nil + findButton.isHidden = !FeatureFlag.displayFindCTA || company?.fullAddress == nil } } @@ -184,6 +184,11 @@ private extension PersonDetailsViewController { } // MARK: Private APIs +private extension FeatureFlag { + + static let displayAddress = false + static let displayFindCTA = false +} private extension PersonDetailsViewController.CollectionViewController { @@ -206,6 +211,18 @@ private extension PersonDetailsViewController.CollectionViewController { return .localized("label_address") } } + + static var allCases: [PersonDetailsViewController.CollectionViewController.Info] { + var result: [PersonDetailsViewController.CollectionViewController.Info] = [ + email, + phoneNumber, + address + ] + if !FeatureFlag.displayAddress { + result.removeAll { $0 == .address } + } + return result + } } func createLayout() -> UICollectionViewLayout { @@ -323,17 +340,20 @@ private extension PersonDetailsViewController.CollectionViewController { var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections([.main]) - var items: [Info] = [] - if person.email != nil { - items.append(.email) - } - if company?.phoneNumber != nil { - items.append(.phoneNumber) - } - if company?.fullAddress != nil { - items.append(.address) - } - snapshot.appendItems(items, toSection: .main) + let diplayItems = { + var result = Info.allCases + if person.email == nil { + result.removeAll { $0 == .email } + } + if company?.phoneNumber == nil { + result.removeAll { $0 == .phoneNumber } + } + if company?.fullAddress == nil { + result.removeAll { $0 == .address } + } + return result + }() + snapshot.appendItems(diplayItems, toSection: .main) dataSource.apply(snapshot, animatingDifferences: false) } From 28ce51ca8d4921b6530a6b4ca32db680468574f4 Mon Sep 17 00:00:00 2001 From: Matteo Matassoni <4108197+matax87@users.noreply.github.com> Date: Tue, 16 Jan 2024 11:03:52 +0100 Subject: [PATCH 3/3] Updates success login and failed login copies with link to NOI techpark jobs web page. Improvements to More tab --- NOICommunity.xcodeproj/project.pbxproj | 10 ++- .../AccessNotGrantedCoordinator.swift | 15 +++- .../AccessNotGrantedViewController.swift | 78 ++++++++++++------ .../AuthFeature/AuthCoordinator.swift | 15 ---- .../AuthWelcomeViewController.swift | 2 +- .../ComeOnBoardOnboardingViewModel.swift | 2 +- NOICommunity/Helpers/IndexPathAdditions.swift | 40 +++++++++ NOICommunity/Helpers/URL+Params.swift | 45 ++++++++++ .../MoreFeature/MoreMainViewController.swift | 20 ++++- .../MoreFeature/MyAccountViewModel.swift | 10 ++- .../BlockAccessViewController.swift | 82 ++++++++++++++++++- .../BlockAccessViewController.xib | 28 ++++--- .../MapWebViewController.swift | 18 ---- NOICommunity/de.lproj/InfoPlist.strings | 2 +- NOICommunity/de.lproj/Localizable.strings | 17 +++- NOICommunity/en.lproj/InfoPlist.strings | 2 +- NOICommunity/en.lproj/Localizable.strings | 17 +++- NOICommunity/it.lproj/InfoPlist.strings | 2 +- NOICommunity/it.lproj/Localizable.strings | 17 +++- 19 files changed, 324 insertions(+), 98 deletions(-) create mode 100644 NOICommunity/Helpers/IndexPathAdditions.swift create mode 100644 NOICommunity/Helpers/URL+Params.swift diff --git a/NOICommunity.xcodeproj/project.pbxproj b/NOICommunity.xcodeproj/project.pbxproj index 9c3c4d8..a9e1562 100644 --- a/NOICommunity.xcodeproj/project.pbxproj +++ b/NOICommunity.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -205,6 +205,8 @@ 31D77E742733FFDD0054397C /* UIRefreshControlAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D77E732733FFDD0054397C /* UIRefreshControlAdditions.swift */; }; 31DA4A762705EA110098E395 /* MoreMainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DA4A742705EA110098E395 /* MoreMainViewController.swift */; }; 31DA4A772705EA110098E395 /* MoreCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DA4A752705EA110098E395 /* MoreCoordinator.swift */; }; + 31DAC7BC2B56853A00F24D79 /* URL+Params.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DAC7BB2B56853A00F24D79 /* URL+Params.swift */; }; + 31DAC7BE2B568A0100F24D79 /* IndexPathAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DAC7BD2B568A0100F24D79 /* IndexPathAdditions.swift */; }; 31E058F22812F18800D1F7FE /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 31E058F12812F18800D1F7FE /* KeychainAccess */; }; 31E7872027D64F2300C67188 /* EventFiltersViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 31E7871F27D64E9600C67188 /* EventFiltersViewController.xib */; }; 31E7872427D7419200C67188 /* UIButton+Insets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31E7872327D7419200C67188 /* UIButton+Insets.swift */; }; @@ -430,6 +432,8 @@ 31D9C78926FDFCD3001F2DBB /* BaseTabCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTabCoordinator.swift; sourceTree = ""; }; 31DA4A742705EA110098E395 /* MoreMainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoreMainViewController.swift; sourceTree = ""; }; 31DA4A752705EA110098E395 /* MoreCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MoreCoordinator.swift; sourceTree = ""; }; + 31DAC7BB2B56853A00F24D79 /* URL+Params.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URL+Params.swift"; sourceTree = ""; }; + 31DAC7BD2B568A0100F24D79 /* IndexPathAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IndexPathAdditions.swift; sourceTree = ""; }; 31E058F32812F29500D1F7FE /* NOICommunityDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NOICommunityDebug.entitlements; sourceTree = ""; }; 31E058F42812F2A700D1F7FE /* NOICommunityRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NOICommunityRelease.entitlements; sourceTree = ""; }; 31E7871F27D64E9600C67188 /* EventFiltersViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EventFiltersViewController.xib; sourceTree = ""; }; @@ -930,6 +934,8 @@ 31C28BF52719709B00312A62 /* NOICells.swift */, 31C8F52A282522150009BCB7 /* NoiNewsTopic.swift */, 31C028402B55924B00D851EE /* FeatureFlag.swift */, + 31DAC7BB2B56853A00F24D79 /* URL+Params.swift */, + 31DAC7BD2B568A0100F24D79 /* IndexPathAdditions.swift */, ); path = Helpers; sourceTree = ""; @@ -1321,6 +1327,7 @@ 31A5F05527D25A9400FA20BC /* EventFiltersViewController.swift in Sources */, 317B6F9A28118950008D07C0 /* ClientFactory.swift in Sources */, 31DA4A762705EA110098E395 /* MoreMainViewController.swift in Sources */, + 31DAC7BC2B56853A00F24D79 /* URL+Params.swift in Sources */, 311350E7282E4F0A00AC9BC9 /* GalleryCollectionViewController.swift in Sources */, 3126E7272B2882620013F456 /* CacheKey.swift in Sources */, 31178FDC26FA26C500BDCDAA /* EventDetailsViewController.swift in Sources */, @@ -1330,6 +1337,7 @@ 317F74FA27D8B5610084E619 /* CircleButton.swift in Sources */, 31DA4A772705EA110098E395 /* MoreCoordinator.swift in Sources */, 312F5D292808252900C84598 /* WelcomeViewModel.swift in Sources */, + 31DAC7BE2B568A0100F24D79 /* IndexPathAdditions.swift in Sources */, 3101FC5B283394FA00A3416F /* TodayCoordinator.swift in Sources */, 31C28BF8271992F500312A62 /* FiltersBarView.swift in Sources */, 3145D23326B3F73F00F16787 /* SceneDelegate.swift in Sources */, diff --git a/NOICommunity/AuthFeature/AccessNotGrantedCoordinator/AccessNotGrantedCoordinator.swift b/NOICommunity/AuthFeature/AccessNotGrantedCoordinator/AccessNotGrantedCoordinator.swift index fc903e2..b72c052 100644 --- a/NOICommunity/AuthFeature/AccessNotGrantedCoordinator/AccessNotGrantedCoordinator.swift +++ b/NOICommunity/AuthFeature/AccessNotGrantedCoordinator/AccessNotGrantedCoordinator.swift @@ -27,6 +27,9 @@ private extension AccessNotGrantedCoordinator { func showAccessNotGranted(animated: Bool) { let myAccountViewModel = dependencyContainer.makeMyAccountViewModel() + myAccountViewModel.navigateToNoiTechparkJobsHandler = { [weak self] in + self?.navigateToNoiTechparkJobsHandler() + } let accessNotGrantedVC = dependencyContainer .makeAccessNotGrantedViewController(viewModel: myAccountViewModel) navigationController.setViewControllers( @@ -34,5 +37,15 @@ private extension AccessNotGrantedCoordinator { animated: animated ) } - + + func navigateToNoiTechparkJobsHandler() { + guard let url = URL(string: .localized("url_jobs_noi_techpark")) + else { return } + + let webVC = WebViewController() + webVC.url = url.addQueryParams(fullview: true) + webVC.navigationItem.title = .localized("noi_techpark_jobs_page_title") + navigationController.pushViewController(webVC, animated: true) + } + } diff --git a/NOICommunity/AuthFeature/AccessNotGrantedCoordinator/AccessNotGrantedViewController.swift b/NOICommunity/AuthFeature/AccessNotGrantedCoordinator/AccessNotGrantedViewController.swift index 0a20730..57ae446 100644 --- a/NOICommunity/AuthFeature/AccessNotGrantedCoordinator/AccessNotGrantedViewController.swift +++ b/NOICommunity/AuthFeature/AccessNotGrantedCoordinator/AccessNotGrantedViewController.swift @@ -16,41 +16,68 @@ import AuthClient // MARK: - AccessNotGrantedViewController final class AccessNotGrantedViewController: ContainerViewController { - + let viewModel: MyAccountViewModel - + private var subscriptions: Set = [] - + + private lazy var loadingViewController = LoadingViewController(style: .light) + + private var accessNotGrantedViewController: BlockAccessViewController = { + let contentVC = BlockAccessViewController(nibName: nil, bundle: nil) + contentVC.text = .localized("outsider_user_title") + let detailedAttributedText: NSAttributedString = { + let text = String.localized("outsider_user_body") + let mAttributedText = NSMutableAttributedString(string: text, + attributes: [ + .font: UIFont.preferredFont(forTextStyle: .body), + .foregroundColor: UIColor.noiSecondaryColor + ]) + + if let range = text.range(of: String.localized("outsider_user_body_link_1_part")), + let url = URL(string: .localized("url_jobs_noi_techpark")) { + mAttributedText.addAttribute(.link, + value: url, + range: NSRange(range, in: text)) + } + + return NSAttributedString(attributedString: mAttributedText) + }() + contentVC.detailedAttributedText = detailedAttributedText + contentVC.primaryActionTitle = .localized("btn_logout") + return contentVC + }() + init(viewModel: MyAccountViewModel) { self.viewModel = viewModel - + super.init(content: nil) } - + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("\(#function) not available") } - + @available(*, unavailable) override init(content: UIViewController?) { fatalError("\(#function) not available") } - + override func viewDidLoad() { super.viewDidLoad() - title = .localized("warning_title") + title = .localized("warning_title") configureBindings() viewModel.fetchUserInfo() } - + } // MARK: Private APIs private extension AccessNotGrantedViewController { - + func configureBindings() { viewModel.$userInfoIsLoading .receive(on: DispatchQueue.main) @@ -58,24 +85,24 @@ private extension AccessNotGrantedViewController { if isLoading { self?.showLoader() } else { - self?.showAccessNotGranted(userInfo: self?.viewModel.userInfoResult) + self?.showAccessNotGranted() } } .store(in: &subscriptions) - + viewModel.$userInfoResult .receive(on: DispatchQueue.main) .sink { [weak self] userInfo in - self?.showAccessNotGranted(userInfo: userInfo) + self?.showAccessNotGranted() } .store(in: &subscriptions) - + viewModel.$error .receive(on: DispatchQueue.main) .sink { [weak self] error in guard let error = error else { return } - + switch error { case AuthError.userCanceledAuthorizationFlow: break @@ -89,21 +116,18 @@ private extension AccessNotGrantedViewController { private func showLoader() { navigationController?.navigationBar.isHidden = true - content = LoadingViewController(style: .light) + content = loadingViewController } - private func showAccessNotGranted(userInfo userInfoOrNil: UserInfo?) { + private func showAccessNotGranted() { navigationController?.navigationBar.isHidden = false - content = { - let contentVC = BlockAccessViewController(nibName: nil, bundle: nil) - contentVC.text = .localized("outsider_user_title") - contentVC.detailedText = .localized("outsider_user_body") - contentVC.primaryActionTitle = .localized("btn_logout") - contentVC.primaryAction = { [weak self] in - self?.viewModel.logout() - } - return contentVC - }() + accessNotGrantedViewController.primaryAction = { [weak self] in + self?.viewModel.logout() + } + accessNotGrantedViewController.didTapJobsLinkAction = { [weak self] in + self?.viewModel.navigateToNoiTechparkJobs() + } + content = accessNotGrantedViewController } } diff --git a/NOICommunity/AuthFeature/AuthCoordinator.swift b/NOICommunity/AuthFeature/AuthCoordinator.swift index 95be45d..129d59f 100644 --- a/NOICommunity/AuthFeature/AuthCoordinator.swift +++ b/NOICommunity/AuthFeature/AuthCoordinator.swift @@ -121,18 +121,3 @@ private extension AuthCoordinator { } } - -private extension URL { - func addQueryParams(fullview: Bool) -> URL { - var urlComponents = URLComponents( - url: self, - resolvingAgainstBaseURL: false - )! - var queryItems = urlComponents.queryItems ?? [] - if fullview { - queryItems.append(URLQueryItem(name: "fullview", value: "1")) - } - urlComponents.queryItems = !queryItems.isEmpty ? queryItems : nil - return urlComponents.url! - } -} diff --git a/NOICommunity/AuthFeature/WelcomeFeature/AuthWelcomeViewController.swift b/NOICommunity/AuthFeature/WelcomeFeature/AuthWelcomeViewController.swift index e9d79e4..be74cd4 100644 --- a/NOICommunity/AuthFeature/WelcomeFeature/AuthWelcomeViewController.swift +++ b/NOICommunity/AuthFeature/WelcomeFeature/AuthWelcomeViewController.swift @@ -48,7 +48,7 @@ final class AuthWelcomeViewController: UIViewController { } } - @IBOutlet var privacyTextView: UITextView! { + @IBOutlet var privacyTextView: LinkTextView! { didSet { privacyTextView.isSelectable = true privacyTextView.isEditable = false diff --git a/NOICommunity/ComeOnBoardOnboardingFeature/ComeOnBoardOnboardingViewModel.swift b/NOICommunity/ComeOnBoardOnboardingFeature/ComeOnBoardOnboardingViewModel.swift index a540928..4760fa0 100644 --- a/NOICommunity/ComeOnBoardOnboardingFeature/ComeOnBoardOnboardingViewModel.swift +++ b/NOICommunity/ComeOnBoardOnboardingFeature/ComeOnBoardOnboardingViewModel.swift @@ -15,7 +15,7 @@ import AppPreferencesClient final class ComeOnBoardOnboardingViewModel { - lazy var navigateToMainAppPublisher = navigateToMainAppSubject + private(set) lazy var navigateToMainAppPublisher = navigateToMainAppSubject .eraseToAnyPublisher() @Published private(set) var isDontShowThisAgainToggleOn = false diff --git a/NOICommunity/Helpers/IndexPathAdditions.swift b/NOICommunity/Helpers/IndexPathAdditions.swift new file mode 100644 index 0000000..0818418 --- /dev/null +++ b/NOICommunity/Helpers/IndexPathAdditions.swift @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: NOI Techpark +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +// +// IndexPathAdditions.swift +// NOICommunity +// +// Created by Matteo Matassoni on 16/01/24. +// + +import UIKit + +extension UITableView { + + func isLatestIndexPath(_ indexPath: IndexPath) -> Bool { + guard indexPath.section == numberOfSections - 1 + else { return false } + + return indexPath.row == numberOfRows(inSection: indexPath.section) - 1 + } + + func isLastIndexPathInItsSection(_ indexPath: IndexPath) -> Bool { + indexPath.row == numberOfRows(inSection: indexPath.section) - 1 + } +} + +extension UICollectionView { + + func isLatestIndexPath(_ indexPath: IndexPath) -> Bool { + guard indexPath.section == numberOfSections - 1 + else { return false } + + return indexPath.item == numberOfItems(inSection: indexPath.section) - 1 + } + + func isLastIndexPathInItsSection(_ indexPath: IndexPath) -> Bool { + indexPath.item == numberOfItems(inSection: indexPath.section) - 1 + } +} diff --git a/NOICommunity/Helpers/URL+Params.swift b/NOICommunity/Helpers/URL+Params.swift new file mode 100644 index 0000000..af84d80 --- /dev/null +++ b/NOICommunity/Helpers/URL+Params.swift @@ -0,0 +1,45 @@ +// SPDX-FileCopyrightText: NOI Techpark +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +// +// URL+Params.swift +// NOICommunity +// +// Created by Matteo Matassoni on 16/01/24. +// + +import Foundation + +extension URL { + + func addQueryParams(fullview: Bool) -> URL { + var urlComponents = URLComponents( + url: self, + resolvingAgainstBaseURL: false + )! + var queryItems = urlComponents.queryItems ?? [] + if fullview { + queryItems.append(URLQueryItem(name: "fullview", value: "1")) + } + urlComponents.queryItems = !queryItems.isEmpty ? queryItems : nil + return urlComponents.url! + } + + func addQueryParams(fullview: Bool, hideZoom: Bool) -> URL { + var urlComponents = URLComponents( + url: self, + resolvingAgainstBaseURL: false + )! + var queryItems = urlComponents.queryItems ?? [] + if fullview { + queryItems.append(URLQueryItem(name: "fullview", value: "1")) + } + if hideZoom { + queryItems.append(URLQueryItem(name: "hidezoom", value: "1")) + } + urlComponents.queryItems = !queryItems.isEmpty ? queryItems : nil + return urlComponents.url! + } + +} diff --git a/NOICommunity/MoreFeature/MoreMainViewController.swift b/NOICommunity/MoreFeature/MoreMainViewController.swift index 443b4ef..2a3ddc3 100644 --- a/NOICommunity/MoreFeature/MoreMainViewController.swift +++ b/NOICommunity/MoreFeature/MoreMainViewController.swift @@ -21,7 +21,7 @@ final class MoreMainViewController: UICollectionViewController { var didSelectHandler: ((Entry) -> Void)? init() { - super.init(collectionViewLayout: Self.createLayout()) + super.init(collectionViewLayout: UICollectionViewFlowLayout()) } @available(*, unavailable) @@ -47,6 +47,7 @@ final class MoreMainViewController: UICollectionViewController { override func viewDidLoad() { super.viewDidLoad() + configureLayout() configureDataSource() } @@ -65,11 +66,24 @@ private extension MoreMainViewController { case main } - static func createLayout() -> UICollectionViewLayout { + func configureLayout() { var config = UICollectionLayoutListConfiguration(appearance: .plain) config.backgroundColor = .noiSecondaryBackgroundColor config.footerMode = .supplementary - return UICollectionViewCompositionalLayout.list(using: config) + let indexPathToHide = IndexPath() + if #available(iOS 14.5, *) { + config.itemSeparatorHandler = { [weak collectionView] indexPath, sectionSeparatorConfiguration in + guard let collectionView + else { return sectionSeparatorConfiguration } + + var configuration = sectionSeparatorConfiguration + if collectionView.isLastIndexPathInItsSection(indexPath) { + configuration.bottomSeparatorVisibility = .hidden + } + return configuration + } + } + collectionView.collectionViewLayout = UICollectionViewCompositionalLayout.list(using: config) } func configureDataSource() { diff --git a/NOICommunity/MoreFeature/MyAccountViewModel.swift b/NOICommunity/MoreFeature/MyAccountViewModel.swift index 2822a89..d76f0ee 100644 --- a/NOICommunity/MoreFeature/MyAccountViewModel.swift +++ b/NOICommunity/MoreFeature/MyAccountViewModel.swift @@ -65,7 +65,9 @@ final class MyAccountViewModel { private let appPreferencesClient: AppPreferencesClient var requestAccountDeletionHandler: (() -> Void)? - + + var navigateToNoiTechparkJobsHandler: (() -> Void)? + private var cache: Cache? init( @@ -161,5 +163,9 @@ final class MyAccountViewModel { func requestAccountDeletion() { requestAccountDeletionHandler?() } - + + func navigateToNoiTechparkJobs() { + navigateToNoiTechparkJobsHandler?() + } + } diff --git a/NOICommunity/ViewControllers/BlockAccessViewController.swift b/NOICommunity/ViewControllers/BlockAccessViewController.swift index e548587..1aee9f7 100644 --- a/NOICommunity/ViewControllers/BlockAccessViewController.swift +++ b/NOICommunity/ViewControllers/BlockAccessViewController.swift @@ -23,7 +23,13 @@ final class BlockAccessViewController: UIViewController { var detailedText: String? { didSet { - bodyLabel?.text = detailedText + bodyTextView?.text = detailedText + } + } + + var detailedAttributedText: NSAttributedString? { + didSet { + bodyTextView?.attributedText = detailedAttributedText } } @@ -43,15 +49,38 @@ final class BlockAccessViewController: UIViewController { } } + var didTapJobsLinkAction: (() -> Void)? + @IBOutlet private var titleLabel: UILabel? { didSet { titleLabel?.text = text } } - @IBOutlet private var bodyLabel: UILabel? { + @IBOutlet private var bodyTextView: LinkTextView? { didSet { - bodyLabel?.text = detailedText + bodyTextView?.isSelectable = true + bodyTextView?.isEditable = false + bodyTextView?.isScrollEnabled = false + bodyTextView?.textContainer.lineFragmentPadding = 0 + bodyTextView?.textContainerInset = .zero + + bodyTextView?.delegate = self + + bodyTextView?.textColor = .noiSecondaryColor + bodyTextView?.linkTextAttributes = [ + .foregroundColor: UIColor.noiSecondaryColor, + .underlineStyle: NSUnderlineStyle.single.rawValue + ] + + switch (detailedText, detailedAttributedText) { + case (_, let detailedAttributedText?): + bodyTextView?.attributedText = detailedAttributedText + case (let detailedText?, nil): + bodyTextView?.text = detailedText + case (nil, nil): + bodyTextView?.text = nil + } } } @@ -103,4 +132,51 @@ final class BlockAccessViewController: UIViewController { scrollView.scrollIndicatorInsets = insets } + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + + if traitCollection.preferredContentSizeCategory != previousTraitCollection?.preferredContentSizeCategory { + preferredContentSizeCategoryDidChange(traitCollection.preferredContentSizeCategory) + } + } + +} + +// MARK: Private APIs + +private extension BlockAccessViewController { + + func preferredContentSizeCategoryDidChange(_ previousPreferredContentSizeCategory: UIContentSizeCategory?) { + guard let attributedText = bodyTextView?.attributedText + else { return } + + let text = attributedText.string + let mAttributedText = NSMutableAttributedString(attributedString: attributedText) + attributedText.enumerateAttribute(.font, + in: NSRange(text.startIndex..., in: attributedText.string)) { value, range, stop in + mAttributedText.addAttribute(.font, + value: UIFont.preferredFont(forTextStyle: .body), + range: range) + } + bodyTextView?.attributedText = NSAttributedString(attributedString: mAttributedText) + } + +} + +// MARK: UITextViewDelegate + +extension BlockAccessViewController: UITextViewDelegate { + + public func textView(_ textView: UITextView, + shouldInteractWith url: URL, + in nsCharacterRange: NSRange, + interaction: UITextItemInteraction) -> Bool { + if url == URL(string: .localized("url_jobs_noi_techpark")), + let didTapJobsLinkAction { + didTapJobsLinkAction() + return false + } + + return true + } } diff --git a/NOICommunity/ViewControllers/BlockAccessViewController.xib b/NOICommunity/ViewControllers/BlockAccessViewController.xib index cfc54c9..0702e75 100644 --- a/NOICommunity/ViewControllers/BlockAccessViewController.xib +++ b/NOICommunity/ViewControllers/BlockAccessViewController.xib @@ -1,17 +1,18 @@ - + - + + - + @@ -29,13 +30,13 @@ - + - + - + - + + + + @@ -131,5 +134,8 @@ + + + diff --git a/NOICommunity/ViewControllers/MapWebViewController.swift b/NOICommunity/ViewControllers/MapWebViewController.swift index 4131b75..35fba3e 100644 --- a/NOICommunity/ViewControllers/MapWebViewController.swift +++ b/NOICommunity/ViewControllers/MapWebViewController.swift @@ -19,21 +19,3 @@ class MapWebViewController: WebViewController { } } } - -private extension URL { - func addQueryParams(fullview: Bool, hideZoom: Bool) -> URL { - var urlComponents = URLComponents( - url: self, - resolvingAgainstBaseURL: false - )! - var queryItems = urlComponents.queryItems ?? [] - if fullview { - queryItems.append(URLQueryItem(name: "fullview", value: "1")) - } - if hideZoom { - queryItems.append(URLQueryItem(name: "hidezoom", value: "1")) - } - urlComponents.queryItems = !queryItems.isEmpty ? queryItems : nil - return urlComponents.url! - } -} diff --git a/NOICommunity/de.lproj/InfoPlist.strings b/NOICommunity/de.lproj/InfoPlist.strings index c3650f3..20e6619 100755 --- a/NOICommunity/de.lproj/InfoPlist.strings +++ b/NOICommunity/de.lproj/InfoPlist.strings @@ -2,7 +2,7 @@ * InfoPlist.strings (de) * Copyright © 2021 Dimension S.r.l. All rights reserved. * - * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2023-12-12T15:45:54+0100 + * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2024-01-16T11:00:11+0100 * Please do not edit this file by hand, use the export function from Google Sheet. */ diff --git a/NOICommunity/de.lproj/Localizable.strings b/NOICommunity/de.lproj/Localizable.strings index 0dbb377..fd12329 100755 --- a/NOICommunity/de.lproj/Localizable.strings +++ b/NOICommunity/de.lproj/Localizable.strings @@ -2,7 +2,7 @@ * Localizable.strings (de) * Copyright © 2021 Dimension S.r.l. All rights reserved. * - * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2023-12-12T15:45:54+0100 + * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2024-01-16T11:00:11+0100 * Please do not edit this file by hand, use the export function from Google Sheet. */ @@ -308,7 +308,10 @@ Tab Orientate: button label */ "outsider_user_title" = "Hoppla, das hat leider nicht geklappt!"; /* Body of user outsider of NOI community */ -"outsider_user_body" = "Die angegebene E-Mail-Adresse scheint in unserer Datenbank nicht auf. \n \nDiese App ist den Mitgliedern der NOI-Community vorbehalten. Wenn du Teil davon bist, prüfe bitte die angegebene E-Mail-Adresse und versuch es noch einmal oder schreib eine E-Mail an community@noi.bz.it. "; +"outsider_user_body" = "Die angegebene E-Mail-Adresse scheint in unserer Datenbank nicht auf. \n \nDiese App ist den Mitgliedern der NOI-Community vorbehalten. Wenn du Teil davon bist, prüfe bitte die angegebene E-Mail-Adresse und versuch es noch einmal. Klappt es dann immer noch nicht, schreib uns bitte eine E-Mail an community@noi.bz.it. \n \nDu möchtest auch zur NOI-Community gehören? Hier geht’s zu unseren Job-Angeboten."; + +/* Text to match for adding the first link inside outsider_user_body */ +"outsider_user_body_link_1_part" = "Job-Angeboten"; /* Title of come on board onboarding page */ "come_on_board_onboarding_page_title" = "Hallo!"; @@ -317,7 +320,7 @@ Tab Orientate: button label */ "come_on_board_onboarding_title" = "Deine Anmeldung war erfolgreich"; /* Body of come on board onboarding */ -"come_on_board_onboarding_body" = "Herzlich willkommen in der NOI-Community App! \n\nNeu im NOI? Schau dich in unserem Community Manual um, wo wir nützliche Infos für dich zusammengetragen haben. "; +"come_on_board_onboarding_body" = "Herzlich willkommen in der NOI-Community App! \n \nNeu im NOI? Schau dich in unserem Community Manual um, wo wir nützliche Infos für dich zusammengetragen haben. Du findest es unter \"more\" im Menüpunkt \"Come on Board\"."; /* Label of don't show again toggle */ "dont_show_again_toogle_title" = "Diese Nachricht nicht mehr anzeigen"; @@ -325,6 +328,9 @@ Tab Orientate: button label */ /* Title of understood button */ "understood_button_title" = "Alles klar"; +/* Title of jobs page */ +"noi_techpark_jobs_page_title" = "Jobs"; + /* */ "url_home" = "https://noi.bz.it/de"; @@ -377,4 +383,7 @@ Tab Orientate: button label */ "url_bug_report" = "https://forms.office.com/Pages/ResponsePage.aspx?id=R_WstlLDCEenJewOZixdERIOZ0hE1k5LlWwUM_AXhdlUQUVFR0c1MThYUUw3T1lTMFJZNjkxU05SWi4u&embed=true"; /* */ -"url_app_privacy" = "https://noi.bz.it/de/datenschutz-app"; \ No newline at end of file +"url_app_privacy" = "https://noi.bz.it/de/datenschutz-app"; + +/* */ +"url_jobs_noi_techpark" = "https://noi.bz.it/de/jobs-noi-techpark"; \ No newline at end of file diff --git a/NOICommunity/en.lproj/InfoPlist.strings b/NOICommunity/en.lproj/InfoPlist.strings index d777799..95060c1 100755 --- a/NOICommunity/en.lproj/InfoPlist.strings +++ b/NOICommunity/en.lproj/InfoPlist.strings @@ -2,7 +2,7 @@ * InfoPlist.strings (en) * Copyright © 2021 Dimension S.r.l. All rights reserved. * - * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2023-12-12T15:45:54+0100 + * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2024-01-16T11:00:11+0100 * Please do not edit this file by hand, use the export function from Google Sheet. */ diff --git a/NOICommunity/en.lproj/Localizable.strings b/NOICommunity/en.lproj/Localizable.strings index 47098dc..282da07 100755 --- a/NOICommunity/en.lproj/Localizable.strings +++ b/NOICommunity/en.lproj/Localizable.strings @@ -2,7 +2,7 @@ * Localizable.strings (en) * Copyright © 2021 Dimension S.r.l. All rights reserved. * - * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2023-12-12T15:45:54+0100 + * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2024-01-16T11:00:11+0100 * Please do not edit this file by hand, use the export function from Google Sheet. */ @@ -308,7 +308,10 @@ Tab Orientate: button label */ "outsider_user_title" = "Oops, that didn't work!"; /* Body of user outsider of NOI community */ -"outsider_user_body" = "The e-mail address you provided does not exist in our database. \n \nThis app is reserved for members of the NOI-Community. If you are one of them, please check the e-mail address you entered and try again, or send an e-mail to community@noi.bz.it."; +"outsider_user_body" = "The e-mail address you provided does not exist in our database. \n \nThis app is reserved for members of the NOI-Community. If you are one of them, please check the e-mail address you entered and try again. It it still doesn’t work, please email us at community@noi.bz.it. \n \nWant to join the NOI-Community? Click here for our job offers!"; + +/* Text to match for adding the first link inside outsider_user_body */ +"outsider_user_body_link_1_part" = "here"; /* Title of come on board onboarding page */ "come_on_board_onboarding_page_title" = "Hello!"; @@ -317,7 +320,7 @@ Tab Orientate: button label */ "come_on_board_onboarding_title" = "Your registration has been successful"; /* Body of come on board onboarding */ -"come_on_board_onboarding_body" = "Welcome to the NOI-Community App!\n\nNew to NOI? Take a look at our Community Manual, where we have compiled useful information for you."; +"come_on_board_onboarding_body" = "Welcome to the NOI-Community App!\n\nNew to NOI? Take a look at our Community Manual, where we have compiled useful information for you. You can find it in the \"More\" menu, under \"Come on Board\"."; /* Label of don't show again toggle */ "dont_show_again_toogle_title" = "Don't show again"; @@ -325,6 +328,9 @@ Tab Orientate: button label */ /* Title of understood button */ "understood_button_title" = "Understood"; +/* Title of jobs page */ +"noi_techpark_jobs_page_title" = "Jobs"; + /* */ "url_home" = "https://noi.bz.it/en"; @@ -377,4 +383,7 @@ Tab Orientate: button label */ "url_bug_report" = "https://forms.office.com/Pages/ResponsePage.aspx?id=R_WstlLDCEenJewOZixdERIOZ0hE1k5LlWwUM_AXhdlUQUVFR0c1MThYUUw3T1lTMFJZNjkxU05SWi4u&embed=true"; /* */ -"url_app_privacy" = "https://noi.bz.it/en/privacy-app"; \ No newline at end of file +"url_app_privacy" = "https://noi.bz.it/en/privacy-app"; + +/* */ +"url_jobs_noi_techpark" = "https://noi.bz.it/en/jobs-noi-techpark"; \ No newline at end of file diff --git a/NOICommunity/it.lproj/InfoPlist.strings b/NOICommunity/it.lproj/InfoPlist.strings index 2add218..ab142cf 100755 --- a/NOICommunity/it.lproj/InfoPlist.strings +++ b/NOICommunity/it.lproj/InfoPlist.strings @@ -2,7 +2,7 @@ * InfoPlist.strings (it) * Copyright © 2021 Dimension S.r.l. All rights reserved. * - * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2023-12-12T15:45:54+0100 + * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2024-01-16T11:00:11+0100 * Please do not edit this file by hand, use the export function from Google Sheet. */ diff --git a/NOICommunity/it.lproj/Localizable.strings b/NOICommunity/it.lproj/Localizable.strings index cd25b74..e060db3 100755 --- a/NOICommunity/it.lproj/Localizable.strings +++ b/NOICommunity/it.lproj/Localizable.strings @@ -2,7 +2,7 @@ * Localizable.strings (it) * Copyright © 2021 Dimension S.r.l. All rights reserved. * - * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2023-12-12T15:45:54+0100 + * Generated from "https://docs.google.com/spreadsheets/d/1Yiol3UqS-0I9q4R5HLifVMdGbTSe3ZwuYBAMPyZJthc/edit#gid=0" on 2024-01-16T11:00:11+0100 * Please do not edit this file by hand, use the export function from Google Sheet. */ @@ -308,7 +308,10 @@ Tab Orientate: button label */ "outsider_user_title" = "Ops, qualcosa è andato storto!"; /* Body of user outsider of NOI community */ -"outsider_user_body" = "L'indirizzo e-mail inserito non è presente nel nostro database. \n \nQuesta app è riservata ai membri della NOI-Community. Se ne fai parte, controlla l'indirizzo e-mail inserito e riprova oppure invia un'e-mail a community@noi.bz.it. \n"; +"outsider_user_body" = "L'indirizzo e-mail inserito non è presente nel nostro database. \n \nQuesta app è riservata ai membri della NOI-Community. Se ne fai parte, controlla l'indirizzo e-mail inserito e riprova. Se il problema persiste, invia un'e-mail a community@noi.bz.it. \n \nVorresti entrare a far parte della NOI-Community? Clicca qui per le nostre offerte di lavoro."; + +/* Text to match for adding the first link inside outsider_user_body */ +"outsider_user_body_link_1_part" = "offerte di lavoro"; /* Title of come on board onboarding page */ "come_on_board_onboarding_page_title" = "Ciao!"; @@ -317,7 +320,7 @@ Tab Orientate: button label */ "come_on_board_onboarding_title" = "La tua registrazione è andata a buon fine"; /* Body of come on board onboarding */ -"come_on_board_onboarding_body" = "Ti diamo il benvenuto nell'app della NOI-\nCommunity!\n\nQui al NOl è tutto nuovo per te? Dai un'occhiata al nostro Community Manual, dove abbiamo raccolto informazioni utili per te."; +"come_on_board_onboarding_body" = "Ti diamo il benvenuto nell'app della NOI-\nCommunity!\n\nQui al NOI è tutto nuovo per te? Dai un’occhiata al nostro Community Manual, dove abbiamo raccolto informazioni utili per te. Lo trovi in \"More\" sotto \"Come on Board\". "; /* Label of don't show again toggle */ "dont_show_again_toogle_title" = "Grazie, non mostratemelo più"; @@ -325,6 +328,9 @@ Tab Orientate: button label */ /* Title of understood button */ "understood_button_title" = "Ho capito"; +/* Title of jobs page */ +"noi_techpark_jobs_page_title" = "Jobs"; + /* */ "url_home" = "https://noi.bz.it/it"; @@ -377,4 +383,7 @@ Tab Orientate: button label */ "url_bug_report" = "https://forms.office.com/Pages/ResponsePage.aspx?id=R_WstlLDCEenJewOZixdERIOZ0hE1k5LlWwUM_AXhdlUQUVFR0c1MThYUUw3T1lTMFJZNjkxU05SWi4u&embed=true"; /* */ -"url_app_privacy" = "https://noi.bz.it/it/privacy-app"; \ No newline at end of file +"url_app_privacy" = "https://noi.bz.it/it/privacy-app"; + +/* */ +"url_jobs_noi_techpark" = "https://noi.bz.it/it/jobs-noi-techpark"; \ No newline at end of file