An awesome Ember calendar, designed with composability and reusability in mind.
JavaScript CSS HTML Other
Clone or download
Permalink
Failed to load latest commit information.
addon Add isPreview to update function to identify preview objects/original… Dec 6, 2017
app use ember test selectors to test Jun 13, 2017
bin Change all places using npm to yarn (#158) Jun 29, 2018
blueprints/ember-calendar fix dependencies structure Jun 19, 2017
config Change all places using npm to yarn (#158) Jun 29, 2018
images Update README Jul 11, 2015
tests Add isPreview to update function to identify preview objects/original… Dec 6, 2017
vendor fix up small import issues Jun 12, 2017
.bowerrc Initial Commit from Ember CLI v0.2.0-beta.1 May 1, 2015
.codeclimate.yml Make codeclimate happy (they have no life) Jan 20, 2016
.editorconfig Update for ember 2.10 (#107) Jun 9, 2017
.ember-cli Initial Commit from Ember CLI v0.2.0-beta.1 May 1, 2015
.eslintrc.js upgrade to latest ember Jun 9, 2017
.gitignore unignore yarn lock Jun 12, 2017
.npmignore upgrade to latest ember Jun 9, 2017
.scss-lint.yml Upgrade paint Nov 18, 2015
.travis.yml Update for ember 2.10 (#107) Jun 9, 2017
.watchmanconfig Upgrade to Ember CLI 1.3.12 Nov 18, 2015
Gemfile Add Circle CI configuration Jul 3, 2015
Gemfile.lock Add Circle CI configuration Jul 3, 2015
LICENSE.md Update for ember 2.10 (#107) Jun 9, 2017
Makefile Add demo makefile Jul 11, 2015
README.md Change all places using npm to yarn (#158) Jun 29, 2018
bower.json update other packages Jun 12, 2017
circle.yml Change all places using npm to yarn (#158) Jun 29, 2018
ember-cli-build.js upgrade to latest ember Jun 9, 2017
index.js fix dependencies structure Jun 19, 2017
package.json chore(dependencies): Bump ember-cli-babel from 6.0.0 to 6.10.0 (#150) Jan 12, 2018
testem.js remove phantom Jun 13, 2017
yarn.lock chore(dependencies): Bump ember-cli-babel from 6.0.0 to 6.10.0 (#150) Jan 12, 2018

README.md

Ember Calendar

Npm Version Ember Observer Score Code Climate Build Status

An awesome Ember calendar, designed with composability and reusability in mind.

Calendar in action

Check out the demo

Features

  • Click to add occurrences
  • Resize occurrences
  • Drag and drop occurrences
  • Timezone aware
  • Search and change timezones

Installation

ember install ember-calendar

Philosophy

Following the principle "Data down, Actions up", the calendar sends these actions up:

  • onAddOccurrence
  • onUpdateOccurrence
  • onRemoveOccurrence

In addition, you need to provide an occurrences Ember Array to the component. Each occurrence should have these properties:

  • title
  • startsAt
  • endsAt

The component never mutates your data, but merely decorates them and uses these proxies to display the occurrences in the calendar. In the case you need to access the original object in the template, it is available as occurrence.content.

Basic Usage

{{! app/templates/index.hbs }}
{{as-calendar
  title="Ember Calendar"
  occurrences=occurrences
  defaultTimeZoneQuery="New York|London|Dubai|Hong Kong"
  dayStartingTime="9:00"
  dayEndingTime="18:00"
  timeSlotDuration="00:30"
  onAddOccurrence=(action "calendarAddOccurrence")
  onUpdateOccurrence=(action "calendarUpdateOccurrence")
  onRemoveOccurrence=(action "calendarRemoveOccurrence")}}
// app/controllers/index.js
import Ember from 'ember';

export default Ember.Controller.extend({
  occurrences: Ember.A(),

  actions: {
    calendarAddOccurrence: function(occurrence) {
      this.get('occurrences').pushObject(Ember.Object.create({
        title: occurrence.get('title'),
        startsAt: occurrence.get('startsAt'),
        endsAt: occurrence.get('endsAt')
      }));
    },

    calendarUpdateOccurrence: function(occurrence, properties, isPreview) {
      occurrence.setProperties(properties);

      if (!isPreview) {
        occurrence.save();
      }
    },

    calendarRemoveOccurrence: function(occurrence) {
      this.get('occurrences').removeObject(occurrence);
    }
  }
});

Advanced Usage

All the components which are used in the calendar are highly reusable. For example, you can customize the appearance of the occurrences by passing a block:

{{#as-calendar
  title="Schedule call"
  occurrences=occurrences
  dayStartingTime="7:00"
  dayEndingTime="21:30"
  timeSlotDuration="00:30"
  timeZoneOptions=timeZoneOptions
  showTimeZoneSearch=false
  timeZone=timeZone
  onNavigateWeek=(action "calendarNavigateWeek")
  onAddOccurrence=(action "calendarAddOccurrence") as |occurrence timetable calendar|}}
  {{#if occurrence.content.isEditable}}
    {{as-calendar/timetable/occurrence
      class="selection"
      model=occurrence
      timeSlotHeight=calendar.timeSlotHeight
      timetable=timetable
      timeSlotDuration=calendar.timeSlotDuration
      isResizable=false
      onUpdate=(action "calendarUpdateOccurrence")
      onRemove=(action "calendarRemoveOccurrence")}}
  {{else}}
    {{as-calendar/occurrence
      model=occurrence
      timeSlotHeight=calendar.timeSlotHeight
      timeSlotDuration=calendar.timeSlotDuration}}
  {{/if}}
{{/as-calendar}}

In this example, we check if the original occurrence is editable and either show an occurrence which can be interacted with (as-calendar/timetable/occurrence) or just a static occurrence (as-calendar/occurrence). Furthermore, the nested components try to assume as less as possible about their ancestors, so we pass in most of their attributes manually.

You can customize the time slots by passing these options:

  • dayStartingTime
  • dayEndingTime
  • timeSlotDuration
  • timeSlotHeight
  • defaultOccurrenceTitle
  • defaultOccurrenceDuration

In addition, you can customize the timezone handling using these options:

  • timeZone
  • timeZoneOptions
  • defaultTimeZoneQuery
  • showTimeZoneSearch

You can specify the initial week displayed by the calendar using the startingDate option. In addition, if you want the week to begin from that day, pass startFromDate=true.

Styles

We do not add any vendor CSS to your app by default, but you can include it if you want by doing:

// app/styles/app.scss

@import 'bower_components/fontawesome/scss/variables';
@import 'bower_components/fontawesome/scss/path';
@import 'bower_components/fontawesome/scss/mixins';
@import 'bower_components/fontawesome/scss/icons';

@import 'addons/ember-calendar/paint-core';
@import 'addons/ember-calendar/main';

There are some basic resets applied by default on .as-calendar, like box-sizing: border-box and list-style: none for all inner ul > lis.

If you already have those resets in your app add an $as-calendar-global-resets: false; before loading the main stylesheet.

Build Options

Font Aweseome assets are exported during a build by default which may conflict with assets already being exported by your project. To prevent this, add the following option to your ember-cli-build.js file:

// ember-cli-build.js

module.exports = function(defaults) {
  var app = new EmberApp(defaults, {

    // Add options here
    emberCalendar: {
      includeFontAwesomeAssets: false
    }
  });

  return app.toTree();
};

Developing

Setup

  • git clone https://github.com/alphasights/ember-calendar.git
  • yarn && bower install

Running

  • ember server

Running Tests

  • ember test --server

Credits