From 8910e6f5dcc3aeefa930e9b0b65a19e400ad1603 Mon Sep 17 00:00:00 2001 From: mustafahlvc Date: Wed, 27 Sep 2017 19:40:59 +0300 Subject: [PATCH] angular-in-memory-web-api updated, + Http changed with HttpClient, + Angular Material Element examples added, + angular2-markdown Library added --- .angular-cli.json | 1 + package-lock.json | 66 +- package.json | 3 +- src/app/app.module.ts | 9 +- .../core/components/copier/copier.service.ts | 60 ++ src/app/core/modules/material.module.ts | 3 + src/app/core/modules/shared.module.ts | 7 +- .../core/scss/partials/plugins/_plugins.scss | 1 + .../core/scss/partials/plugins/_prism.scss | 269 +++++++ .../content/apps/calendar/calendar.service.ts | 10 +- .../main/content/apps/chat/chat.service.ts | 24 +- .../content/apps/contacts/contacts.service.ts | 12 +- .../dashboards/project/projects.service.ts | 16 +- .../apps/file-manager/file-manager.service.ts | 12 +- .../main/content/apps/mail/mail.service.ts | 36 +- .../apps/scrumboard/scrumboard.service.ts | 12 +- .../main/content/apps/todo/todo.service.ts | 28 +- .../datatable/ngx-datatable.component.ts | 8 +- .../angular-material.component.html | 31 + .../angular-material.component.scss | 9 + .../angular-material.component.ts | 32 + .../angular-material.module.ts | 40 + .../angular-material/example-components.ts | 759 ++++++++++++++++++ .../example-viewer/example-viewer.html | 58 ++ .../example-viewer/example-viewer.scss | 75 ++ .../example-viewer/example-viewer.ts | 110 +++ .../content/pages/invoices/invoice.service.ts | 8 +- .../content/pages/profile/profile.service.ts | 16 +- .../content/pages/search/search.service.ts | 12 +- .../content/ui/icons/icons.component.html | 2 +- .../main/content/ui/icons/icons.component.ts | 9 +- .../main/quick-panel/quick-panel.component.ts | 12 +- src/app/navigation.model.ts | 188 +++++ .../autocomplete-display-example.css | 9 + .../autocomplete-display-example.html | 10 + .../autocomplete-display-example.ts | 49 ++ .../autocomplete-filter-example.css | 9 + .../autocomplete-filter-example.html | 10 + .../autocomplete-filter-example.ts | 38 + .../autocomplete-overview-example.css | 9 + .../autocomplete-overview-example.html | 20 + .../autocomplete-overview-example.ts | 59 ++ .../autocomplete-simple-example.css | 9 + .../autocomplete-simple-example.html | 10 + .../autocomplete-simple-example.ts | 22 + .../button-overview-example.css | 1 + .../button-overview-example.html | 1 + .../button-overview-example.ts | 10 + .../button-toggle-exclusive-example.css | 3 + .../button-toggle-exclusive-example.html | 15 + .../button-toggle-exclusive-example.ts | 11 + .../button-toggle-overview-example.css | 1 + .../button-toggle-overview-example.html | 1 + .../button-toggle-overview-example.ts | 10 + .../button-types/button-types-example.css | 5 + .../button-types/button-types-example.html | 64 ++ .../button-types/button-types-example.ts | 11 + .../card-fancy/card-fancy-example.css | 8 + .../card-fancy/card-fancy-example.html | 19 + .../card-fancy/card-fancy-example.ts | 11 + .../card-overview/card-overview-example.css | 1 + .../card-overview/card-overview-example.html | 1 + .../card-overview/card-overview-example.ts | 10 + .../cdk-table-basic-example.css | 39 + .../cdk-table-basic-example.html | 36 + .../cdk-table-basic-example.ts | 92 +++ .../checkbox-configurable-example.css | 14 + .../checkbox-configurable-example.html | 40 + .../checkbox-configurable-example.ts | 16 + .../checkbox-overview-example.css | 1 + .../checkbox-overview-example.html | 1 + .../checkbox-overview-example.ts | 10 + .../chips-input/chips-input-example.css | 3 + .../chips-input/chips-input-example.html | 14 + .../chips-input/chips-input-example.ts | 52 ++ .../chips-overview/chips-overview-example.css | 1 + .../chips-overview-example.html | 6 + .../chips-overview/chips-overview-example.ts | 11 + .../chips-stacked/chips-stacked-example.css | 3 + .../chips-stacked/chips-stacked-example.html | 7 + .../chips-stacked/chips-stacked-example.ts | 20 + .../datepicker-api/datepicker-api-example.css | 1 + .../datepicker-api-example.html | 5 + .../datepicker-api/datepicker-api-example.ts | 12 + .../datepicker-filter-example.css | 1 + .../datepicker-filter-example.html | 5 + .../datepicker-filter-example.ts | 17 + .../datepicker-min-max-example.css | 1 + .../datepicker-min-max-example.html | 5 + .../datepicker-min-max-example.ts | 14 + .../datepicker-overview-example.css | 1 + .../datepicker-overview-example.html | 5 + .../datepicker-overview-example.ts | 11 + .../datepicker-start-view-example.css | 1 + .../datepicker-start-view-example.html | 5 + .../datepicker-start-view-example.ts | 13 + .../datepicker-touch-example.css | 1 + .../datepicker-touch-example.html | 5 + .../datepicker-touch-example.ts | 12 + .../dialog-content-example-dialog.html | 25 + .../dialog-content/dialog-content-example.css | 1 + .../dialog-content-example.html | 1 + .../dialog-content/dialog-content-example.ts | 29 + .../dialog-data-example-dialog.html | 15 + .../dialog-data/dialog-data-example.css | 1 + .../dialog-data/dialog-data-example.html | 1 + .../dialog-data/dialog-data-example.ts | 29 + .../dialog-elements-example-dialog.html | 5 + .../dialog-elements-example.css | 1 + .../dialog-elements-example.html | 1 + .../dialog-elements-example.ts | 24 + .../dialog-overview-example-dialog.html | 11 + .../dialog-overview-example.css | 1 + .../dialog-overview-example.html | 13 + .../dialog-overview-example.ts | 46 ++ .../expansion-overview-example.css | 1 + .../expansion-overview-example.html | 18 + .../expansion-overview-example.ts | 10 + .../expansion-steps-example.css | 9 + .../expansion-steps-example.html | 69 ++ .../expansion-steps-example.ts | 25 + .../grid-list-dynamic-example.css | 1 + .../grid-list-dynamic-example.html | 9 + .../grid-list-dynamic-example.ts | 17 + .../grid-list-overview-example.css | 3 + .../grid-list-overview-example.html | 6 + .../grid-list-overview-example.ts | 11 + .../icon-overview/icon-overview-example.css | 1 + .../icon-overview/icon-overview-example.html | 1 + .../icon-overview/icon-overview-example.ts | 10 + .../icon-svg/icon-svg-example.css | 1 + .../icon-svg/icon-svg-example.html | 1 + .../icon-svg/icon-svg-example.ts | 18 + .../input-clearable-example.css | 3 + .../input-clearable-example.html | 6 + .../input-clearable-example.ts | 13 + .../input-errors/input-errors-example.css | 9 + .../input-errors/input-errors-example.html | 11 + .../input-errors/input-errors-example.ts | 20 + .../input-form/input-form-example.css | 9 + .../input-form/input-form-example.html | 36 + .../input-form/input-form-example.ts | 11 + .../input-hint/input-hint-example.css | 9 + .../input-hint/input-hint-example.html | 9 + .../input-hint/input-hint-example.ts | 11 + .../input-overview/input-overview-example.css | 9 + .../input-overview-example.html | 5 + .../input-overview/input-overview-example.ts | 11 + .../input-prefix-suffix-example.css | 9 + .../input-prefix-suffix-example.html | 9 + .../input-prefix-suffix-example.ts | 11 + .../list-overview/list-overview-example.css | 1 + .../list-overview/list-overview-example.html | 5 + .../list-overview/list-overview-example.ts | 10 + .../list-sections/list-sections-example.css | 3 + .../list-sections/list-sections-example.html | 15 + .../list-sections/list-sections-example.ts | 36 + .../list-selection/list-selection-example.css | 1 + .../list-selection-example.html | 9 + .../list-selection/list-selection-example.ts | 13 + .../menu-icons/menu-icons-example.css | 1 + .../menu-icons/menu-icons-example.html | 17 + .../menu-icons/menu-icons-example.ts | 11 + .../menu-overview/menu-overview-example.css | 1 + .../menu-overview/menu-overview-example.html | 5 + .../menu-overview/menu-overview-example.ts | 11 + .../nested-menu/nested-menu-example.css | 1 + .../nested-menu/nested-menu-example.html | 47 ++ .../nested-menu/nested-menu-example.ts | 11 + .../paginator-configurable-example.css | 1 + .../paginator-configurable-example.html | 28 + .../paginator-configurable-example.ts | 23 + .../paginator-overview-example.css | 1 + .../paginator-overview-example.html | 4 + .../paginator-overview-example.ts | 10 + .../progress-bar-configurable-example.css | 14 + .../progress-bar-configurable-example.html | 63 ++ .../progress-bar-configurable-example.ts | 16 + .../progress-bar-overview-example.css | 1 + .../progress-bar-overview-example.html | 1 + .../progress-bar-overview-example.ts | 10 + .../progress-spinner-configurable-example.css | 14 + ...progress-spinner-configurable-example.html | 49 ++ .../progress-spinner-configurable-example.ts | 15 + .../progress-spinner-overview-example.css | 1 + .../progress-spinner-overview-example.html | 1 + .../progress-spinner-overview-example.ts | 10 + .../radio-ng-model/radio-ng-model-example.css | 12 + .../radio-ng-model-example.html | 6 + .../radio-ng-model/radio-ng-model-example.ts | 20 + .../radio-overview/radio-overview-example.css | 1 + .../radio-overview-example.html | 4 + .../radio-overview/radio-overview-example.ts | 10 + .../select-form/select-form-example.css | 1 + .../select-form/select-form-example.html | 9 + .../select-form/select-form-example.ts | 18 + .../select-overview-example.css | 1 + .../select-overview-example.html | 5 + .../select-overview-example.ts | 16 + .../sidenav-fab/sidenav-fab-example.css | 26 + .../sidenav-fab/sidenav-fab-example.html | 32 + .../sidenav-fab/sidenav-fab-example.ts | 13 + .../sidenav-overview-example.css | 16 + .../sidenav-overview-example.html | 12 + .../sidenav-overview-example.ts | 11 + .../slide-toggle-configurable-example.css | 14 + .../slide-toggle-configurable-example.html | 44 + .../slide-toggle-configurable-example.ts | 15 + .../slide-toggle-forms-example.css | 4 + .../slide-toggle-forms-example.html | 25 + .../slide-toggle-forms-example.ts | 26 + .../slide-toggle-overview-example.css | 1 + .../slide-toggle-overview-example.html | 1 + .../slide-toggle-overview-example.ts | 10 + .../slider-configurable-example.css | 22 + .../slider-configurable-example.html | 63 ++ .../slider-configurable-example.ts | 32 + .../slider-overview-example.css | 4 + .../slider-overview-example.html | 1 + .../slider-overview-example.ts | 11 + .../snack-bar-component-example-snack.css | 3 + .../snack-bar-component-example-snack.html | 3 + .../snack-bar-component-example.html | 3 + .../snack-bar-component-example.ts | 27 + .../snack-bar-overview-example.css | 1 + .../snack-bar-overview-example.html | 9 + .../snack-bar-overview-example.ts | 19 + .../sort-overview/sort-overview-example.css | 3 + .../sort-overview/sort-overview-example.html | 17 + .../sort-overview/sort-overview-example.ts | 50 ++ .../stepper-overview-example.css | 1 + .../stepper-overview-example.html | 33 + .../stepper-overview-example.ts | 27 + .../table-basic/table-basic-example.css | 11 + .../table-basic/table-basic-example.html | 34 + .../table-basic/table-basic-example.ts | 62 ++ .../table-filtering-example.css | 26 + .../table-filtering-example.html | 40 + .../table-filtering-example.ts | 118 +++ .../table-http/table-http-example.css | 57 ++ .../table-http/table-http-example.html | 51 ++ .../table-http/table-http-example.ts | 121 +++ .../table-overview/table-overview-example.css | 53 ++ .../table-overview-example.html | 78 ++ .../table-overview/table-overview-example.ts | 190 +++++ .../table-pagination-example.css | 19 + .../table-pagination-example.html | 42 + .../table-pagination-example.ts | 106 +++ .../table-sorting/table-sorting-example.css | 23 + .../table-sorting/table-sorting-example.html | 34 + .../table-sorting/table-sorting-example.ts | 125 +++ .../tabs-overview/tabs-overview-example.css | 1 + .../tabs-overview/tabs-overview-example.html | 4 + .../tabs-overview/tabs-overview-example.ts | 10 + .../tabs-template-label-example.css | 7 + .../tabs-template-label-example.html | 48 ++ .../tabs-template-label-example.ts | 11 + .../toolbar-multirow-example.css | 7 + .../toolbar-multirow-example.html | 16 + .../toolbar-multirow-example.ts | 11 + .../toolbar-overview-example.css | 1 + .../toolbar-overview-example.html | 1 + .../toolbar-overview-example.ts | 10 + .../tooltip-overview-example.css | 1 + .../tooltip-overview-example.html | 1 + .../tooltip-overview-example.ts | 10 + .../tooltip-position-example.css | 9 + .../tooltip-position-example.html | 11 + .../tooltip-position-example.ts | 13 + src/assets/images/examples/shiba1.jpg | Bin 0 -> 44398 bytes src/assets/images/examples/shiba2.jpg | Bin 0 -> 96125 bytes src/assets/images/examples/thumbup-icon.svg | 4 + src/assets/test.html | 1 + 273 files changed, 5865 insertions(+), 116 deletions(-) create mode 100644 src/app/core/components/copier/copier.service.ts create mode 100644 src/app/core/scss/partials/plugins/_prism.scss create mode 100644 src/app/main/content/components/angular-material/angular-material.component.html create mode 100644 src/app/main/content/components/angular-material/angular-material.component.scss create mode 100644 src/app/main/content/components/angular-material/angular-material.component.ts create mode 100644 src/app/main/content/components/angular-material/angular-material.module.ts create mode 100644 src/app/main/content/components/angular-material/example-components.ts create mode 100644 src/app/main/content/components/angular-material/example-viewer/example-viewer.html create mode 100644 src/app/main/content/components/angular-material/example-viewer/example-viewer.scss create mode 100644 src/app/main/content/components/angular-material/example-viewer/example-viewer.ts create mode 100644 src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.css create mode 100644 src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.html create mode 100644 src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.ts create mode 100644 src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.css create mode 100644 src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.html create mode 100644 src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.ts create mode 100644 src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.css create mode 100644 src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.html create mode 100644 src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.ts create mode 100644 src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.css create mode 100644 src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.html create mode 100644 src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.ts create mode 100644 src/assets/angular-material-examples/button-overview/button-overview-example.css create mode 100644 src/assets/angular-material-examples/button-overview/button-overview-example.html create mode 100644 src/assets/angular-material-examples/button-overview/button-overview-example.ts create mode 100644 src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.css create mode 100644 src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.html create mode 100644 src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.ts create mode 100644 src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.css create mode 100644 src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.html create mode 100644 src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.ts create mode 100644 src/assets/angular-material-examples/button-types/button-types-example.css create mode 100644 src/assets/angular-material-examples/button-types/button-types-example.html create mode 100644 src/assets/angular-material-examples/button-types/button-types-example.ts create mode 100644 src/assets/angular-material-examples/card-fancy/card-fancy-example.css create mode 100644 src/assets/angular-material-examples/card-fancy/card-fancy-example.html create mode 100644 src/assets/angular-material-examples/card-fancy/card-fancy-example.ts create mode 100644 src/assets/angular-material-examples/card-overview/card-overview-example.css create mode 100644 src/assets/angular-material-examples/card-overview/card-overview-example.html create mode 100644 src/assets/angular-material-examples/card-overview/card-overview-example.ts create mode 100644 src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.css create mode 100644 src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.html create mode 100644 src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.ts create mode 100644 src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.css create mode 100644 src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.html create mode 100644 src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.ts create mode 100644 src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.css create mode 100644 src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.html create mode 100644 src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.ts create mode 100644 src/assets/angular-material-examples/chips-input/chips-input-example.css create mode 100644 src/assets/angular-material-examples/chips-input/chips-input-example.html create mode 100644 src/assets/angular-material-examples/chips-input/chips-input-example.ts create mode 100644 src/assets/angular-material-examples/chips-overview/chips-overview-example.css create mode 100644 src/assets/angular-material-examples/chips-overview/chips-overview-example.html create mode 100644 src/assets/angular-material-examples/chips-overview/chips-overview-example.ts create mode 100644 src/assets/angular-material-examples/chips-stacked/chips-stacked-example.css create mode 100644 src/assets/angular-material-examples/chips-stacked/chips-stacked-example.html create mode 100644 src/assets/angular-material-examples/chips-stacked/chips-stacked-example.ts create mode 100644 src/assets/angular-material-examples/datepicker-api/datepicker-api-example.css create mode 100644 src/assets/angular-material-examples/datepicker-api/datepicker-api-example.html create mode 100644 src/assets/angular-material-examples/datepicker-api/datepicker-api-example.ts create mode 100644 src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.css create mode 100644 src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.html create mode 100644 src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.ts create mode 100644 src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.css create mode 100644 src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.html create mode 100644 src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.ts create mode 100644 src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.css create mode 100644 src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.html create mode 100644 src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.ts create mode 100644 src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.css create mode 100644 src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.html create mode 100644 src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.ts create mode 100644 src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.css create mode 100644 src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.html create mode 100644 src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.ts create mode 100644 src/assets/angular-material-examples/dialog-content/dialog-content-example-dialog.html create mode 100644 src/assets/angular-material-examples/dialog-content/dialog-content-example.css create mode 100644 src/assets/angular-material-examples/dialog-content/dialog-content-example.html create mode 100644 src/assets/angular-material-examples/dialog-content/dialog-content-example.ts create mode 100644 src/assets/angular-material-examples/dialog-data/dialog-data-example-dialog.html create mode 100644 src/assets/angular-material-examples/dialog-data/dialog-data-example.css create mode 100644 src/assets/angular-material-examples/dialog-data/dialog-data-example.html create mode 100644 src/assets/angular-material-examples/dialog-data/dialog-data-example.ts create mode 100644 src/assets/angular-material-examples/dialog-elements/dialog-elements-example-dialog.html create mode 100644 src/assets/angular-material-examples/dialog-elements/dialog-elements-example.css create mode 100644 src/assets/angular-material-examples/dialog-elements/dialog-elements-example.html create mode 100644 src/assets/angular-material-examples/dialog-elements/dialog-elements-example.ts create mode 100644 src/assets/angular-material-examples/dialog-overview/dialog-overview-example-dialog.html create mode 100644 src/assets/angular-material-examples/dialog-overview/dialog-overview-example.css create mode 100644 src/assets/angular-material-examples/dialog-overview/dialog-overview-example.html create mode 100644 src/assets/angular-material-examples/dialog-overview/dialog-overview-example.ts create mode 100644 src/assets/angular-material-examples/expansion-overview/expansion-overview-example.css create mode 100644 src/assets/angular-material-examples/expansion-overview/expansion-overview-example.html create mode 100644 src/assets/angular-material-examples/expansion-overview/expansion-overview-example.ts create mode 100644 src/assets/angular-material-examples/expansion-steps/expansion-steps-example.css create mode 100644 src/assets/angular-material-examples/expansion-steps/expansion-steps-example.html create mode 100644 src/assets/angular-material-examples/expansion-steps/expansion-steps-example.ts create mode 100644 src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.css create mode 100644 src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.html create mode 100644 src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.ts create mode 100644 src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.css create mode 100644 src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.html create mode 100644 src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.ts create mode 100644 src/assets/angular-material-examples/icon-overview/icon-overview-example.css create mode 100644 src/assets/angular-material-examples/icon-overview/icon-overview-example.html create mode 100644 src/assets/angular-material-examples/icon-overview/icon-overview-example.ts create mode 100644 src/assets/angular-material-examples/icon-svg/icon-svg-example.css create mode 100644 src/assets/angular-material-examples/icon-svg/icon-svg-example.html create mode 100644 src/assets/angular-material-examples/icon-svg/icon-svg-example.ts create mode 100644 src/assets/angular-material-examples/input-clearable/input-clearable-example.css create mode 100644 src/assets/angular-material-examples/input-clearable/input-clearable-example.html create mode 100644 src/assets/angular-material-examples/input-clearable/input-clearable-example.ts create mode 100644 src/assets/angular-material-examples/input-errors/input-errors-example.css create mode 100644 src/assets/angular-material-examples/input-errors/input-errors-example.html create mode 100644 src/assets/angular-material-examples/input-errors/input-errors-example.ts create mode 100644 src/assets/angular-material-examples/input-form/input-form-example.css create mode 100644 src/assets/angular-material-examples/input-form/input-form-example.html create mode 100644 src/assets/angular-material-examples/input-form/input-form-example.ts create mode 100644 src/assets/angular-material-examples/input-hint/input-hint-example.css create mode 100644 src/assets/angular-material-examples/input-hint/input-hint-example.html create mode 100644 src/assets/angular-material-examples/input-hint/input-hint-example.ts create mode 100644 src/assets/angular-material-examples/input-overview/input-overview-example.css create mode 100644 src/assets/angular-material-examples/input-overview/input-overview-example.html create mode 100644 src/assets/angular-material-examples/input-overview/input-overview-example.ts create mode 100644 src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.css create mode 100644 src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.html create mode 100644 src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.ts create mode 100644 src/assets/angular-material-examples/list-overview/list-overview-example.css create mode 100644 src/assets/angular-material-examples/list-overview/list-overview-example.html create mode 100644 src/assets/angular-material-examples/list-overview/list-overview-example.ts create mode 100644 src/assets/angular-material-examples/list-sections/list-sections-example.css create mode 100644 src/assets/angular-material-examples/list-sections/list-sections-example.html create mode 100644 src/assets/angular-material-examples/list-sections/list-sections-example.ts create mode 100644 src/assets/angular-material-examples/list-selection/list-selection-example.css create mode 100644 src/assets/angular-material-examples/list-selection/list-selection-example.html create mode 100644 src/assets/angular-material-examples/list-selection/list-selection-example.ts create mode 100644 src/assets/angular-material-examples/menu-icons/menu-icons-example.css create mode 100644 src/assets/angular-material-examples/menu-icons/menu-icons-example.html create mode 100644 src/assets/angular-material-examples/menu-icons/menu-icons-example.ts create mode 100644 src/assets/angular-material-examples/menu-overview/menu-overview-example.css create mode 100644 src/assets/angular-material-examples/menu-overview/menu-overview-example.html create mode 100644 src/assets/angular-material-examples/menu-overview/menu-overview-example.ts create mode 100644 src/assets/angular-material-examples/nested-menu/nested-menu-example.css create mode 100644 src/assets/angular-material-examples/nested-menu/nested-menu-example.html create mode 100644 src/assets/angular-material-examples/nested-menu/nested-menu-example.ts create mode 100644 src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.css create mode 100644 src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.html create mode 100644 src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.ts create mode 100644 src/assets/angular-material-examples/paginator-overview/paginator-overview-example.css create mode 100644 src/assets/angular-material-examples/paginator-overview/paginator-overview-example.html create mode 100644 src/assets/angular-material-examples/paginator-overview/paginator-overview-example.ts create mode 100644 src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.css create mode 100644 src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.html create mode 100644 src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.ts create mode 100644 src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.css create mode 100644 src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.html create mode 100644 src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.ts create mode 100644 src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.css create mode 100644 src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.html create mode 100644 src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.ts create mode 100644 src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.css create mode 100644 src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.html create mode 100644 src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.ts create mode 100644 src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.css create mode 100644 src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.html create mode 100644 src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.ts create mode 100644 src/assets/angular-material-examples/radio-overview/radio-overview-example.css create mode 100644 src/assets/angular-material-examples/radio-overview/radio-overview-example.html create mode 100644 src/assets/angular-material-examples/radio-overview/radio-overview-example.ts create mode 100644 src/assets/angular-material-examples/select-form/select-form-example.css create mode 100644 src/assets/angular-material-examples/select-form/select-form-example.html create mode 100644 src/assets/angular-material-examples/select-form/select-form-example.ts create mode 100644 src/assets/angular-material-examples/select-overview/select-overview-example.css create mode 100644 src/assets/angular-material-examples/select-overview/select-overview-example.html create mode 100644 src/assets/angular-material-examples/select-overview/select-overview-example.ts create mode 100644 src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.css create mode 100644 src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.html create mode 100644 src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.ts create mode 100644 src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.css create mode 100644 src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.html create mode 100644 src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.ts create mode 100644 src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.css create mode 100644 src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.html create mode 100644 src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.ts create mode 100644 src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.css create mode 100644 src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.html create mode 100644 src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.ts create mode 100644 src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.css create mode 100644 src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.html create mode 100644 src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.ts create mode 100644 src/assets/angular-material-examples/slider-configurable/slider-configurable-example.css create mode 100644 src/assets/angular-material-examples/slider-configurable/slider-configurable-example.html create mode 100644 src/assets/angular-material-examples/slider-configurable/slider-configurable-example.ts create mode 100644 src/assets/angular-material-examples/slider-overview/slider-overview-example.css create mode 100644 src/assets/angular-material-examples/slider-overview/slider-overview-example.html create mode 100644 src/assets/angular-material-examples/slider-overview/slider-overview-example.ts create mode 100644 src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example-snack.css create mode 100644 src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example-snack.html create mode 100644 src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example.html create mode 100644 src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example.ts create mode 100644 src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.css create mode 100644 src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.html create mode 100644 src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.ts create mode 100644 src/assets/angular-material-examples/sort-overview/sort-overview-example.css create mode 100644 src/assets/angular-material-examples/sort-overview/sort-overview-example.html create mode 100644 src/assets/angular-material-examples/sort-overview/sort-overview-example.ts create mode 100644 src/assets/angular-material-examples/stepper-overview/stepper-overview-example.css create mode 100644 src/assets/angular-material-examples/stepper-overview/stepper-overview-example.html create mode 100644 src/assets/angular-material-examples/stepper-overview/stepper-overview-example.ts create mode 100644 src/assets/angular-material-examples/table-basic/table-basic-example.css create mode 100644 src/assets/angular-material-examples/table-basic/table-basic-example.html create mode 100644 src/assets/angular-material-examples/table-basic/table-basic-example.ts create mode 100644 src/assets/angular-material-examples/table-filtering/table-filtering-example.css create mode 100644 src/assets/angular-material-examples/table-filtering/table-filtering-example.html create mode 100644 src/assets/angular-material-examples/table-filtering/table-filtering-example.ts create mode 100644 src/assets/angular-material-examples/table-http/table-http-example.css create mode 100644 src/assets/angular-material-examples/table-http/table-http-example.html create mode 100644 src/assets/angular-material-examples/table-http/table-http-example.ts create mode 100644 src/assets/angular-material-examples/table-overview/table-overview-example.css create mode 100644 src/assets/angular-material-examples/table-overview/table-overview-example.html create mode 100644 src/assets/angular-material-examples/table-overview/table-overview-example.ts create mode 100644 src/assets/angular-material-examples/table-pagination/table-pagination-example.css create mode 100644 src/assets/angular-material-examples/table-pagination/table-pagination-example.html create mode 100644 src/assets/angular-material-examples/table-pagination/table-pagination-example.ts create mode 100644 src/assets/angular-material-examples/table-sorting/table-sorting-example.css create mode 100644 src/assets/angular-material-examples/table-sorting/table-sorting-example.html create mode 100644 src/assets/angular-material-examples/table-sorting/table-sorting-example.ts create mode 100644 src/assets/angular-material-examples/tabs-overview/tabs-overview-example.css create mode 100644 src/assets/angular-material-examples/tabs-overview/tabs-overview-example.html create mode 100644 src/assets/angular-material-examples/tabs-overview/tabs-overview-example.ts create mode 100644 src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.css create mode 100644 src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.html create mode 100644 src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.ts create mode 100644 src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.css create mode 100644 src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.html create mode 100644 src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.ts create mode 100644 src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.css create mode 100644 src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.html create mode 100644 src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.ts create mode 100644 src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.css create mode 100644 src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.html create mode 100644 src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.ts create mode 100644 src/assets/angular-material-examples/tooltip-position/tooltip-position-example.css create mode 100644 src/assets/angular-material-examples/tooltip-position/tooltip-position-example.html create mode 100644 src/assets/angular-material-examples/tooltip-position/tooltip-position-example.ts create mode 100644 src/assets/images/examples/shiba1.jpg create mode 100644 src/assets/images/examples/shiba2.jpg create mode 100644 src/assets/images/examples/thumbup-icon.svg create mode 100644 src/assets/test.html diff --git a/.angular-cli.json b/.angular-cli.json index 8e74396f..6abee645 100644 --- a/.angular-cli.json +++ b/.angular-cli.json @@ -9,6 +9,7 @@ "outDir": "dist", "assets": [ "assets", + "app/main/content/components/angular-material", "favicon.ico" ], "index": "index.html", diff --git a/package-lock.json b/package-lock.json index f863b5a9..b2008473 100644 --- a/package-lock.json +++ b/package-lock.json @@ -446,15 +446,24 @@ "integrity": "sha1-etcMMQmUsPmA9A04Lc5ZlG/jDc8=" }, "angular-in-memory-web-api": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/angular-in-memory-web-api/-/angular-in-memory-web-api-0.3.2.tgz", - "integrity": "sha1-iDbZ4lNNN7co88taHK9v4ef7vs0=" + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/angular-in-memory-web-api/-/angular-in-memory-web-api-0.4.6.tgz", + "integrity": "sha1-EB9Zo4XrFTnH+TB1uv0MHLd061g=" }, "angular-resizable-element": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/angular-resizable-element/-/angular-resizable-element-1.2.0.tgz", "integrity": "sha512-i5xCl4n2VMgGK4gY6Jtho0K5aazbsqNw1bmPYpI9RwlKK+dIOcsMRuMl1JPWzrznHsm4qEsfYg+9KLkYsYy+/g==" }, + "angular2-markdown": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/angular2-markdown/-/angular2-markdown-1.6.0.tgz", + "integrity": "sha1-hja/narXD8NWMxJnB/+zPmhPurE=", + "requires": { + "marked": "0.3.6", + "prismjs": "1.8.1" + } + }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -1349,6 +1358,17 @@ "source-map": "0.5.6" } }, + "clipboard": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-1.7.1.tgz", + "integrity": "sha1-Ng1taUbpmnof7zleQrqStem1oWs=", + "optional": true, + "requires": { + "good-listener": "1.2.2", + "select": "1.1.2", + "tiny-emitter": "2.0.2" + } + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -2351,6 +2371,12 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "delegate": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.1.3.tgz", + "integrity": "sha1-moJRp3fXAl+qVXN7w7BxdCEnqf0=", + "optional": true + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -3469,6 +3495,15 @@ "minimatch": "3.0.4" } }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "optional": true, + "requires": { + "delegate": "3.1.3" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -5060,6 +5095,11 @@ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, + "marked": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", + "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=" + }, "math-expression-evaluator": { "version": "1.2.17", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", @@ -6564,6 +6604,14 @@ "utila": "0.4.0" } }, + "prismjs": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.8.1.tgz", + "integrity": "sha1-vQzcMumlYcHIw8lzN2Wn8ew7VO4=", + "requires": { + "clipboard": "1.7.1" + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -7227,6 +7275,12 @@ } } }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "optional": true + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -8052,6 +8106,12 @@ "setimmediate": "1.0.5" } }, + "tiny-emitter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", + "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==", + "optional": true + }, "tmp": { "version": "0.0.31", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", diff --git a/package.json b/package.json index 6ed77a6a..03720323 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,8 @@ "@swimlane/ngx-datatable": "9.3.1", "@swimlane/ngx-dnd": "3.0.0", "angular-calendar": "0.19.0", - "angular-in-memory-web-api": "0.3.2", + "angular-in-memory-web-api": "0.4.6", + "angular2-markdown": "1.6.0", "classlist.js": "1.1.20150312", "core-js": "2.5.0", "d3": "4.10.0", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 3a0d4fbb..ad6fbdb6 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -19,6 +19,8 @@ import { FuseConfigService } from './core/services/config.service'; import { FuseNavigationService } from './core/components/navigation/navigation.service'; import { ComponentsThirdPartyModule } from './main/content/components-third-party/components-third-party.module'; import { ServicesModule } from './main/content/services/services.module'; +import { FuseAngularMaterialModule } from './main/content/components/angular-material/angular-material.module'; +import { MarkdownModule } from 'angular2-markdown'; const appRoutes: Routes = [ { @@ -66,8 +68,12 @@ const appRoutes: Routes = [ BrowserAnimationsModule, RouterModule.forRoot(appRoutes), SharedModule, + MarkdownModule.forRoot(), - InMemoryWebApiModule.forRoot(FuseFakeDbService, {delay: 0}), + InMemoryWebApiModule.forRoot(FuseFakeDbService, { + delay : 0, + passThruUnknownUrl: true + }), FuseMainModule, @@ -77,6 +83,7 @@ const appRoutes: Routes = [ UIModule, ServicesModule, ComponentsModule, + FuseAngularMaterialModule, ComponentsThirdPartyModule ], providers : [ diff --git a/src/app/core/components/copier/copier.service.ts b/src/app/core/components/copier/copier.service.ts new file mode 100644 index 00000000..42ce0483 --- /dev/null +++ b/src/app/core/components/copier/copier.service.ts @@ -0,0 +1,60 @@ +/** + * This class is based on the code in the following projects: + * + * - https://github.com/zenorocha/select + * - https://github.com/zenorocha/clipboard.js/ + * + * Both released under MIT license - © Zeno Rocha + */ +import {Injectable} from '@angular/core'; + +@Injectable() +export class CopierService { + + private textarea: HTMLTextAreaElement; + + /** Copy the text value to the clipboard. */ + copyText(text: string): boolean { + this.createTextareaAndSelect(text); + + const copySuccessful = document.execCommand('copy'); + this.removeFake(); + + return copySuccessful; + } + + /** + * Creates a hidden textarea element, sets its value from `text` property, + * and makes a selection on it. + */ + private createTextareaAndSelect(text: string) { + // Create a fake element to hold the contents to copy + this.textarea = document.createElement('textarea'); + + // Prevent zooming on iOS + this.textarea.style.fontSize = '12pt'; + + // Hide the element + this.textarea.classList.add('cdk-visually-hidden'); + + // Move element to the same position vertically + const yPosition = window.pageYOffset || document.documentElement.scrollTop; + this.textarea.style.top = yPosition + 'px'; + + this.textarea.setAttribute('readonly', ''); + this.textarea.value = text; + + document.body.appendChild(this.textarea); + + this.textarea.select(); + this.textarea.setSelectionRange(0, this.textarea.value.length); + } + + /** Remove the text area from the DOM. */ + private removeFake() { + if (this.textarea) { + document.body.removeChild(this.textarea); + this.textarea = null; + } + } +} diff --git a/src/app/core/modules/material.module.ts b/src/app/core/modules/material.module.ts index 663fabd1..f4a3d895 100644 --- a/src/app/core/modules/material.module.ts +++ b/src/app/core/modules/material.module.ts @@ -27,6 +27,7 @@ import { MdSliderModule, MdSlideToggleModule, MdSnackBarModule, + MdStepperModule, MdSortModule, MdTableModule, MdTabsModule @@ -60,6 +61,7 @@ import { CdkTableModule } from '@angular/cdk/table'; MdSliderModule, MdSlideToggleModule, MdSnackBarModule, + MdStepperModule, MdSortModule, MdTableModule, MdTabsModule, @@ -93,6 +95,7 @@ import { CdkTableModule } from '@angular/cdk/table'; MdSliderModule, MdSlideToggleModule, MdSnackBarModule, + MdStepperModule, MdSortModule, MdTableModule, MdTabsModule, diff --git a/src/app/core/modules/shared.module.ts b/src/app/core/modules/shared.module.ts index 8e83073b..472dbfbe 100644 --- a/src/app/core/modules/shared.module.ts +++ b/src/app/core/modules/shared.module.ts @@ -21,6 +21,7 @@ import { FuseIfOnDomDirective } from '../directives/fuse-if-on-dom/fuse-if-on-do import { FuseMaterialColorPickerComponent } from '../components/material-color-picker/material-color-picker.component'; import { Md2Module } from 'md2'; import { CookieService } from 'ngx-cookie-service'; +import { MarkdownModule } from 'angular2-markdown'; @NgModule({ declarations : [ @@ -43,7 +44,8 @@ import { CookieService } from 'ngx-cookie-service'; ColorPickerModule, NgxDnDModule, NgxDatatableModule, - Md2Module + Md2Module, + MarkdownModule ], exports : [ FlexLayoutModule, @@ -62,7 +64,8 @@ import { CookieService } from 'ngx-cookie-service'; NgxDatatableModule, FuseIfOnDomDirective, FuseMaterialColorPickerComponent, - Md2Module + Md2Module, + MarkdownModule ], entryComponents: [ FuseConfirmDialogComponent diff --git a/src/app/core/scss/partials/plugins/_plugins.scss b/src/app/core/scss/partials/plugins/_plugins.scss index 6e4ef192..f9d4c979 100644 --- a/src/app/core/scss/partials/plugins/_plugins.scss +++ b/src/app/core/scss/partials/plugins/_plugins.scss @@ -1,4 +1,5 @@ @import "highlight"; +@import "prism"; @import "perfect-scrollbar"; @import "ngx-datatable"; @import "ngx-color-picker"; diff --git a/src/app/core/scss/partials/plugins/_prism.scss b/src/app/core/scss/partials/plugins/_prism.scss new file mode 100644 index 00000000..40eb6fec --- /dev/null +++ b/src/app/core/scss/partials/plugins/_prism.scss @@ -0,0 +1,269 @@ +// Edit the sixteen color-value variables, and create your own syntax highlighter colorscheme + +$base00: #263238; +$base01: #2C393F; +$base02: #37474F; +$base03: #707880; +$base04: #C9CCD3; +$base05: #CDD3DE; +$base06: #D5DBE5; +$base07: #FFFFFF; +$base08: #EC5F67; +$base09: #EA9560; +$base0A: #FFCC00; +$base0B: #8BD649; +$base0C: #80CBC4; +$base0D: #89DDFF; +$base0E: #82AAFF; +$base0F: #EC5F67; + +$red: $base08; +$orange: $base09; +$yellow: $base0A; +$green: $base0B; +$cyan: $base0C; +$blue: $base0D; +$violet: $base0E; +$magenta: $base0F; + +$code-font-family: Consolas, Menlo, Monaco, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", Courier, monospace; +$code-font-size: 14px; +$code-line-height: 1.6; +$code-background: $base00; +$code-color: $base05; +$code-color-fade: $base05; +// $code-text-shadow: none; +$code-color-comment: $base02; +$code-color-keyword: $base0B; +$code-color-value: $base0C; +$code-color-attr-name: $base09; +$code-color-string: $base0C; +$code-color-name: $base0A; +$code-color-number: $base09; +$code-color-variable: $base0D; +$code-color-selector: $base0E; +$code-color-property: $base0A; +$code-color-important: $base08; +$code-color-tag: $base0D; +$code-color-atrule: $base0C; + +// @import "../partials/prism"; +/** + * Prism base code highlighter theme using Sass + * + * @author @MoOx + * https://github.com/MoOx/sass-prism-theme-base/blob/master/_prism.scss + * slightly adapted by me, Bram de Haan + */ + +// prism selector +$code-selector: "code[class*=\"language-\"], pre[class*=\"language-\"]"; +$code-selector-block: "pre[class*=\"language-\"]"; +$code-selector-inline: ":not(pre) > code[class*=\"language-\"]"; + +// generic stuff +$code-font-family: Menlo, Monaco, "Courier New", monospace !default; +$code-font-size: 14px !default; +$code-line-height: 1.6 !default; + +$code-tab-size: 4 !default; +$code-hyphens: none !default; + +$code-block-padding: 12px !default; +$code-inline-padding: 2px 6px !default; +$code-border-radius: 0 !default; + +$code-border: none !default; +$code-background: #2A2A2A !default; +$code-color: #FFF !default; +$code-color-fade: #BEBEC5 !default; +// $code-text-shadow: 0 1px 0 #000 !default; +$code-box-shadow: none !default; +$code-color-property: #B58900 !default; +$code-color-important: #CB4B16 !default; +$code-color-tag: #268BD2 !default; +$code-color-atrule: #2AA198 !default; +$code-color-attr-name: #B65611 !default; + +// $code-linenums-padding: 7px !default; +// $code-linenums-width: 40px !default; +// $code-linenums-background: #444 !default; +// $code-linenums-border-color: #555 !default; +// $code-linenums-border-width: 1px !default; + +@if $code-selector != null { + #{$code-selector} { + -moz-tab-size: $code-tab-size; + -o-tab-size: $code-tab-size; + tab-size: $code-tab-size; + + -webkit-hyphens: $code-hyphens; + -moz-hyphens: $code-hyphens; + -ms-hyphens: $code-hyphens; + hyphens: $code-hyphens; + + // whitespace management + white-space: pre; // fallback + white-space: pre-wrap; + word-break: break-all; + word-wrap: break-word; + + font-family: $code-font-family; + font-size: $code-font-size; + line-height: $code-line-height; + + color: $code-color; + // text-shadow: $code-text-shadow; + background: $code-background; + } +} + +%code-background { + border-radius: $code-border-radius; + border: $code-border; + box-shadow: $code-box-shadow; +} + +@if $code-selector-block != null { + #{$code-selector-block} { + @extend %code-background; + padding: $code-block-padding; + } +} + +@if $code-selector-inline != null { + #{$code-selector-inline} { + @extend %code-background; + padding: $code-inline-padding; + } +} + +// pre[class*="language-"], +// :not(pre) > code[class*="language-"] { +// background: $code-background; +// } + +// prism tokens +// +$code-color-comment: null !default; +$code-color-keyword: null !default; +$code-color-value: null !default; +$code-color-string: null !default; +$code-color-name: null !default; +$code-color-number: null !default; +$code-color-variable: null !default; +$code-color-selector: null !default; +$code-color-punctuation: $code-color-fade !default; + +#{$code-selector} { + .namespace { + opacity: .7; + } + + .token { + &.comment, + &.prolog, + &.doctype, + &.cdata { + color: $code-color-comment; + } + + &.null, + &.operator, + &.boolean, + &.number { + color: $code-color-number; + } + + &.string { + color: $code-color-string; + } + &.attr-name { + color: $code-color-attr-name; + } + + &.entity, + &.url, + .language-css &.string, + .style &.string { + color: $code-color-string; + } + + &.selector { + color: $code-color-selector; + } + + &.attr-value, + &.keyword, + &.control, + &.directive, + &.unit { + color: $code-color-keyword; + } + &.important { + color: $code-color-important; + } + &.atrule { + color: $code-color-atrule; + } + + &.regex, + &.statement { + color: $code-color-value; + } + + &.placeholder, + &.variable { + color: $code-color-variable; + } + + &.property, + &.tag { + // font-style: italic; + } + + &.property { + color: $code-color-property; + } + &.tag { + color: $code-color-tag; + } + + &.important, + &.statement { + font-weight: bold; + } + + // todo ? + // &.mixin + // &.gradient + // &.abslength + // &.easing + // &.time + // &.angle + // &.fontfamily + + // ruby/vim https://github.com/LeaVerou/prism/pull/18 + // &.inst-var + // &.builtin + // &.const + // &.symbol + // + // php https://github.com/LeaVerou/prism/pull/20 + // &.deliminator + // &.function + + &.punctuation { + color: $code-color-punctuation; + } + + &.entity { + cursor: help; + } + + // for dev :) + &.debug { + color: red + } + } +} \ No newline at end of file diff --git a/src/app/main/content/apps/calendar/calendar.service.ts b/src/app/main/content/apps/calendar/calendar.service.ts index 6774fb45..1a9ae423 100644 --- a/src/app/main/content/apps/calendar/calendar.service.ts +++ b/src/app/main/content/apps/calendar/calendar.service.ts @@ -1,8 +1,8 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; import { Subject } from 'rxjs/Subject'; +import { HttpClient } from '@angular/common/http'; @Injectable() export class CalendarService implements Resolve @@ -10,7 +10,7 @@ export class CalendarService implements Resolve events: any; onEventsUpdated = new Subject(); - constructor(private http: Http) + constructor(private http: HttpClient) { } @@ -34,8 +34,8 @@ export class CalendarService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/calendar/events') - .subscribe(response => { - this.events = response.json().data.data; + .subscribe((response: any) => { + this.events = response.data.data; this.onEventsUpdated.next(this.events); resolve(this.events); }, reject); @@ -49,7 +49,7 @@ export class CalendarService implements Resolve id : 'events', data: [...events] }) - .subscribe(response => { + .subscribe((response: any) => { this.getEvents(); }, reject); }); diff --git a/src/app/main/content/apps/chat/chat.service.ts b/src/app/main/content/apps/chat/chat.service.ts index e06d4eaa..3337b080 100644 --- a/src/app/main/content/apps/chat/chat.service.ts +++ b/src/app/main/content/apps/chat/chat.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { Subject } from 'rxjs/Subject'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { FuseUtils } from '../../../../core/fuseUtils'; @@ -19,7 +19,7 @@ export class ChatService implements Resolve onLeftSidenavViewChanged = new Subject(); onRightSidenavViewChanged = new Subject(); - constructor(private http: Http) + constructor(private http: HttpClient) { } @@ -47,8 +47,8 @@ export class ChatService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/chat-chats/' + chatItem.id) - .subscribe(response => { - const chat = response.json().data; + .subscribe((response: any) => { + const chat = response.data; const chatContact = this.contacts.find((contact) => { return contact.id === contactId; @@ -105,7 +105,7 @@ export class ChatService implements Resolve * Post the created chat */ this.http.post('api/chat-chats', {...chat}) - .subscribe(response => { + .subscribe((response: any) => { /** * Post the new the user data @@ -150,7 +150,7 @@ export class ChatService implements Resolve updateUserData(userData) { this.http.post('api/chat-user/' + this.user.id, userData) - .subscribe(response => { + .subscribe((response: any) => { this.user = userData; } ); @@ -211,8 +211,8 @@ export class ChatService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/chat-contacts') - .subscribe(response => { - resolve(response.json().data); + .subscribe((response: any) => { + resolve(response.data); }, reject); }); } @@ -225,8 +225,8 @@ export class ChatService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/chat-chats') - .subscribe(response => { - resolve(response.json().data); + .subscribe((response: any) => { + resolve(response.data); }, reject); }); } @@ -239,8 +239,8 @@ export class ChatService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/chat-user') - .subscribe(response => { - resolve(response.json().data[0]); + .subscribe((response: any) => { + resolve(response.data[0]); }, reject); }); } diff --git a/src/app/main/content/apps/contacts/contacts.service.ts b/src/app/main/content/apps/contacts/contacts.service.ts index 925b05e8..7774f65a 100644 --- a/src/app/main/content/apps/contacts/contacts.service.ts +++ b/src/app/main/content/apps/contacts/contacts.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { Contact } from './contact.model'; import { FuseUtils } from '../../../../core/fuseUtils'; @@ -23,7 +23,7 @@ export class ContactsService implements Resolve searchText: string; filterBy: string; - constructor(private http: Http) + constructor(private http: HttpClient) { } @@ -65,9 +65,9 @@ export class ContactsService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/contacts-contacts') - .subscribe(response => { + .subscribe((response: any) => { - this.contacts = response.json().data; + this.contacts = response.data; if ( this.filterBy === 'starred' ) { @@ -103,8 +103,8 @@ export class ContactsService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/contacts-user/5725a6802d10e277a0f35724') - .subscribe(response => { - this.user = response.json().data; + .subscribe((response: any) => { + this.user = response.data; this.onUserDataChanged.next(this.user); resolve(this.user); }, reject); diff --git a/src/app/main/content/apps/dashboards/project/projects.service.ts b/src/app/main/content/apps/dashboards/project/projects.service.ts index f267d028..1b103613 100644 --- a/src/app/main/content/apps/dashboards/project/projects.service.ts +++ b/src/app/main/content/apps/dashboards/project/projects.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; @Injectable() export class ProjectsDashboardService implements Resolve @@ -10,7 +10,7 @@ export class ProjectsDashboardService implements Resolve widgets: any[]; constructor( - private http: Http + private http: HttpClient ) { } @@ -42,9 +42,9 @@ export class ProjectsDashboardService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/projects-dashboard-projects') - .subscribe(response => { - this.projects = response.json().data; - resolve(response.json().data); + .subscribe((response: any) => { + this.projects = response.data; + resolve(response.data); }, reject); }); } @@ -53,9 +53,9 @@ export class ProjectsDashboardService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/projects-dashboard-widgets') - .subscribe(response => { - this.widgets = response.json().data; - resolve(response.json().data); + .subscribe((response: any) => { + this.widgets = response.data; + resolve(response.data); }, reject); }); } diff --git a/src/app/main/content/apps/file-manager/file-manager.service.ts b/src/app/main/content/apps/file-manager/file-manager.service.ts index d2a72364..82e33c53 100644 --- a/src/app/main/content/apps/file-manager/file-manager.service.ts +++ b/src/app/main/content/apps/file-manager/file-manager.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; @Injectable() @@ -10,7 +10,7 @@ export class FileManagerService implements Resolve onFilesChanged: BehaviorSubject = new BehaviorSubject({}); onFileSelected: BehaviorSubject = new BehaviorSubject({}); - constructor(private http: Http) + constructor(private http: HttpClient) { } @@ -40,10 +40,10 @@ export class FileManagerService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/file-manager') - .subscribe(response => { - this.onFilesChanged.next(response.json().data); - this.onFileSelected.next(response.json().data[0]); - resolve(response.json().data); + .subscribe((response: any) => { + this.onFilesChanged.next(response.data); + this.onFileSelected.next(response.data[0]); + resolve(response.data); }, reject); }); } diff --git a/src/app/main/content/apps/mail/mail.service.ts b/src/app/main/content/apps/mail/mail.service.ts index d789da52..95d793cd 100644 --- a/src/app/main/content/apps/mail/mail.service.ts +++ b/src/app/main/content/apps/mail/mail.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { Mail } from './mail.model'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { FuseUtils } from 'app/core/fuseUtils'; @@ -28,7 +28,7 @@ export class MailService implements Resolve onLabelsChanged: BehaviorSubject = new BehaviorSubject([]); onSearchTextChanged: BehaviorSubject = new BehaviorSubject(''); - constructor(private http: Http) + constructor(private http: HttpClient) { this.selectedMails = []; } @@ -88,8 +88,8 @@ export class MailService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/mail-folders') - .subscribe(response => { - this.folders = response.json().data; + .subscribe((response: any) => { + this.folders = response.data; this.onFoldersChanged.next(this.folders); resolve(this.folders); }, reject); @@ -104,8 +104,8 @@ export class MailService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/mail-filters') - .subscribe(response => { - this.filters = response.json().data; + .subscribe((response: any) => { + this.filters = response.data; this.onFiltersChanged.next(this.filters); resolve(this.filters); }, reject); @@ -120,8 +120,8 @@ export class MailService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/mail-labels') - .subscribe(response => { - this.labels = response.json().data; + .subscribe((response: any) => { + this.labels = response.data; this.onLabelsChanged.next(this.labels); resolve(this.labels); }, reject); @@ -157,14 +157,14 @@ export class MailService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/mail-folders?handle=' + handle) - .subscribe(folders => { + .subscribe((folders: any) => { - const folderId = folders.json().data[0].id; + const folderId = folders.data[0].id; this.http.get('api/mail-mails?folder=' + folderId) - .subscribe(mails => { + .subscribe((mails: any) => { - this.mails = mails.json().data.map(mail => { + this.mails = mails.data.map(mail => { return new Mail(mail); }); @@ -189,9 +189,9 @@ export class MailService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/mail-mails?' + handle + '=true') - .subscribe(mails => { + .subscribe((mails: any) => { - this.mails = mails.json().data.map(mail => { + this.mails = mails.data.map(mail => { return new Mail(mail); }); @@ -214,14 +214,14 @@ export class MailService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/mail-labels?handle=' + handle) - .subscribe(labels => { + .subscribe((labels: any) => { - const labelId = labels.json().data[0].id; + const labelId = labels.data[0].id; this.http.get('api/mail-mails?labels=' + labelId) - .subscribe(mails => { + .subscribe((mails: any) => { - this.mails = mails.json().data.map(mail => { + this.mails = mails.data.map(mail => { return new Mail(mail); }); diff --git a/src/app/main/content/apps/scrumboard/scrumboard.service.ts b/src/app/main/content/apps/scrumboard/scrumboard.service.ts index f26c3e9e..b4221bab 100644 --- a/src/app/main/content/apps/scrumboard/scrumboard.service.ts +++ b/src/app/main/content/apps/scrumboard/scrumboard.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; @Injectable() @@ -14,7 +14,7 @@ export class ScrumboardService implements Resolve onBoardsChanged: BehaviorSubject = new BehaviorSubject([]); onBoardChanged: BehaviorSubject = new BehaviorSubject([]); - constructor(private http: Http) + constructor(private http: HttpClient) { } @@ -44,8 +44,8 @@ export class ScrumboardService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/scrumboard-boards') - .subscribe(response => { - this.boards = response.json().data; + .subscribe((response: any) => { + this.boards = response.data; this.onBoardsChanged.next(this.boards); resolve(this.boards); }, reject); @@ -56,8 +56,8 @@ export class ScrumboardService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/scrumboard-boards/' + boardId) - .subscribe(response => { - this.board = response.json().data; + .subscribe((response: any) => { + this.board = response.data; this.onBoardChanged.next(this.board); resolve(this.board); }, reject); diff --git a/src/app/main/content/apps/todo/todo.service.ts b/src/app/main/content/apps/todo/todo.service.ts index bae4a873..087c7211 100644 --- a/src/app/main/content/apps/todo/todo.service.ts +++ b/src/app/main/content/apps/todo/todo.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { Todo } from './todo.model'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { FuseUtils } from '../../../../core/fuseUtils'; @@ -30,7 +30,7 @@ export class TodoService implements Resolve onNewTodoClicked: Subject = new Subject(); constructor( - private http: Http, + private http: HttpClient, private location: Location // Set current todo ) { @@ -91,8 +91,8 @@ export class TodoService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/todo-filters') - .subscribe(response => { - this.filters = response.json().data; + .subscribe((response: any) => { + this.filters = response.data; this.onFiltersChanged.next(this.filters); resolve(this.filters); }, reject); @@ -107,8 +107,8 @@ export class TodoService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/todo-tags') - .subscribe(response => { - this.tags = response.json().data; + .subscribe((response: any) => { + this.tags = response.data; this.onTagsChanged.next(this.tags); resolve(this.tags); }, reject); @@ -144,8 +144,8 @@ export class TodoService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/todo-todos') - .subscribe(todos => { - this.todos = todos.json().data.map(todo => { + .subscribe((todos: any) => { + this.todos = todos.data.map(todo => { return new Todo(todo); }); @@ -176,9 +176,9 @@ export class TodoService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/todo-todos?' + param) - .subscribe(todos => { + .subscribe((todos: any) => { - this.todos = todos.json().data.map(todo => { + this.todos = todos.data.map(todo => { return new Todo(todo); }); @@ -201,14 +201,14 @@ export class TodoService implements Resolve { return new Promise((resolve, reject) => { this.http.get('api/todo-tags?handle=' + handle) - .subscribe(tags => { + .subscribe((tags: any) => { - const tagId = tags.json().data[0].id; + const tagId = tags.data[0].id; this.http.get('api/todo-todos?tags=' + tagId) - .subscribe(todos => { + .subscribe((todos: any) => { - this.todos = todos.json().data.map(todo => { + this.todos = todos.data.map(todo => { return new Todo(todo); }); diff --git a/src/app/main/content/components-third-party/datatable/ngx-datatable.component.ts b/src/app/main/content/components-third-party/datatable/ngx-datatable.component.ts index 1de22a63..5dd80a29 100644 --- a/src/app/main/content/components-third-party/datatable/ngx-datatable.component.ts +++ b/src/app/main/content/components-third-party/datatable/ngx-datatable.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; @Component({ selector : 'fuse-ngx-datatable', @@ -12,7 +12,7 @@ export class FuseNgxDatatableComponent implements OnInit loadingIndicator = true; reorderable = true; - constructor(private http: Http) + constructor(private http: HttpClient) { } @@ -20,8 +20,8 @@ export class FuseNgxDatatableComponent implements OnInit ngOnInit() { this.http.get('api/contacts-contacts') - .subscribe(contacts => { - this.rows = contacts.json().data; + .subscribe((contacts: any) => { + this.rows = contacts.data; this.loadingIndicator = false; }); } diff --git a/src/app/main/content/components/angular-material/angular-material.component.html b/src/app/main/content/components/angular-material/angular-material.component.html new file mode 100644 index 00000000..53eac738 --- /dev/null +++ b/src/app/main/content/components/angular-material/angular-material.component.html @@ -0,0 +1,31 @@ +
+ + +
+ +
+
+ home + chevron_right + Components + chevron_right + Angular Material Elements +
+
{{title}}
+
+ + + link + Reference + +
+ + + +
+
+ +
+
+
+ diff --git a/src/app/main/content/components/angular-material/angular-material.component.scss b/src/app/main/content/components/angular-material/angular-material.component.scss new file mode 100644 index 00000000..9e33d642 --- /dev/null +++ b/src/app/main/content/components/angular-material/angular-material.component.scss @@ -0,0 +1,9 @@ +:host { + + .angular-material-element { + + > .content { + max-width: 940px; + } + } +} \ No newline at end of file diff --git a/src/app/main/content/components/angular-material/angular-material.component.ts b/src/app/main/content/components/angular-material/angular-material.component.ts new file mode 100644 index 00000000..ebf277ba --- /dev/null +++ b/src/app/main/content/components/angular-material/angular-material.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { COMPONENT_MAP } from './example-components'; + +@Component({ + selector : 'fuse-angular-material', + templateUrl: './angular-material.component.html', + styleUrls : ['./angular-material.component.scss'] +}) +export class FuseAngularMaterialComponent implements OnInit +{ + id: string; + title: string; + examples: any; + + constructor( + private route: ActivatedRoute + ) + { + } + + ngOnInit() + { + this.route.params.subscribe(params => { + this.id = params['id']; + const _title = this.id.replace('-', ' '); + this.title = _title.charAt(0).toUpperCase() + _title.substring(1); + this.examples = COMPONENT_MAP[this.id]; + }); + } +} + diff --git a/src/app/main/content/components/angular-material/angular-material.module.ts b/src/app/main/content/components/angular-material/angular-material.module.ts new file mode 100644 index 00000000..ae4ee2c1 --- /dev/null +++ b/src/app/main/content/components/angular-material/angular-material.module.ts @@ -0,0 +1,40 @@ +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { SharedModule } from '../../../../core/modules/shared.module'; +import { FuseWidgetModule } from '../../../../core/components/widget/widget.module'; +import { FuseAngularMaterialComponent } from 'app/main/content/components/angular-material/angular-material.component'; +import { FuseExampleViewerComponent } from './example-viewer/example-viewer'; +import { EXAMPLE_LIST } from './example-components'; + +const routes: Routes = [ + { + path : 'components/angular-material', + children: [ + { + path : ':id', + component: FuseAngularMaterialComponent + } + ] + } +]; + +@NgModule({ + imports : [ + SharedModule, + RouterModule.forChild(routes), + FuseWidgetModule + ], + exports : [ + SharedModule + ], + entryComponents: EXAMPLE_LIST, + declarations : [ + [...EXAMPLE_LIST], + FuseAngularMaterialComponent, + FuseExampleViewerComponent + ] +}) +export class FuseAngularMaterialModule +{ +} + diff --git a/src/app/main/content/components/angular-material/example-components.ts b/src/app/main/content/components/angular-material/example-components.ts new file mode 100644 index 00000000..708b8278 --- /dev/null +++ b/src/app/main/content/components/angular-material/example-components.ts @@ -0,0 +1,759 @@ +import { AutocompleteDisplayExample } from '../../../../../assets/angular-material-examples/autocomplete-display/autocomplete-display-example'; +import { AutocompleteFilterExample } from '../../../../../assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example'; +import { AutocompleteOverviewExample } from '../../../../../assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example'; +import { AutocompleteSimpleExample } from '../../../../../assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example'; +import { ButtonOverviewExample } from '../../../../../assets/angular-material-examples/button-overview/button-overview-example'; +import { ButtonToggleExclusiveExample } from '../../../../../assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example'; +import { ButtonToggleOverviewExample } from '../../../../../assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example'; +import { ButtonTypesExample } from '../../../../../assets/angular-material-examples/button-types/button-types-example'; +import { CardFancyExample } from '../../../../../assets/angular-material-examples/card-fancy/card-fancy-example'; +import { CardOverviewExample } from '../../../../../assets/angular-material-examples/card-overview/card-overview-example'; +import { CdkTableBasicExample } from '../../../../../assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example'; +import { CheckboxConfigurableExample } from '../../../../../assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example'; +import { CheckboxOverviewExample } from '../../../../../assets/angular-material-examples/checkbox-overview/checkbox-overview-example'; +import { ChipsInputExample } from '../../../../../assets/angular-material-examples/chips-input/chips-input-example'; +import { ChipsOverviewExample } from '../../../../../assets/angular-material-examples/chips-overview/chips-overview-example'; +import { ChipsStackedExample } from '../../../../../assets/angular-material-examples/chips-stacked/chips-stacked-example'; +import { DatepickerApiExample } from '../../../../../assets/angular-material-examples/datepicker-api/datepicker-api-example'; +import { DatepickerFilterExample } from '../../../../../assets/angular-material-examples/datepicker-filter/datepicker-filter-example'; +import { DatepickerMinMaxExample } from '../../../../../assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example'; +import { DatepickerOverviewExample } from '../../../../../assets/angular-material-examples/datepicker-overview/datepicker-overview-example'; +import { DatepickerStartViewExample } from '../../../../../assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example'; +import { DatepickerTouchExample } from '../../../../../assets/angular-material-examples/datepicker-touch/datepicker-touch-example'; +import { DialogContentExampleDialog, DialogContentExample } from '../../../../../assets/angular-material-examples/dialog-content/dialog-content-example'; +import { DialogDataExampleDialog, DialogDataExample } from '../../../../../assets/angular-material-examples/dialog-data/dialog-data-example'; +import { DialogElementsExampleDialog, DialogElementsExample } from '../../../../../assets/angular-material-examples/dialog-elements/dialog-elements-example'; +import { DialogOverviewExampleDialog, DialogOverviewExample } from '../../../../../assets/angular-material-examples/dialog-overview/dialog-overview-example'; +import { ExpansionOverviewExample } from '../../../../../assets/angular-material-examples/expansion-overview/expansion-overview-example'; +import { ExpansionStepsExample } from '../../../../../assets/angular-material-examples/expansion-steps/expansion-steps-example'; +import { GridListDynamicExample } from '../../../../../assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example'; +import { GridListOverviewExample } from '../../../../../assets/angular-material-examples/grid-list-overview/grid-list-overview-example'; +import { IconOverviewExample } from '../../../../../assets/angular-material-examples/icon-overview/icon-overview-example'; +import { IconSvgExample } from '../../../../../assets/angular-material-examples/icon-svg-example/icon-svg-example'; +import { InputClearableExample } from '../../../../../assets/angular-material-examples/input-clearable/input-clearable-example'; +import { InputErrorsExample } from '../../../../../assets/angular-material-examples/input-errors/input-errors-example'; +import { InputFormExample } from '../../../../../assets/angular-material-examples/input-form/input-form-example'; +import { InputHintExample } from '../../../../../assets/angular-material-examples/input-hint/input-hint-example'; +import { InputOverviewExample } from '../../../../../assets/angular-material-examples/input-overview/input-overview-example'; +import { InputPrefixSuffixExample } from '../../../../../assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example'; +import { ListOverviewExample } from '../../../../../assets/angular-material-examples/list-overview/list-overview-example'; +import { ListSectionsExample } from '../../../../../assets/angular-material-examples/list-sections/list-sections-example'; +import { ListSelectionExample } from '../../../../../assets/angular-material-examples/list-selection/list-selection-example'; +import { MenuIconsExample } from '../../../../../assets/angular-material-examples/menu-icons/menu-icons-example'; +import { MenuOverviewExample } from '../../../../../assets/angular-material-examples/menu-overview/menu-overview-example'; +import { NestedMenuExample } from '../../../../../assets/angular-material-examples/nested-menu/nested-menu-example'; +import { PaginatorConfigurableExample } from '../../../../../assets/angular-material-examples/paginator-configurable/paginator-configurable-example'; +import { PaginatorOverviewExample } from '../../../../../assets/angular-material-examples/paginator-overview/paginator-overview-example'; +import { ProgressBarConfigurableExample } from '../../../../../assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example'; +import { ProgressBarOverviewExample } from '../../../../../assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example'; +import { ProgressSpinnerConfigurableExample } from '../../../../../assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example'; +import { ProgressSpinnerOverviewExample } from '../../../../../assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example'; +import { RadioNgModelExample } from '../../../../../assets/angular-material-examples/radio-ng-model/radio-ng-model-example'; +import { RadioOverviewExample } from '../../../../../assets/angular-material-examples/radio-overview/radio-overview-example'; +import { SelectFormExample } from '../../../../../assets/angular-material-examples/select-form/select-form-example'; +import { SelectOverviewExample } from '../../../../../assets/angular-material-examples/select-overview/select-overview-example'; +import { SidenavFabExample } from '../../../../../assets/angular-material-examples/sidenav-fab/sidenav-fab-example'; +import { SidenavOverviewExample } from '../../../../../assets/angular-material-examples/sidenav-overview/sidenav-overview-example'; +import { SlideToggleConfigurableExample } from '../../../../../assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example'; +import { SlideToggleFormsExample } from '../../../../../assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example'; +import { SlideToggleOverviewExample } from '../../../../../assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example'; +import { SliderConfigurableExample } from '../../../../../assets/angular-material-examples/slider-configurable/slider-configurable-example'; +import { SliderOverviewExample } from '../../../../../assets/angular-material-examples/slider-overview/slider-overview-example'; +import { PizzaPartyComponent, SnackBarComponentExample } from '../../../../../assets/angular-material-examples/snack-bar-component/snack-bar-component-example'; +import { SnackBarOverviewExample } from '../../../../../assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example'; +import { SortOverviewExample } from '../../../../../assets/angular-material-examples/sort-overview/sort-overview-example'; +import { StepperOverviewExample } from '../../../../../assets/angular-material-examples/stepper-overview/stepper-overview-example'; +import { TableBasicExample } from '../../../../../assets/angular-material-examples/table-basic/table-basic-example'; +import { TableFilteringExample } from '../../../../../assets/angular-material-examples/table-filtering/table-filtering-example'; +import { TableHttpExample } from '../../../../../assets/angular-material-examples/table-http/table-http-example'; +import { TableOverviewExample } from '../../../../../assets/angular-material-examples/table-overview/table-overview-example'; +import { TablePaginationExample } from '../../../../../assets/angular-material-examples/table-pagination/table-pagination-example'; +import { TableSortingExample } from '../../../../../assets/angular-material-examples/table-sorting/table-sorting-example'; +import { TabsOverviewExample } from '../../../../../assets/angular-material-examples/tabs-overview/tabs-overview-example'; +import { TabsTemplateLabelExample } from '../../../../../assets/angular-material-examples/tabs-template-label/tabs-template-label-example'; +import { ToolbarMultirowExample } from '../../../../../assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example'; +import { ToolbarOverviewExample } from '../../../../../assets/angular-material-examples/toolbar-overview/toolbar-overview-example'; +import { TooltipOverviewExample } from '../../../../../assets/angular-material-examples/tooltip-overview/tooltip-overview-example'; +import { TooltipPositionExample } from '../../../../../assets/angular-material-examples/tooltip-position/tooltip-position-example'; + +export const COMPONENT_MAP = { + 'autocomplete' : [ + 'autocomplete-simple', + 'autocomplete-filter', + 'autocomplete-display', + 'autocomplete-overview' + ], + 'checkbox' : [ + 'checkbox-overview', + 'checkbox-configurable' + ], + 'datepicker' : [ + 'datepicker-overview', + 'datepicker-start-view', + 'datepicker-min-max', + 'datepicker-filter', + 'datepicker-touch', + 'datepicker-api' + ], + 'input' : [ + 'input-overview', + 'input-errors', + 'input-prefix-suffix', + 'input-hint', + 'input-clearable', + 'input-form' + ], + 'radio-button' : [ + 'radio-overview', + 'radio-ng-model' + ], + 'select' : [ + 'select-overview', + 'select-form' + ], + 'slider' : [ + 'slider-overview', + 'slider-configurable' + ], + 'slide-toggle' : [ + 'slide-toggle-overview', + 'slide-toggle-configurable', + 'slide-toggle-forms' + ], + 'menu' : [ + 'menu-overview', + 'nested-menu', + 'menu-icons' + ], + 'sidenav' : [ + 'sidenav-overview', + 'sidenav-fab' + ], + 'toolbar' : [ + 'toolbar-overview', + 'toolbar-multirow' + ], + 'list' : [ + 'list-overview', + 'list-sections', + 'list-selection' + ], + 'grid-list' : [ + 'grid-list-overview', + 'grid-list-dynamic' + ], + 'card' : [ + 'card-overview', + 'card-fancy' + ], + 'stepper' : [ + 'stepper-overview' + ], + 'tabs' : [ + 'tabs-overview', + 'tabs-template-label' + ], + 'expansion-panel' : [ + 'expansion-overview', + 'expansion-steps' + ], + 'button' : [ + 'button-overview', + 'button-types' + ], + 'button-toggle' : [ + 'button-toggle-overview', + 'button-toggle-exclusive' + ], + 'chips' : [ + 'chips-overview', + 'chips-input' + ], + 'icon' : [ + 'icon-overview', + 'icon-svg' + ], + 'progress-spinner': [ + 'progress-spinner-overview', + 'progress-spinner-configurable' + ], + 'progress-bar' : [ + 'progress-bar-overview', + 'progress-bar-configurable' + ], + 'dialog' : [ + 'dialog-overview', + 'dialog-content', + 'dialog-data', + 'dialog-elements' + ], + 'tooltip' : [ + 'tooltip-overview', + 'tooltip-position' + ], + 'snackbar' : [ + 'snack-bar-overview' + ], + 'data-table' : [ + 'table-overview', + 'table-basic', + 'table-filtering', + 'table-http' + ], + 'sort-header' : [ + 'sort-overview', + 'table-sorting' + ], + 'paginator' : [ + 'table-pagination' + ] +}; + +export const EXAMPLE_COMPONENTS = { + 'autocomplete-display' : { + title : 'Display value autocomplete', + component : AutocompleteDisplayExample, + additionalFiles: null, + selectorName : null + }, + 'autocomplete-filter' : { + title : 'Filter autocomplete', + component : AutocompleteFilterExample, + additionalFiles: null, + selectorName : null + }, + 'autocomplete-overview' : { + title : 'Autocomplete overview', + component : AutocompleteOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'autocomplete-simple' : { + title : 'Simple autocomplete', + component : AutocompleteSimpleExample, + additionalFiles: null, + selectorName : null + }, + 'button-overview' : { + title : 'Basic buttons', + component : ButtonOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'button-toggle-exclusive' : { + title : 'Exclusive selection', + component : ButtonToggleExclusiveExample, + additionalFiles: null, + selectorName : null + }, + 'button-toggle-overview' : { + title : 'Basic button-toggles', + component : ButtonToggleOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'button-types' : { + title : 'Button varieties', + component : ButtonTypesExample, + additionalFiles: null, + selectorName : null + }, + 'card-fancy' : { + title : 'Card with multiple sections', + component : CardFancyExample, + additionalFiles: null, + selectorName : null + }, + 'card-overview' : { + title : 'Basic cards', + component : CardOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'cdk-table-basic' : { + title : 'Basic CDK data-table', + component : CdkTableBasicExample, + additionalFiles: null, + selectorName : null + }, + 'checkbox-configurable' : { + title : 'Configurable checkbox', + component : CheckboxConfigurableExample, + additionalFiles: null, + selectorName : null + }, + 'checkbox-overview' : { + title : 'Basic checkboxes', + component : CheckboxOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'chips-input' : { + title : 'Chips with input', + component : ChipsInputExample, + additionalFiles: null, + selectorName : null + }, + 'chips-overview' : { + title : 'Basic chips', + component : ChipsOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'chips-stacked' : { + title : 'Stacked chips', + component : ChipsStackedExample, + additionalFiles: null, + selectorName : null + }, + 'datepicker-api' : { + title : 'Datepicker API', + component : DatepickerApiExample, + additionalFiles: null, + selectorName : null + }, + 'datepicker-filter' : { + title : 'Datepicker Filter', + component : DatepickerFilterExample, + additionalFiles: null, + selectorName : null + }, + 'datepicker-min-max' : { + title : 'Datepicker Min Max', + component : DatepickerMinMaxExample, + additionalFiles: null, + selectorName : null + }, + 'datepicker-overview' : { + title : 'Basic datepicker', + component : DatepickerOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'datepicker-start-view' : { + title : 'Datepicker start date', + component : DatepickerStartViewExample, + additionalFiles: null, + selectorName : null + }, + 'datepicker-touch' : { + title : 'Datepicker Touch', + component : DatepickerTouchExample, + additionalFiles: null, + selectorName : null + }, + 'dialog-content' : { + title : 'Dialog with header, scrollable content and actions', + component : DialogContentExample, + additionalFiles: ['dialog-content-example-dialog.html'], + selectorName : 'DialogContentExample, DialogContentExampleDialog' + }, + 'dialog-data' : { + title : 'Injecting data when opening a dialog', + component : DialogDataExample, + additionalFiles: ['dialog-data-example-dialog.html'], + selectorName : 'DialogDataExample, DialogDataExampleDialog' + }, + 'dialog-elements' : { + title : 'Dialog elements', + component : DialogElementsExample, + additionalFiles: ['dialog-elements-example-dialog.html'], + selectorName : 'DialogElementsExample, DialogElementsExampleDialog' + }, + 'dialog-overview' : { + title : 'Dialog Overview', + component : DialogOverviewExample, + additionalFiles: ['dialog-overview-example-dialog.html'], + selectorName : 'DialogOverviewExample, DialogOverviewExampleDialog' + }, + 'expansion-overview' : { + title : 'Basic expansion panel', + component : ExpansionOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'expansion-steps' : { + title : 'Expansion panel as accordion', + component : ExpansionStepsExample, + additionalFiles: null, + selectorName : null + }, + 'grid-list-dynamic' : { + title : 'Dynamic grid-list', + component : GridListDynamicExample, + additionalFiles: null, + selectorName : null + }, + 'grid-list-overview' : { + title : 'Basic grid-list', + component : GridListOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'icon-overview' : { + title : 'Basic icons', + component : IconOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'icon-svg' : { + title : 'SVG icons', + component : IconSvgExample, + additionalFiles: null, + selectorName : null + }, + 'input-clearable' : { + title : 'Input Clearable', + component : InputClearableExample, + additionalFiles: null, + selectorName : null + }, + 'input-errors' : { + title : 'Input Errors', + component : InputErrorsExample, + additionalFiles: null, + selectorName : null + }, + 'input-form' : { + title : 'Inputs in a form', + component : InputFormExample, + additionalFiles: null, + selectorName : null + }, + 'input-hint' : { + title : 'Input hints', + component : InputHintExample, + additionalFiles: null, + selectorName : null + }, + 'input-overview' : { + title : 'Basic Inputs', + component : InputOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'input-prefix-suffix' : { + title : 'Input Prefixes and Suffixes', + component : InputPrefixSuffixExample, + additionalFiles: null, + selectorName : null + }, + 'list-overview' : { + title : 'Basic list', + component : ListOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'list-sections' : { + title : 'List with sections', + component : ListSectionsExample, + additionalFiles: null, + selectorName : null + }, + 'list-selection' : { + title : 'List with selection', + component : ListSelectionExample, + additionalFiles: null, + selectorName : null + }, + 'menu-icons' : { + title : 'Menu with icons', + component : MenuIconsExample, + additionalFiles: null, + selectorName : null + }, + 'menu-overview' : { + title : 'Basic menu', + component : MenuOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'nested-menu' : { + title : 'Nested menu', + component : NestedMenuExample, + additionalFiles: null, + selectorName : null + }, + 'paginator-configurable' : { + title : 'Configurable paginator', + component : PaginatorConfigurableExample, + additionalFiles: null, + selectorName : null + }, + 'paginator-overview' : { + title : 'Paginator', + component : PaginatorOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'progress-bar-configurable' : { + title : 'Configurable progress-bar', + component : ProgressBarConfigurableExample, + additionalFiles: null, + selectorName : null + }, + 'progress-bar-overview' : { + title : 'Basic progress-bar', + component : ProgressBarOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'progress-spinner-configurable': { + title : 'Configurable progress spinner', + component : ProgressSpinnerConfigurableExample, + additionalFiles: null, + selectorName : null + }, + 'progress-spinner-overview' : { + title : 'Basic progress-spinner', + component : ProgressSpinnerOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'radio-ng-model' : { + title : 'Radios with ngModel', + component : RadioNgModelExample, + additionalFiles: null, + selectorName : null + }, + 'radio-overview' : { + title : 'Basic radios', + component : RadioOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'select-form' : { + title : 'Select in a form', + component : SelectFormExample, + additionalFiles: null, + selectorName : null + }, + 'select-overview' : { + title : 'Basic select', + component : SelectOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'sidenav-fab' : { + title : 'Sidenav with a FAB', + component : SidenavFabExample, + additionalFiles: null, + selectorName : null + }, + 'sidenav-overview' : { + title : 'Basic sidenav', + component : SidenavOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'slide-toggle-configurable' : { + title : 'Configurable slide-toggle', + component : SlideToggleConfigurableExample, + additionalFiles: null, + selectorName : null + }, + 'slide-toggle-forms' : { + title : 'Slide-toggle with forms', + component : SlideToggleFormsExample, + additionalFiles: null, + selectorName : null + }, + 'slide-toggle-overview' : { + title : 'Basic slide-toggles', + component : SlideToggleOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'slider-configurable' : { + title : 'Configurable slider', + component : SliderConfigurableExample, + additionalFiles: null, + selectorName : null + }, + 'slider-overview' : { + title : 'Basic slider', + component : SliderOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'snack-bar-component' : { + title : 'Snack-bar with a custom component', + component : SnackBarComponentExample, + additionalFiles: ['snack-bar-component-example-snack.html'], + selectorName : 'SnackBarComponentExample, PizzaPartyComponent' + }, + 'snack-bar-overview' : { + title : 'Basic snack-bar', + component : SnackBarOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'sort-overview' : { + title : 'Sorting overview', + component : SortOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'stepper-overview' : { + title : 'Stepper overview', + component : StepperOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'table-basic' : { + title : 'Basic table', + component : TableBasicExample, + additionalFiles: null, + selectorName : null + }, + 'table-filtering' : { + title : 'Table with filtering', + component : TableFilteringExample, + additionalFiles: null, + selectorName : null + }, + 'table-http' : { + title : 'Table retrieving data through HTTP', + component : TableHttpExample, + additionalFiles: null, + selectorName : null + }, + 'table-overview' : { + title : 'Feature-rich data table', + component : TableOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'table-pagination' : { + title : 'Table with pagination', + component : TablePaginationExample, + additionalFiles: null, + selectorName : null + }, + 'table-sorting' : { + title : 'Table with sorting', + component : TableSortingExample, + additionalFiles: null, + selectorName : null + }, + 'tabs-overview' : { + title : 'Basic tabs', + component : TabsOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'tabs-template-label' : { + title : 'Complex Example', + component : TabsTemplateLabelExample, + additionalFiles: null, + selectorName : null + }, + 'toolbar-multirow' : { + title : 'Multi-row toolbar', + component : ToolbarMultirowExample, + additionalFiles: null, + selectorName : null + }, + 'toolbar-overview' : { + title : 'Basic toolbar', + component : ToolbarOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'tooltip-overview' : { + title : 'Basic tooltip', + component : TooltipOverviewExample, + additionalFiles: null, + selectorName : null + }, + 'tooltip-position' : { + title : 'Tooltip with custom position', + component : TooltipPositionExample, + additionalFiles: null, + selectorName : null + } +}; + +export const EXAMPLE_LIST = [ + AutocompleteDisplayExample, + AutocompleteFilterExample, + AutocompleteOverviewExample, + AutocompleteSimpleExample, + ButtonOverviewExample, + ButtonToggleExclusiveExample, + ButtonToggleOverviewExample, + ButtonTypesExample, + CardFancyExample, + CardOverviewExample, + CdkTableBasicExample, + CheckboxConfigurableExample, + CheckboxOverviewExample, + ChipsInputExample, + ChipsOverviewExample, + ChipsStackedExample, + DatepickerApiExample, + DatepickerFilterExample, + DatepickerMinMaxExample, + DatepickerOverviewExample, + DatepickerStartViewExample, + DatepickerTouchExample, + DialogContentExampleDialog, + DialogContentExample, + DialogDataExampleDialog, + DialogDataExample, + DialogElementsExampleDialog, + DialogElementsExample, + DialogOverviewExampleDialog, + DialogOverviewExample, + ExpansionOverviewExample, + ExpansionStepsExample, + GridListDynamicExample, + GridListOverviewExample, + IconOverviewExample, + IconSvgExample, + InputClearableExample, + InputErrorsExample, + InputFormExample, + InputHintExample, + InputOverviewExample, + InputPrefixSuffixExample, + ListOverviewExample, + ListSectionsExample, + ListSelectionExample, + MenuIconsExample, + MenuOverviewExample, + NestedMenuExample, + PaginatorConfigurableExample, + PaginatorOverviewExample, + ProgressBarConfigurableExample, + ProgressBarOverviewExample, + ProgressSpinnerConfigurableExample, + ProgressSpinnerOverviewExample, + RadioNgModelExample, + RadioOverviewExample, + SelectFormExample, + SelectOverviewExample, + SidenavFabExample, + SidenavOverviewExample, + SlideToggleConfigurableExample, + SlideToggleFormsExample, + SlideToggleOverviewExample, + SliderConfigurableExample, + SliderOverviewExample, + PizzaPartyComponent, SnackBarComponentExample, + SnackBarOverviewExample, + SortOverviewExample, + StepperOverviewExample, + TableBasicExample, + TableFilteringExample, + TableHttpExample, + TableOverviewExample, + TablePaginationExample, + TableSortingExample, + TabsOverviewExample, + TabsTemplateLabelExample, + ToolbarMultirowExample, + ToolbarOverviewExample, + TooltipOverviewExample, + TooltipPositionExample +]; diff --git a/src/app/main/content/components/angular-material/example-viewer/example-viewer.html b/src/app/main/content/components/angular-material/example-viewer/example-viewer.html new file mode 100644 index 00000000..916086d0 --- /dev/null +++ b/src/app/main/content/components/angular-material/example-viewer/example-viewer.html @@ -0,0 +1,58 @@ +
+ +
+ +
{{exampleData?.title}}
+ + +
+ +
+ + + + + + +
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+ + +
+
+
diff --git a/src/app/main/content/components/angular-material/example-viewer/example-viewer.scss b/src/app/main/content/components/angular-material/example-viewer/example-viewer.scss new file mode 100644 index 00000000..8186c4e8 --- /dev/null +++ b/src/app/main/content/components/angular-material/example-viewer/example-viewer.scss @@ -0,0 +1,75 @@ +@import "src/app/core/scss/fuse"; + +fuse-example-viewer { + display: block; + padding: 24px 0; + + .example-viewer-wrapper { + border: 1px solid rgba(mat-color($foreground, secondary-text), .03); + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.24), 0 0 2px rgba(0, 0, 0, 0.12); + margin: 4px; + h3 { + margin-top: 10px; + } + } + + .example-viewer-header { + align-content: center; + align-items: center; + display: flex; + justify-content: center; + padding: 8px 20px; + color: mat-color($foreground, secondary-text); + background: rgba(mat-color($foreground, secondary-text), .03); + flex: 1 1 auto; + + .example-viewer-title { + flex: 1 1 auto; + } + } + + .example-viewer-source { + + .tab-content { + background: #263238; + + .tab { + position: relative; + + .example-source-copy { + position: absolute; + top: 8px; + display: none; + right: 8px; + + md-icon { + color: rgba(255, 255, 255, 0.87); + } + } + + &:hover { + .example-source-copy { + display: inline-block; + } + } + + .example-source { + display: flex; + padding: 0; + margin: 0; + min-height: 150px; + border-bottom: 1px solid mat-color($foreground, divider); + + > pre { + width: 100%; + } + } + } + } + + } + + .example-viewer-body { + padding: 24px; + } +} diff --git a/src/app/main/content/components/angular-material/example-viewer/example-viewer.ts b/src/app/main/content/components/angular-material/example-viewer/example-viewer.ts new file mode 100644 index 00000000..8c5f178b --- /dev/null +++ b/src/app/main/content/components/angular-material/example-viewer/example-viewer.ts @@ -0,0 +1,110 @@ +import { AfterViewInit, Component, ComponentFactoryResolver, ComponentRef, Input, OnDestroy, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; +import { MdSnackBar } from '@angular/material'; +import 'rxjs/add/operator/first'; +import { CopierService } from '../../../../../core/components/copier/copier.service'; +import { EXAMPLE_COMPONENTS } from '../example-components'; +import 'prismjs/components/prism-scss'; +import 'prismjs/components/prism-typescript'; +import { fuseAnimations } from '../../../../../core/animations'; + +export interface LiveExample +{ + title: string; + component: any; + additionalFiles?: string[]; + selectorName?: string; +} + +@Component({ + selector : 'fuse-example-viewer', + templateUrl : './example-viewer.html', + styleUrls : ['./example-viewer.scss'], + providers : [CopierService], + encapsulation: ViewEncapsulation.None, + animations : fuseAnimations +}) +export class FuseExampleViewerComponent implements AfterViewInit, OnDestroy +{ + previewRef: ComponentRef; + selectedIndex = 0; + + get container(): ViewContainerRef + { + return this._previewContainer; + } + + set container(value: ViewContainerRef) + { + this._previewContainer = value; + } + + @ViewChild('previewContainer', {read: ViewContainerRef}) private _previewContainer: ViewContainerRef; + + /** String key of the currently displayed example. */ + _example: string; + + exampleData: LiveExample; + + /** Whether the source for the example is being displayed. */ + showSource = false; + + constructor( + private snackbar: MdSnackBar, + private copier: CopierService, + private _resolver: ComponentFactoryResolver + ) + { + } + + get example() + { + return this._example; + } + + @Input() + set example(example: string) + { + if ( example && EXAMPLE_COMPONENTS[example] ) + { + this._example = example; + this.exampleData = EXAMPLE_COMPONENTS[example]; + } + else + { + console.log('MISSING EXAMPLE: ', example); + } + } + + toggleSourceView(): void + { + this.showSource = !this.showSource; + } + + copySource(text: string) + { + if ( this.copier.copyText(text) ) + { + this.snackbar.open('Code copied', '', {duration: 2500}); + } + else + { + this.snackbar.open('Copy failed. Please try again!', '', {duration: 2500}); + } + } + + ngAfterViewInit() + { + setTimeout(() => { + const cmpFactory = this._resolver.resolveComponentFactory(this.exampleData.component); + this.previewRef = this._previewContainer.createComponent(cmpFactory); + }, 0); + } + + ngOnDestroy() + { + if ( this.previewRef ) + { + this.previewRef.destroy(); + } + } +} diff --git a/src/app/main/content/pages/invoices/invoice.service.ts b/src/app/main/content/pages/invoices/invoice.service.ts index b9576806..a0644ad1 100644 --- a/src/app/main/content/pages/invoices/invoice.service.ts +++ b/src/app/main/content/pages/invoices/invoice.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; @Injectable() @@ -11,7 +11,7 @@ export class InvoiceService implements Resolve invoiceOnChanged: BehaviorSubject = new BehaviorSubject({}); - constructor(private http: Http) + constructor(private http: HttpClient) { } @@ -43,8 +43,8 @@ export class InvoiceService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/invoice') - .subscribe(timeline => { - this.invoice = timeline.json().data; + .subscribe((timeline: any) => { + this.invoice = timeline.data; this.invoiceOnChanged.next(this.invoice); resolve(this.invoice); }, reject); diff --git a/src/app/main/content/pages/profile/profile.service.ts b/src/app/main/content/pages/profile/profile.service.ts index f623648d..828e4c78 100644 --- a/src/app/main/content/pages/profile/profile.service.ts +++ b/src/app/main/content/pages/profile/profile.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; @Injectable() @@ -15,7 +15,7 @@ export class ProfileService implements Resolve aboutOnChanged: BehaviorSubject = new BehaviorSubject({}); photosVideosOnChanged: BehaviorSubject = new BehaviorSubject({}); - constructor(private http: Http) + constructor(private http: HttpClient) { } @@ -49,8 +49,8 @@ export class ProfileService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/profile-timeline') - .subscribe(timeline => { - this.timeline = timeline.json().data; + .subscribe((timeline: any) => { + this.timeline = timeline.data; this.timelineOnChanged.next(this.timeline); resolve(this.timeline); }, reject); @@ -65,8 +65,8 @@ export class ProfileService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/profile-about') - .subscribe(about => { - this.about = about.json().data; + .subscribe((about: any) => { + this.about = about.data; this.aboutOnChanged.next(this.about); resolve(this.about); }, reject); @@ -81,8 +81,8 @@ export class ProfileService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/profile-photos-videos') - .subscribe(photosVideos => { - this.photosVideos = photosVideos.json().data; + .subscribe((photosVideos: any) => { + this.photosVideos = photosVideos.data; this.photosVideosOnChanged.next(this.photosVideos); resolve(this.photosVideos); }, reject); diff --git a/src/app/main/content/pages/search/search.service.ts b/src/app/main/content/pages/search/search.service.ts index 4232f856..1f12303a 100644 --- a/src/app/main/content/pages/search/search.service.ts +++ b/src/app/main/content/pages/search/search.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; @Injectable() @@ -13,7 +13,7 @@ export class SearchService implements Resolve classicOnChanged: BehaviorSubject = new BehaviorSubject({}); tableOnChanged: BehaviorSubject = new BehaviorSubject({}); - constructor(private http: Http) + constructor(private http: HttpClient) { } @@ -46,8 +46,8 @@ export class SearchService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/search-classic') - .subscribe(classic => { - this.classic = classic.json().data; + .subscribe((classic: any) => { + this.classic = classic.data; this.classicOnChanged.next(this.classic); resolve(this.classic); }, reject); @@ -62,8 +62,8 @@ export class SearchService implements Resolve return new Promise((resolve, reject) => { this.http.get('api/search-table') - .subscribe(table => { - this.table = table.json().data; + .subscribe((table: any) => { + this.table = table.data; this.tableOnChanged.next(this.table); resolve(this.table); }, reject); diff --git a/src/app/main/content/ui/icons/icons.component.html b/src/app/main/content/ui/icons/icons.component.html index a3189c2b..653b4d82 100644 --- a/src/app/main/content/ui/icons/icons.component.html +++ b/src/app/main/content/ui/icons/icons.component.html @@ -12,7 +12,7 @@
Icons
- + link Reference diff --git a/src/app/main/content/ui/icons/icons.component.ts b/src/app/main/content/ui/icons/icons.component.ts index 71c68256..8cd6f752 100644 --- a/src/app/main/content/ui/icons/icons.component.ts +++ b/src/app/main/content/ui/icons/icons.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; @Component({ selector : 'fuse-icons', @@ -12,16 +12,15 @@ export class FuseIconsComponent implements OnInit filteredIcons: string[]; loading = true; - constructor(private http: Http) + constructor(private http: HttpClient) { - } ngOnInit() { this.http.get('api/icons') - .subscribe(icons => { - this.icons = icons.json().data; + .subscribe((icons: any) => { + this.icons = icons.data; this.filteredIcons = this.icons; this.loading = false; }); diff --git a/src/app/main/quick-panel/quick-panel.component.ts b/src/app/main/quick-panel/quick-panel.component.ts index 33ce41bf..b28e2f20 100644 --- a/src/app/main/quick-panel/quick-panel.component.ts +++ b/src/app/main/quick-panel/quick-panel.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; @Component({ selector : 'fuse-quick-panel', @@ -14,7 +14,7 @@ export class FuseQuickPanelComponent implements OnInit notes: any[]; events: any[]; - constructor(private http: Http) + constructor(private http: HttpClient) { this.date = new Date(); this.settings = { @@ -28,13 +28,13 @@ export class FuseQuickPanelComponent implements OnInit ngOnInit() { this.http.get('api/quick-panel-notes') - .subscribe(response => { - this.notes = response.json().data; + .subscribe((response: any) => { + this.notes = response.data; }); this.http.get('api/quick-panel-events') - .subscribe(response => { - this.events = response.json().data; + .subscribe((response: any) => { + this.events = response.data; }); } diff --git a/src/app/navigation.model.ts b/src/app/navigation.model.ts index 9c1210fc..8b22de2d 100644 --- a/src/app/navigation.model.ts +++ b/src/app/navigation.model.ts @@ -343,6 +343,194 @@ export class NavigationModel 'type' : 'group', 'icon' : 'settings_input_component', 'children': [ + { + 'title' : 'Angular Material Elements', + 'type' : 'collapse', + 'icon' : 'layers', + 'children': [ + { + 'title' : 'Form Controls', + 'type' : 'group', + 'children': [ + { + 'title': 'Autocomplete', + 'type' : 'item', + 'url' : '/components/angular-material/autocomplete' + }, + { + 'title': 'Checkbox', + 'type' : 'item', + 'url' : '/components/angular-material/checkbox' + }, + { + 'title': 'Datepicker', + 'type' : 'item', + 'url' : '/components/angular-material/datepicker' + }, + { + 'title': 'Input', + 'type' : 'item', + 'url' : '/components/angular-material/input' + }, + { + 'title': 'Radio button', + 'type' : 'item', + 'url' : '/components/angular-material/radio-button' + }, + { + 'title': 'Select', + 'type' : 'item', + 'url' : '/components/angular-material/select' + }, + { + 'title': 'Slider', + 'type' : 'item', + 'url' : '/components/angular-material/slider' + }, + { + 'title': 'Slide toggle', + 'type' : 'item', + 'url' : '/components/angular-material/slide-toggle' + } + ] + }, + { + 'title' : 'Navigation', + 'type' : 'group', + 'children': [ + { + 'title': 'Menu', + 'type' : 'item', + 'url' : '/components/angular-material/menu' + }, + { + 'title': 'Sidenav', + 'type' : 'item', + 'url' : '/components/angular-material/sidenav' + }, + { + 'title': 'Toolbar', + 'type' : 'item', + 'url' : '/components/angular-material/toolbar' + } + ] + }, + { + 'title' : 'Layout', + 'type' : 'group', + 'children': [ + { + 'title': 'List', + 'type' : 'item', + 'url' : '/components/angular-material/list' + }, + { + 'title': 'Grid list', + 'type' : 'item', + 'url' : '/components/angular-material/grid-list' + }, + { + 'title': 'Card', + 'type' : 'item', + 'url' : '/components/angular-material/card' + }, + { + 'title': 'Stepper', + 'type' : 'item', + 'url' : '/components/angular-material/stepper' + }, + { + 'title': 'Tabs', + 'type' : 'item', + 'url' : '/components/angular-material/tabs' + }, + { + 'title': 'Expansion Panel', + 'type' : 'item', + 'url' : '/components/angular-material/expansion-panel' + } + ] + }, + { + 'title' : 'Buttons & Indicators', + 'type' : 'group', + 'children': [ + { + 'title': 'Button', + 'type' : 'item', + 'url' : '/components/angular-material/button' + }, + { + 'title': 'Button toggle', + 'type' : 'item', + 'url' : '/components/angular-material/button-toggle' + }, + { + 'title': 'Chips', + 'type' : 'item', + 'url' : '/components/angular-material/chips' + }, + { + 'title': 'Icon', + 'type' : 'item', + 'url' : '/components/angular-material/icon' + }, + { + 'title': 'Progress spinner', + 'type' : 'item', + 'url' : '/components/angular-material/progress-spinner' + }, + { + 'title': 'Progress bar', + 'type' : 'item', + 'url' : '/components/angular-material/progress-bar' + } + ] + }, + { + 'title' : 'Popups & Modals', + 'type' : 'group', + 'children': [ + { + 'title': 'Dialog', + 'type' : 'item', + 'url' : '/components/angular-material/dialog' + }, + { + 'title': 'Tooltip', + 'type' : 'item', + 'url' : '/components/angular-material/tooltip' + }, + { + 'title': 'Snackbar', + 'type' : 'item', + 'url' : '/components/angular-material/snackbar' + } + ] + }, + { + 'title' : 'Data table', + 'type' : 'group', + 'children': [ + { + 'title': 'Table', + 'type' : 'item', + 'url' : '/components/angular-material/data-table' + }, + { + 'title': 'Sort header', + 'type' : 'item', + 'url' : '/components/angular-material/sort-header' + }, + { + 'title': 'Paginator', + 'type' : 'item', + 'url' : '/components/angular-material/paginator' + } + ] + } + ] + }, { 'title': 'Countdown', 'type' : 'item', diff --git a/src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.css b/src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.css new file mode 100644 index 00000000..08fa6753 --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.css @@ -0,0 +1,9 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; +} + +.example-full-width { + width: 100%; +} diff --git a/src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.html b/src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.html new file mode 100644 index 00000000..176d13dc --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.html @@ -0,0 +1,10 @@ +
+ + + + + {{ option.name }} + + + +
diff --git a/src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.ts b/src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.ts new file mode 100644 index 00000000..aaeeb5ce --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-display/autocomplete-display-example.ts @@ -0,0 +1,49 @@ +import {Component} from '@angular/core'; +import {FormControl} from '@angular/forms'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/operator/startWith'; +import 'rxjs/add/operator/map'; + +export class User { + constructor(public name: string) { } +} + +/** + * @title Display value autocomplete + */ +@Component({ + selector: 'autocomplete-display-example', + templateUrl: 'autocomplete-display-example.html', + styleUrls: ['autocomplete-display-example.css'] +}) +export class AutocompleteDisplayExample { + + myControl = new FormControl(); + + options = [ + new User('Mary'), + new User('Shelley'), + new User('Igor') + ]; + + filteredOptions: Observable; + + ngOnInit() { + this.filteredOptions = this.myControl.valueChanges + .startWith(null) + .map(user => user && typeof user === 'object' ? user.name : user) + .map(name => name ? this.filter(name) : this.options.slice()); + } + + filter(name: string): User[] { + return this.options.filter(option => + option.name.toLowerCase().indexOf(name.toLowerCase()) === 0); + } + + displayFn(user: User): string { + if (user){ + return user.name; + } + } + +} diff --git a/src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.css b/src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.css new file mode 100644 index 00000000..08fa6753 --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.css @@ -0,0 +1,9 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; +} + +.example-full-width { + width: 100%; +} diff --git a/src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.html b/src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.html new file mode 100644 index 00000000..13c64139 --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.html @@ -0,0 +1,10 @@ +
+ + + + + {{ option }} + + + +
diff --git a/src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.ts b/src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.ts new file mode 100644 index 00000000..dde59515 --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-filter/autocomplete-filter-example.ts @@ -0,0 +1,38 @@ +import {Component} from '@angular/core'; +import {FormControl} from '@angular/forms'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/operator/startWith'; +import 'rxjs/add/operator/map'; + +/** + * @title Filter autocomplete + */ +@Component({ + selector: 'autocomplete-filter-example', + templateUrl: 'autocomplete-filter-example.html', + styleUrls: ['autocomplete-filter-example.css'] +}) +export class AutocompleteFilterExample { + + myControl: FormControl = new FormControl(); + + options = [ + 'One', + 'Two', + 'Three' + ]; + + filteredOptions: Observable; + + ngOnInit() { + this.filteredOptions = this.myControl.valueChanges + .startWith(null) + .map(val => val ? this.filter(val) : this.options.slice()); + } + + filter(val: string): string[] { + return this.options.filter(option => + option.toLowerCase().indexOf(val.toLowerCase()) === 0); + } + +} diff --git a/src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.css b/src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.css new file mode 100644 index 00000000..08fa6753 --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.css @@ -0,0 +1,9 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; +} + +.example-full-width { + width: 100%; +} diff --git a/src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.html b/src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.html new file mode 100644 index 00000000..78370e44 --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.html @@ -0,0 +1,20 @@ +
+ + + + + + {{ state.name }} | + Population: {{state.population}} + + + + +
+ + + Disable Input? + +
diff --git a/src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.ts b/src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.ts new file mode 100644 index 00000000..ee2a166b --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-overview/autocomplete-overview-example.ts @@ -0,0 +1,59 @@ +import {Component} from '@angular/core'; +import {FormControl} from '@angular/forms'; + +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/operator/startWith'; +import 'rxjs/add/operator/map'; + +/** + * @title Autocomplete overview + */ +@Component({ + selector: 'autocomplete-overview-example', + templateUrl: 'autocomplete-overview-example.html', + styleUrls: ['autocomplete-overview-example.css'] +}) +export class AutocompleteOverviewExample { + stateCtrl: FormControl; + filteredStates: Observable; + + states: any[] = [ + { + name: 'Arkansas', + population: '2.978M', + // https://commons.wikimedia.org/wiki/File:Flag_of_Arkansas.svg + flag: 'https://upload.wikimedia.org/wikipedia/commons/9/9d/Flag_of_Arkansas.svg' + }, + { + name: 'California', + population: '39.14M', + // https://commons.wikimedia.org/wiki/File:Flag_of_California.svg + flag: 'https://upload.wikimedia.org/wikipedia/commons/0/01/Flag_of_California.svg' + }, + { + name: 'Florida', + population: '20.27M', + // https://commons.wikimedia.org/wiki/File:Flag_of_Florida.svg + flag: 'https://upload.wikimedia.org/wikipedia/commons/f/f7/Flag_of_Florida.svg' + }, + { + name: 'Texas', + population: '27.47M', + // https://commons.wikimedia.org/wiki/File:Flag_of_Texas.svg + flag: 'https://upload.wikimedia.org/wikipedia/commons/f/f7/Flag_of_Texas.svg' + } + ]; + + constructor() { + this.stateCtrl = new FormControl(); + this.filteredStates = this.stateCtrl.valueChanges + .startWith(null) + .map(state => state ? this.filterStates(state) : this.states.slice()); + } + + filterStates(name: string) { + return this.states.filter(state => + state.name.toLowerCase().indexOf(name.toLowerCase()) === 0); + } + +} diff --git a/src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.css b/src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.css new file mode 100644 index 00000000..08fa6753 --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.css @@ -0,0 +1,9 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; +} + +.example-full-width { + width: 100%; +} diff --git a/src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.html b/src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.html new file mode 100644 index 00000000..3c440f4b --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.html @@ -0,0 +1,10 @@ +
+ + + + + {{ option }} + + + +
diff --git a/src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.ts b/src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.ts new file mode 100644 index 00000000..c3f1bcb6 --- /dev/null +++ b/src/assets/angular-material-examples/autocomplete-simple/autocomplete-simple-example.ts @@ -0,0 +1,22 @@ +import {Component} from '@angular/core'; +import {FormControl} from '@angular/forms'; + +/** + * @title Simple autocomplete + */ +@Component({ + selector: 'autocomplete-simple-example', + templateUrl: 'autocomplete-simple-example.html', + styleUrls: ['autocomplete-simple-example.css'] +}) +export class AutocompleteSimpleExample { + + myControl: FormControl = new FormControl(); + + options = [ + 'One', + 'Two', + 'Three' + ]; + +} diff --git a/src/assets/angular-material-examples/button-overview/button-overview-example.css b/src/assets/angular-material-examples/button-overview/button-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/button-overview/button-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/button-overview/button-overview-example.html b/src/assets/angular-material-examples/button-overview/button-overview-example.html new file mode 100644 index 00000000..56f6fa44 --- /dev/null +++ b/src/assets/angular-material-examples/button-overview/button-overview-example.html @@ -0,0 +1 @@ + diff --git a/src/assets/angular-material-examples/button-overview/button-overview-example.ts b/src/assets/angular-material-examples/button-overview/button-overview-example.ts new file mode 100644 index 00000000..9dbde687 --- /dev/null +++ b/src/assets/angular-material-examples/button-overview/button-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic buttons + */ +@Component({ + selector: 'button-overview-example', + templateUrl: 'button-overview-example.html', +}) +export class ButtonOverviewExample {} diff --git a/src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.css b/src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.css new file mode 100644 index 00000000..d21ca3ce --- /dev/null +++ b/src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.css @@ -0,0 +1,3 @@ +.example-selected-value { + margin: 15px 0; +} diff --git a/src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.html b/src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.html new file mode 100644 index 00000000..dd5cd277 --- /dev/null +++ b/src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.html @@ -0,0 +1,15 @@ + + + format_align_left + + + format_align_center + + + format_align_right + + + format_align_justify + + +
Selected value: {{group.value}}
diff --git a/src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.ts b/src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.ts new file mode 100644 index 00000000..efe1c7cc --- /dev/null +++ b/src/assets/angular-material-examples/button-toggle-exclusive/button-toggle-exclusive-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Exclusive selection + */ +@Component({ + selector: 'button-toggle-exclusive-example', + templateUrl: 'button-toggle-exclusive-example.html', + styleUrls: ['button-toggle-exclusive-example.css'], +}) +export class ButtonToggleExclusiveExample {} diff --git a/src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.css b/src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.html b/src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.html new file mode 100644 index 00000000..bb215d5b --- /dev/null +++ b/src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.html @@ -0,0 +1 @@ +Toggle me! diff --git a/src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.ts b/src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.ts new file mode 100644 index 00000000..c8afb437 --- /dev/null +++ b/src/assets/angular-material-examples/button-toggle-overview/button-toggle-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic button-toggles + */ +@Component({ + selector: 'button-toggle-overview-example', + templateUrl: 'button-toggle-overview-example.html', +}) +export class ButtonToggleOverviewExample {} diff --git a/src/assets/angular-material-examples/button-types/button-types-example.css b/src/assets/angular-material-examples/button-types/button-types-example.css new file mode 100644 index 00000000..9771bda6 --- /dev/null +++ b/src/assets/angular-material-examples/button-types/button-types-example.css @@ -0,0 +1,5 @@ +.example-button-row { + display: flex; + align-items: center; + justify-content: space-around; +} diff --git a/src/assets/angular-material-examples/button-types/button-types-example.html b/src/assets/angular-material-examples/button-types/button-types-example.html new file mode 100644 index 00000000..1a9b5b20 --- /dev/null +++ b/src/assets/angular-material-examples/button-types/button-types-example.html @@ -0,0 +1,64 @@ +

Basic Buttons

+
+ + + + + + Link +
+ +

Raised Buttons

+
+ + + + + + Link +
+ +

Icon Buttons

+
+ + + + + +
+ +

Fab Buttons

+
+ + + + + + + Link +
+ +

Mini Fab Buttons

+
+ + + + + + + Link +
diff --git a/src/assets/angular-material-examples/button-types/button-types-example.ts b/src/assets/angular-material-examples/button-types/button-types-example.ts new file mode 100644 index 00000000..525729b2 --- /dev/null +++ b/src/assets/angular-material-examples/button-types/button-types-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Button varieties + */ +@Component({ + selector: 'button-types-example', + templateUrl: 'button-types-example.html', + styleUrls: ['button-types-example.css'], +}) +export class ButtonTypesExample {} diff --git a/src/assets/angular-material-examples/card-fancy/card-fancy-example.css b/src/assets/angular-material-examples/card-fancy/card-fancy-example.css new file mode 100644 index 00000000..e0d1c50e --- /dev/null +++ b/src/assets/angular-material-examples/card-fancy/card-fancy-example.css @@ -0,0 +1,8 @@ +.example-card { + width: 400px; +} + +.example-header-image { + background-image: url('/assets/images/examples/shiba1.jpg'); + background-size: cover; +} diff --git a/src/assets/angular-material-examples/card-fancy/card-fancy-example.html b/src/assets/angular-material-examples/card-fancy/card-fancy-example.html new file mode 100644 index 00000000..d7001d5d --- /dev/null +++ b/src/assets/angular-material-examples/card-fancy/card-fancy-example.html @@ -0,0 +1,19 @@ + + +
+ Shiba Inu + Dog Breed +
+ Photo of a Shiba Inu + +

+ The Shiba Inu is the smallest of the six original and distinct spitz breeds of dog from Japan. + A small, agile dog that copes very well with mountainous terrain, the Shiba Inu was originally + bred for hunting. +

+
+ + + + +
diff --git a/src/assets/angular-material-examples/card-fancy/card-fancy-example.ts b/src/assets/angular-material-examples/card-fancy/card-fancy-example.ts new file mode 100644 index 00000000..92826ad0 --- /dev/null +++ b/src/assets/angular-material-examples/card-fancy/card-fancy-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Card with multiple sections + */ +@Component({ + selector: 'card-fancy-example', + templateUrl: 'card-fancy-example.html', + styleUrls: ['card-fancy-example.css'], +}) +export class CardFancyExample {} diff --git a/src/assets/angular-material-examples/card-overview/card-overview-example.css b/src/assets/angular-material-examples/card-overview/card-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/card-overview/card-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/card-overview/card-overview-example.html b/src/assets/angular-material-examples/card-overview/card-overview-example.html new file mode 100644 index 00000000..5e0c2b6d --- /dev/null +++ b/src/assets/angular-material-examples/card-overview/card-overview-example.html @@ -0,0 +1 @@ +Simple card diff --git a/src/assets/angular-material-examples/card-overview/card-overview-example.ts b/src/assets/angular-material-examples/card-overview/card-overview-example.ts new file mode 100644 index 00000000..f87f9401 --- /dev/null +++ b/src/assets/angular-material-examples/card-overview/card-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic cards + */ +@Component({ + selector: 'card-overview-example', + templateUrl: 'card-overview-example.html', +}) +export class CardOverviewExample {} diff --git a/src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.css b/src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.css new file mode 100644 index 00000000..527bb2a3 --- /dev/null +++ b/src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.css @@ -0,0 +1,39 @@ +/* Structure */ +.example-container { + display: flex; + flex-direction: column; + min-width: 300px; +} + +/* + * Styles to make the demo's cdk-table match the material design spec + * https://material.io/guidelines/components/data-tables.html + */ +.example-table { + flex: 1 1 auto; + overflow: auto; + max-height: 500px; +} + +.example-header-row, .example-row { + display: flex; + border-bottom: 1px solid #ccc; + align-items: center; + height: 32px; + padding: 0 8px; +} + +.example-cell, .example-header-cell { + flex: 1; +} + +.example-header-cell { + font-size: 12px; + font-weight: bold; + color: rgba(0, 0, 0, 0.54); +} + +.example-cell { + font-size: 13px; + color: rgba(0, 0, 0, 0.87); +} diff --git a/src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.html b/src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.html new file mode 100644 index 00000000..df20a4d1 --- /dev/null +++ b/src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.html @@ -0,0 +1,36 @@ +
+ + + + + + ID + {{row.id}} + + + + + Progress + {{row.progress}}% + + + + + Name + {{row.name}} + + + + + Color + + {{row.color}} + + + + + + +
diff --git a/src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.ts b/src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.ts new file mode 100644 index 00000000..80975595 --- /dev/null +++ b/src/assets/angular-material-examples/cdk-table-basic/cdk-table-basic-example.ts @@ -0,0 +1,92 @@ +import {Component} from '@angular/core'; +import {DataSource} from '@angular/cdk/collections'; +import {BehaviorSubject} from 'rxjs/BehaviorSubject'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/operator/startWith'; +import 'rxjs/add/observable/merge'; +import 'rxjs/add/operator/map'; + +/** + * @title Basic CDK data-table + */ +@Component({ + selector: 'cdk-table-basic-example', + styleUrls: ['cdk-table-basic-example.css'], + templateUrl: 'cdk-table-basic-example.html', +}) +export class CdkTableBasicExample { + displayedColumns = ['userId', 'userName', 'progress', 'color']; + exampleDatabase = new ExampleDatabase(); + dataSource: ExampleDataSource | null; + + ngOnInit() { + this.dataSource = new ExampleDataSource(this.exampleDatabase); + } +} + +/** Constants used to fill up our data base. */ +const COLORS = ['maroon', 'red', 'orange', 'yellow', 'olive', 'green', 'purple', + 'fuchsia', 'lime', 'teal', 'aqua', 'blue', 'navy', 'black', 'gray']; +const NAMES = ['Maia', 'Asher', 'Olivia', 'Atticus', 'Amelia', 'Jack', + 'Charlotte', 'Theodore', 'Isla', 'Oliver', 'Isabella', 'Jasper', + 'Cora', 'Levi', 'Violet', 'Arthur', 'Mia', 'Thomas', 'Elizabeth']; + +export interface UserData { + id: string; + name: string; + progress: string; + color: string; +} + +/** An example database that the data source uses to retrieve data for the table. */ +export class ExampleDatabase { + /** Stream that emits whenever the data has been modified. */ + dataChange: BehaviorSubject = new BehaviorSubject([]); + get data(): UserData[] { return this.dataChange.value; } + + constructor() { + // Fill up the database with 100 users. + for (let i = 0; i < 100; i++) { this.addUser(); } + } + + /** Adds a new user to the database. */ + addUser() { + const copiedData = this.data.slice(); + copiedData.push(this.createNewUser()); + this.dataChange.next(copiedData); + } + + /** Builds and returns a new User. */ + private createNewUser() { + const name = + NAMES[Math.round(Math.random() * (NAMES.length - 1))] + ' ' + + NAMES[Math.round(Math.random() * (NAMES.length - 1))].charAt(0) + '.'; + + return { + id: (this.data.length + 1).toString(), + name: name, + progress: Math.round(Math.random() * 100).toString(), + color: COLORS[Math.round(Math.random() * (COLORS.length - 1))] + }; + } +} + +/** + * Data source to provide what data should be rendered in the table. Note that the data source + * can retrieve its data in any way. In this case, the data source is provided a reference + * to a common data base, ExampleDatabase. It is not the data source's responsibility to manage + * the underlying data. Instead, it only needs to take the data and send the table exactly what + * should be rendered. + */ +export class ExampleDataSource extends DataSource { + constructor(private _exampleDatabase: ExampleDatabase) { + super(); + } + + /** Connect function called by the table to retrieve one stream containing the data to render. */ + connect(): Observable { + return this._exampleDatabase.dataChange; + } + + disconnect() {} +} diff --git a/src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.css b/src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.css new file mode 100644 index 00000000..558293fb --- /dev/null +++ b/src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.css @@ -0,0 +1,14 @@ +.example-h2 { + margin: 10px; +} + +.example-section { + display: flex; + align-content: center; + align-items: center; + height: 60px; +} + +.example-margin { + margin: 0 10px; +} diff --git a/src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.html b/src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.html new file mode 100644 index 00000000..7b8fb4c2 --- /dev/null +++ b/src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.html @@ -0,0 +1,40 @@ + + +

Checkbox configuration

+ +
+ Checked + Indeterminate +
+ +
+ + + Start + End + +
+ +
+ Disabled +
+
+
+ + + +

Result

+ +
+ + I'm a checkbox + +
+
+
+ diff --git a/src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.ts b/src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.ts new file mode 100644 index 00000000..f4bdf570 --- /dev/null +++ b/src/assets/angular-material-examples/checkbox-configurable/checkbox-configurable-example.ts @@ -0,0 +1,16 @@ +import {Component} from '@angular/core'; + +/** + * @title Configurable checkbox + */ +@Component({ + selector: 'checkbox-configurable-example', + templateUrl: 'checkbox-configurable-example.html', + styleUrls: ['checkbox-configurable-example.css'], +}) +export class CheckboxConfigurableExample { + checked = false; + indeterminate = false; + align = 'start'; + disabled = false; +} diff --git a/src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.css b/src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.html b/src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.html new file mode 100644 index 00000000..c301bbe5 --- /dev/null +++ b/src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.html @@ -0,0 +1 @@ +Check me! diff --git a/src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.ts b/src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.ts new file mode 100644 index 00000000..2c822582 --- /dev/null +++ b/src/assets/angular-material-examples/checkbox-overview/checkbox-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic checkboxes + */ +@Component({ + selector: 'checkbox-overview-example', + templateUrl: 'checkbox-overview-example.html', +}) +export class CheckboxOverviewExample {} diff --git a/src/assets/angular-material-examples/chips-input/chips-input-example.css b/src/assets/angular-material-examples/chips-input/chips-input-example.css new file mode 100644 index 00000000..505a4c66 --- /dev/null +++ b/src/assets/angular-material-examples/chips-input/chips-input-example.css @@ -0,0 +1,3 @@ +.demo-chip-list { + width: 100%; +} diff --git a/src/assets/angular-material-examples/chips-input/chips-input-example.html b/src/assets/angular-material-examples/chips-input/chips-input-example.html new file mode 100644 index 00000000..f80ef315 --- /dev/null +++ b/src/assets/angular-material-examples/chips-input/chips-input-example.html @@ -0,0 +1,14 @@ + + + + {{fruit.name}} + cancel + + + + diff --git a/src/assets/angular-material-examples/chips-input/chips-input-example.ts b/src/assets/angular-material-examples/chips-input/chips-input-example.ts new file mode 100644 index 00000000..0e96d086 --- /dev/null +++ b/src/assets/angular-material-examples/chips-input/chips-input-example.ts @@ -0,0 +1,52 @@ +import {Component} from '@angular/core'; +import {MdChipInputEvent, ENTER} from '@angular/material'; + +const COMMA = 188; + +/** + * @title Chips with input + */ +@Component({ + selector: 'chips-input-example', + templateUrl: 'chips-input-example.html', + styleUrls: ['chips-input-example.css'] +}) +export class ChipsInputExample { + visible: boolean = true; + selectable: boolean = true; + removable: boolean = true; + addOnBlur: boolean = true; + + // Enter, comma + separatorKeysCodes = [ENTER, COMMA]; + + fruits = [ + { name: 'Lemon' }, + { name: 'Lime' }, + { name: 'Apple' }, + ]; + + + add(event: MdChipInputEvent): void { + let input = event.input; + let value = event.value; + + // Add our person + if ((value || '').trim()) { + this.fruits.push({ name: value.trim() }); + } + + // Reset the input value + if (input) { + input.value = ''; + } + } + + remove(fruit: any): void { + let index = this.fruits.indexOf(fruit); + + if (index >= 0) { + this.fruits.splice(index, 1); + } + } +} diff --git a/src/assets/angular-material-examples/chips-overview/chips-overview-example.css b/src/assets/angular-material-examples/chips-overview/chips-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/chips-overview/chips-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/chips-overview/chips-overview-example.html b/src/assets/angular-material-examples/chips-overview/chips-overview-example.html new file mode 100644 index 00000000..bb041056 --- /dev/null +++ b/src/assets/angular-material-examples/chips-overview/chips-overview-example.html @@ -0,0 +1,6 @@ + + One fish + Two fish + Primary fish + Accent fish + diff --git a/src/assets/angular-material-examples/chips-overview/chips-overview-example.ts b/src/assets/angular-material-examples/chips-overview/chips-overview-example.ts new file mode 100644 index 00000000..68c8c63d --- /dev/null +++ b/src/assets/angular-material-examples/chips-overview/chips-overview-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic chips + */ +@Component({ + selector: 'chips-overview-example', + templateUrl: 'chips-overview-example.html', + styleUrls: ['chips-overview-example.css'], +}) +export class ChipsOverviewExample {} diff --git a/src/assets/angular-material-examples/chips-stacked/chips-stacked-example.css b/src/assets/angular-material-examples/chips-stacked/chips-stacked-example.css new file mode 100644 index 00000000..dfb2f8c0 --- /dev/null +++ b/src/assets/angular-material-examples/chips-stacked/chips-stacked-example.css @@ -0,0 +1,3 @@ +md-chip { + max-width: 200px; +} diff --git a/src/assets/angular-material-examples/chips-stacked/chips-stacked-example.html b/src/assets/angular-material-examples/chips-stacked/chips-stacked-example.html new file mode 100644 index 00000000..27677b1c --- /dev/null +++ b/src/assets/angular-material-examples/chips-stacked/chips-stacked-example.html @@ -0,0 +1,7 @@ + + + {{chipColor.name}} + + diff --git a/src/assets/angular-material-examples/chips-stacked/chips-stacked-example.ts b/src/assets/angular-material-examples/chips-stacked/chips-stacked-example.ts new file mode 100644 index 00000000..816c2264 --- /dev/null +++ b/src/assets/angular-material-examples/chips-stacked/chips-stacked-example.ts @@ -0,0 +1,20 @@ +import {Component} from '@angular/core'; + +/** + * @title Stacked chips + */ +@Component({ + selector: 'chips-stacked-example', + templateUrl: 'chips-stacked-example.html', + styleUrls: ['chips-stacked-example.css'], +}) +export class ChipsStackedExample { + color: string; + + availableColors = [ + { name: 'none', color: '' }, + { name: 'Primary', color: 'primary' }, + { name: 'Accent', color: 'accent' }, + { name: 'Warn', color: 'warn' } + ]; +} diff --git a/src/assets/angular-material-examples/datepicker-api/datepicker-api-example.css b/src/assets/angular-material-examples/datepicker-api/datepicker-api-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-api/datepicker-api-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/datepicker-api/datepicker-api-example.html b/src/assets/angular-material-examples/datepicker-api/datepicker-api-example.html new file mode 100644 index 00000000..a41723d8 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-api/datepicker-api-example.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/angular-material-examples/datepicker-api/datepicker-api-example.ts b/src/assets/angular-material-examples/datepicker-api/datepicker-api-example.ts new file mode 100644 index 00000000..cf4ce8ad --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-api/datepicker-api-example.ts @@ -0,0 +1,12 @@ +import {Component} from '@angular/core'; + +/** + * @title Datepicker API + */ +@Component({ + selector: 'datepicker-api-example', + templateUrl: 'datepicker-api-example.html', + styleUrls: ['datepicker-api-example.css'], +}) +export class DatepickerApiExample { +} diff --git a/src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.css b/src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.html b/src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.html new file mode 100644 index 00000000..4fc367db --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.ts b/src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.ts new file mode 100644 index 00000000..a2fe6d13 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-filter/datepicker-filter-example.ts @@ -0,0 +1,17 @@ +import {Component} from '@angular/core'; + +/** + * @title Datepicker Filter + */ +@Component({ + selector: 'datepicker-filter-example', + templateUrl: 'datepicker-filter-example.html', + styleUrls: ['datepicker-filter-example.css'], +}) +export class DatepickerFilterExample { + myFilter = (d: Date): boolean => { + const day = d.getDay(); + // Prevent Saturday and Sunday from being selected. + return day !== 0 && day !== 6; + } +} diff --git a/src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.css b/src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.html b/src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.html new file mode 100644 index 00000000..216fcd26 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.ts b/src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.ts new file mode 100644 index 00000000..fea707bb --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-min-max/datepicker-min-max-example.ts @@ -0,0 +1,14 @@ +import {Component} from '@angular/core'; + +/** + * @title Datepicker Min Max + */ +@Component({ + selector: 'datepicker-min-max-example', + templateUrl: 'datepicker-min-max-example.html', + styleUrls: ['datepicker-min-max-example.css'], +}) +export class DatepickerMinMaxExample { + minDate = new Date(2000, 0, 1); + maxDate = new Date(2020, 0, 1); +} diff --git a/src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.css b/src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.html b/src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.html new file mode 100644 index 00000000..41a2ba3c --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.ts b/src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.ts new file mode 100644 index 00000000..b9dde7ca --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-overview/datepicker-overview-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic datepicker + */ +@Component({ + selector: 'datepicker-overview-example', + templateUrl: 'datepicker-overview-example.html', + styleUrls: ['datepicker-overview-example.css'], +}) +export class DatepickerOverviewExample {} diff --git a/src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.css b/src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.html b/src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.html new file mode 100644 index 00000000..0391c9be --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.ts b/src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.ts new file mode 100644 index 00000000..cb76dba2 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-start-view/datepicker-start-view-example.ts @@ -0,0 +1,13 @@ +import {Component} from '@angular/core'; + +/** + * @title Datepicker start date + */ +@Component({ + selector: 'datepicker-start-view-example', + templateUrl: 'datepicker-start-view-example.html', + styleUrls: ['datepicker-start-view-example.css'], +}) +export class DatepickerStartViewExample { + startDate = new Date(1990, 0, 1); +} diff --git a/src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.css b/src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.html b/src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.html new file mode 100644 index 00000000..a9579710 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.ts b/src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.ts new file mode 100644 index 00000000..df5daa92 --- /dev/null +++ b/src/assets/angular-material-examples/datepicker-touch/datepicker-touch-example.ts @@ -0,0 +1,12 @@ +import {Component} from '@angular/core'; + +/** + * @title Datepicker Touch + */ +@Component({ + selector: 'datepicker-touch-example', + templateUrl: 'datepicker-touch-example.html', + styleUrls: ['datepicker-touch-example.css'], +}) +export class DatepickerTouchExample { +} diff --git a/src/assets/angular-material-examples/dialog-content/dialog-content-example-dialog.html b/src/assets/angular-material-examples/dialog-content/dialog-content-example-dialog.html new file mode 100644 index 00000000..46c978da --- /dev/null +++ b/src/assets/angular-material-examples/dialog-content/dialog-content-example-dialog.html @@ -0,0 +1,25 @@ +

Install Angular

+ +

DEVELOP ACROSS ALL PLATFORMS

+

Learn one way to build applications with Angular and reuse your code and abilities to build + apps for any deployment target. For web, mobile web, native mobile and native desktop.

+ +

SPEED & PERFORMANCE

+

Achieve the maximum speed possible on the Web Platform today, and take it further, via Web + Workers and server-side rendering. Angular puts you in control over scalability. Meet huge data requirements + by building data models on RxJS, Immutable.js or another push-model.

+ +

INCREDIBLE TOOLING

+

Build features quickly with simple, declarative templates. Extend the template language with your own + components and use a wide array of existing components. Get immediate Angular-specific help and feedback + with nearly every IDE and editor. All this comes together so you can focus on building amazing apps rather + than trying to make the code work.

+ +

LOVED BY MILLIONS

+

From prototype through global deployment, Angular delivers the productivity and scalable infrastructure + that supports Google's largest applications.

+
+ + + + diff --git a/src/assets/angular-material-examples/dialog-content/dialog-content-example.css b/src/assets/angular-material-examples/dialog-content/dialog-content-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/dialog-content/dialog-content-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/dialog-content/dialog-content-example.html b/src/assets/angular-material-examples/dialog-content/dialog-content-example.html new file mode 100644 index 00000000..176a3c41 --- /dev/null +++ b/src/assets/angular-material-examples/dialog-content/dialog-content-example.html @@ -0,0 +1 @@ + diff --git a/src/assets/angular-material-examples/dialog-content/dialog-content-example.ts b/src/assets/angular-material-examples/dialog-content/dialog-content-example.ts new file mode 100644 index 00000000..39b0d453 --- /dev/null +++ b/src/assets/angular-material-examples/dialog-content/dialog-content-example.ts @@ -0,0 +1,29 @@ +import {Component} from '@angular/core'; +import {MdDialog} from '@angular/material'; + +/** + * @title Dialog with header, scrollable content and actions + */ +@Component({ + selector: 'dialog-content-example', + templateUrl: 'dialog-content-example.html', +}) +export class DialogContentExample { + constructor(public dialog: MdDialog) {} + + openDialog() { + const dialogRef = this.dialog.open(DialogContentExampleDialog, { + height: '350px' + }); + + dialogRef.afterClosed().subscribe(result => { + console.log(`Dialog result: ${result}`); + }); + } +} + +@Component({ + selector: 'dialog-content-example-dialog', + templateUrl: 'dialog-content-example-dialog.html', +}) +export class DialogContentExampleDialog {} diff --git a/src/assets/angular-material-examples/dialog-data/dialog-data-example-dialog.html b/src/assets/angular-material-examples/dialog-data/dialog-data-example-dialog.html new file mode 100644 index 00000000..aa9b428e --- /dev/null +++ b/src/assets/angular-material-examples/dialog-data/dialog-data-example-dialog.html @@ -0,0 +1,15 @@ +

Favorite Animal

+
+ My favorite animal is: +
    +
  • + Panda +
  • +
  • + Unicorn +
  • +
  • + Lion +
  • +
+
diff --git a/src/assets/angular-material-examples/dialog-data/dialog-data-example.css b/src/assets/angular-material-examples/dialog-data/dialog-data-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/dialog-data/dialog-data-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/dialog-data/dialog-data-example.html b/src/assets/angular-material-examples/dialog-data/dialog-data-example.html new file mode 100644 index 00000000..176a3c41 --- /dev/null +++ b/src/assets/angular-material-examples/dialog-data/dialog-data-example.html @@ -0,0 +1 @@ + diff --git a/src/assets/angular-material-examples/dialog-data/dialog-data-example.ts b/src/assets/angular-material-examples/dialog-data/dialog-data-example.ts new file mode 100644 index 00000000..bdd0f4bc --- /dev/null +++ b/src/assets/angular-material-examples/dialog-data/dialog-data-example.ts @@ -0,0 +1,29 @@ +import {Component, Inject} from '@angular/core'; +import {MdDialog, MD_DIALOG_DATA} from '@angular/material'; + +/** + * @title Injecting data when opening a dialog + */ +@Component({ + selector: 'dialog-data-example', + templateUrl: 'dialog-data-example.html', +}) +export class DialogDataExample { + constructor(public dialog: MdDialog) {} + + openDialog() { + this.dialog.open(DialogDataExampleDialog, { + data: { + animal: 'panda' + } + }); + } +} + +@Component({ + selector: 'dialog-data-example-dialog', + templateUrl: 'dialog-data-example-dialog.html', +}) +export class DialogDataExampleDialog { + constructor(@Inject(MD_DIALOG_DATA) public data: any) {} +} diff --git a/src/assets/angular-material-examples/dialog-elements/dialog-elements-example-dialog.html b/src/assets/angular-material-examples/dialog-elements/dialog-elements-example-dialog.html new file mode 100644 index 00000000..5238b0eb --- /dev/null +++ b/src/assets/angular-material-examples/dialog-elements/dialog-elements-example-dialog.html @@ -0,0 +1,5 @@ +

Dialog with elements

+
This dialog showcases the title, close, content and actions elements.
+
+ +
diff --git a/src/assets/angular-material-examples/dialog-elements/dialog-elements-example.css b/src/assets/angular-material-examples/dialog-elements/dialog-elements-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/dialog-elements/dialog-elements-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/dialog-elements/dialog-elements-example.html b/src/assets/angular-material-examples/dialog-elements/dialog-elements-example.html new file mode 100644 index 00000000..40637c4b --- /dev/null +++ b/src/assets/angular-material-examples/dialog-elements/dialog-elements-example.html @@ -0,0 +1 @@ + diff --git a/src/assets/angular-material-examples/dialog-elements/dialog-elements-example.ts b/src/assets/angular-material-examples/dialog-elements/dialog-elements-example.ts new file mode 100644 index 00000000..37f3703e --- /dev/null +++ b/src/assets/angular-material-examples/dialog-elements/dialog-elements-example.ts @@ -0,0 +1,24 @@ +import {Component} from '@angular/core'; +import {MdDialog} from '@angular/material'; + +/** + * @title Dialog elements + */ +@Component({ + selector: 'dialog-elements-example', + templateUrl: 'dialog-elements-example.html', +}) +export class DialogElementsExample { + constructor(public dialog: MdDialog) { } + + openDialog() { + this.dialog.open(DialogElementsExampleDialog); + } +} + + +@Component({ + selector: 'dialog-elements-example-dialog', + templateUrl: 'dialog-elements-example-dialog.html', +}) +export class DialogElementsExampleDialog { } diff --git a/src/assets/angular-material-examples/dialog-overview/dialog-overview-example-dialog.html b/src/assets/angular-material-examples/dialog-overview/dialog-overview-example-dialog.html new file mode 100644 index 00000000..b4214fbf --- /dev/null +++ b/src/assets/angular-material-examples/dialog-overview/dialog-overview-example-dialog.html @@ -0,0 +1,11 @@ +

Hi {{data.name}}

+
+

What's your favorite animal?

+ + + +
+
+ + +
diff --git a/src/assets/angular-material-examples/dialog-overview/dialog-overview-example.css b/src/assets/angular-material-examples/dialog-overview/dialog-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/dialog-overview/dialog-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/dialog-overview/dialog-overview-example.html b/src/assets/angular-material-examples/dialog-overview/dialog-overview-example.html new file mode 100644 index 00000000..b6911190 --- /dev/null +++ b/src/assets/angular-material-examples/dialog-overview/dialog-overview-example.html @@ -0,0 +1,13 @@ +
    +
  1. + + + +
  2. +
  3. + +
  4. +
  5. + You chose: {{animal}} +
  6. +
diff --git a/src/assets/angular-material-examples/dialog-overview/dialog-overview-example.ts b/src/assets/angular-material-examples/dialog-overview/dialog-overview-example.ts new file mode 100644 index 00000000..5dec934d --- /dev/null +++ b/src/assets/angular-material-examples/dialog-overview/dialog-overview-example.ts @@ -0,0 +1,46 @@ +import {Component, Inject} from '@angular/core'; +import {MdDialog, MdDialogRef, MD_DIALOG_DATA} from '@angular/material'; + +/** + * @title Dialog Overview + */ +@Component({ + selector: 'dialog-overview-example', + templateUrl: 'dialog-overview-example.html' +}) +export class DialogOverviewExample { + + animal: string; + name: string; + + constructor(public dialog: MdDialog) {} + + openDialog(): void { + let dialogRef = this.dialog.open(DialogOverviewExampleDialog, { + width: '250px', + data: { name: this.name, animal: this.animal } + }); + + dialogRef.afterClosed().subscribe(result => { + console.log('The dialog was closed'); + this.animal = result; + }); + } + +} + +@Component({ + selector: 'dialog-overview-example-dialog', + templateUrl: 'dialog-overview-example-dialog.html', +}) +export class DialogOverviewExampleDialog { + + constructor( + public dialogRef: MdDialogRef, + @Inject(MD_DIALOG_DATA) public data: any) { } + + onNoClick(): void { + this.dialogRef.close(); + } + +} diff --git a/src/assets/angular-material-examples/expansion-overview/expansion-overview-example.css b/src/assets/angular-material-examples/expansion-overview/expansion-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/expansion-overview/expansion-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/expansion-overview/expansion-overview-example.html b/src/assets/angular-material-examples/expansion-overview/expansion-overview-example.html new file mode 100644 index 00000000..48c0cc50 --- /dev/null +++ b/src/assets/angular-material-examples/expansion-overview/expansion-overview-example.html @@ -0,0 +1,18 @@ + + + + Personal data + + + Type your name and age + + + + + + + + + + + diff --git a/src/assets/angular-material-examples/expansion-overview/expansion-overview-example.ts b/src/assets/angular-material-examples/expansion-overview/expansion-overview-example.ts new file mode 100644 index 00000000..75cff7cc --- /dev/null +++ b/src/assets/angular-material-examples/expansion-overview/expansion-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic expansion panel + */ +@Component({ + selector: 'expansion-overview-example', + templateUrl: 'expansion-overview-example.html', +}) +export class ExpansionOverviewExample {} diff --git a/src/assets/angular-material-examples/expansion-steps/expansion-steps-example.css b/src/assets/angular-material-examples/expansion-steps/expansion-steps-example.css new file mode 100644 index 00000000..7a97afef --- /dev/null +++ b/src/assets/angular-material-examples/expansion-steps/expansion-steps-example.css @@ -0,0 +1,9 @@ +.example-headers-align .mat-expansion-panel-header-title, +.example-headers-align .mat-expansion-panel-header-description { + flex-basis: 0; +} + +.example-headers-align .mat-expansion-panel-header-description { + justify-content: space-between; + align-items: center; +} diff --git a/src/assets/angular-material-examples/expansion-steps/expansion-steps-example.html b/src/assets/angular-material-examples/expansion-steps/expansion-steps-example.html new file mode 100644 index 00000000..e81ede44 --- /dev/null +++ b/src/assets/angular-material-examples/expansion-steps/expansion-steps-example.html @@ -0,0 +1,69 @@ + + + + + Personal data + + + Type your name and age + account_circle + + + + + + + + + + + + + + + + + + + + Destination + + + Type the country name + map + + + + + + + + + + + + + + + + + Day of the trip + + + Inform the date you wish to travel + date_range + + + + + + + + + + + + + + + diff --git a/src/assets/angular-material-examples/expansion-steps/expansion-steps-example.ts b/src/assets/angular-material-examples/expansion-steps/expansion-steps-example.ts new file mode 100644 index 00000000..e302175f --- /dev/null +++ b/src/assets/angular-material-examples/expansion-steps/expansion-steps-example.ts @@ -0,0 +1,25 @@ +import {Component} from '@angular/core'; + +/** + * @title Expansion panel as accordion + */ +@Component({ + selector: 'expansion-steps-example', + templateUrl: 'expansion-steps-example.html', + styleUrls: ['expansion-steps-example.css'] +}) +export class ExpansionStepsExample { + step = 0; + + setStep(index: number) { + this.step = index; + } + + nextStep() { + this.step++; + } + + prevStep() { + this.step--; + } +} diff --git a/src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.css b/src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.html b/src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.html new file mode 100644 index 00000000..19c84dd5 --- /dev/null +++ b/src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.html @@ -0,0 +1,9 @@ + + + {{tile.text}} + + diff --git a/src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.ts b/src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.ts new file mode 100644 index 00000000..21dc729a --- /dev/null +++ b/src/assets/angular-material-examples/grid-list-dynamic/grid-list-dynamic-example.ts @@ -0,0 +1,17 @@ +import {Component} from '@angular/core'; + +/** + * @title Dynamic grid-list + */ +@Component({ + selector: 'grid-list-dynamic-example', + templateUrl: 'grid-list-dynamic-example.html', +}) +export class GridListDynamicExample { + tiles = [ + {text: 'One', cols: 3, rows: 1, color: 'lightblue'}, + {text: 'Two', cols: 1, rows: 2, color: 'lightgreen'}, + {text: 'Three', cols: 1, rows: 1, color: 'lightpink'}, + {text: 'Four', cols: 2, rows: 1, color: '#DDBDF1'}, + ]; +} diff --git a/src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.css b/src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.css new file mode 100644 index 00000000..2598f58f --- /dev/null +++ b/src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.css @@ -0,0 +1,3 @@ +md-grid-tile { + background: lightblue; +} diff --git a/src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.html b/src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.html new file mode 100644 index 00000000..6651887f --- /dev/null +++ b/src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.html @@ -0,0 +1,6 @@ + + 1 + 2 + 3 + 4 + diff --git a/src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.ts b/src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.ts new file mode 100644 index 00000000..dd03daef --- /dev/null +++ b/src/assets/angular-material-examples/grid-list-overview/grid-list-overview-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic grid-list + */ +@Component({ + selector: 'grid-list-overview-example', + styleUrls: ['grid-list-overview-example.css'], + templateUrl: 'grid-list-overview-example.html', +}) +export class GridListOverviewExample {} diff --git a/src/assets/angular-material-examples/icon-overview/icon-overview-example.css b/src/assets/angular-material-examples/icon-overview/icon-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/icon-overview/icon-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/icon-overview/icon-overview-example.html b/src/assets/angular-material-examples/icon-overview/icon-overview-example.html new file mode 100644 index 00000000..dd46af80 --- /dev/null +++ b/src/assets/angular-material-examples/icon-overview/icon-overview-example.html @@ -0,0 +1 @@ +home diff --git a/src/assets/angular-material-examples/icon-overview/icon-overview-example.ts b/src/assets/angular-material-examples/icon-overview/icon-overview-example.ts new file mode 100644 index 00000000..f81416f3 --- /dev/null +++ b/src/assets/angular-material-examples/icon-overview/icon-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic icons + */ +@Component({ + selector: 'icon-overview-example', + templateUrl: 'icon-overview-example.html', +}) +export class IconOverviewExample {} diff --git a/src/assets/angular-material-examples/icon-svg/icon-svg-example.css b/src/assets/angular-material-examples/icon-svg/icon-svg-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/icon-svg/icon-svg-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/icon-svg/icon-svg-example.html b/src/assets/angular-material-examples/icon-svg/icon-svg-example.html new file mode 100644 index 00000000..ac74cf79 --- /dev/null +++ b/src/assets/angular-material-examples/icon-svg/icon-svg-example.html @@ -0,0 +1 @@ + diff --git a/src/assets/angular-material-examples/icon-svg/icon-svg-example.ts b/src/assets/angular-material-examples/icon-svg/icon-svg-example.ts new file mode 100644 index 00000000..7bf6a01a --- /dev/null +++ b/src/assets/angular-material-examples/icon-svg/icon-svg-example.ts @@ -0,0 +1,18 @@ +import {Component} from '@angular/core'; +import {DomSanitizer} from '@angular/platform-browser'; +import {MdIconRegistry} from '@angular/material'; + +/** + * @title SVG icons + */ +@Component({ + selector: 'icon-svg-example', + templateUrl: 'icon-svg-example.html', +}) +export class IconSvgExample { + constructor(iconRegistry: MdIconRegistry, sanitizer: DomSanitizer) { + iconRegistry.addSvgIcon( + 'thumbs-up', + sanitizer.bypassSecurityTrustResourceUrl('assets/images/examples/thumbup-icon.svg')); + } +} diff --git a/src/assets/angular-material-examples/input-clearable/input-clearable-example.css b/src/assets/angular-material-examples/input-clearable/input-clearable-example.css new file mode 100644 index 00000000..55dcc576 --- /dev/null +++ b/src/assets/angular-material-examples/input-clearable/input-clearable-example.css @@ -0,0 +1,3 @@ +.example-form-field { + width: 200px; +} diff --git a/src/assets/angular-material-examples/input-clearable/input-clearable-example.html b/src/assets/angular-material-examples/input-clearable/input-clearable-example.html new file mode 100644 index 00000000..c8be13f9 --- /dev/null +++ b/src/assets/angular-material-examples/input-clearable/input-clearable-example.html @@ -0,0 +1,6 @@ + + + + diff --git a/src/assets/angular-material-examples/input-clearable/input-clearable-example.ts b/src/assets/angular-material-examples/input-clearable/input-clearable-example.ts new file mode 100644 index 00000000..3b469528 --- /dev/null +++ b/src/assets/angular-material-examples/input-clearable/input-clearable-example.ts @@ -0,0 +1,13 @@ +import {Component} from '@angular/core'; + +/** + * @title Input Clearable + */ +@Component({ + selector: 'input-clearable-example', + templateUrl: './input-clearable-example.html', + styleUrls: ['./input-clearable-example.css'], +}) +export class InputClearableExample { + value = 'Clear me'; +} diff --git a/src/assets/angular-material-examples/input-errors/input-errors-example.css b/src/assets/angular-material-examples/input-errors/input-errors-example.css new file mode 100644 index 00000000..08fa6753 --- /dev/null +++ b/src/assets/angular-material-examples/input-errors/input-errors-example.css @@ -0,0 +1,9 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; +} + +.example-full-width { + width: 100%; +} diff --git a/src/assets/angular-material-examples/input-errors/input-errors-example.html b/src/assets/angular-material-examples/input-errors/input-errors-example.html new file mode 100644 index 00000000..4434b6ea --- /dev/null +++ b/src/assets/angular-material-examples/input-errors/input-errors-example.html @@ -0,0 +1,11 @@ +
+ + + + Please enter a valid email address + + + Email is required + + +
diff --git a/src/assets/angular-material-examples/input-errors/input-errors-example.ts b/src/assets/angular-material-examples/input-errors/input-errors-example.ts new file mode 100644 index 00000000..8a2dbb86 --- /dev/null +++ b/src/assets/angular-material-examples/input-errors/input-errors-example.ts @@ -0,0 +1,20 @@ +import {Component} from '@angular/core'; +import {FormControl, Validators} from '@angular/forms'; + +const EMAIL_REGEX = /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; + +/** + * @title Input Errors + */ +@Component({ + selector: 'input-errors-example', + templateUrl: 'input-errors-example.html', + styleUrls: ['input-errors-example.css'], +}) +export class InputErrorsExample { + + emailFormControl = new FormControl('', [ + Validators.required, + Validators.pattern(EMAIL_REGEX)]); + +} diff --git a/src/assets/angular-material-examples/input-form/input-form-example.css b/src/assets/angular-material-examples/input-form/input-form-example.css new file mode 100644 index 00000000..08fa6753 --- /dev/null +++ b/src/assets/angular-material-examples/input-form/input-form-example.css @@ -0,0 +1,9 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; +} + +.example-full-width { + width: 100%; +} diff --git a/src/assets/angular-material-examples/input-form/input-form-example.html b/src/assets/angular-material-examples/input-form/input-form-example.html new file mode 100644 index 00000000..f7abf808 --- /dev/null +++ b/src/assets/angular-material-examples/input-form/input-form-example.html @@ -0,0 +1,36 @@ +
+ + + + + + + +
+ + + +
+ +

+ + + + + + +

+ + + + + +
+ + + + + + {{postalCode.value.length}} / 5 +
+
diff --git a/src/assets/angular-material-examples/input-form/input-form-example.ts b/src/assets/angular-material-examples/input-form/input-form-example.ts new file mode 100644 index 00000000..192f9cae --- /dev/null +++ b/src/assets/angular-material-examples/input-form/input-form-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Inputs in a form + */ +@Component({ + selector: 'input-form-example', + templateUrl: 'input-form-example.html', + styleUrls: ['input-form-example.css'], +}) +export class InputFormExample {} diff --git a/src/assets/angular-material-examples/input-hint/input-hint-example.css b/src/assets/angular-material-examples/input-hint/input-hint-example.css new file mode 100644 index 00000000..08fa6753 --- /dev/null +++ b/src/assets/angular-material-examples/input-hint/input-hint-example.css @@ -0,0 +1,9 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; +} + +.example-full-width { + width: 100%; +} diff --git a/src/assets/angular-material-examples/input-hint/input-hint-example.html b/src/assets/angular-material-examples/input-hint/input-hint-example.html new file mode 100644 index 00000000..f7e36d1d --- /dev/null +++ b/src/assets/angular-material-examples/input-hint/input-hint-example.html @@ -0,0 +1,9 @@ +
+ + + + Don't disclose personal info + {{message.value.length}} / 256 + + +
diff --git a/src/assets/angular-material-examples/input-hint/input-hint-example.ts b/src/assets/angular-material-examples/input-hint/input-hint-example.ts new file mode 100644 index 00000000..3b3a5ebc --- /dev/null +++ b/src/assets/angular-material-examples/input-hint/input-hint-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Input hints + */ +@Component({ + selector: 'input-hint-example', + templateUrl: 'input-hint-example.html', + styleUrls: ['input-hint-example.css'], +}) +export class InputHintExample { } diff --git a/src/assets/angular-material-examples/input-overview/input-overview-example.css b/src/assets/angular-material-examples/input-overview/input-overview-example.css new file mode 100644 index 00000000..08fa6753 --- /dev/null +++ b/src/assets/angular-material-examples/input-overview/input-overview-example.css @@ -0,0 +1,9 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; +} + +.example-full-width { + width: 100%; +} diff --git a/src/assets/angular-material-examples/input-overview/input-overview-example.html b/src/assets/angular-material-examples/input-overview/input-overview-example.html new file mode 100644 index 00000000..cae5b1f0 --- /dev/null +++ b/src/assets/angular-material-examples/input-overview/input-overview-example.html @@ -0,0 +1,5 @@ +
+ + + +
diff --git a/src/assets/angular-material-examples/input-overview/input-overview-example.ts b/src/assets/angular-material-examples/input-overview/input-overview-example.ts new file mode 100644 index 00000000..b7d1f30b --- /dev/null +++ b/src/assets/angular-material-examples/input-overview/input-overview-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic Inputs + */ +@Component({ + selector: 'input-overview-example', + styleUrls: ['input-overview-example.css'], + templateUrl: 'input-overview-example.html', +}) +export class InputOverviewExample {} diff --git a/src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.css b/src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.css new file mode 100644 index 00000000..08fa6753 --- /dev/null +++ b/src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.css @@ -0,0 +1,9 @@ +.example-form { + min-width: 150px; + max-width: 500px; + width: 100%; +} + +.example-full-width { + width: 100%; +} diff --git a/src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.html b/src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.html new file mode 100644 index 00000000..25485d1f --- /dev/null +++ b/src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.html @@ -0,0 +1,9 @@ +
+ + + +1   + + mode_edit + + +
diff --git a/src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.ts b/src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.ts new file mode 100644 index 00000000..00ed164c --- /dev/null +++ b/src/assets/angular-material-examples/input-prefix-suffix/input-prefix-suffix-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Input Prefixes and Suffixes + */ +@Component({ + selector: 'input-prefix-suffix-example', + templateUrl: 'input-prefix-suffix-example.html', + styleUrls: ['input-prefix-suffix-example.css'], +}) +export class InputPrefixSuffixExample { } diff --git a/src/assets/angular-material-examples/list-overview/list-overview-example.css b/src/assets/angular-material-examples/list-overview/list-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/list-overview/list-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/list-overview/list-overview-example.html b/src/assets/angular-material-examples/list-overview/list-overview-example.html new file mode 100644 index 00000000..ada715ee --- /dev/null +++ b/src/assets/angular-material-examples/list-overview/list-overview-example.html @@ -0,0 +1,5 @@ + + Item 1 + Item 2 + Item 3 + diff --git a/src/assets/angular-material-examples/list-overview/list-overview-example.ts b/src/assets/angular-material-examples/list-overview/list-overview-example.ts new file mode 100644 index 00000000..7912329c --- /dev/null +++ b/src/assets/angular-material-examples/list-overview/list-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic list + */ +@Component({ + selector: 'list-overview-example', + templateUrl: 'list-overview-example.html', +}) +export class ListOverviewExample {} diff --git a/src/assets/angular-material-examples/list-sections/list-sections-example.css b/src/assets/angular-material-examples/list-sections/list-sections-example.css new file mode 100644 index 00000000..487bd8d4 --- /dev/null +++ b/src/assets/angular-material-examples/list-sections/list-sections-example.css @@ -0,0 +1,3 @@ +.mat-list-icon { + color: rgba(0, 0, 0, 0.54); +} diff --git a/src/assets/angular-material-examples/list-sections/list-sections-example.html b/src/assets/angular-material-examples/list-sections/list-sections-example.html new file mode 100644 index 00000000..38d20f97 --- /dev/null +++ b/src/assets/angular-material-examples/list-sections/list-sections-example.html @@ -0,0 +1,15 @@ + +

Folders

+ + folder +

{{folder.name}}

+

{{folder.updated | date}}

+
+ +

Notes

+ + note +

{{note.name}}

+

{{note.updated | date}}

+
+
diff --git a/src/assets/angular-material-examples/list-sections/list-sections-example.ts b/src/assets/angular-material-examples/list-sections/list-sections-example.ts new file mode 100644 index 00000000..63e7e4c6 --- /dev/null +++ b/src/assets/angular-material-examples/list-sections/list-sections-example.ts @@ -0,0 +1,36 @@ +import {Component} from '@angular/core'; + +/** + * @title List with sections + */ +@Component({ + selector: 'list-sections-example', + styleUrls: ['list-sections-example.css'], + templateUrl: 'list-sections-example.html', +}) +export class ListSectionsExample { + folders = [ + { + name: 'Photos', + updated: new Date('1/1/16'), + }, + { + name: 'Recipes', + updated: new Date('1/17/16'), + }, + { + name: 'Work', + updated: new Date('1/28/16'), + } + ]; + notes = [ + { + name: 'Vacation Itinerary', + updated: new Date('2/20/16'), + }, + { + name: 'Kitchen Remodel', + updated: new Date('1/18/16'), + } + ]; +} diff --git a/src/assets/angular-material-examples/list-selection/list-selection-example.css b/src/assets/angular-material-examples/list-selection/list-selection-example.css new file mode 100644 index 00000000..7949471c --- /dev/null +++ b/src/assets/angular-material-examples/list-selection/list-selection-example.css @@ -0,0 +1 @@ +/** No styles for this example. */ diff --git a/src/assets/angular-material-examples/list-selection/list-selection-example.html b/src/assets/angular-material-examples/list-selection/list-selection-example.html new file mode 100644 index 00000000..cd1d9f07 --- /dev/null +++ b/src/assets/angular-material-examples/list-selection/list-selection-example.html @@ -0,0 +1,9 @@ + + + {{shoe}} + + + +

+ Options selected: {{shoes.selectedOptions.selected.length}} +

diff --git a/src/assets/angular-material-examples/list-selection/list-selection-example.ts b/src/assets/angular-material-examples/list-selection/list-selection-example.ts new file mode 100644 index 00000000..644d3d8a --- /dev/null +++ b/src/assets/angular-material-examples/list-selection/list-selection-example.ts @@ -0,0 +1,13 @@ +import {Component} from '@angular/core'; + +/** + * @title List with selection + */ +@Component({ + selector: 'list-selection-example', + styleUrls: ['list-selection-example.css'], + templateUrl: 'list-selection-example.html', +}) +export class ListSelectionExample { + typesOfShoes = ['Boots', 'Clogs', 'Loafers', 'Moccasins', 'Sneakers']; +} diff --git a/src/assets/angular-material-examples/menu-icons/menu-icons-example.css b/src/assets/angular-material-examples/menu-icons/menu-icons-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/menu-icons/menu-icons-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/menu-icons/menu-icons-example.html b/src/assets/angular-material-examples/menu-icons/menu-icons-example.html new file mode 100644 index 00000000..e1494245 --- /dev/null +++ b/src/assets/angular-material-examples/menu-icons/menu-icons-example.html @@ -0,0 +1,17 @@ + + + + + + diff --git a/src/assets/angular-material-examples/menu-icons/menu-icons-example.ts b/src/assets/angular-material-examples/menu-icons/menu-icons-example.ts new file mode 100644 index 00000000..6c474a57 --- /dev/null +++ b/src/assets/angular-material-examples/menu-icons/menu-icons-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Menu with icons + */ +@Component({ + selector: 'menu-icons-example', + templateUrl: 'menu-icons-example.html', + styleUrls: ['menu-icons-example.css'], +}) +export class MenuIconsExample {} diff --git a/src/assets/angular-material-examples/menu-overview/menu-overview-example.css b/src/assets/angular-material-examples/menu-overview/menu-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/menu-overview/menu-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/menu-overview/menu-overview-example.html b/src/assets/angular-material-examples/menu-overview/menu-overview-example.html new file mode 100644 index 00000000..2b5d246c --- /dev/null +++ b/src/assets/angular-material-examples/menu-overview/menu-overview-example.html @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/angular-material-examples/menu-overview/menu-overview-example.ts b/src/assets/angular-material-examples/menu-overview/menu-overview-example.ts new file mode 100644 index 00000000..2858d3e7 --- /dev/null +++ b/src/assets/angular-material-examples/menu-overview/menu-overview-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic menu + */ +@Component({ + selector: 'menu-overview-example', + templateUrl: 'menu-overview-example.html', + styleUrls: ['menu-overview-example.css'], +}) +export class MenuOverviewExample {} diff --git a/src/assets/angular-material-examples/nested-menu/nested-menu-example.css b/src/assets/angular-material-examples/nested-menu/nested-menu-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/nested-menu/nested-menu-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/nested-menu/nested-menu-example.html b/src/assets/angular-material-examples/nested-menu/nested-menu-example.html new file mode 100644 index 00000000..bbfde3b9 --- /dev/null +++ b/src/assets/angular-material-examples/nested-menu/nested-menu-example.html @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/angular-material-examples/nested-menu/nested-menu-example.ts b/src/assets/angular-material-examples/nested-menu/nested-menu-example.ts new file mode 100644 index 00000000..d9d7b81e --- /dev/null +++ b/src/assets/angular-material-examples/nested-menu/nested-menu-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Nested menu + */ +@Component({ + selector: 'nested-menu-example', + templateUrl: 'nested-menu-example.html', + styleUrls: ['nested-menu-example.css'] +}) +export class NestedMenuExample {} diff --git a/src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.css b/src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.html b/src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.html new file mode 100644 index 00000000..e1ce734f --- /dev/null +++ b/src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.html @@ -0,0 +1,28 @@ + + List length: + + + + + Page size: + + + + Page size options: + + + + + + +
+
Page Change Event Properties
+
List length: {{pageEvent.length}}
+
Page size: {{pageEvent.pageSize}}
+
Page index: {{pageEvent.pageIndex}}
+
diff --git a/src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.ts b/src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.ts new file mode 100644 index 00000000..ba3df8db --- /dev/null +++ b/src/assets/angular-material-examples/paginator-configurable/paginator-configurable-example.ts @@ -0,0 +1,23 @@ +import {Component} from '@angular/core'; +import {PageEvent} from '@angular/material'; + +/** + * @title Configurable paginator + */ +@Component({ + selector: 'paginator-configurable-example', + templateUrl: 'paginator-configurable-example.html', +}) +export class PaginatorConfigurableExample { + // MdPaginator Inputs + length = 100; + pageSize = 10; + pageSizeOptions = [5, 10, 25, 100]; + + // MdPaginator Output + pageEvent: PageEvent; + + setPageSizeOptions(setPageSizeOptionsInput: string) { + this.pageSizeOptions = setPageSizeOptionsInput.split(',').map(str => +str); + } +} diff --git a/src/assets/angular-material-examples/paginator-overview/paginator-overview-example.css b/src/assets/angular-material-examples/paginator-overview/paginator-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/paginator-overview/paginator-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/paginator-overview/paginator-overview-example.html b/src/assets/angular-material-examples/paginator-overview/paginator-overview-example.html new file mode 100644 index 00000000..010a9e5d --- /dev/null +++ b/src/assets/angular-material-examples/paginator-overview/paginator-overview-example.html @@ -0,0 +1,4 @@ + + diff --git a/src/assets/angular-material-examples/paginator-overview/paginator-overview-example.ts b/src/assets/angular-material-examples/paginator-overview/paginator-overview-example.ts new file mode 100644 index 00000000..b2d305e1 --- /dev/null +++ b/src/assets/angular-material-examples/paginator-overview/paginator-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Paginator + */ +@Component({ + selector: 'paginator-overview-example', + templateUrl: 'paginator-overview-example.html', +}) +export class PaginatorOverviewExample {} diff --git a/src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.css b/src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.css new file mode 100644 index 00000000..558293fb --- /dev/null +++ b/src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.css @@ -0,0 +1,14 @@ +.example-h2 { + margin: 10px; +} + +.example-section { + display: flex; + align-content: center; + align-items: center; + height: 60px; +} + +.example-margin { + margin: 0 10px; +} diff --git a/src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.html b/src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.html new file mode 100644 index 00000000..93937b77 --- /dev/null +++ b/src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.html @@ -0,0 +1,63 @@ + + +

Progress bar configuration

+ +
+ + + + Primary + + + Accent + + + Warn + + +
+ +
+ + + + Determinate + + + Indeterminate + + + Buffer + + + Query + + +
+ +
+ + +
+
+ + +
+
+
+ + + +

Result

+ +
+ + +
+
+
diff --git a/src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.ts b/src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.ts new file mode 100644 index 00000000..101408dc --- /dev/null +++ b/src/assets/angular-material-examples/progress-bar-configurable/progress-bar-configurable-example.ts @@ -0,0 +1,16 @@ +import {Component} from '@angular/core'; + +/** + * @title Configurable progress-bar + */ +@Component({ + selector: 'progress-bar-configurable-example', + templateUrl: 'progress-bar-configurable-example.html', + styleUrls: ['progress-bar-configurable-example.css'], +}) +export class ProgressBarConfigurableExample { + color = 'primary'; + mode = 'determinate'; + value = 50; + bufferValue = 75; +} diff --git a/src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.css b/src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.html b/src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.html new file mode 100644 index 00000000..8ab16e9c --- /dev/null +++ b/src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.html @@ -0,0 +1 @@ + diff --git a/src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.ts b/src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.ts new file mode 100644 index 00000000..67a6c94d --- /dev/null +++ b/src/assets/angular-material-examples/progress-bar-overview/progress-bar-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic progress-bar + */ +@Component({ + selector: 'progress-bar-overview-example', + templateUrl: 'progress-bar-overview-example.html', +}) +export class ProgressBarOverviewExample {} diff --git a/src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.css b/src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.css new file mode 100644 index 00000000..558293fb --- /dev/null +++ b/src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.css @@ -0,0 +1,14 @@ +.example-h2 { + margin: 10px; +} + +.example-section { + display: flex; + align-content: center; + align-items: center; + height: 60px; +} + +.example-margin { + margin: 0 10px; +} diff --git a/src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.html b/src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.html new file mode 100644 index 00000000..1ba3183a --- /dev/null +++ b/src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.html @@ -0,0 +1,49 @@ + + +

Progress spinner configuration

+ +
+ + + + Primary + + + Accent + + + Warn + + +
+ +
+ + + + Determinate + + + Indeterminate + + +
+ +
+ + +
+
+
+ + +

Result

+ + + +
+
diff --git a/src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.ts b/src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.ts new file mode 100644 index 00000000..ed1ca870 --- /dev/null +++ b/src/assets/angular-material-examples/progress-spinner-configurable/progress-spinner-configurable-example.ts @@ -0,0 +1,15 @@ +import {Component} from '@angular/core'; + +/** + * @title Configurable progress spinner + */ +@Component({ + selector: 'progress-spinner-configurable-example', + templateUrl: 'progress-spinner-configurable-example.html', + styleUrls: ['progress-spinner-configurable-example.css'], +}) +export class ProgressSpinnerConfigurableExample { + color = 'primary'; + mode = 'determinate'; + value = 50; +} diff --git a/src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.css b/src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.html b/src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.html new file mode 100644 index 00000000..cd768c67 --- /dev/null +++ b/src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.html @@ -0,0 +1 @@ + diff --git a/src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.ts b/src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.ts new file mode 100644 index 00000000..67ada8ad --- /dev/null +++ b/src/assets/angular-material-examples/progress-spinner-overview/progress-spinner-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic progress-spinner + */ +@Component({ + selector: 'progress-spinner-overview-example', + templateUrl: 'progress-spinner-overview-example.html', +}) +export class ProgressSpinnerOverviewExample {} diff --git a/src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.css b/src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.css new file mode 100644 index 00000000..f70c1b3b --- /dev/null +++ b/src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.css @@ -0,0 +1,12 @@ +.example-radio-group { + display: inline-flex; + flex-direction: column; +} + +.example-radio-button { + margin: 5px; +} + +.example-selected-value { + margin: 15px 0; +} diff --git a/src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.html b/src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.html new file mode 100644 index 00000000..108971b5 --- /dev/null +++ b/src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.html @@ -0,0 +1,6 @@ + + + {{season}} + + +
Your favorite season is: {{favoriteSeason}}
diff --git a/src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.ts b/src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.ts new file mode 100644 index 00000000..52fc5157 --- /dev/null +++ b/src/assets/angular-material-examples/radio-ng-model/radio-ng-model-example.ts @@ -0,0 +1,20 @@ +import {Component} from '@angular/core'; + +/** + * @title Radios with ngModel + */ +@Component({ + selector: 'radio-ng-model-example', + templateUrl: 'radio-ng-model-example.html', + styleUrls: ['radio-ng-model-example.css'], +}) +export class RadioNgModelExample { + favoriteSeason: string; + + seasons = [ + 'Winter', + 'Spring', + 'Summer', + 'Autumn', + ]; +} diff --git a/src/assets/angular-material-examples/radio-overview/radio-overview-example.css b/src/assets/angular-material-examples/radio-overview/radio-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/radio-overview/radio-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/radio-overview/radio-overview-example.html b/src/assets/angular-material-examples/radio-overview/radio-overview-example.html new file mode 100644 index 00000000..4038381c --- /dev/null +++ b/src/assets/angular-material-examples/radio-overview/radio-overview-example.html @@ -0,0 +1,4 @@ + + Option 1 + Option 2 + diff --git a/src/assets/angular-material-examples/radio-overview/radio-overview-example.ts b/src/assets/angular-material-examples/radio-overview/radio-overview-example.ts new file mode 100644 index 00000000..916ce663 --- /dev/null +++ b/src/assets/angular-material-examples/radio-overview/radio-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic radios + */ +@Component({ + selector: 'radio-overview-example', + templateUrl: 'radio-overview-example.html', +}) +export class RadioOverviewExample {} diff --git a/src/assets/angular-material-examples/select-form/select-form-example.css b/src/assets/angular-material-examples/select-form/select-form-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/select-form/select-form-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/select-form/select-form-example.html b/src/assets/angular-material-examples/select-form/select-form-example.html new file mode 100644 index 00000000..6dea33cc --- /dev/null +++ b/src/assets/angular-material-examples/select-form/select-form-example.html @@ -0,0 +1,9 @@ +
+ + + {{food.viewValue}} + + + +

Selected value: {{selectedValue}}

+
diff --git a/src/assets/angular-material-examples/select-form/select-form-example.ts b/src/assets/angular-material-examples/select-form/select-form-example.ts new file mode 100644 index 00000000..0bb2c305 --- /dev/null +++ b/src/assets/angular-material-examples/select-form/select-form-example.ts @@ -0,0 +1,18 @@ +import {Component} from '@angular/core'; + +/** + * @title Select in a form + */ +@Component({ + selector: 'select-form-example', + templateUrl: 'select-form-example.html', +}) +export class SelectFormExample { + selectedValue: string; + + foods = [ + {value: 'steak-0', viewValue: 'Steak'}, + {value: 'pizza-1', viewValue: 'Pizza'}, + {value: 'tacos-2', viewValue: 'Tacos'} + ]; +} diff --git a/src/assets/angular-material-examples/select-overview/select-overview-example.css b/src/assets/angular-material-examples/select-overview/select-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/select-overview/select-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/select-overview/select-overview-example.html b/src/assets/angular-material-examples/select-overview/select-overview-example.html new file mode 100644 index 00000000..a4017ca5 --- /dev/null +++ b/src/assets/angular-material-examples/select-overview/select-overview-example.html @@ -0,0 +1,5 @@ + + + {{ food.viewValue }} + + diff --git a/src/assets/angular-material-examples/select-overview/select-overview-example.ts b/src/assets/angular-material-examples/select-overview/select-overview-example.ts new file mode 100644 index 00000000..a6a2ff82 --- /dev/null +++ b/src/assets/angular-material-examples/select-overview/select-overview-example.ts @@ -0,0 +1,16 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic select + */ +@Component({ + selector: 'select-overview-example', + templateUrl: 'select-overview-example.html', +}) +export class SelectOverviewExample { + foods = [ + {value: 'steak-0', viewValue: 'Steak'}, + {value: 'pizza-1', viewValue: 'Pizza'}, + {value: 'tacos-2', viewValue: 'Tacos'} + ]; +} diff --git a/src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.css b/src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.css new file mode 100644 index 00000000..6d58f0f2 --- /dev/null +++ b/src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.css @@ -0,0 +1,26 @@ +.example-sidenav-fab-container { + width: 500px; + height: 300px; + border: 1px solid rgba(0, 0, 0, 0.5); +} + +.example-sidenav-fab-container md-sidenav { + max-width: 200px; +} + +.example-sidenav-fab-container .mat-sidenav-content, +.example-sidenav-fab-container md-sidenav { + display: flex; + overflow: visible; +} + +.example-scrolling-content { + overflow: auto; + height: 100%; +} + +.example-fab.mat-mini-fab { + position: absolute; + right: 20px; + bottom: 10px; +} diff --git a/src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.html b/src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.html new file mode 100644 index 00000000..f194c098 --- /dev/null +++ b/src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.html @@ -0,0 +1,32 @@ + + + +
+ Lorem ipsum dolor sit amet, pede a libero aenean phasellus, lectus metus sint ut risus, + fusce vel in pellentesque. Nisl rutrum etiam morbi consectetuer tempor magna, aenean nullam + nunc id, neque vivamus interdum sociis nulla scelerisque sem, dolor id wisi turpis magna + aliquam magna. Risus accumsan hac eget etiam donec sed, senectus erat mattis quam, tempor + vel urna occaecat cras, metus urna augue nec at. Et morbi amet dui praesent, nec eu at, + ligula ipsum dui sollicitudin, quis nisl massa viverra ligula, mauris fermentum orci arcu + enim fringilla. Arcu erat nulla in aenean lacinia ullamcorper, urna ante nam et sagittis, + tristique vehicula nibh ipsum vivamus, proin proin. Porta commodo nibh quis libero amet. + Taciti dui, sapien consectetuer. +
+
+ +
+ Lorem ipsum dolor sit amet, pede a libero aenean phasellus, lectus metus sint ut risus, fusce + vel in pellentesque. Nisl rutrum etiam morbi consectetuer tempor magna, aenean nullam nunc id, + neque vivamus interdum sociis nulla scelerisque sem, dolor id wisi turpis magna aliquam magna. + Risus accumsan hac eget etiam donec sed, senectus erat mattis quam, tempor vel urna occaecat + cras, metus urna augue nec at. Et morbi amet dui praesent, nec eu at, ligula ipsum dui + sollicitudin, quis nisl massa viverra ligula, mauris fermentum orci arcu enim fringilla. Arcu + erat nulla in aenean lacinia ullamcorper, urna ante nam et sagittis, tristique vehicula nibh + ipsum vivamus, proin proin. Porta commodo nibh quis libero amet. Taciti dui, sapien + consectetuer. +
+
diff --git a/src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.ts b/src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.ts new file mode 100644 index 00000000..4af25f47 --- /dev/null +++ b/src/assets/angular-material-examples/sidenav-fab/sidenav-fab-example.ts @@ -0,0 +1,13 @@ +import {Component, ViewEncapsulation} from '@angular/core'; + +/** + * @title Sidenav with a FAB + */ +@Component({ + selector: 'sidenav-fab-example', + templateUrl: 'sidenav-fab-example.html', + styleUrls: ['sidenav-fab-example.css'], + encapsulation: ViewEncapsulation.None, + preserveWhitespaces: false, +}) +export class SidenavFabExample {} diff --git a/src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.css b/src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.css new file mode 100644 index 00000000..8ab00588 --- /dev/null +++ b/src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.css @@ -0,0 +1,16 @@ +.example-container { + width: 500px; + height: 300px; + border: 1px solid rgba(0, 0, 0, 0.5); +} + +.example-sidenav-content { + display: flex; + height: 100%; + align-items: center; + justify-content: center; +} + +.example-sidenav { + padding: 20px; +} diff --git a/src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.html b/src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.html new file mode 100644 index 00000000..757e4b2d --- /dev/null +++ b/src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.html @@ -0,0 +1,12 @@ + + + Jolly good! + + +
+ +
+ +
diff --git a/src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.ts b/src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.ts new file mode 100644 index 00000000..5496f3f4 --- /dev/null +++ b/src/assets/angular-material-examples/sidenav-overview/sidenav-overview-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic sidenav + */ +@Component({ + selector: 'sidenav-overview-example', + templateUrl: 'sidenav-overview-example.html', + styleUrls: ['sidenav-overview-example.css'], +}) +export class SidenavOverviewExample {} diff --git a/src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.css b/src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.css new file mode 100644 index 00000000..060532ee --- /dev/null +++ b/src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.css @@ -0,0 +1,14 @@ +.example-h2 { + margin: 10px; +} + +.example-section { + display: flex; + align-content: center; + align-items: center; + height: 60px; +} + +.example-margin { + margin: 10px; +} diff --git a/src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.html b/src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.html new file mode 100644 index 00000000..88099f4b --- /dev/null +++ b/src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.html @@ -0,0 +1,44 @@ + + +

Slider configuration

+ +
+ + + + Primary + + + Accent + + + Warn + + +
+ +
+ Checked +
+ +
+ Disabled +
+
+
+ + + +

Result

+ +
+ + Slide me! + +
+
+
diff --git a/src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.ts b/src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.ts new file mode 100644 index 00000000..17835efb --- /dev/null +++ b/src/assets/angular-material-examples/slide-toggle-configurable/slide-toggle-configurable-example.ts @@ -0,0 +1,15 @@ +import {Component} from '@angular/core'; + +/** + * @title Configurable slide-toggle + */ +@Component({ + selector: 'slide-toggle-configurable-example', + templateUrl: 'slide-toggle-configurable-example.html', + styleUrls: ['slide-toggle-configurable-example.css'], +}) +export class SlideToggleConfigurableExample { + color = 'accent'; + checked = false; + disabled = false; +} diff --git a/src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.css b/src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.css new file mode 100644 index 00000000..8567e7f8 --- /dev/null +++ b/src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.css @@ -0,0 +1,4 @@ +.example-form md-slide-toggle { + margin: 8px 0; + display: block; +} diff --git a/src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.html b/src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.html new file mode 100644 index 00000000..0a2b897d --- /dev/null +++ b/src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.html @@ -0,0 +1,25 @@ +

Slide Toggle using a simple NgModel.

+ +Slide Toggle Checked: {{ isChecked }} + +

Slide Toggle inside of a Template-driven form

+ +
+ + Enable Wifi + Accept Terms of Service + + +
+ +

Slide Toggle inside of a Reactive form

+ +
+ + Enable Wifi + Accept Terms of Service + +

Form Group Status: {{ formGroup.status}}

+ + +
diff --git a/src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.ts b/src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.ts new file mode 100644 index 00000000..2636c474 --- /dev/null +++ b/src/assets/angular-material-examples/slide-toggle-forms/slide-toggle-forms-example.ts @@ -0,0 +1,26 @@ +import {Component} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; + +/** + * @title Slide-toggle with forms + */ +@Component({ + selector: 'slide-toggle-forms-example', + templateUrl: './slide-toggle-forms-example.html', + styleUrls: ['./slide-toggle-forms-example.css'], +}) +export class SlideToggleFormsExample { + isChecked = true; + formGroup: FormGroup; + + constructor(formBuilder: FormBuilder) { + this.formGroup = formBuilder.group({ + enableWifi: '', + acceptTerms: ['', Validators.requiredTrue] + }); + } + + onFormSubmit(formValue: any) { + alert(JSON.stringify(formValue, null, 2)); + } +} diff --git a/src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.css b/src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.html b/src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.html new file mode 100644 index 00000000..6b9586e1 --- /dev/null +++ b/src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.html @@ -0,0 +1 @@ +Slide me! diff --git a/src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.ts b/src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.ts new file mode 100644 index 00000000..6ed08696 --- /dev/null +++ b/src/assets/angular-material-examples/slide-toggle-overview/slide-toggle-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic slide-toggles + */ +@Component({ + selector: 'slide-toggle-overview-example', + templateUrl: 'slide-toggle-overview-example.html', +}) +export class SlideToggleOverviewExample {} diff --git a/src/assets/angular-material-examples/slider-configurable/slider-configurable-example.css b/src/assets/angular-material-examples/slider-configurable/slider-configurable-example.css new file mode 100644 index 00000000..1f954ba8 --- /dev/null +++ b/src/assets/angular-material-examples/slider-configurable/slider-configurable-example.css @@ -0,0 +1,22 @@ +.example-h2 { + margin: 10px; +} + +.example-section { + display: flex; + align-content: center; + align-items: center; + height: 60px; +} + +.example-margin { + margin: 10px; +} + +.mat-slider-horizontal { + width: 300px; +} + +.mat-slider-vertical { + height: 300px; +} diff --git a/src/assets/angular-material-examples/slider-configurable/slider-configurable-example.html b/src/assets/angular-material-examples/slider-configurable/slider-configurable-example.html new file mode 100644 index 00000000..5eb3214f --- /dev/null +++ b/src/assets/angular-material-examples/slider-configurable/slider-configurable-example.html @@ -0,0 +1,63 @@ + + +

Slider configuration

+ +
+ + + + + + + + + + + + +
+ +
+ Show ticks + + Auto ticks + + + + +
+ +
+ Show thumb label +
+ +
+ Vertical + Inverted +
+ +
+ Disabled +
+ +
+
+ + + +

Result

+ + + +
+
diff --git a/src/assets/angular-material-examples/slider-configurable/slider-configurable-example.ts b/src/assets/angular-material-examples/slider-configurable/slider-configurable-example.ts new file mode 100644 index 00000000..caee9ab5 --- /dev/null +++ b/src/assets/angular-material-examples/slider-configurable/slider-configurable-example.ts @@ -0,0 +1,32 @@ +import {Component, ViewEncapsulation} from '@angular/core'; + +/** + * @title Configurable slider + */ +@Component({ + selector: 'slider-configurable-example', + templateUrl: 'slider-configurable-example.html', + styleUrls: ['slider-configurable-example.css'], + encapsulation: ViewEncapsulation.None, + preserveWhitespaces: false, +}) +export class SliderConfigurableExample { + autoTicks = false; + disabled = false; + invert = false; + max = 100; + min = 0; + showTicks = false; + step = 1; + thumbLabel = false; + value = 0; + vertical = false; + + get tickInterval(): number | 'auto' { + return this.showTicks ? (this.autoTicks ? 'auto' : this._tickInterval) : 0; + } + set tickInterval(v) { + this._tickInterval = Number(v); + } + private _tickInterval = 1; +} diff --git a/src/assets/angular-material-examples/slider-overview/slider-overview-example.css b/src/assets/angular-material-examples/slider-overview/slider-overview-example.css new file mode 100644 index 00000000..8dfe08cc --- /dev/null +++ b/src/assets/angular-material-examples/slider-overview/slider-overview-example.css @@ -0,0 +1,4 @@ +/** No CSS for this example */ +md-slider { + width: 300px; +} diff --git a/src/assets/angular-material-examples/slider-overview/slider-overview-example.html b/src/assets/angular-material-examples/slider-overview/slider-overview-example.html new file mode 100644 index 00000000..9a92c8f8 --- /dev/null +++ b/src/assets/angular-material-examples/slider-overview/slider-overview-example.html @@ -0,0 +1 @@ + diff --git a/src/assets/angular-material-examples/slider-overview/slider-overview-example.ts b/src/assets/angular-material-examples/slider-overview/slider-overview-example.ts new file mode 100644 index 00000000..3284b3ae --- /dev/null +++ b/src/assets/angular-material-examples/slider-overview/slider-overview-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic slider + */ +@Component({ + selector: 'slider-overview-example', + templateUrl: 'slider-overview-example.html', + styleUrls: ['slider-overview-example.css'], +}) +export class SliderOverviewExample {} diff --git a/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example-snack.css b/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example-snack.css new file mode 100644 index 00000000..fa7dc674 --- /dev/null +++ b/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example-snack.css @@ -0,0 +1,3 @@ +.example-pizza-party { + color: hotpink; +} diff --git a/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example-snack.html b/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example-snack.html new file mode 100644 index 00000000..cfba7c45 --- /dev/null +++ b/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example-snack.html @@ -0,0 +1,3 @@ + + Pizza party!!! 🍕 + diff --git a/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example.html b/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example.html new file mode 100644 index 00000000..69fe01bc --- /dev/null +++ b/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example.html @@ -0,0 +1,3 @@ + diff --git a/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example.ts b/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example.ts new file mode 100644 index 00000000..8aac00a1 --- /dev/null +++ b/src/assets/angular-material-examples/snack-bar-component/snack-bar-component-example.ts @@ -0,0 +1,27 @@ +import {Component} from '@angular/core'; +import {MdSnackBar} from '@angular/material'; + +/** + * @title Snack-bar with a custom component + */ +@Component({ + selector: 'snack-bar-component-example', + templateUrl: 'snack-bar-component-example.html', +}) +export class SnackBarComponentExample { + constructor(public snackBar: MdSnackBar) {} + + openSnackBar() { + this.snackBar.openFromComponent(PizzaPartyComponent, { + duration: 500, + }); + } +} + + +@Component({ + selector: 'snack-bar-component-example-snack', + templateUrl: 'snack-bar-component-example-snack.html', + styleUrls: ['snack-bar-component-example-snack.css'], +}) +export class PizzaPartyComponent {} diff --git a/src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.css b/src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.html b/src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.html new file mode 100644 index 00000000..757612c1 --- /dev/null +++ b/src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.ts b/src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.ts new file mode 100644 index 00000000..4d1980dc --- /dev/null +++ b/src/assets/angular-material-examples/snack-bar-overview/snack-bar-overview-example.ts @@ -0,0 +1,19 @@ +import {Component} from '@angular/core'; +import {MdSnackBar} from '@angular/material'; + +/** + * @title Basic snack-bar + */ +@Component({ + selector: 'snack-bar-overview-example', + templateUrl: 'snack-bar-overview-example.html', +}) +export class SnackBarOverviewExample { + constructor(public snackBar: MdSnackBar) {} + + openSnackBar(message: string, action: string) { + this.snackBar.open(message, action, { + duration: 2000, + }); + } +} diff --git a/src/assets/angular-material-examples/sort-overview/sort-overview-example.css b/src/assets/angular-material-examples/sort-overview/sort-overview-example.css new file mode 100644 index 00000000..5d2cd6d6 --- /dev/null +++ b/src/assets/angular-material-examples/sort-overview/sort-overview-example.css @@ -0,0 +1,3 @@ +.mat-sort-header-container { + align-items: center; +} diff --git a/src/assets/angular-material-examples/sort-overview/sort-overview-example.html b/src/assets/angular-material-examples/sort-overview/sort-overview-example.html new file mode 100644 index 00000000..342f3855 --- /dev/null +++ b/src/assets/angular-material-examples/sort-overview/sort-overview-example.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + +
Dessert (100g)CaloriesFat (g)Carbs (g)Protein (g)
{{dessert.name}}{{dessert.calories}}{{dessert.fat}}{{dessert.carbs}}{{dessert.protein}}
diff --git a/src/assets/angular-material-examples/sort-overview/sort-overview-example.ts b/src/assets/angular-material-examples/sort-overview/sort-overview-example.ts new file mode 100644 index 00000000..58b19b39 --- /dev/null +++ b/src/assets/angular-material-examples/sort-overview/sort-overview-example.ts @@ -0,0 +1,50 @@ +import {Component} from '@angular/core'; +import {Sort} from '@angular/material'; + +/** + * @title Sorting overview + */ +@Component({ + selector: 'sort-overview-example', + templateUrl: 'sort-overview-example.html', + styleUrls: ['sort-overview-example.css'], +}) +export class SortOverviewExample { + desserts = [ + {name: 'Frozen yogurt', calories: '159', fat: '6', carbs: '24', protein: '4'}, + {name: 'Ice cream sandwich', calories: '237', fat: '9', carbs: '37', protein: '4'}, + {name: 'Eclair', calories: '262', fat: '16', carbs: '24', protein: '6'}, + {name: 'Cupcake', calories: '305', fat: '4', carbs: '67', protein: '4'}, + {name: 'Gingerbread', calories: '356', fat: '16', carbs: '49', protein: '4'}, + ]; + + sortedData; + + constructor() { + this.sortedData = this.desserts.slice(); + } + + sortData(sort: Sort) { + const data = this.desserts.slice(); + if (!sort.active || sort.direction == '') { + this.sortedData = data; + return; + } + + this.sortedData = data.sort((a, b) => { + let isAsc = sort.direction == 'asc'; + switch (sort.active) { + case 'name': return compare(a.name, b.name, isAsc); + case 'calories': return compare(+a.calories, +b.calories, isAsc); + case 'fat': return compare(+a.fat, +b.fat, isAsc); + case 'carbs': return compare(+a.carbs, +b.carbs, isAsc); + case 'protein': return compare(+a.protein, +b.protein, isAsc); + default: return 0; + } + }); + } +} + +function compare(a, b, isAsc) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); +} diff --git a/src/assets/angular-material-examples/stepper-overview/stepper-overview-example.css b/src/assets/angular-material-examples/stepper-overview/stepper-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/stepper-overview/stepper-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/stepper-overview/stepper-overview-example.html b/src/assets/angular-material-examples/stepper-overview/stepper-overview-example.html new file mode 100644 index 00000000..4e4408a1 --- /dev/null +++ b/src/assets/angular-material-examples/stepper-overview/stepper-overview-example.html @@ -0,0 +1,33 @@ + + + +
+ Fill out your name + + + +
+ +
+
+
+ +
+ Fill out your address + + + +
+ + +
+
+
+ + Done + You are now done. +
+ +
+
+
diff --git a/src/assets/angular-material-examples/stepper-overview/stepper-overview-example.ts b/src/assets/angular-material-examples/stepper-overview/stepper-overview-example.ts new file mode 100644 index 00000000..717dcb5d --- /dev/null +++ b/src/assets/angular-material-examples/stepper-overview/stepper-overview-example.ts @@ -0,0 +1,27 @@ +import {Component} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; + +/** + * @title Stepper overview + */ +@Component({ + selector: 'stepper-overview-example', + templateUrl: 'stepper-overview-example.html', + styleUrls: ['stepper-overview-example.css'] +}) +export class StepperOverviewExample { + isLinear = false; + firstFormGroup: FormGroup; + secondFormGroup: FormGroup; + + constructor(private _formBuilder: FormBuilder) { } + + ngOnInit() { + this.firstFormGroup = this._formBuilder.group({ + firstCtrl: ['', Validators.required] + }); + this.secondFormGroup = this._formBuilder.group({ + secondCtrl: ['', Validators.required] + }); + } +} diff --git a/src/assets/angular-material-examples/table-basic/table-basic-example.css b/src/assets/angular-material-examples/table-basic/table-basic-example.css new file mode 100644 index 00000000..8b311e6d --- /dev/null +++ b/src/assets/angular-material-examples/table-basic/table-basic-example.css @@ -0,0 +1,11 @@ +.example-container { + display: flex; + flex-direction: column; + max-height: 500px; + min-width: 300px; +} + +.mat-table { + overflow: auto; + max-height: 500px; +} diff --git a/src/assets/angular-material-examples/table-basic/table-basic-example.html b/src/assets/angular-material-examples/table-basic/table-basic-example.html new file mode 100644 index 00000000..66dd020c --- /dev/null +++ b/src/assets/angular-material-examples/table-basic/table-basic-example.html @@ -0,0 +1,34 @@ +
+ + + + + + + No. + {{element.position}} + + + + + Name + {{element.name}} + + + + + Weight + {{element.weight}} + + + + + Symbol + {{element.symbol}} + + + + + +
diff --git a/src/assets/angular-material-examples/table-basic/table-basic-example.ts b/src/assets/angular-material-examples/table-basic/table-basic-example.ts new file mode 100644 index 00000000..41f41c7e --- /dev/null +++ b/src/assets/angular-material-examples/table-basic/table-basic-example.ts @@ -0,0 +1,62 @@ +import {Component} from '@angular/core'; +import {DataSource} from '@angular/cdk/collections'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; + +/** + * @title Basic table + */ +@Component({ + selector: 'table-basic-example', + styleUrls: ['table-basic-example.css'], + templateUrl: 'table-basic-example.html', +}) +export class TableBasicExample { + displayedColumns = ['position', 'name', 'weight', 'symbol']; + dataSource = new ExampleDataSource(); +} + +export interface Element { + name: string; + position: number; + weight: number; + symbol: string; +} + +const data: Element[] = [ + {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'}, + {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}, + {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'}, + {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}, + {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'}, + {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}, + {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'}, + {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'}, + {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'}, + {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'}, + {position: 11, name: 'Sodium', weight: 22.9897, symbol: 'Na'}, + {position: 12, name: 'Magnesium', weight: 24.305, symbol: 'Mg'}, + {position: 13, name: 'Aluminum', weight: 26.9815, symbol: 'Al'}, + {position: 14, name: 'Silicon', weight: 28.0855, symbol: 'Si'}, + {position: 15, name: 'Phosphorus', weight: 30.9738, symbol: 'P'}, + {position: 16, name: 'Sulfur', weight: 32.065, symbol: 'S'}, + {position: 17, name: 'Chlorine', weight: 35.453, symbol: 'Cl'}, + {position: 18, name: 'Argon', weight: 39.948, symbol: 'Ar'}, + {position: 19, name: 'Potassium', weight: 39.0983, symbol: 'K'}, + {position: 20, name: 'Calcium', weight: 40.078, symbol: 'Ca'}, +]; + +/** + * Data source to provide what data should be rendered in the table. The observable provided + * in connect should emit exactly the data that should be rendered by the table. If the data is + * altered, the observable should emit that new set of data on the stream. In our case here, + * we return a stream that contains only one set of data that doesn't change. + */ +export class ExampleDataSource extends DataSource { + /** Connect function called by the table to retrieve one stream containing the data to render. */ + connect(): Observable { + return Observable.of(data); + } + + disconnect() {} +} diff --git a/src/assets/angular-material-examples/table-filtering/table-filtering-example.css b/src/assets/angular-material-examples/table-filtering/table-filtering-example.css new file mode 100644 index 00000000..51287a08 --- /dev/null +++ b/src/assets/angular-material-examples/table-filtering/table-filtering-example.css @@ -0,0 +1,26 @@ +/* Structure */ +.example-container { + display: flex; + flex-direction: column; + min-width: 300px; +} + +.example-header { + min-height: 64px; + display: flex; + align-items: baseline; + padding: 8px 24px 0; + font-size: 20px; + justify-content: space-between; +} + +.mat-form-field { + font-size: 14px; + flex-grow: 1; + margin-left: 32px; +} + +.mat-table { + overflow: auto; + max-height: 500px; +} diff --git a/src/assets/angular-material-examples/table-filtering/table-filtering-example.html b/src/assets/angular-material-examples/table-filtering/table-filtering-example.html new file mode 100644 index 00000000..c3d8ca1d --- /dev/null +++ b/src/assets/angular-material-examples/table-filtering/table-filtering-example.html @@ -0,0 +1,40 @@ +
+
+ + + +
+ + + + + + + + ID + {{row.id}} + + + + + Progress + {{row.progress}}% + + + + + Name + {{row.name}} + + + + + Color + {{row.color}} + + + + + +
diff --git a/src/assets/angular-material-examples/table-filtering/table-filtering-example.ts b/src/assets/angular-material-examples/table-filtering/table-filtering-example.ts new file mode 100644 index 00000000..8404f0c1 --- /dev/null +++ b/src/assets/angular-material-examples/table-filtering/table-filtering-example.ts @@ -0,0 +1,118 @@ +import {Component, ElementRef, ViewChild} from '@angular/core'; +import {DataSource} from '@angular/cdk/collections'; +import {BehaviorSubject} from 'rxjs/BehaviorSubject'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/operator/startWith'; +import 'rxjs/add/observable/merge'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/debounceTime'; +import 'rxjs/add/operator/distinctUntilChanged'; +import 'rxjs/add/observable/fromEvent'; + +/** + * @title Table with filtering + */ +@Component({ + selector: 'table-filtering-example', + styleUrls: ['table-filtering-example.css'], + templateUrl: 'table-filtering-example.html', +}) +export class TableFilteringExample { + displayedColumns = ['userId', 'userName', 'progress', 'color']; + exampleDatabase = new ExampleDatabase(); + dataSource: ExampleDataSource | null; + + @ViewChild('filter') filter: ElementRef; + + ngOnInit() { + this.dataSource = new ExampleDataSource(this.exampleDatabase); + Observable.fromEvent(this.filter.nativeElement, 'keyup') + .debounceTime(150) + .distinctUntilChanged() + .subscribe(() => { + if (!this.dataSource) { return; } + this.dataSource.filter = this.filter.nativeElement.value; + }); + } +} + +/** Constants used to fill up our data base. */ +const COLORS = ['maroon', 'red', 'orange', 'yellow', 'olive', 'green', 'purple', + 'fuchsia', 'lime', 'teal', 'aqua', 'blue', 'navy', 'black', 'gray']; +const NAMES = ['Maia', 'Asher', 'Olivia', 'Atticus', 'Amelia', 'Jack', + 'Charlotte', 'Theodore', 'Isla', 'Oliver', 'Isabella', 'Jasper', + 'Cora', 'Levi', 'Violet', 'Arthur', 'Mia', 'Thomas', 'Elizabeth']; + +export interface UserData { + id: string; + name: string; + progress: string; + color: string; +} + +/** An example database that the data source uses to retrieve data for the table. */ +export class ExampleDatabase { + /** Stream that emits whenever the data has been modified. */ + dataChange: BehaviorSubject = new BehaviorSubject([]); + get data(): UserData[] { return this.dataChange.value; } + + constructor() { + // Fill up the database with 100 users. + for (let i = 0; i < 100; i++) { this.addUser(); } + } + + /** Adds a new user to the database. */ + addUser() { + const copiedData = this.data.slice(); + copiedData.push(this.createNewUser()); + this.dataChange.next(copiedData); + } + + /** Builds and returns a new User. */ + private createNewUser() { + const name = + NAMES[Math.round(Math.random() * (NAMES.length - 1))] + ' ' + + NAMES[Math.round(Math.random() * (NAMES.length - 1))].charAt(0) + '.'; + + return { + id: (this.data.length + 1).toString(), + name: name, + progress: Math.round(Math.random() * 100).toString(), + color: COLORS[Math.round(Math.random() * (COLORS.length - 1))] + }; + } +} + +/** + * Data source to provide what data should be rendered in the table. Note that the data source + * can retrieve its data in any way. In this case, the data source is provided a reference + * to a common data base, ExampleDatabase. It is not the data source's responsibility to manage + * the underlying data. Instead, it only needs to take the data and send the table exactly what + * should be rendered. + */ +export class ExampleDataSource extends DataSource { + _filterChange = new BehaviorSubject(''); + get filter(): string { return this._filterChange.value; } + set filter(filter: string) { this._filterChange.next(filter); } + + constructor(private _exampleDatabase: ExampleDatabase) { + super(); + } + + /** Connect function called by the table to retrieve one stream containing the data to render. */ + connect(): Observable { + const displayDataChanges = [ + this._exampleDatabase.dataChange, + this._filterChange, + ]; + + return Observable.merge(...displayDataChanges).map(() => { + return this._exampleDatabase.data.slice().filter((item: UserData) => { + let searchStr = (item.name + item.color).toLowerCase(); + return searchStr.indexOf(this.filter.toLowerCase()) != -1; + }); + }); + } + + disconnect() {} +} diff --git a/src/assets/angular-material-examples/table-http/table-http-example.css b/src/assets/angular-material-examples/table-http/table-http-example.css new file mode 100644 index 00000000..185ff44b --- /dev/null +++ b/src/assets/angular-material-examples/table-http/table-http-example.css @@ -0,0 +1,57 @@ +/* Structure */ +.example-container { + display: flex; + flex-direction: column; + max-height: 500px; + min-width: 300px; + position: relative; +} + +.example-header { + min-height: 64px; + display: flex; + align-items: center; + padding-left: 24px; + font-size: 20px; +} + +.example-table { + overflow: auto; + min-height: 300px; +} + +.mat-column-title { + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + overflow: hidden; +} + +/* Column Widths */ +.mat-column-number, +.mat-column-state { + max-width: 64px; +} + +.mat-column-created { + max-width: 124px; +} + +.example-loading-shade { + position: absolute; + top: 0; + left: 0; + bottom: 56px; + right: 0; + background: rgba(0, 0, 0, 0.15); + z-index: 1; + display: flex; + align-items: center; + justify-content: center; +} + +.example-rate-limit-reached { + color: #980000; + max-width: 360px; + text-align: center; +} diff --git a/src/assets/angular-material-examples/table-http/table-http-example.html b/src/assets/angular-material-examples/table-http/table-http-example.html new file mode 100644 index 00000000..b74b898a --- /dev/null +++ b/src/assets/angular-material-examples/table-http/table-http-example.html @@ -0,0 +1,51 @@ +
+
+ +
+ GitHub's API rate limit has been reached. It will be reset in one minute. +
+
+ + + + + + + + # + {{ row.number }} + + + + + Title + {{ row.title }} + + + + + State + {{ row.state }} + + + + + + Created + + {{ row.created_at | date }} + + + + + + + + +
diff --git a/src/assets/angular-material-examples/table-http/table-http-example.ts b/src/assets/angular-material-examples/table-http/table-http-example.ts new file mode 100644 index 00000000..7331462b --- /dev/null +++ b/src/assets/angular-material-examples/table-http/table-http-example.ts @@ -0,0 +1,121 @@ +import {Component, OnInit, ViewChild} from '@angular/core'; +import {Http} from '@angular/http'; +import {DataSource} from '@angular/cdk/collections'; +import {MdPaginator, MdSort} from '@angular/material'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/observable/merge'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/startWith'; +import 'rxjs/add/operator/switchMap'; + +/** + * @title Table retrieving data through HTTP + */ +@Component({ + selector: 'table-http-example', + styleUrls: ['table-http-example.css'], + templateUrl: 'table-http-example.html', +}) +export class TableHttpExample implements OnInit { + displayedColumns = ['created_at', 'state', 'number', 'title']; + exampleDatabase: ExampleHttpDao | null; + dataSource: ExampleDataSource | null; + + @ViewChild(MdPaginator) paginator: MdPaginator; + @ViewChild(MdSort) sort: MdSort; + + constructor(private http: Http) {} + + ngOnInit() { + this.exampleDatabase = new ExampleHttpDao(this.http); + this.dataSource = new ExampleDataSource( + this.exampleDatabase!, this.paginator, this.sort); + } +} + +export interface GithubApi { + items: GithubIssue[]; + total_count: number; +} + +export interface GithubIssue { + created_at: string; + number: string; + state: string; + title: string; +} + +/** An example database that the data source uses to retrieve data for the table. */ +export class ExampleHttpDao { + constructor(private http: Http) {} + + getRepoIssues(sort: string, order: string, page: number): Observable { + const href = 'https://api.github.com/search/issues'; + const requestUrl = + `${href}?q=repo:angular/material2&sort=${sort}&order=${order}&page=${page + 1}`; + + return this.http.get(requestUrl) + .map(response => response.json() as GithubApi); + } +} + +/** + * Data source to provide what data should be rendered in the table. Note that the data source + * can retrieve its data in any way. In this case, the data source is provided a reference + * to a common data base, ExampleHttpDao. It is not the data source's responsibility to manage + * the underlying data. Instead, it only needs to take the data and send the table exactly what + * should be rendered. + */ +export class ExampleDataSource extends DataSource { + // The number of issues returned by github matching the query. + resultsLength = 0; + isLoadingResults = false; + isRateLimitReached = false; + + constructor(private exampleDatabase: ExampleHttpDao, + private paginator: MdPaginator, + private sort: MdSort) { + super(); + } + + /** Connect function called by the table to retrieve one stream containing the data to render. */ + connect(): Observable { + const displayDataChanges = [ + this.sort.sortChange, + this.paginator.page + ]; + + // If the user changes the sort order, reset back to the first page. + this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0); + + return Observable.merge(...displayDataChanges) + .startWith(null) + .switchMap(() => { + setTimeout(() => { + this.isLoadingResults = true; + }); + return this.exampleDatabase.getRepoIssues( + this.sort.active, this.sort.direction, this.paginator.pageIndex); + }) + .map(data => { + // Flip flag to show that loading has finished. + this.isLoadingResults = false; + this.isRateLimitReached = false; + this.resultsLength = data.total_count; + + return data.items; + }) + .catch(() => { + // Catch if the GitHub API has reached its rate limit. Return empty data. + setTimeout(() => { + this.isLoadingResults = false; + this.isRateLimitReached = true; + }); + return Observable.of([]); + }); + } + + disconnect() {} +} diff --git a/src/assets/angular-material-examples/table-overview/table-overview-example.css b/src/assets/angular-material-examples/table-overview/table-overview-example.css new file mode 100644 index 00000000..c5c27f6f --- /dev/null +++ b/src/assets/angular-material-examples/table-overview/table-overview-example.css @@ -0,0 +1,53 @@ +/* Structure */ +.example-container { + display: flex; + flex-direction: column; + min-width: 300px; +} + +.example-header { + min-height: 56px; + max-height: 56px; + display: flex; + align-items: center; + padding: 8px 24px 0; + font-size: 20px; + justify-content: space-between; + border-bottom: 1px solid transparent; +} + +.mat-form-field { + font-size: 14px; + flex-grow: 1; + margin-top: 8px; +} + +.example-no-results { + display: flex; + justify-content: center; + padding: 24px; + font-size: 12px; + font-style: italic; +} + +/** Selection styles */ +.example-selection-header { + font-size: 18px; +} + +.mat-column-select { + max-width: 54px; +} + +.mat-row:hover, .example-selected-row { + background: #f5f5f5; +} + +.mat-row:active, .mat-row.example-selected-row { + background: #eaeaea; +} + +.mat-table { + overflow: auto; + max-height: 500px; +} diff --git a/src/assets/angular-material-examples/table-overview/table-overview-example.html b/src/assets/angular-material-examples/table-overview/table-overview-example.html new file mode 100644 index 00000000..35a12176 --- /dev/null +++ b/src/assets/angular-material-examples/table-overview/table-overview-example.html @@ -0,0 +1,78 @@ +
+ + + +
+
+ {{selection.selected.length}} + {{selection.selected.length == 1 ? 'user' : 'users'}} + selected +
+ +
+ + + + + + + + + + + + + + + + + + + + ID + {{row.id}} + + + + + Progress + {{row.progress}}% + + + + + Name + {{row.name}} + + + + + Color + {{row.color}} + + + + + + + +
+ No users found matching filter. +
+ + + +
diff --git a/src/assets/angular-material-examples/table-overview/table-overview-example.ts b/src/assets/angular-material-examples/table-overview/table-overview-example.ts new file mode 100644 index 00000000..f0f9fcd4 --- /dev/null +++ b/src/assets/angular-material-examples/table-overview/table-overview-example.ts @@ -0,0 +1,190 @@ +import {Component, ElementRef, ViewChild} from '@angular/core'; +import {DataSource} from '@angular/cdk/collections'; +import {MdPaginator, MdSort} from '@angular/material'; +import {SelectionModel} from '@angular/cdk/collections'; +import {BehaviorSubject} from 'rxjs/BehaviorSubject'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/operator/startWith'; +import 'rxjs/add/observable/merge'; +import 'rxjs/add/observable/fromEvent'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/distinctUntilChanged'; +import 'rxjs/add/operator/debounceTime'; + +/** + * @title Feature-rich data table + */ +@Component({ + selector: 'table-overview-example', + styleUrls: ['table-overview-example.css'], + templateUrl: 'table-overview-example.html', +}) +export class TableOverviewExample { + displayedColumns = ['select', 'userId', 'userName', 'progress', 'color']; + exampleDatabase = new ExampleDatabase(); + selection = new SelectionModel(true, []); + dataSource: ExampleDataSource | null; + + @ViewChild(MdPaginator) paginator: MdPaginator; + @ViewChild(MdSort) sort: MdSort; + @ViewChild('filter') filter: ElementRef; + + ngOnInit() { + this.dataSource = new ExampleDataSource(this.exampleDatabase, this.paginator, this.sort); + Observable.fromEvent(this.filter.nativeElement, 'keyup') + .debounceTime(150) + .distinctUntilChanged() + .subscribe(() => { + if (!this.dataSource) { return; } + this.dataSource.filter = this.filter.nativeElement.value; + }); + } + + isAllSelected(): boolean { + if (!this.dataSource) { return false; } + if (this.selection.isEmpty()) { return false; } + + if (this.filter.nativeElement.value) { + return this.selection.selected.length == this.dataSource.renderedData.length; + } else { + return this.selection.selected.length == this.exampleDatabase.data.length; + } + } + + masterToggle() { + if (!this.dataSource) { return; } + + if (this.isAllSelected()) { + this.selection.clear(); + } else if (this.filter.nativeElement.value) { + this.dataSource.renderedData.forEach(data => this.selection.select(data.id)); + } else { + this.exampleDatabase.data.forEach(data => this.selection.select(data.id)); + } + } +} + +/** Constants used to fill up our data base. */ +const COLORS = ['maroon', 'red', 'orange', 'yellow', 'olive', 'green', 'purple', + 'fuchsia', 'lime', 'teal', 'aqua', 'blue', 'navy', 'black', 'gray']; +const NAMES = ['Maia', 'Asher', 'Olivia', 'Atticus', 'Amelia', 'Jack', + 'Charlotte', 'Theodore', 'Isla', 'Oliver', 'Isabella', 'Jasper', + 'Cora', 'Levi', 'Violet', 'Arthur', 'Mia', 'Thomas', 'Elizabeth']; + +export interface UserData { + id: string; + name: string; + progress: string; + color: string; +} + +/** An example database that the data source uses to retrieve data for the table. */ +export class ExampleDatabase { + /** Stream that emits whenever the data has been modified. */ + dataChange: BehaviorSubject = new BehaviorSubject([]); + get data(): UserData[] { return this.dataChange.value; } + + constructor() { + // Fill up the database with 100 users. + setTimeout(() => { + for (let i = 0; i < 100; i++) { this.addUser(); } + }); + } + + /** Adds a new user to the database. */ + addUser() { + const copiedData = this.data.slice(); + copiedData.push(this.createNewUser()); + this.dataChange.next(copiedData); + } + + /** Builds and returns a new User. */ + private createNewUser() { + const name = + NAMES[Math.round(Math.random() * (NAMES.length - 1))] + ' ' + + NAMES[Math.round(Math.random() * (NAMES.length - 1))].charAt(0) + '.'; + + return { + id: (this.data.length + 1).toString(), + name: name, + progress: Math.round(Math.random() * 100).toString(), + color: COLORS[Math.round(Math.random() * (COLORS.length - 1))] + }; + } +} + +/** + * Data source to provide what data should be rendered in the table. Note that the data source + * can retrieve its data in any way. In this case, the data source is provided a reference + * to a common data base, ExampleDatabase. It is not the data source's responsibility to manage + * the underlying data. Instead, it only needs to take the data and send the table exactly what + * should be rendered. + */ +export class ExampleDataSource extends DataSource { + _filterChange = new BehaviorSubject(''); + get filter(): string { return this._filterChange.value; } + set filter(filter: string) { this._filterChange.next(filter); } + + filteredData: UserData[] = []; + renderedData: UserData[] = []; + + constructor(private _exampleDatabase: ExampleDatabase, + private _paginator: MdPaginator, + private _sort: MdSort) { + super(); + + // Reset to the first page when the user changes the filter. + this._filterChange.subscribe(() => this._paginator.pageIndex = 0); + } + + /** Connect function called by the table to retrieve one stream containing the data to render. */ + connect(): Observable { + // Listen for any changes in the base data, sorting, filtering, or pagination + const displayDataChanges = [ + this._exampleDatabase.dataChange, + this._sort.sortChange, + this._filterChange, + this._paginator.page, + ]; + + return Observable.merge(...displayDataChanges).map(() => { + // Filter data + this.filteredData = this._exampleDatabase.data.slice().filter((item: UserData) => { + let searchStr = (item.name + item.color).toLowerCase(); + return searchStr.indexOf(this.filter.toLowerCase()) != -1; + }); + + // Sort filtered data + const sortedData = this.sortData(this.filteredData.slice()); + + // Grab the page's slice of the filtered sorted data. + const startIndex = this._paginator.pageIndex * this._paginator.pageSize; + this.renderedData = sortedData.splice(startIndex, this._paginator.pageSize); + return this.renderedData; + }); + } + + disconnect() {} + + /** Returns a sorted copy of the database data. */ + sortData(data: UserData[]): UserData[] { + if (!this._sort.active || this._sort.direction == '') { return data; } + + return data.sort((a, b) => { + let propertyA: number|string = ''; + let propertyB: number|string = ''; + + switch (this._sort.active) { + case 'userId': [propertyA, propertyB] = [a.id, b.id]; break; + case 'userName': [propertyA, propertyB] = [a.name, b.name]; break; + case 'progress': [propertyA, propertyB] = [a.progress, b.progress]; break; + case 'color': [propertyA, propertyB] = [a.color, b.color]; break; + } + + let valueA = isNaN(+propertyA) ? propertyA : +propertyA; + let valueB = isNaN(+propertyB) ? propertyB : +propertyB; + + return (valueA < valueB ? -1 : 1) * (this._sort.direction == 'asc' ? 1 : -1); + }); + } +} diff --git a/src/assets/angular-material-examples/table-pagination/table-pagination-example.css b/src/assets/angular-material-examples/table-pagination/table-pagination-example.css new file mode 100644 index 00000000..5b9032d1 --- /dev/null +++ b/src/assets/angular-material-examples/table-pagination/table-pagination-example.css @@ -0,0 +1,19 @@ +/* Structure */ +.example-container { + display: flex; + flex-direction: column; + min-width: 300px; +} + +.example-header { + min-height: 64px; + display: flex; + align-items: center; + padding-left: 24px; + font-size: 20px; +} + +.mat-table { + overflow: auto; + max-height: 500px; +} diff --git a/src/assets/angular-material-examples/table-pagination/table-pagination-example.html b/src/assets/angular-material-examples/table-pagination/table-pagination-example.html new file mode 100644 index 00000000..6fa6eaad --- /dev/null +++ b/src/assets/angular-material-examples/table-pagination/table-pagination-example.html @@ -0,0 +1,42 @@ +
+ + + + + + + + ID + {{row.id}} + + + + + Progress + {{row.progress}}% + + + + + Name + {{row.name}} + + + + + Color + {{row.color}} + + + + + + + + +
diff --git a/src/assets/angular-material-examples/table-pagination/table-pagination-example.ts b/src/assets/angular-material-examples/table-pagination/table-pagination-example.ts new file mode 100644 index 00000000..1434c8f6 --- /dev/null +++ b/src/assets/angular-material-examples/table-pagination/table-pagination-example.ts @@ -0,0 +1,106 @@ +import {Component, ViewChild} from '@angular/core'; +import {DataSource} from '@angular/cdk/collections'; +import {MdPaginator} from '@angular/material'; +import {BehaviorSubject} from 'rxjs/BehaviorSubject'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/operator/startWith'; +import 'rxjs/add/observable/merge'; +import 'rxjs/add/operator/map'; + +/** + * @title Table with pagination + */ +@Component({ + selector: 'table-pagination-example', + styleUrls: ['table-pagination-example.css'], + templateUrl: 'table-pagination-example.html', +}) +export class TablePaginationExample { + displayedColumns = ['userId', 'userName', 'progress', 'color']; + exampleDatabase = new ExampleDatabase(); + dataSource: ExampleDataSource | null; + + @ViewChild(MdPaginator) paginator: MdPaginator; + + ngOnInit() { + this.dataSource = new ExampleDataSource(this.exampleDatabase, this.paginator); + } +} + +/** Constants used to fill up our data base. */ +const COLORS = ['maroon', 'red', 'orange', 'yellow', 'olive', 'green', 'purple', + 'fuchsia', 'lime', 'teal', 'aqua', 'blue', 'navy', 'black', 'gray']; +const NAMES = ['Maia', 'Asher', 'Olivia', 'Atticus', 'Amelia', 'Jack', + 'Charlotte', 'Theodore', 'Isla', 'Oliver', 'Isabella', 'Jasper', + 'Cora', 'Levi', 'Violet', 'Arthur', 'Mia', 'Thomas', 'Elizabeth']; + +export interface UserData { + id: string; + name: string; + progress: string; + color: string; +} + +/** An example database that the data source uses to retrieve data for the table. */ +export class ExampleDatabase { + /** Stream that emits whenever the data has been modified. */ + dataChange: BehaviorSubject = new BehaviorSubject([]); + get data(): UserData[] { return this.dataChange.value; } + + constructor() { + // Fill up the database with 100 users. + for (let i = 0; i < 100; i++) { this.addUser(); } + } + + /** Adds a new user to the database. */ + addUser() { + const copiedData = this.data.slice(); + copiedData.push(this.createNewUser()); + this.dataChange.next(copiedData); + } + + /** Builds and returns a new User. */ + private createNewUser() { + const name = + NAMES[Math.round(Math.random() * (NAMES.length - 1))] + ' ' + + NAMES[Math.round(Math.random() * (NAMES.length - 1))].charAt(0) + '.'; + + return { + id: (this.data.length + 1).toString(), + name: name, + progress: Math.round(Math.random() * 100).toString(), + color: COLORS[Math.round(Math.random() * (COLORS.length - 1))] + }; + } +} + +/** + * Data source to provide what data should be rendered in the table. Note that the data source + * can retrieve its data in any way. In this case, the data source is provided a reference + * to a common data base, ExampleDatabase. It is not the data source's responsibility to manage + * the underlying data. Instead, it only needs to take the data and send the table exactly what + * should be rendered. + */ +export class ExampleDataSource extends DataSource { + constructor(private _exampleDatabase: ExampleDatabase, private _paginator: MdPaginator) { + super(); + } + + /** Connect function called by the table to retrieve one stream containing the data to render. */ + connect(): Observable { + const displayDataChanges = [ + this._exampleDatabase.dataChange, + this._paginator.page, + ]; + + return Observable.merge(...displayDataChanges).map(() => { + const data = this._exampleDatabase.data.slice(); + + // Grab the page's slice of data. + const startIndex = this._paginator.pageIndex * this._paginator.pageSize; + return data.splice(startIndex, this._paginator.pageSize); + }); + } + + disconnect() {} +} diff --git a/src/assets/angular-material-examples/table-sorting/table-sorting-example.css b/src/assets/angular-material-examples/table-sorting/table-sorting-example.css new file mode 100644 index 00000000..0ff9559b --- /dev/null +++ b/src/assets/angular-material-examples/table-sorting/table-sorting-example.css @@ -0,0 +1,23 @@ +/* Structure */ +.example-container { + display: flex; + flex-direction: column; + min-width: 300px; +} + +.example-header { + min-height: 64px; + display: flex; + align-items: center; + padding-left: 24px; + font-size: 20px; +} + +.mat-table { + overflow: auto; + max-height: 500px; +} + +.mat-header-cell .mat-sort-header-sorted { + color: black; +} diff --git a/src/assets/angular-material-examples/table-sorting/table-sorting-example.html b/src/assets/angular-material-examples/table-sorting/table-sorting-example.html new file mode 100644 index 00000000..cde414b6 --- /dev/null +++ b/src/assets/angular-material-examples/table-sorting/table-sorting-example.html @@ -0,0 +1,34 @@ +
+ + + + + + + ID + {{row.id}} + + + + + Progress + {{row.progress}}% + + + + + Name + {{row.name}} + + + + + Color + {{row.color}} + + + + + +
diff --git a/src/assets/angular-material-examples/table-sorting/table-sorting-example.ts b/src/assets/angular-material-examples/table-sorting/table-sorting-example.ts new file mode 100644 index 00000000..36df1764 --- /dev/null +++ b/src/assets/angular-material-examples/table-sorting/table-sorting-example.ts @@ -0,0 +1,125 @@ +import {Component, ViewChild} from '@angular/core'; +import {DataSource} from '@angular/cdk/collections'; +import {MdSort} from '@angular/material'; +import {BehaviorSubject} from 'rxjs/BehaviorSubject'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/operator/startWith'; +import 'rxjs/add/observable/merge'; +import 'rxjs/add/operator/map'; + +/** + * @title Table with sorting + */ +@Component({ + selector: 'table-sorting-example', + styleUrls: ['table-sorting-example.css'], + templateUrl: 'table-sorting-example.html', +}) +export class TableSortingExample { + displayedColumns = ['userId', 'userName', 'progress', 'color']; + exampleDatabase = new ExampleDatabase(); + dataSource: ExampleDataSource | null; + + @ViewChild(MdSort) sort: MdSort; + + ngOnInit() { + this.dataSource = new ExampleDataSource(this.exampleDatabase, this.sort); + } +} + +/** Constants used to fill up our data base. */ +const COLORS = ['maroon', 'red', 'orange', 'yellow', 'olive', 'green', 'purple', + 'fuchsia', 'lime', 'teal', 'aqua', 'blue', 'navy', 'black', 'gray']; +const NAMES = ['Maia', 'Asher', 'Olivia', 'Atticus', 'Amelia', 'Jack', + 'Charlotte', 'Theodore', 'Isla', 'Oliver', 'Isabella', 'Jasper', + 'Cora', 'Levi', 'Violet', 'Arthur', 'Mia', 'Thomas', 'Elizabeth']; + +export interface UserData { + id: string; + name: string; + progress: string; + color: string; +} + +/** An example database that the data source uses to retrieve data for the table. */ +export class ExampleDatabase { + /** Stream that emits whenever the data has been modified. */ + dataChange: BehaviorSubject = new BehaviorSubject([]); + get data(): UserData[] { return this.dataChange.value; } + + constructor() { + // Fill up the database with 100 users. + for (let i = 0; i < 100; i++) { this.addUser(); } + } + + /** Adds a new user to the database. */ + addUser() { + const copiedData = this.data.slice(); + copiedData.push(this.createNewUser()); + this.dataChange.next(copiedData); + } + + /** Builds and returns a new User. */ + private createNewUser() { + const name = + NAMES[Math.round(Math.random() * (NAMES.length - 1))] + ' ' + + NAMES[Math.round(Math.random() * (NAMES.length - 1))].charAt(0) + '.'; + + return { + id: (this.data.length + 1).toString(), + name: name, + progress: Math.round(Math.random() * 100).toString(), + color: COLORS[Math.round(Math.random() * (COLORS.length - 1))] + }; + } +} + +/** + * Data source to provide what data should be rendered in the table. Note that the data source + * can retrieve its data in any way. In this case, the data source is provided a reference + * to a common data base, ExampleDatabase. It is not the data source's responsibility to manage + * the underlying data. Instead, it only needs to take the data and send the table exactly what + * should be rendered. + */ +export class ExampleDataSource extends DataSource { + constructor(private _exampleDatabase: ExampleDatabase, private _sort: MdSort) { + super(); + } + + /** Connect function called by the table to retrieve one stream containing the data to render. */ + connect(): Observable { + const displayDataChanges = [ + this._exampleDatabase.dataChange, + this._sort.sortChange, + ]; + + return Observable.merge(...displayDataChanges).map(() => { + return this.getSortedData(); + }); + } + + disconnect() {} + + /** Returns a sorted copy of the database data. */ + getSortedData(): UserData[] { + const data = this._exampleDatabase.data.slice(); + if (!this._sort.active || this._sort.direction == '') { return data; } + + return data.sort((a, b) => { + let propertyA: number|string = ''; + let propertyB: number|string = ''; + + switch (this._sort.active) { + case 'userId': [propertyA, propertyB] = [a.id, b.id]; break; + case 'userName': [propertyA, propertyB] = [a.name, b.name]; break; + case 'progress': [propertyA, propertyB] = [a.progress, b.progress]; break; + case 'color': [propertyA, propertyB] = [a.color, b.color]; break; + } + + let valueA = isNaN(+propertyA) ? propertyA : +propertyA; + let valueB = isNaN(+propertyB) ? propertyB : +propertyB; + + return (valueA < valueB ? -1 : 1) * (this._sort.direction == 'asc' ? 1 : -1); + }); + } +} diff --git a/src/assets/angular-material-examples/tabs-overview/tabs-overview-example.css b/src/assets/angular-material-examples/tabs-overview/tabs-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/tabs-overview/tabs-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/tabs-overview/tabs-overview-example.html b/src/assets/angular-material-examples/tabs-overview/tabs-overview-example.html new file mode 100644 index 00000000..173ece5d --- /dev/null +++ b/src/assets/angular-material-examples/tabs-overview/tabs-overview-example.html @@ -0,0 +1,4 @@ + + Content 1 + Content 2 + diff --git a/src/assets/angular-material-examples/tabs-overview/tabs-overview-example.ts b/src/assets/angular-material-examples/tabs-overview/tabs-overview-example.ts new file mode 100644 index 00000000..96f70260 --- /dev/null +++ b/src/assets/angular-material-examples/tabs-overview/tabs-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic tabs + */ +@Component({ + selector: 'tabs-overview-example', + templateUrl: 'tabs-overview-example.html', +}) +export class TabsOverviewExample {} diff --git a/src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.css b/src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.css new file mode 100644 index 00000000..71d3d8b2 --- /dev/null +++ b/src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.css @@ -0,0 +1,7 @@ +.demo-tab-group { + border: 1px solid #e8e8e8; +} + +.demo-tab-content { + padding: 16px; +} diff --git a/src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.html b/src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.html new file mode 100644 index 00000000..75b5b19d --- /dev/null +++ b/src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.html @@ -0,0 +1,48 @@ + + +
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla venenatis ante augue. + Phasellus volutpat neque ac dui mattis vulputate. Etiam consequat aliquam cursus. + In sodales pretium ultrices. Maecenas lectus est, sollicitudin consectetur felis nec, + feugiat ultricies mi. Aliquam erat volutpat. Nam placerat, tortor in ultrices porttitor, + orci enim rutrum enim, vel tempor sapien arcu a tellus. +
+
+ + + ⭐ + +
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla venenatis ante augue. + Phasellus volutpat neque ac dui mattis vulputate. Etiam consequat aliquam cursus. + In sodales pretium ultrices. Maecenas lectus est, sollicitudin consectetur felis nec, + feugiat ultricies mi. Aliquam erat volutpat. Nam placerat, tortor in ultrices porttitor, + orci enim rutrum enim, vel tempor sapien arcu a tellus. +
+
+ + No content + + +
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla venenatis ante augue. + Phasellus volutpat neque ac dui mattis vulputate. Etiam consequat aliquam cursus. + In sodales pretium ultrices. Maecenas lectus est, sollicitudin consectetur felis nec, + feugiat ultricies mi. Aliquam erat volutpat. Nam placerat, tortor in ultrices porttitor, + orci enim rutrum enim, vel tempor sapien arcu a tellus. +
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla venenatis ante augue. + Phasellus volutpat neque ac dui mattis vulputate. Etiam consequat aliquam cursus. + In sodales pretium ultrices. Maecenas lectus est, sollicitudin consectetur felis nec, + feugiat ultricies mi. Aliquam erat volutpat. Nam placerat, tortor in ultrices porttitor, + orci enim rutrum enim, vel tempor sapien arcu a tellus. +
+
+ + No content + + + No content + +
\ No newline at end of file diff --git a/src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.ts b/src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.ts new file mode 100644 index 00000000..0f103327 --- /dev/null +++ b/src/assets/angular-material-examples/tabs-template-label/tabs-template-label-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Complex Example + */ +@Component({ + selector: 'tabs-template-label-example', + templateUrl: 'tabs-template-label-example.html', + styleUrls: ['./tabs-template-label-example.css'] +}) +export class TabsTemplateLabelExample {} diff --git a/src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.css b/src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.css new file mode 100644 index 00000000..d7c40156 --- /dev/null +++ b/src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.css @@ -0,0 +1,7 @@ +.example-icon { + padding: 0 14px; +} + +.example-spacer { + flex: 1 1 auto; +} diff --git a/src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.html b/src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.html new file mode 100644 index 00000000..9b178a21 --- /dev/null +++ b/src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.html @@ -0,0 +1,16 @@ + + Custom Toolbar + + + Second Line + + verified_user + + + + Third Line + + favorite + delete + + diff --git a/src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.ts b/src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.ts new file mode 100644 index 00000000..3ad53173 --- /dev/null +++ b/src/assets/angular-material-examples/toolbar-multirow/toolbar-multirow-example.ts @@ -0,0 +1,11 @@ +import {Component} from '@angular/core'; + +/** + * @title Multi-row toolbar + */ +@Component({ + selector: 'toolbar-multirow-example', + templateUrl: 'toolbar-multirow-example.html', + styleUrls: ['toolbar-multirow-example.css'], +}) +export class ToolbarMultirowExample {} diff --git a/src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.css b/src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.html b/src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.html new file mode 100644 index 00000000..bf8cc399 --- /dev/null +++ b/src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.html @@ -0,0 +1 @@ +My App diff --git a/src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.ts b/src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.ts new file mode 100644 index 00000000..5d543043 --- /dev/null +++ b/src/assets/angular-material-examples/toolbar-overview/toolbar-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic toolbar + */ +@Component({ + selector: 'toolbar-overview-example', + templateUrl: 'toolbar-overview-example.html', +}) +export class ToolbarOverviewExample {} diff --git a/src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.css b/src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.css new file mode 100644 index 00000000..74323087 --- /dev/null +++ b/src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.css @@ -0,0 +1 @@ +/** No CSS for this example */ diff --git a/src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.html b/src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.html new file mode 100644 index 00000000..8319a854 --- /dev/null +++ b/src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.html @@ -0,0 +1 @@ +I have a tooltip diff --git a/src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.ts b/src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.ts new file mode 100644 index 00000000..ffb53c02 --- /dev/null +++ b/src/assets/angular-material-examples/tooltip-overview/tooltip-overview-example.ts @@ -0,0 +1,10 @@ +import {Component} from '@angular/core'; + +/** + * @title Basic tooltip + */ +@Component({ + selector: 'tooltip-overview-example', + templateUrl: 'tooltip-overview-example.html', +}) +export class TooltipOverviewExample {} diff --git a/src/assets/angular-material-examples/tooltip-position/tooltip-position-example.css b/src/assets/angular-material-examples/tooltip-position/tooltip-position-example.css new file mode 100644 index 00000000..04ec59dd --- /dev/null +++ b/src/assets/angular-material-examples/tooltip-position/tooltip-position-example.css @@ -0,0 +1,9 @@ +.example-tooltip-host { + display: inline-flex; + align-items: center; + margin: 50px; +} + +.example-select { + margin: 0 10px; +} diff --git a/src/assets/angular-material-examples/tooltip-position/tooltip-position-example.html b/src/assets/angular-material-examples/tooltip-position/tooltip-position-example.html new file mode 100644 index 00000000..156a5bf6 --- /dev/null +++ b/src/assets/angular-material-examples/tooltip-position/tooltip-position-example.html @@ -0,0 +1,11 @@ +
+ Show tooltip + + Before + After + Above + Below + Left + Right + +
diff --git a/src/assets/angular-material-examples/tooltip-position/tooltip-position-example.ts b/src/assets/angular-material-examples/tooltip-position/tooltip-position-example.ts new file mode 100644 index 00000000..12741b77 --- /dev/null +++ b/src/assets/angular-material-examples/tooltip-position/tooltip-position-example.ts @@ -0,0 +1,13 @@ +import {Component} from '@angular/core'; + +/** + * @title Tooltip with custom position + */ +@Component({ + selector: 'tooltip-position-example', + templateUrl: 'tooltip-position-example.html', + styleUrls: ['tooltip-position-example.css'], +}) +export class TooltipPositionExample { + position = 'before'; +} diff --git a/src/assets/images/examples/shiba1.jpg b/src/assets/images/examples/shiba1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86c2fbe5ab23ab9dbd3e3ccdebd933ff148011b1 GIT binary patch literal 44398 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 GL;u-<+G;ic literal 0 HcmV?d00001 diff --git a/src/assets/images/examples/shiba2.jpg b/src/assets/images/examples/shiba2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ace9d404e2025fcc78632da9166b32dd4d4d0810 GIT binary patch literal 96125 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 LY?`P`R6+mQEfJP1 literal 0 HcmV?d00001 diff --git a/src/assets/images/examples/thumbup-icon.svg b/src/assets/images/examples/thumbup-icon.svg new file mode 100644 index 00000000..2391a9f6 --- /dev/null +++ b/src/assets/images/examples/thumbup-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/test.html b/src/assets/test.html new file mode 100644 index 00000000..3666e2a8 --- /dev/null +++ b/src/assets/test.html @@ -0,0 +1 @@ +

HEEYYY HO

\ No newline at end of file