Skip to content
This repository was archived by the owner on May 20, 2023. It is now read-only.

Commit bc9c9cd

Browse files
TedSandernshahan
authored andcommitted
Provide a path to use Component Factories when using acx code that was previously using the ComponentRenderer pattern.
Also remove SupportsRendering as that was no longer being used. PiperOrigin-RevId: 179479916
1 parent caab81d commit bc9c9cd

16 files changed

+100
-44
lines changed

lib/material_input/material_auto_suggest_input.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import 'package:angular_components/model/selection/selection_container.dart';
3131
import 'package:angular_components/model/selection/selection_model.dart';
3232
import 'package:angular_components/model/selection/selection_options.dart';
3333
import 'package:angular_components/model/selection/string_selection_options.dart';
34-
import 'package:angular_components/model/ui/has_renderer.dart';
34+
import 'package:angular_components/model/ui/has_factory.dart';
3535
import 'package:angular_components/model/ui/highlight_provider.dart';
3636
import 'package:angular_components/model/ui/template_support.dart';
3737
import 'package:angular_components/stop_propagation/stop_propagation.dart';
@@ -437,9 +437,14 @@ class MaterialAutoSuggestInputComponent extends MaterialSelectBase
437437
bool get showLoadingSpinner => loading && options.optionsList.isEmpty;
438438

439439
/// Custom renderer for suggestion labels.
440+
@Deprecated('Use labelFactory instead.')
440441
@Input()
441442
ComponentRenderer labelRenderer;
442443

444+
/// Custom factory for rendering suggestion labels.
445+
@Input()
446+
FactoryRenderer labelFactory;
447+
443448
/// An option is disabled if the options implements Selectable, but the [item]
444449
/// is not selectable.
445450
bool isOptionDisabled(Object item) =>

lib/material_input/material_auto_suggest_input.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,9 @@
9595
(mouseenter)="activeModel.activate(null)">
9696
{{suggestionGroup.uiDisplayName}}
9797
</span>
98-
<dynamic-component *ngIf="labelRenderer != null"
99-
[componentType]="labelRenderer(suggestionGroup)"
98+
<dynamic-component *ngIf="labelRenderer != null || labelFactory != null"
99+
[componentType]="labelRenderer != null ? labelRenderer(suggestionGroup) : null"
100+
[componetFactory]="labelFactory != null ? labelFactory(suggestionGroup) : null"
100101
[value]="suggestionGroup"
101102
(mouseenter)="activeModel.activate(null)">
102103
</dynamic-component>

lib/material_select/material_dropdown_select.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import 'package:angular_components/model/selection/select.dart';
2929
import 'package:angular_components/model/selection/selection_container.dart';
3030
import 'package:angular_components/model/selection/selection_model.dart';
3131
import 'package:angular_components/model/selection/selection_options.dart';
32-
import 'package:angular_components/model/ui/has_renderer.dart';
32+
import 'package:angular_components/model/ui/has_factory.dart';
3333
import 'package:angular_components/model/ui/template_support.dart';
3434
import 'package:angular_components/utils/id_generator/id_generator.dart';
3535

@@ -183,8 +183,14 @@ class MaterialDropdownSelectComponent extends MaterialSelectBase
183183
bool showButtonBorder;
184184

185185
@Input()
186+
@Deprecated(
187+
'Use labelFactory instead it allows for better tree-shakable code.')
186188
ComponentRenderer labelRenderer;
187189

190+
/// Factory used to create labels for the dropdown.
191+
@Input()
192+
FactoryRenderer labelFactory;
193+
188194
/// CSS classes from the root element, passed to the popup to allow scoping of
189195
/// mixins.
190196
///

lib/material_select/material_dropdown_select.html

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,9 @@
6868
{{group.uiDisplayName}}
6969
</span>
7070
<dynamic-component
71-
*ngIf="labelRenderer != null"
72-
[componentType]="labelRenderer(group)"
71+
*ngIf="labelRenderer != null || labelFactory != null"
72+
[componentType]="labelRenderer != null ? labelRenderer(group) : null"
73+
[componentFactory]="labelFactory != null ? labelFactory(group) : null"
7374
[value]="group">
7475
</dynamic-component>
7576
<template [ngIf]="group.isNotEmpty">

lib/material_select/material_select_item.dart

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import 'package:angular_components/mixins/material_dropdown_base.dart';
1616
import 'package:angular_components/model/a11y/active_item_mixin.dart';
1717
import 'package:angular_components/model/selection/selection_container.dart';
1818
import 'package:angular_components/model/selection/selection_model.dart';
19-
import 'package:angular_components/model/ui/has_renderer.dart';
19+
import 'package:angular_components/model/ui/has_factory.dart';
2020
import 'package:angular_components/utils/angular/properties/properties.dart';
2121
import 'package:angular_components/utils/browser/dom_service/dom_service.dart';
2222
import 'package:angular_components/utils/disposer/disposer.dart';
@@ -47,7 +47,12 @@ import 'package:angular_components/utils/disposer/disposer.dart';
4747
)
4848
class MaterialSelectItemComponent extends ButtonDirective
4949
with ActiveItemMixin
50-
implements OnDestroy, SelectionItem, HasRenderer, HasComponentRenderer {
50+
implements
51+
OnDestroy,
52+
SelectionItem,
53+
HasRenderer,
54+
HasComponentRenderer,
55+
HasFactoryRenderer {
5156
final _disposer = new Disposer.oneShot();
5257
final ActivationHandler _activationHandler;
5358
final ChangeDetectorRef _cdRef;
@@ -124,8 +129,14 @@ class MaterialSelectItemComponent extends ButtonDirective
124129
/// Use instead of manual label or item renderer.
125130
@Input()
126131
@override
132+
@Deprecated('Use factoryrenderer instead as it will produce more '
133+
'tree-shakeable code.')
127134
ComponentRenderer componentRenderer;
128135

136+
@Input()
137+
@override
138+
FactoryRenderer factoryRenderer;
139+
129140
/// If true, check marks are used instead of checkboxes to indicate whether or
130141
/// not the item is selected for multi-select items.
131142
///
@@ -202,9 +213,13 @@ class MaterialSelectItemComponent extends ButtonDirective
202213

203214
bool _closeOnActivate = true;
204215

216+
// TODO(google): Remove after migration from ComponentRenderer is complete
205217
Type get componentType =>
206218
componentRenderer != null ? componentRenderer(value) : null;
207219

220+
ComponentFactory get componentFactory =>
221+
factoryRenderer != null ? factoryRenderer(value) : null;
222+
208223
/// Whether this item should be marked as selected.
209224
bool get isSelected => _isMarkedSelected || _isSelectedInSelectionModel;
210225

lib/material_select/material_select_item.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@
3030
&ngsp;
3131
<span *ngIf="valueHasLabel" class="label">{{valueLabel}}</span>
3232
&ngsp;
33-
<dynamic-component *ngIf="componentType != null"
33+
<dynamic-component *ngIf="componentType != null || componentFactory != null"
3434
class="dynamic-item"
3535
[componentType]="componentType"
36+
[componentFactory]="componentFactory"
3637
[value]="value">
3738
</dynamic-component>
3839
<ng-content></ng-content>

lib/model/selection/selection_container.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
import 'package:angular_components/model/selection/selection_model.dart';
66
import 'package:angular_components/model/selection/selection_options.dart';
7-
import 'package:angular_components/model/ui/has_renderer.dart';
7+
import 'package:angular_components/model/ui/has_factory.dart';
88

99
/// A type of component which renders items from a `SelectionModel` and may
1010
/// show options from a `SelectionOptions` model.
1111
abstract class SelectionContainer<T>
12-
implements HasRenderer<T>, HasComponentRenderer {
12+
implements HasRenderer<T>, HasComponentRenderer, HasFactoryRenderer {
1313
/// The selection model this container represents.
1414
SelectionModel<T> _selection;
1515
SelectionModel<T> get selection => _selection;
@@ -40,9 +40,21 @@ abstract class SelectionContainer<T>
4040
@override
4141
ComponentRenderer get componentRenderer => _componentRenderer;
4242
@override
43+
@Deprecated(
44+
'Use factoryRenderer instead it provides more tree-shakeable code')
4345
set componentRenderer(ComponentRenderer value) {
4446
_componentRenderer = value;
4547
}
48+
49+
/// Specifies the factoryRenderer to use to determine the factory for
50+
/// rendering an item.
51+
FactoryRenderer _factoryRenderer;
52+
@override
53+
FactoryRenderer get factoryRenderer => _factoryRenderer;
54+
@override
55+
set factoryRenderer(FactoryRenderer value) {
56+
_factoryRenderer = value;
57+
}
4658
}
4759

4860
/// A type of component which renders an item from a `SelectionModel`.

lib/model/ui/has_factory.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
// This file is separate from has_renderer so it doesn't add in the angular
6+
// dependency and so 'dart:html' which stops tests from running as a simple
7+
// dart_test.
8+
import 'package:angular/angular.dart' show ComponentFactory;
9+
10+
import 'has_renderer.dart';
11+
12+
export 'has_renderer.dart';
13+
14+
/// Defines a method that returns a factory to render the Item. The
15+
/// component created must implement [RendersValue].
16+
typedef ComponentFactory FactoryRenderer<T extends RendersValue, I>(I item);
17+
18+
/// HasFactoryRenderer defines a method that takes in an item and returns the
19+
/// factory to use to render the item.
20+
abstract class HasFactoryRenderer<T extends RendersValue, I> {
21+
FactoryRenderer<T, I> factoryRenderer;
22+
}

lib/model/ui/has_renderer.dart

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,12 @@ abstract class RendersValue<T> {
5454

5555
/// Defines a method that returns a component to render the Item. The
5656
/// component must implement RendersValue.
57+
@Deprecated('Use FactoryRenderer instead as it allows for treeshaking')
5758
typedef Type ComponentRenderer<T extends RendersValue, I>(I item);
5859

5960
/// HasComponentRenderer defines a method that takes in an item and returns the
6061
/// type to use to render the item.
62+
@Deprecated('Use HasFactoryRenderer instead as it allows for treeshaking')
6163
abstract class HasComponentRenderer<T extends RendersValue, I> {
6264
ComponentRenderer<T, I> componentRenderer;
6365
}
@@ -69,30 +71,3 @@ const ItemRenderer nullRenderer = _nullRenderer;
6971

7072
String _nullRenderer(dynamic value) =>
7173
throw new StateError("nullRenderer should never be called");
72-
73-
abstract class SupportsRendering<T extends RendersValue, I>
74-
implements HasRenderer, HasComponentRenderer<T, I> {
75-
/// Sets the componentRenderer and itemRenderer based on whether the
76-
/// renderer implements the appropriate interfaces.
77-
@Deprecated('Set componentRenderer or itemRenderer directly')
78-
set renderer(Object renderer) {
79-
if (renderer is HasRenderer) {
80-
itemRenderer = renderer.itemRenderer;
81-
} else {
82-
// Provide a default.
83-
itemRenderer = defaultItemRenderer;
84-
}
85-
if (renderer is HasComponentRenderer<T, I>) {
86-
componentRenderer = renderer.componentRenderer;
87-
}
88-
}
89-
90-
@override
91-
ComponentRenderer<T, I> componentRenderer;
92-
93-
/// This item renderer is used to convert list items into a string that for
94-
/// the user of the UI.
95-
/// Ex: itemRenderer(0) returns 'black';
96-
@override
97-
ItemRenderer itemRenderer = defaultItemRenderer;
98-
}

lib/src/material_tree/group/material_tree_group.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
*ngIf="useComponentRenderer"
4545
class="item component"
4646
[componentType]="getComponentType(option)"
47+
[componentFactory]="getComponentFactory(option)"
4748
[value]="option">
4849
</dynamic-component>
4950
<span

0 commit comments

Comments
 (0)