@controleonline/ui-common 1.2.71 → 1.2.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/.github/actions/workers/manager/action.yml +147 -0
  2. package/.github/actions/workers/qa/action.yml +44 -0
  3. package/.github/actions/workers/security/action.yml +44 -0
  4. package/.github/actions/workers/technical-documenter/action.yml +51 -0
  5. package/.github/workflows/manager-worker.yml +168 -0
  6. package/.github/workflows/publish-npm.yml +45 -0
  7. package/.gitmodules +3 -0
  8. package/AGENTS.md +6 -0
  9. package/README.md +14 -0
  10. package/package.json +3 -2
  11. package/src/api/fetch.js +1 -1
  12. package/src/api/index.js +92 -22
  13. package/src/react/components/AddImportModal.js +94 -110
  14. package/src/react/components/BottomNavigationBar.config.js +211 -231
  15. package/src/react/components/CategoryForm.js +52 -35
  16. package/src/react/components/DefaultProvider.native.js +131 -95
  17. package/src/react/components/DefaultProvider.web.js +148 -74
  18. package/src/react/components/NetworkPrinterPreviewModal.js +249 -0
  19. package/src/react/components/NetworkPrinterPreviewModal.styles.js +159 -0
  20. package/src/react/components/RuntimeInfoFooter.js +100 -36
  21. package/src/react/components/RuntimeInfoFooter.styles.js +3 -0
  22. package/src/react/components/UnifiedPaymentBar.js +7 -4
  23. package/src/react/components/UserAvatar.js +160 -0
  24. package/src/react/components/integrations/IntegrationHero/index.js +48 -0
  25. package/src/react/components/integrations/IntegrationHero/styles.js +57 -0
  26. package/src/react/components/integrations/IntegrationTabs/index.js +89 -0
  27. package/src/react/components/integrations/IntegrationTabs/styles.js +44 -0
  28. package/src/react/config/deviceConfigBootstrap.js +5 -3
  29. package/src/react/pages/Connections.js +229 -0
  30. package/src/react/pages/Connections.styles.js +222 -0
  31. package/src/react/pages/DeviceDetailPage.js +2814 -0
  32. package/src/react/pages/DeviceDetailPage.styles.js +308 -0
  33. package/src/react/pages/Devices/currentDevice.js +194 -0
  34. package/src/react/pages/Devices/deviceTypes/DeviceGroupCard.js +257 -0
  35. package/src/react/pages/Devices/deviceTypes/all.js +23 -0
  36. package/src/react/pages/Devices/deviceTypes/device.js +25 -0
  37. package/src/react/pages/Devices/deviceTypes/deviceListHelpers.js +178 -0
  38. package/src/react/pages/Devices/deviceTypes/display.js +26 -0
  39. package/src/react/pages/Devices/deviceTypes/index.js +145 -0
  40. package/src/react/pages/Devices/deviceTypes/ipCamera.js +35 -0
  41. package/src/react/pages/Devices/deviceTypes/pdv.js +88 -0
  42. package/src/react/pages/Devices/deviceTypes/printer.js +37 -0
  43. package/src/react/pages/Devices/deviceTypes/shared.js +453 -0
  44. package/src/react/pages/Devices/deviceTypes/useDeviceNetworkConnectivity.js +145 -0
  45. package/src/react/pages/Devices.js +183 -0
  46. package/src/react/pages/Devices.styles.js +353 -0
  47. package/src/react/pages/Food99IntegrationPage/components/Food99CatalogTab.js +219 -0
  48. package/src/react/pages/Food99IntegrationPage/components/Food99OverviewTab.js +134 -0
  49. package/src/react/pages/Food99IntegrationPage/components/Food99PreviewModal.js +173 -0
  50. package/src/react/pages/Food99IntegrationPage/components/Food99ProductCard.js +1 -0
  51. package/src/react/pages/Food99IntegrationPage/components/Food99QuickWalletModal.js +181 -0
  52. package/src/react/pages/Food99IntegrationPage/components/Food99SettingsTab.js +306 -0
  53. package/src/react/pages/Food99IntegrationPage/components/Food99StoreTab.js +417 -0
  54. package/src/react/pages/Food99IntegrationPage/index.js +1530 -0
  55. package/src/react/pages/Food99IntegrationPage/styles.js +792 -0
  56. package/src/react/pages/Food99IntegrationPage/utils.js +155 -0
  57. package/src/react/pages/Food99IntegrationPage.js +1 -0
  58. package/src/react/pages/Food99IntegrationPage.styles.js +1 -0
  59. package/src/react/pages/GenericLogPage.js +42 -167
  60. package/src/react/pages/IFoodIntegrationPage/components/IFoodCatalogTab.js +8 -0
  61. package/src/react/pages/IFoodIntegrationPage/components/IFoodOperationsTab.js +420 -0
  62. package/src/react/pages/IFoodIntegrationPage/components/IFoodOverviewTab.js +118 -0
  63. package/src/react/pages/IFoodIntegrationPage/components/IFoodPreviewModal.js +103 -0
  64. package/src/react/pages/IFoodIntegrationPage/components/IFoodProductCard.js +1 -0
  65. package/src/react/pages/IFoodIntegrationPage/components/IFoodStoreTab.js +150 -0
  66. package/src/react/pages/IFoodIntegrationPage/index.js +1298 -0
  67. package/src/react/pages/IFoodIntegrationPage/styles.js +764 -0
  68. package/src/react/pages/IFoodIntegrationPage/utils.js +91 -0
  69. package/src/react/pages/IFoodIntegrationPage.js +1 -0
  70. package/src/react/pages/IFoodIntegrationPage.styles.js +1 -0
  71. package/src/react/pages/Imports.js +214 -166
  72. package/src/react/pages/IntegrationConfigPage.js +744 -0
  73. package/src/react/pages/IntegrationConfigPage.styles.js +269 -0
  74. package/src/react/pages/Integrations.js +299 -0
  75. package/src/react/pages/Integrations.styles.js +130 -0
  76. package/src/react/pages/ManagerOrderNotificationsPage.js +642 -0
  77. package/src/react/pages/MarketplaceIntegrationPage/components/MarketplaceProductCard.js +205 -0
  78. package/src/react/pages/MarketplaceIntegrationPage/components/RemoteMarketplaceMenuTab.js +335 -0
  79. package/src/react/pages/MarketplaceIntegrationPage/index.js +60 -0
  80. package/src/react/pages/MarketplaceIntegrationPage/utils.js +137 -0
  81. package/src/react/pages/MercadoLivreIntegrationPage.js +538 -0
  82. package/src/react/pages/PrinterDeviceDetailPage.js +1916 -0
  83. package/src/react/pages/PrinterDeviceDetailPage.styles.js +223 -0
  84. package/src/react/pages/PrinterDeviceFormPage.js +521 -0
  85. package/src/react/pages/PrinterDeviceFormPage.styles.js +159 -0
  86. package/src/react/pages/WhatsAppConnectionPage.js +459 -0
  87. package/src/react/pages/WhatsAppConnectionPage.styles.js +284 -0
  88. package/src/react/pages/integrationsCatalog.js +399 -0
  89. package/src/react/services/Cielo/Cielo.js +193 -193
  90. package/src/react/utils/categoryContexts.js +46 -0
  91. package/src/react/utils/entityDisplay.js +222 -217
  92. package/src/react/utils/fileUrl.js +39 -20
  93. package/src/react/utils/integrationPage.js +16 -0
  94. package/src/react/utils/runtimeFooter.js +40 -22
  95. package/src/react/utils/runtimeLanguage.js +50 -9
  96. package/src/react/utils/runtimeMenu.js +191 -131
  97. package/src/react/utils/runtimeZoom.js +43 -0
  98. package/src/react/utils/shopConfig.js +27 -15
  99. package/src/react/utils/shopFranchises.js +126 -1
  100. package/src/react/utils/storeColumns.js +23 -4
  101. package/src/react/utils/userAvatar.js +104 -0
  102. package/src/store/categories/index.js +48 -20
  103. package/src/store/device_config/index.js +62 -21
  104. package/src/store/entity_log/index.js +22 -1
  105. package/src/store/imports/customActions.js +51 -0
  106. package/src/store/imports/index.js +89 -88
  107. package/src/store/status/index.js +11 -11
  108. package/src/store/themes/index.js +22 -0
  109. package/src/store/timezones/index.js +3 -1
  110. package/src/tests/browser/manager/connections.spec.js +143 -0
  111. package/src/tests/browser/manager/devices-current.spec.js +343 -0
  112. package/src/tests/browser/manager/mercado-livre-integration.spec.js +268 -0
  113. package/src/tests/react/api/deviceHeaders.test.js +114 -0
  114. package/src/tests/react/components/AddImportModal.test.js +166 -0
  115. package/src/tests/react/components/BottomNavigationBar.config.test.js +20 -0
  116. package/src/tests/react/components/UserAvatar.test.js +52 -0
  117. package/src/tests/react/pages/DevicePickerStyles.test.js +47 -0
  118. package/src/tests/react/pages/Devices/deviceListHelpers.test.js +39 -0
  119. package/src/tests/react/pages/DevicesCurrentDevice.test.js +198 -0
  120. package/src/tests/react/pages/connectionsHelpers.test.js +34 -0
  121. package/src/tests/react/pages/mercadoLivreIntegrationPageContract.test.mjs +16 -0
  122. package/src/tests/react/services/Cielo.test.js +190 -190
  123. package/src/tests/react/store/categoriesOrdering.test.js +26 -0
  124. package/src/tests/react/utils/appDomain.test.js +62 -0
  125. package/src/tests/react/utils/entityDisplay.test.js +2 -2
  126. package/src/tests/react/utils/fileUrl.test.js +3 -3
  127. package/src/tests/react/utils/formatter.test.mjs +33 -0
  128. package/src/tests/react/utils/runtimeFooter.test.js +29 -4
  129. package/src/tests/react/utils/runtimeLanguage.test.js +79 -9
  130. package/src/tests/react/utils/runtimeMenu.test.js +198 -134
  131. package/src/tests/react/utils/runtimeZoom.test.js +38 -0
  132. package/src/tests/react/utils/shopConfig.test.js +10 -9
  133. package/src/tests/react/utils/shopFranchises.test.js +43 -0
  134. package/src/tests/react/utils/translate.discovery.test.mjs +170 -0
  135. package/src/tests/react/utils/translate.test.helpers.mjs +152 -0
  136. package/src/tests/react/utils/translate.test.mjs +141 -349
  137. package/src/tests/react/utils/userAvatar.test.js +63 -0
  138. package/src/utils/appDomain.js +15 -4
  139. package/src/utils/formatter.js +104 -16
  140. package/src/utils/integrationConfigs.js +80 -80
  141. package/src/utils/translate.js +222 -438
  142. package/src/utils/translateDiscovery.js +96 -0
  143. package/src/utils/translateNormalize.js +33 -0
  144. package/src/utils/translatePending.js +92 -0
  145. package/src/utils/translateStorage.js +142 -0
  146. package/.github/agents/developer.agent.md +0 -30
  147. package/.github/agents/devops.agent.md +0 -30
  148. package/.github/agents/qa.agent.md +0 -30
  149. package/.github/agents/security.agent.md +0 -30
  150. package/.github/workflows/npmjs.yml +0 -35
