-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(modal): Implement modal component #29
Comments
Hey, approach to modals implementation was more conceptual |
Any update on the Modal component? |
in progress, stay tunned |
+1 . No pressure though. Great work on the other components! I'm currently on the verge of writing a modal component myself. If you're planning to release soon, that would be great to know (than I'll postpone my work a bit) ;) |
+1 |
+1 |
1 similar comment
+1 |
Okay! :) |
+1 :) |
+1 |
+2 ) |
+1 |
Perhaps something from here can be used? |
I already had a brief look at the code. It's not that easy to understand, especially since the Angular API has changed so much since alpha 26 (and the DomRenderer can't do enough anymore). I settled for a straightforward component that encapsulates a Modal, which I can show/hide at will. Disadvantage is that I need to insert this component in each template I need it (meaning there are multiple - hidden - dialogs all the time) and I'll probably have issues with the backdrop in some cases. But for now it's very uncomplicated and it works. I can share the code If you like. |
yes, please :-) |
Here you go (very unpolished code): The component: import {Component, View, Input, Output, EventEmitter, OnInit} from 'angular2/angular2';
/**
* Shows a bootstrap modal dialog.
* Set the body of the dialog by adding content to the modal tag: <modal>content here</modal>.
*/
@Component({
selector: 'modal'
})
@View({
templateUrl: './components/modal/modal.html'
})
export class Modal implements OnInit {
@Input('title') title: string;
@Input('cancel-label') cancelLabel: string = 'Cancel';
@Input('positive-label') positiveLabel: string = 'OK';
/**
* Fires an event when the modal is closed. The argument indicated how it was closed.
* @type {EventEmitter<ModalResult>}
*/
@Output('closed') closeEmitter: EventEmitter<ModalResult> = new EventEmitter<ModalResult>();
/**
* Fires an event when the modal is ready with a pointer to the modal.
* @type {EventEmitter<Modal>}
*/
@Output('loaded') loadedEmitter: EventEmitter<Modal> = new EventEmitter<Modal>();
showModal: boolean = false;
constructor() {
console.log('showModal = ' + this.showModal);
}
onInit() {
this.loadedEmitter.next(this);
console.log('modal inited');
}
/**
* Shows the modal. There is no method for hiding. This is done using actions of the modal itself.
*/
show() {
this.showModal = true;
}
positiveAction() {
this.showModal = false;
this.closeEmitter.next({
action: ModalAction.POSITIVE
});
return false;
}
cancelAction() {
console.log('sending close event');
this.showModal = false;
this.closeEmitter.next({
action: ModalAction.CANCEL
});
return false;
}
}
/**
* The possible reasons a modal has been closed.
*/
export enum ModalAction { POSITIVE, CANCEL }
/**
* Models the result of closing a modal dialog.
*/
export interface ModalResult {
action: ModalAction;
} The template: <div class="modal-backdrop fade in"
[style.display]="showModal ? 'block' : 'none'"></div>
<div class="modal"
tabindex="-1"
role="dialog"
style="display: block"
[style.display]="showModal ? 'block' : 'none'">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<!--
<button type="button"
class="close"
aria-label="Close"
(click)="cancelAction()">
<span aria-hidden="true">×</span>
</button>
-->
<h4 class="modal-title">
{{title}}
</h4>
</div>
<div class="modal-body">
<ng-content></ng-content>
</div>
<div class="modal-footer">
<button type="button"
class="btn btn-default btn-sm"
(click)="cancelAction()">
{{cancelLabel}}
</button>
<button type="button"
class="btn btn-primary btn-sm"
(click)="positiveAction()">
{{positiveLabel}}
</button>
</div>
</div>
</div>
</div> Use in your own templates: The trick here is the (loaded) event. This allows the parent component to get a direct reference to the modal. <modal id="cancelConfirmation"
[title]="'Are you sure?'"
[cancel-label]="'cancel'"
[positive-label]="'OK'"
(loaded)="cancelConfirmationModalLoaded($event)"
(closed)="onCancelConfirmation($event)">
The body of your modal
</modal> // inside your component:
cancelConfirmationModalLoaded(modal: Modal) {
this.cancelConfirmationModal = modal; // Here you get a reference to the modal so you can control it programmatically
} |
This seems to work for me. |
Merge it with main branch 👍 |
@koodikindral Not ready for that. I see a few problems:
But hey, if everyone likes it, I can clean it up and do a pull request. Just need some more supporters ;) |
+1 |
status update: have a working prototype, to represent bs4 logic and classes |
+1 Very much looking forward to this landing. I'll be able to use |
+1, also, when this lands with a little bit of tweaking I'll stop copy pasting components and actually install a package into a project. |
Released :)
it will be added, but not as
please elaborate
they share context, so yes |
Ok, waiting for it. :-)
I think the separate component/html one, would fit into this.
I will try it. Question after trying the modal: Let's say I have two buttons, one to save, and one to cancel. Both need to issue the onHide(), default value is always $event. What is the cleanest way to distinct those two states in my component? |
@valorkin to be more precise, here is a sample from Angular 1. $scope.open = function (size) {
var modalInstance = $uibModal.open({
animation: $scope.animationsEnabled,
templateUrl: 'myModalContent.html',
controller: 'ModalInstanceCtrl',
size: size,
resolve: {
items: function () {
return $scope.items;
}
}
});
modalInstance.result.then(function (selectedItem) {
$scope.selected = selectedItem;
}, function () {
$log.info('Modal dismissed at: ' + new Date());
});
}; |
@jhiemer modal is just a UI tool, it doesn't create separate context (at least for now or should not) if doesn't make sense I can elaborate a bit more |
@valorkin ok, but having just this popup without being able to transfer any data into it and getting back some results from e.g. Save() or Cancel() does not help in many cases. Which use cases do you see for a modal, which just opens and displays "data in a different way"? Taking an example: you want to have modal, which opens up, if you want to delete a resource. Then it would be very nice to have at least way to get a reference of the entity to delete into the modal and vice versa. |
This also has another limitation, you cannot open one modal from different location in the application. And also how should we be able to open multiple modals?! How can we integrate modal with the router?! |
http://v4-alpha.getbootstrap.com/components/modal/
|
actually you can but the way it is in ng2 is a bit different from ng1 Other question that you can not create components dynamically via just |
How can you integrate opening dropdown with router? |
PS do not hesitate to ask questions, I am listing them and will update documentation with answers right now top prio datepicker popup, than update docs ( more samples, may be even FAQ per component) |
@valorkin my questions are still open. :-) thanks for the great library btw. |
Even thought Jquery Bootstrap didn't support it, we had Angular UI (for 1.x) which is a custom code as is ng2-bootstrap, which supported it. |
@mohammedzamakhan agreed, should be added |
How can I close a modal from within its own controller? For example, I have a modal that shows a form. The save button is executing a method in modal's controller. Once everything is saved, I want to close it. |
http://valor-software.com/ng2-bootstrap/#modals In general you have two options how to get instance of modal component:
|
Right, so I have this as a template:
And the controller attached to it is something like this
So basically, I am within the modal's component. See the line |
@ShurikAg no no, this should throw an exception |
and let us move to https://gitter.im/valor-software/ng2-bootstrap |
How to use bootstrap nested modal in simple way? |
Hi,
The README says
Modal (in progress...)
. Is it true, is sb working on that? Can we share some progress here (in a separate branch presumably)? I'd consider contributing as I need it for my project...Thanks for providing more info.
Marcin
The text was updated successfully, but these errors were encountered: