@steedos-labs/content-compliance 0.8.8 → 0.8.10

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 (178) hide show
  1. package/dist/index.js +1 -1
  2. package/lib/actions/bypassApproval.js +18 -0
  3. package/lib/actions/bypassApproval.js.map +1 -1
  4. package/lib/actions/bypassMaterial.js +12 -0
  5. package/lib/actions/bypassMaterial.js.map +1 -1
  6. package/lib/index.js +153 -0
  7. package/lib/index.js.map +1 -1
  8. package/lib/methods/AI.d.ts +6 -0
  9. package/lib/methods/AI.js +116 -15
  10. package/lib/methods/AI.js.map +1 -1
  11. package/lib/methods/__tests__/plsReview.test.d.ts +1 -0
  12. package/lib/methods/__tests__/plsReview.test.js +736 -0
  13. package/lib/methods/__tests__/plsReview.test.js.map +1 -0
  14. package/lib/methods/__tests__/postponeReview.test.js +21 -0
  15. package/lib/methods/__tests__/postponeReview.test.js.map +1 -1
  16. package/lib/methods/__tests__/qcParallelReview.test.d.ts +1 -0
  17. package/lib/methods/__tests__/qcParallelReview.test.js +53 -0
  18. package/lib/methods/__tests__/qcParallelReview.test.js.map +1 -0
  19. package/lib/methods/__tests__/qcPreReview.test.d.ts +1 -0
  20. package/lib/methods/__tests__/qcPreReview.test.js +65 -0
  21. package/lib/methods/__tests__/qcPreReview.test.js.map +1 -0
  22. package/lib/methods/approval_engine.d.ts +4 -0
  23. package/lib/methods/approval_engine.js +388 -221
  24. package/lib/methods/approval_engine.js.map +1 -1
  25. package/lib/methods/consts.d.ts +35 -0
  26. package/lib/methods/consts.js +2 -0
  27. package/lib/methods/consts.js.map +1 -1
  28. package/lib/methods/material.js +13 -0
  29. package/lib/methods/material.js.map +1 -1
  30. package/lib/methods/pls.d.ts +37 -0
  31. package/lib/methods/pls.js +480 -130
  32. package/lib/methods/pls.js.map +1 -1
  33. package/lib/pages/__tests__/aiReviewCardStyles.test.d.ts +1 -0
  34. package/lib/pages/__tests__/aiReviewCardStyles.test.js +36 -0
  35. package/lib/pages/__tests__/aiReviewCardStyles.test.js.map +1 -0
  36. package/lib/pages/__tests__/aiReviewChineseColons.test.d.ts +1 -0
  37. package/lib/pages/__tests__/aiReviewChineseColons.test.js +132 -0
  38. package/lib/pages/__tests__/aiReviewChineseColons.test.js.map +1 -0
  39. package/lib/pages/__tests__/clientCssCacheVersion.test.d.ts +1 -0
  40. package/lib/pages/__tests__/clientCssCacheVersion.test.js +31 -0
  41. package/lib/pages/__tests__/clientCssCacheVersion.test.js.map +1 -0
  42. package/lib/pages/__tests__/materialDetailAIReviewFilter.test.d.ts +1 -0
  43. package/lib/pages/__tests__/materialDetailAIReviewFilter.test.js +51 -0
  44. package/lib/pages/__tests__/materialDetailAIReviewFilter.test.js.map +1 -0
  45. package/lib/pages/__tests__/plsReviewCardStyles.test.d.ts +1 -0
  46. package/lib/pages/__tests__/plsReviewCardStyles.test.js +98 -0
  47. package/lib/pages/__tests__/plsReviewCardStyles.test.js.map +1 -0
  48. package/lib/pages/__tests__/plsReviewPage.test.d.ts +1 -0
  49. package/lib/pages/__tests__/plsReviewPage.test.js +338 -0
  50. package/lib/pages/__tests__/plsReviewPage.test.js.map +1 -0
  51. package/main/default/applications/pepsico_content_setting.app.yml +4 -0
  52. package/main/default/client/pepsico_content.client.js +8 -3
  53. package/main/default/objects/ai_process_detail/ai_process_detail.object.yml +1 -0
  54. package/main/default/objects/ai_process_detail/fields/pls_extracted_data.field.yml +9 -0
  55. package/main/default/objects/ai_process_detail/fields/pls_file_ids.field.yml +9 -0
  56. package/main/default/objects/ai_process_detail/fields/pls_product_name_matched.field.yml +9 -0
  57. package/main/default/objects/ai_process_detail/fields/pls_rule_unique_matched.field.yml +9 -0
  58. package/main/default/objects/pepesio_ch__c/fields/company_id.field.yml +14 -0
  59. package/main/default/objects/pepesio_ch__c/fields/company_ids.field.yml +16 -0
  60. package/main/default/objects/pepesio_ch__c/fields/created.field.yml +10 -0
  61. package/main/default/objects/pepesio_ch__c/fields/created_by.field.yml +9 -0
  62. package/main/default/objects/pepesio_ch__c/fields/file_name.field.yml +8 -0
  63. package/main/default/objects/pepesio_ch__c/fields/instance_state.field.yml +25 -0
  64. package/main/default/objects/pepesio_ch__c/fields/locked.field.yml +12 -0
  65. package/main/default/objects/pepesio_ch__c/fields/material_type.field.yml +10 -0
  66. package/main/default/objects/pepesio_ch__c/fields/media_type.field.yml +13 -0
  67. package/main/default/objects/pepesio_ch__c/fields/modified.field.yml +10 -0
  68. package/main/default/objects/pepesio_ch__c/fields/modified_by.field.yml +9 -0
  69. package/main/default/objects/pepesio_ch__c/fields/name.field.yml +11 -0
  70. package/main/default/objects/pepesio_ch__c/fields/owner.field.yml +12 -0
  71. package/main/default/objects/pepesio_ch__c/fields/product.field.yml +10 -0
  72. package/main/default/objects/pepesio_ch__c/fields/time.field.yml +8 -0
  73. package/main/default/objects/pepesio_ch__c/fields/type.field.yml +22 -0
  74. package/main/default/objects/pepesio_ch__c/listviews/all.listview.yml +21 -0
  75. package/main/default/objects/pepesio_ch__c/listviews/recent.listview.yml +11 -0
  76. package/main/default/objects/pepesio_ch__c/pepesio_ch__c.object.yml +31 -0
  77. package/main/default/objects/pepesio_ch__c/permissions/admin.permission.yml +9 -0
  78. package/main/default/objects/pepesio_ch__c/permissions/user.permission.yml +9 -0
  79. package/main/default/objects/pepsico_ai_review/buttons/pepsico_adopt.button.yml +15 -3
  80. package/main/default/objects/pepsico_ai_review/fields/is_active.field.yml +7 -0
  81. package/main/default/objects/pepsico_ai_review/fields/pepsico_material_approval.field.yml +7 -0
  82. package/main/default/objects/pepsico_ai_review/fields/pls_file.field.yml +7 -0
  83. package/main/default/objects/pepsico_ai_review/fields/review_type.field.yml +12 -0
  84. package/main/default/objects/pepsico_approval_process/fields/type.field.yml +5 -1
  85. package/main/default/objects/pepsico_km_pls/fields/allergen_statement.field.yml +9 -0
  86. package/main/default/objects/pepsico_km_pls/fields/ingredient_list.field.yml +9 -0
  87. package/main/default/objects/pepsico_km_pls/listviews/all.listview.yml +6 -0
  88. package/main/default/objects/pepsico_km_pls_file/listviews/lookup.listview.yml +19 -0
  89. package/main/default/objects/pepsico_km_pls_file/permissions/user.permission.yml +2 -2
  90. package/main/default/objects/pepsico_material/fields/pre_qc_approval_status.field.yml +16 -0
  91. package/main/default/objects/pepsico_material/fields/qc_approval_status.field.yml +16 -0
  92. package/main/default/objects/pepsico_material/fields/qc_bypass_reason.field.yml +11 -0
  93. package/main/default/objects/pepsico_material/fields/qc_bypassed.field.yml +12 -0
  94. package/main/default/objects/pepsico_material/fields/qc_bypassed_at.field.yml +11 -0
  95. package/main/default/objects/pepsico_material/fields/qc_bypassed_by.field.yml +12 -0
  96. package/main/default/objects/pepsico_material/listviews/all.listview.yml +1 -0
  97. package/main/default/objects/pepsico_material_approval/buttons/pepsico_modify_pls.button.yml +70 -0
  98. package/main/default/objects/pepsico_material_approval/buttons/pepsico_postpone_review.button.yml +62 -37
  99. package/main/default/objects/pepsico_material_approval/buttons/pre_review_approve.button.yml +1 -1
  100. package/main/default/objects/pepsico_material_approval/buttons/pre_review_reject.button.yml +1 -1
  101. package/main/default/objects/pepsico_material_approval/fields/approved_flows.field.yml +2 -2
  102. package/main/default/objects/pepsico_material_approval/fields/assistance.field.yml +1 -1
  103. package/main/default/objects/pepsico_material_approval/fields/ca_assistance.field.yml +1 -1
  104. package/main/default/objects/pepsico_material_approval/fields/classification.field.yml +15 -0
  105. package/main/default/objects/pepsico_material_approval/fields/ec_check_food_name.field.yml +18 -0
  106. package/main/default/objects/pepsico_material_approval/fields/ec_check_ingredients.field.yml +18 -0
  107. package/main/default/objects/pepsico_material_approval/fields/ec_check_net_content.field.yml +18 -0
  108. package/main/default/objects/pepsico_material_approval/fields/ec_check_producer_address.field.yml +18 -0
  109. package/main/default/objects/pepsico_material_approval/fields/ec_check_producer_name.field.yml +18 -0
  110. package/main/default/objects/pepsico_material_approval/fields/ec_check_shelf_life.field.yml +18 -0
  111. package/main/default/objects/pepsico_material_approval/fields/ec_check_standard_code.field.yml +18 -0
  112. package/main/default/objects/pepsico_material_approval/fields/ec_check_storage_condition.field.yml +18 -0
  113. package/main/default/objects/pepsico_material_approval/fields/ec_has_detail_page.field.yml +18 -0
  114. package/main/default/objects/pepsico_material_approval/fields/ec_producers.$.field.yml +5 -0
  115. package/main/default/objects/pepsico_material_approval/fields/ec_producers.$.producer_address.field.yml +7 -0
  116. package/main/default/objects/pepsico_material_approval/fields/ec_producers.$.producer_name.field.yml +7 -0
  117. package/main/default/objects/pepsico_material_approval/fields/ec_producers.field.yml +16 -0
  118. package/main/default/objects/pepsico_material_approval/fields/ec_qc_production_email.field.yml +16 -0
  119. package/main/default/objects/pepsico_material_approval/fields/ec_related_approval.field.yml +9 -0
  120. package/main/default/objects/pepsico_material_approval/fields/form_version.field.yml +10 -0
  121. package/main/default/objects/pepsico_material_approval/fields/handler_preca.field.yml +1 -1
  122. package/main/default/objects/pepsico_material_approval/fields/handler_preguding.field.yml +1 -1
  123. package/main/default/objects/pepsico_material_approval/fields/handler_prens.field.yml +1 -1
  124. package/main/default/objects/pepsico_material_approval/fields/handler_preqc.field.yml +22 -0
  125. package/main/default/objects/pepsico_material_approval/fields/handler_presra.field.yml +1 -1
  126. package/main/default/objects/pepsico_material_approval/fields/handler_qc.field.yml +20 -0
  127. package/main/default/objects/pepsico_material_approval/fields/has_nutrition_table.field.yml +18 -0
  128. package/main/default/objects/pepsico_material_approval/fields/legal_assistance.field.yml +1 -1
  129. package/main/default/objects/pepsico_material_approval/fields/ns_assistance.field.yml +1 -1
  130. package/main/default/objects/pepsico_material_approval/fields/pls_file.field.yml +2 -2
  131. package/main/default/objects/pepsico_material_approval/fields/pls_km_files.field.yml +28 -0
  132. package/main/default/objects/pepsico_material_approval/fields/pls_upload_files.field.yml +21 -0
  133. package/main/default/objects/pepsico_material_approval/fields/pre_ca_reviewer.field.yml +1 -1
  134. package/main/default/objects/pepsico_material_approval/fields/pre_ns_reviewer.field.yml +1 -1
  135. package/main/default/objects/pepsico_material_approval/fields/pre_qc_approval_status.field.yml +17 -0
  136. package/main/default/objects/pepsico_material_approval/fields/pre_qc_materials_quantity.field.yml +21 -0
  137. package/main/default/objects/pepsico_material_approval/fields/pre_qc_reviewer.field.yml +19 -0
  138. package/main/default/objects/pepsico_material_approval/fields/pre_reviewer.field.yml +1 -1
  139. package/main/default/objects/pepsico_material_approval/fields/pre_sra_reviewer.field.yml +1 -1
  140. package/main/default/objects/pepsico_material_approval/fields/product.field.yml +15 -0
  141. package/main/default/objects/pepsico_material_approval/fields/qc_approval_status.field.yml +18 -0
  142. package/main/default/objects/pepsico_material_approval/fields/qc_assistance.field.yml +22 -0
  143. package/main/default/objects/pepsico_material_approval/fields/qc_bypass_reason.field.yml +8 -0
  144. package/main/default/objects/pepsico_material_approval/fields/qc_bypassed.field.yml +12 -0
  145. package/main/default/objects/pepsico_material_approval/fields/qc_bypassed_at.field.yml +8 -0
  146. package/main/default/objects/pepsico_material_approval/fields/qc_bypassed_by.field.yml +8 -0
  147. package/main/default/objects/pepsico_material_approval/fields/qc_materials_quantity.field.yml +21 -0
  148. package/main/default/objects/pepsico_material_approval/fields/qc_reviewer.field.yml +22 -0
  149. package/main/default/objects/pepsico_material_approval/fields/sra_assistance.field.yml +1 -1
  150. package/main/default/objects/pepsico_material_approval/listviews/all.listview.yml +2 -0
  151. package/main/default/objects/pepsico_material_approval/pepsico_material_approval.object.yml +4 -0
  152. package/main/default/objects/pepsico_pls_change_log/fields/after_pls_files.field.yml +9 -0
  153. package/main/default/objects/pepsico_pls_change_log/fields/after_pls_names.field.yml +7 -0
  154. package/main/default/objects/pepsico_pls_change_log/fields/approval.field.yml +7 -0
  155. package/main/default/objects/pepsico_pls_change_log/fields/approval_name.field.yml +6 -0
  156. package/main/default/objects/pepsico_pls_change_log/fields/before_pls_files.field.yml +9 -0
  157. package/main/default/objects/pepsico_pls_change_log/fields/before_pls_names.field.yml +7 -0
  158. package/main/default/objects/pepsico_pls_change_log/fields/material.field.yml +8 -0
  159. package/main/default/objects/pepsico_pls_change_log/fields/operator.field.yml +7 -0
  160. package/main/default/objects/pepsico_pls_change_log/fields/scene.field.yml +13 -0
  161. package/main/default/objects/pepsico_pls_change_log/fields/source.field.yml +14 -0
  162. package/main/default/objects/pepsico_pls_change_log/fields/space.field.yml +6 -0
  163. package/main/default/objects/pepsico_pls_change_log/listviews/all.listview.yml +25 -0
  164. package/main/default/objects/pepsico_pls_change_log/pepsico_pls_change_log.object.yml +16 -0
  165. package/main/default/objects/pepsico_pls_change_log/permissions/admin.permission.yml +15 -0
  166. package/main/default/objects/pepsico_pls_change_log/permissions/user.permission.yml +14 -0
  167. package/main/default/objects/pepsico_review_postpone/fields/department_type.field.yml +4 -0
  168. package/main/default/objects/pepsico_reviewer/fields/pre_qc_reviewer.field.yml +10 -0
  169. package/main/default/objects/pepsico_reviewer/fields/qc_assistance.field.yml +14 -0
  170. package/main/default/objects/pepsico_reviewer/fields/qc_reviewer.field.yml +12 -0
  171. package/main/default/objects/pepsico_reviewer/listviews/all.listview.yml +4 -0
  172. package/main/default/pages/pepsico_content_review_detail.page.amis.json +19 -1
  173. package/main/default/pages/pepsico_material_detail.page.amis.json +698 -52
  174. package/main/default/pages/pepsico_material_detail_mobile.page.amis.json +332 -8
  175. package/main/default/tabs/object_pepsico_pls_change_log.tab.yml +14 -0
  176. package/main/default/triggers/pepsico_material_approval_change.trigger.yml +3 -0
  177. package/package.json +1 -1
  178. package/public/content-review/amis.css +344 -9
