@steedos-labs/content-compliance 0.8.7 → 0.8.9

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