Merge lp:~ubuntu-sdk-team/ubuntu-ui-toolkit/tinyText into lp:ubuntu-ui-toolkit/staging

Proposed by Cris Dywan
Status: Work in progress
Proposed branch: lp:~ubuntu-sdk-team/ubuntu-ui-toolkit/tinyText
Merge into: lp:ubuntu-ui-toolkit/staging
Diff against target: 506 lines (+288/-41) (has conflicts)
10 files modified
src/Ubuntu/Components/1.3/InputHandler.qml (+5/-2)
src/Ubuntu/Components/1.3/TextArea.qml (+2/-1)
src/Ubuntu/Components/1.3/TextArea14.qml (+77/-0)
src/Ubuntu/Components/1.3/TextCursor.qml (+6/-30)
src/Ubuntu/Components/1.3/TextField.qml (+2/-0)
src/Ubuntu/Components/1.3/TextField14.qml (+108/-0)
src/Ubuntu/Components/ComponentModule.pro (+2/-0)
src/Ubuntu/Components/Themes/Ambiance/1.3/TextAreaStyle.qml (+0/-2)
src/Ubuntu/Components/qmldir (+4/-2)
tests/unit_x11/tst_components/tst_textinput_common13.qml (+82/-4)
Text conflict in tests/unit_x11/tst_components/tst_textinput_common13.qml
To merge this branch: bzr merge lp:~ubuntu-sdk-team/ubuntu-ui-toolkit/tinyText
Reviewer Review Type Date Requested Status
Ubuntu SDK team Pending
Review via email: mp+295710@code.launchpad.net

Commit message

Tiny Text* components for experimenting

To post a comment you must log in.

Unmerged revisions

1980. By Cris Dywan

Simplify TextArea14 and add a reference ScrollView/Flickable/TextEdit

1979. By Cris Dywan