@@ -1,171 +1,171 @@
1
- const translateLabel = (translate, descriptor) => {
2
- if (!descriptor || typeof descriptor === 'string') {
3
- return descriptor || '';
4
- }
5
-
6
- const translated = translate?.(
7
- descriptor.store,
8
- descriptor.type,
9
- descriptor.key,
10
- );
11
-
12
- return translated || descriptor.fallback || descriptor.key || '';
13
- };
14
-
15
- export const resolveBottomNavigationItems = (items = [], translate) =>
16
- (Array.isArray(items) ? items : []).map(item => ({
17
- ...item,
18
- label: translateLabel(translate, item?.label),
19
- }));
20
-
21
- export const resolveBottomNavigationRoute = (routeAliases = {}, routeName) =>
22
- routeAliases?.[routeName] || routeName || '';
23
-
24
- export const BOTTOM_NAVIGATION_PRESETS = {
25
- crmToolbar: {
26
- items: [
27
- {
28
- route: 'HomePage',
29
- icon: 'home',
30
- label: {
31
- store: 'users',
32
- type: 'label',
33
- key: 'home',
34
- fallback: 'Home',
35
- },
36
- },
37
- {
38
- route: 'CrmIndex',
39
- icon: 'target',
40
- label: {
41
- store: 'users',
42
- type: 'label',
43
- key: 'crm',
44
- fallback: 'CRM',
45
- },
46
- },
47
- {
48
- route: 'ClientsIndex',
49
- icon: 'users',
50
- label: {
51
- store: 'users',
52
- type: 'label',
53
- key: 'clients',
54
- fallback: 'Clients',
55
- },
56
- },
57
- {
58
- route: 'ProfilePage',
59
- icon: 'user',
60
- label: {
61
- store: 'users',
62
- type: 'label',
63
- key: 'profile',
64
- fallback: 'Profile',
65
- },
66
- },
67
- ],
68
- routeAliases: {
69
- HomePage: 'HomePage',
70
- CrmIndex: 'CrmIndex',
71
- ContractsIndex: 'CrmIndex',
72
- ProposalsIndex: 'CrmIndex',
73
- ComissionsPage: 'CrmIndex',
74
- CrmConversation: 'CrmIndex',
75
- ContractDetails: 'CrmIndex',
76
- ClientsIndex: 'ClientsIndex',
77
- ClientDetails: 'ClientsIndex',
78
- FranchiseesIndex: 'ClientsIndex',
79
- ProfilePage: 'ProfilePage',
80
- SettingsPage: 'ProfilePage',
81
- },
82
- },
83
- managerToolbar: {
84
- items: [
85
- {
86
- route: 'HomePage',
87
- icon: 'home',
88
- label: {
89
- store: 'configs',
90
- type: 'toolbar',
91
- key: 'home',
92
- fallback: 'Home',
93
- },
94
- },
95
- {
96
- route: 'CrmIndex',
97
- icon: 'dollar-sign',
98
- label: {
99
- store: 'configs',
100
- type: 'toolbar',
101
- key: 'opportunities',
102
- fallback: 'Oportunidades',
103
- },
104
- },
105
- {
106
- route: 'ClientsIndex',
107
- icon: 'users',
108
- label: {
109
- store: 'configs',
110
- type: 'toolbar',
111
- key: 'customers',
112
- fallback: 'Clientes',
113
- },
114
- },
115
- {
116
- route: 'ProfilePage',
117
- icon: 'user',
118
- label: {
119
- store: 'configs',
120
- type: 'toolbar',
121
- key: 'profile',
122
- fallback: 'Profile',
123
- },
124
- },
125
- ],
126
- routeAliases: {
127
- HomePage: 'HomePage',
128
- CrmIndex: 'CrmIndex',
129
- ContractsIndex: 'CrmIndex',
130
- ProposalsIndex: 'CrmIndex',
131
- ComissionsPage: 'CrmIndex',
132
- CrmConversation: 'CrmIndex',
133
- ContractDetails: 'CrmIndex',
134
- ClientsIndex: 'ClientsIndex',
135
- ClientDetails: 'ClientsIndex',
136
- FranchiseesIndex: 'ClientsIndex',
137
- ProfilePage: 'ProfilePage',
138
- SettingsPage: 'ProfilePage',
139
- OrderHistoryPage: 'CrmIndex',
140
- InventoriesPage: 'CrmIndex',
141
- ProductsPage: 'CrmIndex',
142
- },
143
- },
144
- managerDock: {
145
- items: [
146
- {route: 'HomePage', icon: 'home', label: 'Home'},
147
- {route: 'CrmIndex', icon: 'dollar-sign', label: 'Oportunidades'},
148
- {route: 'ClientsIndex', icon: 'users', label: 'Clientes'},
149
- {route: 'ProfilePage', icon: 'user', label: 'Perfil'},
150
- ],
151
- routeAliases: {
152
- ClientDetails: 'ClientsIndex',
153
- EmployeesIndex: 'ClientsIndex',
154
- FranchiseesIndex: 'ClientsIndex',
155
- },
156
- },
157
- deliveryDock: {
158
- items: [
159
- {route: 'HomePage', icon: 'home', label: 'Home'},
160
- {route: 'DeliveryOrdersPage', icon: 'shopping-bag', label: 'Pedidos'},
161
- {
162
- route: 'DeliveryReceivablesPage',
163
- icon: 'dollar-sign',
164
- label: 'Recebiveis',
165
- },
166
- {route: 'DeliveryCompaniesPage', icon: 'users', label: 'Empresas'},
167
- {route: 'DeliveryRateTablesPage', icon: 'list', label: 'Tabelas'},
168
- ],
1
+ const translateLabel = (translate, descriptor) => {
2
+ if (!descriptor || typeof descriptor === 'string') {
3
+ return descriptor || '';
4
+ }
5
+
6
+ const translated = translate?.(
7
+ descriptor.store,
8
+ descriptor.type,
9
+ descriptor.key,
10
+ );
11
+
12
+ return translated || descriptor.fallback || descriptor.key || '';
13
+ };
14
+
15
+ export const resolveBottomNavigationItems = (items = [], translate) =>
16
+ (Array.isArray(items) ? items : []).map(item => ({
17
+ ...item,
18
+ label: translateLabel(translate, item?.label),
19
+ }));
20
+
21
+ export const resolveBottomNavigationRoute = (routeAliases = {}, routeName) =>
22
+ routeAliases?.[routeName] || routeName || '';
23
+
24
+ export const BOTTOM_NAVIGATION_PRESETS = {
25
+ crmToolbar: {
26
+ items: [
27
+ {
28
+ route: 'HomePage',
29
+ icon: 'home',
30
+ label: {
31
+ store: 'users',
32
+ type: 'label',
33
+ key: 'home',
34
+ fallback: 'Início',
35
+ },
36
+ },
37
+ {
38
+ route: 'CrmIndex',
39
+ icon: 'target',
40
+ label: {
41
+ store: 'users',
42
+ type: 'label',
43
+ key: 'crm',
44
+ fallback: 'CRM',
45
+ },
46
+ },
47
+ {
48
+ route: 'ClientsIndex',
49
+ icon: 'users',
50
+ label: {
51
+ store: 'users',
52
+ type: 'label',
53
+ key: 'clients',
54
+ fallback: 'Clientes',
55
+ },
56
+ },
57
+ {
58
+ route: 'ProfilePage',
59
+ icon: 'user',
60
+ label: {
61
+ store: 'users',
62
+ type: 'label',
63
+ key: 'profile',
64
+ fallback: 'Perfil',
65
+ },
66
+ },
67
+ ],
68
+ routeAliases: {
69
+ HomePage: 'HomePage',
70
+ CrmIndex: 'CrmIndex',
71
+ ContractsIndex: 'CrmIndex',
72
+ ProposalsIndex: 'CrmIndex',
73
+ ComissionsPage: 'CrmIndex',
74
+ CrmConversation: 'CrmIndex',
75
+ ContractDetails: 'CrmIndex',
76
+ ClientsIndex: 'ClientsIndex',
77
+ ClientDetails: 'ClientsIndex',
78
+ FranchiseesIndex: 'ClientsIndex',
79
+ ProfilePage: 'ProfilePage',
80
+ SettingsPage: 'ProfilePage',
81
+ },
82
+ },
83
+ managerToolbar: {
84
+ items: [
85
+ {
86
+ route: 'HomePage',
87
+ icon: 'home',
88
+ label: {
89
+ store: 'configs',
90
+ type: 'toolbar',
91
+ key: 'home',
92
+ fallback: 'Início',
93
+ },
94
+ },
95
+ {
96
+ route: 'CrmIndex',
97
+ icon: 'dollar-sign',
98
+ label: {
99
+ store: 'configs',
100
+ type: 'toolbar',
101
+ key: 'opportunities',
102
+ fallback: 'Oportunidades',
103
+ },
104
+ },
105
+ {
106
+ route: 'ClientsIndex',
107
+ icon: 'users',
108
+ label: {
109
+ store: 'configs',
110
+ type: 'toolbar',
111
+ key: 'customers',
112
+ fallback: 'Clientes',
113
+ },
114
+ },
115
+ {
116
+ route: 'ProfilePage',
117
+ icon: 'user',
118
+ label: {
119
+ store: 'configs',
120
+ type: 'toolbar',
121
+ key: 'profile',
122
+ fallback: 'Perfil',
123
+ },
124
+ },
125
+ ],
126
+ routeAliases: {
127
+ HomePage: 'HomePage',
128
+ CrmIndex: 'CrmIndex',
129
+ ContractsIndex: 'CrmIndex',
130
+ ProposalsIndex: 'CrmIndex',
131
+ ComissionsPage: 'CrmIndex',
132
+ CrmConversation: 'CrmIndex',
133
+ ContractDetails: 'CrmIndex',
134
+ ClientsIndex: 'ClientsIndex',
135
+ ClientDetails: 'ClientsIndex',
136
+ FranchiseesIndex: 'ClientsIndex',
137
+ ProfilePage: 'ProfilePage',
138
+ SettingsPage: 'ProfilePage',
139
+ OrderHistoryPage: 'CrmIndex',
140
+ InventoriesPage: 'CrmIndex',
141
+ ProductsPage: 'CrmIndex',
142
+ },
143
+ },
144
+ managerDock: {
145
+ items: [
146
+ {route: 'HomePage', icon: 'home', label: 'Início'},
147
+ {route: 'CrmIndex', icon: 'dollar-sign', label: 'Oportunidades'},
148
+ {route: 'ClientsIndex', icon: 'users', label: 'Clientes'},
149
+ {route: 'ProfilePage', icon: 'user', label: 'Perfil'},
150
+ ],
151
+ routeAliases: {
152
+ ClientDetails: 'ClientsIndex',
153
+ EmployeesIndex: 'ClientsIndex',
154
+ FranchiseesIndex: 'ClientsIndex',
155
+ },
156
+ },
157
+ deliveryDock: {
158
+ items: [
159
+ {route: 'HomePage', icon: 'home', label: 'Início'},
160
+ {route: 'DeliveryOrdersPage', icon: 'shopping-bag', label: 'Pedidos'},
161
+ {
162
+ route: 'DeliveryReceivablesPage',
163
+ icon: 'dollar-sign',
164
+ label: 'Recebiveis',
165
+ },
166
+ {route: 'DeliveryCompaniesPage', icon: 'users', label: 'Empresas'},
167
+ {route: 'DeliveryRateTablesPage', icon: 'list', label: 'Tabelas'},
168
+ ],
169
169
  routeAliases: {
170
170
  OrderDetails: 'DeliveryOrdersPage',
171
171
  OrderLogisticsPage: 'DeliveryOrdersPage',
@@ -173,66 +173,46 @@ export const BOTTOM_NAVIGATION_PRESETS = {
173
173
  DeliveryVehicleSetupPage: 'DeliveryRateTablesPage',
174
174
  DeliveryRateTableFormPage: 'DeliveryRateTablesPage',
175
175
  DeliveryRateTableCompaniesPage: 'DeliveryRateTablesPage',
176
- DeliveryCourierSchedulesPage: 'DeliveryCompaniesPage',
177
- DeliveryCourierScheduleFormPage: 'DeliveryCompaniesPage',
178
- DeliveryCourierPresencePage: 'DeliveryCompaniesPage',
179
- DeliveryCourierPresenceHistoryPage: 'DeliveryCompaniesPage',
180
- },
181
- },
182
- ppcDock: {
183
- items: [
184
- {route: 'HomePage', icon: 'home', label: 'Home'},
185
- {route: 'DisplayList', icon: 'monitor', label: 'Displays'},
186
- {route: 'ProfilePage', icon: 'user', label: 'Profile'},
187
- ],
188
- routeAliases: {},
189
- },
190
- posToolbar: {
191
- items: [
192
- {
193
- route: 'HomePage',
194
- icon: 'home',
195
- label: {
196
- store: 'orders',
197
- type: 'label',
198
- key: 'home',
199
- fallback: 'Home',
200
- },
201
- },
202
- {
203
- route: 'OrderHistoryPage',
204
- icon: 'shopping-bag',
205
- label: {
206
- store: 'orders',
207
- type: 'label',
208
- key: 'orders',
209
- fallback: 'Orders',
210
- },
211
- },
212
- {
213
- route: 'CashRegisterIndex',
214
- icon: 'credit-card',
215
- label: {
216
- store: 'orders',
217
- type: 'title',
218
- key: 'cashRegister',
219
- fallback: 'Cash register',
220
- },
221
- },
222
- {
223
- route: 'ProfilePage',
224
- icon: 'user',
225
- label: {
226
- store: 'orders',
227
- type: 'label',
228
- key: 'profile',
229
- fallback: 'Profile',
230
- },
231
- },
232
- ],
233
- routeAliases: {},
234
- },
235
- };
236
-
237
- export const getBottomNavigationPreset = variant =>
238
- BOTTOM_NAVIGATION_PRESETS[variant] || BOTTOM_NAVIGATION_PRESETS.managerDock;
176
+ DeliveryCourierSchedulesPage: 'DeliveryCompaniesPage',
177
+ DeliveryCourierScheduleFormPage: 'DeliveryCompaniesPage',
178
+ DeliveryCourierPresencePage: 'DeliveryCompaniesPage',
179
+ DeliveryCourierPresenceHistoryPage: 'DeliveryCompaniesPage',
180
+ },
181
+ },
182
+ ppcDock: {
183
+ items: [
184
+ {route: 'HomePage', icon: 'home', label: 'Início'},
185
+ {route: 'DisplayList', icon: 'monitor', label: 'Displays'},
186
+ {route: 'ProfilePage', icon: 'user', label: 'Perfil'},
187
+ ],
188
+ routeAliases: {},
189
+ },
190
+ posToolbar: {
191
+ items: [
192
+ {
193
+ route: 'OrderHistoryPage',
194
+ icon: 'shopping-bag',
195
+ label: {
196
+ store: 'orders',
197
+ type: 'label',
198
+ key: 'orders',
199
+ fallback: 'Pedidos',
200
+ },
201
+ },
202
+ {
203
+ route: 'ProfilePage',
204
+ icon: 'user',
205
+ label: {
206
+ store: 'orders',
207
+ type: 'label',
208
+ key: 'profile',
209
+ fallback: 'Perfil',
210
+ },
211
+ },
212
+ ],
213
+ routeAliases: {},
214
+ },
215
+ };
216
+
217
+ export const getBottomNavigationPreset = variant =>
218
+ BOTTOM_NAVIGATION_PRESETS[variant] || BOTTOM_NAVIGATION_PRESETS.managerDock;
@@ -10,10 +10,12 @@ import {
10
10
  Modal,
11
11
  } from 'react-native';