@@ -143,6 +143,11 @@
143
143
  position: fixed;
144
144
  }
145
145
 
146
+ .antd-Drawer-body .material-detail-no-comments .pepsico_ai_review-tab-content {
147
+ width: 100%;
148
+ position: initial;
149
+ }
150
+
146
151
  .antd-Drawer-body .pepsico_ai_review-tab-content .steedos-record-related-list{
147
152
  height: calc(100% - 175px);
148
153
  }
@@ -152,11 +157,60 @@
152
157
  overflow: auto;
153
158
  }
154
159
 
160
+ /* 「违规画面」缩略图的边长。图片、无图卡片的灰色占位框、放大热区、正文左内边距
161
+ 都取这个值,调整尺寸只改这一处。 */
162
+ .pepsico_ai_review-card{
163
+ --pepsico-ai-thumb-size: 9rem;
164
+ }
165
+
166
+ .pepsico_ai_review-card .antd-Card-multiMedia--left .antd-Card-multiMedia-img{
167
+ width: var(--pepsico-ai-thumb-size);
168
+ height: var(--pepsico-ai-thumb-size);
169
+ }
170
+
171
+ /* 「采纳」与意见内容同排、垂直居中,不再单独占一行。
172
+ 有图卡片的正文/操作区在 .antd-Card-multiMedia-flex 这一列里,
173
+ 无图卡片则直接挂在 .antd-Card 这一列上,两种都要改成行排列。 */
174
+ .pepsico_ai_review-card .antd-Card,
175
+ .pepsico_ai_review-card .antd-Card-multiMedia--left .antd-Card-multiMedia-flex{
176
+ flex-direction: row;
177
+ align-items: center;
178
+ }
179
+
180
+ .pepsico_ai_review-card .antd-Card-body{
181
+ flex: 1 1 auto;
182
+ min-width: 0;
183
+ }
184
+
185
+ /* 卡片高度由缩略图或占位框决定时,让较短的正文在可用高度内垂直居中,
186
+ 保持上、下留白一致。 */
155
187
  .pepsico_ai_review-card-body{
156
- padding-bottom: 0px !important;
188
+ display: flex;
189
+ flex-direction: column;
190
+ justify-content: center;
191
+ }
192
+
193
+ .pepsico_ai_review-card .antd-Card-footer-wrapper{
194
+ flex: 0 0 auto;
195
+ }
196
+
197
+ /* 没有「违规画面」的 AI 意见不会生成 .antd-Card-multiMedia--left 容器,
198
+ amis 只在有多媒体的卡片上重置操作区,无图卡片会退回默认样式:
199
+ 整行铺满、顶部带分隔线、文字居中的纯文本链接。
200
+ 这里把 amis 给有图卡片的那几条重置补给所有 AI 意见卡片,
201
+ 保证有图/无图卡片的「采纳」按钮一致。 */
202
+ .pepsico_ai_review-card .antd-Card-footer-wrapper .antd-Card-actions-wrapper .antd-Card-actions{
203
+ margin-left: unset;
204
+ border: none;
205
+ width: unset;
206
+ }
207
+
208
+ .pepsico_ai_review-card .antd-Card-footer-wrapper .antd-Card-actions-wrapper .antd-Card-actions > a{
209
+ border: none;
210
+ flex-grow: 0;
157
211
  }
