ReactiveDataDisplayManager icon indicating copy to clipboard operation
ReactiveDataDisplayManager copied to clipboard

[SPT-1555] Universal StackView

Open NullIsOne opened this issue 2 years ago • 5 comments

Что сделано?

  • Добавлено StackView по стандартам библиотеки компонентов
  • Усовершенствован StackCellGenerator для построения вьюшек из Nib
  • Проставлен intrisinctContentSize для отображения TitleTableViewCell внутри стека
  • Добавлен пример использования нового StackView внутри коллекции и таблицы
  • Добавлена возможность декорировать инстанс базового генератора
  • Добавлены трансформации в Foldable и Diffable
  • BaseCellGenerator и DiffableCellGenerator теперь привязаны одновременно к UITableViewCell и UICollectionCell. Дубли коллекции удалены.
  • FoldableItem и FoldableCellGenerator теперь универсальные и используют generic extensions для связки с таблицей/коллекцией
  • Добавлена возможность декорировать BaseCellGenerator и трансформировать в Foldable или Diffable
  • ...

Зачем это сделано?

Чтобы уменьшить количество сопровождающих классов при создании сложных ячеек на основе сочетания стека и уже готовых ячеек

На что обратить внимание?

  • ПР драфтовый для раннего обсуждения
  • ~~TBD разрешить todo в TableWrappedCell и CollectionWrappedCell~~ Добавлен EmptyViewGenerator для генерации View, но без установки Model Установка модели будет произведена в ViewWrapper.
  • TBD https://github.com/surfstudio/ReactiveDataDisplayManager/pull/254#issuecomment-1649500915 ~поправить расчет стека при внедрении ячейки внутрь стека (нетиповое использование)~ исправлено добавлением intrinsicContentSize ячейке
  • ~~TBD generic функция generator для контекстно-зависимого вызова и возможного отбрасывания SomeView.rddm. для упрощения синтаксиса~~ добавлены Context для упрощения синтакциса
  • TableStack, CollectionStack и пр. ~~пока не~~ удалены ~~, но будут после улучшения синтаксиса билдера~~. Добавлено все неободимое чтобы приблизить синтаксис к эталонному желаемому варианту.
  • Использование ячейки внутри стека нецелевое, но нужно для показа возможности
  • Напоминаю, что mutating и Property спрячутся за макрос, который ожидает релиза Xcode 15
  • Надо придумать как ограничить трансформации генераторов ведь синтаксис позволяет сделать asFoldable.asDiffable но последняя трансформация в текущей реализации "перекроет" первую..
  • ...

Как протестировать?

  • Тапнуть в примере на строчку "Table with stack cell"

NullIsOne avatar Jul 19 '23 09:07 NullIsOne

Warnings
:warning: Oops! We have found some issues. It's better to fix them to keep code clean

SwiftLint found issues

Severity File Reason
Warning BakgroundStyle.swift:32 Shorthand syntactic sugar should be used, i.e. Int? instead of Optional<Int>. (syntactic_sugar)
Warning BorderStyle.swift:42 Shorthand syntactic sugar should be used, i.e. Int? instead of Optional<Int>. (syntactic_sugar)
Error ComponentsOverviewTableViewController.swift:26 Line should be 145 characters or less: currently 589 characters (line_length)

Generated by :no_entry_sign: Danger Swift against b75c607e3522baae33d837353a9c615e057711ac

github-actions[bot] avatar Jul 19 '23 09:07 github-actions[bot]

Codecov Report

Patch coverage: 13.33% and project coverage change: -40.02% :warning:

Comparison is base (cbf811a) 72.66% compared to head (ea60f8c) 32.64%.

Additional details and impacted files
@@             Coverage Diff              @@
##           develop     #253       +/-   ##
============================================
- Coverage    72.66%   32.64%   -40.02%     
============================================
  Files          161      166        +5     
  Lines         4905     5113      +208     
  Branches      2224     2285       +61     