12
12
 
13
- import { MaterialCommunityIcons } from '@expo/vector-icons';
14
- import { useStore } from '@store';
15
- import styles from './CategoryForm.styles';
16
- import { inlineStyle_240_75 } from './CategoryForm.styles';
13
+ import { MaterialCommunityIcons } from '@expo/vector-icons';
14
+ import { useStore } from '@store';
15
+ import { colors } from '@controleonline/../../src/styles/colors';
16
+ import { resolveThemePalette } from '@controleonline/../../src/styles/branding';
17
+ import styles from './CategoryForm.styles';
18
+ import { inlineStyle_240_75 } from './CategoryForm.styles';
17
19
 
18
20
  /* ─── Paleta de cores predefinidas ─── */
19
21
  const PRESET_COLORS = [
@@ -131,11 +133,11 @@ const BottomModal = ({ visible, onClose, title, children }) => (
131
133
  );
132
134
 
133
135
  /* ─── Seletor de cor ─── */
134
- const ColorPicker = ({ value, onChange }) => {
135
- const [open, setOpen] = useState(false);
136
- const [hexInput, setHexInput] = useState(value || '#000000');
137
-
138
- useEffect(() => { setHexInput(value || '#000000'); }, [value]);
136
+ const ColorPicker = ({ defaultColor = '#CBD5E1', value, onChange }) => {
137
+ const [open, setOpen] = useState(false);
138
+ const [hexInput, setHexInput] = useState(value || defaultColor);
139
+
140
+ useEffect(() => { setHexInput(value || defaultColor); }, [defaultColor, value]);
139
141
 
140
142
  const applyHex = () => {
141
143
  const v = hexInput.startsWith('#') ? hexInput : `#${hexInput}`;
@@ -152,8 +154,8 @@ const ColorPicker = ({ value, onChange }) => {
152
154
  onPress={() => setOpen(true)}
153
155
  activeOpacity={0.7}
154
156
  >
155
- <View style={[styles.colorSwatch, { backgroundColor: value || '#000000' }]} />
156
- <Text style={styles.colorButtonText}>{value || '#000000'}</Text>
157
+ <View style={[styles.colorSwatch, { backgroundColor: value || defaultColor }]} />
158
+ <Text style={styles.colorButtonText}>{value || defaultColor}</Text>
157
159
  <MaterialCommunityIcons name="palette-outline" size={18} color="#94A3B8" />
158
160
  </TouchableOpacity>
159
161
 
@@ -443,9 +445,17 @@ const CategoryForm = forwardRef(({ category, context = 'products', onClose, onSa
443
445
  const categoriesStore = useStore('categories');
444
446
  const categoryActions = categoriesStore.actions;
445
447
  const categories = categoriesStore.getters.items;
446
- const peopleStore = useStore('people');
447
- const { currentCompany } = peopleStore.getters;
448
- const categoryContext = normalizeCategoryContext(context);
448
+ const peopleStore = useStore('people');
449
+ const { currentCompany } = peopleStore.getters;
450
+ const { colors: themeColors } = useStore('theme').getters;
451
+ const categoryContext = normalizeCategoryContext(context);
452
+ const defaultColor = useMemo(
453
+ () => resolveThemePalette(
454
+ { ...themeColors, ...(currentCompany?.theme?.colors || {}) },
455
+ colors,
456
+ ).primary,
457
+ [currentCompany?.theme?.colors, themeColors],
458
+ );
449
459
 
450
460
  const [name, setName] = useState('');
451
461
  const [color, setColor] = useState('#CBD5E1');
@@ -463,43 +473,48 @@ const CategoryForm = forwardRef(({ category, context = 'products', onClose, onSa
463
473
  useEffect(() => {
464
474
  if (category) {
465
475
  setName(category.name || '');
466
- setColor(category.color || '#CBD5E1');
476
+ setColor(category.color || defaultColor);
467
477
  setIcon(category.icon || '');
468
478
  setParent(category.parent?.id || null);
469
- setSortOrder(String(category?.extraData?.sortOrder || ''));
479
+ setSortOrder(category?.sortOrder === null || category?.sortOrder === undefined
480
+ ? ''
481
+ : String(category.sortOrder));
470
482
  setChannel(String(category?.extraData?.channel || 'default'));
471
483
  } else {
472
484
  setName('');
473
- setColor('#CBD5E1');
485
+ setColor(defaultColor);
474
486
  setIcon('');
475
487
  setParent(null);
476
488
  setSortOrder('');
477
489
  setChannel('default');
478
490
  }
479
- }, [category]);
491
+ }, [category, defaultColor]);
480
492
 
481
- const handleSubmit = async () => {
482
- const payload = {
493
+ const handleSubmit = async () => {
494
+ const categoryExtraData = { ...(category?.extraData || {}) };
495
+ delete categoryExtraData.sortOrder;
496
+ const payload = {
483
497
  ...(category?.id ? { id: category.id } : {}),
484
498
  name,
485
499
  color,
486
500
  icon: icon || '',
487
501
  context: categoryContext,
488
502
  company: companyIri,
489
- parent: parent ? `/categories/${parent}` : null,
490
- extraData: {
491
- ...(category?.extraData || {}),
492
- sortOrder: sortOrder ? parseInt(String(sortOrder).replace(/\D/g, ''), 10) || 0 : 0,
493
- channel: channel || 'default',
494
- },
503
+ parent: parent ? `/categories/${parent}` : null,
504
+ sortOrder: sortOrder === '' ? null : Number.parseInt(sortOrder, 10),
505
+ extraData: {
506
+ ...categoryExtraData,
507
+ channel: channel || 'default',
508
+ },
495
509
  };
496
510
 
497
511
  const saved = await categoryActions.save(payload);
498
512
 
499
513
  await categoryActions.getItems({
500
- context: categoryContext,
501
- 'order[name]': 'ASC',
502
- company: currentCompany.id,
514
+ context: categoryContext,
515
+ 'order[sortOrder]': 'ASC',
516
+ 'order[name]': 'ASC',
517
+ company: currentCompany.id,
503
518
  });
504
519
 
505
520
  if (onSaved) onSaved(saved);
@@ -526,7 +541,7 @@ const CategoryForm = forwardRef(({ category, context = 'products', onClose, onSa
526
541
  {/* Cor */}
527
542
  <View style={styles.field}>
528
543
  <Text style={styles.label}>Cor</Text>
529
- <ColorPicker value={color} onChange={setColor} />
544
+ <ColorPicker defaultColor={defaultColor} value={color} onChange={setColor} />
530
545
  </View>
531
546
 
532
547
  {/* Ícone */}
@@ -559,11 +574,13 @@ const CategoryForm = forwardRef(({ category, context = 'products', onClose, onSa
559
574
  />
560
575
  </View>
561
576
 
562
- {/* Canais */}
563
- <View style={styles.field}>
564
- <Text style={styles.label}>Canais de venda</Text>
565
- <ChannelPicker value={channel} onChange={setChannel} />
566
- </View>
577
+ {/* Vitrines */}
578
+ <View style={styles.field}>
579
+ <Text style={styles.label}>
580
+ {global.t?.t?.('categories', 'label', 'showcases')}
581
+ </Text>
582
+ <ChannelPicker value={channel} onChange={setChannel} />
583
+ </View>
567
584
 
568
585
  </View>
569
586
  );