158
212
 
159
- .pepsico_ai_review-card .antd-Card-multiMedia--left .antd-Card-footer-wrapper .antd-Card-actions-wrapper .pepsico-adopt{
213
+ .pepsico_ai_review-card .antd-Card-footer-wrapper .antd-Card-actions-wrapper .pepsico-adopt{
160
214
  border-width: 1px;
161
215
  border-style: solid;
162
216
  font-size: var(--button-size-default-fontSize);
@@ -164,7 +218,6 @@
164
218
  border-radius: var(--button-size-default-top-left-border-radius) var(--button-size-default-top-right-border-radius) var(--button-size-default-bottom-right-border-radius) var(--button-size-default-bottom-left-border-radius);
165
219
  padding: var(--button-size-default-paddingTop) var(--button-size-default-paddingRight) var(--button-size-default-paddingBottom) var(--button-size-default-paddingLeft);
166
220
  margin: var(--button-size-default-marginTop) var(--button-size-default-marginRight) var(--button-size-default-marginBottom) var(--button-size-default-marginLeft);
167
- margin-bottom: 0.25rem;
168
221
  margin-right: 1rem;
169
222
  color: #fff;
170
223
  background: var(--button-default-default-bg-color);
@@ -177,21 +230,92 @@
177
230
 
178
231
 
179
232
  .pepsico_ai_review-card .antd-Card-fieldValue .antd-Image-thumb{
180
- width: 9rem !important;
181
- height: 9rem !important;
233
+ width: var(--pepsico-ai-thumb-size) !important;
234
+ height: var(--pepsico-ai-thumb-size) !important;
182
235
  }
183
236
 
184
237
  .pepsico_ai_review-card .antd-Card-fieldValue .antd-Image-thumb img{
185
238
  display: none !important;
186
239
  }
187
240
 
241
+ /* 正文里的第一个字段是「违规画面」的一份副本:图片本身被上面的规则隐藏,
242
+ 留下的空盒子盖在真实图片上,只为提供 amis 的「查看大图」蒙层热区。
243
+ 无图卡片上 amis 渲染的是占位图、不会生成蒙层,这份副本没有用处,
244
+ 还会盖住文字挡住 tooltip,直接隐藏。 */
188
245
  .pepsico_ai_review-card-body .antd-Card-field:first-of-type{
246
+ display: none;
247
+ }
248
+
249
+ /* position: 给下面的热区做定位参照。
250
+ flex: .antd-Card 改成行排列后,多媒体容器成了 flex item,默认按内容宽度收缩,
251
+ 会把「采纳」拽到文字右边而不是卡片最右侧,这里让它撑满整张卡片。 */
252
+ .pepsico_ai_review-card .antd-Card-multiMedia--left{
253
+ position: relative;
254
+ flex: 1 1 auto;
255
+ min-width: 0;
256
+ }
257
+
258
+ /* 有图卡片才需要热区。原来用 left:10px + 静态 top 定位,与图片实际的
259
+ margin(--gap-md) 和 .antd-Card-multiMedia--left 的垂直居中都对不上,
260
+ hover 时的黑色蒙层会错位。改为相对多媒体容器定位,与图片同边距、同轴居中。 */
261
+ .pepsico_ai_review-card .antd-Card-multiMedia--left .pepsico_ai_review-card-body .antd-Card-field:first-of-type{
262
+ display: block;
189
263
  position: absolute;
190
- left: 10px;
264
+ left: var(--gap-md);
265
+ top: 50%;
266
+ transform: translateY(-50%);
191
267
  }
192
268
 
193
- .antd-Drawer .pepsico_ai_review-card-body .antd-TplField>span{
194
- white-space: nowrap !important;
269
+ /* 无「违规画面」时 amis 不会渲染 .antd-Card-multiMedia--left,正文直接挂在
270
+ .antd-Card 下 —— 用这个结构差异认出无图卡片,给它补一个同尺寸同位置的灰色
271
+ 占位框,让有图/无图卡片的正文起点和卡片高度保持一致。
272
+ 占位框用 ::before 绝对定位,不占文档流,所以正文要留出等宽的左内边距、
273
+ 卡片要保证最小高度。 */
274
+ .pepsico_ai_review-card .antd-Card > .pepsico_ai_review-card-body{
275
+ padding-left: calc(var(--pepsico-ai-thumb-size) + var(--gap-md) * 2);
276
+ min-height: calc(var(--pepsico-ai-thumb-size) + var(--gap-md) * 2);
277
+ }
278
+
279
+ .pepsico_ai_review-card .antd-Card > .pepsico_ai_review-card-body::before{
280
+ content: "";
281
+ position: absolute;
282
+ left: var(--gap-md);
283
+ top: 50%;
284
+ transform: translateY(-50%);
285
+ width: var(--pepsico-ai-thumb-size);
286
+ height: var(--pepsico-ai-thumb-size);
287
+ box-sizing: border-box;
288
+ border: var(--Card-borderWidth) solid var(--Card-borderColor);
289
+ border-radius: var(--Card-borderRadius);
290
+ }
291
+
292
+ /* amis 默认给缩略图外层留了 4px 内边距、且是 inline-block(底部还有基线间隙),
293
+ 热区盒子会比图片大一圈、往上偏。去掉后热区与缩略图严丝合缝。 */
294
+ .pepsico_ai_review-card-body .antd-Card-field:first-of-type .antd-ImageField,
295
+ .pepsico_ai_review-card-body .antd-Card-field:first-of-type .antd-Image{
296
+ display: block;
297
+ padding: 0;
298
+ }
299
+
300
+ /* tpl 渲染的是内联的 <span class="TplField"><span>…</span></span>,
301
+ 两层都置为块级:外层让字段间距(mb-1)生效,内层承载下面的挂起缩进。 */
302
+ .pepsico_ai_review-card-body .antd-TplField{
303
+ display: block;
304
+ }
305
+
306
+ /* 提醒原因等长文本完整显示、不截断(配合字段改用 tpl 去掉了 hover tooltip)。
307
+ 原来这里是 white-space:nowrap,配合 .antd-Card-fieldValue 的
308
+ overflow:hidden + text-overflow:ellipsis,长文案只能显示一行。 */
309
+ .pepsico_ai_review-card-body .antd-TplField > span{
310
+ display: block;
311
+ white-space: normal;
312
+ word-break: break-word;
313
+ /* 挂起缩进:负 text-indent 只作用于首行,把首行拉回块起点,
314
+ padding-left 把整块右推,于是折行后的各行与首行正文左对齐、
315
+ 不会顶到「提醒原因: 」标签下面。
316
+ 三个标签都是 4 个汉字 + ": ",实测等宽 4.612em,故取同一个值。 */
317
+ padding-left: 4.612em;
318
+ text-indent: -4.612em;
195
319
  }
196
320
 
197
321
  .steedos-object-table.steedos-crud-mode-cards .antd-Crud .antd-Cards .antd-Cards-body .antd-Card .antd-Card-body .antd-Card-field .antd-Card-fieldValue .antd-TplField{
@@ -204,7 +328,7 @@
204
328
  }
205
329
 
206
330
  .antd-Drawer .steedos-object-table.steedos-crud-mode-cards .antd-Crud .antd-Cards .antd-Cards-body .antd-Card .antd-Card-body .antd-Card-field .antd-Card-fieldValue .antd-TplField{
207
- max-width: auto;
331
+ max-width: none;
208
332
  }
209
333
 
210
334
  .pepsico_ai_review-tab-content .antd-Image--thumb{
@@ -236,6 +360,12 @@
236
360
  margin-right: 0px !important;
237
361
  }
238
362
 
363
+ /* 卡片网格会占满固定高度的列表区域。记录较少时,flex 默认的 align-content: stretch
364
+ 会把剩余高度分摊给每一行;从顶部紧凑排列,把剩余空间留在列表底部。 */
365
+ .steedos-record-related-list .pepsico_ai_review-card .antd-Cards .antd-Cards-body.antd-Grid{
366
+ align-content: flex-start;
367
+ }
368
+
239
369
 
240
370
  .steedos-record-related-list .pepsico_ai_review-card .antd-Cards .antd-Cards-body .antd-Grid-col--sm12{
241
371
  padding: 0px;
@@ -306,3 +436,208 @@ tbody .color-priority-danger *{
306
436
  tbody .color-priority-postponed *{
307
437
  color: #999 !important;
308
438
  }
439
+
440
+ /* PLS 意见按关联文件分组,卡片布局与 AI 审核意见保持一致。 */
441
+ .pepsico-pls-review-group {
442
+ border: 1px solid #d8e2ea;
443
+ border-radius: 6px;
444
+ overflow: hidden;
445
+ background: #fff;
446
+ }
447
+
448
+ .pepsico-pls-review-group-header {
449
+ min-height: 3rem;
450
+ padding: 0.625rem 1rem;
451
+ background: #f3f7fa;
452
+ color: #123f5a;
453
+ font-weight: 600;
454
+ border-bottom: 1px solid #d8e2ea;
455
+ }
456
+
457
+ .pepsico-pls-review-group-header > .antd-Container-body {
458
+ display: flex;
459
+ align-items: center;
460
+ justify-content: space-between;
461
+ gap: 1rem;
462
+ width: 100%;
463
+ }
464
+
465
+ .pepsico-pls-review-file-button {
466
+ flex: 1 1 auto;
467
+ min-width: 0;
468
+ height: auto !important;
469
+ justify-content: flex-start;
470
+ padding: 0.125rem 0;
471
+ color: #1f2933;
472
+ font-size: inherit;
473
+ font-weight: 600;
474
+ white-space: normal;
475
+ text-align: left;
476
+ text-decoration: none;
477
+ overflow: hidden;
478
+ overflow-wrap: anywhere;
479
+ }
480
+
481
+ .pepsico-pls-review-file-button > span {
482
+ display: -webkit-box;
483
+ overflow: hidden;
484
+ line-height: 1.5;
485
+ text-overflow: ellipsis;
486
+ white-space: normal;
487
+ width: 100%;
488
+ -webkit-box-orient: vertical;
489
+ -webkit-line-clamp: 2;
490
+ }
491
+
492
+ .pepsico-pls-review-group-header > .antd-Container-body > .antd-Button:not(.pepsico-pls-review-file-button) {
493
+ flex: 0 0 auto;
494
+ }
495
+
496
+ .pepsico-pls-review-file-button:hover {
497
+ color: var(--private) !important;
498
+ text-decoration: none !important;
499
+ }
500
+
501
+ .pepsico-pls-review-cards {
502
+ margin: 1rem;
503
+ }
504
+
505
+ .pepsico-pls-review-dialog .antd-Modal-content {
506
+ padding: 0;
507
+ overflow: hidden;
508
+ }
509
+
510
+ .pepsico-pls-review-dialog .antd-Modal-header {
511
+ position: absolute;
512
+ top: 0.75rem;
513
+ right: 1rem;
514
+ z-index: 2;
515
+ padding: 0;
516
+ border: 0;
517
+ }
518
+
519
+ .pepsico-pls-review-dialog .antd-Modal-title {
520
+ display: none;
521
+ }
522
+
523
+ .pepsico-pls-review-dialog .antd-Modal-body {
524
+ margin: 0;
525
+ padding: 3.25rem 1.5rem 1.5rem;
526
+ }
527
+
528
+ .pepsico-pls-review-dialog .pepsico-pls-review-wizard {
529
+ margin: 0;
530
+ overflow: hidden;
531
+ border: 0;
532
+ border-radius: 0;
533
+ box-shadow: none;
534
+ }
535
+
536
+ .pepsico-pls-review-wizard .antd-Wizard-steps {
537
+ padding: 1rem 1.25rem;
538
+ background: #f8fafc;
539
+ border-bottom: 1px solid #e5ebf0;
540
+ }
541
+
542
+ .pepsico-pls-review-wizard [role="wizard-body"] {
543
+ padding: 1.5rem 1.25rem;
544
+ }
545
+
546
+ .pepsico-pls-source-summary {
547
+ display: block;
548
+ margin-bottom: 1rem;
549
+ line-height: 1.6;
550
+ }
551
+
552
+ .pepsico-pls-review-wizard [role="wizard-footer"] {
553
+ display: flex;
554
+ justify-content: flex-end;
555
+ gap: 0.75rem;
556
+ padding: 1rem 1.25rem;
557
+ border-top: 1px solid #e5ebf0;
558
+ }
559
+
560
+ .pepsico-pls-source-mode {
561
+ margin-bottom: 1.25rem;
562
+ }
563
+
564
+ .pepsico-pls-source-mode .antd-ButtonGroup {
565
+ display: grid;
566
+ grid-template-columns: repeat(2, minmax(0, 1fr));
567
+ width: 100%;
568
+ }
569
+
570
+ .pepsico-pls-source-mode .antd-Button {
571
+ justify-content: center;
572
+ width: 100%;
573
+ }
574
+
575
+ .pepsico-pls-source-field {
576
+ display: grid;
577
+ grid-template-columns: 10rem minmax(0, 1fr);
578
+ align-items: center;
579
+ column-gap: 1rem;
580
+ }
581
+
582
+ .pepsico-pls-source-field .antd-Form-label,
583
+ .pepsico-pls-source-field .antd-Form-control {
584
+ margin: 0;
585
+ width: auto;
586
+ }
587
+
588
+ @media (max-width: 768px) {
589
+ .pepsico-pls-source-field {
590
+ grid-template-columns: minmax(0, 1fr);
591
+ row-gap: 0.5rem;
592
+ }
593
+
594
+ .pepsico-pls-review-group-header > .antd-Container-body {
595
+ align-items: flex-start;
596
+ }
597
+
598
+ .pepsico-pls-review-dialog .antd-Modal-body {
599
+ padding: 3rem 0.75rem 0.75rem;
600
+ }
601
+
602
+ .pepsico-pls-review-dialog .pepsico-pls-review-wizard {
603
+ margin-top: 0;
604
+ }
605
+
606
+ .pepsico-pls-review-wizard .antd-Wizard-steps,
607
+ .pepsico-pls-review-wizard [role="wizard-body"],
608
+ .pepsico-pls-review-wizard [role="wizard-footer"] {
609
+ padding-left: 0.75rem;
610
+ padding-right: 0.75rem;
611
+ }
612
+ }
613
+
614
+ /* Display each selected PLS lookup record on its own separated row. */
615
+ .pepsico-pls-files-field .steedos-field-lookup-each {
616
+ flex-direction: column !important;
617
+ flex-wrap: nowrap !important;
618
+ align-items: stretch;
619
+ gap: 0 !important;
620
+ width: 100%;
621
+ }
622
+
623
+ .pepsico-pls-files-field .steedos-field-lookup-each > .antd-Form-item {
624
+ width: 100%;
625
+ padding: 6px 0;
626
+ border-bottom: 0;
627
+ }
628
+
629
+ .pepsico-pls-files-field .steedos-field-lookup-each > .antd-Form-item:first-child {
630
+ padding-top: 0;
631
+ }
632
+
633
+ /* 底部分隔线由字段外层容器的 border-b 提供(见字段 yml 的 className),
634
+ 这样线能横跨标签列与值列、与其它字段对齐; 若画在最后一条记录上, 只有值列那么宽。 */
635
+ .pepsico-pls-files-field .steedos-field-lookup-each > .antd-Form-item:last-child {
636
+ padding-bottom: 0;
637
+ }
638
+
639
+ /* 框架只在只读页给字段追加 border-b, 编辑态没有。本字段的 border-b 写死在 className 里
640
+ 会两处都显示, 故在编辑弹框内取消, 保持与同表单其它字段一致。 */
641
+ .antd-Modal .pepsico-pls-files-field {
642
+ border-bottom: 0 !important;
643
+ }