============================================
- Hits          3564     1669     -1895     
- Misses        1221     3378     +2157     
+ Partials       120       66       -54     
Flag Coverage Δ
uitests ?
unittests 32.64% <13.33%> (-1.39%) :arrow_down:

Flags with carried forward coverage won't be shown. Click here to find out more.

Files Changed Coverage Δ
Source/Collection/CollectionCell+RDDM.swift 0.00% <0.00%> (-100.00%) :arrow_down:
Source/Collection/CollectionSection.swift 0.00% <0.00%> (-100.00%) :arrow_down:
...rs/CalculatableHeightCollectionCellGenerator.swift 0.00% <0.00%> (-100.00%) :arrow_down:
...ors/CalculatableWidthCollectionCellGenerator.swift 0.00% <0.00%> (ø)
...urce/Collection/Generators/CollectionContext.swift 0.00% <0.00%> (ø)
...lugins/PluginAction/CollectionFoldablePlugin.swift 6.97% <0.00%> (-74.42%) :arrow_down:
...ollection/Protocols/CollectionChildrenHolder.swift 0.00% <0.00%> (ø)
...ollection/Wrapper/CollectionWrappedCell+RDDM.swift 0.00% <0.00%> (ø)
...rce/Collection/Wrapper/CollectionWrappedCell.swift 0.00% <0.00%> (ø)
...urce/Common/Generators/DiffableCellGenerator.swift 0.00% <0.00%> (ø)
... and 20 more

... and 83 files with indirect coverage changes

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.

codecov-commenter avatar Jul 19 '23 09:07 codecov-commenter

Обновил синтаксис. По-моему уже лучше, но не идеал конечно.

2 проблемы, с которыми столкнулся

  1. resultBuilder не позволяет использовать статические инициализаторы Решено также как в Editor.Property классе передачей типа: равно точки входа на фабрику (ViewContext, TableContext, CollectionContext). Контексты можно расширять своими функциями и шорткатами.
  2. generic функции надо конкретизировать Пришлось в generic функцию добавить параметр для конкретизации. it.viewNib(type: TitleTableViewCell.self, model: "1") против TitleTableViewCell.rddm.viewGenerator(with: "1", and: .nib) Надо оценить насколько это интуитивно.

Таким образом контекст определяет для какой коллекции нужен генератор. Генераторы создаются через контекст.

В случае со стеком вернул в примере установку children вместо выноса в отдельный параметр, чтобы исключить неочевидные ошибки и конфликты при построении стека и для более древовидной структуры.

NullIsOne avatar Jul 21 '23 08:07 NullIsOne

Очередное обновление и сразу 2 варианта синтаксиса.

  1. it.gen(CellOrViewType.self, model: Model) Снимок экрана 2023-07-26 в 18 19 09 Полностью рабочий, но читаемость все еще далека.
  2. CellOrViewType.build(in: Context, with: Model) Снимок экрана 2023-07-26 в 18 31 48 По сути extension к предыдущему решению. Есть проблема с TableCell классами. Они не выходят на создание baseGenerator из-за чего получаем ~~краш~~ TableWrappedCell<SomeOtherCell> вместо генератора для SomeOtherCell.

Пока склоняюсь ко второму варианту, но его еще надо починить.

Кстати, оба варианта (плюс предыдущий) заваливают варнингами типа такого Снимок экрана 2023-07-26 в 18 18 40 Это напоминает о том, что если уж надо какую-то верстку из ячейки запинуть в стек, то лучше отрефакторить, вынеся необходимый кусок во вью. Отобразить ячейку возможно, но могут быть проблемы с ресайзом, что впринципе и показывает a11y аудит.

NullIsOne avatar Jul 26 '23 15:07 NullIsOne

Убрал ready for review и поставил blocker.

Изменений много. Их надо влить чтобы не мучаться потом с конфликтами.

Синтаксис оригинала достигнут. Добавлена возможность декорировать и трансформировать генераторы.

Тесты на Xcode 15 с performAccessibilityAudit успешны. Снимок экрана 2023-08-01 в 12 05 00

NullIsOne avatar Jul 31 '23 09:07 NullIsOne