@c8y/tutorial 1022.21.3 → 1022.26.1
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.
- package/cumulocity.config.ts +14 -0
- package/package.json +7 -7
- package/src/selector/properties-selector-drawer-example/properties-selector-drawer.component.ts +85 -0
- package/src/selector/properties-selector-drawer-example/properties-selector-drawer.providers.ts +19 -0
- package/src/selector/properties-selector-inline-example/properties-selector-inline.component.ts +197 -0
- package/src/selector/properties-selector-inline-example/properties-selector-inline.providers.ts +19 -0
package/cumulocity.config.ts
CHANGED
|
@@ -703,6 +703,20 @@ export default {
|
|
|
703
703
|
description: 'An introduction to data points export selector example.',
|
|
704
704
|
scope: 'self'
|
|
705
705
|
},
|
|
706
|
+
{
|
|
707
|
+
name: 'Introduction to properties selector- inline usage',
|
|
708
|
+
module: 'propertiesSelectorInlineExampleProviders',
|
|
709
|
+
path: './src/selector/properties-selector-inline-example/properties-selector-inline.providers.ts',
|
|
710
|
+
description: 'An introduction to properties selector example- inline usage.',
|
|
711
|
+
scope: 'self'
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
name: 'Introduction to properties selector- drawer usage',
|
|
715
|
+
module: 'propertiesSelectorDrawerExampleProviders',
|
|
716
|
+
path: './src/selector/properties-selector-drawer-example/properties-selector-drawer.providers.ts',
|
|
717
|
+
description: 'An introduction to properties selector example- drawer usage.',
|
|
718
|
+
scope: 'self'
|
|
719
|
+
},
|
|
706
720
|
{
|
|
707
721
|
name: 'Introduction to asset selector device child',
|
|
708
722
|
module: 'AssetSingleSelectModule',
|
package/package.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c8y/tutorial",
|
|
3
|
-
"version": "1022.
|
|
3
|
+
"version": "1022.26.1",
|
|
4
4
|
"description": "This package is used to scaffold a tutorial for Cumulocity IoT Web SDK which explains a lot of concepts.",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@c8y/style": "1022.
|
|
7
|
-
"@c8y/ngx-components": "1022.
|
|
8
|
-
"@c8y/client": "1022.
|
|
9
|
-
"@c8y/bootstrap": "1022.
|
|
6
|
+
"@c8y/style": "1022.26.1",
|
|
7
|
+
"@c8y/ngx-components": "1022.26.1",
|
|
8
|
+
"@c8y/client": "1022.26.1",
|
|
9
|
+
"@c8y/bootstrap": "1022.26.1",
|
|
10
10
|
"@angular/cdk": "^19.2.18",
|
|
11
11
|
"ngx-bootstrap": "19.0.2",
|
|
12
12
|
"leaflet": "1.9.4",
|
|
13
13
|
"rxjs": "7.8.1"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@c8y/options": "1022.
|
|
17
|
-
"@c8y/devkit": "1022.
|
|
16
|
+
"@c8y/options": "1022.26.1",
|
|
17
|
+
"@c8y/devkit": "1022.26.1"
|
|
18
18
|
},
|
|
19
19
|
"peerDependencies": {
|
|
20
20
|
"@angular/common": ">=19 <20"
|
package/src/selector/properties-selector-drawer-example/properties-selector-drawer.component.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { FormsModule } from '@angular/forms';
|
|
3
|
+
import { IIdentified, IManagedObject, InventoryService } from '@c8y/client';
|
|
4
|
+
import { BottomDrawerService, TitleComponent } from '@c8y/ngx-components';
|
|
5
|
+
import { AssetPropertySelectorDrawerComponent } from '@c8y/ngx-components/asset-properties';
|
|
6
|
+
import {
|
|
7
|
+
AssetSelectionChangeEvent,
|
|
8
|
+
AssetSelectorModule
|
|
9
|
+
} from '@c8y/ngx-components/assets-navigator';
|
|
10
|
+
import { SubAssetsModule } from '@c8y/ngx-components/sub-assets';
|
|
11
|
+
import { TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
12
|
+
import { JsonPipe } from '@angular/common';
|
|
13
|
+
|
|
14
|
+
@Component({
|
|
15
|
+
selector: 'tut-properties-selector-drawer',
|
|
16
|
+
template: `<c8y-title>Properties selector- drawer</c8y-title>
|
|
17
|
+
<div class="d-flex row">
|
|
18
|
+
<div class="col-xs-12 col-md-6">
|
|
19
|
+
<div class="card">
|
|
20
|
+
<div class="card-inner-scroll d-flex d-col bg-component" style="height: 490px">
|
|
21
|
+
<c8y-asset-selector
|
|
22
|
+
[(ngModel)]="model"
|
|
23
|
+
[config]="{
|
|
24
|
+
groupsSelectable: true,
|
|
25
|
+
showUnassignedDevices: true,
|
|
26
|
+
showChildDevices: true
|
|
27
|
+
}"
|
|
28
|
+
(onSelected)="selectionChanged($event)"
|
|
29
|
+
></c8y-asset-selector>
|
|
30
|
+
</div>
|
|
31
|
+
<div class="card-footer separator-top">
|
|
32
|
+
<button class="btn btn-primary" (click)="selectProperty()" [disabled]="!selectedAsset">
|
|
33
|
+
Select property
|
|
34
|
+
</button>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<div class="col-xs-12 col-md-6">
|
|
40
|
+
<pre class="inner-scroll m-0" style="height: 554px">{{ output | json }}</pre>
|
|
41
|
+
</div>
|
|
42
|
+
</div>`,
|
|
43
|
+
imports: [
|
|
44
|
+
AssetSelectorModule,
|
|
45
|
+
TitleComponent,
|
|
46
|
+
FormsModule,
|
|
47
|
+
SubAssetsModule,
|
|
48
|
+
TooltipModule,
|
|
49
|
+
JsonPipe
|
|
50
|
+
]
|
|
51
|
+
})
|
|
52
|
+
export class PropertiesSelectorDrawerExampleComponent {
|
|
53
|
+
inventoryService = inject(InventoryService);
|
|
54
|
+
model: IIdentified;
|
|
55
|
+
selectedAsset: IManagedObject;
|
|
56
|
+
output: unknown;
|
|
57
|
+
bottomDrawerService = inject(BottomDrawerService);
|
|
58
|
+
|
|
59
|
+
selectionChanged(e: AssetSelectionChangeEvent) {
|
|
60
|
+
this.selectedAsset = e.change.item;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async selectProperty() {
|
|
64
|
+
const drawer = this.bottomDrawerService.openDrawer(AssetPropertySelectorDrawerComponent, {
|
|
65
|
+
disableClickOutside: true,
|
|
66
|
+
initialState: {
|
|
67
|
+
asset: this.selectedAsset,
|
|
68
|
+
config: {
|
|
69
|
+
selectMode: 'single',
|
|
70
|
+
expansionMode: 'collapsedByDefault',
|
|
71
|
+
showValue: true,
|
|
72
|
+
showKey: true,
|
|
73
|
+
emptyStateContent: 'default-properties'
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
const resultOf = await drawer.instance.result;
|
|
80
|
+
this.output = resultOf;
|
|
81
|
+
} catch (ex) {
|
|
82
|
+
this.output = 'Cancelled';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
package/src/selector/properties-selector-drawer-example/properties-selector-drawer.providers.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NavigatorNode, hookNavigator, hookRoute } from '@c8y/ngx-components';
|
|
2
|
+
|
|
3
|
+
export const propertiesSelectorDrawerExampleProviders = [
|
|
4
|
+
hookRoute({
|
|
5
|
+
path: 'selector/properties-selector-drawer-example',
|
|
6
|
+
loadComponent: () =>
|
|
7
|
+
import('./properties-selector-drawer.component').then(
|
|
8
|
+
m => m.PropertiesSelectorDrawerExampleComponent
|
|
9
|
+
)
|
|
10
|
+
}),
|
|
11
|
+
hookNavigator(
|
|
12
|
+
new NavigatorNode({
|
|
13
|
+
label: 'Properties selector drawer example',
|
|
14
|
+
path: '/selector/properties-selector-drawer-example',
|
|
15
|
+
icon: 'th-list',
|
|
16
|
+
priority: 4
|
|
17
|
+
})
|
|
18
|
+
)
|
|
19
|
+
];
|
package/src/selector/properties-selector-inline-example/properties-selector-inline.component.ts
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { FormsModule } from '@angular/forms';
|
|
3
|
+
import { IIdentified, IManagedObject, InventoryService } from '@c8y/client';
|
|
4
|
+
import { BottomDrawerService, C8yTranslatePipe, TitleComponent } from '@c8y/ngx-components';
|
|
5
|
+
import {
|
|
6
|
+
AssetPropertyActionDirective,
|
|
7
|
+
AssetPropertyListComponent,
|
|
8
|
+
AssetPropertyType
|
|
9
|
+
} from '@c8y/ngx-components/asset-properties';
|
|
10
|
+
import {
|
|
11
|
+
AssetSelectionChangeEvent,
|
|
12
|
+
AssetSelectorModule
|
|
13
|
+
} from '@c8y/ngx-components/assets-navigator';
|
|
14
|
+
import { SubAssetsModule } from '@c8y/ngx-components/sub-assets';
|
|
15
|
+
import { TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
16
|
+
import { JsonPipe } from '@angular/common';
|
|
17
|
+
|
|
18
|
+
@Component({
|
|
19
|
+
selector: 'tut-properties-selector-inline',
|
|
20
|
+
template: `<c8y-title>Properties selector- inline</c8y-title>
|
|
21
|
+
<div class="d-flex-md row">
|
|
22
|
+
<div class="col-xs-12 col-md-3">
|
|
23
|
+
<div class="card">
|
|
24
|
+
<div class="card-inner-scroll d-flex d-col bg-component" style="height: 208px">
|
|
25
|
+
<c8y-asset-selector
|
|
26
|
+
class="bg-component"
|
|
27
|
+
[(ngModel)]="model"
|
|
28
|
+
[config]="{
|
|
29
|
+
groupsSelectable: true,
|
|
30
|
+
showUnassignedDevices: true,
|
|
31
|
+
showChildDevices: true
|
|
32
|
+
}"
|
|
33
|
+
(onSelected)="selectionChanged($event)"
|
|
34
|
+
></c8y-asset-selector>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="card bg-level-1 p-16">
|
|
38
|
+
<p class="text-medium">Config options</p>
|
|
39
|
+
<fieldset class="c8y-fieldset m-b-16">
|
|
40
|
+
<legend>Select mode</legend>
|
|
41
|
+
<div class="d-flex gap-16 p-b-8">
|
|
42
|
+
<label class="c8y-radio">
|
|
43
|
+
<input name="assetSelection" type="radio" value="multi" [(ngModel)]="multiSelect" />
|
|
44
|
+
<span></span>
|
|
45
|
+
<span class="small m-l-4">multi</span>
|
|
46
|
+
</label>
|
|
47
|
+
<label class="c8y-radio">
|
|
48
|
+
<input
|
|
49
|
+
name="assetSelection"
|
|
50
|
+
type="radio"
|
|
51
|
+
value="single"
|
|
52
|
+
[(ngModel)]="multiSelect"
|
|
53
|
+
/>
|
|
54
|
+
<span></span>
|
|
55
|
+
<span class="small m-l-4">single</span>
|
|
56
|
+
</label>
|
|
57
|
+
<label class="c8y-radio">
|
|
58
|
+
<input name="assetSelection" type="radio" value="none" [(ngModel)]="multiSelect" />
|
|
59
|
+
<span></span>
|
|
60
|
+
<span class="small m-l-4">none</span>
|
|
61
|
+
</label>
|
|
62
|
+
</div>
|
|
63
|
+
</fieldset>
|
|
64
|
+
<fieldset class="c8y-fieldset m-t-0">
|
|
65
|
+
<legend>Expansion mode</legend>
|
|
66
|
+
<div class="d-flex gap-8 p-b-8">
|
|
67
|
+
<label class="c8y-radio">
|
|
68
|
+
<input
|
|
69
|
+
name="expansionMode"
|
|
70
|
+
type="radio"
|
|
71
|
+
value="expandedByDefault"
|
|
72
|
+
[(ngModel)]="expansionMode"
|
|
73
|
+
/>
|
|
74
|
+
<span></span>
|
|
75
|
+
<span class="small m-l-4">expanded</span>
|
|
76
|
+
</label>
|
|
77
|
+
<label class="c8y-radio">
|
|
78
|
+
<input
|
|
79
|
+
name="expansionMode"
|
|
80
|
+
type="radio"
|
|
81
|
+
value="collapsedByDefault"
|
|
82
|
+
[(ngModel)]="expansionMode"
|
|
83
|
+
/>
|
|
84
|
+
<span></span>
|
|
85
|
+
<span class="small m-l-4">collapsed</span>
|
|
86
|
+
</label>
|
|
87
|
+
<label class="c8y-radio">
|
|
88
|
+
<input
|
|
89
|
+
name="expansionMode"
|
|
90
|
+
type="radio"
|
|
91
|
+
value="nonCollapsible"
|
|
92
|
+
[(ngModel)]="expansionMode"
|
|
93
|
+
/>
|
|
94
|
+
<span></span>
|
|
95
|
+
<span class="small m-l-4">nonCollapsible</span>
|
|
96
|
+
</label>
|
|
97
|
+
</div>
|
|
98
|
+
</fieldset>
|
|
99
|
+
<label class="c8y-switch">
|
|
100
|
+
<input type="checkbox" [(ngModel)]="searchable" />
|
|
101
|
+
<span></span>
|
|
102
|
+
<small>searchable</small>
|
|
103
|
+
</label>
|
|
104
|
+
<label class="c8y-switch m-0">
|
|
105
|
+
<input type="checkbox" [(ngModel)]="showHeader" />
|
|
106
|
+
<span></span>
|
|
107
|
+
<small>showHeader</small>
|
|
108
|
+
</label>
|
|
109
|
+
<label class="c8y-switch m-0">
|
|
110
|
+
<input type="checkbox" [(ngModel)]="showValue" />
|
|
111
|
+
<span></span>
|
|
112
|
+
<small>showValue</small>
|
|
113
|
+
</label>
|
|
114
|
+
<label class="c8y-switch m-0">
|
|
115
|
+
<input type="checkbox" [(ngModel)]="showKey" />
|
|
116
|
+
<span></span>
|
|
117
|
+
<small>showKey</small>
|
|
118
|
+
</label>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
<div class="col-xs-12 col-md-5">
|
|
122
|
+
<div class="card">
|
|
123
|
+
<div class="card-inner-scroll d-flex d-col bg-component" style="height: 559px">
|
|
124
|
+
<c8y-asset-property-list
|
|
125
|
+
class="bg-component"
|
|
126
|
+
[asset]="selectedAsset"
|
|
127
|
+
[config]="{
|
|
128
|
+
selectMode: multiSelect,
|
|
129
|
+
showHeader: showHeader,
|
|
130
|
+
searchable: searchable,
|
|
131
|
+
showValue: showValue,
|
|
132
|
+
expansionMode: expansionMode,
|
|
133
|
+
showKey: showKey
|
|
134
|
+
}"
|
|
135
|
+
(selectedProperties)="onSelectedProperties($event)"
|
|
136
|
+
>
|
|
137
|
+
<button
|
|
138
|
+
class="btn-dot btn fit-h"
|
|
139
|
+
[attr.aria-label]="'Copy' | translate"
|
|
140
|
+
tooltip="{{ 'Copy' | translate }}"
|
|
141
|
+
type="button"
|
|
142
|
+
*c8yAssetPropertyAction="let context"
|
|
143
|
+
[delay]="500"
|
|
144
|
+
(click)="copyProperty(context)"
|
|
145
|
+
>
|
|
146
|
+
<i class="dlt-c8y-icon-copy"></i>
|
|
147
|
+
</button>
|
|
148
|
+
</c8y-asset-property-list>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
<div class="col-xs-12 col-md-4">
|
|
153
|
+
<pre class="inner-scroll" style="height: 559px">{{ assetPropertiesOutput | json }}</pre>
|
|
154
|
+
</div>
|
|
155
|
+
</div>`,
|
|
156
|
+
standalone: true,
|
|
157
|
+
imports: [
|
|
158
|
+
AssetSelectorModule,
|
|
159
|
+
AssetPropertyListComponent,
|
|
160
|
+
TitleComponent,
|
|
161
|
+
FormsModule,
|
|
162
|
+
SubAssetsModule,
|
|
163
|
+
AssetPropertyActionDirective,
|
|
164
|
+
C8yTranslatePipe,
|
|
165
|
+
TooltipModule,
|
|
166
|
+
JsonPipe
|
|
167
|
+
]
|
|
168
|
+
})
|
|
169
|
+
export class PropertiesSelectorInlineExampleComponent {
|
|
170
|
+
inventoryService = inject(InventoryService);
|
|
171
|
+
model: IIdentified;
|
|
172
|
+
selectedAsset: IManagedObject;
|
|
173
|
+
assetPropertiesOutput: AssetPropertyType[] | AssetPropertyType;
|
|
174
|
+
bottomDrawerService = inject(BottomDrawerService);
|
|
175
|
+
|
|
176
|
+
multiSelect: 'single' | 'multi' | 'none' = 'multi';
|
|
177
|
+
expansionMode: 'expandedByDefault' | 'collapsedByDefault' | 'nonCollapsible' =
|
|
178
|
+
'expandedByDefault';
|
|
179
|
+
showHeader = true;
|
|
180
|
+
showValue = true;
|
|
181
|
+
showKey = true;
|
|
182
|
+
searchable = true;
|
|
183
|
+
|
|
184
|
+
selectionChanged(e: AssetSelectionChangeEvent) {
|
|
185
|
+
this.selectedAsset = e.change.item;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
onSelectedProperties($event: AssetPropertyType[]) {
|
|
189
|
+
this.assetPropertiesOutput = $event;
|
|
190
|
+
// console.log('Selected properties:', $event);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
copyProperty(context: AssetPropertyType) {
|
|
194
|
+
this.assetPropertiesOutput = context;
|
|
195
|
+
// console.log('Copy property:', context);
|
|
196
|
+
}
|
|
197
|
+
}
|
package/src/selector/properties-selector-inline-example/properties-selector-inline.providers.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NavigatorNode, hookNavigator, hookRoute } from '@c8y/ngx-components';
|
|
2
|
+
|
|
3
|
+
export const propertiesSelectorInlineExampleProviders = [
|
|
4
|
+
hookRoute({
|
|
5
|
+
path: 'selector/properties-selector-inline-example',
|
|
6
|
+
loadComponent: () =>
|
|
7
|
+
import('./properties-selector-inline.component').then(
|
|
8
|
+
m => m.PropertiesSelectorInlineExampleComponent
|
|
9
|
+
)
|
|
10
|
+
}),
|
|
11
|
+
hookNavigator(
|
|
12
|
+
new NavigatorNode({
|
|
13
|
+
label: 'Properties selector inline example',
|
|
14
|
+
path: '/selector/properties-selector-inline-example',
|
|
15
|
+
icon: 'th-list',
|
|
16
|
+
priority: 4
|
|
17
|
+
})
|
|
18
|
+
)
|
|
19
|
+
];
|