Tiny Text* components for experimenting

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/Ubuntu/Components/1.3/InputHandler.qml'
--- src/Ubuntu/Components/1.3/InputHandler.qml 2016-05-09 08:12:31 +0000
+++ src/Ubuntu/Components/1.3/InputHandler.qml 2016-05-25 12:39:37 +0000
@@ -90,10 +90,13 @@
90 {90 {
91 if (flickable.moving || flickable.flicking)91 if (flickable.moving || flickable.flicking)
92 return;92 return;
93 //flickable.contentX = MathUtils.clamp(flickable.contentX, flickable.originX, flickable.originX + flickable.contentWidth - flickable.width);
94 return;
93 if (flickable.contentX >= rect.x)95 if (flickable.contentX >= rect.x)
94 flickable.contentX = rect.x;96 flickable.contentX = rect.x;
95 else if (flickable.contentX + flickable.width <= rect.x + rect.width)97 else if (flickable.contentX + flickable.contentWidth <= rect.x + rect.width)
96 flickable.contentX = rect.x + rect.width - flickable.width;98 flickable.contentX = rect.x + rect.width - flickable.contentWidth;
99 return;
97 if (flickable.contentY >= rect.y)100 if (flickable.contentY >= rect.y)
98 flickable.contentY = rect.y;101 flickable.contentY = rect.y;
99 else if (flickable.contentY + flickable.height <= rect.y + rect.height)102 else if (flickable.contentY + flickable.height <= rect.y + rect.height)
100103
=== modified file 'src/Ubuntu/Components/1.3/TextArea.qml'
--- src/Ubuntu/Components/1.3/TextArea.qml 2016-05-12 16:30:27 +0000
+++ src/Ubuntu/Components/1.3/TextArea.qml 2016-05-25 12:39:37 +0000
@@ -884,9 +884,10 @@
884 anchors.topMargin: -internal.frameSpacing884 anchors.topMargin: -internal.frameSpacing
885 anchors.rightMargin: -internal.frameSpacing885 anchors.rightMargin: -internal.frameSpacing
886 anchors.bottomMargin: -internal.frameSpacing886 anchors.bottomMargin: -internal.frameSpacing
887 __alwaysOnScrollbars: true
887 Ubuntu.StyleHints {888 Ubuntu.StyleHints {
888 // No background color889 // No background color
889 troughColorSteppersStyle: Qt.rgba(0, 0, 0, 0)890 // troughColorSteppersStyle: Qt.rgba(0, 0, 0, 0)
890 }891 }
891 }892 }
892893
893894
=== added file 'src/Ubuntu/Components/1.3/TextArea14.qml'
--- src/Ubuntu/Components/1.3/TextArea14.qml 1970-01-01 00:00:00 +0000
+++ src/Ubuntu/Components/1.3/TextArea14.qml 2016-05-25 12:39:37 +0000
@@ -0,0 +1,77 @@
1import QtQuick 2.4
2import Ubuntu.Components 1.3 as Ubuntu
3
4Ubuntu.StyledItem {
5 id: main
6 implicitWidth: units.gu(30)
7 implicitHeight: units.gu(4) * 5
8
9 property alias text: input.text
10 property string placeholderText //FIXME: placeHolder is a placeHolder for now
11
12 styleName: "TextAreaStyle"
13 Keys.forwardTo: [input]
14 // FIXME: property alias activeFocusOnPress: input.activeFocusOnPress
15 activeFocusOnPress: true
16
17 ScrollView {
18 anchors.fill: parent
19 Flickable {
20 id: flickable
21 anchors {
22 fill: parent
23 }
24 property real spacing: main.__styleInstance.frameSpacing
25 topMargin: spacing
26 leftMargin: spacing
27 boundsBehavior: Flickable.StopAtBounds
28 clip: true
29 contentX: -spacing
30 contentY: -spacing
31 contentWidth: input.paintedWidth + spacing
32 contentHeight: input.paintedHeight + spacing
33 interactive: contentHeight > height
34 flickableDirection: Flickable.VerticalFlick
35
36 TextEdit {
37 id: input
38 width: flickable.width - flickable.spacing * 2
39 height: Math.max(flickable.height - flickable.spacing * 2, contentHeight + flickable.spacing * 2)
40 wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere
41
42 color: main.__styleInstance.color
43 selectedTextColor: main.__styleInstance.selectedTextColor
44 selectionColor: main.__styleInstance.selectionColor
45 font.pixelSize: FontUtils.sizeToPixels("medium")
46
47 // FIXME: WIP
48 Ubuntu.Mouse.forwardTo: [main]
49 // activeFocusOnPress: false
50 onFocusChanged: if (focus) main.forceActiveFocus()
51
52 Keys.onPressed: cursorVisible = true
53 selectByMouse: true
54 mouseSelectionMode: TextInput.SelectWords
55 cursorDelegate: Component {
56 Rectangle {
57 color: theme.palette.normal.activity
58 width: units.dp(2)
59 height: input.cursorRectangle.height
60 visible: main.activeFocus
61 }
62 }
63 /* cursorDelegate: TextCursor {
64 handler: handler
65 }
66
67 InputHandler {
68 id: handler
69 anchors.fill: parent
70 main: main
71 input: input
72 flickable: flickable
73 } */
74 }
75 }
76 }
77}
078
=== modified file 'src/Ubuntu/Components/1.3/TextCursor.qml'
--- src/Ubuntu/Components/1.3/TextCursor.qml 2015-12-09 19:59:50 +0000
+++ src/Ubuntu/Components/1.3/TextCursor.qml 2016-05-25 12:39:37 +0000
@@ -51,21 +51,13 @@
51 }51 }
52 property int absY: {52 property int absY: {
53 // Take parent flickable movement into account53 // Take parent flickable movement into account
54 var flickable = handler.main;54 var flickable = handler.flickable;
55 do {55 do {
56 flickable = flickable.parent;56 flickable = flickable.parent;
57 } while (flickable && !flickable.contentY && flickable != fakeCursor.parent);57 } while (flickable && !flickable.contentY && flickable != fakeCursor.parent);
58 return fakeCursor.parent.mapFromItem(handler.main, cursorItem.x, cursorItem.y).y58 return fakeCursor.parent.mapFromItem(handler.main, cursorItem.x, cursorItem.y).y
59 }59 }
6060
61 // Returns "x" or "y" relative to the item handlers are a child of
62 function mappedCursorPosition(coordinate) {
63 var cpos = cursorItem["abs" + coordinate.toUpperCase()];
64 cpos += handler.frameDistance[coordinate];
65 cpos += handler.input[coordinate];
66 cpos -= handler.flickable["content" + coordinate.toUpperCase()];
67 return cpos;
68 }
69 /*61 /*
70 The function opens the text input popover setting the text cursor as caller.62 The function opens the text input popover setting the text cursor as caller.
71 */63 */
@@ -158,7 +150,6 @@
158 property Item draggedItem: Item {150 property Item draggedItem: Item {
159 objectName: cursorItem.positionProperty + "_draggeditem"151 objectName: cursorItem.positionProperty + "_draggeditem"
160 width: caret.width + units.gu(2)152 width: caret.width + units.gu(2)
161 onWidthChanged: draggedItem.moveToCaret()
162 height: cursorItem.height + caret.height + threshold153 height: cursorItem.height + caret.height + threshold
163 property real threshold: units.gu(4)154 property real threshold: units.gu(4)
164 parent: fakeCursor.parent155 parent: fakeCursor.parent
@@ -177,12 +168,6 @@
177 preventStealing: true168 preventStealing: true
178 cursorShape: Qt.IBeamCursor169 cursorShape: Qt.IBeamCursor
179 enabled: parent.width && parent.height && parent.visible && !handler.doubleTapInProgress170 enabled: parent.width && parent.height && parent.visible && !handler.doubleTapInProgress
180 onPressedChanged: {
181 if (!pressed) {
182 // when the dragging ends, reposition the dragger back to caret
183 draggedItem.moveToCaret();
184 }
185 }
186 Ubuntu.Mouse.forwardTo: [dragger]171 Ubuntu.Mouse.forwardTo: [dragger]
187 Ubuntu.Mouse.onClicked: openPopover()172 Ubuntu.Mouse.onClicked: openPopover()
188 Ubuntu.Mouse.onPressAndHold: {173 Ubuntu.Mouse.onPressAndHold: {
@@ -201,16 +186,9 @@
201 }186 }
202 }187 }
203188
204 // aligns the draggedItem to the caret and resets the dragger189 property bool flip: caret.rotation == 180
205 function moveToCaret() {190 x: fakeCursor.x + (flip ? -caret.width : -draggedItem.width + caret.width)
206 if (!caret) {191 y: fakeCursor.y + caret.y + caret.height - threshold
207 return;
208 }
209 // The style may render handlers either on top or bottom
210 var flip = caret.rotation == 180;
211 draggedItem.x = fakeCursor.x + (flip ? -caret.width : -draggedItem.width + caret.width);
212 draggedItem.y = fakeCursor.y + caret.y + caret.height - threshold;
213 }
214 // positions caret to the dragged position192 // positions caret to the dragged position
215 function positionCaret() {193 function positionCaret() {
216 if (dragger.dragActive) {194 if (dragger.dragActive) {
@@ -303,10 +281,8 @@
303 height: cursorItem.height281 height: cursorItem.height
304 Component.onCompleted: caret.parent = fakeCursor282 Component.onCompleted: caret.parent = fakeCursor
305283
306 x: mappedCursorPosition("x")284 x: cursorItem.absX + handler.frameDistance.x + handler.input.x - handler.flickable.contentX
307 y: mappedCursorPosition("y")285 y: cursorItem.absY + handler.frameDistance.y + handler.input.y - handler.flickable.contentY
308 onXChanged: draggedItem.moveToCaret()
309 onYChanged: draggedItem.moveToCaret()
310286
311 // manual clipping: the caret should be visible only while the cursor's287 // manual clipping: the caret should be visible only while the cursor's
312 // top/bottom falls into the text area288 // top/bottom falls into the text area
313289
=== modified file 'src/Ubuntu/Components/1.3/TextField.qml'
--- src/Ubuntu/Components/1.3/TextField.qml 2016-05-02 18:27:11 +0000
+++ src/Ubuntu/Components/1.3/TextField.qml 2016-05-25 12:39:37 +0000
@@ -999,6 +999,8 @@
999 verticalCenter: parent.verticalCenter999 verticalCenter: parent.verticalCenter
1000 }1000 }
1001 topMargin: internal.spacing1001 topMargin: internal.spacing
1002 leftMargin: internal.spacing
1003 rightMargin: internal.spacing
1002 bottomMargin: internal.spacing1004 bottomMargin: internal.spacing
1003 // do not allow rebounding1005 // do not allow rebounding
1004 boundsBehavior: Flickable.StopAtBounds1006 boundsBehavior: Flickable.StopAtBounds
10051007
=== added file 'src/Ubuntu/Components/1.3/TextField14.qml'
--- src/Ubuntu/Components/1.3/TextField14.qml 1970-01-01 00:00:00 +0000
+++ src/Ubuntu/Components/1.3/TextField14.qml 2016-05-25 12:39:37 +0000
@@ -0,0 +1,108 @@
1import QtQuick 2.4
2import Ubuntu.Components 1.3 as Ubuntu
3
4Ubuntu.ActionItem {
5 id: main
6 implicitWidth: units.gu(25)
7 implicitHeight: units.gu(4)
8
9 property alias primaryItem: primary.data
10 Item {
11 id: primary
12 anchors {
13 left: parent.left
14 leftMargin: flickable.spacing
15 }
16 height: parent.height
17 width: childrenRect.width
18 z: 1
19 onChildrenChanged: adjustChildren(primary)
20 function adjustChildren(newParent) {
21 for (var i = 0; i < children.length; i++) {
22 var child = children[i];
23 child.parent = newParent;
24 child.anchors.verticalCenter = verticalCenter;
25 }
26 }
27 }
28 property alias secondaryItem: secondary.data
29 Item {
30 id: secondary
31 anchors {
32 right: parent.right
33 rightMargin: flickable.spacing
34 }
35 height: parent.height
36 width: childrenRect.width
37 z: 1
38 onChildrenChanged: primary.adjustChildren(secondary)
39 }
40 property alias echoMode: input.echoMode
41 property alias text: input.text
42 property string placeholderText //FIXME: placeHolder is a placeHolder for now
43
44 styleName: "TextFieldStyle"
45 Keys.forwardTo: [input]
46 // FIXME: property alias activeFocusOnPress: input.activeFocusOnPress
47 activeFocusOnPress: true
48
49 Flickable {
50 id: flickable
51 anchors {
52 left: primary.right
53 right: secondary.left
54 margins: spacing
55 verticalCenter: parent.verticalCenter
56 }
57 property real spacing: main.__styleInstance.frameSpacing
58 topMargin: spacing
59 leftMargin: spacing
60 rightMargin: spacing
61 bottomMargin: spacing
62 boundsBehavior: Flickable.StopAtBounds
63 clip: true
64 contentWidth: input.contentWidth
65 contentHeight: input.contentHeight
66 height: input.contentHeight
67
68 TextInput {
69 id: input
70 width: parent.width
71 height: parent.height
72
73 color: main.__styleInstance.color
74 selectedTextColor: main.__styleInstance.selectedTextColor
75 selectionColor: main.__styleInstance.selectionColor
76 font.pixelSize: FontUtils.sizeToPixels("medium")
77 passwordCharacter: "\u2022"
78
79 // FIXME: WIP
80 Ubuntu.Mouse.forwardTo: [main]
81 // activeFocusOnPress: false
82 onFocusChanged: if (focus) main.forceActiveFocus()
83
84 Keys.onPressed: cursorVisible = true
85 selectByMouse: true
86 mouseSelectionMode: TextInput.SelectWords
87 cursorDelegate: Component {
88 Rectangle {
89 color: theme.palette.normal.activity
90 width: units.dp(2)
91 height: input.cursorRectangle.height
92 visible: main.activeFocus
93 }
94 }
95 /* cursorDelegate: TextCursor {
96 handler: handler
97 }
98
99 InputHandler {
100 id: handler
101 anchors.fill: parent
102 main: main
103 input: input
104 flickable: flickable
105 } */
106 }
107 }
108}
0109
=== modified file 'src/Ubuntu/Components/ComponentModule.pro'
--- src/Ubuntu/Components/ComponentModule.pro 2016-02-16 11:39:32 +0000
+++ src/Ubuntu/Components/ComponentModule.pro 2016-05-25 12:39:37 +0000
@@ -112,8 +112,10 @@
112 1.3/Tab.qml \112 1.3/Tab.qml \
113 1.3/Tabs.qml \113 1.3/Tabs.qml \
114 1.3/TextArea.qml \114 1.3/TextArea.qml \
115 1.3/TextArea14.qml \
115 1.3/TextCursor.qml \116 1.3/TextCursor.qml \
116 1.3/TextField.qml \117 1.3/TextField.qml \
118 1.3/TextField14.qml \
117 1.3/TextInputPopover.qml \119 1.3/TextInputPopover.qml \
118 1.3/Toolbar.qml \120 1.3/Toolbar.qml \
119 1.3/ToolbarButton.qml \121 1.3/ToolbarButton.qml \
120122
=== modified file 'src/Ubuntu/Components/Themes/Ambiance/1.3/TextAreaStyle.qml'
--- src/Ubuntu/Components/Themes/Ambiance/1.3/TextAreaStyle.qml 2016-05-10 12:08:32 +0000
+++ src/Ubuntu/Components/Themes/Ambiance/1.3/TextAreaStyle.qml 2016-05-25 12:39:37 +0000
@@ -54,8 +54,6 @@
54 anchors.fill: parent54 anchors.fill: parent
55 objectName: "textarea_style"55 objectName: "textarea_style"
5656
57 z: -1
58
59 /*!57 /*!
60 Text input background58 Text input background
61 */59 */
6260
=== modified file 'src/Ubuntu/Components/qmldir'
--- src/Ubuntu/Components/qmldir 2016-02-16 11:39:32 +0000
+++ src/Ubuntu/Components/qmldir 2016-05-25 12:39:37 +0000
@@ -110,8 +110,10 @@
110Tabs 1.3 1.3/Tabs.qml110Tabs 1.3 1.3/Tabs.qml
111ActivityIndicator 1.3 1.3/ActivityIndicator.qml111ActivityIndicator 1.3 1.3/ActivityIndicator.qml
112ProgressBar 1.3 1.3/ProgressBar.qml112ProgressBar 1.3 1.3/ProgressBar.qml
113TextField 1.3 1.3/TextField.qml113# TextField 1.3 1.3/TextField.qml
114TextArea 1.3 1.3/TextArea.qml114TextField 1.3 1.3/TextField14.qml
115# TextArea 1.3 1.3/TextArea.qml
116TextArea 1.3 1.3/TextArea14.qml
115Switch 1.3 1.3/Switch.qml117Switch 1.3 1.3/Switch.qml
116CheckBox 1.3 1.3/CheckBox.qml118CheckBox 1.3 1.3/CheckBox.qml
117Slider 1.3 1.3/Slider.qml119Slider 1.3 1.3/Slider.qml
118120
=== modified file 'tests/unit_x11/tst_components/tst_textinput_common13.qml'
--- tests/unit_x11/tst_components/tst_textinput_common13.qml 2016-05-11 10:59:50 +0000
+++ tests/unit_x11/tst_components/tst_textinput_common13.qml 2016-05-25 12:39:37 +0000
@@ -18,12 +18,17 @@
18import QtTest 1.018import QtTest 1.0
19import Ubuntu.Test 1.319import Ubuntu.Test 1.3
20import Ubuntu.Components 1.320import Ubuntu.Components 1.3
21import Ubuntu.Components.Private 1.3
21import Ubuntu.Components.Popups 1.322import Ubuntu.Components.Popups 1.3
2223
23Item {24Item {
24 id: testMain25 id: testMain
25 width: units.gu(40)26 width: units.gu(40)
27<<<<<<< TREE
26 height: units.gu(70)28 height: units.gu(70)
29=======
30 height: units.gu(90)
31>>>>>>> MERGE-SOURCE
2732
28 Component {33 Component {
29 id: popoverComponent34 id: popoverComponent
@@ -95,6 +100,8 @@
95100
96 TextField {101 TextField {
97 id: textField102 id: textField
103 text: i18n.tr("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.")
104 height: units.gu(6)
98 }105 }
99106
100 FocusScope {107 FocusScope {
@@ -126,21 +133,32 @@
126133
127 TextField {134 TextField {
128 id: customTextField135 id: customTextField
129 text: 'Lorem ipsum dolor sit amet'136 text: i18n.tr("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.")
130 primaryItem: AbstractButton {137 primaryItem: AbstractButton {
131 id: primaryButton138 id: primaryButton
132 height: parent.height139 height: parent.height / 1.7
133 width: height140 width: height
134 Image {141 Image {
135 anchors.fill: parent142 anchors.fill: parent
136 anchors.margins: units.gu(0.5)143 anchors.margins: units.gu(0.5)
137 source: 'image://theme/torch-on'144 source: 'image://theme/torch-on'
138 }145 }
146 Frame {
147 anchors.fill: parent
148 anchors.margins: -units.gu(0.46)
149 thickness: units.gu(0.21)
150 radius: units.gu(1.7)
151 color: theme.palette.normal.focus
152 visible: parent.keyNavigationFocus
153 }
154 // FIXME: activeFocusOnTab: true
155 Component.onCompleted: activeFocusOnTab = true
139 }156 }
140 secondaryItem: AbstractButton {157 secondaryItem: /*Abstract*/Button {
141 id: secondaryButton158 id: secondaryButton
142 height: parent.height159 height: parent.height / 1.7
143 width: height160 width: height
161 color: activeFocus ? UbuntuColors.orange : UbuntuColors.blue
144 Image {162 Image {
145 anchors.fill: parent163 anchors.fill: parent
146 anchors.margins: units.gu(0.5)164 anchors.margins: units.gu(0.5)
@@ -148,8 +166,68 @@
148 }166 }
149 }167 }
150 }168 }
169
170 AbstractButton {
171 width: units.gu(10)
172 height: units.gu(5)
173 Component.onCompleted: activeFocusOnTab = true
174 Frame {
175 anchors.fill: parent
176 anchors.margins: units.gu(0.46)
177 thickness: units.gu(0.21)
178 radius: units.gu(1.7)
179 color: parent.keyNavigationFocus ? theme.palette.normal.focus : theme.palette.normal.foreground
180
181 AbstractButton {
182 anchors.verticalCenter: parent.verticalCenter
183 anchors.right: parent.right
184 width: height
185 height: parent.height / 1.2
186 Component.onCompleted: activeFocusOnTab = true
187 Frame {
188 anchors.fill: parent
189 anchors.margins: units.gu(0.46)
190 thickness: units.gu(0.21)
191 radius: units.gu(1.7)
192 color: parent.keyNavigationFocus ? theme.palette.normal.focus : theme.palette.normal.foreground
193 }
194 }
195 }
196 }
197
151 TextArea {198 TextArea {
152 id: textArea199 id: textArea
200 text: i18n.tr("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.")
201 + i18n.tr("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.")
202 + i18n.tr("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.")
203 + i18n.tr("Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.")
204 }
205 ScrollView {
206 width: units.gu(30)
207 height: units.gu(12)
208 Flickable {
209 id: flickable
210 anchors.fill: parent
211 contentWidth: textInput.paintedWidth
212 contentHeight: textInput.paintedHeight
213 topMargin: units.gu(2)
214 leftMargin: units.gu(2)
215 contentX: leftMargin
216 contentY: topMargin
217 TextEdit {
218 id: textInput
219 text: textArea.text
220 width: flickable.width
221 height: flickable.height
222 wrapMode: TextEdit.WrapAtWordBoundaryOrAnywhere
223 }
224 Rectangle {
225 anchors.fill: parent
226 opacity: 0.3
227 color: UbuntuColors.blue // theme.palette.normal.field
228 }
229
230 }
153 }231 }
154 TextField {232 TextField {
155 id: password233 id: password

Subscribers

People subscribed via source and target branches