Skip to content

WIP: sm-card component #53

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

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions src/core/directives.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
///<reference path="../../typings/angularjs/angular.d.ts"/>

/**
* Template class for wrapper-type directives
*/
export class ComponentDirective implements ng.IDirective {

restrict = 'E';
replace = true;
transclude = true;
template = ``;
controller = ComponentDirectiveController;
controllerAs = '$ctrl';
bindToController = true;
scope = {};

link = (
scope: ng.IScope,
element: ng.IAugmentedJQuery,
attrs,
ctrl,
transclude: ng.ITranscludeFunction
) => {
// transclude when we actually want it
if (transclude) {
transclude(scope, (nodes) => {
element.append(nodes);
});
}

element.on('$destroy', function() {
scope.$destroy();
});
};
}

class ComponentDirectiveController { }
28 changes: 28 additions & 0 deletions src/core/dom.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@

/**
* Helper function to wrap a node with container element
*
* @param node
* @param cssClassName
*/

export function wrapWithContainer(node: Node, cssClassName: string): void {
let nodeList = Array.prototype.slice.call(node.parentElement.children);
let nodeIndex = nodeList.indexOf(node);
let container = document.createElement('div');
container.classList.add(cssClassName);

node.parentNode.insertBefore(container, node.parentElement.children[nodeIndex + 1]);
container.appendChild(node);
}

/**
* Helper function to check if element has container or not
*
* @param node
* @param cssClassName
* @returns {boolean}
*/
export function isContainerDefined(node: Node, cssClassName: string): boolean {
return node.parentElement.classList.contains(cssClassName);
}
20 changes: 20 additions & 0 deletions src/core/layout/align-right/align-right.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
///<reference path="../../../../typings/angularjs/angular.d.ts"/>

'use strict';

export class SmAlignRightDirective implements ng.IDirective {
static instance(): ng.IDirective {
return new SmAlignRightDirective;
}

restrict = 'A';
replace = true;

link = (
scope: ng.IScope,
element: ng.IAugmentedJQuery
) => {

element.addClass('right floated');
};
}
7 changes: 7 additions & 0 deletions src/core/layout/core.layout.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { SmAlignRightDirective } from './align-right/align-right';

'use strict';

export var smCoreModule: ng.IModule = angular
.module('semantic.ui.core.layout', [])
.directive('smAlignRight', SmAlignRightDirective.instance);
7 changes: 6 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
///<reference path="../typings/angularjs/angular.d.ts"/>

import { smCoreModule } from './core/layout/core.layout.module';

import { smButtonModule } from './elements/button/button';
import { smCardModule } from './views/card/card';

((): void => {
'use strict';

angular
.module('semantic.ui', [
smButtonModule.name
smCoreModule.name,
smButtonModule.name,
smCardModule.name
]);

})();
Empty file removed src/views/.gitkeep
Empty file.
127 changes: 127 additions & 0 deletions src/views/card/card.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
///<reference path="../../../typings/angularjs/angular.d.ts"/>
///<reference path="../../../typings/angularjs/angular-animate.d.ts"/>

import { isContainerDefined, wrapWithContainer } from './../../core/dom';
import { ComponentDirective } from './../../core/directives';

'use strict';

/**
* sm-card directive
*/

class SmCardDirective extends ComponentDirective {
static instance(): ng.IDirective {
return new SmCardDirective;
}

template = `<div class="ui card"></div>`;
}

/**
* sm-card-content directive
*/

class SmCardContentDirective extends ComponentDirective {
static instance(): ng.IDirective {
return new SmCardContentDirective;
}

template = `<div class="content"></div>`;
}

/**
* sm-card-header directive
*/

class SmCardHeaderDirective extends ComponentDirective {
static instance(): ng.IDirective {
return new SmCardHeaderDirective;
}

require = '^smCardContent';
template = `<div class="header"></div>`;
}

/**
* sm-card-meta directive
*/

class SmCardMetaDirective extends ComponentDirective {
static instance(): ng.IDirective {
return new SmCardMetaDirective;
}

require = '^smCardContent';
template = `<div class="meta"></div>`;
}

/**
* sm-card-description directive
*/

class SmCardDescriptionDirective extends ComponentDirective {
static instance(): ng.IDirective {
return new SmCardDescriptionDirective;
}

require = '^smCardContent';
template = `<div class="description"></div>`;
}

/**
* sm-card-image directive
*/

class SmCardImageDirective implements ng.IDirective {
static instance(): ng.IDirective {
return new SmCardImageDirective;
}

restrict = 'A';
replace = true;
scope = {};

link = (
scope: ng.IScope,
element: ng.IAugmentedJQuery
) => {

let node: HTMLElement = element[0];

if (!isContainerDefined(node, 'image')) {
wrapWithContainer(node, 'image');
}
};
}

/**
* sm-card-avatar directive
*/

class SmCardAvatarDirective implements ng.IDirective {
static instance(): ng.IDirective {
return new SmCardAvatarDirective;
}

restrict = 'A';
replace = true;
scope = {};

link = (
scope: ng.IScope,
element: ng.IAugmentedJQuery
) => {
element.addClass('ui avatar image');
};
}

export var smCardModule: ng.IModule = angular
.module('semantic.ui.views.card', [])
.directive('smCard', SmCardDirective.instance)
.directive('smCardContent', SmCardContentDirective.instance)
.directive('smCardHeader', SmCardHeaderDirective.instance)
.directive('smCardMeta', SmCardMetaDirective.instance)
.directive('smCardDescription', SmCardDescriptionDirective.instance)
.directive('smCardImage', SmCardImageDirective.instance)
.directive('smCardAvatar', SmCardAvatarDirective.instance);