Repository navigation
Commit ad030d8
feat(plugin-detail)!: the record page's related panels lose collapse; the header opens the whole list and empty panels fold into one line (#27920)
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
<!-- claude-projects-attribution: {"github_login":"os-bill"} -->
_Requested by **Bill** · [project
thread](https://claude.ai/code/project/chan_016iMXWSZDzqWRWvWzdNo8wg?thread=cmsg_016iMXWSZDzqWRWvWzdNo8wgQSrPxYRF6Q9RRD48Snj7Ks)_
Part of #27524
Clause-②: yes (narrowing)
Metadata-protocol: none
Skills-docs: none — no file under `skills/**` or `content/docs/**`
teaches the related card's collapse, its `⋯` items or the stored
arrangement (a `git grep` for each names nothing); what an author writes
is unchanged.
## 维护者速读
- 改了什么:记录页右栏的关联列表变成同形面板。表头是「标题 + 数量」,点表头或数量打开整张列表;悬停时右端出现 ⠿ + ⋯,⋯
只剩「隐藏」;没有折叠、没有 ⤢。0 行的面板收成一行「还有 N 个空关联 · 名字 · … · 展开」。存储的排列去掉
`collapsed`(版本升到 2,旧记录读作「没选过」)。行内首列跳过指回本记录的外键。
- 为什么改:#27524 的 Target 1、2、10、11(画布 60 定稿),是四个串行 PR 中的第一个;3、12 在 main
上已成立,本 PR 只加钉子。
- 风险与回滚:只动 `@object-ui/plugin-detail`、十个语言包和 app-shell
的偏好编码;已拖过顺序的读者会回到默认顺序一次(无兼容读取,按裁定)。回滚即 revert 本 PR。
-
先看:`ui/packages/plugin-detail/src/RelatedList.tsx`(紧凑面表头与首列);`RelatedListEmptyFold.tsx`(面板行的折叠规则);`synth/relatedArrangement.ts`(去掉
collapsed)。
- 两分钟验证:`pnpm --dir ui exec vitest run
packages/plugin-detail/src/__tests__/RelatedPanel.header-27524.test.tsx
packages/plugin-detail/src/renderers/__tests__/record-related-list.emptyPanels-27524.test.tsx`,预期
2 个文件、14 个测试全绿。
- 需要你做的:无,席位落地。
## What changes
The record page's related column becomes a stack of same-shaped panels
(record page v4, canvas 60). This is PR ① of four serial PRs for #27524,
approved by the seat as a split; each leaves `main` coherent on its own.
| Target item | Where |
|---|---|
| 1 panel header | **this PR** (interim: the header opens the existing
`?related=` face; PR ③ makes it the panel's tab) |
| 2 empty panels fold into one line | **this PR** |
| 3 column foot | already on `main` (`RelatedCardStack-27055` pins it);
unchanged here |
| 10 stored arrangement without `collapsed` | **this PR** |
| 11 compact row's first column | **this PR** |
| 12 highlights = declared minus the name, max 6 | already on `main`;
this PR adds the pin `highlights-27524.test.ts` |
| 4, 5, 6 ⊟ switch, 动态 as the first panel, tiers by container width | PR
② |
| 8, 9 the tab row, enlarged = active tab | PR ③ |
| 7 the top bar | PR ④ (with #27545's ⤢ / ⤡); the last PR, the one that
closes the card |
**1. The panel header** (`RelatedList` compact face,
`RelatedCardMenu.tsx`). Title, then the count chip, inside one `<button
data-related-panel-open>` whose `title` reads 「查看全部 N 条」
(`detail.relatedPanelViewAll`); › shows at the title's end on hover or
focus. The header row itself is the target too: the button's `::after`
stretches over the positioned header, so a click on its free space opens
the list while the row stays one control. The controls sit above it
(`relative z-10`). On hover or focus-within the right end shows ⠿
(`RelatedPanelHandle`: the drag source on desktop; focused, ⌥↑ / ⌥↓ move
the panel and keep focus on it), + and ⋯, which holds 隐藏 only. No
collapse, no ⤢, nothing reserved on the left. On a touch screen (`hover:
none`) the controls stay drawn. The full face of an arranged list (the
Related tab of an authored page) draws the same ⠿ and ⋯ and no longer
collapses from its header.
The header has no click handler of its own, so a click inside the ⋯
menu's portaled content cannot open the list, even though it bubbles
through React. The test `⋯ holds 隐藏 and nothing else` pins this. The
first version, a clickable header `div` guarded by
`event.currentTarget.contains(event.target)`, failed
`clickableNonControlCensus-13461` in CI on `b8c4395be2`. `1d1d2d6e6f`
replaces it with the stretched button. The census is red on `b8c4395be2`
and green after the fix, locally.
**2. Empty panels** (`RelatedListEmptyFold.tsx`). In the panel column
(`RelatedListCompactContext`) a stack of two or more folds its 0-row
panels into one line after the others: 「还有 N 个空关联 · 名字 · … · 展开」
(`detail.relatedEmptyFold`, plural per pack; 展开 reuses
`detail.relatedCardExpand`). Unlike the Related tab's line (#25895,
unchanged), the panel line folds a panel with an `add` picker too, folds
a column whose panels are all empty, and carries no New: 展开 draws the
panels again in their places, each with its own +. Non-empty panels keep
their order. 展开 holds for the record it was pressed on
(`Stack.expandedFor`, `object:id` from the record context). A view that
steps to another record in place, such as the pane's ↓ ↑, keeps its
column element, and the next record folds again.
**10. The stored arrangement** (`synth/relatedArrangement.ts`,
`useRelatedArrangement.ts`, app-shell `workspacePreference.ts`).
`record.related.arrangement` is `{ v, order, hidden, basedOn, seen }`.
`collapsed`, the `collapse` edit and the `defaultCollapsed` argument are
removed; the codec's version is `RELATED_ARRANGEMENT_RECORD_VERSION`
(2), so a version-1 record reads as no choice (no compatibility read,
per the ruling). `CollapsedRelatedCard` and the stack's collapsed branch
go.
**11. The compact row's first column** (`RelatedList`). When the child's
name field is the FK pointing back at this record, the row is named by
the first column that is not that FK, not redacted, not a platform
column and readable. The authored columns are read first, then the
declared fields. The FK is skipped even when it is the only authored
column. So a product's line items name the opportunity.
**i18n.** `detail.relatedCardMoveUp`, `detail.relatedCardMoveDown`,
`detail.relatedCardCollapse` and `detail.relatedCardCount` leave all ten
packs; `detail.relatedPanelViewAll`, `detail.relatedPanelReorder`,
`detail.relatedPanelReorderHint` and `detail.relatedEmptyFold` arrive in
all ten, with each pack's plural set.
**Declared.** `Clause-②: yes (narrowing)`: `RelatedArrangement`,
`ResolvedRelatedArrangement` and `RelatedArrangementEdit` are exported
from the plugin-detail entry and lose members. `@object-ui/i18n`'s
exported `TranslationKeys` (`typeof en`) also loses the four removed
keys. A `t()` call naming one still compiles, because its key parameter
is a `string`. The changeset's BREAKING banner names both packages. Its
ADR-0087 marker, `not-required (runtime-interface-only …)`, names all
four symbols, and the gate verifies it. The changeset also carries the
one-line fix. `RELATED_ARRANGEMENT_RECORD_VERSION` is a new export.
**Source re-measured (main `273137d227` → this branch's base).** S1, S3
and S4 hold. S2 drifted, description only: the page's crumb row carries
‹ back and 「收为抽屉」, with no ↑ ↓. The card names
`synth/recordTimelineStream.ts`; the file is
`src/recordTimelineStream.ts`, and the promotion logic it means lives in
`synth/recordPageColumns.ts` (PR ② retires it there). Neither drift
changes what a Target item asks.
**File surface.** One file outside the card's list:
`ui/packages/app-shell/src/utils/workspacePreference.ts`, the codec of
`record.related.arrangement` (item 10 cannot land without its version).
`RelatedList.tsx`, `RelatedCardMenu.tsx`, `relatedListCompact.ts`,
`renderers/record-related-list.tsx` and `index.tsx` are the files the
header and fold are drawn in, beside the listed ones.
## Tests
New:
- `__tests__/RelatedPanel.header-27524.test.tsx` (10): the real
`RelatedList` compact face with the stack's chrome. Header anatomy
(title, chip, no toggle, no ⤢, 「View all 2」); row, title and chip each
open the list; ⠿ + ⋯ at the right end, hover/focus classes, their clicks
do not open the list; ⋯ holds Hide only and Hide does not open the list;
⌥↑ / ⌥↓ on the handle, a bare arrow does nothing; the handle is the drag
source, the header row is not; the first column on the product page
(`Acme renewal`, `Globex pilot`), also when the FK is the only authored
column, and on the opportunity page (`Widget`); the arranged full face
(the Related tab) draws ⠿ and ⋯, no chevron, and a header click leaves
its rows drawn.
- `renderers/__tests__/record-related-list.emptyPanels-27524.test.tsx`
(4): the line's text and order; 展开 restores the panels in place;
stepping to a sibling record in the same view (same column element)
folds again; an all-empty column folds.
- `synth/__tests__/highlights-27524.test.ts` (3): lead and contact sets
minus `full_name`, the cut at six.
-
`app-shell/src/utils/workspacePreference.relatedArrangement-27524.test.ts`
(2): the v2 shape round-trips; a v1 record carrying `collapsed` reads as
no choice.
Updated, not deleted: `RelatedCardStack-27055` (the collapse case
becomes "a panel has no collapse"; moves via the handle),
`relatedArrangement-27055` (collapse cases become order + hidden),
`RelatedList.compactColumn-26678` (the new header anatomy).
<details><summary>Runs and ablation</summary>
- Pre-merge head `96652743f2`, under the verify lock: `pnpm --dir ui
exec vitest run packages/plugin-detail packages/app-shell/src/utils
packages/i18n` → `Test Files 479 passed | 2 skipped (481)`, `Tests 5209
passed | 39 skipped (5248)`.
- Merged head `fbf43d1dfa` (main `04740b7c9f` merged once, no conflict;
`pnpm install --frozen-lockfile && pnpm build` → 115/115 tasks): the
same command → `Tests 1 failed | 5241 passed | 39 skipped (5281)`. The
one red was `⋯ holds 隐藏 and nothing else` reading a `RelatedList.tsx`
transformed before the commit below landed mid-run (it asserts that
commit's class). On the final head `b8c4395be2`:
`RelatedPanel.header-27524`, `record-related-list.emptyPanels-27524`,
`RelatedList.compactColumn-26678`, `RelatedCardStack-27055` → `Test
Files 4 passed (4)`, `Tests 30 passed (30)`.
- `type-check` (`tsc --noEmit` + `tsc -p tsconfig.test.json`) for
`@object-ui/plugin-detail`, `@object-ui/i18n`, `@object-ui/app-shell` on
the merged head: 0 errors each, lock VERDICT command-exit 0.
- A bug the screenshots found, fixed in `b8c4395be2`: with ⋯ open the
controls faded out, because the pointer and the focus are both inside
the portaled menu. The controls now stay drawn while a control holds
`data-state=open`; the menu test pins it.
- Ablation (`scripts/ablation-replace.mjs`, wrap mode, on `e8a0e9f9fd`):
in `RelatedListEmptyFold.tsx`, `if (!panels && !ordered.some((m) =>
m.empty === false)) return NO_FOLD;` → `if (!ordered.some((m) => m.empty
=== false)) return NO_FOLD; /* ABLATED_27524 */` (anchor 1 → 0, blob
`cfb2543146ea` → `e4a7af3d6923`, marker count 1). Red: `a column whose
panels are all empty folds them too` (`Tests 1 failed | 2 passed (3)`);
the two cases with a non-empty panel stay green, as they should.
Restored: blob equal to HEAD's, `git diff HEAD` empty. The suite imports
the renderer from source, so no `dist` is involved.
- Contract review 6514756946 (FAIL on `b8c4395be2`), fixed in
`8b20d10d4c`. Each pin was ablated (`ablation-replace.mjs`, wrap mode)
and restored:
- ④-1: 展开 scoped to the record. Ablation `stack?.expandedFor ===
recordKey` → `stack?.expandedFor != null`. Result: the sibling case is
red, `Tests 1 failed | 3 passed (4)`.
- ④-2: the first column falls through to the declared fields. Ablation
`[...authored, ...declared]` → `(authored.length > 0 ? authored :
declared)`. Result: the authored-only case is red, `Tests 1 failed | 9
passed (10)`.
- ④-3: the Related tab list no longer collapses. Ablation:
`arrangedFull` put back into `isCollapsible`. Result: the full-face case
is red, `Tests 1 failed | 9 passed (10)`.
- ②-1: the changeset banner names `@object-ui/i18n`, and the marker adds
`ui/packages/i18n/src/locales/en.ts#TranslationKeys`.
`check-adr-0087-registration --base origin/main`: exit 0, four symbols
verified.
- On `8b20d10d4c`: `pnpm --dir ui exec vitest run packages/plugin-detail
packages/app-shell/src/views/RecordDetailView
packages/components/src/__tests__/clickableNonControlCensus-13461.test.ts`
under the lock → `Test Files 425 passed | 1 skipped (426)`, `Tests 3635
passed | 18 skipped (3653)`; `@object-ui/plugin-detail` type-check
VERDICT command-exit 0; eslint on the four touched files 0 errors.
- Proxy preview review 6521198256 (REWORK on `8b20d10d4c`, Target 1: a
press on the header row's free space opened nothing), fixed in
`e6436ddc12`. The open button carries `transform: none`, so the
console's pressed-button `scale(0.96)` no longer makes it the containing
block of its stretched `::after`. On `e6436ddc12`, under the lock:
`RelatedPanel.header-27524`, `RelatedList.compactColumn-26678`,
`RelatedCardStack-27055`, `clickableNonControlCensus-13461` → `Test
Files 4 passed (4)`, `Tests 33 passed (33)`; `@object-ui/plugin-detail`
type-check VERDICT command-exit 0; eslint on the two touched files 0
errors. Ablation (the `style={{ transform: 'none' }}` line replaced by
`/* ABLATED_27920 */` with `sed`, marker count 1): the pin is red
(`expected '' to be 'none'`, `Tests 1 failed | 9 passed (10)`), and a
live press on the free space (Playwright, 120 ms hold, an app-crm
account at 1440) opens nothing. Restored with `git checkout`: `git diff
HEAD` empty, and the same press opens `?related=crm_activity.account`.
</details>
## Acceptance notes
- Screenshots: on `examples/app-crm`, not HotCRM (deviation, as the
order says); six shots in
`/mnt/project-files/ui-seat2/card-27524/shots/` (project files, not a
repository branch), zh, 1440 × 900, on the final head through the
console's dev server: `01-account-1440-panels` (three panels with rows,
then 「还有 1 个空关联 · 线索列表 · 展开」), `02-panel-header-hover` (›, ⠿ + ⋯),
`03-panel-menu-hide-only`, `04-empty-panels-expanded`,
`05-header-click-opens-list` (the interim `?related=` face),
`06-opportunity-1440` (all three panels empty → one line). The tier, the
时间线 | 关联 control and the folded 动态 card in them are `main`'s and change
in PR ② and ④. app-crm has no product object, so Target 11 is shown by
its test only.
- The panel fold line needs a stack of at least two panels; a single
empty panel stays drawn.
- The epic seat verifies in the console preview against the boards
before ACCEPT.
## Verification
<details><summary>Gates (34 derived, all exit 0) and the dogfood
run</summary>
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack`, each run with its exit code captured before
any pipe; `--ran` → `34 derived famil(ies) accounted for`. The run
started on the merged head `fbf43d1dfa`; `b8c4395be2` (one class and one
comment in `RelatedList.tsx`, one test assertion) landed while it ran,
so the gates that read sources after it read the final tree, and the two
that could see the change (`check-comment-mask-corpus`,
`check-adr-0087-registration --base origin/main`) were run again on
`b8c4395be2`: exit 0 both.
```
node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0
node scripts/check-adr-0087-registration.mjs --self-test :: exit 0
node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-empty-changeset.mjs --base origin/main :: exit 0
node scripts/check-empty-changeset.mjs --self-test :: exit 0
node scripts/check-sdui-manifest.mjs :: exit 0
node scripts/check-sdui-manifest.mjs --self-test :: exit 0
node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0
node scripts/release-pending-publish.mjs --self-test :: exit 0
pnpm --dir ui exec vitest run scripts/ :: exit 0
pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0
pnpm check:changeset-gate-self-tests :: exit 0
pnpm check:closed-ceremony-text :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:dispatcher-error-vocabulary :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:engine-double-contract :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-changeset-deadline-census :: exit 0
pnpm check:published-files :: exit 0
pnpm check:query-options-erasure :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:skill-identifier-liveness :: exit 0
pnpm check:test-source-alias :: exit 0
pnpm check:tier-file-adoption :: exit 0
pnpm check:type-check-coverage :: exit 0
pnpm check:type-check-debt :: exit 0 (re-run under the verify lock; the first run queued behind the dogfood hold and exited 3, NOT MEASURED)
pnpm check:undeclared-dep-imports :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm check:where-matcher :: exit 0
pnpm --dir ui run check:i18n-drift :: exit 0
```
Full dogfood once on the final head, because the title carries `!`
(`pnpm --filter @objectstack/dogfood test` under the verify lock, after
`pnpm build`): `b8c4395be2` · `VERDICT command-exit 1` · `Test Files 3
failed | 353 passed | 3 skipped (359)` · `Tests 4 failed | 2867 passed |
20 skipped (2891)`. All four are `main`'s, red at this branch's merge
base `04740b7c9f` and repaired on `main` after it; this diff touches
nothing they read (only `ui/**` and the changeset):
- `error-sentences-live.dogfood.test.ts` › `POST /data/OBJECT` and `POST
/data/OBJECT/createMany` (expect a code-less hook refusal; the server
answers `HOOK_ABORTED` since #27667), and
`object-hook-lifecycle-scratch.dogfood.test.ts` › acceptance[6] (same
cause). `main` carries the repair: #27878.
- `platform-app-object-entry-views.test.ts` › `every object an entry
names is declared…` (`sys_exchange_rate`, since #27246). `main` carries
the repair: #27873.
</details>
<sub>Body refreshed 2026-10-30T11:19Z: the runs line for `e6436ddc12`
(contract review 6521350798, should-fix).</sub>
---
_Generated by [Claude
Code](https://claude.ai/code/session_01Utp6CaA9ZdTcj97mzGtHYt)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 4793aa4 commit ad030d8
29 files changed
Lines changed: 1046 additions & 451 deletions
File tree
- .changeset
- ui/packages
- app-shell/src/utils
- i18n/src/locales
- plugin-detail/src
- __tests__
- renderers
- __tests__
- synth
- __tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
| |||
157 | 158 | | |
158 | 159 | | |
159 | 160 | | |
160 | | - | |
161 | | - | |
162 | | - | |
163 | | - | |
164 | | - | |
165 | | - | |
166 | | - | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
167 | 170 | | |
168 | 171 | | |
169 | 172 | | |
170 | 173 | | |
171 | | - | |
| 174 | + | |
172 | 175 | | |
173 | 176 | | |
174 | 177 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1490 | 1490 | | |
1491 | 1491 | | |
1492 | 1492 | | |
1493 | | - | |
1494 | | - | |
1495 | 1493 | | |
1496 | | - | |
1497 | 1494 | | |
1498 | 1495 | | |
1499 | | - | |
1500 | | - | |
1501 | | - | |
1502 | | - | |
1503 | | - | |
1504 | | - | |
1505 | | - | |
| 1496 | + | |
| 1497 | + | |
| 1498 | + | |
| 1499 | + | |
| 1500 | + | |
| 1501 | + | |
| 1502 | + | |
| 1503 | + | |
| 1504 | + | |
| 1505 | + | |
| 1506 | + | |
| 1507 | + | |
| 1508 | + | |
| 1509 | + | |
| 1510 | + | |
| 1511 | + | |
1506 | 1512 | | |
1507 | 1513 | | |
1508 | 1514 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1332 | 1332 | | |
1333 | 1333 | | |
1334 | 1334 | | |
1335 | | - | |
1336 | | - | |
1337 | 1335 | | |
1338 | | - | |
1339 | 1336 | | |
1340 | 1337 | | |
1341 | | - | |
1342 | | - | |
1343 | | - | |
| 1338 | + | |
| 1339 | + | |
| 1340 | + | |
| 1341 | + | |
| 1342 | + | |
| 1343 | + | |
| 1344 | + | |
| 1345 | + | |
1344 | 1346 | | |
1345 | 1347 | | |
1346 | 1348 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1520 | 1520 | | |
1521 | 1521 | | |
1522 | 1522 | | |
1523 | | - | |
1524 | | - | |
1525 | 1523 | | |
1526 | | - | |
1527 | 1524 | | |
1528 | 1525 | | |
1529 | | - | |
1530 | | - | |
1531 | | - | |
| 1526 | + | |
| 1527 | + | |
| 1528 | + | |
| 1529 | + | |
| 1530 | + | |
| 1531 | + | |
| 1532 | + | |
| 1533 | + | |
1532 | 1534 | | |
1533 | 1535 | | |
1534 | 1536 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1373 | 1373 | | |
1374 | 1374 | | |
1375 | 1375 | | |
1376 | | - | |
1377 | | - | |
1378 | 1376 | | |
1379 | | - | |
1380 | 1377 | | |
1381 | 1378 | | |
1382 | | - | |
1383 | | - | |
1384 | | - | |
1385 | | - | |
| 1379 | + | |
| 1380 | + | |
| 1381 | + | |
| 1382 | + | |
| 1383 | + | |
| 1384 | + | |
| 1385 | + | |
| 1386 | + | |
| 1387 | + | |
| 1388 | + | |
1386 | 1389 | | |
1387 | 1390 | | |
1388 | 1391 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1370 | 1370 | | |
1371 | 1371 | | |
1372 | 1372 | | |
1373 | | - | |
1374 | | - | |
1375 | 1373 | | |
1376 | | - | |
1377 | 1374 | | |
1378 | 1375 | | |
1379 | | - | |
1380 | | - | |
1381 | | - | |
1382 | | - | |
| 1376 | + | |
| 1377 | + | |
| 1378 | + | |
| 1379 | + | |
| 1380 | + | |
| 1381 | + | |
| 1382 | + | |
| 1383 | + | |
| 1384 | + | |
| 1385 | + | |
1383 | 1386 | | |
1384 | 1387 | | |
1385 | 1388 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1175 | 1175 | | |
1176 | 1176 | | |
1177 | 1177 | | |
1178 | | - | |
1179 | | - | |
1180 | 1178 | | |
1181 | | - | |
1182 | 1179 | | |
1183 | 1180 | | |
1184 | | - | |
1185 | | - | |
1186 | | - | |
| 1181 | + | |
| 1182 | + | |
| 1183 | + | |
| 1184 | + | |
| 1185 | + | |
| 1186 | + | |
| 1187 | + | |
| 1188 | + | |
1187 | 1189 | | |
1188 | 1190 | | |
1189 | 1191 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1332 | 1332 | | |
1333 | 1333 | | |
1334 | 1334 | | |
1335 | | - | |
1336 | | - | |
1337 | 1335 | | |
1338 | | - | |
1339 | 1336 | | |
1340 | 1337 | | |
1341 | | - | |
1342 | | - | |
1343 | | - | |
| 1338 | + | |
| 1339 | + | |
| 1340 | + | |
| 1341 | + | |
| 1342 | + | |
| 1343 | + | |
| 1344 | + | |
| 1345 | + | |
1344 | 1346 | | |
1345 | 1347 | | |
1346 | 1348 | | |
| |||
0 commit comments