@muxima-ui/core 1.4.1 → 2.0.0
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/README.md +11 -0
- package/fesm2022/muxima-ui-core-alert.mjs +5 -3
- package/fesm2022/muxima-ui-core-alert.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-breadcrumb.mjs +5 -3
- package/fesm2022/muxima-ui-core-breadcrumb.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-carousel.mjs +19 -17
- package/fesm2022/muxima-ui-core-carousel.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-chips.mjs +19 -14
- package/fesm2022/muxima-ui-core-chips.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-clipboard.mjs +10 -6
- package/fesm2022/muxima-ui-core-clipboard.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-color-picker.mjs +53 -50
- package/fesm2022/muxima-ui-core-color-picker.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-combobox.mjs +15 -12
- package/fesm2022/muxima-ui-core-combobox.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-command.mjs +21 -16
- package/fesm2022/muxima-ui-core-command.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-data-grid.mjs +50 -52
- package/fesm2022/muxima-ui-core-data-grid.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-date-picker.mjs +102 -69
- package/fesm2022/muxima-ui-core-date-picker.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-editor.mjs +25 -19
- package/fesm2022/muxima-ui-core-editor.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-file-upload.mjs +32 -27
- package/fesm2022/muxima-ui-core-file-upload.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-form-field.mjs +2 -2
- package/fesm2022/muxima-ui-core-form-field.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-i18n.mjs +550 -0
- package/fesm2022/muxima-ui-core-i18n.mjs.map +1 -0
- package/fesm2022/muxima-ui-core-image-cropper.mjs +27 -24
- package/fesm2022/muxima-ui-core-image-cropper.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-kanban.mjs +22 -19
- package/fesm2022/muxima-ui-core-kanban.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-notification-center.mjs +42 -37
- package/fesm2022/muxima-ui-core-notification-center.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-pagination.mjs +29 -26
- package/fesm2022/muxima-ui-core-pagination.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-progress.mjs +5 -3
- package/fesm2022/muxima-ui-core-progress.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-rating.mjs +12 -8
- package/fesm2022/muxima-ui-core-rating.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-select.mjs +14 -11
- package/fesm2022/muxima-ui-core-select.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-sidebar.mjs +10 -7
- package/fesm2022/muxima-ui-core-sidebar.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-slider.mjs +10 -8
- package/fesm2022/muxima-ui-core-slider.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-stepper.mjs +5 -3
- package/fesm2022/muxima-ui-core-stepper.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-table.mjs +4 -4
- package/fesm2022/muxima-ui-core-table.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-time-picker.mjs +7 -5
- package/fesm2022/muxima-ui-core-time-picker.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-toast.mjs +8 -5
- package/fesm2022/muxima-ui-core-toast.mjs.map +1 -1
- package/fesm2022/muxima-ui-core-tour.mjs +6 -12
- package/fesm2022/muxima-ui-core-tour.mjs.map +1 -1
- package/fesm2022/muxima-ui-core.mjs +1 -1
- package/fesm2022/muxima-ui-core.mjs.map +1 -1
- package/package.json +5 -1
- package/types/muxima-ui-core-alert.d.ts +3 -1
- package/types/muxima-ui-core-breadcrumb.d.ts +6 -4
- package/types/muxima-ui-core-carousel.d.ts +4 -2
- package/types/muxima-ui-core-chips.d.ts +23 -3
- package/types/muxima-ui-core-clipboard.d.ts +6 -3
- package/types/muxima-ui-core-color-picker.d.ts +40 -7
- package/types/muxima-ui-core-combobox.d.ts +6 -3
- package/types/muxima-ui-core-command.d.ts +7 -3
- package/types/muxima-ui-core-data-grid.d.ts +30 -10
- package/types/muxima-ui-core-date-picker.d.ts +64 -15
- package/types/muxima-ui-core-editor.d.ts +13 -2
- package/types/muxima-ui-core-file-upload.d.ts +23 -7
- package/types/muxima-ui-core-form-field.d.ts +2 -2
- package/types/muxima-ui-core-i18n.d.ts +322 -0
- package/types/muxima-ui-core-image-cropper.d.ts +19 -6
- package/types/muxima-ui-core-kanban.d.ts +16 -3
- package/types/muxima-ui-core-notification-center.d.ts +31 -9
- package/types/muxima-ui-core-pagination.d.ts +16 -1
- package/types/muxima-ui-core-progress.d.ts +10 -8
- package/types/muxima-ui-core-rating.d.ts +6 -2
- package/types/muxima-ui-core-select.d.ts +6 -3
- package/types/muxima-ui-core-sidebar.d.ts +6 -3
- package/types/muxima-ui-core-slider.d.ts +6 -4
- package/types/muxima-ui-core-stepper.d.ts +10 -8
- package/types/muxima-ui-core-table.d.ts +3 -3
- package/types/muxima-ui-core-time-picker.d.ts +3 -1
- package/types/muxima-ui-core-toast.d.ts +3 -0
- package/types/muxima-ui-core-tour.d.ts +3 -3
- package/types/muxima-ui-core.d.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"muxima-ui-core-command.mjs","sources":["../../../projects/core/command/command.ts","../../../projects/core/command/muxima-ui-core-command.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n Injectable,\n TemplateRef,\n ViewEncapsulation,\n afterNextRender,\n computed,\n contentChild,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DialogRef } from '@angular/cdk/dialog';\nimport { MxDialog, MX_DIALOG_DATA } from '@muxima-ui/core/dialog';\nimport { mxNormalize, mxUniqueId } from '@muxima-ui/core/form-field';\n\nexport interface MxCommandItem<D = unknown> {\n /** Texto mostrado e pesquisado. */\n label: string;\n /** Grupo onde aparece (ex.: \"Páginas\", \"Acções\"). */\n group?: string;\n /** Palavras extra para a pesquisa, não mostradas. */\n keywords?: string[];\n /** Texto à direita, por exemplo um atalho. */\n hint?: string;\n disabled?: boolean;\n /** Dados livres (rota, id...). */\n data?: D;\n}\n\n/** Modelo opcional para desenhar cada item (ex.: com ícone). */\n@Directive({ selector: 'ng-template[mxCommandItem]' })\nexport class MxCommandItemTemplate {\n readonly template = inject<TemplateRef<{ $implicit: MxCommandItem }>>(TemplateRef);\n}\n\n/**\n * Pesquisa de comandos: campo + lista filtrada, por grupos (padrão combobox com lista).\n * Use-se dentro de um diálogo (MxCommandPalette) ou directamente na página.\n *\n * ```html\n * <mx-command [items]=\"comandos\" (selected)=\"executar($event)\" aria-label=\"Pesquisar comandos\" />\n * ```\n */\n@Component({\n selector: 'mx-command',\n exportAs: 'mxCommand',\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mx-command', '[attr.aria-label]': 'null' },\n template: `\n <div class=\"mx-command-search\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" stroke=\"currentColor\" stroke-width=\"1.4\" />\n <path d=\"M10.5 10.5L14 14\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n <input\n #search\n class=\"mx-command-input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"flat().length ? optionId(active()) : null\"\n [attr.aria-label]=\"ariaLabel()\"\n [placeholder]=\"placeholder()\"\n [value]=\"query()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n <div class=\"mx-command-list\" role=\"listbox\" [id]=\"listId\" [attr.aria-label]=\"ariaLabel()\">\n @for (g of groups(); track g.name) {\n <div role=\"group\" class=\"mx-command-group\" [attr.aria-labelledby]=\"g.name ? groupId(g.name) : null\">\n @if (g.name) {\n <div class=\"mx-command-group-label\" [id]=\"groupId(g.name)\" aria-hidden=\"true\">{{ g.name }}</div>\n }\n @for (e of g.items; track e.index) {\n <div\n class=\"mx-command-item\"\n role=\"option\"\n [id]=\"optionId(e.index)\"\n [attr.aria-selected]=\"e.index === active()\"\n [attr.aria-disabled]=\"e.item.disabled ? 'true' : null\"\n [attr.data-active]=\"e.index === active() ? '' : null\"\n (mousemove)=\"active.set(e.index)\"\n (click)=\"choose(e.item)\"\n >\n @if (itemTemplate(); as t) {\n <ng-container *ngTemplateOutlet=\"t.template; context: { $implicit: e.item }\" />\n } @else {\n <span>{{ e.item.label }}</span>\n }\n @if (e.item.hint) {\n <span class=\"mx-command-hint\">{{ e.item.hint }}</span>\n }\n </div>\n }\n </div>\n } @empty {\n <div class=\"mx-command-empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">{{ emptyText() }} \"{{ query() }}\"</div>\n }\n </div>\n <span class=\"mx-visually-hidden\" aria-live=\"polite\">{{ flat().length }} resultados</span>\n `,\n})\nexport class MxCommand<D = unknown> {\n readonly items = input.required<readonly MxCommandItem<D>[]>();\n readonly placeholder = input('Pesquisar...');\n readonly emptyText = input('Nada encontrado para');\n readonly ariaLabel = input('Pesquisar', { alias: 'aria-label' });\n readonly selected = output<MxCommandItem<D>>();\n\n protected readonly itemTemplate = contentChild(MxCommandItemTemplate);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n protected readonly listId = mxUniqueId('mx-command-list');\n protected readonly query = signal('');\n protected readonly active = signal(0);\n\n protected readonly flat = computed(() => {\n const q = mxNormalize(this.query().trim());\n const all = this.items();\n if (!q) return [...all];\n return all.filter((i) => mxNormalize([i.label, i.group ?? '', ...(i.keywords ?? [])].join(' ')).includes(q));\n });\n\n protected readonly groups = computed(() => {\n const out: { name: string; items: { item: MxCommandItem<D>; index: number }[] }[] = [];\n this.flat().forEach((item, index) => {\n const name = item.group ?? '';\n let g = out.find((x) => x.name === name);\n if (!g) out.push((g = { name, items: [] }));\n g.items.push({ item, index });\n });\n // a ordem do teclado segue a ordem visual\n let i = 0;\n out.forEach((g) => g.items.forEach((e) => (e.index = i++)));\n return out;\n });\n\n private readonly ordered = computed(() => this.groups().flatMap((g) => g.items.map((e) => e.item)));\n\n constructor() {\n afterNextRender(() => this.focus());\n }\n\n focus(): void {\n this.host.querySelector<HTMLInputElement>('.mx-command-input')?.focus();\n }\n\n protected optionId(i: number): string {\n return `${this.listId}-${i}`;\n }\n protected groupId(name: string): string {\n return `${this.listId}-g-${mxNormalize(name).replace(/\\W+/g, '-')}`;\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.active.set(0);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const n = this.ordered().length;\n if (!n) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.active.update((i) => (i + 1) % n);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.active.update((i) => (i - 1 + n) % n);\n } else if (event.key === 'Home' && event.ctrlKey) {\n event.preventDefault();\n this.active.set(0);\n } else if (event.key === 'End' && event.ctrlKey) {\n event.preventDefault();\n this.active.set(n - 1);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n this.choose(this.ordered()[this.active()]);\n return;\n } else {\n return;\n }\n queueMicrotask(() => document.getElementById(this.optionId(this.active()))?.scrollIntoView?.({ block: 'nearest' }));\n }\n\n protected choose(item: MxCommandItem<D> | undefined): void {\n if (item && !item.disabled) this.selected.emit(item);\n }\n}\n\n/** Conteúdo do diálogo aberto por MxCommandPalette. */\n@Component({\n selector: 'mx-command-palette',\n imports: [MxCommand],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<mx-command [items]=\"data.items\" [placeholder]=\"data.placeholder\" [aria-label]=\"data.label\" (selected)=\"ref.close($event)\" />`,\n})\nexport class MxCommandPaletteDialog {\n protected readonly data = inject<{ items: MxCommandItem[]; placeholder: string; label: string }>(MX_DIALOG_DATA);\n protected readonly ref = inject<DialogRef<MxCommandItem>>(DialogRef);\n}\n\n/**\n * Abre a pesquisa de comandos num diálogo modal. O resultado é o item escolhido.\n *\n * ```ts\n * inject(MxCommandPalette).open(comandos).closed.subscribe((item) => item && executar(item));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MxCommandPalette {\n private readonly dialog = inject(MxDialog);\n\n open<D>(items: MxCommandItem<D>[], options: { placeholder?: string; label?: string } = {}): DialogRef<MxCommandItem<D>> {\n const ref = this.dialog.open<MxCommandItem<D>>(MxCommandPaletteDialog, {\n data: { items, placeholder: options.placeholder ?? 'Pesquisar...', label: options.label ?? 'Pesquisar' },\n size: 'md',\n ariaLabel: options.label ?? 'Pesquisar',\n });\n ref.addPanelClass('mx-command-panel');\n return ref as unknown as DialogRef<MxCommandItem<D>>;\n }\n}\n\nexport const MX_COMMAND = [MxCommand, MxCommandItemTemplate] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"muxima-ui-core-command.mjs","sources":["../../../projects/core/command/command.ts","../../../projects/core/command/muxima-ui-core-command.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n Injectable,\n TemplateRef,\n ViewEncapsulation,\n afterNextRender,\n computed,\n contentChild,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { injectMxMessages } from '@muxima-ui/core/i18n';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DialogRef } from '@angular/cdk/dialog';\nimport { MxDialog, MX_DIALOG_DATA } from '@muxima-ui/core/dialog';\nimport { mxNormalize, mxUniqueId } from '@muxima-ui/core/form-field';\n\nexport interface MxCommandItem<D = unknown> {\n /** Texto mostrado e pesquisado. */\n label: string;\n /** Grupo onde aparece (ex.: \"Páginas\", \"Acções\"). */\n group?: string;\n /** Palavras extra para a pesquisa, não mostradas. */\n keywords?: string[];\n /** Texto à direita, por exemplo um atalho. */\n hint?: string;\n disabled?: boolean;\n /** Dados livres (rota, id...). */\n data?: D;\n}\n\n/** Modelo opcional para desenhar cada item (ex.: com ícone). */\n@Directive({ selector: 'ng-template[mxCommandItem]' })\nexport class MxCommandItemTemplate {\n readonly template = inject<TemplateRef<{ $implicit: MxCommandItem }>>(TemplateRef);\n}\n\n/**\n * Pesquisa de comandos: campo + lista filtrada, por grupos (padrão combobox com lista).\n * Use-se dentro de um diálogo (MxCommandPalette) ou directamente na página.\n *\n * ```html\n * <mx-command [items]=\"comandos\" (selected)=\"executar($event)\" aria-label=\"Pesquisar comandos\" />\n * ```\n */\n@Component({\n selector: 'mx-command',\n exportAs: 'mxCommand',\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'mx-command', '[attr.aria-label]': 'null' },\n template: `\n <div class=\"mx-command-search\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" stroke=\"currentColor\" stroke-width=\"1.4\" />\n <path d=\"M10.5 10.5L14 14\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n <input\n #search\n class=\"mx-command-input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"flat().length ? optionId(active()) : null\"\n [attr.aria-label]=\"labelText()\"\n [placeholder]=\"placeholder() ?? i18n().command.placeholder\"\n [value]=\"query()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n />\n </div>\n <div class=\"mx-command-list\" role=\"listbox\" [id]=\"listId\" [attr.aria-label]=\"labelText()\">\n @for (g of groups(); track g.name) {\n <div role=\"group\" class=\"mx-command-group\" [attr.aria-labelledby]=\"g.name ? groupId(g.name) : null\">\n @if (g.name) {\n <div class=\"mx-command-group-label\" [id]=\"groupId(g.name)\" aria-hidden=\"true\">{{ g.name }}</div>\n }\n @for (e of g.items; track e.index) {\n <div\n class=\"mx-command-item\"\n role=\"option\"\n [id]=\"optionId(e.index)\"\n [attr.aria-selected]=\"e.index === active()\"\n [attr.aria-disabled]=\"e.item.disabled ? 'true' : null\"\n [attr.data-active]=\"e.index === active() ? '' : null\"\n (mousemove)=\"active.set(e.index)\"\n (click)=\"choose(e.item)\"\n >\n @if (itemTemplate(); as t) {\n <ng-container *ngTemplateOutlet=\"t.template; context: { $implicit: e.item }\" />\n } @else {\n <span>{{ e.item.label }}</span>\n }\n @if (e.item.hint) {\n <span class=\"mx-command-hint\">{{ e.item.hint }}</span>\n }\n </div>\n }\n </div>\n } @empty {\n <div class=\"mx-command-empty\" role=\"option\" aria-disabled=\"true\" aria-selected=\"false\">{{ emptyText() ?? i18n().command.empty }} \"{{ query() }}\"</div>\n }\n </div>\n <span class=\"mx-visually-hidden\" aria-live=\"polite\">{{ i18n().command.results(flat().length) }}</span>\n `,\n})\nexport class MxCommand<D = unknown> {\n readonly items = input.required<readonly MxCommandItem<D>[]>();\n readonly placeholder = input<string>();\n readonly emptyText = input<string>();\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n protected readonly i18n = injectMxMessages();\n protected readonly labelText = computed(() => this.ariaLabel() ?? this.i18n().command.label);\n readonly selected = output<MxCommandItem<D>>();\n\n protected readonly itemTemplate = contentChild(MxCommandItemTemplate);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n protected readonly listId = mxUniqueId('mx-command-list');\n protected readonly query = signal('');\n protected readonly active = signal(0);\n\n protected readonly flat = computed(() => {\n const q = mxNormalize(this.query().trim());\n const all = this.items();\n if (!q) return [...all];\n return all.filter((i) => mxNormalize([i.label, i.group ?? '', ...(i.keywords ?? [])].join(' ')).includes(q));\n });\n\n protected readonly groups = computed(() => {\n const out: { name: string; items: { item: MxCommandItem<D>; index: number }[] }[] = [];\n this.flat().forEach((item, index) => {\n const name = item.group ?? '';\n let g = out.find((x) => x.name === name);\n if (!g) out.push((g = { name, items: [] }));\n g.items.push({ item, index });\n });\n // a ordem do teclado segue a ordem visual\n let i = 0;\n out.forEach((g) => g.items.forEach((e) => (e.index = i++)));\n return out;\n });\n\n private readonly ordered = computed(() => this.groups().flatMap((g) => g.items.map((e) => e.item)));\n\n constructor() {\n afterNextRender(() => this.focus());\n }\n\n focus(): void {\n this.host.querySelector<HTMLInputElement>('.mx-command-input')?.focus();\n }\n\n protected optionId(i: number): string {\n return `${this.listId}-${i}`;\n }\n protected groupId(name: string): string {\n return `${this.listId}-g-${mxNormalize(name).replace(/\\W+/g, '-')}`;\n }\n\n protected onInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.active.set(0);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const n = this.ordered().length;\n if (!n) return;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.active.update((i) => (i + 1) % n);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.active.update((i) => (i - 1 + n) % n);\n } else if (event.key === 'Home' && event.ctrlKey) {\n event.preventDefault();\n this.active.set(0);\n } else if (event.key === 'End' && event.ctrlKey) {\n event.preventDefault();\n this.active.set(n - 1);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n this.choose(this.ordered()[this.active()]);\n return;\n } else {\n return;\n }\n queueMicrotask(() => document.getElementById(this.optionId(this.active()))?.scrollIntoView?.({ block: 'nearest' }));\n }\n\n protected choose(item: MxCommandItem<D> | undefined): void {\n if (item && !item.disabled) this.selected.emit(item);\n }\n}\n\n/** Conteúdo do diálogo aberto por MxCommandPalette. */\n@Component({\n selector: 'mx-command-palette',\n imports: [MxCommand],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `<mx-command [items]=\"data.items\" [placeholder]=\"data.placeholder\" [aria-label]=\"data.label\" (selected)=\"ref.close($event)\" />`,\n})\nexport class MxCommandPaletteDialog {\n protected readonly data = inject<{ items: MxCommandItem[]; placeholder: string; label: string }>(MX_DIALOG_DATA);\n protected readonly ref = inject<DialogRef<MxCommandItem>>(DialogRef);\n}\n\n/**\n * Abre a pesquisa de comandos num diálogo modal. O resultado é o item escolhido.\n *\n * ```ts\n * inject(MxCommandPalette).open(comandos).closed.subscribe((item) => item && executar(item));\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MxCommandPalette {\n private readonly dialog = inject(MxDialog);\n private readonly i18n = injectMxMessages();\n\n open<D>(items: MxCommandItem<D>[], options: { placeholder?: string; label?: string } = {}): DialogRef<MxCommandItem<D>> {\n const t = this.i18n().command;\n const ref = this.dialog.open<MxCommandItem<D>>(MxCommandPaletteDialog, {\n data: { items, placeholder: options.placeholder ?? t.placeholder, label: options.label ?? t.label },\n size: 'md',\n ariaLabel: options.label ?? t.label,\n });\n ref.addPanelClass('mx-command-panel');\n return ref as unknown as DialogRef<MxCommandItem<D>>;\n }\n}\n\nexport const MX_COMMAND = [MxCommand, MxCommandItemTemplate] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, inject, TemplateRef, Directive, model, booleanAttribute, numberAttribute, output, contentChildren, viewChild, ElementRef, Injector, signal,
|
|
2
|
+
import { input, inject, TemplateRef, Directive, model, booleanAttribute, numberAttribute, computed, output, contentChildren, viewChild, ElementRef, Injector, signal, afterRenderEffect, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { injectMxMessages } from '@muxima-ui/core/i18n';
|
|
3
4
|
import { NgTemplateOutlet } from '@angular/common';
|
|
4
5
|
import { LiveAnnouncer } from '@angular/cdk/a11y';
|
|
5
6
|
import { MxCheckbox } from '@muxima-ui/core/checkbox';
|
|
@@ -98,18 +99,20 @@ class MxDataGrid {
|
|
|
98
99
|
density = input('comfortable', ...(ngDevMode ? [{ debugName: "density" }] : /* istanbul ignore next */ []));
|
|
99
100
|
loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
100
101
|
columnMenu = input(true, { ...(ngDevMode ? { debugName: "columnMenu" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
101
|
-
ariaLabel = input(
|
|
102
|
+
ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
|
|
103
|
+
i18n = injectMxMessages();
|
|
104
|
+
msg = computed(() => this.i18n().dataGrid, ...(ngDevMode ? [{ debugName: "msg" }] : /* istanbul ignore next */ []));
|
|
102
105
|
/** Coluna cujo texto identifica a linha nos nomes ("Seleccionar FT 2026/0201"). */
|
|
103
106
|
labelKey = input(null, ...(ngDevMode ? [{ debugName: "labelKey" }] : /* istanbul ignore next */ []));
|
|
104
|
-
emptyText = input(
|
|
105
|
-
loadingText = input(
|
|
106
|
-
columnsText = input(
|
|
107
|
-
filterText = input(
|
|
108
|
-
allText = input(
|
|
109
|
-
selectAllText = input(
|
|
110
|
-
selectRowText = input(
|
|
111
|
-
selectText = input(
|
|
112
|
-
resizeHint = input(
|
|
107
|
+
emptyText = input(...(ngDevMode ? [undefined, { debugName: "emptyText" }] : /* istanbul ignore next */ []));
|
|
108
|
+
loadingText = input(...(ngDevMode ? [undefined, { debugName: "loadingText" }] : /* istanbul ignore next */ []));
|
|
109
|
+
columnsText = input(...(ngDevMode ? [undefined, { debugName: "columnsText" }] : /* istanbul ignore next */ []));
|
|
110
|
+
filterText = input(...(ngDevMode ? [undefined, { debugName: "filterText" }] : /* istanbul ignore next */ []));
|
|
111
|
+
allText = input(...(ngDevMode ? [undefined, { debugName: "allText" }] : /* istanbul ignore next */ []));
|
|
112
|
+
selectAllText = input(...(ngDevMode ? [undefined, { debugName: "selectAllText" }] : /* istanbul ignore next */ []));
|
|
113
|
+
selectRowText = input(...(ngDevMode ? [undefined, { debugName: "selectRowText" }] : /* istanbul ignore next */ []));
|
|
114
|
+
selectText = input(...(ngDevMode ? [undefined, { debugName: "selectText" }] : /* istanbul ignore next */ []));
|
|
115
|
+
resizeHint = input(...(ngDevMode ? [undefined, { debugName: "resizeHint" }] : /* istanbul ignore next */ []));
|
|
113
116
|
/** Enter ou duplo clique numa linha. */
|
|
114
117
|
rowActivate = output();
|
|
115
118
|
cells = contentChildren(MxGridCell, ...(ngDevMode ? [{ debugName: "cells" }] : /* istanbul ignore next */ []));
|
|
@@ -170,7 +173,7 @@ class MxDataGrid {
|
|
|
170
173
|
const s = this.sort();
|
|
171
174
|
const sc = s.key ? cols.find((c) => c.key === s.key) : null;
|
|
172
175
|
if (sc) {
|
|
173
|
-
const collator = new Intl.Collator(
|
|
176
|
+
const collator = new Intl.Collator(this.i18n().intlLocale, { numeric: true, sensitivity: 'base' });
|
|
174
177
|
const dir = s.direction === 'asc' ? 1 : -1;
|
|
175
178
|
out = [...out].sort((a, b) => {
|
|
176
179
|
const x = this.valueOf(sc, a);
|
|
@@ -213,14 +216,15 @@ class MxDataGrid {
|
|
|
213
216
|
allSelected = computed(() => this.rows().length > 0 && this.rows().every((r) => this.selectedSet().has(this.keyOf(r))), ...(ngDevMode ? [{ debugName: "allSelected" }] : /* istanbul ignore next */ []));
|
|
214
217
|
someSelected = computed(() => !this.allSelected() && this.rows().some((r) => this.selectedSet().has(this.keyOf(r))), ...(ngDevMode ? [{ debugName: "someSelected" }] : /* istanbul ignore next */ []));
|
|
215
218
|
statusText = computed(() => {
|
|
216
|
-
const
|
|
219
|
+
const t = this.msg();
|
|
220
|
+
const fmt = new Intl.NumberFormat(this.i18n().intlLocale);
|
|
217
221
|
const total = this.totalRows() ?? this.rows().length;
|
|
218
|
-
const parts = [
|
|
222
|
+
const parts = [t.rows(fmt.format(total), total)];
|
|
219
223
|
if (!this.manual() && this.rows().length !== this.data().length)
|
|
220
|
-
parts[0] +=
|
|
224
|
+
parts[0] += t.of(fmt.format(this.data().length));
|
|
221
225
|
const sel = this.selected().length;
|
|
222
226
|
if (this.selection() !== 'none' && sel)
|
|
223
|
-
parts.push(
|
|
227
|
+
parts.push(t.selected(fmt.format(sel), sel));
|
|
224
228
|
return parts.join(', ');
|
|
225
229
|
}, ...(ngDevMode ? [{ debugName: "statusText" }] : /* istanbul ignore next */ []));
|
|
226
230
|
constructor() {
|
|
@@ -265,9 +269,9 @@ class MxDataGrid {
|
|
|
265
269
|
if (c.format)
|
|
266
270
|
return c.format(v, row);
|
|
267
271
|
if (v instanceof Date)
|
|
268
|
-
return v.toLocaleDateString(
|
|
272
|
+
return v.toLocaleDateString(this.i18n().intlLocale);
|
|
269
273
|
if (typeof v === 'number')
|
|
270
|
-
return v.toLocaleString(
|
|
274
|
+
return v.toLocaleString(this.i18n().intlLocale);
|
|
271
275
|
return v == null ? '' : String(v);
|
|
272
276
|
}
|
|
273
277
|
rowLabel(row) {
|
|
@@ -307,7 +311,7 @@ class MxDataGrid {
|
|
|
307
311
|
return c.filterOptions;
|
|
308
312
|
return [...new Set(this.data().map((r) => String(this.valueOf(c, r) ?? '')))]
|
|
309
313
|
.filter(Boolean)
|
|
310
|
-
.sort((a, b) => a.localeCompare(b,
|
|
314
|
+
.sort((a, b) => a.localeCompare(b, this.i18n().intlLocale));
|
|
311
315
|
}
|
|
312
316
|
isHidden(c) {
|
|
313
317
|
const hidden = this.hiddenKeys();
|
|
@@ -334,8 +338,8 @@ class MxDataGrid {
|
|
|
334
338
|
: { key: null, direction: 'asc' };
|
|
335
339
|
this.sort.set(next);
|
|
336
340
|
this.announcer.announce(next.key
|
|
337
|
-
?
|
|
338
|
-
:
|
|
341
|
+
? this.msg().sorted(c.header, next.direction)
|
|
342
|
+
: this.msg().unsorted);
|
|
339
343
|
}
|
|
340
344
|
setFilter(key, value) {
|
|
341
345
|
this.filters.update((f) => ({ ...f, [key]: value }));
|
|
@@ -478,7 +482,7 @@ class MxDataGrid {
|
|
|
478
482
|
(event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {
|
|
479
483
|
event.preventDefault();
|
|
480
484
|
this.setWidth(col.key, this.widthOf(col) + (event.key === 'ArrowRight' ? 16 : -16));
|
|
481
|
-
this.announcer.announce(
|
|
485
|
+
this.announcer.announce(this.msg().width(col.header, this.widthOf(col)));
|
|
482
486
|
return;
|
|
483
487
|
}
|
|
484
488
|
if (inSelect)
|
|
@@ -555,7 +559,7 @@ class MxDataGrid {
|
|
|
555
559
|
stroke-linejoin="round"
|
|
556
560
|
/>
|
|
557
561
|
</svg>
|
|
558
|
-
{{ columnsText() }}
|
|
562
|
+
{{ (columnsText() ?? msg().columns) }}
|
|
559
563
|
</button>
|
|
560
564
|
<ng-template #colunas>
|
|
561
565
|
<div mxMenu>
|
|
@@ -585,7 +589,7 @@ class MxDataGrid {
|
|
|
585
589
|
<table
|
|
586
590
|
class="mx-grid-table"
|
|
587
591
|
role="grid"
|
|
588
|
-
[attr.aria-label]="ariaLabel()"
|
|
592
|
+
[attr.aria-label]="(ariaLabel() ?? msg().label)"
|
|
589
593
|
[attr.aria-rowcount]="rowCount()"
|
|
590
594
|
[attr.aria-colcount]="colCount()"
|
|
591
595
|
[attr.aria-multiselectable]="selection() === 'multiple' ? 'true' : null"
|
|
@@ -618,12 +622,12 @@ class MxDataGrid {
|
|
|
618
622
|
mxCheckbox
|
|
619
623
|
[checked]="allSelected()"
|
|
620
624
|
[indeterminate]="someSelected()"
|
|
621
|
-
[attr.aria-label]="selectAllText()"
|
|
625
|
+
[attr.aria-label]="(selectAllText() ?? msg().selectAll)"
|
|
622
626
|
(change)="toggleAll()"
|
|
623
627
|
tabindex="-1"
|
|
624
628
|
/>
|
|
625
629
|
} @else {
|
|
626
|
-
<span class="mx-visually-hidden">{{ selectText() }}</span>
|
|
630
|
+
<span class="mx-visually-hidden">{{ (selectText() ?? msg().selection) }}</span>
|
|
627
631
|
}
|
|
628
632
|
</th>
|
|
629
633
|
}
|
|
@@ -713,11 +717,11 @@ class MxDataGrid {
|
|
|
713
717
|
<select
|
|
714
718
|
class="mx-grid-filter"
|
|
715
719
|
tabindex="-1"
|
|
716
|
-
[attr.aria-label]="filterText() + ' ' + c.header"
|
|
720
|
+
[attr.aria-label]="(filterText() ?? msg().filter) + ' ' + c.header"
|
|
717
721
|
[value]="filters()[c.key] || ''"
|
|
718
722
|
(change)="setFilter(c.key, $any($event.target).value)"
|
|
719
723
|
>
|
|
720
|
-
<option value="">{{ allText() }}</option>
|
|
724
|
+
<option value="">{{ (allText() ?? msg().all) }}</option>
|
|
721
725
|
@for (o of optionsOf(c); track o) {
|
|
722
726
|
<option [value]="o" [selected]="filters()[c.key] === o">{{ o }}</option>
|
|
723
727
|
}
|
|
@@ -728,7 +732,7 @@ class MxDataGrid {
|
|
|
728
732
|
class="mx-grid-filter"
|
|
729
733
|
tabindex="-1"
|
|
730
734
|
type="search"
|
|
731
|
-
[attr.aria-label]="filterText() + ' ' + c.header"
|
|
735
|
+
[attr.aria-label]="(filterText() ?? msg().filter) + ' ' + c.header"
|
|
732
736
|
[value]="filters()[c.key] || ''"
|
|
733
737
|
(input)="setFilter(c.key, $any($event.target).value)"
|
|
734
738
|
/>
|
|
@@ -741,10 +745,7 @@ class MxDataGrid {
|
|
|
741
745
|
inputmode="decimal"
|
|
742
746
|
placeholder=">, <, 10-20"
|
|
743
747
|
[attr.aria-label]="
|
|
744
|
-
filterText()
|
|
745
|
-
' ' +
|
|
746
|
-
c.header +
|
|
747
|
-
', aceita maior que, menor que e intervalos'
|
|
748
|
+
msg().numberFilter(filterText() ?? msg().filter, c.header)
|
|
748
749
|
"
|
|
749
750
|
[value]="filters()[c.key] || ''"
|
|
750
751
|
(input)="setFilter(c.key, $any($event.target).value)"
|
|
@@ -783,7 +784,7 @@ class MxDataGrid {
|
|
|
783
784
|
mxCheckbox
|
|
784
785
|
tabindex="-1"
|
|
785
786
|
[checked]="isSelected(row)"
|
|
786
|
-
[attr.aria-label]="selectRowText() + ' ' + rowLabel(row)"
|
|
787
|
+
[attr.aria-label]="(selectRowText() ?? msg().selectRow) + ' ' + rowLabel(row)"
|
|
787
788
|
(change)="toggleRow(row)"
|
|
788
789
|
/>
|
|
789
790
|
} @else {
|
|
@@ -793,7 +794,7 @@ class MxDataGrid {
|
|
|
793
794
|
tabindex="-1"
|
|
794
795
|
[name]="radioName"
|
|
795
796
|
[checked]="isSelected(row)"
|
|
796
|
-
[attr.aria-label]="selectRowText() + ' ' + rowLabel(row)"
|
|
797
|
+
[attr.aria-label]="(selectRowText() ?? msg().selectRow) + ' ' + rowLabel(row)"
|
|
797
798
|
(change)="toggleRow(row)"
|
|
798
799
|
/>
|
|
799
800
|
}
|
|
@@ -829,7 +830,7 @@ class MxDataGrid {
|
|
|
829
830
|
[attr.colspan]="colCount()"
|
|
830
831
|
[attr.data-cell]="headerRows() + ':0'"
|
|
831
832
|
>
|
|
832
|
-
{{ loading() ? loadingText() : emptyText() }}
|
|
833
|
+
{{ loading() ? (loadingText() ?? msg().loading) : (emptyText() ?? msg().empty) }}
|
|
833
834
|
</td>
|
|
834
835
|
</tr>
|
|
835
836
|
}
|
|
@@ -849,7 +850,7 @@ class MxDataGrid {
|
|
|
849
850
|
<span class="mx-grid-status" aria-live="polite">{{ statusText() }}</span>
|
|
850
851
|
<ng-content select="[mxGridFooter]" />
|
|
851
852
|
</div>
|
|
852
|
-
<span class="mx-visually-hidden" [id]="resizeHintId">{{ resizeHint() }}</span>
|
|
853
|
+
<span class="mx-visually-hidden" [id]="resizeHintId">{{ (resizeHint() ?? msg().resizeHint) }}</span>
|
|
853
854
|
`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: MxCheckbox, selector: "input[type=checkbox][mxCheckbox]", inputs: ["size", "indeterminate"], exportAs: ["mxCheckbox"] }, { kind: "directive", type: i1.MxMenuTrigger, selector: "[mxMenuTriggerFor]", exportAs: ["mxMenuTrigger"] }, { kind: "directive", type: i1.MxMenu, selector: "[mxMenu]", exportAs: ["mxMenu"] }, { kind: "directive", type: i1.MxMenuItemCheckbox, selector: "[mxMenuItemCheckbox]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
854
855
|
}
|
|
855
856
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImport: i0, type: MxDataGrid, decorators: [{
|
|
@@ -879,7 +880,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
879
880
|
stroke-linejoin="round"
|
|
880
881
|
/>
|
|
881
882
|
</svg>
|
|
882
|
-
{{ columnsText() }}
|
|
883
|
+
{{ (columnsText() ?? msg().columns) }}
|
|
883
884
|
</button>
|
|
884
885
|
<ng-template #colunas>
|
|
885
886
|
<div mxMenu>
|
|
@@ -909,7 +910,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
909
910
|
<table
|
|
910
911
|
class="mx-grid-table"
|
|
911
912
|
role="grid"
|
|
912
|
-
[attr.aria-label]="ariaLabel()"
|
|
913
|
+
[attr.aria-label]="(ariaLabel() ?? msg().label)"
|
|
913
914
|
[attr.aria-rowcount]="rowCount()"
|
|
914
915
|
[attr.aria-colcount]="colCount()"
|
|
915
916
|
[attr.aria-multiselectable]="selection() === 'multiple' ? 'true' : null"
|
|
@@ -942,12 +943,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
942
943
|
mxCheckbox
|
|
943
944
|
[checked]="allSelected()"
|
|
944
945
|
[indeterminate]="someSelected()"
|
|
945
|
-
[attr.aria-label]="selectAllText()"
|
|
946
|
+
[attr.aria-label]="(selectAllText() ?? msg().selectAll)"
|
|
946
947
|
(change)="toggleAll()"
|
|
947
948
|
tabindex="-1"
|
|
948
949
|
/>
|
|
949
950
|
} @else {
|
|
950
|
-
<span class="mx-visually-hidden">{{ selectText() }}</span>
|
|
951
|
+
<span class="mx-visually-hidden">{{ (selectText() ?? msg().selection) }}</span>
|
|
951
952
|
}
|
|
952
953
|
</th>
|
|
953
954
|
}
|
|
@@ -1037,11 +1038,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
1037
1038
|
<select
|
|
1038
1039
|
class="mx-grid-filter"
|
|
1039
1040
|
tabindex="-1"
|
|
1040
|
-
[attr.aria-label]="filterText() + ' ' + c.header"
|
|
1041
|
+
[attr.aria-label]="(filterText() ?? msg().filter) + ' ' + c.header"
|
|
1041
1042
|
[value]="filters()[c.key] || ''"
|
|
1042
1043
|
(change)="setFilter(c.key, $any($event.target).value)"
|
|
1043
1044
|
>
|
|
1044
|
-
<option value="">{{ allText() }}</option>
|
|
1045
|
+
<option value="">{{ (allText() ?? msg().all) }}</option>
|
|
1045
1046
|
@for (o of optionsOf(c); track o) {
|
|
1046
1047
|
<option [value]="o" [selected]="filters()[c.key] === o">{{ o }}</option>
|
|
1047
1048
|
}
|
|
@@ -1052,7 +1053,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
1052
1053
|
class="mx-grid-filter"
|
|
1053
1054
|
tabindex="-1"
|
|
1054
1055
|
type="search"
|
|
1055
|
-
[attr.aria-label]="filterText() + ' ' + c.header"
|
|
1056
|
+
[attr.aria-label]="(filterText() ?? msg().filter) + ' ' + c.header"
|
|
1056
1057
|
[value]="filters()[c.key] || ''"
|
|
1057
1058
|
(input)="setFilter(c.key, $any($event.target).value)"
|
|
1058
1059
|
/>
|
|
@@ -1065,10 +1066,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
1065
1066
|
inputmode="decimal"
|
|
1066
1067
|
placeholder=">, <, 10-20"
|
|
1067
1068
|
[attr.aria-label]="
|
|
1068
|
-
filterText()
|
|
1069
|
-
' ' +
|
|
1070
|
-
c.header +
|
|
1071
|
-
', aceita maior que, menor que e intervalos'
|
|
1069
|
+
msg().numberFilter(filterText() ?? msg().filter, c.header)
|
|
1072
1070
|
"
|
|
1073
1071
|
[value]="filters()[c.key] || ''"
|
|
1074
1072
|
(input)="setFilter(c.key, $any($event.target).value)"
|
|
@@ -1107,7 +1105,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
1107
1105
|
mxCheckbox
|
|
1108
1106
|
tabindex="-1"
|
|
1109
1107
|
[checked]="isSelected(row)"
|
|
1110
|
-
[attr.aria-label]="selectRowText() + ' ' + rowLabel(row)"
|
|
1108
|
+
[attr.aria-label]="(selectRowText() ?? msg().selectRow) + ' ' + rowLabel(row)"
|
|
1111
1109
|
(change)="toggleRow(row)"
|
|
1112
1110
|
/>
|
|
1113
1111
|
} @else {
|
|
@@ -1117,7 +1115,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
1117
1115
|
tabindex="-1"
|
|
1118
1116
|
[name]="radioName"
|
|
1119
1117
|
[checked]="isSelected(row)"
|
|
1120
|
-
[attr.aria-label]="selectRowText() + ' ' + rowLabel(row)"
|
|
1118
|
+
[attr.aria-label]="(selectRowText() ?? msg().selectRow) + ' ' + rowLabel(row)"
|
|
1121
1119
|
(change)="toggleRow(row)"
|
|
1122
1120
|
/>
|
|
1123
1121
|
}
|
|
@@ -1153,7 +1151,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
1153
1151
|
[attr.colspan]="colCount()"
|
|
1154
1152
|
[attr.data-cell]="headerRows() + ':0'"
|
|
1155
1153
|
>
|
|
1156
|
-
{{ loading() ? loadingText() : emptyText() }}
|
|
1154
|
+
{{ loading() ? (loadingText() ?? msg().loading) : (emptyText() ?? msg().empty) }}
|
|
1157
1155
|
</td>
|
|
1158
1156
|
</tr>
|
|
1159
1157
|
}
|
|
@@ -1173,7 +1171,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.25", ngImpo
|
|
|
1173
1171
|
<span class="mx-grid-status" aria-live="polite">{{ statusText() }}</span>
|
|
1174
1172
|
<ng-content select="[mxGridFooter]" />
|
|
1175
1173
|
</div>
|
|
1176
|
-
<span class="mx-visually-hidden" [id]="resizeHintId">{{ resizeHint() }}</span>
|
|
1174
|
+
<span class="mx-visually-hidden" [id]="resizeHintId">{{ (resizeHint() ?? msg().resizeHint) }}</span>
|
|
1177
1175
|
`,
|
|
1178
1176
|
}]
|
|
1179
1177
|
}], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rowKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowKey", required: false }] }], selection: [{ type: i0.Input, args: [{ isSignal: true, alias: "selection", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }, { type: i0.Output, args: ["selectedChange"] }], sort: [{ type: i0.Input, args: [{ isSignal: true, alias: "sort", required: false }] }, { type: i0.Output, args: ["sortChange"] }], filters: [{ type: i0.Input, args: [{ isSignal: true, alias: "filters", required: false }] }, { type: i0.Output, args: ["filtersChange"] }], query: [{ type: i0.Input, args: [{ isSignal: true, alias: "query", required: false }] }], manual: [{ type: i0.Input, args: [{ isSignal: true, alias: "manual", required: false }] }], totalRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalRows", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], rowHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHeight", required: false }] }], virtual: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtual", required: false }] }], density: [{ type: i0.Input, args: [{ isSignal: true, alias: "density", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], columnMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnMenu", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], labelKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelKey", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], loadingText: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingText", required: false }] }], columnsText: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnsText", required: false }] }], filterText: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterText", required: false }] }], allText: [{ type: i0.Input, args: [{ isSignal: true, alias: "allText", required: false }] }], selectAllText: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllText", required: false }] }], selectRowText: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectRowText", required: false }] }], selectText: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectText", required: false }] }], resizeHint: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizeHint", required: false }] }], rowActivate: [{ type: i0.Output, args: ["rowActivate"] }], cells: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MxGridCell), { isSignal: true }] }], toolbarSlot: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => MxGridToolbar), { isSignal: true }] }], scroller: [{ type: i0.ViewChild, args: ['scroller', { isSignal: true }] }] } });
|