Skip to content
This repository has been archived by the owner on Sep 20, 2023. It is now read-only.

Edit issue title #2618

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ final class IssueCommentSectionController: ListBindingSectionController<IssueCom

var editAction: UIAlertAction? {
guard object?.viewerCanUpdate == true else { return nil }
return UIAlertAction(title: NSLocalizedString("Edit", comment: ""), style: .default, handler: { [weak self] _ in
return UIAlertAction(title: Constants.Strings.edit, style: .default, handler: { [weak self] _ in
guard let strongSelf = self,
let object = strongSelf.object,
let number = object.number,
Expand Down
2 changes: 1 addition & 1 deletion Classes/Issues/EditComment/EditCommentViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ MessageTextViewListener {

func setRightBarItemIdle() {
navigationItem.rightBarButtonItem = UIBarButtonItem(
title: NSLocalizedString("Save", comment: ""),
title: Constants.Strings.save,
style: .done,
target: self,
action: #selector(EditCommentViewController.onSave)
Expand Down
80 changes: 80 additions & 0 deletions Classes/Issues/EditTitle/EditIssueTitleViewController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
//
// EditIssueTitleViewController.swift
// Freetime
//
// Created by B_Litwin on 1/5/19.
// Copyright © 2019 Ryan Nystrom. All rights reserved.
//

import UIKit
import GitHubAPI
import SnapKit
import Squawk

final class EditIssueTitleViewController: UIViewController {

private let issueTitle: String
private let textView = UITextView()
public private(set) var editedIssueTitle: String?

init(issueTitle: String) {
self.issueTitle = issueTitle
super.init(nibName: nil, bundle: nil)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func viewDidLoad() {
super.viewDidLoad()
preferredContentSize = CGSize(
width: Styles.Sizes.contextMenuSize.width,
height: 120
)
title = Constants.Strings.edit

view.addSubview(textView)
textView.snp.makeConstraints { make in
make.edges.equalTo(view)
}
textView.textContainerInset = Styles.Sizes.textViewInset
textView.text = issueTitle

navigationItem.rightBarButtonItem = UIBarButtonItem(
title: Constants.Strings.save,
style: .plain,
target: self,
action: #selector(
EditIssueTitleViewController.onSave
)
)

navigationItem.leftBarButtonItem = UIBarButtonItem(
title: Constants.Strings.cancel,
style: .plain,
target: self,
action: #selector(
EditIssueTitleViewController.onCancel
)
)
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
textView.becomeFirstResponder()
}

@objc func onSave() {
textView.resignFirstResponder()
if textView.text != issueTitle {
editedIssueTitle = textView.text
}
dismiss(animated: true)
}

@objc func onCancel() {
textView.resignFirstResponder()
dismiss(animated: true)
}
}
54 changes: 53 additions & 1 deletion Classes/Issues/GithubClient+Issues.swift
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ extension GithubClient {
let issueResult = IssueResult(
id: issueType.id,
pullRequest: issueType.pullRequest,
title: titleStringSizing(title: issueType.title, contentSizeCategory: contentSizeCategory, width: width),
title: titleStringSizing(title: issueType.title, contentSizeCategory: contentSizeCategory),
labels: IssueLabelsModel(
status: IssueLabelStatusModel(status: status, pullRequest: issueType.pullRequest),
locked: issueType.locked,
Expand Down Expand Up @@ -524,4 +524,56 @@ extension GithubClient {
}
}
}

func setIssueTitle(
previous: IssueResult,
owner: String,
repo: String,
number: Int,
title: String
) {

let contentSizeCategory = UIContentSizeCategory.preferred

let titleChangeString = IssueRenamedString(
previous: previous.title.string.allText,
current: title,
contentSizeCategory: contentSizeCategory,
width: 0
)

let issueRenamedModel = IssueRenamedModel(
id: UUID().uuidString,
actor: userSession?.username ?? "",
date: Date(),
titleChangeString: titleChangeString
)

let issueResult = previous.updated(
title: titleStringSizing(
title: title,
contentSizeCategory: contentSizeCategory
),
timelinePages: previous.timelinePages(appending: [issueRenamedModel])
)

let cache = self.cache
cache.set(value: issueResult)

let request = V3EditIssueTitleRequest(
owner: owner,
repo: repo,
issueNumber: number,
title: title
)

client.send(request) { result in
switch result {
case .success: break
case .failure(let error):
cache.set(value: previous)
Squawk.show(error: error)
}
}
}
}
39 changes: 36 additions & 3 deletions Classes/Issues/IssueManagingContextController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ final class IssueManagingContextController: NSObject, ContextMenuDelegate {
case lock
case reopen
case close
case edit
}

var actions: [Action] {
Expand All @@ -100,7 +101,7 @@ final class IssueManagingContextController: NSObject, ContextMenuDelegate {
var actions = [Action]()

if case .collaborator = permissions {
actions += [ .labels, .milestone, .assignees ]
actions += [ .labels, .milestone, .assignees, .edit ]
if result.pullRequest {
actions.append(.reviewers)
}
Expand Down Expand Up @@ -151,6 +152,9 @@ final class IssueManagingContextController: NSObject, ContextMenuDelegate {
case .close:
title = Constants.Strings.close
iconName = "x"
case .edit:
title = NSLocalizedString("Edit Title", comment: "")
iconName = "pencil"
}

// Lock always has the divider above it assuming you're a collaborator.
Expand Down Expand Up @@ -193,6 +197,11 @@ final class IssueManagingContextController: NSObject, ContextMenuDelegate {
case .lock: strongSelf.lock(true)
case .reopen: strongSelf.close(false)
case .close: strongSelf.close(true)
case .edit:
strongSelf.presentContextMenu(
with: strongSelf.newEditIssueTitleController(),
backgroundColor: .white
)
}
}
}
Expand Down Expand Up @@ -263,15 +272,24 @@ final class IssueManagingContextController: NSObject, ContextMenuDelegate {
repo: model.repo
)
}

func newEditIssueTitleController() -> UIViewController {
return EditIssueTitleViewController(
issueTitle: result?.title.string.allText ?? ""
)
}

func presentContextMenu(with controller: UIViewController) {
func presentContextMenu(
with controller: UIViewController,
backgroundColor: UIColor = Styles.Colors.menuBackgroundColor.color
) {
guard let viewController = self.viewController else { return }
ContextMenu.shared.show(
sourceViewController: viewController,
viewController: controller,
options: ContextMenu.Options(
containerStyle: ContextMenu.ContainerStyle(
backgroundColor: Styles.Colors.menuBackgroundColor.color
backgroundColor: backgroundColor
)
),
delegate: self
Expand Down Expand Up @@ -354,6 +372,19 @@ final class IssueManagingContextController: NSObject, ContextMenuDelegate {
milestone: controller.selected
)
}

func didDismiss(editedIssueTitle: String?) {
guard let editedTitle = editedIssueTitle,
let previous = result else { return }

client.setIssueTitle(
previous: previous,
owner: model.owner,
repo: model.repo,
number: model.number,
title: editedTitle
)
}

// MARK: ContextMenuDelegate

Expand All @@ -364,6 +395,8 @@ final class IssueManagingContextController: NSObject, ContextMenuDelegate {
didDismiss(controller: people)
} else if let labels = viewController as? LabelsViewController {
didDismiss(selected: labels.selected)
} else if let editIssueTitle = viewController as? EditIssueTitleViewController {
didDismiss(editedIssueTitle: editIssueTitle.editedIssueTitle)
}
}

Expand Down
3 changes: 1 addition & 2 deletions Classes/Issues/IssueViewModels.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ import StyledTextKit

func titleStringSizing(
title: String,
contentSizeCategory: UIContentSizeCategory,
width: CGFloat
contentSizeCategory: UIContentSizeCategory
) -> StyledTextRenderer {
let builder = StyledTextBuilder(styledText: StyledText(
text: title, style: Styles.Text.headline.with(foreground: Styles.Colors.Gray.dark.color)
Expand Down
3 changes: 2 additions & 1 deletion Classes/Issues/IssuesViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ final class IssuesViewController: MessageViewController,
EmptyViewDelegate,
MessageTextViewListener,
IssueLabelTapSectionControllerDelegate,
IssueManagingContextControllerDelegate {
IssueManagingContextControllerDelegate
{

private let client: GithubClient
private let model: IssueDetailsModel
Expand Down
2 changes: 2 additions & 0 deletions Classes/Views/Constants.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,7 @@ enum Constants {
static let clear = NSLocalizedString("Clear", comment: "")
static let preview = NSLocalizedString("Preview", comment: "")
static let overview = NSLocalizedString("Overview", comment: "")
static let edit = NSLocalizedString("Edit", comment: "")
static let save = NSLocalizedString("Save", comment: "")
}
}
16 changes: 16 additions & 0 deletions Freetime.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,8 @@
BDB6AA6A215FBC35009BB73C /* RepositoryBranchesCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDB6AA63215FBC35009BB73C /* RepositoryBranchesCell.swift */; };
BDB6AA6B215FBC35009BB73C /* GitHubClient+RepositoryBranches.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDB6AA64215FBC35009BB73C /* GitHubClient+RepositoryBranches.swift */; };
BDB6AA762165B8EA009BB73C /* SwitchBranches.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDB6AA752165B8EA009BB73C /* SwitchBranches.swift */; };
BDCEBE0B21E1853200D31677 /* EditIssueTitleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCEBE0A21E1853200D31677 /* EditIssueTitleViewController.swift */; };
BDCEBE1821E24A3600D31677 /* EditIssueTitleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDCEBE1721E24A3600D31677 /* EditIssueTitleTests.swift */; };
C0E3CD4B21BAE49B00185B57 /* NSRegularExpression+StaticString.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0E3CD4A21BAE49B00185B57 /* NSRegularExpression+StaticString.swift */; };
C0E3CD4D21BAE65000185B57 /* UIImage+StaticString.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0E3CD4C21BAE65000185B57 /* UIImage+StaticString.swift */; };
D8BAD0601FDA0A1A00C41071 /* LabelListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8BAD05F1FDA0A1A00C41071 /* LabelListCell.swift */; };
Expand Down Expand Up @@ -1119,6 +1121,8 @@
BDB6AA63215FBC35009BB73C /* RepositoryBranchesCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RepositoryBranchesCell.swift; sourceTree = "<group>"; };
BDB6AA64215FBC35009BB73C /* GitHubClient+RepositoryBranches.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GitHubClient+RepositoryBranches.swift"; sourceTree = "<group>"; };
BDB6AA752165B8EA009BB73C /* SwitchBranches.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwitchBranches.swift; sourceTree = "<group>"; };
BDCEBE0A21E1853200D31677 /* EditIssueTitleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditIssueTitleViewController.swift; sourceTree = "<group>"; };
BDCEBE1721E24A3600D31677 /* EditIssueTitleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditIssueTitleTests.swift; sourceTree = "<group>"; };
C0E3CD4A21BAE49B00185B57 /* NSRegularExpression+StaticString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSRegularExpression+StaticString.swift"; sourceTree = "<group>"; };
C0E3CD4C21BAE65000185B57 /* UIImage+StaticString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+StaticString.swift"; sourceTree = "<group>"; };
D396E0DA66FED629384A84BC /* Pods_FreetimeWatch.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FreetimeWatch.framework; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -1335,6 +1339,7 @@
29AF1E801F8AAB1D0008A0EF /* EditComment */,
291929431F3EAAAF0012067B /* Files */,
29EE44451F19D5C100B05ED3 /* GithubClient+Issues.swift */,
BDCEBE0921E1850B00D31677 /* EditTitle */,
294563EB1EE5012100DBCD35 /* Issue+IssueType.swift */,
292CD3C41F0C9EB200D3D57B /* IssueCommentModelHandling.swift */,
291929461F3EAB250012067B /* IssueDetailsModel.swift */,
Expand Down Expand Up @@ -1722,6 +1727,7 @@
29827D7121AA5D7F00A1B293 /* BookmarkViewControllerTests.swift */,
291E988421976B5600E5EED9 /* ContentWidthUtilsTests.swift */,
BD1DC657218DFE3C004DAC42 /* DetectShortlinkTests.swift */,
BDCEBE1721E24A3600D31677 /* EditIssueTitleTests.swift */,
2981A8A61EFEBEF900E25EF1 /* EmojiTests.swift */,
2986B35D1FD462AA00E3CFC6 /* FilePathTests.swift */,
296B4E331F7C80B800C16887 /* GraphQLIDDecodeTests.swift */,
Expand Down Expand Up @@ -2327,6 +2333,14 @@
path = RepositoryBranches;
sourceTree = "<group>";
};
BDCEBE0921E1850B00D31677 /* EditTitle */ = {
isa = PBXGroup;
children = (
BDCEBE0A21E1853200D31677 /* EditIssueTitleViewController.swift */,
);
path = EditTitle;
sourceTree = "<group>";
};
CF4CC0BFE456879DD6DBC714 /* Frameworks */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -3390,6 +3404,7 @@
29351EA02079246400FF8C17 /* CodeBlockModel.swift in Sources */,
290744BE1F268F8700FD9E48 /* UserAutocomplete+GraphQL.swift in Sources */,
290744BC1F268D8300FD9E48 /* UserAutocomplete.swift in Sources */,
BDCEBE0B21E1853200D31677 /* EditIssueTitleViewController.swift in Sources */,
299F63DA205DD86E0015D901 /* StyledTextViewCell.swift in Sources */,
292CD3D01F0DBB5C00D3D57B /* WebviewCellHeightCache.swift in Sources */,
);
Expand Down Expand Up @@ -3418,6 +3433,7 @@
29827CA321A9C6A600A1B293 /* BookmarkIDCloudStoreTests.swift in Sources */,
293A45781F296B7E00DD1006 /* ListTestKit.swift in Sources */,
296B4E341F7C80B800C16887 /* GraphQLIDDecodeTests.swift in Sources */,
BDCEBE1821E24A3600D31677 /* EditIssueTitleTests.swift in Sources */,
29827D7421AA5DA300A1B293 /* ViewControllerTestUtil.swift in Sources */,
BDB6AA762165B8EA009BB73C /* SwitchBranches.swift in Sources */,
DC5C02C71F9C71C400E80B9F /* SearchRecentViewModelTests.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>
Loading