Commit 61a8bfd5 authored by Wei Han's avatar Wei Han

code update

parent 5ac78689
...@@ -275,7 +275,7 @@ ...@@ -275,7 +275,7 @@
images:(NSArray<UIImage *> * _Nullable)images images:(NSArray<UIImage *> * _Nullable)images
completion:(void (^)(NSDictionary * _Nullable response, NSError * _Nullable error))completion { completion:(void (^)(NSDictionary * _Nullable response, NSError * _Nullable error))completion {
NSString *urlString = @"https://kitadev.commudesk.com/api/owner/issue/addIssue?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImF0aGlyYWh6YWlkaUBjb252ZXAuY29tIiwicGFzc3dvcmQiOiIkMnkkMTAkNU9xYklqMnZ6UHJwckJrcVd5c3I2LmJCc1hVYS9Hd014eUhnL3RhUUhPUkNQcGdmTG8yakciLCJzdWIiOjIxNzAsImlzcyI6Imh0dHBzOi8va2l0YWRldi5jb21tdWRlc2suY29tL2FwaS9vd25lci9hdXRoL3Bhc3N3b3JkbGVzc19sb2dpbiIsImlhdCI6MTc2MDMxNTM1MiwiZXhwIjoyMDc1ODg0ODcyLCJuYmYiOjE3NjAzMTUzNTIsImp0aSI6IktoQmNyQnJEdDVNdDZlWmMifQ.JnxGbZ7hTeoOr6oibIzZMphgyKtTo2Aq9Efx6mrGfFA"; NSURL *url = [NSURL URLWithString:urlString]; NSString *urlString = @"https://kitadev.commudesk.com/api/owner/issue/updateIssue?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImF0aGlyYWh6YWlkaUBjb252ZXAuY29tIiwicGFzc3dvcmQiOiIkMnkkMTAkNU9xYklqMnZ6UHJwckJrcVd5c3I2LmJCc1hVYS9Hd014eUhnL3RhUUhPUkNQcGdmTG8yakciLCJzdWIiOjIxNzAsImlzcyI6Imh0dHBzOi8va2l0YWRldi5jb21tdWRlc2suY29tL2FwaS9vd25lci9hdXRoL3Bhc3N3b3JkbGVzc19sb2dpbiIsImlhdCI6MTc2MDMxNTM1MiwiZXhwIjoyMDc1ODg0ODcyLCJuYmYiOjE3NjAzMTUzNTIsImp0aSI6IktoQmNyQnJEdDVNdDZlWmMifQ.JnxGbZ7hTeoOr6oibIzZMphgyKtTo2Aq9Efx6mrGfFA"; NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST"; request.HTTPMethod = @"POST";
...@@ -307,30 +307,28 @@ ...@@ -307,30 +307,28 @@
} }
// 🔹 Always include OS // 🔹 Always include OS
appendFormField(@"data[os]", @"AND"); appendFormField(@"data[plan_id]", @"135");
appendFormField(@"data[location_id]", updateData[@"location_id"]);
appendFormField(@"data[issue_id]", updateData[@"issue_id"]);
appendFormField(@"data[issue_setting_id]", updateData[@"issue_setting_id"]);
appendFormField(@"data[position_x]", updateData[@"position_x"]);
appendFormField(@"data[position_y]", updateData[@"position_y"]);
appendFormField(@"data[comment]", updateData[@"comment"]);
appendFormField(@"data[os]", updateData[@"os"]);
// 🔹 Add `information` field (as JSON string) // 🔹 Add `information` field (as JSON string)
NSDictionary *info = @{ // NSString *deviceInfo = @"{\"OS\":\"AND\",\"IMEI\":\"AND:2a2f13ff17b1cbb5\",\"OS_VERSION\":\"35\",\"MODEL\":\"2306EPN60G\",\"APP_VERSION\":\"1.22.26\"}";
@"os": @"AND", // appendFormField(@"information", deviceInfo);
@"drawing_plan_id": updateData[@"plan_id"] ?: @"",
@"information": @{
@"OS": @"AND",
@"IMEI": @"AND:2a2f13ff17b1cbb5",
@"OS_VERSION": @"35",
@"MODEL": @"2306EPN60G",
@"APP_VERSION": @"1.22.26"
}
};
NSError *jsonError;
NSData *infoData = [NSJSONSerialization dataWithJSONObject:info options:0 error:&jsonError];
if (!jsonError) {
NSString *infoString = [[NSString alloc] initWithData:infoData encoding:NSUTF8StringEncoding];
appendFormField(@"data[information]", infoString);
}
// 🔹 Append image files // 🔹 Append image files
for (int i = 0; i < images.count; i++) { for (int i = 0; i < images.count; i++) {
UIImage *image = images[i]; id maybeImage = images[i];
if (![maybeImage isKindOfClass:[UIImage class]]) {
NSLog(@"⚠️ Skipping non-UIImage at index %d: %@", i, maybeImage);
continue; // skip invalid entries
}
UIImage *image = (UIImage *)maybeImage;
NSData *imageData = UIImageJPEGRepresentation(image, 0.8); NSData *imageData = UIImageJPEGRepresentation(image, 0.8);
if (!imageData) continue; if (!imageData) continue;
...@@ -381,6 +379,7 @@ ...@@ -381,6 +379,7 @@
}); });
}]; }];
[task resume]; [task resume];
} }
@end @end
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
@property (nonatomic, copy) NSString *selectedTypeName; @property (nonatomic, copy) NSString *selectedTypeName;
@property (nonatomic, copy) NSString * selectedIssueID; @property (nonatomic, copy) NSString * selectedIssueID;
@property (nonatomic, assign) BOOL isEditMode; @property (nonatomic, assign) BOOL isEditMode;
@property (nonatomic, strong) NSMutableArray *existingImages;
@property (nonatomic, strong) NSMutableArray *addedImages;
@end @end
@implementation AddIssueDetailsViewController @implementation AddIssueDetailsViewController
...@@ -26,6 +27,8 @@ ...@@ -26,6 +27,8 @@
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
self.isEditMode = [self.action isEqualToString:@"edit_issue"]; self.isEditMode = [self.action isEqualToString:@"edit_issue"];
self.existingImages = [NSMutableArray array];
self.addedImages = [NSMutableArray array];
self.view.backgroundColor = UIColor.whiteColor; self.view.backgroundColor = UIColor.whiteColor;
NSLog(@"📦 Data being brought over:\n planID: %@\n locationID: %@\n selectedLocationName: %@\n defectMatrix: %@\n projectName: %@\n projectCode: %@\n XCoordinates: %f\n YCoordinates: %f\n action: %@\n issueFullData: %@\n issueContent: %@\n locationData: %@", NSLog(@"📦 Data being brought over:\n planID: %@\n locationID: %@\n selectedLocationName: %@\n defectMatrix: %@\n projectName: %@\n projectCode: %@\n XCoordinates: %f\n YCoordinates: %f\n action: %@\n issueFullData: %@\n issueContent: %@\n locationData: %@",
...@@ -149,6 +152,7 @@ ...@@ -149,6 +152,7 @@
NSString *urlStr = imgDict[@"thumb_image"] ?: imgDict[@"image"]; NSString *urlStr = imgDict[@"thumb_image"] ?: imgDict[@"image"];
if (![urlStr isKindOfClass:[NSString class]]) continue; if (![urlStr isKindOfClass:[NSString class]]) continue;
[self.existingImages addObject:urlStr];
NSURL *url = [NSURL URLWithString:urlStr]; NSURL *url = [NSURL URLWithString:urlStr];
if (!url) continue; if (!url) continue;
...@@ -228,6 +232,7 @@ ...@@ -228,6 +232,7 @@
title.textColor = UIColor.whiteColor; title.textColor = UIColor.whiteColor;
title.font = [UIFont systemFontOfSize:18 weight:UIFontWeightMedium]; title.font = [UIFont systemFontOfSize:18 weight:UIFontWeightMedium];
title.textAlignment = NSTextAlignmentCenter; title.textAlignment = NSTextAlignmentCenter;
title.tag = 101;
[self.headerView addSubview:title]; [self.headerView addSubview:title];
// ✅ Reset button (refresh icon) // ✅ Reset button (refresh icon)
...@@ -733,11 +738,17 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> * ...@@ -733,11 +738,17 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *
NSInteger index = picker.view.tag; // will be 0–2 after fix NSInteger index = picker.view.tag; // will be 0–2 after fix
// Store image // Store image
if (self.isEditMode) {
// Only new images go here
[self.addedImages addObject:image];
} else {
// Normal add mode (keep using uploadedImages)
if (index < self.uploadedImages.count) { if (index < self.uploadedImages.count) {
self.uploadedImages[index] = image; self.uploadedImages[index] = image;
} else { } else {
[self.uploadedImages addObject:image]; [self.uploadedImages addObject:image];
} }
}
// Update UI // Update UI
UIButton *button = [self.view viewWithTag:1000 + index]; UIButton *button = [self.view viewWithTag:1000 + index];
...@@ -890,19 +901,10 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> * ...@@ -890,19 +901,10 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *
NSLog(@"⚠️ Edit mode is ON, but no issueFullData passed!"); NSLog(@"⚠️ Edit mode is ON, but no issueFullData passed!");
} }
// Prefer issue_id first, fallback to id
NSString *issueID = nil;
if ([self.issueFullData[@"issue_id"] isKindOfClass:[NSString class]]) {
issueID = self.issueFullData[@"issue_id"];
} else if ([self.issueFullData[@"id"] isKindOfClass:[NSString class]]) {
issueID = self.issueFullData[@"id"];
} else {
issueID = [NSString stringWithFormat:@"%@", self.issueFullData[@"issue_id"] ?: self.issueFullData[@"id"] ?: @"0"];
}
// ✅ Build update payload // ✅ Build update payload
NSDictionary *updateData = @{ NSDictionary *updateData = @{
@"issue_id": issueID ?: @"0", @"location_id": self.locationID ?: @"",
@"issue_id": self.issueFullData[@"issue_reference_id"] ?: @"0",
@"issue_setting_id": self.selectedIssueID ?: @"", @"issue_setting_id": self.selectedIssueID ?: @"",
@"position_x": @(self.planX).stringValue ?: @"", @"position_x": @(self.planX).stringValue ?: @"",
@"position_y": @(self.planY).stringValue ?: @"", @"position_y": @(self.planY).stringValue ?: @"",
...@@ -913,7 +915,7 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> * ...@@ -913,7 +915,7 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *
NSLog(@"📦 Sending UpdateIssue with data: %@", updateData); NSLog(@"📦 Sending UpdateIssue with data: %@", updateData);
[AddIssueAPIClient submitUpdateIssue:updateData [AddIssueAPIClient submitUpdateIssue:updateData
images:self.uploadedImages images:self.addedImages
completion:^(NSDictionary * _Nullable response, NSError * _Nullable error) { completion:^(NSDictionary * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
if (error) { if (error) {
...@@ -952,7 +954,8 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> * ...@@ -952,7 +954,8 @@ didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *
}); });
}]; }];
} else { } else {
NSLog(@"Calling addIssue API:\n planID: %@\n locationID: %@\n selectedIssueID: %@\n XCoordinates: %f\n YCoordinates: %f\n commentField: %@", NSLog(@"Calling addIssue API:\n locationID: %@\n planID: %@\n locationID: %@\n selectedIssueID: %@\n XCoordinates: %f\n YCoordinates: %f\n commentField: %@",
self.locationID,
self.planID, self.planID,
self.locationID, self.locationID,
self.selectedIssueID, self.selectedIssueID,
......
...@@ -55,6 +55,13 @@ ...@@ -55,6 +55,13 @@
[self refreshDashboardContent]; [self refreshDashboardContent];
} }
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"Dashboard loaded, refreshing data");
[self refreshDashboardContent];
}
#pragma mark - Refresh Logic #pragma mark - Refresh Logic
- (void)refreshDashboardContent { - (void)refreshDashboardContent {
NSLog(@"🔁 Refreshing dashboard content..."); NSLog(@"🔁 Refreshing dashboard content...");
......
...@@ -414,7 +414,7 @@ ...@@ -414,7 +414,7 @@
HistoryViewController *nextVC = [[HistoryViewController alloc] init]; HistoryViewController *nextVC = [[HistoryViewController alloc] init];
nextVC.modalPresentationStyle = UIModalPresentationFullScreen; nextVC.modalPresentationStyle = UIModalPresentationFullScreen;
nextVC.issueID = self.issueData[@"issue_reference_id"] ?: self.issueData[@"id"] ?: @""; nextVC.issueID = self.issueData[@"issue_id"] ?: @"";
nextVC.planID = self.issueData[@"plan_id"]; nextVC.planID = self.issueData[@"plan_id"];
nextVC.status = self.issueData[@"status_external"]; nextVC.status = self.issueData[@"status_external"];
nextVC.unitName = self.issueData[@"plan_unit"]; nextVC.unitName = self.issueData[@"plan_unit"];
...@@ -460,7 +460,7 @@ ...@@ -460,7 +460,7 @@
} mutableCopy]; } mutableCopy];
if (data[@"id"] && ![data[@"id"] isKindOfClass:[NSNull class]]) { if (data[@"id"] && ![data[@"id"] isKindOfClass:[NSNull class]]) {
issueContent[@"issue_id"] = [NSString stringWithFormat:@"%@", data[@"id"]]; issueContent[@"issue_id"] = [NSString stringWithFormat:@"%@", data[@"issue_reference_id"]];
} }
if (data[@"pos_x"] && ![data[@"pos_x"] isKindOfClass:[NSNull class]]) { if (data[@"pos_x"] && ![data[@"pos_x"] isKindOfClass:[NSNull class]]) {
issueContent[@"pos_x"] = [NSString stringWithFormat:@"%@", data[@"pos_x"]]; issueContent[@"pos_x"] = [NSString stringWithFormat:@"%@", data[@"pos_x"]];
...@@ -522,6 +522,7 @@ ...@@ -522,6 +522,7 @@
withdrawVC.unitName = unitName; withdrawVC.unitName = unitName;
withdrawVC.reference = reference; withdrawVC.reference = reference;
withdrawVC.titleText = strTitle; withdrawVC.titleText = strTitle;
withdrawVC.isMultiWithdraw = NO;
NSLog(@"📦 Navigating to WithdrawSingleIssueViewController with:\n issueID=%@\n planID=%@\n status=%@\n unitName=%@\n reference=%@\n title=%@", NSLog(@"📦 Navigating to WithdrawSingleIssueViewController with:\n issueID=%@\n planID=%@\n status=%@\n unitName=%@\n reference=%@\n title=%@",
issueID, planID, status, unitName, reference, strTitle); issueID, planID, status, unitName, reference, strTitle);
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#import "IssueAPIClient.h" #import "IssueAPIClient.h"
#import "IssueDetailViewController.h" #import "IssueDetailViewController.h"
#import "WithdrawSingleIssueViewController.h" #import "WithdrawSingleIssueViewController.h"
#import "WithdrawIssuesViewController.h"
#pragma mark - Internal IssueCell #pragma mark - Internal IssueCell
@interface IssueCell : UITableViewCell @interface IssueCell : UITableViewCell
...@@ -118,7 +119,6 @@ ...@@ -118,7 +119,6 @@
@property (nonatomic, strong) UIButton *backButton; @property (nonatomic, strong) UIButton *backButton;
@property (nonatomic, strong) UILabel *titleLabel; @property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UIButton *withdrawButton; @property (nonatomic, strong) UIButton *withdrawButton;
@property (nonatomic, strong) UIButton *poaButton;
@property (nonatomic, strong) UIButton *filterButton; @property (nonatomic, strong) UIButton *filterButton;
@property (nonatomic, strong) UILabel *filterLabel; @property (nonatomic, strong) UILabel *filterLabel;
@property (nonatomic, strong) UISearchBar *searchBar; @property (nonatomic, strong) UISearchBar *searchBar;
...@@ -181,14 +181,6 @@ ...@@ -181,14 +181,6 @@
self.withdrawButton.translatesAutoresizingMaskIntoConstraints = NO; self.withdrawButton.translatesAutoresizingMaskIntoConstraints = NO;
[self.withdrawButton addTarget:self action:@selector(withdrawTapped) forControlEvents:UIControlEventTouchUpInside]; [self.withdrawButton addTarget:self action:@selector(withdrawTapped) forControlEvents:UIControlEventTouchUpInside];
[self.headerView addSubview:self.withdrawButton]; [self.headerView addSubview:self.withdrawButton];
// POA Button
self.poaButton = [UIButton buttonWithType:UIButtonTypeSystem];
[self.poaButton setImage:[UIImage systemImageNamed:@"doc.text"] forState:UIControlStateNormal];
self.poaButton.tintColor = UIColor.whiteColor;
self.poaButton.translatesAutoresizingMaskIntoConstraints = NO;
[self.poaButton addTarget:self action:@selector(poaTapped) forControlEvents:UIControlEventTouchUpInside];
[self.headerView addSubview:self.poaButton];
} }
- (void)setupFilterBar { - (void)setupFilterBar {
...@@ -247,10 +239,8 @@ ...@@ -247,10 +239,8 @@
[self.backButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor], [self.backButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
[self.titleLabel.centerXAnchor constraintEqualToAnchor:self.headerView.centerXAnchor], [self.titleLabel.centerXAnchor constraintEqualToAnchor:self.headerView.centerXAnchor],
[self.titleLabel.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor], [self.titleLabel.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
[self.withdrawButton.trailingAnchor constraintEqualToAnchor:self.headerView.trailingAnchor constant:-56], [self.withdrawButton.trailingAnchor constraintEqualToAnchor:self.headerView.trailingAnchor constant:-12],
[self.withdrawButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor], [self.withdrawButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
[self.poaButton.trailingAnchor constraintEqualToAnchor:self.headerView.trailingAnchor constant:-12],
[self.poaButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
// Filter // Filter
[self.filterButton.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor constant:12], [self.filterButton.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor constant:12],
...@@ -402,10 +392,10 @@ ...@@ -402,10 +392,10 @@
- (void)withdrawTapped { - (void)withdrawTapped {
NSLog(@"Withdraw button tapped"); NSLog(@"Withdraw button tapped");
}
- (void)poaTapped { WithdrawIssuesViewController *withdrawVC = [[WithdrawIssuesViewController alloc] init];
NSLog(@"POA button tapped"); withdrawVC.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:withdrawVC animated:YES completion:nil];
} }
# pragma mark - Filter # pragma mark - Filter
......
// WithdrawIssuesViewController.h
#import <UIKit/UIKit.h>
@interface WithdrawIssuesViewController : UIViewController
@property (nonatomic, strong) NSString *unitID; // passed from previous screen if needed
@end
// WithdrawSingleIssueViewController.h // WithdrawSingleIssueViewController.h
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
@interface WithdrawSingleIssueViewController : UIViewController @interface WithdrawSingleIssueViewController : UIViewController
@property (nonatomic, strong) NSString *issueID; @property (nonatomic, strong) NSString *issueID; // for single issue
@property (nonatomic, strong) NSArray *selectedIssues; // for multiple issues
@property (nonatomic, strong) NSString *planID; @property (nonatomic, strong) NSString *planID;
@property (nonatomic, strong) NSString *status; @property (nonatomic, strong) NSString *status;
@property (nonatomic, strong) NSString *unitName; @property (nonatomic, strong) NSString *unitName;
@property (nonatomic, strong) NSString *reference; @property (nonatomic, strong) NSString *reference;
@property (nonatomic, strong) NSString *titleText; // "Delete Issue" or "Void Issue" @property (nonatomic, strong) NSString *titleText; // e.g. @"Delete Issue" or @"Withdraw Issue"
@property (nonatomic, assign) BOOL isMultiWithdraw; // YES = multiple issues, NO = single
@end @end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment