Skip to content

Commit f0878da

Browse files
authored
Merge pull request #579 from TableProApp/feat/ios-quick-connect-widget
feat: add Quick Connect widget for iOS
2 parents da85ce9 + 3c9ce95 commit f0878da

22 files changed

Lines changed: 643 additions & 12 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Added
1111

1212
- iOS: connection groups and tags
13+
- iOS: Quick Connect Home Screen widget
1314

1415
## [0.27.4] - 2026-04-05
1516

TableProMobile/TableProMobile.xcodeproj/project.pbxproj

Lines changed: 196 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
/* Begin PBXBuildFile section */
1010
5A87EEED2F7F893000D028D0 /* TableProSync in Frameworks */ = {isa = PBXBuildFile; productRef = 5A87EEEC2F7F893000D028D0 /* TableProSync */; };
11+
5AA136062F82610F00ADCD58 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AA136052F82610F00ADCD58 /* WidgetKit.framework */; };
12+
5AA136082F82610F00ADCD58 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AA136072F82610F00ADCD58 /* SwiftUI.framework */; };
13+
5AA136132F82611000ADCD58 /* TableProWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 5AA136042F82610F00ADCD58 /* TableProWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
1114
5AA3133A2F7EA5B4008EBA97 /* LibPQ.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AA313342F7EA5B4008EBA97 /* LibPQ.xcframework */; };
1215
5AA3133C2F7EA5B4008EBA97 /* Hiredis.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AA313352F7EA5B4008EBA97 /* Hiredis.xcframework */; };
1316
5AA3133E2F7EA5B4008EBA97 /* OpenSSL-Crypto.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AA313362F7EA5B4008EBA97 /* OpenSSL-Crypto.xcframework */; };
@@ -21,6 +24,30 @@
2124
5AB9F3EF2F7C1D03001F3337 /* TableProQuery in Frameworks */ = {isa = PBXBuildFile; productRef = 5AB9F3EE2F7C1D03001F3337 /* TableProQuery */; };
2225
/* End PBXBuildFile section */
2326

27+
/* Begin PBXContainerItemProxy section */
28+
5AA136112F82611000ADCD58 /* PBXContainerItemProxy */ = {
29+
isa = PBXContainerItemProxy;
30+
containerPortal = 5AB9F3D12F7C1C12001F3337 /* Project object */;
31+
proxyType = 1;
32+
remoteGlobalIDString = 5AA136032F82610F00ADCD58;
33+
remoteInfo = TableProWidgetExtension;
34+
};
35+
/* End PBXContainerItemProxy section */
36+
37+
/* Begin PBXCopyFilesBuildPhase section */
38+
5AA136142F82611000ADCD58 /* Embed Foundation Extensions */ = {
39+
isa = PBXCopyFilesBuildPhase;
40+
buildActionMask = 2147483647;
41+
dstPath = "";
42+
dstSubfolderSpec = 13;
43+
files = (
44+
5AA136132F82611000ADCD58 /* TableProWidgetExtension.appex in Embed Foundation Extensions */,
45+
);
46+
name = "Embed Foundation Extensions";
47+
runOnlyForDeploymentPostprocessing = 0;
48+
};
49+
/* End PBXCopyFilesBuildPhase section */
50+
2451
/* Begin PBXFileReference section */
2552
5A87ECDD2F7F88F200D028D0 /* AIPromptTemplates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIPromptTemplates.swift; sourceTree = "<group>"; };
2653
5A87ECDE2F7F88F200D028D0 /* AIPromptTemplates+InlineSuggest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AIPromptTemplates+InlineSuggest.swift"; sourceTree = "<group>"; };
@@ -480,6 +507,10 @@
480507
5A87EEE82F7F891F00D028D0 /* SyncMetadataStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncMetadataStorage.swift; sourceTree = "<group>"; };
481508
5A87EEE92F7F891F00D028D0 /* SyncRecordMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncRecordMapper.swift; sourceTree = "<group>"; };
482509
5A87EEEA2F7F891F00D028D0 /* SyncRecordType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncRecordType.swift; sourceTree = "<group>"; };
510+
5AA136042F82610F00ADCD58 /* TableProWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = TableProWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
511+
5AA136052F82610F00ADCD58 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
512+
5AA136072F82610F00ADCD58 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
513+
5AA136322F82675600ADCD58 /* TableProWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TableProWidgetExtension.entitlements; sourceTree = "<group>"; };
483514
5AA313342F7EA5B4008EBA97 /* LibPQ.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = LibPQ.xcframework; path = ../Libs/ios/LibPQ.xcframework; sourceTree = "<group>"; };
484515
5AA313352F7EA5B4008EBA97 /* Hiredis.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Hiredis.xcframework; path = ../Libs/ios/Hiredis.xcframework; sourceTree = "<group>"; };
485516
5AA313362F7EA5B4008EBA97 /* OpenSSL-Crypto.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = "OpenSSL-Crypto.xcframework"; path = "../Libs/ios/OpenSSL-Crypto.xcframework"; sourceTree = "<group>"; };
@@ -490,7 +521,34 @@
490521
5AB9F3D92F7C1C12001F3337 /* TableProMobile.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TableProMobile.app; sourceTree = BUILT_PRODUCTS_DIR; };
491522
/* End PBXFileReference section */
492523

524+
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
525+
5AA136172F82611000ADCD58 /* Exceptions for "TableProWidget" folder in "TableProWidgetExtension" target */ = {
526+
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
527+
membershipExceptions = (
528+
Info.plist,
529+
);
530+
target = 5AA136032F82610F00ADCD58 /* TableProWidgetExtension */;
531+
};
532+
5AA136302F82660900ADCD58 /* Exceptions for "TableProWidget" folder in "TableProMobile" target */ = {
533+
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
534+
membershipExceptions = (
535+
Shared/SharedConnectionStore.swift,
536+
Shared/WidgetConnectionItem.swift,
537+
);
538+
target = 5AB9F3D82F7C1C12001F3337 /* TableProMobile */;
539+
};
540+
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
541+
493542
/* Begin PBXFileSystemSynchronizedRootGroup section */
543+
5AA136092F82610F00ADCD58 /* TableProWidget */ = {
544+
isa = PBXFileSystemSynchronizedRootGroup;
545+
exceptions = (
546+
5AA136302F82660900ADCD58 /* Exceptions for "TableProWidget" folder in "TableProMobile" target */,
547+
5AA136172F82611000ADCD58 /* Exceptions for "TableProWidget" folder in "TableProWidgetExtension" target */,
548+
);
549+
path = TableProWidget;
550+
sourceTree = "<group>";
551+
};
494552
5AB9F3DB2F7C1C12001F3337 /* TableProMobile */ = {
495553
isa = PBXFileSystemSynchronizedRootGroup;
496554
path = TableProMobile;
@@ -499,6 +557,15 @@
499557
/* End PBXFileSystemSynchronizedRootGroup section */
500558

501559
/* Begin PBXFrameworksBuildPhase section */
560+
5AA136012F82610F00ADCD58 /* Frameworks */ = {
561+
isa = PBXFrameworksBuildPhase;
562+
buildActionMask = 2147483647;
563+
files = (
564+
5AA136082F82610F00ADCD58 /* SwiftUI.framework in Frameworks */,
565+
5AA136062F82610F00ADCD58 /* WidgetKit.framework in Frameworks */,
566+
);
567+
runOnlyForDeploymentPostprocessing = 0;
568+
};
502569
5AB9F3D62F7C1C12001F3337 /* Frameworks */ = {
503570
isa = PBXFrameworksBuildPhase;
504571
buildActionMask = 2147483647;
@@ -1543,14 +1610,18 @@
15431610
5AA313372F7EA5B4008EBA97 /* MariaDB.xcframework */,
15441611
5AA313362F7EA5B4008EBA97 /* OpenSSL-Crypto.xcframework */,
15451612
5AA313392F7EA5B4008EBA97 /* OpenSSL-SSL.xcframework */,
1613+
5AA136052F82610F00ADCD58 /* WidgetKit.framework */,
1614+
5AA136072F82610F00ADCD58 /* SwiftUI.framework */,
15461615
);
15471616
name = Frameworks;
15481617
sourceTree = "<group>";
15491618
};
15501619
5AB9F3D02F7C1C12001F3337 = {
15511620
isa = PBXGroup;
15521621
children = (
1622+
5AA136322F82675600ADCD58 /* TableProWidgetExtension.entitlements */,
15531623
5AB9F3DB2F7C1C12001F3337 /* TableProMobile */,
1624+
5AA136092F82610F00ADCD58 /* TableProWidget */,
15541625
5AA313332F7EA5B4008EBA97 /* Frameworks */,
15551626
5AB9F3DA2F7C1C12001F3337 /* Products */,
15561627
);
@@ -1560,24 +1631,49 @@
15601631
isa = PBXGroup;
15611632
children = (
15621633
5AB9F3D92F7C1C12001F3337 /* TableProMobile.app */,
1634+
5AA136042F82610F00ADCD58 /* TableProWidgetExtension.appex */,
15631635
);
15641636
name = Products;
15651637
sourceTree = "<group>";
15661638
};
15671639
/* End PBXGroup section */
15681640

