diff --git a/.gitignore b/.gitignore index a2d7b49..f7a8b95 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,6 @@ typings npm-debug.log src/vendor.bundle.js* .vagrant/ +*.swp +*.swo +*~ diff --git a/bower.json b/bower.json index d620d14..62612d5 100644 --- a/bower.json +++ b/bower.json @@ -35,9 +35,10 @@ "angular-i18n": "^1.5.0", "angular-load": "^0.4.1", "angular-translate-interpolation-messageformat": "^2.10.0", - "angular-bind-html-compile": "^1.2.1", - "angular-click-outside": "^2.7.1", - "ng-ckeditor": "^0.2.1" + "angular-bind-html-compile": "^1.2.1", + "angular-click-outside": "^2.7.1", + "ng-ckeditor": "^0.2.1", + "angular-tag-cloud": "^0.3.0" }, "devDependencies": { "angular-mocks": "~1.5.0" diff --git a/gulp/styles.js b/gulp/styles.js index acc96ae..da300a8 100644 --- a/gulp/styles.js +++ b/gulp/styles.js @@ -11,6 +11,8 @@ var $ = require('gulp-load-plugins')(); var wiredep = require('wiredep').stream; var _ = require('lodash'); +var importCss = require('gulp-import-css'); + gulp.task('styles-reload', ['styles'], function() { return buildStyles() .pipe(browserSync.stream()); @@ -55,5 +57,6 @@ var buildStyles = function() { .pipe($.sass(sassOptions)).on('error', conf.errorHandler('Sass')) .pipe($.autoprefixer()).on('error', conf.errorHandler('Autoprefixer')) .pipe($.sourcemaps.write()) + .pipe(importCss()) .pipe(gulp.dest(path.join(conf.paths.tmp, '/serve/app/'))); }; diff --git a/package.json b/package.json index 79301b0..2c58139 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,9 @@ "gulp-eslint": "~1.0.0", "gulp-filter": "~3.0.1", "gulp-flatten": "~0.2.0", - "gulp-insert": "^0.5.0", + "gulp-import-css": "^0.1.2", "gulp-inject": "~3.0.0", + "gulp-insert": "^0.5.0", "gulp-load-plugins": "~0.10.0", "gulp-merge-json": "^0.4.0", "gulp-minify-css": "~1.2.1", diff --git a/src/app/index.ts b/src/app/index.ts index 56eda82..90d8006 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -18,7 +18,7 @@ let noosferoApp: any = bundle("noosferoApp", MainComponent, ["ngAnimate", "ngCoo "angular-bind-html-compile", "angularMoment", "angular.filter", "akoenig.deckgrid", "angular-timeline", "duScroll", "oitozero.ngSweetAlert", "pascalprecht.translate", "tmh.dynamicLocale", "angularLoad", - "angular-click-outside"]).publish(); + "angular-click-outside", "ngTagCloud"]).publish(); NoosferoApp.angularModule = noosferoApp; diff --git a/src/app/layout/blocks/tags/index.ts b/src/app/layout/blocks/tags/index.ts new file mode 100644 index 0000000..e5edbc0 --- /dev/null +++ b/src/app/layout/blocks/tags/index.ts @@ -0,0 +1,2 @@ +/* Module Index Entry - generated using the script npm run generate-index */ +export * from "./tags-block.component"; diff --git a/src/app/layout/blocks/tags/tags-block.component.spec.ts b/src/app/layout/blocks/tags/tags-block.component.spec.ts new file mode 100644 index 0000000..69ed146 --- /dev/null +++ b/src/app/layout/blocks/tags/tags-block.component.spec.ts @@ -0,0 +1,55 @@ +import {TestComponentBuilder} from 'ng-forward/cjs/testing/test-component-builder'; +import {Provider, Input, provide, Component} from 'ng-forward'; +import {provideFilters} from '../../../../spec/helpers'; +import {TagsBlockComponent} from './tags-block.component'; + +const htmlTemplate: string = ''; + +const tcb = new TestComponentBuilder(); + +describe("Components", () => { + describe("Tags Block Component", () => { + + let settingsObj = {}; + let mockedEnvironmentService = { + getTags: (): any => { + return Promise.resolve({ foo: 10, bar: 20 }); + } + }; + let profile = { name: 'profile-name' }; + beforeEach(angular.mock.module("templates")); + + let state = jasmine.createSpyObj("state", ["go"]); + + + function getProviders() { + return [ + new Provider('$state', { useValue: state }), + new Provider('EnvironmentService', { + useValue: mockedEnvironmentService + }), + ].concat(provideFilters("truncateFilter", "stripTagsFilter")); + } + let componentClass: any = null; + + function getComponent() { + @Component({ selector: 'test-container-component', template: htmlTemplate, directives: [TagsBlockComponent], providers: getProviders() }) + class BlockContainerComponent { + block = { type: 'Block', settings: settingsObj }; + owner = profile; + constructor() { + } + } + return BlockContainerComponent; + } + + + it("get tags from the environment service", done => { + tcb.createAsync(getComponent()).then(fixture => { + let tagsBlock: TagsBlockComponent = fixture.debugElement.componentViewChildren[0].componentInstance; + expect(tagsBlock.tags).toEqual([{ text: "foo", weight: '10', link: '/tag/foo' }, { text: "bar", weight: '20', link: '/tag/bar' }]); + done(); + }); + }); + }); +}); diff --git a/src/app/layout/blocks/tags/tags-block.component.ts b/src/app/layout/blocks/tags/tags-block.component.ts new file mode 100644 index 0000000..8a3165d --- /dev/null +++ b/src/app/layout/blocks/tags/tags-block.component.ts @@ -0,0 +1,45 @@ +import {Component, Inject, Input} from "ng-forward"; +import {EnvironmentService} from "../../../../lib/ng-noosfero-api/http/environment.service"; + +@Component({ + selector: "noosfero-tags-block", + templateUrl: 'app/layout/blocks/tags/tags-block.html' +}) +@Inject(EnvironmentService, "$state") +export class TagsBlockComponent { + + @Input() block: any; + @Input() owner: any; + + profile: any; + tags: any; + tagsLoaded: boolean = false; + + constructor(private environmentService: EnvironmentService, private $state: any) { + this.loadTags(); + } + + loadTags() { + this.tags = []; + let tag = ''; + let tags: any = []; + let that = this; + + this.environmentService.getTags() + .then((result: any) => { + for (tag in result) { + if (result.hasOwnProperty(tag)) { + let size: number = result[tag]; + tags.push({ text: tag.toString(), weight: size.toString(), link: '/tag/' + tag }); + } + } + + that.tagsLoaded = true; + that.tags = tags.slice(); + }); + } + + ngOnInit() { + this.profile = this.owner; + } +} diff --git a/src/app/layout/blocks/tags/tags-block.html b/src/app/layout/blocks/tags/tags-block.html new file mode 100644 index 0000000..d70ae5b --- /dev/null +++ b/src/app/layout/blocks/tags/tags-block.html @@ -0,0 +1 @@ + diff --git a/src/app/layout/blocks/tags/tags-block.scss b/src/app/layout/blocks/tags/tags-block.scss new file mode 100644 index 0000000..2fb4b81 --- /dev/null +++ b/src/app/layout/blocks/tags/tags-block.scss @@ -0,0 +1,5 @@ +@import url('../../bower_components/angular-tag-cloud/src/css/ng-tag-cloud.css'); + +div.ng-tag-cloud a:hover, div.ng-tag-cloud span.w10, div.ng-tag-cloud span.w8, div.ng-tag-cloud span.w9 { + color: #848CB2; +} diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 9519618..751061b 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -16,6 +16,7 @@ import {RecentDocumentsBlockComponent} from "../layout/blocks/recent-documents/r import {ProfileImageBlockComponent} from "../layout/blocks/profile-image/profile-image-block.component"; import {RawHTMLBlockComponent} from "../layout/blocks/raw-html/raw-html-block.component"; import {StatisticsBlockComponent} from "../layout/blocks/statistics/statistics-block.component"; +import {TagsBlockComponent} from "../layout/blocks/tags/tags-block.component"; import {MembersBlockComponent} from "../layout/blocks/members/members-block.component"; import {CommunitiesBlockComponent} from "../layout/blocks/communities/communities-block.component"; @@ -99,7 +100,7 @@ export class EnvironmentContent { LinkListBlockComponent, CommunitiesBlockComponent, HtmlEditorComponent, MainBlockComponent, RecentDocumentsBlockComponent, Navbar, SidebarComponent, ProfileImageBlockComponent, MembersBlockComponent, NoosferoTemplate, DateFormat, RawHTMLBlockComponent, StatisticsBlockComponent, - LoginBlockComponent + LoginBlockComponent, TagsBlockComponent ].concat(plugins.mainComponents).concat(plugins.hotspots), providers: [AuthService, SessionService, NotificationService, BodyStateClassesService] diff --git a/src/lib/ng-noosfero-api/http/environment.service.ts b/src/lib/ng-noosfero-api/http/environment.service.ts index 20b3eca..493a8a3 100644 --- a/src/lib/ng-noosfero-api/http/environment.service.ts +++ b/src/lib/ng-noosfero-api/http/environment.service.ts @@ -34,6 +34,14 @@ export class EnvironmentService { return deferred.promise; } + getTags(): ng.IPromise<{}> { + let p = this.restangular.one('environment').customGET('tags'); + let deferred = this.$q.defer<{}>(); + p.then(this.getHandleSuccessFunction<{}>(deferred)); + p.catch(this.getHandleErrorFunction<{}>(deferred)); + return deferred.promise; + } + /** TODO - Please, use the base class RestangularService * (description) * -- libgit2 0.21.2