@rossigee/clarity-angular 18.2.1-fixed → 18.2.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/fesm2022/clr-angular-accordion.mjs +355 -0
- package/fesm2022/clr-angular-accordion.mjs.map +1 -0
- package/fesm2022/clr-angular-button.mjs +713 -0
- package/fesm2022/clr-angular-button.mjs.map +1 -0
- package/fesm2022/clr-angular-collapsible-panel.mjs +201 -0
- package/fesm2022/clr-angular-collapsible-panel.mjs.map +1 -0
- package/fesm2022/clr-angular-data-datagrid.mjs +7635 -0
- package/fesm2022/clr-angular-data-datagrid.mjs.map +1 -0
- package/fesm2022/clr-angular-data-stack-view.mjs +442 -0
- package/fesm2022/clr-angular-data-stack-view.mjs.map +1 -0
- package/fesm2022/clr-angular-data-tree-view.mjs +1106 -0
- package/fesm2022/clr-angular-data-tree-view.mjs.map +1 -0
- package/fesm2022/clr-angular-data.mjs +40 -0
- package/fesm2022/clr-angular-data.mjs.map +1 -0
- package/fesm2022/clr-angular-emphasis-alert.mjs +624 -0
- package/fesm2022/clr-angular-emphasis-alert.mjs.map +1 -0
- package/fesm2022/clr-angular-emphasis-badge.mjs +69 -0
- package/fesm2022/clr-angular-emphasis-badge.mjs.map +1 -0
- package/fesm2022/clr-angular-emphasis-common.mjs +25 -0
- package/fesm2022/clr-angular-emphasis-common.mjs.map +1 -0
- package/fesm2022/clr-angular-emphasis-label.mjs +105 -0
- package/fesm2022/clr-angular-emphasis-label.mjs.map +1 -0
- package/fesm2022/clr-angular-emphasis.mjs +41 -0
- package/fesm2022/clr-angular-emphasis.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-checkbox.mjs +270 -0
- package/fesm2022/clr-angular-forms-checkbox.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-combobox.mjs +1775 -0
- package/fesm2022/clr-angular-forms-combobox.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-common.mjs +1251 -0
- package/fesm2022/clr-angular-forms-common.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-datalist.mjs +263 -0
- package/fesm2022/clr-angular-forms-datalist.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-datepicker.mjs +3274 -0
- package/fesm2022/clr-angular-forms-datepicker.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-file-input.mjs +826 -0
- package/fesm2022/clr-angular-forms-file-input.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-input.mjs +153 -0
- package/fesm2022/clr-angular-forms-input.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-number-input.mjs +236 -0
- package/fesm2022/clr-angular-forms-number-input.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-password.mjs +233 -0
- package/fesm2022/clr-angular-forms-password.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-radio.mjs +231 -0
- package/fesm2022/clr-angular-forms-radio.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-range.mjs +186 -0
- package/fesm2022/clr-angular-forms-range.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-select.mjs +153 -0
- package/fesm2022/clr-angular-forms-select.mjs.map +1 -0
- package/fesm2022/clr-angular-forms-textarea.mjs +136 -0
- package/fesm2022/clr-angular-forms-textarea.mjs.map +1 -0
- package/fesm2022/clr-angular-forms.mjs +100 -0
- package/fesm2022/clr-angular-forms.mjs.map +1 -0
- package/fesm2022/clr-angular-icon.mjs +7397 -0
- package/fesm2022/clr-angular-icon.mjs.map +1 -0
- package/fesm2022/clr-angular-layout-breadcrumbs.mjs +120 -0
- package/fesm2022/clr-angular-layout-breadcrumbs.mjs.map +1 -0
- package/fesm2022/clr-angular-layout-main-container.mjs +100 -0
- package/fesm2022/clr-angular-layout-main-container.mjs.map +1 -0
- package/fesm2022/clr-angular-layout-nav.mjs +582 -0
- package/fesm2022/clr-angular-layout-nav.mjs.map +1 -0
- package/fesm2022/clr-angular-layout-tabs.mjs +807 -0
- package/fesm2022/clr-angular-layout-tabs.mjs.map +1 -0
- package/fesm2022/clr-angular-layout-vertical-nav.mjs +507 -0
- package/fesm2022/clr-angular-layout-vertical-nav.mjs.map +1 -0
- package/fesm2022/clr-angular-layout.mjs +44 -0
- package/fesm2022/clr-angular-layout.mjs.map +1 -0
- package/fesm2022/clr-angular-modal.mjs +617 -0
- package/fesm2022/clr-angular-modal.mjs.map +1 -0
- package/fesm2022/clr-angular-popover-common.mjs +1082 -0
- package/fesm2022/clr-angular-popover-common.mjs.map +1 -0
- package/fesm2022/clr-angular-popover-dropdown.mjs +492 -0
- package/fesm2022/clr-angular-popover-dropdown.mjs.map +1 -0
- package/fesm2022/clr-angular-popover-signpost.mjs +494 -0
- package/fesm2022/clr-angular-popover-signpost.mjs.map +1 -0
- package/fesm2022/clr-angular-popover-tooltip.mjs +293 -0
- package/fesm2022/clr-angular-popover-tooltip.mjs.map +1 -0
- package/fesm2022/clr-angular-popover.mjs +41 -0
- package/fesm2022/clr-angular-popover.mjs.map +1 -0
- package/fesm2022/clr-angular-progress-progress-bars.mjs +217 -0
- package/fesm2022/clr-angular-progress-progress-bars.mjs.map +1 -0
- package/fesm2022/clr-angular-progress-spinner.mjs +132 -0
- package/fesm2022/clr-angular-progress-spinner.mjs.map +1 -0
- package/fesm2022/clr-angular-stepper.mjs +694 -0
- package/fesm2022/clr-angular-stepper.mjs.map +1 -0
- package/fesm2022/clr-angular-timeline.mjs +316 -0
- package/fesm2022/clr-angular-timeline.mjs.map +1 -0
- package/fesm2022/clr-angular-utils-conditional.mjs +351 -0
- package/fesm2022/clr-angular-utils-conditional.mjs.map +1 -0
- package/fesm2022/clr-angular-utils-loading.mjs +107 -0
- package/fesm2022/clr-angular-utils-loading.mjs.map +1 -0
- package/fesm2022/clr-angular-utils.mjs +2079 -0
- package/fesm2022/clr-angular-utils.mjs.map +1 -0
- package/fesm2022/clr-angular-wizard.mjs +3074 -0
- package/fesm2022/clr-angular-wizard.mjs.map +1 -0
- package/fesm2022/{rossigee-clarity-angular.mjs → clr-angular.mjs} +2 -2
- package/fesm2022/clr-angular.mjs.map +1 -0
- package/package.json +105 -103
- package/schematics/ng-update/index.d.ts +2 -0
- package/schematics/ng-update/index.js +69 -0
- package/schematics/ng-update/index.js.map +1 -0
- package/schematics/ng-update/migrations/css-migration.d.ts +6 -0
- package/schematics/ng-update/migrations/css-migration.js +177 -0
- package/schematics/ng-update/migrations/css-migration.js.map +1 -0
- package/schematics/ng-update/migrations/import-migration.d.ts +4 -0
- package/schematics/ng-update/migrations/import-migration.js +187 -0
- package/schematics/ng-update/migrations/import-migration.js.map +1 -0
- package/schematics/ng-update/migrations/template-migration.d.ts +6 -0
- package/schematics/ng-update/migrations/template-migration.js +261 -0
- package/schematics/ng-update/migrations/template-migration.js.map +1 -0
- package/schematics/ng-update/replacements/css-replacements.d.ts +17 -0
- package/schematics/ng-update/replacements/css-replacements.js +74 -0
- package/schematics/ng-update/replacements/css-replacements.js.map +1 -0
- package/schematics/ng-update/replacements/import-replacements.d.ts +13 -0
- package/schematics/ng-update/replacements/import-replacements.js +108 -0
- package/schematics/ng-update/replacements/import-replacements.js.map +1 -0
- package/schematics/ng-update/replacements/symbol-replacements.d.ts +12 -0
- package/schematics/ng-update/replacements/symbol-replacements.js +67 -0
- package/schematics/ng-update/replacements/symbol-replacements.js.map +1 -0
- package/schematics/ng-update/replacements/template-replacements.d.ts +19 -0
- package/schematics/ng-update/replacements/template-replacements.js +57 -0
- package/schematics/ng-update/replacements/template-replacements.js.map +1 -0
- package/schematics/ng-update/tests/test-helpers.d.ts +6 -0
- package/schematics/ng-update/tests/test-helpers.js +34 -0
- package/schematics/ng-update/tests/test-helpers.js.map +1 -0
- package/schematics/ng-update/utils/file-visitor.d.ts +8 -0
- package/schematics/ng-update/utils/file-visitor.js +44 -0
- package/schematics/ng-update/utils/file-visitor.js.map +1 -0
- package/schematics/ng-update/utils/regexp-utils.d.ts +16 -0
- package/schematics/ng-update/utils/regexp-utils.js +34 -0
- package/schematics/ng-update/utils/regexp-utils.js.map +1 -0
- package/schematics/vitest.config.d.ts +2 -0
- package/schematics/vitest.config.js +17 -0
- package/schematics/vitest.config.js.map +1 -0
- package/types/clr-angular-accordion.d.ts +100 -0
- package/types/clr-angular-button.d.ts +169 -0
- package/types/clr-angular-collapsible-panel.d.ts +73 -0
- package/types/clr-angular-data-datagrid.d.ts +1843 -0
- package/types/clr-angular-data-stack-view.d.ts +87 -0
- package/types/clr-angular-data-tree-view.d.ts +229 -0
- package/types/clr-angular-data.d.ts +15 -0
- package/types/clr-angular-emphasis-alert.d.ts +175 -0
- package/types/clr-angular-emphasis-badge.d.ts +25 -0
- package/types/clr-angular-emphasis-common.d.ts +6 -0
- package/types/clr-angular-emphasis-label.d.ts +29 -0
- package/types/clr-angular-emphasis.d.ts +15 -0
- package/types/clr-angular-forms-checkbox.d.ts +69 -0
- package/types/clr-angular-forms-combobox.d.ts +353 -0
- package/types/clr-angular-forms-common.d.ts +339 -0
- package/types/clr-angular-forms-datalist.d.ts +59 -0
- package/types/clr-angular-forms-datepicker.d.ts +986 -0
- package/types/clr-angular-forms-file-input.d.ts +193 -0
- package/types/clr-angular-forms-input.d.ts +29 -0
- package/types/clr-angular-forms-number-input.d.ts +43 -0
- package/types/clr-angular-forms-password.d.ts +52 -0
- package/types/clr-angular-forms-radio.d.ts +50 -0
- package/types/clr-angular-forms-range.d.ts +37 -0
- package/types/clr-angular-forms-select.d.ts +36 -0
- package/types/clr-angular-forms-textarea.d.ts +29 -0
- package/types/clr-angular-forms.d.ts +36 -0
- package/types/clr-angular-icon.d.ts +1498 -0
- package/types/clr-angular-layout-breadcrumbs.d.ts +45 -0
- package/types/clr-angular-layout-main-container.d.ts +28 -0
- package/types/clr-angular-layout-nav.d.ts +142 -0
- package/types/clr-angular-layout-tabs.d.ts +158 -0
- package/types/clr-angular-layout-vertical-nav.d.ts +128 -0
- package/types/clr-angular-layout.d.ts +19 -0
- package/types/clr-angular-modal.d.ts +160 -0
- package/types/clr-angular-popover-common.d.ts +254 -0
- package/types/clr-angular-popover-dropdown.d.ts +123 -0
- package/types/clr-angular-popover-signpost.d.ts +157 -0
- package/types/clr-angular-popover-tooltip.d.ts +83 -0
- package/types/clr-angular-popover.d.ts +16 -0
- package/types/clr-angular-progress-progress-bars.d.ts +57 -0
- package/types/clr-angular-progress-spinner.d.ts +44 -0
- package/types/clr-angular-stepper.d.ts +179 -0
- package/types/clr-angular-timeline.d.ts +86 -0
- package/types/clr-angular-utils-conditional.d.ts +132 -0
- package/types/clr-angular-utils-loading.d.ts +38 -0
- package/types/clr-angular-utils.d.ts +913 -0
- package/types/clr-angular-wizard.d.ts +1508 -0
- package/fesm2022/rossigee-clarity-angular.mjs.map +0 -1
- /package/types/{rossigee-clarity-angular.d.ts → clr-angular.d.ts} +0 -0
|
@@ -0,0 +1,713 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, EventEmitter, Input, ViewChild, Output, Optional, SkipSelf, Component, ContentChildren, NgModule } from '@angular/core';
|
|
3
|
+
import * as i6 from '@clr/angular/icon';
|
|
4
|
+
import { ClrIcon, ClarityIcons, ellipsisHorizontalIcon } from '@clr/angular/icon';
|
|
5
|
+
import * as i5 from '@angular/common';
|
|
6
|
+
import { CommonModule } from '@angular/common';
|
|
7
|
+
import * as i2 from '@clr/angular/popover/common';
|
|
8
|
+
import { ClrPopoverType, ClrPopoverPosition, DROPDOWN_POSITIONS, ClrPopoverHostDirective, ClrPopoverModuleNext } from '@clr/angular/popover/common';
|
|
9
|
+
import * as i3 from '@clr/angular/utils';
|
|
10
|
+
import { uniqueIdFactory, ClrLoadingState, LoadingListener, Linkers, ClrDestroyService, FOCUS_SERVICE_PROVIDER } from '@clr/angular/utils';
|
|
11
|
+
import * as i1 from '@angular/router';
|
|
12
|
+
import { Subject } from 'rxjs';
|
|
13
|
+
import { takeUntil } from 'rxjs/operators';
|
|
14
|
+
import { trigger, transition, style, animate, keyframes } from '@angular/animations';
|
|
15
|
+
|
|
16
|
+
/*
|
|
17
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
18
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
19
|
+
* This software is released under MIT license.
|
|
20
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
21
|
+
*/
|
|
22
|
+
class ButtonInGroupService {
|
|
23
|
+
constructor() {
|
|
24
|
+
this._changes = new Subject();
|
|
25
|
+
}
|
|
26
|
+
get changes() {
|
|
27
|
+
return this._changes.asObservable();
|
|
28
|
+
}
|
|
29
|
+
updateButtonGroup(button) {
|
|
30
|
+
this._changes.next(button);
|
|
31
|
+
}
|
|
32
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ButtonInGroupService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
33
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ButtonInGroupService }); }
|
|
34
|
+
}
|
|
35
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ButtonInGroupService, decorators: [{
|
|
36
|
+
type: Injectable
|
|
37
|
+
}] });
|
|
38
|
+
|
|
39
|
+
/*
|
|
40
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
41
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
42
|
+
* This software is released under MIT license.
|
|
43
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
44
|
+
*/
|
|
45
|
+
class ClrButton {
|
|
46
|
+
constructor(routerLinkActive, buttonInGroupService) {
|
|
47
|
+
this.routerLinkActive = routerLinkActive;
|
|
48
|
+
this.buttonInGroupService = buttonInGroupService;
|
|
49
|
+
this._click = new EventEmitter(false);
|
|
50
|
+
this._inMenu = false;
|
|
51
|
+
this._enableService = false;
|
|
52
|
+
this._classNames = 'btn';
|
|
53
|
+
this._name = null;
|
|
54
|
+
this._type = null;
|
|
55
|
+
this._disabled = null;
|
|
56
|
+
this._id = uniqueIdFactory();
|
|
57
|
+
}
|
|
58
|
+
get inMenu() {
|
|
59
|
+
return this._inMenu;
|
|
60
|
+
}
|
|
61
|
+
set inMenu(value) {
|
|
62
|
+
value = !!value;
|
|
63
|
+
if (this._inMenu !== value) {
|
|
64
|
+
this._inMenu = value;
|
|
65
|
+
// We check if the service flag is enabled
|
|
66
|
+
// and if the service exists because the service is optional
|
|
67
|
+
if (this._enableService && this.buttonInGroupService) {
|
|
68
|
+
this.buttonInGroupService.updateButtonGroup(this);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
get classNames() {
|
|
73
|
+
return this.routerLinkActive?.isActive ? `${this._classNames} ${this.routerLinkActiveClasses}` : this._classNames;
|
|
74
|
+
}
|
|
75
|
+
set classNames(value) {
|
|
76
|
+
if (typeof value === 'string') {
|
|
77
|
+
const classNames = value.split(' ');
|
|
78
|
+
if (classNames.indexOf('btn') === -1) {
|
|
79
|
+
classNames.push('btn');
|
|
80
|
+
}
|
|
81
|
+
this._classNames = classNames.join(' ');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
get name() {
|
|
85
|
+
return this._name;
|
|
86
|
+
}
|
|
87
|
+
set name(value) {
|
|
88
|
+
if (typeof value === 'string') {
|
|
89
|
+
this._name = value;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
get type() {
|
|
93
|
+
return this._type;
|
|
94
|
+
}
|
|
95
|
+
set type(value) {
|
|
96
|
+
if (typeof value === 'string') {
|
|
97
|
+
this._type = value;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
get id() {
|
|
101
|
+
return this._id;
|
|
102
|
+
}
|
|
103
|
+
set id(value) {
|
|
104
|
+
if (typeof value === 'string') {
|
|
105
|
+
this._id = value;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
get disabled() {
|
|
109
|
+
return this._disabled;
|
|
110
|
+
}
|
|
111
|
+
set disabled(value) {
|
|
112
|
+
if (value !== null && value !== false) {
|
|
113
|
+
this._disabled = '';
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
this._disabled = null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
get role() {
|
|
120
|
+
return this.inMenu ? 'menuitem' : null;
|
|
121
|
+
}
|
|
122
|
+
ngAfterViewInit() {
|
|
123
|
+
this._enableService = true;
|
|
124
|
+
}
|
|
125
|
+
loadingStateChange(state) {
|
|
126
|
+
this.loading = state === ClrLoadingState.LOADING;
|
|
127
|
+
}
|
|
128
|
+
emitClick() {
|
|
129
|
+
this._click.emit(true);
|
|
130
|
+
}
|
|
131
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrButton, deps: [{ token: i1.RouterLinkActive, optional: true }, { token: ButtonInGroupService, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
132
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrButton, isStandalone: false, selector: "clr-button", inputs: { routerLinkActiveClasses: ["routerLinkActive", "routerLinkActiveClasses"], inMenu: ["clrInMenu", "inMenu"], classNames: ["class", "classNames"], name: "name", type: "type", id: "id", disabled: "disabled" }, outputs: { _click: "click" }, providers: [{ provide: LoadingListener, useExisting: ClrButton }], viewQueries: [{ propertyName: "templateRef", first: true, predicate: ["buttonProjectedRef"], descendants: true, static: true }], ngImport: i0, template: `
|
|
133
|
+
<ng-template #buttonProjectedRef>
|
|
134
|
+
<button
|
|
135
|
+
[class]="classNames"
|
|
136
|
+
(click)="emitClick()"
|
|
137
|
+
[attr.type]="type"
|
|
138
|
+
[attr.name]="name"
|
|
139
|
+
[attr.disabled]="disabled"
|
|
140
|
+
[attr.role]="role"
|
|
141
|
+
[attr.id]="id"
|
|
142
|
+
>
|
|
143
|
+
@if (loading) {
|
|
144
|
+
<span class="spinner spinner-inline"></span>
|
|
145
|
+
}
|
|
146
|
+
<ng-content></ng-content>
|
|
147
|
+
</button>
|
|
148
|
+
</ng-template>
|
|
149
|
+
`, isInline: true }); }
|
|
150
|
+
}
|
|
151
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrButton, decorators: [{
|
|
152
|
+
type: Component,
|
|
153
|
+
args: [{
|
|
154
|
+
selector: 'clr-button',
|
|
155
|
+
template: `
|
|
156
|
+
<ng-template #buttonProjectedRef>
|
|
157
|
+
<button
|
|
158
|
+
[class]="classNames"
|
|
159
|
+
(click)="emitClick()"
|
|
160
|
+
[attr.type]="type"
|
|
161
|
+
[attr.name]="name"
|
|
162
|
+
[attr.disabled]="disabled"
|
|
163
|
+
[attr.role]="role"
|
|
164
|
+
[attr.id]="id"
|
|
165
|
+
>
|
|
166
|
+
@if (loading) {
|
|
167
|
+
<span class="spinner spinner-inline"></span>
|
|
168
|
+
}
|
|
169
|
+
<ng-content></ng-content>
|
|
170
|
+
</button>
|
|
171
|
+
</ng-template>
|
|
172
|
+
`,
|
|
173
|
+
providers: [{ provide: LoadingListener, useExisting: ClrButton }],
|
|
174
|
+
standalone: false,
|
|
175
|
+
}]
|
|
176
|
+
}], ctorParameters: () => [{ type: i1.RouterLinkActive, decorators: [{
|
|
177
|
+
type: Optional
|
|
178
|
+
}] }, { type: ButtonInGroupService, decorators: [{
|
|
179
|
+
type: SkipSelf
|
|
180
|
+
}, {
|
|
181
|
+
type: Optional
|
|
182
|
+
}] }], propDecorators: { _click: [{
|
|
183
|
+
type: Output,
|
|
184
|
+
args: ['click']
|
|
185
|
+
}], routerLinkActiveClasses: [{
|
|
186
|
+
type: Input,
|
|
187
|
+
args: ['routerLinkActive']
|
|
188
|
+
}], templateRef: [{
|
|
189
|
+
type: ViewChild,
|
|
190
|
+
args: ['buttonProjectedRef', { static: true }]
|
|
191
|
+
}], inMenu: [{
|
|
192
|
+
type: Input,
|
|
193
|
+
args: ['clrInMenu']
|
|
194
|
+
}], classNames: [{
|
|
195
|
+
type: Input,
|
|
196
|
+
args: ['class']
|
|
197
|
+
}], name: [{
|
|
198
|
+
type: Input,
|
|
199
|
+
args: ['name']
|
|
200
|
+
}], type: [{
|
|
201
|
+
type: Input,
|
|
202
|
+
args: ['type']
|
|
203
|
+
}], id: [{
|
|
204
|
+
type: Input,
|
|
205
|
+
args: ['id']
|
|
206
|
+
}], disabled: [{
|
|
207
|
+
type: Input,
|
|
208
|
+
args: ['disabled']
|
|
209
|
+
}] } });
|
|
210
|
+
|
|
211
|
+
/*
|
|
212
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
213
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
214
|
+
* This software is released under MIT license.
|
|
215
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
216
|
+
*/
|
|
217
|
+
var InitialFocus;
|
|
218
|
+
(function (InitialFocus) {
|
|
219
|
+
InitialFocus["FIRST_ITEM"] = "first";
|
|
220
|
+
InitialFocus["LAST_ITEM"] = "last";
|
|
221
|
+
})(InitialFocus || (InitialFocus = {}));
|
|
222
|
+
|
|
223
|
+
/*
|
|
224
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
225
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
226
|
+
* This software is released under MIT license.
|
|
227
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
228
|
+
*/
|
|
229
|
+
class ButtonGroupFocusHandler {
|
|
230
|
+
constructor(focusService, popoverService, renderer) {
|
|
231
|
+
this.focusService = focusService;
|
|
232
|
+
this.popoverService = popoverService;
|
|
233
|
+
this.renderer = renderer;
|
|
234
|
+
this.initialFocus = InitialFocus.FIRST_ITEM;
|
|
235
|
+
this._unlistenFuncs = [];
|
|
236
|
+
}
|
|
237
|
+
ngOnDestroy() {
|
|
238
|
+
this._unlistenFuncs.forEach((unlisten) => unlisten());
|
|
239
|
+
this.focusService.detachListeners(this.menu);
|
|
240
|
+
}
|
|
241
|
+
initialize({ menu, menuToggle }) {
|
|
242
|
+
this.menu = menu;
|
|
243
|
+
this.menuToggle = menuToggle;
|
|
244
|
+
this.focusService.registerContainer(this.menu);
|
|
245
|
+
this.listenToKeys();
|
|
246
|
+
this.linkButtons();
|
|
247
|
+
switch (this.initialFocus) {
|
|
248
|
+
case InitialFocus.LAST_ITEM:
|
|
249
|
+
this.focusLastItem();
|
|
250
|
+
break;
|
|
251
|
+
default:
|
|
252
|
+
this.focusFirstItem();
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
resetButtonsFocus() {
|
|
257
|
+
this.buttons.forEach(button => {
|
|
258
|
+
button.blur();
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
listenToKeys() {
|
|
262
|
+
this._unlistenFuncs.push(this.renderer.listen(this.menu, 'keydown.shift.tab', event => this.closeMenu(event, false)));
|
|
263
|
+
this._unlistenFuncs.push(this.renderer.listen(this.menu, 'keydown.tab', event => this.closeMenu(event, true)));
|
|
264
|
+
}
|
|
265
|
+
closeMenu(event, focusBackOnToggle) {
|
|
266
|
+
this.popoverService.toggleWithEvent(event);
|
|
267
|
+
if (focusBackOnToggle) {
|
|
268
|
+
this.menuToggle.focus();
|
|
269
|
+
}
|
|
270
|
+
this.resetButtonsFocus();
|
|
271
|
+
}
|
|
272
|
+
linkButtons() {
|
|
273
|
+
const buttonElements = Array.from(this.menu.children);
|
|
274
|
+
this.buttons = buttonElements.map(buttonElement => {
|
|
275
|
+
this._unlistenFuncs.push(this.renderer.listen(buttonElement, 'click', event => this.closeMenu(event, true)));
|
|
276
|
+
return {
|
|
277
|
+
id: buttonElement.id,
|
|
278
|
+
value: buttonElement,
|
|
279
|
+
focus: () => {
|
|
280
|
+
buttonElement.setAttribute('tabindex', '0');
|
|
281
|
+
buttonElement.focus();
|
|
282
|
+
},
|
|
283
|
+
blur: () => {
|
|
284
|
+
buttonElement.setAttribute('tabindex', '-1');
|
|
285
|
+
buttonElement.blur();
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
});
|
|
289
|
+
this.resetButtonsFocus();
|
|
290
|
+
Linkers.linkVertical(this.buttons);
|
|
291
|
+
}
|
|
292
|
+
focusFirstItem() {
|
|
293
|
+
if (this.buttons.length) {
|
|
294
|
+
this.focusService.moveTo(this.buttons[0]);
|
|
295
|
+
}
|
|
296
|
+
this.initialFocus = InitialFocus.FIRST_ITEM;
|
|
297
|
+
}
|
|
298
|
+
focusLastItem() {
|
|
299
|
+
if (this.buttons.length) {
|
|
300
|
+
this.focusService.moveTo(this.buttons[this.buttons.length - 1]);
|
|
301
|
+
}
|
|
302
|
+
this.initialFocus = InitialFocus.FIRST_ITEM;
|
|
303
|
+
}
|
|
304
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ButtonGroupFocusHandler, deps: [{ token: i3.FocusService }, { token: i2.ClrPopoverService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
305
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ButtonGroupFocusHandler }); }
|
|
306
|
+
}
|
|
307
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ButtonGroupFocusHandler, decorators: [{
|
|
308
|
+
type: Injectable
|
|
309
|
+
}], ctorParameters: () => [{ type: i3.FocusService }, { type: i2.ClrPopoverService }, { type: i0.Renderer2 }] });
|
|
310
|
+
const BUTTON_GROUP_FOCUS_HANDLER_PROVIDER = {
|
|
311
|
+
provide: ButtonGroupFocusHandler,
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
/*
|
|
315
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
316
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
317
|
+
* This software is released under MIT license.
|
|
318
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
319
|
+
*/
|
|
320
|
+
class ClrButtonGroup {
|
|
321
|
+
constructor(buttonGroupNewService, popoverService, commonStrings, destroy$, focusHandler) {
|
|
322
|
+
this.buttonGroupNewService = buttonGroupNewService;
|
|
323
|
+
this.popoverService = popoverService;
|
|
324
|
+
this.commonStrings = commonStrings;
|
|
325
|
+
this.destroy$ = destroy$;
|
|
326
|
+
this.focusHandler = focusHandler;
|
|
327
|
+
this.clrToggleButtonAriaLabel = this.commonStrings.keys.rowActions;
|
|
328
|
+
this.popoverId = uniqueIdFactory();
|
|
329
|
+
this.InitialFocus = InitialFocus;
|
|
330
|
+
this.inlineButtons = [];
|
|
331
|
+
this.menuButtons = [];
|
|
332
|
+
this.popoverType = ClrPopoverType.DROPDOWN;
|
|
333
|
+
this._menuPosition = ClrPopoverPosition.BOTTOM_LEFT;
|
|
334
|
+
}
|
|
335
|
+
get menuPosition() {
|
|
336
|
+
return this._menuPosition;
|
|
337
|
+
}
|
|
338
|
+
set menuPosition(pos) {
|
|
339
|
+
if (!pos) {
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
const posIndex = DROPDOWN_POSITIONS.indexOf(pos);
|
|
343
|
+
if (posIndex === -1) {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
this._menuPosition = DROPDOWN_POSITIONS[posIndex];
|
|
347
|
+
}
|
|
348
|
+
get open() {
|
|
349
|
+
return this.popoverService.open;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* 1. Initializes the initial Button Group View
|
|
353
|
+
* 2. Subscribes to changes on the ContentChildren
|
|
354
|
+
* in case the user content projection changes
|
|
355
|
+
*/
|
|
356
|
+
ngAfterContentInit() {
|
|
357
|
+
this.initializeButtons();
|
|
358
|
+
this.buttonGroupNewService.changes.pipe(takeUntil(this.destroy$)).subscribe(button => this.rearrangeButton(button));
|
|
359
|
+
this.buttons.changes.subscribe(() => {
|
|
360
|
+
this.initializeButtons();
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
ngAfterViewInit() {
|
|
364
|
+
this.handleFocusOnMenuOpen();
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Moves the button into the other ViewContainer
|
|
368
|
+
* when an update is received.
|
|
369
|
+
*
|
|
370
|
+
* @param button
|
|
371
|
+
*/
|
|
372
|
+
rearrangeButton(button) {
|
|
373
|
+
let fromView;
|
|
374
|
+
let toView;
|
|
375
|
+
if (button.inMenu) {
|
|
376
|
+
fromView = this.inlineButtons;
|
|
377
|
+
toView = this.menuButtons;
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
fromView = this.menuButtons;
|
|
381
|
+
toView = this.inlineButtons;
|
|
382
|
+
}
|
|
383
|
+
const index = fromView.indexOf(button);
|
|
384
|
+
if (index > -1) {
|
|
385
|
+
fromView.splice(index, 1);
|
|
386
|
+
const moveIndex = this.getMoveIndex(button);
|
|
387
|
+
if (moveIndex <= toView.length) {
|
|
388
|
+
toView.splice(moveIndex, 0, button);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
openMenu(event, initialFocus) {
|
|
393
|
+
this.focusHandler.initialFocus = initialFocus;
|
|
394
|
+
if (!this.popoverService.open) {
|
|
395
|
+
this.popoverService.toggleWithEvent(event);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Author: Eudes
|
|
400
|
+
*
|
|
401
|
+
* Finds the order of a button w.r.t other buttons
|
|
402
|
+
*
|
|
403
|
+
* @param buttonToMove
|
|
404
|
+
* @returns
|
|
405
|
+
*/
|
|
406
|
+
getMoveIndex(buttonToMove) {
|
|
407
|
+
const tempArr = this.buttons.filter(button => button.inMenu === buttonToMove.inMenu);
|
|
408
|
+
return tempArr.indexOf(buttonToMove);
|
|
409
|
+
}
|
|
410
|
+
initializeButtons() {
|
|
411
|
+
const tempInlineButtons = [];
|
|
412
|
+
const tempInMenuButtons = [];
|
|
413
|
+
this.buttons.forEach(button => {
|
|
414
|
+
if (button.inMenu) {
|
|
415
|
+
tempInMenuButtons.push(button);
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
tempInlineButtons.push(button);
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
this.inlineButtons = tempInlineButtons;
|
|
422
|
+
this.menuButtons = tempInMenuButtons;
|
|
423
|
+
}
|
|
424
|
+
handleFocusOnMenuOpen() {
|
|
425
|
+
this.popoverService.popoverVisible.pipe(takeUntil(this.destroy$)).subscribe(visible => {
|
|
426
|
+
if (visible) {
|
|
427
|
+
this.focusHandler.initialize({
|
|
428
|
+
menu: this.menu.nativeElement,
|
|
429
|
+
menuToggle: this.menuToggle.nativeElement,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrButtonGroup, deps: [{ token: ButtonInGroupService }, { token: i2.ClrPopoverService }, { token: i3.ClrCommonStringsService }, { token: i3.ClrDestroyService }, { token: ButtonGroupFocusHandler }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
435
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrButtonGroup, isStandalone: false, selector: "clr-button-group", inputs: { clrToggleButtonAriaLabel: "clrToggleButtonAriaLabel", menuPosition: ["clrMenuPosition", "menuPosition"] }, host: { properties: { "class.btn-group": "true" } }, providers: [ButtonInGroupService, ClrDestroyService, BUTTON_GROUP_FOCUS_HANDLER_PROVIDER, FOCUS_SERVICE_PROVIDER], queries: [{ propertyName: "buttons", predicate: ClrButton }], viewQueries: [{ propertyName: "menuToggle", first: true, predicate: ["menuToggle"], descendants: true }, { propertyName: "menu", first: true, predicate: ["menu"], descendants: true }], hostDirectives: [{ directive: i2.ClrPopoverHostDirective }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n@for (inlineButton of inlineButtons; track inlineButton) {\n<ng-template [ngTemplateOutlet]=\"inlineButton.templateRef\"></ng-template>\n} @if (menuButtons.length > 0) {\n<div class=\"btn-group-overflow open\" [ngClass]=\"menuPosition\">\n <button\n #menuToggle\n class=\"btn dropdown-toggle\"\n clrPopoverOrigin\n clrPopoverOpenCloseButton\n (keydown.arrowup)=\"openMenu($event, InitialFocus.LAST_ITEM)\"\n (keydown.arrowdown)=\"openMenu($event, InitialFocus.FIRST_ITEM)\"\n [attr.aria-controls]=\"popoverId\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-label]=\"clrToggleButtonAriaLabel\"\n >\n <cds-icon shape=\"ellipsis-horizontal\" [attr.title]=\"commonStrings.keys.more\"></cds-icon>\n </button>\n <div\n #menu\n role=\"menu\"\n class=\"dropdown-menu clr-button-group-menu\"\n [id]=\"popoverId\"\n [attr.id]=\"popoverId\"\n [attr.aria-hidden]=\"!open\"\n *clrPopoverContent=\"open; at menuPosition; type: popoverType; outsideClickToClose: true; scrollToClose: true\"\n >\n @for (menuButton of menuButtons; track menuButton) {\n <ng-template [ngTemplateOutlet]=\"menuButton.templateRef\"></ng-template>\n }\n </div>\n</div>\n}\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i6.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "directive", type: i2.ClrPopoverOrigin, selector: "[clrPopoverOrigin]" }, { kind: "directive", type: i2.ClrPopoverOpenCloseButton, selector: "[clrPopoverOpenCloseButton]", outputs: ["clrPopoverOpenCloseChange"] }, { kind: "directive", type: i2.ClrPopoverContent, selector: "[clrPopoverContent]", inputs: ["clrPopoverContent", "clrPopoverContentAt", "clrPopoverContentAvailablePositions", "clrPopoverContentType", "clrPopoverContentOutsideClickToClose", "clrPopoverContentScrollToClose", "clrPopoverContentOrigin"] }] }); }
|
|
436
|
+
}
|
|
437
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrButtonGroup, decorators: [{
|
|
438
|
+
type: Component,
|
|
439
|
+
args: [{ selector: 'clr-button-group', providers: [ButtonInGroupService, ClrDestroyService, BUTTON_GROUP_FOCUS_HANDLER_PROVIDER, FOCUS_SERVICE_PROVIDER], hostDirectives: [ClrPopoverHostDirective], host: { '[class.btn-group]': 'true' }, standalone: false, template: "<!--\n ~ Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n\n@for (inlineButton of inlineButtons; track inlineButton) {\n<ng-template [ngTemplateOutlet]=\"inlineButton.templateRef\"></ng-template>\n} @if (menuButtons.length > 0) {\n<div class=\"btn-group-overflow open\" [ngClass]=\"menuPosition\">\n <button\n #menuToggle\n class=\"btn dropdown-toggle\"\n clrPopoverOrigin\n clrPopoverOpenCloseButton\n (keydown.arrowup)=\"openMenu($event, InitialFocus.LAST_ITEM)\"\n (keydown.arrowdown)=\"openMenu($event, InitialFocus.FIRST_ITEM)\"\n [attr.aria-controls]=\"popoverId\"\n [attr.aria-expanded]=\"open\"\n [attr.aria-label]=\"clrToggleButtonAriaLabel\"\n >\n <cds-icon shape=\"ellipsis-horizontal\" [attr.title]=\"commonStrings.keys.more\"></cds-icon>\n </button>\n <div\n #menu\n role=\"menu\"\n class=\"dropdown-menu clr-button-group-menu\"\n [id]=\"popoverId\"\n [attr.id]=\"popoverId\"\n [attr.aria-hidden]=\"!open\"\n *clrPopoverContent=\"open; at menuPosition; type: popoverType; outsideClickToClose: true; scrollToClose: true\"\n >\n @for (menuButton of menuButtons; track menuButton) {\n <ng-template [ngTemplateOutlet]=\"menuButton.templateRef\"></ng-template>\n }\n </div>\n</div>\n}\n" }]
|
|
440
|
+
}], ctorParameters: () => [{ type: ButtonInGroupService }, { type: i2.ClrPopoverService }, { type: i3.ClrCommonStringsService }, { type: i3.ClrDestroyService }, { type: ButtonGroupFocusHandler }], propDecorators: { clrToggleButtonAriaLabel: [{
|
|
441
|
+
type: Input,
|
|
442
|
+
args: ['clrToggleButtonAriaLabel']
|
|
443
|
+
}], menuToggle: [{
|
|
444
|
+
type: ViewChild,
|
|
445
|
+
args: ['menuToggle']
|
|
446
|
+
}], menu: [{
|
|
447
|
+
type: ViewChild,
|
|
448
|
+
args: ['menu']
|
|
449
|
+
}], buttons: [{
|
|
450
|
+
type: ContentChildren,
|
|
451
|
+
args: [ClrButton]
|
|
452
|
+
}], menuPosition: [{
|
|
453
|
+
type: Input,
|
|
454
|
+
args: ['clrMenuPosition']
|
|
455
|
+
}] } });
|
|
456
|
+
|
|
457
|
+
/*
|
|
458
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
459
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
460
|
+
* This software is released under MIT license.
|
|
461
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
462
|
+
*/
|
|
463
|
+
const CLR_BUTTON_GROUP_DIRECTIVES = [ClrButton, ClrButtonGroup];
|
|
464
|
+
class ClrButtonGroupModule {
|
|
465
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrButtonGroupModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
466
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrButtonGroupModule, declarations: [ClrButton, ClrButtonGroup], imports: [CommonModule, ClrIcon, ClrPopoverModuleNext], exports: [ClrButton, ClrButtonGroup] }); }
|
|
467
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrButtonGroupModule, imports: [CommonModule, ClrIcon, ClrPopoverModuleNext] }); }
|
|
468
|
+
}
|
|
469
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrButtonGroupModule, decorators: [{
|
|
470
|
+
type: NgModule,
|
|
471
|
+
args: [{
|
|
472
|
+
imports: [CommonModule, ClrIcon, ClrPopoverModuleNext],
|
|
473
|
+
declarations: [CLR_BUTTON_GROUP_DIRECTIVES],
|
|
474
|
+
exports: [CLR_BUTTON_GROUP_DIRECTIVES],
|
|
475
|
+
}]
|
|
476
|
+
}] });
|
|
477
|
+
|
|
478
|
+
/*
|
|
479
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
480
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
481
|
+
* This software is released under MIT license.
|
|
482
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
483
|
+
*/
|
|
484
|
+
// minimum width to fit loading spinner
|
|
485
|
+
const MIN_BUTTON_WIDTH = 42;
|
|
486
|
+
class ClrLoadingButton {
|
|
487
|
+
constructor(el, renderer) {
|
|
488
|
+
this.el = el;
|
|
489
|
+
this.renderer = renderer;
|
|
490
|
+
this.clrLoadingChange = new EventEmitter(false);
|
|
491
|
+
this.buttonState = ClrLoadingState;
|
|
492
|
+
this.state = ClrLoadingState.DEFAULT;
|
|
493
|
+
}
|
|
494
|
+
loadingStateChange(state) {
|
|
495
|
+
if (state === this.state) {
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
this.state = state;
|
|
499
|
+
switch (state) {
|
|
500
|
+
case ClrLoadingState.DEFAULT:
|
|
501
|
+
this.renderer.removeStyle(this.el.nativeElement, 'width');
|
|
502
|
+
this.renderer.removeStyle(this.el.nativeElement, 'transform'); // for chromium render bug see issue https://github.com/vmware/clarity/issues/2700
|
|
503
|
+
if (!this.disabled) {
|
|
504
|
+
this.renderer.removeAttribute(this.el.nativeElement, 'disabled');
|
|
505
|
+
}
|
|
506
|
+
break;
|
|
507
|
+
case ClrLoadingState.LOADING:
|
|
508
|
+
this.setExplicitButtonWidth();
|
|
509
|
+
this.renderer.setStyle(this.el.nativeElement, 'transform', 'translatez(0)'); // for chromium render bug see issue https://github.com/vmware/clarity/issues/2700
|
|
510
|
+
this.renderer.setAttribute(this.el.nativeElement, 'disabled', '');
|
|
511
|
+
break;
|
|
512
|
+
case ClrLoadingState.SUCCESS:
|
|
513
|
+
this.setExplicitButtonWidth();
|
|
514
|
+
break;
|
|
515
|
+
case ClrLoadingState.ERROR:
|
|
516
|
+
this.loadingStateChange(ClrLoadingState.DEFAULT);
|
|
517
|
+
break;
|
|
518
|
+
default:
|
|
519
|
+
break;
|
|
520
|
+
}
|
|
521
|
+
this.clrLoadingChange.emit(state);
|
|
522
|
+
}
|
|
523
|
+
setExplicitButtonWidth() {
|
|
524
|
+
if (this.el.nativeElement && this.el.nativeElement.getBoundingClientRect) {
|
|
525
|
+
const boundingClientRect = this.el.nativeElement.getBoundingClientRect();
|
|
526
|
+
const width = Math.max(MIN_BUTTON_WIDTH, boundingClientRect.width);
|
|
527
|
+
this.renderer.setStyle(this.el.nativeElement, 'width', `${width}px`);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrLoadingButton, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
531
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrLoadingButton, isStandalone: false, selector: "button[clrLoading]", inputs: { disabled: "disabled" }, outputs: { clrLoadingChange: "clrLoadingChange" }, host: { properties: { "attr.disabled": "disabled? '' : null" } }, providers: [{ provide: LoadingListener, useExisting: ClrLoadingButton }], ngImport: i0, template: `
|
|
532
|
+
<span @parent>
|
|
533
|
+
@switch (state) {
|
|
534
|
+
@case (buttonState.LOADING) {
|
|
535
|
+
<span @spinner class="spinner spinner-inline"></span>
|
|
536
|
+
}
|
|
537
|
+
@case (buttonState.SUCCESS) {
|
|
538
|
+
<span
|
|
539
|
+
@validated
|
|
540
|
+
(@validated.done)="this.loadingStateChange(this.buttonState.DEFAULT)"
|
|
541
|
+
class="spinner spinner-inline spinner-check"
|
|
542
|
+
></span>
|
|
543
|
+
}
|
|
544
|
+
@case (buttonState.DEFAULT) {
|
|
545
|
+
<span @defaultButton class="clr-loading-btn-content">
|
|
546
|
+
<ng-content></ng-content>
|
|
547
|
+
</span>
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
</span>
|
|
551
|
+
`, isInline: true, animations: [
|
|
552
|
+
trigger('parent', [
|
|
553
|
+
// Skip :enter animation on first render.
|
|
554
|
+
// The button text/content should only be faded when transitioning to or from a non-default state.
|
|
555
|
+
transition(':enter', []),
|
|
556
|
+
]),
|
|
557
|
+
trigger('defaultButton', [
|
|
558
|
+
transition(':enter', [style({ opacity: 0 }), animate('200ms 100ms ease-in', style({ opacity: 1 }))]),
|
|
559
|
+
// TODO: see if we can get leave animation to work before spinner's enter animation
|
|
560
|
+
transition(':leave', [style({ opacity: 0 })]),
|
|
561
|
+
]),
|
|
562
|
+
trigger('spinner', [
|
|
563
|
+
transition(':enter', [style({ opacity: 0 }), animate('200ms 100ms ease-in', style({ opacity: 1 }))]),
|
|
564
|
+
transition(':leave', [style({ opacity: 1 }), animate('100ms ease-out', style({ opacity: 0 }))]),
|
|
565
|
+
]),
|
|
566
|
+
trigger('validated', [
|
|
567
|
+
transition(':enter', [
|
|
568
|
+
animate('600ms', keyframes([
|
|
569
|
+
style({ transform: 'scale(0,0)', offset: 0 }),
|
|
570
|
+
style({ opacity: 1, offset: 0.2 }),
|
|
571
|
+
style({ transform: 'scale(1.2,1.2)', offset: 0.4 }),
|
|
572
|
+
style({ transform: 'scale(.9,.9)', offset: 0.6 }),
|
|
573
|
+
style({ transform: 'scale(1,1)', offset: 1 }),
|
|
574
|
+
])),
|
|
575
|
+
]),
|
|
576
|
+
transition(':leave', [style({ opacity: 1 }), animate('100ms ease-out', style({ opacity: 0 }))]),
|
|
577
|
+
]),
|
|
578
|
+
] }); }
|
|
579
|
+
}
|
|
580
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrLoadingButton, decorators: [{
|
|
581
|
+
type: Component,
|
|
582
|
+
args: [{
|
|
583
|
+
selector: 'button[clrLoading]',
|
|
584
|
+
template: `
|
|
585
|
+
<span @parent>
|
|
586
|
+
@switch (state) {
|
|
587
|
+
@case (buttonState.LOADING) {
|
|
588
|
+
<span @spinner class="spinner spinner-inline"></span>
|
|
589
|
+
}
|
|
590
|
+
@case (buttonState.SUCCESS) {
|
|
591
|
+
<span
|
|
592
|
+
@validated
|
|
593
|
+
(@validated.done)="this.loadingStateChange(this.buttonState.DEFAULT)"
|
|
594
|
+
class="spinner spinner-inline spinner-check"
|
|
595
|
+
></span>
|
|
596
|
+
}
|
|
597
|
+
@case (buttonState.DEFAULT) {
|
|
598
|
+
<span @defaultButton class="clr-loading-btn-content">
|
|
599
|
+
<ng-content></ng-content>
|
|
600
|
+
</span>
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
</span>
|
|
604
|
+
`,
|
|
605
|
+
providers: [{ provide: LoadingListener, useExisting: ClrLoadingButton }],
|
|
606
|
+
animations: [
|
|
607
|
+
trigger('parent', [
|
|
608
|
+
// Skip :enter animation on first render.
|
|
609
|
+
// The button text/content should only be faded when transitioning to or from a non-default state.
|
|
610
|
+
transition(':enter', []),
|
|
611
|
+
]),
|
|
612
|
+
trigger('defaultButton', [
|
|
613
|
+
transition(':enter', [style({ opacity: 0 }), animate('200ms 100ms ease-in', style({ opacity: 1 }))]),
|
|
614
|
+
// TODO: see if we can get leave animation to work before spinner's enter animation
|
|
615
|
+
transition(':leave', [style({ opacity: 0 })]),
|
|
616
|
+
]),
|
|
617
|
+
trigger('spinner', [
|
|
618
|
+
transition(':enter', [style({ opacity: 0 }), animate('200ms 100ms ease-in', style({ opacity: 1 }))]),
|
|
619
|
+
transition(':leave', [style({ opacity: 1 }), animate('100ms ease-out', style({ opacity: 0 }))]),
|
|
620
|
+
]),
|
|
621
|
+
trigger('validated', [
|
|
622
|
+
transition(':enter', [
|
|
623
|
+
animate('600ms', keyframes([
|
|
624
|
+
style({ transform: 'scale(0,0)', offset: 0 }),
|
|
625
|
+
style({ opacity: 1, offset: 0.2 }),
|
|
626
|
+
style({ transform: 'scale(1.2,1.2)', offset: 0.4 }),
|
|
627
|
+
style({ transform: 'scale(.9,.9)', offset: 0.6 }),
|
|
628
|
+
style({ transform: 'scale(1,1)', offset: 1 }),
|
|
629
|
+
])),
|
|
630
|
+
]),
|
|
631
|
+
transition(':leave', [style({ opacity: 1 }), animate('100ms ease-out', style({ opacity: 0 }))]),
|
|
632
|
+
]),
|
|
633
|
+
],
|
|
634
|
+
host: { '[attr.disabled]': "disabled? '' : null" },
|
|
635
|
+
standalone: false,
|
|
636
|
+
}]
|
|
637
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { disabled: [{
|
|
638
|
+
type: Input,
|
|
639
|
+
args: ['disabled']
|
|
640
|
+
}], clrLoadingChange: [{
|
|
641
|
+
type: Output,
|
|
642
|
+
args: ['clrLoadingChange']
|
|
643
|
+
}] } });
|
|
644
|
+
|
|
645
|
+
/*
|
|
646
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
647
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
648
|
+
* This software is released under MIT license.
|
|
649
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
650
|
+
*/
|
|
651
|
+
const CLR_LOADING_BUTTON_DIRECTIVES = [ClrLoadingButton];
|
|
652
|
+
class ClrLoadingButtonModule {
|
|
653
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrLoadingButtonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
654
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrLoadingButtonModule, declarations: [ClrLoadingButton], imports: [CommonModule], exports: [ClrLoadingButton] }); }
|
|
655
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrLoadingButtonModule, imports: [CommonModule] }); }
|
|
656
|
+
}
|
|
657
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrLoadingButtonModule, decorators: [{
|
|
658
|
+
type: NgModule,
|
|
659
|
+
args: [{
|
|
660
|
+
imports: [CommonModule],
|
|
661
|
+
declarations: [CLR_LOADING_BUTTON_DIRECTIVES],
|
|
662
|
+
exports: [CLR_LOADING_BUTTON_DIRECTIVES],
|
|
663
|
+
}]
|
|
664
|
+
}] });
|
|
665
|
+
|
|
666
|
+
/*
|
|
667
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
668
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
669
|
+
* This software is released under MIT license.
|
|
670
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
671
|
+
*/
|
|
672
|
+
class ClrButtonModule {
|
|
673
|
+
constructor() {
|
|
674
|
+
ClarityIcons.addIcons(ellipsisHorizontalIcon);
|
|
675
|
+
}
|
|
676
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrButtonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
677
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: ClrButtonModule, exports: [ClrLoadingButtonModule, ClrButtonGroupModule] }); }
|
|
678
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrButtonModule, imports: [ClrLoadingButtonModule, ClrButtonGroupModule] }); }
|
|
679
|
+
}
|
|
680
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrButtonModule, decorators: [{
|
|
681
|
+
type: NgModule,
|
|
682
|
+
args: [{
|
|
683
|
+
exports: [ClrLoadingButtonModule, ClrButtonGroupModule],
|
|
684
|
+
}]
|
|
685
|
+
}], ctorParameters: () => [] });
|
|
686
|
+
|
|
687
|
+
/*
|
|
688
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
689
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
690
|
+
* This software is released under MIT license.
|
|
691
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
692
|
+
*/
|
|
693
|
+
|
|
694
|
+
/*
|
|
695
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
696
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
697
|
+
* This software is released under MIT license.
|
|
698
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
699
|
+
*/
|
|
700
|
+
|
|
701
|
+
/*
|
|
702
|
+
* Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
|
|
703
|
+
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
|
|
704
|
+
* This software is released under MIT license.
|
|
705
|
+
* The full license information can be found in LICENSE in the root directory of this project.
|
|
706
|
+
*/
|
|
707
|
+
|
|
708
|
+
/**
|
|
709
|
+
* Generated bundle index. Do not edit.
|
|
710
|
+
*/
|
|
711
|
+
|
|
712
|
+
export { CLR_BUTTON_GROUP_DIRECTIVES, CLR_LOADING_BUTTON_DIRECTIVES, ClrButton, ClrButtonGroup, ClrButtonGroupModule, ClrButtonModule, ClrLoadingButton, ClrLoadingButtonModule };
|
|
713
|
+
//# sourceMappingURL=clr-angular-button.mjs.map
|