terrier-engine 4.7.4 → 4.7.6

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.
@@ -12,6 +12,8 @@ import {DiveSettingsModal} from "./dive-settings"
12
12
  import DdSession from "../dd-session"
13
13
  import Messages from "tuff-core/messages"
14
14
  import Arrays from "tuff-core/arrays"
15
+ import TerrierPart from "../../terrier/parts/terrier-part"
16
+ import {DiveRunModal} from "./dive-runs"
15
17
 
16
18
  const log = new Logger("DiveList")
17
19
 
@@ -20,43 +22,32 @@ const log = new Logger("DiveList")
20
22
  // List
21
23
  ////////////////////////////////////////////////////////////////////////////////
22
24
 
23
- export class DiveListPage extends PagePart<{}> {
25
+ export type DiveListState = {
26
+ mode: 'editor' | 'readonly' // whether or not to allow editing or simply viewing dives
27
+ }
24
28
 
25
- newGroupKey = Messages.untypedKey()
26
- editGroupKey = Messages.typedKey<{id: string}>()
27
- newDiveKey = Messages.typedKey<{group_id: string}>()
28
- editDiveKey = Messages.typedKey<{id: string}>()
29
+ /**
30
+ * Show a list of all dive groups and dives that match the given state.
31
+ */
32
+ export class DiveListPart extends TerrierPart<DiveListState> {
33
+
34
+ editGroupKey = Messages.typedKey<{ id: string }>()
35
+ newDiveKey = Messages.typedKey<{ group_id: string }>()
36
+ editDiveKey = Messages.typedKey<{ id: string }>()
37
+ runDiveKey = Messages.typedKey<{ id: string }>()
29
38
 
30
39
  session!: DdSession
31
40
  result!: DiveListResult
32
41
  schema!: SchemaDef
33
42
  groupMap: Record<string, DdDiveGroup> = {}
34
- diveMap: Record<string,DdDive> = {}
43
+ diveMap: Record<string, DdDive> = {}
44
+
35
45
 
36
46
  async init() {
37
- this.setTitle("Data Dive")
38
- this.setIcon('glyp-data_dives')
39
47
 
40
48
  this.schema = await Schema.get()
41
49
  this.session = await DdSession.get()
42
50
 
43
- this.mainContentWidth = 'wide'
44
-
45
- this.addAction({
46
- title: "New Group",
47
- icon: 'glyp-plus_outline',
48
- click: {key: this.newGroupKey}
49
- }, 'tertiary')
50
-
51
- this.onClick(this.newGroupKey, _ => {
52
- log.info("Showing new dive group model")
53
- const newGroup = {name: '', group_types: []}
54
- this.app.showModal(GroupEditorModal, {session: this.session,
55
- group: newGroup,
56
- callback: _ => this.reload()
57
- })
58
- })
59
-
60
51
  this.onClick(this.editGroupKey, m => {
61
52
  log.info(`Edit group ${m.data.id}`)
62
53
  const group = this.groupMap[m.data.id]
@@ -66,8 +57,7 @@ export class DiveListPage extends PagePart<{}> {
66
57
  group: group as UnpersistedDdDiveGroup,
67
58
  callback: _ => this.reload()
68
59
  })
69
- }
70
- else {
60
+ } else {
71
61
  this.alertToast(`No group with id ${m.data.id}`)
72
62
  }
73
63
  })
@@ -91,13 +81,22 @@ export class DiveListPage extends PagePart<{}> {
91
81
  if (dive) {
92
82
  log.info(`Editing settings for dive: ${dive.name}`)
93
83
  this.app.showModal(DiveSettingsModal, {schema: this.schema, dive, session: this.session})
84
+ } else {
85
+ log.warn(`No dive with id ${m.data.id}`)
94
86
  }
95
- else {
87
+ })
88
+
89
+ this.onClick(this.runDiveKey, m => {
90
+ const dive = this.diveMap[m.data.id] as DdDive
91
+ if (dive) {
92
+ log.info(`Running dive ${dive.name}`)
93
+ this.app.showModal(DiveRunModal, {dive})
94
+ } else {
96
95
  log.warn(`No dive with id ${m.data.id}`)
97
96
  }
98
97
  })
99
98
 
100
- await this.reload()
99
+ this.reload().then()
101
100
  }
102
101
 