15691641
/* Begin PBXNativeTarget section */
1642+
5AA136032F82610F00ADCD58 /* TableProWidgetExtension */ = {
1643+
isa = PBXNativeTarget;
1644+
buildConfigurationList = 5AA136182F82611000ADCD58 /* Build configuration list for PBXNativeTarget "TableProWidgetExtension" */;
1645+
buildPhases = (
1646+
5AA136002F82610F00ADCD58 /* Sources */,
1647+
5AA136012F82610F00ADCD58 /* Frameworks */,
1648+
5AA136022F82610F00ADCD58 /* Resources */,
1649+
);
1650+
buildRules = (
1651+
);
1652+
dependencies = (
1653+
);
1654+
fileSystemSynchronizedGroups = (
1655+
5AA136092F82610F00ADCD58 /* TableProWidget */,
1656+
);
1657+
name = TableProWidgetExtension;
1658+
packageProductDependencies = (
1659+
);
1660+
productName = TableProWidgetExtension;
1661+
productReference = 5AA136042F82610F00ADCD58 /* TableProWidgetExtension.appex */;
1662+
productType = "com.apple.product-type.app-extension";
1663+
};
15701664
5AB9F3D82F7C1C12001F3337 /* TableProMobile */ = {
15711665
isa = PBXNativeTarget;
15721666
buildConfigurationList = 5AB9F3E42F7C1C13001F3337 /* Build configuration list for PBXNativeTarget "TableProMobile" */;
15731667
buildPhases = (
15741668
5AB9F3D52F7C1C12001F3337 /* Sources */,
15751669
5AB9F3D62F7C1C12001F3337 /* Frameworks */,
15761670
5AB9F3D72F7C1C12001F3337 /* Resources */,
1671+
5AA136142F82611000ADCD58 /* Embed Foundation Extensions */,
15771672
);
15781673
buildRules = (
15791674
);
15801675
dependencies = (
1676+
5AA136122F82611000ADCD58 /* PBXTargetDependency */,
15811677
);
15821678
fileSystemSynchronizedGroups = (
15831679
5AB9F3DB2F7C1C12001F3337 /* TableProMobile */,
@@ -1601,9 +1697,12 @@
16011697
isa = PBXProject;
16021698
attributes = {
16031699
BuildIndependentTargetsInParallel = 1;
1604-
LastSwiftUpdateCheck = 2640;
1700+
LastSwiftUpdateCheck = 2650;
16051701
LastUpgradeCheck = 2650;
16061702
TargetAttributes = {
1703+
5AA136032F82610F00ADCD58 = {
1704+
CreatedOnToolsVersion = 26.5;
1705+
};
16071706
5AB9F3D82F7C1C12001F3337 = {
16081707
CreatedOnToolsVersion = 26.4;
16091708
};
@@ -1627,11 +1726,19 @@
16271726
projectRoot = "";
16281727
targets = (
16291728
5AB9F3D82F7C1C12001F3337 /* TableProMobile */,
1729+
5AA136032F82610F00ADCD58 /* TableProWidgetExtension */,
16301730
);
16311731
};
16321732
/* End PBXProject section */
16331733

16341734
/* Begin PBXResourcesBuildPhase section */
1735+
5AA136022F82610F00ADCD58 /* Resources */ = {
1736+
isa = PBXResourcesBuildPhase;
1737+
buildActionMask = 2147483647;
1738+
files = (
1739+
);
1740+
runOnlyForDeploymentPostprocessing = 0;
1741+
};
16351742
5AB9F3D72F7C1C12001F3337 /* Resources */ = {
16361743
isa = PBXResourcesBuildPhase;
16371744
buildActionMask = 2147483647;
@@ -1642,6 +1749,13 @@
16421749
/* End PBXResourcesBuildPhase section */
16431750

16441751
/* Begin PBXSourcesBuildPhase section */
1752+
5AA136002F82610F00ADCD58 /* Sources */ = {
1753+
isa = PBXSourcesBuildPhase;
1754+
buildActionMask = 2147483647;
1755+
files = (
1756+
);
1757+
runOnlyForDeploymentPostprocessing = 0;
1758+
};
16451759
5AB9F3D52F7C1C12001F3337 /* Sources */ = {
16461760
isa = PBXSourcesBuildPhase;
16471761
buildActionMask = 2147483647;
@@ -1651,7 +1765,79 @@
16511765
};
16521766
/* End PBXSourcesBuildPhase section */
16531767

1768+
/* Begin PBXTargetDependency section */
1769+
5AA136122F82611000ADCD58 /* PBXTargetDependency */ = {
1770+
isa = PBXTargetDependency;
1771+
target = 5AA136032F82610F00ADCD58 /* TableProWidgetExtension */;
1772+
targetProxy = 5AA136112F82611000ADCD58 /* PBXContainerItemProxy */;
1773+
};
1774+
/* End PBXTargetDependency section */
1775+
16541776
/* Begin XCBuildConfiguration section */
1777+
5AA136152F82611000ADCD58 /* Debug */ = {
1778+
isa = XCBuildConfiguration;
1779+
buildSettings = {
1780+
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
1781+
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
1782+
CODE_SIGN_ENTITLEMENTS = TableProWidgetExtension.entitlements;
1783+
CODE_SIGN_STYLE = Automatic;
1784+
CURRENT_PROJECT_VERSION = 1;
1785+
DEVELOPMENT_TEAM = D7HJ5TFYCU;
1786+
GENERATE_INFOPLIST_FILE = YES;
1787+
INFOPLIST_FILE = TableProWidget/Info.plist;
1788+
INFOPLIST_KEY_CFBundleDisplayName = TableProWidget;
1789+
INFOPLIST_KEY_NSHumanReadableCopyright = "";
1790+
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
1791+
LD_RUNPATH_SEARCH_PATHS = (
1792+
"$(inherited)",
1793+
"@executable_path/Frameworks",
1794+
"@executable_path/../../Frameworks",
1795+
);
1796+
MARKETING_VERSION = 1.0;
1797+
PRODUCT_BUNDLE_IDENTIFIER = com.TablePro.TableProMobile.Widget;
1798+
PRODUCT_NAME = "$(TARGET_NAME)";
1799+
SKIP_INSTALL = YES;
1800+
STRING_CATALOG_GENERATE_SYMBOLS = YES;
1801+
SWIFT_APPROACHABLE_CONCURRENCY = YES;
1802+
SWIFT_EMIT_LOC_STRINGS = YES;
1803+
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
1804+
SWIFT_VERSION = 5.0;
1805+
TARGETED_DEVICE_FAMILY = "1,2";
1806+
};
1807+
name = Debug;
1808+
};
1809+
5AA136162F82611000ADCD58 /* Release */ = {
1810+
isa = XCBuildConfiguration;
1811+
buildSettings = {
1812+
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
1813+
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
1814+
CODE_SIGN_ENTITLEMENTS = TableProWidgetExtension.entitlements;
1815+
CODE_SIGN_STYLE = Automatic;
1816+
CURRENT_PROJECT_VERSION = 1;
1817+
DEVELOPMENT_TEAM = D7HJ5TFYCU;
1818+
GENERATE_INFOPLIST_FILE = YES;
1819+
INFOPLIST_FILE = TableProWidget/Info.plist;
1820+
INFOPLIST_KEY_CFBundleDisplayName = TableProWidget;
1821+
INFOPLIST_KEY_NSHumanReadableCopyright = "";
1822+
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
1823+
LD_RUNPATH_SEARCH_PATHS = (
1824+
"$(inherited)",
1825+
"@executable_path/Frameworks",
1826+
"@executable_path/../../Frameworks",
1827+
);
1828+
MARKETING_VERSION = 1.0;
1829+
PRODUCT_BUNDLE_IDENTIFIER = com.TablePro.TableProMobile.Widget;
1830+
PRODUCT_NAME = "$(TARGET_NAME)";
1831+
SKIP_INSTALL = YES;
1832+
STRING_CATALOG_GENERATE_SYMBOLS = YES;
1833+
SWIFT_APPROACHABLE_CONCURRENCY = YES;
1834+
SWIFT_EMIT_LOC_STRINGS = YES;
1835+
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
1836+
SWIFT_VERSION = 5.0;
1837+
TARGETED_DEVICE_FAMILY = "1,2";
1838+
};
1839+
name = Release;
1840+
};
16551841
5AB9F3E22F7C1C13001F3337 /* Debug */ = {
16561842
isa = XCBuildConfiguration;
16571843
buildSettings = {
@@ -1862,6 +2048,15 @@
18622048
/* End XCBuildConfiguration section */
18632049

18642050
/* Begin XCConfigurationList section */
2051+
5AA136182F82611000ADCD58 /* Build configuration list for PBXNativeTarget "TableProWidgetExtension" */ = {
2052+
isa = XCConfigurationList;
2053+
buildConfigurations = (
2054+
5AA136152F82611000ADCD58 /* Debug */,
2055+
5AA136162F82611000ADCD58 /* Release */,
2056+
);
2057+
defaultConfigurationIsVisible = 0;
2058+
defaultConfigurationName = Release;
2059+
};
18652060
5AB9F3D42F7C1C12001F3337 /* Build configuration list for PBXProject "TableProMobile" */ = {
18662061
isa = XCConfigurationList;
18672062
buildConfigurations = (

0 commit comments

Comments
 (0)