Skip to content
This repository was archived by the owner on Feb 15, 2026. It is now read-only.

Commit a81c52f

Browse files
authored
Merge pull request #12 from shinking02/issue/5
iOS 26 Liquid Glass対応 + メジャーバージョン更新
2 parents e99150f + d2ab7f2 commit a81c52f

11 files changed

Lines changed: 100 additions & 86 deletions

File tree

JShift.xcodeproj/project.pbxproj

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@
234234
attributes = {
235235
BuildIndependentTargetsInParallel = 1;
236236
LastSwiftUpdateCheck = 1600;
237-
LastUpgradeCheck = 1600;
237+
LastUpgradeCheck = 2600;
238238
TargetAttributes = {
239239
5436B6092CE8DEEC00E8CBFA = {
240240
CreatedOnToolsVersion = 16.0;
@@ -375,9 +375,10 @@
375375
CODE_SIGN_STYLE = Automatic;
376376
CURRENT_PROJECT_VERSION = 1;
377377
DEVELOPMENT_ASSET_PATHS = "\"JShift/Preview Content\"";
378-
DEVELOPMENT_TEAM = 8KH9QD5V23;
378+
ENABLE_APP_SANDBOX = YES;
379379
ENABLE_PREVIEWS = YES;
380380
ENABLE_USER_SCRIPT_SANDBOXING = NO;
381+
ENABLE_USER_SELECTED_FILES = readonly;
381382
GENERATE_INFOPLIST_FILE = YES;
382383
INFOPLIST_FILE = JShift/Info.plist;
383384
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
@@ -391,7 +392,7 @@
391392
"$(inherited)",
392393
"@executable_path/Frameworks",
393394
);
394-
MARKETING_VERSION = 1.0.6;
395+
MARKETING_VERSION = 1.1.7;
395396
PRODUCT_BUNDLE_IDENTIFIER = com.ShinKawakami.JShift.JShift;
396397
PRODUCT_NAME = "$(TARGET_NAME)";
397398
SWIFT_EMIT_LOC_STRINGS = YES;
@@ -409,9 +410,10 @@
409410
CODE_SIGN_STYLE = Automatic;
410411
CURRENT_PROJECT_VERSION = 1;
411412
DEVELOPMENT_ASSET_PATHS = "\"JShift/Preview Content\"";
412-
DEVELOPMENT_TEAM = 8KH9QD5V23;
413+
ENABLE_APP_SANDBOX = YES;
413414
ENABLE_PREVIEWS = YES;
414415
ENABLE_USER_SCRIPT_SANDBOXING = NO;
416+
ENABLE_USER_SELECTED_FILES = readonly;
415417
GENERATE_INFOPLIST_FILE = YES;
416418
INFOPLIST_FILE = JShift/Info.plist;
417419
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.finance";
@@ -425,7 +427,7 @@
425427
"$(inherited)",
426428
"@executable_path/Frameworks",
427429
);
428-
MARKETING_VERSION = 1.0.6;
430+
MARKETING_VERSION = 1.1.7;
429431
PRODUCT_BUNDLE_IDENTIFIER = com.ShinKawakami.JShift.JShift;
430432
PRODUCT_NAME = "$(TARGET_NAME)";
431433
SWIFT_EMIT_LOC_STRINGS = YES;
@@ -469,6 +471,7 @@
469471
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
470472
COPY_PHASE_STRIP = NO;
471473
DEBUG_INFORMATION_FORMAT = dwarf;
474+
DEVELOPMENT_TEAM = 8KH9QD5V23;
472475
ENABLE_STRICT_OBJC_MSGSEND = YES;
473476
ENABLE_TESTABILITY = YES;
474477
ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -493,6 +496,7 @@
493496
MTL_FAST_MATH = YES;
494497
ONLY_ACTIVE_ARCH = YES;
495498
SDKROOT = iphoneos;
499+
STRING_CATALOG_GENERATE_SYMBOLS = YES;
496500
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
497501
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
498502
};
@@ -533,6 +537,7 @@
533537
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
534538
COPY_PHASE_STRIP = NO;
535539
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
540+
DEVELOPMENT_TEAM = 8KH9QD5V23;
536541
ENABLE_NS_ASSERTIONS = NO;
537542
ENABLE_STRICT_OBJC_MSGSEND = YES;
538543
ENABLE_USER_SCRIPT_SANDBOXING = YES;
@@ -550,6 +555,7 @@
550555
MTL_ENABLE_DEBUG_INFO = NO;
551556
MTL_FAST_MATH = YES;
552557
SDKROOT = iphoneos;
558+
STRING_CATALOG_GENERATE_SYMBOLS = YES;
553559
SWIFT_COMPILATION_MODE = wholemodule;
554560
VALIDATE_PRODUCT = YES;
555561
};
@@ -561,7 +567,6 @@
561567
BUNDLE_LOADER = "$(TEST_HOST)";
562568
CODE_SIGN_STYLE = Automatic;
563569
CURRENT_PROJECT_VERSION = 1;
564-
DEVELOPMENT_TEAM = 8KH9QD5V23;
565570
GENERATE_INFOPLIST_FILE = YES;
566571
IPHONEOS_DEPLOYMENT_TARGET = 18.0;
567572
MARKETING_VERSION = 1.0;
@@ -580,7 +585,6 @@
580585
BUNDLE_LOADER = "$(TEST_HOST)";
581586
CODE_SIGN_STYLE = Automatic;
582587
CURRENT_PROJECT_VERSION = 1;
583-
DEVELOPMENT_TEAM = 8KH9QD5V23;
584588
GENERATE_INFOPLIST_FILE = YES;
585589
IPHONEOS_DEPLOYMENT_TARGET = 18.0;
586590
MARKETING_VERSION = 1.0;
@@ -598,7 +602,6 @@
598602
buildSettings = {
599603
CODE_SIGN_STYLE = Automatic;
600604
CURRENT_PROJECT_VERSION = 1;
601-
DEVELOPMENT_TEAM = 8KH9QD5V23;
602605
GENERATE_INFOPLIST_FILE = YES;
603606
MARKETING_VERSION = 1.0;
604607
PRODUCT_BUNDLE_IDENTIFIER = com.ShinKawakami.JShift.JShiftUITests;
@@ -615,7 +618,6 @@
615618
buildSettings = {
616619
CODE_SIGN_STYLE = Automatic;
617620
CURRENT_PROJECT_VERSION = 1;
618-
DEVELOPMENT_TEAM = 8KH9QD5V23;
619621
GENERATE_INFOPLIST_FILE = YES;
620622
MARKETING_VERSION = 1.0;
621623
PRODUCT_BUNDLE_IDENTIFIER = com.ShinKawakami.JShift.JShiftUITests;
Binary file not shown.

JShift/JShift.entitlements

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,5 @@
1212
<array>
1313
<string>CloudKit</string>
1414
</array>
15-
<key>com.apple.security.app-sandbox</key>
16-
<true/>
17-
<key>com.apple.security.files.user-selected.read-only</key>
18-
<true/>
1915
</dict>
2016
</plist>

JShift/Models/CalendarManager.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ final class CalendarManager {
2323

2424
private func syncCalendarList() async {
2525
let fetchCalendarsQuery = GTLRCalendarQuery_CalendarListList.query()
26+
fetchCalendarsQuery.maxResults = 250
2627
await withCheckedContinuation { continuation in
2728
service.executeQuery(fetchCalendarsQuery) { ticket, response, error in
2829
if let error {
@@ -43,6 +44,7 @@ final class CalendarManager {
4344
let fetchEventsQuery = GTLRCalendarQuery_EventsList.query(withCalendarId: calendarId)
4445
fetchEventsQuery.singleEvents = true
4546
fetchEventsQuery.syncToken = syncToken
47+
fetchEventsQuery.maxResults = 1500
4648

4749
await withCheckedContinuation { continuation in
4850
service.executeQuery(fetchEventsQuery) { ticket, response, error in

JShift/Views/ContentView.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ struct ContentView: View {
44
@State private var selectedTab: Tab = .shift
55
@State private var isWelcomePresented = false
66
@Environment(\.openURL) private var openURL
7-
private let AVAIABLE_OB_VERSION = "4"
7+
private let AVAIABLE_OB_VERSION = "5"
88

99
var body: some View {
1010
TabView(selection: $selectedTab) {
@@ -39,13 +39,12 @@ struct ContentView: View {
3939
title: "アップデート内容",
4040
detailText: "",
4141
bulletedListItems: [
42-
.init(title: "チャート", description: "年間給与のチャートを復活させました。", symbolName: "chart.bar.xaxis.ascending", tintColor: UIColor(.green)),
43-
.init(title: "給与表示", description: "給与の表示順を給与の高い順に変更しました。", symbolName: "arrow.up.arrow.down", tintColor: UIColor(.blue)),
42+
.init(title: "iOS 26に対応", description: "iOS 26対応と軽微な不具合の修正", symbolName: "apple.logo", tintColor: UIColor(.green)),
4443
],
4544
boldButtonItem: .init(title: "続ける", action: {
4645
isWelcomePresented = false
4746
}),
48-
linkButtonItem: .init(title: "詳細", action: { openURL(URL(string: "https://github.com/shinking02/JShift/commit/2bb25dfe5a226385cea768bd6562368fe5018ade")!) })
47+
linkButtonItem: .init(title: "詳細", action: { openURL(URL(string: "https://github.com/shinking02/JShift/pull/12")!) })
4948
)
5049
}
5150
)

JShift/Views/Salary/SalaryContentView.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ struct SalaryContentView: View {
6060
.cornerRadius(3)
6161
.foregroundStyle(Color.secondary)
6262
}
63-
.animation(.none)
63+
.animation(nil, value: salaryData)
6464
.frame(height: 260)
6565
.listRowBackground(Color.clear)
6666
.chartBackground { chartProxy in
@@ -105,3 +105,4 @@ struct SalaryContentView: View {
105105
}
106106
}
107107
}
108+

JShift/Views/Setting/SettingView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ struct SettingView: View {
2727
}
2828
}
2929
Section(footer:
30-
Text("© 2024 Shin Kawakami")
30+
Text("© 2024-2025 Shin Kawakami")
3131
.frame(maxWidth: .infinity, alignment: .center)
3232
.foregroundStyle(.secondary)
3333
) {
Lines changed: 57 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import RealmSwift
22
import SwiftData
33
import SwiftUI
44

5-
struct ShiftSheetView: View {
5+
struct DateShiftView: View {
66
@Binding var selectedDate: Date
77
@Query(sort: \Job.order) private var jobs: [Job]
88
@Query private var otJobs: [OneTimeJob]
@@ -35,15 +35,65 @@ struct ShiftSheetView: View {
3535
private var dateOtJobs: [OneTimeJob] {
3636
otJobs.filter { $0.date.isSameDay(selectedDate) }
3737
}
38-
private var paymentDayJobs: [Job] {
39-
jobs.filter { job in
38+
private var paymentDayJobsWithSalary: [(job: Job, salary: Int)] {
39+
let salaryDataByJob = Dictionary(
40+
uniqueKeysWithValues: SalaryManager.shared
41+
.getSalaryData(date: selectedDate, jobs: jobs, dateMode: .month)
42+
.map { ($0.job.id, $0) }
43+
)
44+
45+
return jobs.compactMap { job in
46+
guard job.displayPaymentDay else { return nil }
4047
let paymentDay = job.getPaymentDay(year: selectedDate.year, month: selectedDate.month)
41-
return paymentDay.isSameDay(selectedDate) && job.displayPaymentDay
48+
guard paymentDay.isSameDay(selectedDate) else { return nil }
49+
guard let salaryData = salaryDataByJob[job.id] else { return nil }
50+
let amountInt: Int
51+
if salaryData.isConfirmed {
52+
amountInt = Int(salaryData.confirmedSalary)
53+
} else {
54+
amountInt = Int(salaryData.forecastSalary)
55+
}
56+
guard amountInt > 0 else { return nil }
57+
return (job: job, salary: amountInt)
4258
}
4359
}
4460

4561
var body: some View {
4662
NavigationStack {
63+
HStack {
64+
Text("\(selectedDate.toString(.weekday))")
65+
.font(.title3.bold())
66+
Spacer()
67+
HStack {
68+
Button(
69+
action: {
70+
showOTJobAddSheet = true
71+
},
72+
label: {
73+
Image(systemName: "plus.circle.dashed")
74+
Text("単発")
75+
}
76+
)
77+
.controlSize(.mini)
78+
.buttonStyle(.borderedProminent)
79+
.buttonBorderShape(.capsule)
80+
Spacer().frame(width: 8)
81+
Button(
82+
action: {
83+
showAddEventSheet = true
84+
},
85+
label: {
86+
Image(systemName: "plus.circle")
87+
Text("長期")
88+
}
89+
)
90+
.controlSize(.mini)
91+
.buttonStyle(.borderedProminent)
92+
.buttonBorderShape(.capsule)
93+
.disabled(jobs.isEmpty)
94+
}
95+
}
96+
.padding(.horizontal, 16)
4797
ScrollView {
4898
ForEach(dateEvents) { event in
4999
Group {
@@ -66,14 +116,13 @@ struct ShiftSheetView: View {
66116
}
67117
.padding(.horizontal)
68118
}
69-
ForEach(paymentDayJobs) { job in
119+
ForEach(paymentDayJobsWithSalary, id: \.job.id) { paymentDayJob in
70120
Group {
71-
Divider()
72-
PaymentDayRowView(job: job, date: selectedDate)
121+
PaymentDayRowView(job: paymentDayJob.job, date: selectedDate, salary: paymentDayJob.salary)
73122
}
74123
.padding(.horizontal)
75124
}
76-
if dateEvents.isEmpty && dateOtJobs.isEmpty && paymentDayJobs.isEmpty && suggestedEvents.isEmpty{
125+
if dateEvents.isEmpty && dateOtJobs.isEmpty && paymentDayJobsWithSalary.isEmpty && suggestedEvents.isEmpty{
77126
Divider()
78127
Text("予定がありません")
79128
.bold()
@@ -104,33 +153,6 @@ struct ShiftSheetView: View {
104153
await CalendarManager.shared.syncGoogleCalendar(skipSyncCalendarList: true)
105154
}
106155
.frame(maxWidth: .infinity)
107-
.toolbar {
108-
ToolbarItem(placement: .topBarLeading) {
109-
Text("\(selectedDate.toString(.weekday))")
110-
.font(.title3.bold())
111-
}
112-
ToolbarItem(placement: .topBarTrailing) {
113-
Button(
114-
action: {
115-
showOTJobAddSheet = true
116-
},
117-
label: {
118-
Image("custom.pencil.and.list.clipboard.badge.plus")
119-
}
120-
)
121-
}
122-
ToolbarItem(placement: .topBarTrailing) {
123-
Button(
124-
action: {
125-
showAddEventSheet = true
126-
},
127-
label: {
128-
Image(systemName: "plus")
129-
}
130-
)
131-
.disabled(jobs.isEmpty)
132-
}
133-
}
134156
}
135157
.onChange(of: selectedDate) {
136158
suggestedEvents = getSuggestEvents(selectedDate)

JShift/Views/Shift/Parts/CalendarView.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,12 @@ struct CalendarView: UIViewRepresentable {
133133
let paymentDayJob = parent.jobs.first { $0.getPaymentDay(year: dateComponents.year ?? 0, month: dateComponents.month ?? 0).isSameDay(dateComponents.date ?? Date()) && $0.displayPaymentDay }
134134

135135
if let paymentDayJob = paymentDayJob {
136-
return createCustomDecoration(dayJob: dayJob, dayOTJobs: dayOTJobs, paymentDayJob: paymentDayJob, dateEvents: dateEvents)
136+
let paymentJobSalary = SalaryManager.shared
137+
.getSalaryData(date: dateComponents.date ?? Date(), jobs: [paymentDayJob], dateMode: .month)
138+
.first
139+
if let paymentJobSalary = paymentJobSalary, (paymentJobSalary.confirmedSalary > 0 || paymentJobSalary.forecastSalary > 0) {
140+
return createCustomDecoration(dayJob: dayJob, dayOTJobs: dayOTJobs, paymentDayJob: paymentDayJob, dateEvents: dateEvents)
141+
}
137142
}
138143
if let dayJob = dayJob {
139144
return .default(color: UIColor(dayJob.color.toColor()))
@@ -152,6 +157,7 @@ struct CalendarView: UIViewRepresentable {
152157
UIImage(named: "custom.yensign.badge", in: nil, with: UIImage.SymbolConfiguration(paletteColors: [UIColor(.secondary), UIColor(paymentDayJob.color.toColor())])), size: .large
153158
)
154159
}
160+
155161
return .image(UIImage(systemName: "yensign"), color: UIColor(paymentDayJob.color.toColor()), size: .large)
156162
}
157163

JShift/Views/Shift/Parts/PaymentDayRowView.swift

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,25 @@ import SwiftUI
44
struct PaymentDayRowView: View {
55
let job: Job
66
let date: Date
7-
@State private var salary = 0
7+
let salary: Int
88

99
@ViewBuilder
1010
var body: some View {
11-
if salary > 0 {
12-
HStack(alignment: .center) {
13-
Rectangle()
14-
.frame(width: 4, height: 32)
15-
.cornerRadius(2)
16-
.foregroundStyle(job.color.toColor())
17-
Text("\(job.name)給料日")
18-
.bold()
19-
.lineLimit(1)
20-
Spacer()
21-
Text("\(salary)")
22-
.lineLimit(2)
23-
.font(.caption)
24-
.foregroundStyle(.secondary)
25-
.multilineTextAlignment(.center)
26-
}
27-
.onAppear {
28-
let salaryData = SalaryManager.shared.getSalaryData(date: date, jobs: [job], dateMode: .month).first!
29-
salary = salaryData.isConfirmed ? salaryData.confirmedSalary : salaryData.forecastSalary
30-
}
11+
Divider()
12+
HStack(alignment: .center) {
13+
Rectangle()
14+
.frame(width: 4, height: 32)
15+
.cornerRadius(2)
16+
.foregroundStyle(job.color.toColor())
17+
Text("\(job.name)給料日")
18+
.bold()
19+
.lineLimit(1)
20+
Spacer()
21+
Text("\(salary)")
22+
.lineLimit(2)
23+
.font(.caption)
24+
.foregroundStyle(.secondary)
25+
.multilineTextAlignment(.center)
3126
}
3227
}
3328
}

0 commit comments

Comments
 (0)