103
102
  async reload() {
@@ -109,7 +108,7 @@ export class DiveListPage extends PagePart<{}> {
109
108
  this.dirty()
110
109
  }
111
110
 
112
- renderContent(parent: PartTag): void {
111
+ render(parent: PartTag): any {
113
112
 
114
113
  const groupedDives = Arrays.groupBy(this.result.dives, 'dd_dive_group_id')
115
114
 
@@ -122,7 +121,7 @@ export class DiveListPage extends PagePart<{}> {
122
121
  }
123
122
 
124
123
  renderGroupPanel(parent: PartTag, group: DdDiveGroup, dives: DdDive[]) {
125
- Fragments.panel(this.theme)
124
+ const panel = Fragments.panel(this.theme)
126
125
  .title(group.name)
127
126
  .icon((group.icon || 'glyp-data_dives') as IconName)
128
127
  .classes('group')
@@ -132,36 +131,99 @@ export class DiveListPage extends PagePart<{}> {
132
131
  this.renderDiveRow(content, dive)
133
132
  }
134
133
  })
135
- .addAction({
134
+ if (this.state.mode == 'editor') {
135
+ panel.addAction({
136
136
  title: "New Dive",
137
137
  icon: 'glyp-data_dive',
138
138
  click: {key: this.newDiveKey, data: {group_id: group.id}}
139
139
  }, 'secondary')
140
- .addAction({
140
+ panel.addAction({
141
141
  icon: 'glyp-settings',
142
142
  click: {key: this.editGroupKey, data: {id: group.id}}
143
143
  }, 'tertiary')
144
- .render(parent)
144
+ }
145
+ panel.render(parent)
145
146
  }
146
147
 
147
148
  renderDiveRow(parent: PartTag, dive: DdDive) {
148
149
  parent.div('.dive', row => {
149
- row.a({href: routes.editor.path({id: dive.id})}, a => {
150
- if (dive.visibility == 'private') {
151
- a.i('.glyp-privacy')
152
- .data({tooltip: "Private Dive"})
153
- }
154
- else {
155
- a.i('.glyp-data_dive')
156
- }
157
- a.span().text(dive.name)
158
- }).data({tooltip: "Open Editor"})
159
- row.a('.icon-only', a => {
160
- a.i('.glyp-settings')
161
- }).data({tooltip: "Dive Settings"})
162
- .emitClick(this.editDiveKey, {id: dive.id})
150
+ if (this.state.mode == 'editor') {
151
+ row.a({href: routes.editor.path({id: dive.id})}, a => {
152
+ if (dive.visibility == 'private') {
153
+ a.i('.glyp-privacy')
154
+ .data({tooltip: "Private Dive"})
155
+ } else {
156
+ a.i('.glyp-data_dive')
157
+ .data({tooltip: "Public Dive"})
158
+ }
159
+ a.span().text(dive.name)
160
+ }).data({tooltip: "Open Editor"})
161
+ row.a('.icon-only', a => {
162
+ a.i('.glyp-settings')
163
+ }).data({tooltip: "Dive Settings"})
164
+ .emitClick(this.editDiveKey, {id: dive.id})
165
+ }
166
+ else {
167
+ // readonly mode
168
+ row.a(a => {
169
+ if (dive.visibility == 'private') {
170
+ a.i('.glyp-privacy')
171
+ .data({tooltip: "Private Dive"})
172
+ } else {
173
+ a.i('.glyp-data_dive')
174
+ .data({tooltip: "Public Dive"})
175
+ }
176
+ a.span().text(dive.name)
177
+ })
178
+ .data({tooltip: "Run Dive"})
179
+ .emitClick(this.runDiveKey, {id: dive.id})
180
+ }
163
181
  })
164
182
  }
165
183
 
166
184
  }
167
185
 
186
+
187
+ ////////////////////////////////////////////////////////////////////////////////
188
+ // Page
189
+ ////////////////////////////////////////////////////////////////////////////////
190
+
191
+ export class DiveListPage extends PagePart<{}> {
192
+
193
+ listPart!: DiveListPart
194
+ newGroupKey = Messages.untypedKey()
195
+
196
+ async init() {
197
+ this.setTitle("Data Dive")
198
+ this.setIcon('glyp-data_dives')
199
+ this.mainContentWidth = 'wide'
200
+
201
+ this.listPart = this.makePart(DiveListPart, {mode: 'editor'})
202
+
203
+ this.addAction({
204
+ title: "New Group",
205
+ icon: 'glyp-plus_outline',
206
+ click: {key: this.newGroupKey}
207
+ }, 'tertiary')
208
+
209
+ // we're handling this here instead of in the list part because, as of 9/15/23,
210
+ // attach: 'passive' doesn't seem to work for click handlers,
211
+ // so this handler never got called when it was inside the list part
212
+ this.onClick(this.newGroupKey, _ => {
213
+ log.info("Showing new dive group model")
214
+ const newGroup = {name: '', group_types: []}
215
+ this.app.showModal(GroupEditorModal, {
216
+ session: this.listPart.session,
217
+ group: newGroup,
218
+ callback: _ => this.listPart.reload()
219
+ })
220
+ })
221
+ }
222
+
223
+ renderContent(parent: PartTag): void {
224
+ parent.part(this.listPart)
225
+ }
226
+
227
+
228
+ }
229
+
@@ -120,9 +120,18 @@ class PreviewPart extends ContentPart<SubEditorState> {
120
120
 
121
121
  renderContent(parent: PartTag) {
122
122
  if (this.result) {
123
- parent.div('.table-container', col => {
124
- Queries.renderPreview(col, this.result!)
125
- })
123
+ if (this.result.columns?.length) {
124
+ parent.div('.table-container', col => {
125
+ Queries.renderPreview(col, this.result!)
126
+ })
127
+ }
128
+ else {
129
+ // empty query
130
+ parent.div('.dd-hint-container', hintContainer => {
131
+ hintContainer.div('.dd-hint.centered.glyp-columns')
132
+ .text("Select at least one column")
133
+ })
134
+ }
126
135
  }
127
136
  else {
128
137
  parent.a('.tt-button.stretch', a => {
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "files": [
5
5
  "*"
6
6
  ],
7
- "version": "4.7.4",
7
+ "version": "4.7.6",
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "https://github.com/Terrier-Tech/terrier-engine"
@@ -117,6 +117,14 @@ import EditRaw from '../images/icons/edit.svg?raw'
117
117
  // @ts-ignore
118
118
  import EditSrc from '../images/icons/edit.svg'
119
119
  // @ts-ignore
120
+ import ExistingChildRaw from '../images/icons/existing_child.svg?raw'
121
+ // @ts-ignore
122
+ import ExistingChildSrc from '../images/icons/existing_child.svg'
123
+ // @ts-ignore
124
+ import ExistingParentRaw from '../images/icons/existing_parent.svg?raw'
125
+ // @ts-ignore
126
+ import ExistingParentSrc from '../images/icons/existing_parent.svg'
127
+ // @ts-ignore
120
128
  import FeatureRaw from '../images/icons/feature.svg?raw'
121
129
  // @ts-ignore
122
130
  import FeatureSrc from '../images/icons/feature.svg'
@@ -209,6 +217,14 @@ import MinusRaw from '../images/icons/minus.svg?raw'
209
217
  // @ts-ignore
210
218
  import MinusSrc from '../images/icons/minus.svg'
211
219
  // @ts-ignore
220
+ import NewChildRaw from '../images/icons/new_child.svg?raw'
221
+ // @ts-ignore
222
+ import NewChildSrc from '../images/icons/new_child.svg'
223
+ // @ts-ignore
224
+ import NewParentRaw from '../images/icons/new_parent.svg?raw'
225
+ // @ts-ignore
226
+ import NewParentSrc from '../images/icons/new_parent.svg'
227
+ // @ts-ignore
212
228
  import NightRaw from '../images/icons/night.svg?raw'
213
229
  // @ts-ignore
214
230
  import NightSrc from '../images/icons/night.svg'
@@ -470,6 +486,14 @@ export const IconDefs: Record<HubIconName,{ raw: string, src: string }> = {
470
486
  raw: EditRaw,
471
487
  src: EditSrc,
472
488
  },
489
+ "hub-existing_child": {
490
+ raw: ExistingChildRaw,
491
+ src: ExistingChildSrc,
492
+ },
493
+ "hub-existing_parent": {
494
+ raw: ExistingParentRaw,
495
+ src: ExistingParentSrc,
496
+ },
473
497
  "hub-feature": {
474
498
  raw: FeatureRaw,
475
499
  src: FeatureSrc,
@@ -562,6 +586,14 @@ export const IconDefs: Record<HubIconName,{ raw: string, src: string }> = {
562
586
  raw: MinusRaw,
563
587
  src: MinusSrc,
564
588
  },
589
+ "hub-new_child": {
590
+ raw: NewChildRaw,
591
+ src: NewChildSrc,
592
+ },
593
+ "hub-new_parent": {
594
+ raw: NewParentRaw,
595
+ src: NewParentSrc,
596
+ },
565
597
  "hub-night": {
566
598
  raw: NightRaw,
567
599
  src: NightSrc,
@@ -713,7 +745,7 @@ export const IconDefs: Record<HubIconName,{ raw: string, src: string }> = {
713
745
  }
714
746
 
715
747
  const Names = [
716
- 'hub-active', 'hub-admin', 'hub-archive', 'hub-arrow_down', 'hub-arrow_left', 'hub-arrow_right', 'hub-arrow_up', 'hub-assign', 'hub-attachment', 'hub-back', 'hub-badge', 'hub-board', 'hub-branch', 'hub-bug', 'hub-calculator', 'hub-checkmark', 'hub-close', 'hub-clypboard', 'hub-comment', 'hub-complete', 'hub-dashboard', 'hub-data_pull', 'hub-data_update', 'hub-database', 'hub-day', 'hub-delete', 'hub-documentation', 'hub-edit', 'hub-feature', 'hub-flex', 'hub-forward', 'hub-github', 'hub-history', 'hub-home', 'hub-image', 'hub-inbox', 'hub-info', 'hub-internal', 'hub-issue', 'hub-lane', 'hub-lane_asap', 'hub-lane_days', 'hub-lane_hours', 'hub-lane_weeks', 'hub-lanes_board', 'hub-level_complete', 'hub-level_highway', 'hub-level_on_ramp', 'hub-level_parking', 'hub-metrics', 'hub-minus', 'hub-night', 'hub-origin', 'hub-pending', 'hub-plus', 'hub-post', 'hub-posts', 'hub-pr_closed', 'hub-pr_merged', 'hub-pr_open', 'hub-prioritized', 'hub-project', 'hub-question', 'hub-reaction', 'hub-read_mail', 'hub-recent', 'hub-refresh', 'hub-related_posts', 'hub-request', 'hub-settings', 'hub-status', 'hub-step_deploy', 'hub-step_develop', 'hub-step_investigate', 'hub-step_review', 'hub-step_test', 'hub-steps', 'hub-steps_board', 'hub-subscribe', 'hub-support', 'hub-terrier', 'hub-thumbs_up', 'hub-type', 'hub-unprioritized', 'hub-upload', 'hub-user', 'hub-users', 'hub-week'
748
+ 'hub-active', 'hub-admin', 'hub-archive', 'hub-arrow_down', 'hub-arrow_left', 'hub-arrow_right', 'hub-arrow_up', 'hub-assign', 'hub-attachment', 'hub-back', 'hub-badge', 'hub-board', 'hub-branch', 'hub-bug', 'hub-calculator', 'hub-checkmark', 'hub-close', 'hub-clypboard', 'hub-comment', 'hub-complete', 'hub-dashboard', 'hub-data_pull', 'hub-data_update', 'hub-database', 'hub-day', 'hub-delete', 'hub-documentation', 'hub-edit', 'hub-existing_child', 'hub-existing_parent', 'hub-feature', 'hub-flex', 'hub-forward', 'hub-github', 'hub-history', 'hub-home', 'hub-image', 'hub-inbox', 'hub-info', 'hub-internal', 'hub-issue', 'hub-lane', 'hub-lane_asap', 'hub-lane_days', 'hub-lane_hours', 'hub-lane_weeks', 'hub-lanes_board', 'hub-level_complete', 'hub-level_highway', 'hub-level_on_ramp', 'hub-level_parking', 'hub-metrics', 'hub-minus', 'hub-new_child', 'hub-new_parent', 'hub-night', 'hub-origin', 'hub-pending', 'hub-plus', 'hub-post', 'hub-posts', 'hub-pr_closed', 'hub-pr_merged', 'hub-pr_open', 'hub-prioritized', 'hub-project', 'hub-question', 'hub-reaction', 'hub-read_mail', 'hub-recent', 'hub-refresh', 'hub-related_posts', 'hub-request', 'hub-settings', 'hub-status', 'hub-step_deploy', 'hub-step_develop', 'hub-step_investigate', 'hub-step_review', 'hub-step_test', 'hub-steps', 'hub-steps_board', 'hub-subscribe', 'hub-support', 'hub-terrier', 'hub-thumbs_up', 'hub-type', 'hub-unprioritized', 'hub-upload', 'hub-user', 'hub-users', 'hub-week'
717
749
  ] as const
718
750
 
719
751
  export type HubIconName = typeof Names[number]
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="8" cy="24" r="3" fill="currentColor" fill-opacity="0.33" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/><circle cx="16" cy="8" r="3" fill="currentColor" fill-opacity="0.33" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/><path stroke="currentColor" stroke-linejoin="round" stroke-width="2" d="M8 21v-3a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v5"/><path fill="currentColor" d="M15 11h2v5h-2zM19.415 23.65l3.826 4.464a1 1 0 0 0 1.518 0l3.826-4.463a1 1 0 0 0-.76-1.651h-7.65a1 1 0 0 0-.76 1.65Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="8" cy="24" r="3" fill="currentColor" fill-opacity="0.33" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/><circle cx="24" cy="24" r="3" fill="currentColor" fill-opacity="0.33" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/><path stroke="currentColor" stroke-linejoin="round" stroke-width="2" d="M8 21v-3a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v3"/><path fill="currentColor" d="M15 9h2v7h-2z"/><path fill="currentColor" d="m11.415 8.35 3.826-4.464a1 1 0 0 1 1.518 0l3.826 4.463a1 1 0 0 1-.76 1.651h-7.65a1 1 0 0 1-.76-1.65Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="16" cy="8" r="3" fill="currentColor" fill-opacity="0.33" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/><circle cx="8" cy="24" r="3" fill="currentColor" fill-opacity="0.33" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/><circle cx="24" cy="24" r="5" fill="currentColor" fill-opacity="0.33" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/><path stroke="currentColor" stroke-linejoin="round" stroke-width="2" d="M8 21v-3a2 2 0 0 1 2-2h12.023a2 2 0 0 1 2 1.977l.011.977"/><path fill="currentColor" d="M15 11h2v5h-2zM24 21a1 1 0 0 1 1 1v.999L26 23a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0v-1h-1a1 1 0 0 1 0-2h1v-1a1 1 0 0 1 1-1Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="8" cy="24" r="3" fill="currentColor" fill-opacity="0.33" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/><circle cx="24" cy="24" r="3" fill="currentColor" fill-opacity="0.33" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/><path stroke="currentColor" stroke-linejoin="round" stroke-width="2" d="M8 21v-3a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v3"/><path fill="currentColor" d="M15 13h2v3h-2z"/><circle cx="16" cy="8" r="5" fill="currentColor" fill-opacity="0.33" stroke="currentColor" stroke-linejoin="round" stroke-width="2"/><path fill="currentColor" d="M16 5a1 1 0 0 1 1 1v.999L18 7a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0V9h-1a1 1 0 0 1 0-2h1V6a1 1 0 0 1 1-1Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="8" cy="24" r="3" fill="#000" fill-opacity=".25" stroke="#000" stroke-linejoin="round" stroke-width="2"/><circle cx="16" cy="8" r="3" fill="#000" fill-opacity=".25" stroke="#000" stroke-linejoin="round" stroke-width="2"/><path stroke="#000" stroke-linejoin="round" stroke-width="2" d="M8 21v-3a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v5"/><path fill="#000" d="M15 11h2v5h-2zM19.415 23.65l3.826 4.464a1 1 0 0 0 1.518 0l3.826-4.463a1 1 0 0 0-.76-1.651h-7.65a1 1 0 0 0-.76 1.65Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="8" cy="24" r="3" fill="#000" fill-opacity=".25" stroke="#000" stroke-linejoin="round" stroke-width="2"/><circle cx="24" cy="24" r="3" fill="#000" fill-opacity=".25" stroke="#000" stroke-linejoin="round" stroke-width="2"/><path stroke="#000" stroke-linejoin="round" stroke-width="2" d="M8 21v-3a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v3"/><path fill="#000" d="M15 9h2v7h-2z"/><path fill="#000" d="m11.415 8.35 3.826-4.464a1 1 0 0 1 1.518 0l3.826 4.463a1 1 0 0 1-.76 1.651h-7.65a1 1 0 0 1-.76-1.65Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="16" cy="8" r="3" fill="#000" fill-opacity=".25" stroke="#000" stroke-linejoin="round" stroke-width="2"/><circle cx="8" cy="24" r="3" fill="#000" fill-opacity=".25" stroke="#000" stroke-linejoin="round" stroke-width="2"/><circle cx="24" cy="24" r="5" fill="#000" fill-opacity=".25" stroke="#000" stroke-linejoin="round" stroke-width="2"/><path stroke="#000" stroke-linejoin="round" stroke-width="2" d="M8 21v-3a2 2 0 0 1 2-2h12.023a2 2 0 0 1 2 1.977l.011.977"/><path fill="#000" d="M15 11h2v5h-2zM24 21a1 1 0 0 1 1 1v.999L26 23a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0v-1h-1a1 1 0 0 1 0-2h1v-1a1 1 0 0 1 1-1Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><circle cx="8" cy="24" r="3" fill="#000" fill-opacity=".25" stroke="#000" stroke-linejoin="round" stroke-width="2"/><circle cx="24" cy="24" r="3" fill="#000" fill-opacity=".25" stroke="#000" stroke-linejoin="round" stroke-width="2"/><path stroke="#000" stroke-linejoin="round" stroke-width="2" d="M8 21v-3a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v3"/><path fill="#000" d="M15 13h2v3h-2z"/><circle cx="16" cy="8" r="5" fill="#000" fill-opacity=".25" stroke="#000" stroke-linejoin="round" stroke-width="2"/><path fill="#000" d="M16 5a1 1 0 0 1 1 1v.999L18 7a1 1 0 0 1 0 2h-1v1a1 1 0 0 1-2 0V9h-1a1 1 0 0 1 0-2h1V6a1 1 0 0 1 1-1Z"/></g></svg>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>icon-existing_child</title>
4
+ <g id="icon-existing_child" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
+ <circle id="Oval-Copy" stroke="#000000" stroke-width="2" fill-opacity="0.25" fill="#000000" stroke-linejoin="round" cx="8" cy="24" r="3"></circle>
6
+ <circle id="Oval-Copy-2" stroke="#000000" stroke-width="2" fill-opacity="0.25" fill="#000000" stroke-linejoin="round" cx="16" cy="8" r="3"></circle>
7
+ <path d="M8,21 L8,18 C8,16.8954305 8.8954305,16 10,16 L22,16 C23.1045695,16 24,16.8954305 24,18 L24,23 L24,23" id="Path-100" stroke="#000000" stroke-width="2" stroke-linejoin="round"></path>
8
+ <rect id="Rectangle" fill="#000000" x="15" y="11" width="2" height="5"></rect>
9
+ <path d="M22.1507914,20.914964 L26.6142006,24.7407434 C27.0335265,25.1001655 27.082088,25.7314655 26.7226659,26.1507914 C26.6893412,26.1896702 26.6530794,26.2259319 26.6142006,26.2592566 L22.1507914,30.085036 C21.7314655,30.4444581 21.1001655,30.3958966 20.7407434,29.9765707 C20.5853922,29.7953276 20.5,29.5644906 20.5,29.3257794 L20.5,21.6742206 C20.5,21.1219359 20.9477153,20.6742206 21.5,20.6742206 C21.7387113,20.6742206 21.9695483,20.7596128 22.1507914,20.914964 Z" id="Path-101" fill="#000000" transform="translate(24, 25.5) scale(1, -1) rotate(-90) translate(-24, -25.5)"></path>
10
+ </g>
11
+ </svg>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>icon-existing_parent</title>
4
+ <g id="icon-existing_parent" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
+ <circle id="Oval-Copy" stroke="#000000" stroke-width="2" fill-opacity="0.25" fill="#000000" stroke-linejoin="round" cx="8" cy="24" r="3"></circle>
6
+ <circle id="Oval-Copy-2" stroke="#000000" stroke-width="2" fill-opacity="0.25" fill="#000000" stroke-linejoin="round" cx="24" cy="24" r="3"></circle>
7
+ <path d="M8,21 L8,18 C8,16.8954305 8.8954305,16 10,16 L22,16 C23.1045695,16 24,16.8954305 24,18 L24,21 L24,21" id="Path-100" stroke="#000000" stroke-width="2" stroke-linejoin="round"></path>
8
+ <rect id="Rectangle" fill="#000000" x="15" y="9" width="2" height="7"></rect>
9
+ <path d="M14.1507914,1.91496403 L18.6142006,5.7407434 C19.0335265,6.10016555 19.082088,6.73146553 18.7226659,7.15079137 C18.6893412,7.18967018 18.6530794,7.22593191 18.6142006,7.2592566 L14.1507914,11.085036 C13.7314655,11.4444581 13.1001655,11.3958966 12.7407434,10.9765707 C12.5853922,10.7953276 12.5,10.5644906 12.5,10.3257794 L12.5,2.67422064 C12.5,2.12193589 12.9477153,1.67422064 13.5,1.67422064 C13.7387113,1.67422064 13.9695483,1.7596128 14.1507914,1.91496403 Z" id="Path-101" fill="#000000" transform="translate(16, 6.5) rotate(-90) translate(-16, -6.5)"></path>
10
+ </g>
11
+ </svg>
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>icon-new-child</title>
4
+ <g id="icon-new-child" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
+ <circle id="Oval" stroke="#000000" stroke-width="2" fill-opacity="0.25" fill="#000000" stroke-linejoin="round" cx="16" cy="8" r="3"></circle>
6
+ <circle id="Oval-Copy" stroke="#000000" stroke-width="2" fill-opacity="0.25" fill="#000000" stroke-linejoin="round" cx="8" cy="24" r="3"></circle>
7
+ <circle id="Oval-Copy-2" stroke="#000000" stroke-width="2" fill-opacity="0.25" fill="#000000" stroke-linejoin="round" cx="24" cy="24" r="5"></circle>
8
+ <path d="M8,21 L8,18 C8,16.8954305 8.8954305,16 10,16 L22.0231969,16 C23.1186657,16 24.0102814,16.8812743 24.0230608,17.9766686 L24.0344614,18.9538745 L24.0344614,18.9538745" id="Path-100" stroke="#000000" stroke-width="2" stroke-linejoin="round"></path>
9
+ <rect id="Rectangle" fill="#000000" x="15" y="11" width="2" height="5"></rect>
10
+ <path d="M24,21 C24.5522847,21 25,21.4477153 25,22 L25,22.999 L26,23 C26.5522847,23 27,23.4477153 27,24 C27,24.5522847 26.5522847,25 26,25 L25,25 L25,26 C25,26.5522847 24.5522847,27 24,27 C23.4477153,27 23,26.5522847 23,26 L23,25 L22,25 C21.4477153,25 21,24.5522847 21,24 C21,23.4477153 21.4477153,23 22,23 L23,23 L23,22 C23,21.4477153 23.4477153,21 24,21 Z" id="Combined-Shape" fill="#000000"></path>
11
+ </g>
12
+ </svg>
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>icon-new_parent</title>
4
+ <g id="icon-new_parent" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
+ <circle id="Oval-Copy" stroke="#000000" stroke-width="2" fill-opacity="0.25" fill="#000000" stroke-linejoin="round" cx="8" cy="24" r="3"></circle>
6
+ <circle id="Oval-Copy-2" stroke="#000000" stroke-width="2" fill-opacity="0.25" fill="#000000" stroke-linejoin="round" cx="24" cy="24" r="3"></circle>
7
+ <path d="M8,21 L8,18 C8,16.8954305 8.8954305,16 10,16 L22,16 C23.1045695,16 24,16.8954305 24,18 L24,21 L24,21" id="Path-100" stroke="#000000" stroke-width="2" stroke-linejoin="round"></path>
8
+ <rect id="Rectangle" fill="#000000" x="15" y="13" width="2" height="3"></rect>
9
+ <circle id="Oval-Copy-2" stroke="#000000" stroke-width="2" fill-opacity="0.25" fill="#000000" stroke-linejoin="round" cx="16" cy="8" r="5"></circle>
10
+ <path d="M16,5 C16.5522847,5 17,5.44771525 17,6 L17,6.999 L18,7 C18.5522847,7 19,7.44771525 19,8 C19,8.55228475 18.5522847,9 18,9 L17,9 L17,10 C17,10.5522847 16.5522847,11 16,11 C15.4477153,11 15,10.5522847 15,10 L15,9 L14,9 C13.4477153,9 13,8.55228475 13,8 C13,7.44771525 13.4477153,7 14,7 L15,7 L15,6 C15,5.44771525 15.4477153,5 16,5 Z" id="Combined-Shape" fill="#000000"></path>
11
+ </g>
12
+ </svg>