const DemoApp = angular.module('DemoApp', ['dx']);
DemoApp.controller('DemoController', ($scope) => {
$scope.showCurrentTimeIndicatorValue = true;
$scope.shadeUntilCurrentTimeValue = true;
$scope.updateIntervalOptionsValue = 10;
$scope.updateIntervalInMs = function () {
return $scope.updateIntervalOptionsValue * 1000;
};
$scope.schedulerOptions = {
dataSource: data,
views: ['week', 'timelineWeek'],
currentView: 'week',
bindingOptions: {
showCurrentTimeIndicator: 'showCurrentTimeIndicatorValue',
indicatorUpdateInterval: 'updateIntervalInMs()',
shadeUntilCurrentTime: 'shadeUntilCurrentTimeValue',
},
showAllDayPanel: false,
currentDate: new Date(),
editing: false,
height: 600,
resources: [{
fieldExpr: 'movieId',
dataSource: moviesData,
}],
appointmentTemplate: 'appointment-template',
onContentReady(e) {
e.component.scrollTo(new Date());
},
onAppointmentClick(e) {
e.cancel = true;
},
onAppointmentDblClick(e) {
e.cancel = true;
},
};
$scope.showIndicatorOptions = {
bindingOptions: {
value: 'showCurrentTimeIndicatorValue',
},
};
$scope.allowShadingOptions = {
bindingOptions: {
value: 'shadeUntilCurrentTimeValue',
},
};
$scope.updateIntervalOptions = {
min: 1,
max: 1200,
bindingOptions: {
value: 'updateIntervalOptionsValue',
},
step: 10,
showSpinButtons: true,
width: '100px',
format: '#0 s',
};
$scope.getMovieById = getMovieById;
function getMovieById(id) {
return DevExpress.data.query(moviesData)
.filter('id', id)
.toArray()[0];
}
});
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>DevExtreme Demo</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>window.jQuery || document.write(decodeURIComponent('%3Cscript src="js/jquery.min.js"%3E%3C/script%3E'))</script>
<link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/22.2.6/css/dx.light.css" />
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
<script>window.angular || document.write(decodeURIComponent('%3Cscript src="js/angular.min.js"%3E%3C/script%3E'))</script>
<script src="https://cdn3.devexpress.com/jslib/22.2.6/js/dx.all.js"></script>
<script src="data.js"></script>
<link rel="stylesheet" type="text/css" href="styles.css" />
<script src="index.js"></script>
</head>
<body class="dx-viewport">
<div class="demo-container" ng-app="DemoApp" ng-controller="DemoController">
<div id="scheduler" dx-scheduler="schedulerOptions" dx-item-alias="model">
<div data-options="dxTemplate: {name: 'appointment-template'}">
<div class="movie" ng-init="movieData = getMovieById(model.appointmentData.movieId)">
<img ng-src="{{movieData.image}}" />
<div class="movie-text">{{movieData.text}}</div>
</div>
</div>
</div>
<div class="options">
<div class="column">
<div class="option">
<div class="label">Current time indicator</div>
<div class="value">
<div id="show-indicator" dx-switch="showIndicatorOptions"></div>
</div>
</div>
<div class="option">
<div class="label">Shading until current time</div>
<div class="value">
<div id="allow-shading" dx-switch="allowShadingOptions"></div>
</div>
</div>
</div>
<div class="column">
<div class="option">
<div class="label">Update position in</div>
<div class="value">
<div id="update-interval" dx-number-box="updateIntervalOptions"></div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
.dx-scheduler-appointment {
color: #000;
font-weight: 500;
background-color: #e4e4e4;
}
.dx-scheduler-appointment-recurrence .dx-scheduler-appointment-content {
padding: 5px 0 5px 7px;
}
.options {
background-color: rgba(191, 191, 191, 0.15);
margin-top: 20px;
display: flex;
align-items: flex-start;
}
.column {
width: 40%;
display: inline-block;
margin: 15px 3%;
text-align: left;
vertical-align: top;
}
.option {
padding: 5px 0;
display: flex;
align-items: center;
}
.label,
.value {
display: inline-block;
vertical-align: middle;
}
.label {
width: 180px;
}
.value {
width: 30%;
}
.movie img {
height: 70px;
}
.movie-text {
font-size: 90%;
white-space: normal;
}
#allow-shading,
#show-indicator {
height: 36px;
}
const today = new Date();
today.setHours(0, 0, 0, 0);
today.setDate(today.getDate() - today.getDay() + 3);
const data = [
{
movieId: 1,
startDate: new Date(today.getTime() - 113.5 * 3600000),
endDate: new Date(today.getTime() - 111.5 * 3600000),
recurrenceRule: 'FREQ=HOURLY;INTERVAL=15;COUNT=15',
}, {
movieId: 2,
startDate: new Date(today.getTime() - 110.5 * 3600000),
endDate: new Date(today.getTime() - 108.5 * 3600000),
recurrenceRule: 'FREQ=HOURLY;INTERVAL=15;COUNT=15',
}, {
movieId: 3,
startDate: new Date(today.getTime() - 106.5 * 3600000),
endDate: new Date(today.getTime() - 104.5 * 3600000),
recurrenceRule: 'FREQ=HOURLY;INTERVAL=15;COUNT=15',
}, {
movieId: 4,
startDate: new Date(today.getTime() - 104 * 3600000),
endDate: new Date(today.getTime() - 102 * 3600000),
recurrenceRule: 'FREQ=HOURLY;INTERVAL=15;COUNT=15',
}, {
movieId: 5,
startDate: new Date(today.getTime() - 101 * 3600000),
endDate: new Date(today.getTime() - 99 * 3600000),
recurrenceRule: 'FREQ=HOURLY;INTERVAL=15;COUNT=15',
},
];
const moviesData = [{
id: 1,
text: 'His Girl Friday',
image: '../../../../images/movies/HisGirlFriday.jpg',
}, {
id: 2,
text: 'Royal Wedding',
image: '../../../../images/movies/RoyalWedding.jpg',
}, {
id: 3,
text: 'A Star Is Born',
image: '../../../../images/movies/AStartIsBorn.jpg',
}, {
id: 4,
text: 'The Screaming Skull',
image: '../../../../images/movies/ScreamingSkull.jpg',
}, {
id: 5,
text: "It's a Wonderful Life",
image: '../../../../images/movies/ItsAWonderfulLife.jpg',
}];